Add UUID version changing to support Chinese servers
This commit is contained in:
		| @@ -68,6 +68,15 @@ public class DisguiseConfig { | |||||||
|     private static boolean warnScoreboardConflict; |     private static boolean warnScoreboardConflict; | ||||||
|     private static boolean explicitDisguisePermissions; |     private static boolean explicitDisguisePermissions; | ||||||
|     private static boolean disableCommands; |     private static boolean disableCommands; | ||||||
|  |     private static int uuidGeneratedVersion; | ||||||
|  |  | ||||||
|  |     public static int getUUIDGeneratedVersion() { | ||||||
|  |         return uuidGeneratedVersion; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static void setUUIDGeneratedVersion(int uuidVersion) { | ||||||
|  |         uuidGeneratedVersion = uuidVersion; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * No setter provided as this cannot be changed after startup |      * No setter provided as this cannot be changed after startup | ||||||
| @@ -245,6 +254,7 @@ public class DisguiseConfig { | |||||||
|         setWarnScoreboardConflict(config.getBoolean("Scoreboard.WarnConflict")); |         setWarnScoreboardConflict(config.getBoolean("Scoreboard.WarnConflict")); | ||||||
|         disableCommands = config.getBoolean("DisableCommands"); |         disableCommands = config.getBoolean("DisableCommands"); | ||||||
|         setExplicitDisguisePermissions(config.getBoolean("Permissions.ExplictDisguises")); |         setExplicitDisguisePermissions(config.getBoolean("Permissions.ExplictDisguises")); | ||||||
|  |         setUUIDGeneratedVersion(config.getInt("UUIDVersion")); | ||||||
|  |  | ||||||
|         if (!LibsPremium.isPremium() && (isSavePlayerDisguises() || isSaveEntityDisguises())) { |         if (!LibsPremium.isPremium() && (isSavePlayerDisguises() || isSaveEntityDisguises())) { | ||||||
|             DisguiseUtilities.getLogger().warning("You must purchase the plugin to use saved disguises!"); |             DisguiseUtilities.getLogger().warning("You must purchase the plugin to use saved disguises!"); | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; | |||||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; | import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; | ||||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; | import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; | ||||||
| import com.comphenix.protocol.wrappers.nbt.NbtWrapper; | import com.comphenix.protocol.wrappers.nbt.NbtWrapper; | ||||||
|  | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||||
| import org.bukkit.*; | import org.bukkit.*; | ||||||
| import org.bukkit.entity.*; | import org.bukkit.entity.*; | ||||||
| @@ -14,6 +15,7 @@ import org.bukkit.inventory.ItemStack; | |||||||
| import org.bukkit.potion.PotionEffect; | import org.bukkit.potion.PotionEffect; | ||||||
|  |  | ||||||
| import java.lang.reflect.*; | import java.lang.reflect.*; | ||||||
|  | import java.nio.ByteBuffer; | ||||||
| import java.util.Optional; | import java.util.Optional; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
|  |  | ||||||
| @@ -384,7 +386,7 @@ public class ReflectionManager { | |||||||
|  |  | ||||||
|     public static WrappedGameProfile getGameProfile(UUID uuid, String playerName) { |     public static WrappedGameProfile getGameProfile(UUID uuid, String playerName) { | ||||||
|         try { |         try { | ||||||
|             return new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName); |             return new WrappedGameProfile(uuid != null ? uuid : getRandomUUID(), playerName); | ||||||
|         } |         } | ||||||
|         catch (Exception ex) { |         catch (Exception ex) { | ||||||
|             ex.printStackTrace(); |             ex.printStackTrace(); | ||||||
| @@ -399,8 +401,7 @@ public class ReflectionManager { | |||||||
|     public static WrappedGameProfile getGameProfileWithThisSkin(UUID uuid, String playerName, |     public static WrappedGameProfile getGameProfileWithThisSkin(UUID uuid, String playerName, | ||||||
|             WrappedGameProfile profileWithSkin) { |             WrappedGameProfile profileWithSkin) { | ||||||
|         try { |         try { | ||||||
|             WrappedGameProfile gameProfile = new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), |             WrappedGameProfile gameProfile = new WrappedGameProfile(uuid != null ? uuid : getRandomUUID(), playerName); | ||||||
|                     playerName); |  | ||||||
|  |  | ||||||
|             if (profileWithSkin != null) { |             if (profileWithSkin != null) { | ||||||
|                 gameProfile.getProperties().putAll(profileWithSkin.getProperties()); |                 gameProfile.getProperties().putAll(profileWithSkin.getProperties()); | ||||||
| @@ -415,6 +416,32 @@ public class ReflectionManager { | |||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Used for generating a UUID with a custom version instead of the default 4. Workaround for China's NetEase servers | ||||||
|  |      */ | ||||||
|  |     private static UUID getRandomUUID() { | ||||||
|  |         UUID uuid = UUID.randomUUID(); | ||||||
|  |  | ||||||
|  |         if (DisguiseConfig.getUUIDGeneratedVersion() == 4) { | ||||||
|  |             return uuid; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         ByteBuffer bb = ByteBuffer.wrap(new byte[16]); | ||||||
|  |  | ||||||
|  |         bb.putLong(uuid.getMostSignificantBits()); | ||||||
|  |         bb.putLong(uuid.getLeastSignificantBits()); | ||||||
|  |  | ||||||
|  |         bb.put(6, (byte) (bb.get(6) & 0x0f));  // clear version | ||||||
|  |         bb.put(6, (byte) (bb.get(6) | DisguiseConfig.getUUIDGeneratedVersion()));  // set to version X (Default 4) | ||||||
|  |  | ||||||
|  |         bb.position(0); | ||||||
|  |  | ||||||
|  |         long firstLong = bb.getLong(); | ||||||
|  |         long secondLong = bb.getLong(); | ||||||
|  |  | ||||||
|  |         return new UUID(firstLong, secondLong); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static Class getNmsClass(String className) { |     public static Class getNmsClass(String className) { | ||||||
|         try { |         try { | ||||||
|             return Class.forName("net.minecraft.server." + getBukkitVersion() + "." + className); |             return Class.forName("net.minecraft.server." + getBukkitVersion() + "." + className); | ||||||
|   | |||||||
| @@ -214,3 +214,7 @@ PacketsEnabled: | |||||||
|   Riding: true |   Riding: true | ||||||
|   # When disguised as a wither skull, it sends a look packet every tick so that the wither skull is facing the right way. |   # When disguised as a wither skull, it sends a look packet every tick so that the wither skull is facing the right way. | ||||||
|   WitherSkull: true |   WitherSkull: true | ||||||
|  |  | ||||||
|  | # Added to support a Chinese Minecraft Server which uses their own skin server unless the UUID is not version 4. | ||||||
|  | # Changing this from 4 to say, 3. Means their server will fetch skins from Mojang instead. | ||||||
|  | UUIDVersion: 4 | ||||||
		Reference in New Issue
	
	Block a user