Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * MIT License
- *
- * Copyright (c) 2016
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
- package net.projectbudder.skinchanger;
- import java.lang.reflect.Field;
- import java.net.URL;
- import java.net.URLConnection;
- import java.util.HashMap;
- import java.util.Scanner;
- import java.util.UUID;
- import org.bukkit.Bukkit;
- import org.bukkit.ChatColor;
- import org.bukkit.command.Command;
- import org.bukkit.command.CommandExecutor;
- import org.bukkit.command.CommandSender;
- import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
- import org.bukkit.entity.Player;
- import org.bukkit.event.Listener;
- import org.bukkit.plugin.java.JavaPlugin;
- import org.json.simple.JSONArray;
- import org.json.simple.JSONObject;
- import org.json.simple.parser.JSONParser;
- import com.mojang.authlib.GameProfile;
- import com.mojang.authlib.properties.Property;
- import net.minecraft.server.v1_9_R2.MinecraftServer;
- import net.minecraft.server.v1_9_R2.PacketPlayOutEntityDestroy;
- import net.minecraft.server.v1_9_R2.PacketPlayOutNamedEntitySpawn;
- import net.minecraft.server.v1_9_R2.PacketPlayOutPlayerInfo;
- import net.minecraft.server.v1_9_R2.PacketPlayOutPlayerInfo.EnumPlayerInfoAction;
- /**
- * @author Jitse3301
- * @since 05.11.2016
- */
- public class SkinChanger extends JavaPlugin implements CommandExecutor, Listener {
- private SkinChanger plugin = this;
- private HashMap<UUID, PlayerSkin> profiles = new HashMap<UUID, PlayerSkin>();
- @Override
- public void onEnable() { getCommand("disguise").setExecutor(this); getCommand("undisguise").setExecutor(this); }
- public SkinChanger getMain() { return plugin; }
- public boolean onCommand(CommandSender sender, Command command, String label, final String[] args) {
- if (sender instanceof Player) {
- Player player = (Player) sender;
- if(command.getName().equalsIgnoreCase("disguise")){
- if (args.length == 0) player.sendMessage(ChatColor.RED + "Usage: /skin <playername>");
- else {
- if(profiles.get(player.getUniqueId()) != null) {
- profiles.get(player.getUniqueId()).reset();
- profiles.remove(player.getUniqueId());
- Bukkit.getScheduler().runTaskLater(getMain(), () -> {
- Player target = Bukkit.getPlayer(args[0]);
- if (target != null) {
- setSkin(target.getUniqueId(), player, target.getName());
- player.setDisplayName(target.getName());
- player.setPlayerListName(target.getName());
- } else {
- final UUID uuid = getUUID(args[0]);
- if (uuid != null) {
- getServer().getScheduler().runTask(getMain(), () -> { setSkin(uuid, player, args[0]); });
- player.setDisplayName(args[0]);
- player.setPlayerListName(args[0]);
- } else sender.sendMessage(ChatColor.RED + args[0] + " is not a real playername!");
- }
- }, 75);
- } else{
- Player target = Bukkit.getPlayer(args[0]);
- if (target != null) {
- setSkin(target.getUniqueId(), player, target.getName());
- player.setDisplayName(target.getName());
- player.setPlayerListName(target.getName());
- } else {
- final UUID uuid = getUUID(args[0]);
- if (uuid != null) {
- getServer().getScheduler().runTask(getMain(), () -> { setSkin(uuid, player, args[0]); });
- player.setDisplayName(args[0]);
- player.setPlayerListName(args[0]);
- } else sender.sendMessage(ChatColor.RED + args[0] + " is not a real playername!");
- }
- }
- }
- }
- else if(command.getName().equalsIgnoreCase("undisguise")){
- if(profiles.containsKey(player.getUniqueId())){
- profiles.get(player.getUniqueId()).reset();
- profiles.remove(player.getUniqueId());
- } else{
- player.sendMessage(ChatColor.RED + "You are still yourself!");
- }
- }
- }
- return true;
- }
- @SuppressWarnings("resource")
- public void setSkin(final UUID uuid, final Player player, String name) {
- if (uuid != null) {
- player.sendMessage(ChatColor.RED + "Loading in your new skin, please wait...");
- final String uuidString = uuid.toString().replace("-", "");
- getServer().getScheduler().runTaskAsynchronously(getMain(), () -> {
- try {
- URLConnection conn = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuidString + "?unsigned=false").openConnection();
- String json = new Scanner(conn.getInputStream(), "UTF-8").useDelimiter("\\A").next();
- JSONArray properties = (JSONArray) ((JSONObject) new JSONParser().parse(json)).get("properties");
- for (Object o : properties) {
- JSONObject property = (JSONObject) o;
- if ("textures".equals(property.get("name"))) {
- final PlayerSkin loaded = new PlayerSkin(plugin, player, name, (String) property.get("value"), property.containsKey("signature") ? (String) property.get("signature") : null);
- profiles.put(player.getUniqueId(), loaded);
- getServer().getScheduler().runTask(SkinChanger.this, () -> { loaded.apply(); });
- break;
- }
- }
- } catch (Exception e) { player.sendMessage(ChatColor.RED + "An error occured while changing your profile. (Error: " + e.getMessage() + ")"); return; }
- });
- }
- }
- public UUID UUIDfromString(String string) {
- if (string.charAt(8) != '-') string = string.substring(0, 8) + '-' + string.substring(8);
- if (string.charAt(13) != '-') string = string.substring(0, 13) + '-' + string.substring(13);
- if (string.charAt(18) != '-') string = string.substring(0, 18) + '-' + string.substring(18);
- if (string.charAt(23) != '-') string = string.substring(0, 23) + '-' + string.substring(23);
- return UUID.fromString(string);
- }
- @SuppressWarnings("resource")
- public UUID getUUID(String string) {
- 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"));
- } catch (Exception e) { return null; }
- }
- class PlayerSkin {
- private static final String FIELD = "bS";
- private SkinChanger plugin;
- private Player player;
- private String newname, value, signature;
- private GameProfile oldprofile;
- public PlayerSkin(SkinChanger plugin, Player player, String newname, String value, String signature) {
- this.plugin = plugin;
- this.player = player;
- this.newname = newname;
- this.value = value;
- this.signature = signature;
- this.oldprofile = ((CraftPlayer)player).getProfile();
- }
- @SuppressWarnings("deprecation")
- public void apply() {
- CraftPlayer cp = (CraftPlayer) player;
- for (Player online : Bukkit.getOnlinePlayers()) online.hidePlayer(player);
- try {
- GameProfile gp = new GameProfile(player.getUniqueId(), newname);
- gp.getProperties().get("textures").clear();
- gp.getProperties().get("textures").add(new Property("textures", value, signature));
- Field field = cp.getHandle().getClass().getSuperclass().getDeclaredField(FIELD);
- field.setAccessible(true);
- field.set(cp.getHandle(), gp);
- field.setAccessible(false);
- } catch (Exception e) { player.sendMessage(ChatColor.RED + "An error occured while changing your profile."); return; }
- Bukkit.getScheduler().runTask(plugin, () -> {
- cp.getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, cp.getHandle()));
- Bukkit.getScheduler().runTaskLater(plugin, () -> {
- Bukkit.getOnlinePlayers().stream().filter(p -> p.getUniqueId() != player.getUniqueId()).forEach(p -> {
- CraftPlayer cp2 = ((CraftPlayer) player);
- cp2.getHandle().playerConnection.sendPacket(new PacketPlayOutEntityDestroy(player.getEntityId()));
- cp2.getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(cp.getHandle()));
- Bukkit.getServer().getScheduler().runTask(plugin, () -> p.hidePlayer(player));
- Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> p.showPlayer(player), 10);
- });
- cp.getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, cp.getHandle()));
- player.sendMessage(ChatColor.YELLOW + "Your skin has been succesfully changed to " + newname + ".");
- }, 15);
- MinecraftServer.getServer().getPlayerList().moveToWorld(cp.getHandle(), player.getWorld().getEnvironment().getId(), true, player.getLocation(), false);
- });
- }
- @SuppressWarnings("deprecation")
- public void reset(){
- player.setDisplayName(oldprofile.getName());
- player.setPlayerListName(oldprofile.getName());
- CraftPlayer cp = (CraftPlayer) player;
- player.sendMessage(ChatColor.GREEN + "Resetting your profile, please wait...");
- for (Player online : Bukkit.getOnlinePlayers()) online.hidePlayer(player);
- try {
- Field field = cp.getHandle().getClass().getSuperclass().getDeclaredField(FIELD);
- field.setAccessible(true);
- field.set(cp.getHandle(), oldprofile);
- field.setAccessible(false);
- } catch (Exception e) { player.sendMessage(ChatColor.RED + "An error occured while changing your profile back."); return; }
- Bukkit.getScheduler().runTask(plugin, () -> {
- cp.getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, cp.getHandle()));
- Bukkit.getScheduler().runTaskLater(plugin, () -> {
- Bukkit.getOnlinePlayers().stream().filter(p -> p.getUniqueId() != player.getUniqueId()).forEach(p -> {
- CraftPlayer cp2 = ((CraftPlayer) player);
- cp2.getHandle().playerConnection.sendPacket(new PacketPlayOutEntityDestroy(player.getEntityId()));
- cp2.getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(cp.getHandle()));
- Bukkit.getServer().getScheduler().runTask(plugin, () -> p.hidePlayer(player));
- Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> p.showPlayer(player), 10);
- });
- cp.getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, cp.getHandle()));
- player.sendMessage(ChatColor.GREEN + "Successfully reset your profile.");
- }, 15);
- MinecraftServer.getServer().getPlayerList().moveToWorld(cp.getHandle(), player.getWorld().getEnvironment().getId(), true, player.getLocation(), false);
- });
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment