Guest User

SkinChanger Source Code

a guest
Nov 6th, 2016
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.28 KB | None | 0 0
  1. /*
  2.  * MIT License
  3.  *
  4.  * Copyright (c) 2016
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a copy
  7.  * of this software and associated documentation files (the "Software"), to deal
  8.  * in the Software without restriction, including without limitation the rights
  9.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10.  * copies of the Software, and to permit persons to whom the Software is
  11.  * furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included in all
  14.  * copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19.  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22.  * SOFTWARE.
  23.  */
  24.  
  25. package net.projectbudder.skinchanger;
  26.  
  27. import java.lang.reflect.Field;
  28. import java.net.URL;
  29. import java.net.URLConnection;
  30. import java.util.HashMap;
  31. import java.util.Scanner;
  32. import java.util.UUID;
  33.  
  34. import org.bukkit.Bukkit;
  35. import org.bukkit.ChatColor;
  36. import org.bukkit.command.Command;
  37. import org.bukkit.command.CommandExecutor;
  38. import org.bukkit.command.CommandSender;
  39. import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
  40. import org.bukkit.entity.Player;
  41. import org.bukkit.event.Listener;
  42. import org.bukkit.plugin.java.JavaPlugin;
  43. import org.json.simple.JSONArray;
  44. import org.json.simple.JSONObject;
  45. import org.json.simple.parser.JSONParser;
  46.  
  47. import com.mojang.authlib.GameProfile;
  48. import com.mojang.authlib.properties.Property;
  49.  
  50. import net.minecraft.server.v1_9_R2.MinecraftServer;
  51. import net.minecraft.server.v1_9_R2.PacketPlayOutEntityDestroy;
  52. import net.minecraft.server.v1_9_R2.PacketPlayOutNamedEntitySpawn;
  53. import net.minecraft.server.v1_9_R2.PacketPlayOutPlayerInfo;
  54. import net.minecraft.server.v1_9_R2.PacketPlayOutPlayerInfo.EnumPlayerInfoAction;
  55.  
  56. /**
  57.  * @author Jitse3301
  58.  * @since 05.11.2016
  59.  */
  60.  
  61. public class SkinChanger extends JavaPlugin implements CommandExecutor, Listener {
  62.  
  63.     private SkinChanger plugin = this;
  64.     private HashMap<UUID, PlayerSkin> profiles = new HashMap<UUID, PlayerSkin>();
  65.  
  66.     @Override
  67.     public void onEnable() { getCommand("disguise").setExecutor(this); getCommand("undisguise").setExecutor(this); }
  68.     public SkinChanger getMain() { return plugin; }
  69.  
  70.     public boolean onCommand(CommandSender sender, Command command, String label, final String[] args) {
  71.         if (sender instanceof Player) {
  72.             Player player = (Player) sender;
  73.             if(command.getName().equalsIgnoreCase("disguise")){
  74.                 if (args.length == 0) player.sendMessage(ChatColor.RED + "Usage: /skin <playername>");
  75.                 else {
  76.                     if(profiles.get(player.getUniqueId()) != null) {
  77.                         profiles.get(player.getUniqueId()).reset();
  78.                         profiles.remove(player.getUniqueId());
  79.                         Bukkit.getScheduler().runTaskLater(getMain(), () -> {
  80.                             Player target = Bukkit.getPlayer(args[0]);
  81.                             if (target != null) {
  82.                                 setSkin(target.getUniqueId(), player, target.getName());
  83.                                 player.setDisplayName(target.getName());
  84.                                 player.setPlayerListName(target.getName());
  85.                             } else {
  86.                                 final UUID uuid = getUUID(args[0]);
  87.                                 if (uuid != null) {
  88.                                     getServer().getScheduler().runTask(getMain(), () -> { setSkin(uuid, player, args[0]); });
  89.                                     player.setDisplayName(args[0]);
  90.                                     player.setPlayerListName(args[0]);
  91.                                 } else sender.sendMessage(ChatColor.RED + args[0] + " is not a real playername!");
  92.                             }
  93.                         }, 75);
  94.                     } else{
  95.                         Player target = Bukkit.getPlayer(args[0]);
  96.                         if (target != null) {
  97.                             setSkin(target.getUniqueId(), player, target.getName());
  98.                             player.setDisplayName(target.getName());
  99.                             player.setPlayerListName(target.getName());
  100.                         } else {
  101.                             final UUID uuid = getUUID(args[0]);
  102.                             if (uuid != null) {
  103.                                 getServer().getScheduler().runTask(getMain(), () -> { setSkin(uuid, player, args[0]); });
  104.                                 player.setDisplayName(args[0]);
  105.                                 player.setPlayerListName(args[0]);
  106.                             } else sender.sendMessage(ChatColor.RED + args[0] + " is not a real playername!");
  107.                         }
  108.                     }
  109.                 }
  110.             }
  111.             else if(command.getName().equalsIgnoreCase("undisguise")){
  112.                 if(profiles.containsKey(player.getUniqueId())){
  113.                     profiles.get(player.getUniqueId()).reset();
  114.                     profiles.remove(player.getUniqueId());
  115.                 } else{
  116.                     player.sendMessage(ChatColor.RED + "You are still yourself!");
  117.                 }
  118.             }
  119.         }
  120.         return true;
  121.     }
  122.  
  123.     @SuppressWarnings("resource")
  124.     public void setSkin(final UUID uuid, final Player player, String name) {
  125.         if (uuid != null) {
  126.             player.sendMessage(ChatColor.RED + "Loading in your new skin, please wait...");
  127.             final String uuidString = uuid.toString().replace("-", "");
  128.             getServer().getScheduler().runTaskAsynchronously(getMain(), () -> {
  129.                 try {
  130.                     URLConnection conn = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuidString + "?unsigned=false").openConnection();
  131.                     String json = new Scanner(conn.getInputStream(), "UTF-8").useDelimiter("\\A").next();
  132.                     JSONArray properties = (JSONArray) ((JSONObject) new JSONParser().parse(json)).get("properties");
  133.                     for (Object o : properties) {
  134.                         JSONObject property = (JSONObject) o;
  135.                         if ("textures".equals(property.get("name"))) {
  136.                             final PlayerSkin loaded = new PlayerSkin(plugin, player, name, (String) property.get("value"), property.containsKey("signature") ? (String) property.get("signature") : null);
  137.                             profiles.put(player.getUniqueId(), loaded);
  138.                             getServer().getScheduler().runTask(SkinChanger.this, () -> { loaded.apply(); });
  139.                             break;
  140.                         }
  141.                     }
  142.                 } catch (Exception e) { player.sendMessage(ChatColor.RED + "An error occured while changing your profile. (Error: " + e.getMessage() + ")"); return; }
  143.             });
  144.         }
  145.     }
  146.  
  147.     public UUID UUIDfromString(String string) {
  148.         if (string.charAt(8) != '-') string = string.substring(0, 8) + '-' + string.substring(8);
  149.         if (string.charAt(13) != '-') string = string.substring(0, 13) + '-' + string.substring(13);
  150.         if (string.charAt(18) != '-') string = string.substring(0, 18) + '-' + string.substring(18);
  151.         if (string.charAt(23) != '-') string = string.substring(0, 23) + '-' + string.substring(23);
  152.         return UUID.fromString(string);
  153.     }
  154.  
  155.     @SuppressWarnings("resource")
  156.     public UUID getUUID(String string) {
  157.         try { return UUIDfromString((String) ((JSONObject) new JSONParser().parse(new Scanner(new URL("https://api.mojang.com/users/profiles/minecraft/" + string).openConnection().getInputStream(), "UTF-8").useDelimiter("\\A").next())).get("id"));
  158.         } catch (Exception e) { return null; }
  159.     }
  160.    
  161.     class PlayerSkin {
  162.        
  163.         private static final String FIELD = "bS";
  164.  
  165.         private SkinChanger plugin;
  166.         private Player player;
  167.         private String newname, value, signature;
  168.         private GameProfile oldprofile;
  169.         public PlayerSkin(SkinChanger plugin, Player player, String newname, String value, String signature) {
  170.             this.plugin = plugin;
  171.             this.player = player;
  172.             this.newname = newname;
  173.             this.value = value;
  174.             this.signature = signature;
  175.             this.oldprofile = ((CraftPlayer)player).getProfile();
  176.         }
  177.  
  178.         @SuppressWarnings("deprecation")
  179.         public void apply() {
  180.             CraftPlayer cp = (CraftPlayer) player;
  181.             for (Player online : Bukkit.getOnlinePlayers()) online.hidePlayer(player);
  182.             try {
  183.                 GameProfile gp = new GameProfile(player.getUniqueId(), newname);
  184.                 gp.getProperties().get("textures").clear();
  185.                 gp.getProperties().get("textures").add(new Property("textures", value, signature));
  186.                
  187.                 Field field = cp.getHandle().getClass().getSuperclass().getDeclaredField(FIELD);
  188.                 field.setAccessible(true);
  189.                 field.set(cp.getHandle(), gp);
  190.                 field.setAccessible(false);
  191.             } catch (Exception e) { player.sendMessage(ChatColor.RED + "An error occured while changing your profile."); return; }
  192.            
  193.             Bukkit.getScheduler().runTask(plugin, () -> {
  194.                 cp.getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, cp.getHandle()));
  195.                 Bukkit.getScheduler().runTaskLater(plugin, () -> {
  196.                     Bukkit.getOnlinePlayers().stream().filter(p -> p.getUniqueId() != player.getUniqueId()).forEach(p -> {
  197.                         CraftPlayer cp2 = ((CraftPlayer) player);
  198.                         cp2.getHandle().playerConnection.sendPacket(new PacketPlayOutEntityDestroy(player.getEntityId()));
  199.                         cp2.getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(cp.getHandle()));
  200.                         Bukkit.getServer().getScheduler().runTask(plugin, () -> p.hidePlayer(player));
  201.                         Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> p.showPlayer(player), 10);
  202.                     });
  203.                     cp.getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, cp.getHandle()));
  204.                     player.sendMessage(ChatColor.YELLOW + "Your skin has been succesfully changed to " + newname + ".");
  205.                 }, 15);
  206.                
  207.                 MinecraftServer.getServer().getPlayerList().moveToWorld(cp.getHandle(), player.getWorld().getEnvironment().getId(), true, player.getLocation(), false);
  208.             });
  209.         }
  210.        
  211.         @SuppressWarnings("deprecation")
  212.         public void reset(){
  213.             player.setDisplayName(oldprofile.getName());
  214.             player.setPlayerListName(oldprofile.getName());
  215.             CraftPlayer cp = (CraftPlayer) player;     
  216.             player.sendMessage(ChatColor.GREEN + "Resetting your profile, please wait...");
  217.             for (Player online : Bukkit.getOnlinePlayers()) online.hidePlayer(player);
  218.             try {
  219.                 Field field = cp.getHandle().getClass().getSuperclass().getDeclaredField(FIELD);
  220.                 field.setAccessible(true);
  221.                 field.set(cp.getHandle(), oldprofile);
  222.                 field.setAccessible(false);
  223.             } catch (Exception e) { player.sendMessage(ChatColor.RED + "An error occured while changing your profile back."); return; }
  224.            
  225.             Bukkit.getScheduler().runTask(plugin, () -> {
  226.                 cp.getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, cp.getHandle()));
  227.                 Bukkit.getScheduler().runTaskLater(plugin, () -> {
  228.                     Bukkit.getOnlinePlayers().stream().filter(p -> p.getUniqueId() != player.getUniqueId()).forEach(p -> {
  229.                         CraftPlayer cp2 = ((CraftPlayer) player);
  230.                         cp2.getHandle().playerConnection.sendPacket(new PacketPlayOutEntityDestroy(player.getEntityId()));
  231.                         cp2.getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(cp.getHandle()));
  232.                         Bukkit.getServer().getScheduler().runTask(plugin, () -> p.hidePlayer(player));
  233.                         Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> p.showPlayer(player), 10);
  234.                     });
  235.                     cp.getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, cp.getHandle()));
  236.                     player.sendMessage(ChatColor.GREEN + "Successfully reset your profile.");
  237.                 }, 15);
  238.                
  239.                 MinecraftServer.getServer().getPlayerList().moveToWorld(cp.getHandle(), player.getWorld().getEnvironment().getId(), true, player.getLocation(), false);
  240.             });
  241.         }
  242.     }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment