Add /grabhead and use local skins if possible with skinapi
This commit is contained in:
		| @@ -162,6 +162,7 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|             registerCommand("copydisguise", new CopyDisguiseCommand()); |             registerCommand("copydisguise", new CopyDisguiseCommand()); | ||||||
|             registerCommand("grabskin", new GrabSkinCommand()); |             registerCommand("grabskin", new GrabSkinCommand()); | ||||||
|             registerCommand("savedisguise", new SaveDisguiseCommand()); |             registerCommand("savedisguise", new SaveDisguiseCommand()); | ||||||
|  |             registerCommand("grabhead", new GrabHeadCommand()); | ||||||
|         } else { |         } else { | ||||||
|             getLogger().info("Commands has been disabled, as per config"); |             getLogger().info("Commands has been disabled, as per config"); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -0,0 +1,129 @@ | |||||||
|  | package me.libraryaddict.disguise.commands.utils; | ||||||
|  |  | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||||
|  | import me.libraryaddict.disguise.DisguiseAPI; | ||||||
|  | import me.libraryaddict.disguise.LibsDisguises; | ||||||
|  | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  | import me.libraryaddict.disguise.utilities.LibsPremium; | ||||||
|  | import me.libraryaddict.disguise.utilities.SkinUtils; | ||||||
|  | import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||||
|  | import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||||
|  | import me.libraryaddict.disguise.utilities.translations.LibsMsg; | ||||||
|  | import net.md_5.bungee.api.chat.ClickEvent; | ||||||
|  | import net.md_5.bungee.api.chat.ComponentBuilder; | ||||||
|  | import net.md_5.bungee.api.chat.HoverEvent; | ||||||
|  | import org.apache.commons.lang.StringUtils; | ||||||
|  | import org.bukkit.ChatColor; | ||||||
|  | import org.bukkit.Material; | ||||||
|  | import org.bukkit.command.Command; | ||||||
|  | import org.bukkit.command.CommandExecutor; | ||||||
|  | import org.bukkit.command.CommandSender; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.inventory.ItemStack; | ||||||
|  | import org.bukkit.inventory.meta.SkullMeta; | ||||||
|  | import org.bukkit.scheduler.BukkitRunnable; | ||||||
|  | import org.bukkit.scheduler.BukkitTask; | ||||||
|  |  | ||||||
|  | import java.lang.reflect.Field; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Created by libraryaddict on 20/06/2020. | ||||||
|  |  */ | ||||||
|  | public class GrabHeadCommand implements CommandExecutor { | ||||||
|  |     @Override | ||||||
|  |     public boolean onCommand(CommandSender sender, Command command, String s, String[] strings) { | ||||||
|  |         if (sender instanceof Player && !sender.isOp() && | ||||||
|  |                 (!LibsPremium.isPremium() || LibsPremium.getPaidInformation() == LibsPremium.getPluginInformation())) { | ||||||
|  |             sender.sendMessage(ChatColor.RED + "Please purchase Lib's Disguises to enable player commands"); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (!sender.hasPermission("libsdisguises.grabhead")) { | ||||||
|  |             sender.sendMessage(LibsMsg.NO_PERM.get()); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (!(sender instanceof Player)) { | ||||||
|  |             sender.sendMessage(LibsMsg.NO_CONSOLE.get()); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (strings.length == 0) { | ||||||
|  |             sendHelp(sender); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         String[] args = DisguiseUtilities.split(StringUtils.join(strings, " ")); | ||||||
|  |         String skin = args[0]; | ||||||
|  |  | ||||||
|  |         String usable = SkinUtils.getUsableStatus(); | ||||||
|  |  | ||||||
|  |         if (usable != null) { | ||||||
|  |             sender.sendMessage(usable); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         SkinUtils.SkinCallback callback = new SkinUtils.SkinCallback() { | ||||||
|  |             private BukkitTask runnable = new BukkitRunnable() { | ||||||
|  |                 @Override | ||||||
|  |                 public void run() { | ||||||
|  |                     sender.sendMessage(LibsMsg.PLEASE_WAIT.get()); | ||||||
|  |                 } | ||||||
|  |             }.runTaskTimer(LibsDisguises.getInstance(), 100, 100); | ||||||
|  |  | ||||||
|  |             @Override | ||||||
|  |             public void onError(LibsMsg msg, Object... args) { | ||||||
|  |                 sender.sendMessage(msg.get(args)); | ||||||
|  |  | ||||||
|  |                 runnable.cancel(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             @Override | ||||||
|  |             public void onInfo(LibsMsg msg, Object... args) { | ||||||
|  |                 sender.sendMessage(msg.get(args)); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             @Override | ||||||
|  |             public void onSuccess(WrappedGameProfile profile) { | ||||||
|  |                 runnable.cancel(); | ||||||
|  |  | ||||||
|  |                 DisguiseUtilities.setGrabHeadCommandUsed(); | ||||||
|  |  | ||||||
|  |                 new BukkitRunnable() { | ||||||
|  |                     @Override | ||||||
|  |                     public void run() { | ||||||
|  |                         ItemStack skull = new ItemStack(Material.PLAYER_HEAD); | ||||||
|  |                         SkullMeta meta = (SkullMeta) skull.getItemMeta(); | ||||||
|  |  | ||||||
|  |                         try { | ||||||
|  |                             Field field = meta.getClass().getDeclaredField("profile"); | ||||||
|  |                             field.setAccessible(true); | ||||||
|  |                             field.set(meta, profile.getHandle()); | ||||||
|  |                         } | ||||||
|  |                         catch (NoSuchFieldException | IllegalAccessException e) { | ||||||
|  |                             e.printStackTrace(); | ||||||
|  |                         } | ||||||
|  |  | ||||||
|  |                         skull.setItemMeta(meta); | ||||||
|  |  | ||||||
|  |                         ((Player) sender).getInventory().addItem(skull); | ||||||
|  |                         sender.sendMessage(LibsMsg.GRAB_HEAD_SUCCESS.get()); | ||||||
|  |                     } | ||||||
|  |                 }.runTask(LibsDisguises.getInstance()); | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |         SkinUtils.grabSkin(skin, callback); | ||||||
|  |  | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void sendHelp(CommandSender sender) { | ||||||
|  |         sender.sendMessage(LibsMsg.GRAB_DISG_HELP_1.get()); | ||||||
|  |         sender.sendMessage(LibsMsg.GRAB_DISG_HELP_2.get()); | ||||||
|  |         sender.sendMessage(LibsMsg.GRAB_DISG_HELP_3.get()); | ||||||
|  |         sender.sendMessage(LibsMsg.GRAB_DISG_HELP_4.get()); | ||||||
|  |         sender.sendMessage(LibsMsg.GRAB_DISG_HELP_5.get()); | ||||||
|  |         sender.sendMessage(LibsMsg.GRAB_DISG_HELP_6.get()); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -133,7 +133,7 @@ public class DisguiseUtilities { | |||||||
|     private static Gson gson; |     private static Gson gson; | ||||||
|     @Getter |     @Getter | ||||||
|     private static boolean pluginsUsed, commandsUsed, copyDisguiseCommandUsed, grabSkinCommandUsed, |     private static boolean pluginsUsed, commandsUsed, copyDisguiseCommandUsed, grabSkinCommandUsed, | ||||||
|             saveDisguiseCommandUsed; |             saveDisguiseCommandUsed, grabHeadCommandUsed; | ||||||
|     private static long libsDisguisesCalled; |     private static long libsDisguisesCalled; | ||||||
|     /** |     /** | ||||||
|      * Keeps track of what tick this occured |      * Keeps track of what tick this occured | ||||||
| @@ -173,6 +173,10 @@ public class DisguiseUtilities { | |||||||
|         grabSkinCommandUsed = true; |         grabSkinCommandUsed = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static void setGrabHeadCommandUsed() { | ||||||
|  |         grabHeadCommandUsed = true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static void setCopyDisguiseCommandUsed() { |     public static void setCopyDisguiseCommandUsed() { | ||||||
|         copyDisguiseCommandUsed = true; |         copyDisguiseCommandUsed = true; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -213,7 +213,16 @@ public class SkinUtils { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|  |                 WrappedGameProfile profile = DisguiseUtilities.getGameProfile(param); | ||||||
|  |  | ||||||
|  |                 if (profile != null) { | ||||||
|  |                     callback.onInfo(LibsMsg.SKIN_API_USING_EXISTING_NAME); | ||||||
|  |                     callback.onSuccess(profile); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 callback.onInfo(LibsMsg.SKIN_API_USING_NAME); |                 callback.onInfo(LibsMsg.SKIN_API_USING_NAME); | ||||||
|  |  | ||||||
|                 handleName(param, modelType, callback); |                 handleName(param, modelType, callback); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -81,6 +81,13 @@ public class MetricsInitalizer { | |||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  |         metrics.addCustomChart(new Metrics.SimplePie("grabhead_command") { | ||||||
|  |             @Override | ||||||
|  |             public String getValue() { | ||||||
|  |                 return "" + DisguiseUtilities.isGrabHeadCommandUsed(); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |  | ||||||
|         metrics.addCustomChart(new Metrics.SimplePie("save_disguise_command") { |         metrics.addCustomChart(new Metrics.SimplePie("save_disguise_command") { | ||||||
|             @Override |             @Override | ||||||
|             public String getValue() { |             public String getValue() { | ||||||
|   | |||||||
| @@ -233,6 +233,7 @@ public enum LibsMsg { | |||||||
|     SKIN_API_USING_FILE(ChatColor.GRAY + "File provided and found, now attempting to upload to mineskin.org"), |     SKIN_API_USING_FILE(ChatColor.GRAY + "File provided and found, now attempting to upload to mineskin.org"), | ||||||
|     SKIN_API_INVALID_NAME(ChatColor.RED + "Invalid name/file/uuid provided!"), |     SKIN_API_INVALID_NAME(ChatColor.RED + "Invalid name/file/uuid provided!"), | ||||||
|     SKIN_API_USING_UUID(ChatColor.GRAY + "UUID successfully parsed, now attempting to connect to mineskin.org"), |     SKIN_API_USING_UUID(ChatColor.GRAY + "UUID successfully parsed, now attempting to connect to mineskin.org"), | ||||||
|  |     SKIN_API_USING_EXISTING_NAME(ChatColor.GRAY + "Found a saved skin under that name locally! Using that!"), | ||||||
|     SKIN_API_USING_NAME( |     SKIN_API_USING_NAME( | ||||||
|             ChatColor.GRAY + "Determined to be player name, now attempting to validate and connect to mineskin.org"), |             ChatColor.GRAY + "Determined to be player name, now attempting to validate and connect to mineskin.org"), | ||||||
|     SAVE_DISG_HELP_1(ChatColor.GREEN + "The <DisguiseName> is what the disguise will be called in Lib's Disguises"), |     SAVE_DISG_HELP_1(ChatColor.GREEN + "The <DisguiseName> is what the disguise will be called in Lib's Disguises"), | ||||||
| @@ -257,6 +258,11 @@ public enum LibsMsg { | |||||||
|             ChatColor.GREEN + "If you want the slim Alex version of the skin, append :slim. So 'myskin.png:slim'"), |             ChatColor.GREEN + "If you want the slim Alex version of the skin, append :slim. So 'myskin.png:slim'"), | ||||||
|     GRAB_DISG_HELP_6( |     GRAB_DISG_HELP_6( | ||||||
|             ChatColor.GREEN + "You will be sent the skin data, but you can also use the saved names in disguises"), |             ChatColor.GREEN + "You will be sent the skin data, but you can also use the saved names in disguises"), | ||||||
|  |     GRAB_HEAD_SUCCESS(ChatColor.GREEN + "Head successfully grabbed and added to inventory!"), | ||||||
|  |     GRAB_HEAD_HELP_1(ChatColor.GREEN + "Grab the head of a file, player or url! This is a Lib's Disguises feature."), | ||||||
|  |     GRAB_HEAD_HELP_2(ChatColor.DARK_GREEN + "/grabhead https://somesite.com/myskin.png"), | ||||||
|  |     GRAB_HEAD_HELP_3(ChatColor.DARK_GREEN + "/grabhead myskin.png - Skins must be in the folder!"), | ||||||
|  |     GRAB_HEAD_HELP_4(ChatColor.DARK_GREEN + "/grabhead <Player name or UUID>"), | ||||||
|     CUSTOM_DISGUISE_NAME_CONFLICT( |     CUSTOM_DISGUISE_NAME_CONFLICT( | ||||||
|             ChatColor.RED + "Cannot create the custom disguise '%s' as there is a name conflict!"), |             ChatColor.RED + "Cannot create the custom disguise '%s' as there is a name conflict!"), | ||||||
|     ERROR_LOADING_CUSTOM_DISGUISE(ChatColor.RED + "Error while loading custom disguise '%s'%s"), |     ERROR_LOADING_CUSTOM_DISGUISE(ChatColor.RED + "Error while loading custom disguise '%s'%s"), | ||||||
|   | |||||||
| @@ -84,6 +84,10 @@ commands: | |||||||
|       aliases: [customdisguise, savedisg, customdisg, createdisguise, createdisg] |       aliases: [customdisguise, savedisg, customdisg, createdisguise, createdisg] | ||||||
|       permission: libsdisguises.seecmd.savedisguise |       permission: libsdisguises.seecmd.savedisguise | ||||||
|       description: Save a custom disguise to disguises.yml |       description: Save a custom disguise to disguises.yml | ||||||
|  |     grabhead: | ||||||
|  |       aliases: [grabskull, playerhead, savehead, gethead] | ||||||
|  |       permission: libsdisguises.seecmd.grabhead | ||||||
|  |       description: Grab the head item of a skin, url or player | ||||||
|  |  | ||||||
| permissions: | permissions: | ||||||
|   libsdisguises.reload: |   libsdisguises.reload: | ||||||
| @@ -123,6 +127,8 @@ permissions: | |||||||
|     default: false |     default: false | ||||||
|   libsdisguises.multiname: |   libsdisguises.multiname: | ||||||
|     description: Allows the command user to set names on different heights |     description: Allows the command user to set names on different heights | ||||||
|  |   libsdisguises.grabhead: | ||||||
|  |     description: Allows the command user to use /grabhead | ||||||
|   libsdisguises.seecmd: |   libsdisguises.seecmd: | ||||||
|     description: See all commands in tab-completion |     description: See all commands in tab-completion | ||||||
|     default: true |     default: true | ||||||
| @@ -145,6 +151,7 @@ permissions: | |||||||
|        libsdisguises.seecmd.copydisguise: true |        libsdisguises.seecmd.copydisguise: true | ||||||
|        libsdisguises.seecmd.grabskin: true |        libsdisguises.seecmd.grabskin: true | ||||||
|        libsdisguises.seecmd.savedisguise: true |        libsdisguises.seecmd.savedisguise: true | ||||||
|  |        libsdisguises.seecmd.grabhead: true | ||||||
|   libsdisguises.seecmd.disguiseviewself: |   libsdisguises.seecmd.disguiseviewself: | ||||||
|     description: See the /disguiseviewself command in tab-completion |     description: See the /disguiseviewself command in tab-completion | ||||||
|   libsdisguises.seecmd.disguise: |   libsdisguises.seecmd.disguise: | ||||||
| @@ -180,4 +187,6 @@ permissions: | |||||||
|   libsdisguises.seecmd.grabskin: |   libsdisguises.seecmd.grabskin: | ||||||
|     description: See the /grabskin command in tab-completion |     description: See the /grabskin command in tab-completion | ||||||
|   libsdisguises.seecmd.savedisguise: |   libsdisguises.seecmd.savedisguise: | ||||||
|     description: See the /savedisguise command in tab-completion |     description: See the /savedisguise command in tab-completion | ||||||
|  |   libsdisguises.seecmd.grabhead: | ||||||
|  |     description: See the /grabhead command in tab-completion | ||||||
		Reference in New Issue
	
	Block a user