package kamkeel.npcs.command; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.command.PlayerNotFoundException; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import noppes.npcs.NoppesUtilServer; import noppes.npcs.constants.EnumGuiType; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.RoleCompanion; import noppes.npcs.roles.RoleFollower; import org.apache.commons.lang3.ArrayUtils; import java.util.Arrays; import java.util.List; import static kamkeel.npcs.util.ColorUtil.sendError; import static kamkeel.npcs.util.ColorUtil.sendResult; public class NpcCommand extends CommandKamkeelBase { public EntityNPCInterface selectedNpc; @Override public String getCommandName() { return "npc"; } @Override public String getDescription() { return "NPC operation"; } @Override public String getUsage() { return " "; } @Override public boolean runSubCommands() { return false; } @Override public void processCommand(ICommandSender sender, String[] args) throws CommandException { String npcname = args[0].replace("%", " "); String command = args[1]; args = Arrays.copyOfRange(args, 2, args.length); if (command.equalsIgnoreCase("create")) { args = ArrayUtils.add(args, 0, npcname); processSubCommand(sender, command, args); return; } int x = sender.getPlayerCoordinates().posX; int y = sender.getPlayerCoordinates().posY; int z = sender.getPlayerCoordinates().posZ; List list = getEntities(EntityNPCInterface.class, sender.getEntityWorld(), x, y, z, 80); for (EntityNPCInterface npc : list) { String name = npc.display.getName().replace(" ", "_"); if (name.equalsIgnoreCase(npcname)) { if (selectedNpc == null || selectedNpc.getDistanceSq(x, y, z) > npc.getDistanceSq(x, y, z)) selectedNpc = npc; } } if (selectedNpc == null) { sendError(sender, "Npc " + npcname + " was not found"); return; } processSubCommand(sender, command, args); selectedNpc = null; } @SubCommand( desc = "Set Home (respawn place)", usage = "[x] [y] [z]" ) public void home(ICommandSender sender, String[] args) { double posX = sender.getPlayerCoordinates().posX; double posY = sender.getPlayerCoordinates().posY; double posZ = sender.getPlayerCoordinates().posZ; if (args.length == 3) { posX = CommandBase.func_110666_a(sender, selectedNpc.posX, args[0]); posY = CommandBase.func_110665_a(sender, selectedNpc.posY, args[1].trim(), 0, 0); posZ = CommandBase.func_110666_a(sender, selectedNpc.posZ, args[2]); } selectedNpc.ais.startPos = new int[]{MathHelper.floor_double(posX), MathHelper.floor_double(posY), MathHelper.floor_double(posZ)}; sendResult(sender, String.format("Set NPC \u00A7e%s\u00A77 Home to \u00A7b[%.1f] [%.1f] [%.1f]\u00A77", selectedNpc.display.name, posX, posY, posZ)); } @SubCommand( desc = "Set NPC visibility", usage = "[true/false/semi]" ) public void visible(ICommandSender sender, String[] args) { if (args.length < 1) return; boolean bo = args[0].equalsIgnoreCase("true"); boolean semi = args[0].equalsIgnoreCase("semi"); int current = selectedNpc.display.visible; if (semi) selectedNpc.display.visible = 2; else if (bo) selectedNpc.display.visible = 0; else selectedNpc.display.visible = 1; String[] list = new String[]{"True", "False", "Semi"}; if (current != selectedNpc.display.visible) selectedNpc.updateClient = true; sendResult(sender, String.format("Set NPC \u00A7e%s\u00A77 Visibility to \u00A7b%s\u00A77", selectedNpc.display.name, list[selectedNpc.display.visible])); } @SubCommand(desc = "Delete an NPC") public void delete(ICommandSender sender, String[] args) { selectedNpc.delete(); } @SubCommand( desc = "Sets the owner of an follower/companion", usage = "[player]" ) public void owner(ICommandSender sender, String[] args) { if (args.length < 1) { EntityPlayer player = null; if (selectedNpc.roleInterface instanceof RoleFollower) player = ((RoleFollower) selectedNpc.roleInterface).owner; if (selectedNpc.roleInterface instanceof RoleCompanion) player = ((RoleCompanion) selectedNpc.roleInterface).owner; if (player == null) sendResult(sender, String.format("NPC \u00A7e%s\u00A77 Owner: \u00A7b%s\u00A77", selectedNpc.display.name, "NULL")); else sendResult(sender, String.format("NPC \u00A7e%s\u00A77 Owner: \u00A7b%s\u00A77", selectedNpc.display.name, player.getDisplayName())); } else { EntityPlayerMP player = null; try { player = CommandBase.getPlayer(sender, args[0]); } catch (PlayerNotFoundException e) { } if (selectedNpc.roleInterface instanceof RoleFollower) ((RoleFollower) selectedNpc.roleInterface).setOwner(player); if (selectedNpc.roleInterface instanceof RoleCompanion) ((RoleCompanion) selectedNpc.roleInterface).setOwner(player); if (player == null) sendResult(sender, String.format("NPC \u00A7e%s\u00A77 Owner: \u00A7b%s\u00A77", selectedNpc.display.name, "NULL")); else sendResult(sender, String.format("NPC \u00A7e%s\u00A77 Owner: \u00A7b%s\u00A77", selectedNpc.display.name, player.getDisplayName())); } } @SubCommand( desc = "Set NPC name", usage = "[name]" ) public void name(ICommandSender sender, String[] args) { if (args.length < 1) return; String name = args[0]; for (int i = 1; i < args.length; i++) { name += " " + args[i]; } sendResult(sender, String.format("NPC \u00A7e%s\u00A77 Name set to \u00A7b%s\u00A77", selectedNpc.display.name, name)); if (!selectedNpc.display.getName().equals(name)) { selectedNpc.display.setName(name); selectedNpc.updateClient = true; } } @SubCommand( desc = "Creates an NPC", usage = "[name]" ) public void create(ICommandSender sender, String[] args) { EntityPlayerMP player = (EntityPlayerMP) sender; World pw = player.getEntityWorld(); EntityCustomNpc npc = new EntityCustomNpc(pw); if (args.length > 0) npc.display.name = args[0]; npc.setPositionAndRotation(player.posX, player.posY, player.posZ, player.cameraYaw, player.cameraPitch); npc.ais.startPos = new int[]{MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ)}; pw.spawnEntityInWorld(npc); npc.setHealth(npc.getMaxHealth()); NoppesUtilServer.sendOpenGui(player, EnumGuiType.MainMenuDisplay, npc); } @Override public List addTabCompletionOptions(ICommandSender par1, String[] args) { if (args.length == 2) { return CommandBase.getListOfStringsMatchingLastWord(args, new String[]{"create", "home", "visible", "delete", "owner", "name"}); } if (args.length == 3 && args[1].equalsIgnoreCase("owner")) { return CommandBase.getListOfStringsMatchingLastWord(args, MinecraftServer.getServer().getAllUsernames()); } return null; } @Override public int getRequiredPermissionLevel() { return 4; } public List getEntities(Class cls, World world, int x, int y, int z, int range) { AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(range, range, range); List list = world.getEntitiesWithinAABB(cls, bb); return list; } }