MySkin [1.8.x - 1.16.x] 3.2

Lightweight solution for skins on your Minecraft server.

  1. NEZNAMY
    Native Minecraft Version:
    1.15
    Tested Minecraft Versions:
    • 1.8
    • 1.9
    • 1.10
    • 1.11
    • 1.12
    • 1.13
    • 1.14
    • 1.15
    • 1.16
    Languages Supported:
    Translate to your language in localize.yml
    [​IMG]
    About MySkin

    This plugin was made as a lightweight solution for skins on offline mode servers. Skins are seeminglessly restored to players who should have them, and instantly changed to those, who set a skin via command. Plugin is also capable of changing your skin even on online mode servers, which will change your head icon in TAB list as well.

    What does the plugin do
    Restores skins for premium players, respects skins set by /skin command and makes skins visible instantly upon setting.
    Skin data is properly cached, you can choose between the default, file caching or MySQL database based one!

    Minecraft version support

    Plugin supports all versions ranging from 1.8 to latest 1.16.3
    Why doesnt the plugin support 1.7 and less?
    To change your skin in those versions, the plugin would have to mess with your name tag (text above your head), and it would only be visible to other players. Due to insufficient requests and actual uses, this feature is not included, and the plugin will only support versions 1.8 onwards.


    Installation
    To install MySkin, just place the .jar file into /plugins/ folder of your BungeeCord/Bukkit server.

    BungeeCord support
    If your players are connected via BungeeCord, and you want instant skin updates, you need to install MySkin on your desired Bukkit servers as well.
    MySkin will detect BungeeCord mode if its set in spigot.yml in "bungeecord: enabled" and will help out with skin updating automatically.

    Localization
    You can translate all messages which are located in the file "localize.yml" inside MySkin folder.

    Skin Caching options
    Plugin defaults to file based caching, with 3 separate folders inside plugins datafolder, which is done automatically.

    Caching with MySQL is recommended for multiple servers to share.
    So, if you wish to use MySQL for caching instead, you can edit config file and fill information about the MySQL database you want the plugin to connect to.
    Don't forget to enable MYSQL_ENABLED and reload the plugin with /myskin reload, if you want to see instant changes.

    SkinSearch
    Thanks to mcskinsearch.com, we have an option to display random skins in a nice menu in-game.
    This feature is still WorkInProgress, and currently, it only works for 1.13+.
    Thus, its disabled by default. If you want to use this feature, enable it in config. You can configure the amount of rows displayed as well. After accessing the menu with /skinsearch, skins will slowly load as the plugin processess them. The entire process is optimized, so you shouldnt get many rate limited errors despite loading so many skins!
    Please report in anything you like/dislike/want/miss about this feature.

    Commands
    Permissions work for both Bukkit and BungeeCord versions.
    • /skin - Change your or another player's skin
      • Permissions:
        • myskin.skincommand.self - Set skin for yourself
        • myskin.skincommand.other - Set skin for other players
        • myskin.skincommand - For both
    • /myskin - Plugin management
      • Permissions:
        • myskin.myskincommand.reload - Reload config and localization
        • myskin.myskincommand.clearcache - Clear cache
        • myskin.myskincommand.skinof - Show skin of player
        • myskin.myskincommand - Everything
    • /skinseach - Search for a random skin you might like
    • Other permissions:
      • myskin.skinsearchcommand - Everything search related
      • myskin.blacklisted.SKIN_NAME - allow to set blacklisted name
      • myskin.blacklisted* - Allow to set all blacklisted names
    Developer API
    Include MySkin.jar in your project, and do the following to acquire MySkin plugin object.

    For Bukkit:
    Code (Java):
    MySkin myskin = (MySkin) Bukkit.getPluginManager().getPlugin("MySkin");
    For BungeeCord:
    Code (Java):
    MySkin myskin = (MySkin) BungeeCord.getInstance().getPluginManager().getPlugin("MySkin");
    MySkin object exposes these methods:
    Code (Java):
     /**
       * @return MySkin configuration
       */

      public SkinConfig getSkinConfig();
     
      /**
       * @return Skin & Player data cache
       */

      public SkinCache getCache();
     
      /**
       * @return Handler forskin changing
       */

      public SkinHandler getHandler();
     
      /**
       * @return Localization
       */

      public SkinLocalize getLocalize();
     
      public boolean isBungeeMode();
     
      public boolean isOutdated();
    SkinCache and SkinHandler expose these helpful methods:

    Code (Java):
    public abstract interface SkinCache {
        /**
         * Loads the UUID of player's custom set skin.
         *
         * @param player - Player's UUID
         * @return skin's UUID or null if no custom skin is set
        */

        public UUID loadSkinOfPlayer(UUID player);
       
        /**
         * Reset player's custom skin.
         *
         * Reseting custom skin of player casuses plugin to use players default skin (for premium players its their own skin, for non-premium its Steve/Alexa)
         *
         * @param player - Player's UUID
         */

        public void resetSkinOfPlayer(UUID player);
       
        /**
         * Saves the UUID of player's custom set skin.
         *
         * Plugin will now use this skin as player's skin.
         *
         * @param player - Player's UUID
         * @param skin - skin's UUID
         */

        public void saveSkinOfPlayer(UUID player, UUID skin);
       
        /**
         * Loads UUID of skin by name.
         *
         * @param skinname - Name of the skin
         * @return skin's UUID or null if does not exist
         */

        public UUID loadUUID(String skinname);
       
        /**
         * Saves UUID of skin by its name.
         *
         * @param skinname - Name of the skin
         * @param uuid - skin's UUID
         */

        public void saveUUID(String skinname, UUID uuid);
       
        /**
         * Loads SkinProperty by skin's UUID.
         *
         * @param skin - skin's UUID
         * @return SkinProperty object or null if does not exist
         */

        public SkinProperty loadSkinProperty(UUID skin);
       
        /**
         * Saves SkinProperty by skin's UUID.
         *
         * @param skin - skin's UUID
         * @param property - SkinProperty object
         */

        public void saveSkinProperty(UUID skin, SkinProperty property);
    }
    Code (Java):
    public abstract interface SkinHandler
    {  
        /**
         *
         * Changes player's skin data on server.
         *
         * This function does NOT visibly update player skin. Use the update() function for that.
         *
         * @see #update(Object)
         *
         * @param player - Player object (ie. ProxiedPlayer, InitialHandler, Player from Bukkit)
         * @param skinProperty - Skin property object, containing name, value and signature
         */

      public abstract void setSkinProperty(Object player, SkinProperty skinProperty);
     
      /**
       * Updates player's skin.
       *
       * Use this in combinaton with setSkinProperty() to instantly change a player's skin.
       *
       * @see #setSkinProperty(Object, SkinProperty)
       *
       * @param player - Player object (ie. ProxiedPlayer, InitialHandler, Player from Bukkit)
       */

      public abstract void update(Object player);
    }
     
    If you have any questions about usage, which are not explained in comments, or anything else, feel free to ask!



    If you have any feature ideas, please let me know.

    Thanks and have fun!

Recent Updates

  1. 3.2
  2. Update to 1.16.1
  3. Bugfixes, some new features, etc

Recent Reviews

  1. archimondde
    archimondde
    5/5,
    Version: 3.2
    Great plugin. Works perfectly with basically 0 impact on server performance.

    5/5 would recommend
  2. thunderskill
    thunderskill
    5/5,
    Version: 3.2
    Hey I have a suggestion and i think a lot of server would like it:being able to add your own skin form a png file in a folder so that the skin does not update when the player name change skin.;)nice plugin btw
  3. ArdaBCivas
    ArdaBCivas
    5/5,
    Version: 3.1
    It would be great if you update to 1.16.2 <3
    Best skin plugin I have used so far
  4. AlternativeSP
    AlternativeSP
    5/5,
    Version: 3.1
    Please update to 1.16.2
    This is a good alternative, it would be very good if it had support for 1.16.2
  5. _TiagoCoolGamer_
    _TiagoCoolGamer_
    4/5,
    Version: 3.1
    Wonderful SkinRestorer alternative!
    There is a small error here on the Page where it says: myskin.seach
    Very lightweight and amazing!
  6. Maxiden4ik
    Maxiden4ik
    5/5,
    Version: 3.1
    Super plugin, I just need to update to 1.16.2. Thank you, author! Players need a quick change of skin, waiting :)
  7. Kaitou_han
    Kaitou_han
    5/5,
    Version: 3.1
    P L Z Update to 1.16.2 :) a .
  8. Alexander3847575
    Alexander3847575
    5/5,
    Version: 3.1
    Works as intended! I love how clean all of your plugins are. Look forward to seeing your future work!
  9. VidTu
    VidTu
    5/5,
    Version: 3.1
    Good plugin!
    Feature request: MySkinChangeEvent (preferably cancellable).
    ......
  10. zAnony
    zAnony
    5/5,
    Version: 3.1
    On it's own, it works perfectly. But I've a problem: now, i'm trying to use the api of the plugin, but I don't understand how to use them...
    Here's my code:

    MySkin myskin = (MySkin) Bukkit.getPluginManager().getPlugin("MySkin");

    myskin.getSkinConfig().load();

    UUID uuid = myskin.getCache().loadSkinOfPlayer(UUID.fromString("c2058d48-6ee2-4897-ae21-8cf500a3a8e7"));

    SkinProperty skin = myskin.getCache().loadSkinProperty(uuid);

    myskin.getHandler().setSkinProperty(p, skin);
    myskin.getHandler().update(p);

    But in console, i've a NullPointerExeption in ".loadSkinProperty(uuid)", because it doesn't find the uuid for some reason...
    I'll be happy if you'll help me!
    - Anony