ChangeSkin 3.0

Allows your players to change their skins by command | Restore cracked skins | Instant updates

  1. games647
    Tested Minecraft Versions:
    • 1.8
    • 1.9
    • 1.10
    • 1.11
    • 1.12
    Source Code:
    https://github.com/games647/ChangeSkin
    Contributors:
    games647, DoNotSpamPls, kicjow, Shynixn, Bodyash
    Languages Supported:
    Configurable in language file
    [​IMG]

    Description


    This plugin allows your players to change their skins by command. These skins have to be downloaded from Mojang, because Minecraft clients only accept from Mojang signed skins. But you can choose every skin that another minecraft user currently has or had.

    Moreover it's possible to set a custom standard skin. If you want to, this plugin can set this standard skin for all players who still have the default steve or alex skin.

    If you like the project, leave a star on GitHub and contribute there.

    Development-Builds
    https://ci.codemc.org/job/Games647/job/ChangeSkin/changes

    Features
    • Instant skin updates
    • Works on offline mode (can restore skins) and online mode servers
    • Nearly no mojang rate limits due caching
    • Specify standard skins
    • Change your skin - Every skin which was uploaded to Mojang is allowed
    • Lightweight
    • BungeeCord support
    • Implemented cache to benefit performance
    • No client modification needed
    • Tested with Spigot, PaperSpigot and TacoSpigot
    • Easy to use
    • Open Source
    Source code
    [​IMG]
    https://github.com/games647/ChangeSkin

    Commands

    • /setskin <uuid>
    • /setskin <playerName>
    • /setskin <onlinePlayer> <newSkinUUID/newSkinPlayerName>
    • /skinupdate - Downloads the fresh skin from Mojang
    How to install on BungeeCord
    1. Install the plugin on both BungeeCord and Bukkit server
    2. Activate BungeeCord support in your spigot configuration
    3. Check the settings of the ChangeSkin config in the BungeeCord instance
      • For example BungeeCord doesn't support SQLite by default
    Permissions

    changeskin.command.skinupdate - Request a fresh skin from mojang
    changeskin.command.setskin.* - All the commands below
    changeskin.command.setskin - Set your own skin
    changeskin.command.setskin.other - Set the skin of other players

    Whitelist and blacklist permissions
    For this you have to skin permissions.
    Whitelist
    • changeskin.skin.whitelist.uuid - Allow this specific skin
    • changeskin.skin.whitelist.* - allows all skins
    Blacklist
    • changeskin.skin.whitelist.*
    • -changeskin.skin.whitelist.uuid
    => This means all skins are allowed except the ones with the uuid in the blacklist list

    Video showcases


    Requirements
    [​IMG]
    or using Bitcoin:
    1H1JdC1fLVu1aDa7AjF2VngifoErvMXL5e
    donate-changeskin-spigot.png
    Thank you very much for those who already donated:
    • Name removed - 20$
    • xion987 - 15$
    • PigParty - 11$
    • andramil - 10$
    • Name removed - 10$
    For privacy reasons I remove the first and last name. If you don't want to be listed, message me or write it directly into the donation message.
    mareonCz, MOAN, GamingGeek and 14 others like this.

Recent Reviews

  1. angelosilva09
    angelosilva09
    4/5,
    Version: 3.0
    ===========================================================
    i use 1.12.2 for my server
    can i help me give me a ERROR for downloading skin data from Mojang
    /skin (PlayerSkinName) command
    ===========================================================
    1. games647
      Author's Response
      What kind of error? Please use the forums and the bug tracker before posting review.
  2. D4rkn3ss
    D4rkn3ss
    1/5,
    Version: 3.0
    [16:36:22 WARN]: [ChangeSkin] Plugin ChangeSkin v3.1-SNAPSHOT-08011cc generated an exception while executing task 86
    java.lang.NullPointerException: null
    at com.github.games647.changeskin.core.MojangSkinApi.parseSkinTexture(MojangSkinApi.java:198) ~[?:?]
    at com.github.games647.changeskin.core.MojangSkinApi.downloadSkin(MojangSkinApi.java:181) ~[?:?]
    at com.github.games647.changeskin.core.shared.task.SharedDownloader.run(SharedDownloader.java:28) ~[?:?]
    at com.github.games647.changeskin.bukkit.task.NameResolver.scheduleDownloader(NameResolver.java:42) ~[?:?]
    at com.github.games647.changeskin.core.shared.task.SharedNameResolver.run(SharedNameResolver.java:55) ~[?:?]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:76) ~[spigot-1.12.2.jar:git-Spigot-2086bb0-d0a3620]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:52) [spigot-1.12.2.jar:git-Spigot-2086bb0-d0a3620]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_171]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_171]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_171]

    Tried everything , didn't work. Even other skin plugins don't work
    1. games647
      Author's Response
      Please report it to the bug tracker or forums and wait at least 24 hours before writing a bad review. Please post what command you tried and if it works with an older build. You don't have to use always the "latest" one.
  3. SirCodeBrahs
    SirCodeBrahs
    5/5,
    Version: 3.0
    Please change donation link to https://www.paypal.me it looks better and more professional instead of having a button link.
    1. games647
      Author's Response
      I think they improved the old link too. It looks very similar to paypal.me with the addition that I can which project you are donating in order to list the donation on the project page.
  4. Zenya4
    Zenya4
    4/5,
    Version: 3.0
    Pretty awesome plugin, but at times /skin <name> doesn't work with "UUID couldn't be resolved". I'm not sure what's causing this as I only have ~15 players on at that time and none of them was spamming /skin (I have a cooldown for it) so I don't think its rate limit. Also, I think the external API for bypassing the rate limit is not working lol. Hope you can fix these in the next update. Thanks!
    1. games647
      Author's Response
      The plugin no longer uses an external API for UUIDs, because all services seems to be unreliable. For the "not resolved" issue, please check your server log. In recent commits I changed a lot about rate limit handling so it should be now a lot easier to check it out.
  5. Amira
    Amira
    5/5,
    Version: 3.0
    Amazing plugin, I especially love the default skin feature for offline users without a skin. But... you should really add a reload command and a command to clear your skin. For example, when you have an offline user and got one of the default skins server offers you, but then changed your skin but later wanted the server default one back.
    1. games647
      Author's Response
      You can use /skin reset to clear it.
  6. Balkdan
    Balkdan
    3/5,
    Version: 3.0
    [08:56:53] [Server thread/ERROR]: Encountered an unexpected exception
    net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from ChangeSkin (changeskin)

    Caused by: com.google.inject.CreationException: Unable to create injector, see the following errors:

    1) No implementation for changeskin.slf4j.Logger was bound.
    while locating changeskin.slf4j.Logger
    for the 1st parameter of com.github.games647.changeskin.sponge.ChangeSkinSponge.<init>(ChangeSkinSponge.java:49)
    at org.spongepowered.common.inject.plugin.PluginModule.configure(PluginModule.java:59)

    1 error
    at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470) ~[spongeforge-1.12.2-2611-7.1.0-BETA-2996.jar:1.12.2-2611-7.1.0-BETA-2996]
    at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155) ~[spongeforge-1.12.2-2611-7.1.0-BETA-2996.jar:1.12.2-2611-7.1.0-BETA-2996]
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107) ~[spongeforge-1.12.2-2611-7.1.0-BETA-2996.jar:1.12.2-2611-7.1.0-BETA-2996]
    at com.google.inject.internal.InjectorImpl.createChildInjector(InjectorImpl.java:232) ~[spongeforge-1.12.2-2611-7.1.0-BETA-2996.jar:1.12.2-2611-7.1.0-BETA-2996]
    at com.google.inject.internal.InjectorImpl.createChildInjector(InjectorImpl.java:236) ~[spongeforge-1.12.2-2611-7.1.0-BETA-2996.jar:1.12.2-2611-7.1.0-BETA-2996]
    at org.spongepowered.mod.plugin.SpongeModPluginContainer.constructMod(SpongeModPluginContainer.java:282) ~[spongeforge-1.12.2-2611-7.1.0-BETA-2996.jar:1.12.2-2611-7.1.0-BETA-2996]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_40]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_40]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_40]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_40]
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:217) ~[minecraft_server.1.12.2.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:278) ~[forge-1.12.2-14.23.2.2611-universal.jar:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:256) ~[forge-1.12.2-14.23.2.2611-universal.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_40]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_40]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_40]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_40]
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116) ~[minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:217) ~[minecraft_server.1.12.2.jar:?]
    at net.minecraftforge.fml.common.LoadController.redirect$onPost$zza000(LoadController.java:560) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:148) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:568) ~[Loader.class:?]
    at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:97) ~[FMLServerHandler.class:?]
    at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:332) ~[FMLCommonHandler.class:?]
    at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:125) ~[nz.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:484) [MinecraftServer.class:?]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_40]
    [08:56:53] [Server thread/INFO] [STDOUT]: [net.minecraft.crash.CrashReport:func_85057_a:301]: Negative index in crash report handler (0/5)
    [08:56:53] [Server thread/ERROR]: This crash report has been saved to: /Users/daniel/Desktop/Pixelmon 1.12.2 server/./crash-reports/crash-2018-04-08_08.56.53-server.txt
    [08:56:53] [Server thread/INFO]: Stopping server
    [08:56:53] [Server thread/INFO]: Saving worlds
    [08:56:53] [Server thread/WARN] [FML]: Can't revert to frozen GameData state without freezing first.
    [08:56:53] [Server thread/INFO] [FML]: The state engine was in incorrect state ERRORED and forced into state SERVER_STOPPED. Errors may have been discarded.
    [08:56:53] [Server thread/INFO] [FML]: The state engine was in incorrect state ERRORED and forced into state AVAILABLE. Errors may have been discarded.
    [08:56:53] [Server Shutdown Thread/INFO]: Stopping server
    > logout
    Saving session...
    ...copying shared history...
    ...saving history...truncating history files...
    ...completed.

    [Process completed]

    This was the log
    1. games647
      Author's Response
      Please use the bug tracker or the forums and wait at least 24 hours before writing a review. I'm working now on it. This is already fixed in a dev-build.
  7. Jokerz
    Jokerz
    5/5,
    Version: 3.0
    Better plugin, creator its very reactif and helpful fast respons ^^

    Before i'm used the skinrestorer but now im using changeskin !!
  8. DoNotSpamPls
    DoNotSpamPls
    5/5,
    Version: 3.0
    Quality plugin with quality code, the developer takes his time to fix any issues that might occur, while also adding new features. Definetely recommeded!
  9. Gustaw242
    Gustaw242
    5/5,
    Version: 3.0
    Najlepszy plugin na skiny! <3 Pozdrowienia dla autora, bardzo dobra robota :)
    ...
  10. Pabloalba16
    Pabloalba16
    5/5,
    Version: 3.0
    Hello i have been using this plugin for years and it was working without problems but Today when i put /skin (player) it says:

    Mojang's rate-limit reached. The public IPv4 address of this server issued more than 600 Name -> UUID requests within 10 minutes. Once those 10 minutes ended we could make requests again. In the meanwhile new skins can only be downloaded using the UUID directly.

    How can i fix it??
    1. games647
      Author's Response
      You properly installed a plugin which does name -> UUID requests too. As the text says you are only allowed to make 600 of those requests. There multiple ways to workaround this:

      * Enable the server side UUID cache
      * Run a local proxy that intercepts network requests and caches it (There are plugins which do the same)
      * Reduce the number of player heads
      * Check for plugins that performs such requests and try to remove them
      * Run your server on multiple IPv4 addresses.
      * Use HTTP/Socks proxies for contacting the Mojang API
      * Increase/Introduce a cooldown for certain commands

      ChangeSkin already caches UUIDs a lot. First there is a in memory cache and second it saves it to the local database. Name -> UUID requests are often only once per player name not every time.