Advertisement
Guest User

Untitled

a guest
Oct 1st, 2014
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.53 KB | None | 0 0
  1. package com.gmail.filoghost.uuidfix;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Modifier;
  6. import java.util.UUID;
  7. import java.util.logging.Level;
  8.  
  9. import net.minecraft.util.com.mojang.authlib.GameProfile;
  10.  
  11. import org.bukkit.Bukkit;
  12. import org.bukkit.entity.Player;
  13. import org.bukkit.event.EventHandler;
  14. import org.bukkit.event.Listener;
  15. import org.bukkit.event.player.PlayerLoginEvent;
  16. import org.bukkit.event.player.PlayerLoginEvent.Result;
  17. import org.bukkit.plugin.java.JavaPlugin;
  18.  
  19. import com.google.common.base.Charsets;
  20.  
  21. public class UUIDFix extends JavaPlugin implements Listener {
  22.  
  23.     private String nmsRoot;
  24.     private String craftbukkitRoot;
  25.    
  26.     private Class<?> entityHumanClass;
  27.     private Class<?> entityClass;
  28.     private Class<?> craftPlayerClass;
  29.    
  30.     private Method getHandleMethod;
  31.    
  32.     private Field gameProfileField;
  33.     private Field idField;
  34.     private Field uniqueIDField;
  35.    
  36.     @Override
  37.     public void onEnable() {
  38.        
  39.         try {
  40.             String craftServer = Bukkit.getServer().getClass().getName();
  41.             String craftRoot = craftServer.substring(0, craftServer.lastIndexOf('.'));
  42.             String nmsVersion = craftRoot.substring(craftRoot.lastIndexOf('.') + 1);
  43.            
  44.             nmsRoot = "net.minecraft.server." + nmsVersion;
  45.             craftbukkitRoot = "org.bukkit.craftbukkit." + nmsVersion;
  46.            
  47.             entityHumanClass = Class.forName(nmsRoot + ".EntityHuman");
  48.             entityClass = Class.forName(nmsRoot + ".Entity");
  49.             craftPlayerClass = Class.forName(craftbukkitRoot + ".entity.CraftPlayer");
  50.            
  51.             getHandleMethod = craftPlayerClass.getDeclaredMethod("getHandle");
  52.            
  53.             gameProfileField = findFieldByClass(entityHumanClass, GameProfile.class);
  54.             removeFinalModifier(gameProfileField);
  55.             gameProfileField.setAccessible(true);
  56.            
  57.             idField = findFieldByClass(GameProfile.class, UUID.class);
  58.             removeFinalModifier(idField);
  59.             idField.setAccessible(true);
  60.            
  61.             uniqueIDField = findFieldByClass(entityClass, UUID.class);
  62.             removeFinalModifier(uniqueIDField);
  63.             uniqueIDField.setAccessible(true);
  64.            
  65.         } catch (Exception ex) {
  66.             getLogger().log(Level.WARNING, "Error loading with reflection", ex);
  67.         }
  68.        
  69.         Bukkit.getPluginManager().registerEvents(this, this);
  70.     }
  71.  
  72.    
  73.     @EventHandler
  74.     public void onLogin(PlayerLoginEvent event) {
  75.         Player player = event.getPlayer();
  76.        
  77.         if (player.getName().equals(player.getName().toLowerCase())) {
  78.             // Non ha bisogno di essere sistemato
  79.             return;
  80.         }
  81.        
  82.         System.out.println("Before: " + player.getUniqueId());
  83.  
  84.         try {
  85.            
  86.             UUID fixedId = UUID.nameUUIDFromBytes(("OfflinePlayer:" + player.getName().toLowerCase()).getBytes(Charsets.UTF_8));
  87.             Object nmsPlayer = getHandleMethod.invoke(player);
  88.             Object gameProfile = gameProfileField.get(nmsPlayer);
  89.            
  90.             idField.set(gameProfile, fixedId);
  91.             uniqueIDField.set(nmsPlayer, fixedId);
  92.            
  93.         } catch (Exception e) {
  94.            
  95.             event.disallow(Result.KICK_OTHER, "Errore interno, per favore contatta lo staff.");
  96.             e.printStackTrace();
  97.         }
  98.        
  99.         System.out.println("After: " + player.getUniqueId());
  100.     }
  101.    
  102.     private Field findFieldByClass(Class<?> source, Class<?> fieldClass) {
  103.         for (Field field : source.getDeclaredFields()) {
  104.             if (field.getType() == fieldClass) {
  105.                 return field;
  106.             }
  107.         }
  108.        
  109.         return null;
  110.     }
  111.    
  112.     private static void removeFinalModifier(Field field) throws Exception {
  113.         Field fieldModifiers = Field.class.getDeclaredField("modifiers");
  114.         fieldModifiers.setAccessible(true);
  115.         fieldModifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
  116.     }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement