ChangeSkinX
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.
Moreover it will be 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.
Features
- Lightweight
- Instant skin updates
- Easy to use
- Implemented cache to benefit performance
- Nearly no mojang rate limits due caching
- No client modification needed
- Possibility to create a standard skin
Commands
- /setskin <uuid > - Sets your skin to be equal to the player with the selected uuid
- /setskin < playerName>
- /setskin < onlinePlayer > < newSkinUUID/newSkinPlayerName >
- /skinupdate - Invalidates the database entry and fetches the fresh skin from the Mojang servers
Permissions
- changeskin.command.skinupdate - Command to refresh the own skin
- 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
Whitelist
- changeskin.skin.whitelist.uuid - Allow this specific skin
- changeskin.skin.whitelist.* - allows all skins
Blacklist
- changeskin.skin.whitelist.*
- -changeskin.skin.whitelist.uuid
Source code
You don't have to decompile the plugin. You can find there the source code with comments and building utilities.
ChangeSkin is open source and hosted on GitHub; feel free to fork, star, or contribute by making pull requests and opening issues.
Video Tutorials (not by me)
Portuguese:
English:
Does not work for 1.20.2 please update it
Can you please add 1.20.1 minecraft version?
hi im getting an error :[10:35:28 WARN]: Failed to initialize a channel. Closing: [id: 0x1046ab89, /127.0.0.1:63463 => /127.0.0.1:25565]
java.lang.NoClassDefFoundError: Could not initialize class com.comphenix.net.sf.cglib.proxy.Enhancer
at com.comphenix.protocol.injector.server.TemporaryPlayerFactory.createTemporaryPlayer(TemporaryPlayerFactory.java:164) ~[?:?]
at com.comphenix.protocol.injector.netty.InjectionFactory.fromChannel(InjectionFactory.java:143) ~[?:?]
at com.comphenix.protocol.injector.netty.ProtocolInjector$1.initChannel(ProtocolInjector.java:157) ~[?:?]
at io.netty.channel.ChannelInitializer.channelRegistered(ChannelInitializer.java:69) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRegistered(AbstractChannelHandlerContext.java:158) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRegistered(AbstractChannelHandlerContext.java:144) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.ChannelInitializer.channelRegistered(ChannelInitializer.java:71) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRegistered(AbstractChannelHandlerContext.java:158) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRegistered(AbstractChannelHandlerContext.java:144) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.ChannelInitializer.channelRegistered(ChannelInitializer.java:71) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRegistered(AbstractChannelHandlerContext.java:158) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRegistered(AbstractChannelHandlerContext.java:144) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.DefaultChannelPipeline.fireChannelRegistered(DefaultChannelPipeline.java:732) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:442) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$100(AbstractChannel.java:374) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:418) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:380) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) [spigot.jar:git-Spigot-db6de12-18fbb24]
at java.base/java.lang.Thread.run(Thread.java:833) [?:?]
[10:35:28 WARN]: An exception was thrown by a user handler's exceptionCaught() method while handling the following exception:
java.lang.NullPointerException: Cannot invoke "io.netty.channel.Channel.isOpen()" because "this.channel" is null
at net.minecraft.server.v1_8_R3.NetworkManager.close(NetworkManager.java:245) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
at net.minecraft.server.v1_8_R3.NetworkManager.channelInactive(NetworkManager.java:105) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:233) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:219) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:228) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:233) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:219) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:228) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:233) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:219) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:233) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:219) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.handler.timeout.ReadTimeoutHandler.channelInactive(ReadTimeoutHandler.java:144) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:233) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:219) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:769) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.AbstractChannel$AbstractUnsafe$5.run(AbstractChannel.java:567) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:380) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357) [spigot.jar:git-Spigot-db6de12-18fbb24]
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) [spigot.jar:git-Spigot-db6de12-18fbb24]
at java.base/java.lang.Thread.run(Thread.java:833) [?:?]
>
im running on a 1.8(.8) server
and i just can log in disabling the plugin so when i use the commands my skin dont change
In reply to eslu0411:
It's an error in ProtocolLib. Check out their project. Make sure you are using the correct version. The latest development version of ProtocolLib for example is not backwards compatible.
hi,
whennever i try using the plugin i keep getting this error
[Server] WARN Plugin ChangeSkin v3.1-8b3f47d generated an exception while executing task 35
11.08 09:02:19 [Server] INFO java.lang.NoClassDefFoundError: Could not initialize class com.github.games647.changeskin.bukkit.task.SkinApplier
11.08 09:02:19 [Server] INFO at com.github.games647.changeskin.bukkit.task.SkinDownloader.scheduleApplyTask(SkinDownloader.java:30) ~[ChangeSkinBukkit.jar:?]
11.08 09:02:19 [Server] INFO at com.github.games647.changeskin.core.shared.task.SharedDownloader.run(SharedDownloader.java:37) ~[ChangeSkinBukkit.jar:?]
11.08 09:02:19 [Server] INFO at com.github.games647.changeskin.bukkit.task.NameResolver.scheduleDownloader(NameResolver.java:42) ~[ChangeSkinBukkit.jar:?]
11.08 09:02:19 [Server] INFO at com.github.games647.changeskin.core.shared.task.SharedNameResolver.run(SharedNameResolver.java:55) ~[ChangeSkinBukkit.jar:?]
11.08 09:02:19 [Server] INFO at org.bukkit.craftbukkit.v1_19_R1.scheduler.CraftTask.run(CraftTask.java:101) ~[paper-1.19.2.jar:git-Paper-123]
11.08 09:02:19 [Server] INFO at org.bukkit.craftbukkit.v1_19_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57) ~[paper-1.19.2.jar:git-Paper-123]
11.08 09:02:19 [Server] INFO at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22) ~[paper-1.19.2.jar:?]
11.08 09:02:19 [Server] INFO at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
11.08 09:02:19 [Server] INFO at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
11.08 09:02:19 [Server] INFO at java.lang.Thread.run(Thread.java:833) ~[?:?]
I saw someone in the comments who has the same error and you told them to download a dev build, but i have no idea how to do that, if i need to could you explain to me how please?
Thank you
In reply to dungeonorb:
Click on the GitHub page. There is a section about developments. They are basically version in between releases. The error you posted is not complete, so I cannot help you with that.
In reply to kubecode:
sorry here is the full error
11.08 13:11:46 [Server] INFO DungeonOrb issued server command: /set-skin notch
11.08 13:11:46 [Server] WARN Plugin ChangeSkin v3.1-SNAPSHOT-8b3f47d generated an exception while executing task 87
11.08 13:11:46 [Server] INFO java.lang.NoClassDefFoundError: Could not initialize class com.github.games647.changeskin.bukkit.task.SkinApplier
11.08 13:11:46 [Server] INFO at com.github.games647.changeskin.bukkit.task.SkinDownloader.scheduleApplyTask(SkinDownloader.java:30) ~[ChangeSkinBukkit.jar:?]
11.08 13:11:46 [Server] INFO at com.github.games647.changeskin.core.shared.task.SharedDownloader.run(SharedDownloader.java:37) ~[ChangeSkinBukkit.jar:?]
11.08 13:11:46 [Server] INFO at com.github.games647.changeskin.bukkit.task.NameResolver.scheduleDownloader(NameResolver.java:42) ~[ChangeSkinBukkit.jar:?]
11.08 13:11:46 [Server] INFO at com.github.games647.changeskin.core.shared.task.SharedNameResolver.run(SharedNameResolver.java:55) ~[ChangeSkinBukkit.jar:?]
11.08 13:11:46 [Server] INFO at org.bukkit.craftbukkit.v1_19_R1.scheduler.CraftTask.run(CraftTask.java:101) ~[paper-1.19.2.jar:git-Paper-124]
11.08 13:11:46 [Server] INFO at org.bukkit.craftbukkit.v1_19_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57) ~[paper-1.19.2.jar:git-Paper-124]
11.08 13:11:46 [Server] INFO at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22) ~[paper-1.19.2.jar:?]
11.08 13:11:46 [Server] INFO at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
11.08 13:11:46 [Server] INFO at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
11.08 13:11:46 [Server] INFO at java.lang.Thread.run(Thread.java:833) ~[?:?]
11.08 13:12:03 [Server] INFO There are 1 of a max of 20 players online: DungeonOrb
i tried uploading the dev version into my server but it doesn't seem to help, i probably did this wrong tho is it the one at
https://ci.codemc.io/job/Games647/job/ChangeSkin/lastStableBuild/
?
Thank you for trying to help
In reply to dungeonorb:
Please post the complete server log, because to that error message should be a caused by with more details.
In reply to kubecode:
hello, sorry for not understanding,
i restarted the server and ran the command, however the full log is a little bit to big to be sent in a reply, i uploaded it as a Link Removed: https://www.mediafire.com/file/mmcsjtc1dqyug99/log.txt/file
Thanks for helping man you're really cool
In reply to dungeonorb:
Ah there it is:
NoClassDefFoundError: com/comphenix/protocol/utility/MinecraftVersion
It means the plugin expected a certain file to be existing, but it wasn't there. In this case you need to update ProtocolLib. This version you are using is out of date.
In reply to kubecode:
hi, i wasn't here for the weekend sorry for not answering
i have updated protocollib to the latest dev version, but i am still getting an error
Link Removed: https://www.mediafire.com/file/wf2duo53lqxw9r1/console_log_2.txt/file
thanks again!
In reply to dungeonorb:
ProtocolLib dropped support for older Minecraft versions. At the top of their page says: 4.8 for versions between 1.8.8 and 1.18 and 5.0 only for 1.19 and up. After a certain time it was too hard to keep backwards compatibility.
In reply to kubecode:
my server is in 1.19.2 and i have downloaded the latest dev build for 1.19 though, it still gives me the same error
i even tried redownloading it just to make sure
In reply to kubecode:
so do you have any idea what could be causing the error? since im using the latest dev build of protocollib for 1.19.2
In reply to dungeonorb:
Sorry I was sick last week, but I fixed your bug yesterday. For 1.19, you should be able to download a newer development build of ChangeSkin and that should then work with ProtocolLib 5.0. Both versions are necessary for 1.19.
In reply to kubecode:
everything works now, thanks a lot for fixing it!
i hope you get better soon
In reply to kubecode:
actually i do get a problem, whennever i try sending a message i get kicked with a "chat validation error" i tried disabling every plugin but protocollib and changeskin, still happens
i think the error is "ERROR Cannot fetch debug state of world CraftWorld{name=world}. Assuming false"
but in case it's not heres the full log Link Removed: https://www.mediafire.com/file/fbrb58i6c6hu4k9/server_log_again.txt/file
In reply to dungeonorb:
No, it will fail safely to false as a safe value. Chat validation error could be related to another system. The error is about the new chat reporting feature. It could be another plugin modifying chat messages. Could you check that? There is also the possible to disable chat message verification by toggling the secure profile in the server.properties, but then you loose the ability to report player profiles.
In reply to kubecode:
welp i have disabled all my plugins and set secure profile to false but it still happens
In reply to kubecode:
oh yeah i didn't mention, it's when i send a message after using changeskin, i can send messages normally