diff options
| author | Moulberry <jjenour@student.unimelb.edu.au> | 2022-10-15 16:14:46 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-15 16:14:46 +0200 |
| commit | 9dff9de9be425a07691951f7f7e6d43ca2c967bf (patch) | |
| tree | 525c4086b4b8cb9ee2a329dee7a0915ceaaa788a /src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java | |
| parent | 7c6d37b2eb758a13b342b906f0aef88b940bc52a (diff) | |
| parent | df02addf3404f07f245d6e6da8ce3ee8d72bd235 (diff) | |
| download | notenoughupdates-9dff9de9be425a07691951f7f7e6d43ca2c967bf.tar.gz notenoughupdates-9dff9de9be425a07691951f7f7e6d43ca2c967bf.tar.bz2 notenoughupdates-9dff9de9be425a07691951f7f7e6d43ca2c967bf.zip | |
Merge pull request #268 from NotEnoughUpdates/master
2.1 Continued
Diffstat (limited to 'src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java')
| -rw-r--r-- | src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java | 303 |
1 files changed, 274 insertions, 29 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java index e809ed72..e1504472 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java @@ -1,3 +1,22 @@ +/* + * Copyright (C) 2022 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>. + */ + package io.github.moulberry.notenoughupdates.commands.dev; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -5,55 +24,281 @@ import io.github.moulberry.notenoughupdates.commands.ClientCommandBase; import io.github.moulberry.notenoughupdates.core.util.MiscUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityArmorStand; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; +import java.util.HashMap; +import java.util.List; +import java.util.function.Supplier; + public class PackDevCommand extends ClientCommandBase { + static Minecraft mc = Minecraft.getMinecraft(); public PackDevCommand() { super("neupackdev"); } + private static final HashMap<String, Command<?, ?>> commands = new HashMap<String, Command<?, ?>>() {{ + put( + "getnpc", + new Command<>( + "NPC", + () -> mc.theWorld.playerEntities, + true, + AbstractClientPlayer.class + ) + ); + put( + "getnpcs", + new Command<>( + "NPC", + () -> mc.theWorld.playerEntities, + false, + AbstractClientPlayer.class + ) + ); + put( + "getmob", + new Command<>( + "mob", + () -> mc.theWorld.loadedEntityList, + true, + EntityLiving.class + ) + ); + put( + "getmobs", + new Command<>( + "mob", + () -> mc.theWorld.loadedEntityList, + false, + EntityLiving.class + ) + ); + put( + "getarmorstand", + new Command<>( + "armor stand", + () -> mc.theWorld.loadedEntityList, + true, + EntityArmorStand.class + ) + ); + put( + "getarmorstands", + new Command<>( + "armor stand", + () -> mc.theWorld.loadedEntityList, + false, + EntityArmorStand.class + ) + ); + }}; + + @Override + public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) { + return args.length == 1 ? getListOfStringsMatchingLastWord(args, commands.keySet()) : null; + } + + public static void togglePackDeveloperMode(ICommandSender sender) { + NotEnoughUpdates.INSTANCE.packDevEnabled = !NotEnoughUpdates.INSTANCE.packDevEnabled; + if (NotEnoughUpdates.INSTANCE.packDevEnabled) { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Enabled pack developer mode.")); + } else { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "Disabled pack developer mode.")); + } + } + @Override public void processCommand(ICommandSender sender, String[] args) throws CommandException { - if (args.length == 1 && args[0].equalsIgnoreCase("getnpc")) { - double distSq = 25; - EntityPlayer closestNPC = null; - EntityPlayerSP p = Minecraft.getMinecraft().thePlayer; - for (EntityPlayer player : Minecraft.getMinecraft().theWorld.playerEntities) { - if (player instanceof AbstractClientPlayer && p != player && player.getUniqueID().version() != 4) { - double dSq = player.getDistanceSq(p.posX, p.posY, p.posZ); - if (dSq < distSq) { - distSq = dSq; - closestNPC = player; + if (args.length == 0) { + togglePackDeveloperMode(sender); + return; + } + + double dist = 5.0; + if (args.length >= 2) { + try { + dist = Double.parseDouble(args[1]); + } catch (NumberFormatException e) { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "Invalid distance! Must be a number, defaulting to a radius of 5.")); + } + } + + StringBuilder output; + String subCommand = args[0].toLowerCase(); + if (commands.containsKey(subCommand)) { + Command<?, ?> command = commands.get(subCommand); + output = command.getData(dist); + } else if (subCommand.equals("getall")) { + output = getAll(dist); + } else if (subCommand.equals("getallclose")) { + output = getAllClose(dist); + } else { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "Invalid sub-command.")); + return; + } + + if (output.length() != 0) { + MiscUtils.copyToClipboard(output.toString()); + } + } + + private static StringBuilder getAllClose(Double dist) { + StringBuilder sb = new StringBuilder(); + sb.append(commands.get("getmob").getData(dist)); + sb.append(commands.get("getarmorstand").getData(dist)); + sb.append(commands.get("getnpc").getData(dist)); + return sb; + } + + private static StringBuilder getAll(Double dist) { + StringBuilder sb = new StringBuilder(); + sb.append(commands.get("getmobs").getData(dist)); + sb.append(commands.get("getarmorstands").getData(dist)); + sb.append(commands.get("getnpcs").getData(dist)); + return sb; + } + + public static <T extends EntityLivingBase> StringBuilder livingBaseDataBuilder(T entity, Class<T> clazz) { + StringBuilder entityData = new StringBuilder(); + if (EntityPlayer.class.isAssignableFrom(entity.getClass())) { + EntityPlayer entityPlayer = (EntityPlayer) entity; + + // NPC Information + String skinResourcePath = ((AbstractClientPlayer) entityPlayer).getLocationSkin().getResourcePath(); + entityData + .append("Player Id: ") + .append(entityPlayer.getUniqueID() != null ? entityPlayer.getUniqueID().toString() : "null") + .append(entityPlayer.getCustomNameTag() != null ? entityPlayer.getCustomNameTag() : "null") + .append("\nEntity Texture Id: ") + .append(skinResourcePath != null ? skinResourcePath.replace("skins/", "") : "null"); + } + + if (!clazz.isAssignableFrom(entity.getClass())) { + return entityData; + } + + //Entity Information + entityData + .append("Entity Id: ") + .append(entity.getEntityId()) + .append("\nMob: ") + .append(entity.getName() != null ? entity.getName() : "null") + .append("\nCustom Name: ") + .append(entity.getCustomNameTag() != null ? entity.getCustomNameTag() : "null"); + + //Held Item + if (entity.getHeldItem() != null) { + entityData + .append("\nItem: ") + .append(entity.getHeldItem()) + .append("\nItem Display Name: ") + .append(entity.getHeldItem().getDisplayName() != null + ? entity.getHeldItem().getDisplayName() + : "null") + .append("\nItem Tag Compound: "); + NBTTagCompound heldItemTagCompound = entity.getHeldItem().getTagCompound(); + if (heldItemTagCompound != null) { + String heldItemString = heldItemTagCompound.toString(); + NBTBase extraAttrTag = heldItemTagCompound.getTag("ExtraAttributes"); + entityData + .append(heldItemString != null ? heldItemString : "null") + .append("\nItem Tag Compound Extra Attributes: ") + .append(extraAttrTag != null ? extraAttrTag : "null"); + } else { + entityData.append("null"); + } + + } else { + entityData.append("\nItem: null"); + } + + entityData.append(armorDataBuilder(entity)).append("\n\n"); + + return entityData; + } + + private static final String[] armorPieceTypes = {"Boots", "Leggings", "Chestplate", "Helmet"}; + + public static <T extends EntityLivingBase> StringBuilder armorDataBuilder(T entity) { + StringBuilder armorData = new StringBuilder(); + for (int i = 0; i < 4; i++) { + ItemStack currentArmor = entity.getCurrentArmor(0); + armorData.append(String.format("\n%s: ", armorPieceTypes[i])); + if (currentArmor == null) { + armorData.append("null"); + } else { + armorData.append(currentArmor.getTagCompound() != null ? currentArmor.getTagCompound().toString() : "null"); + } + } + return armorData; + } + + static class Command<T extends EntityLivingBase, U extends Entity> { + String typeFriendlyName; + Supplier<List<U>> entitySupplier; + Class<T> clazz; + boolean single; + + Command( + String typeFriendlyName, + Supplier<List<U>> entitySupplier, + boolean single, + Class<T> clazz + ) { + this.typeFriendlyName = typeFriendlyName; + this.entitySupplier = entitySupplier; + this.single = single; + this.clazz = clazz; + } + + @SuppressWarnings("unchecked") + public StringBuilder getData(double dist) { + StringBuilder result = new StringBuilder(); + double distSq = dist * dist; + T closest = null; + for (Entity entity : entitySupplier.get()) { + if (!clazz.isAssignableFrom(entity.getClass()) || entity == mc.thePlayer) { + continue; + } + T entityT = (T) entity; + double entityDistanceSq = entity.getDistanceSq(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ); + if (entityDistanceSq < distSq) { + if (single) { + distSq = entityDistanceSq; + closest = entityT; + } else { + result.append(livingBaseDataBuilder(entityT, clazz)); } } } - if (closestNPC == null) { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "No NPCs found within 5 blocks :(")); + if ((single && closest == null) || (!single && result.length() == 0)) { + mc.thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "No " + typeFriendlyName + "s found within " + dist + " blocks.")); } else { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Copied entity texture id to clipboard")); - MiscUtils.copyToClipboard(((AbstractClientPlayer) closestNPC) - .getLocationSkin() - .getResourcePath() - .replace("skins/", "")); + mc.thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Copied " + typeFriendlyName + " data to clipboard")); + return single ? livingBaseDataBuilder(closest, clazz) : result; } - return; - } - NotEnoughUpdates.INSTANCE.packDevEnabled = !NotEnoughUpdates.INSTANCE.packDevEnabled; - if (NotEnoughUpdates.INSTANCE.packDevEnabled) { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Enabled pack developer mode.")); - } else { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "Disabled pack developer mode.")); + + return result; } } } |
