Add /grabhead and use local skins if possible with skinapi
This commit is contained in:
parent
53051668af
commit
4fa20a0367
@ -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:
|
||||||
@ -181,3 +188,5 @@ permissions:
|
|||||||
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
|
Loading…
Reference in New Issue
Block a user