package net.aufdemrand.denizen.scripts.commands.entity; import net.aufdemrand.denizen.BukkitScriptEntryData; import net.aufdemrand.denizen.nms.NMSHandler; import net.aufdemrand.denizen.objects.dEntity; import net.aufdemrand.denizen.objects.dItem; import net.aufdemrand.denizen.objects.dNPC; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizencore.exceptions.CommandExecutionException; import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException; import net.aufdemrand.denizencore.objects.aH; import net.aufdemrand.denizencore.objects.dList; import net.aufdemrand.denizencore.scripts.ScriptEntry; import net.aufdemrand.denizencore.scripts.commands.AbstractCommand; import net.citizensnpcs.api.trait.trait.Equipment; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.Horse; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Pig; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; public class EquipCommand extends AbstractCommand { @Override public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { Map<String, dItem> equipment = new HashMap<String, dItem>(); // Initialize necessary fields for (aH.Argument arg : aH.interpret(scriptEntry.getArguments())) { if (!scriptEntry.hasObject("entities") && arg.matchesArgumentList(dEntity.class)) { scriptEntry.addObject("entities", arg.asType(dList.class).filter(dEntity.class)); } else if (arg.matchesArgumentType(dItem.class) && arg.matchesPrefix("head", "helmet")) { equipment.put("head", dItem.valueOf(arg.getValue())); } else if (arg.matchesArgumentType(dItem.class) && arg.matchesPrefix("chest", "chestplate")) { equipment.put("chest", dItem.valueOf(arg.getValue())); } else if (arg.matchesArgumentType(dItem.class) && arg.matchesPrefix("legs", "leggings")) { equipment.put("legs", dItem.valueOf(arg.getValue())); } else if (arg.matchesArgumentType(dItem.class) && arg.matchesPrefix("boots", "feet")) { equipment.put("boots", dItem.valueOf(arg.getValue())); } else if (arg.matchesArgumentType(dItem.class) && arg.matchesPrefix("saddle")) { equipment.put("saddle", dItem.valueOf(arg.getValue())); } else if (arg.matchesArgumentType(dItem.class) && arg.matchesPrefix("horse_armor", "horse_armour")) { equipment.put("horse_armor", dItem.valueOf(arg.getValue())); } else if (arg.matchesArgumentType(dItem.class) && arg.matchesPrefix("offhand")) { equipment.put("offhand", dItem.valueOf(arg.getValue())); } // Default to item in hand if no prefix is used else if (arg.matchesArgumentType(dItem.class)) { equipment.put("hand", dItem.valueOf(arg.getValue())); } else if (arg.matches("player") && ((BukkitScriptEntryData) scriptEntry.entryData).hasPlayer()) { // Player arg for compatibility with old scripts scriptEntry.addObject("entities", Arrays.asList(((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().getDenizenEntity())); } else { arg.reportUnhandled(); } } // Make sure at least one equipment argument was used if (equipment.isEmpty()) { throw new InvalidArgumentsException("Must specify equipment!"); } scriptEntry.addObject("equipment", equipment); // Use player or NPC as default entity scriptEntry.defaultObject("entities", (((BukkitScriptEntryData) scriptEntry.entryData).hasNPC() ? Arrays.asList(((BukkitScriptEntryData) scriptEntry.entryData).getNPC().getDenizenEntity()) : null), (((BukkitScriptEntryData) scriptEntry.entryData).hasPlayer() ? Arrays.asList(((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().getDenizenEntity()) : null)); } @SuppressWarnings("unchecked") @Override public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { Map<String, dItem> equipment = (Map<String, dItem>) scriptEntry.getObject("equipment"); List<dEntity> entities = (List<dEntity>) scriptEntry.getObject("entities"); // Report to dB dB.report(scriptEntry, getName(), aH.debugObj("entities", entities.toString()) + aH.debugObj("equipment", equipment.toString())); for (dEntity entity : entities) { if (entity.isGeneric()) { dB.echoError(scriptEntry.getResidingQueue(), "Cannot equip generic entity " + entity.identify() + "!"); } else if (entity.isCitizensNPC()) { dNPC npc = entity.getDenizenNPC(); if (npc != null) { Equipment trait = npc.getEquipmentTrait(); if (equipment.get("hand") != null) { trait.set(0, equipment.get("hand").getItemStack()); } if (equipment.get("head") != null) { trait.set(1, equipment.get("head").getItemStack()); } if (equipment.get("chest") != null) { trait.set(2, equipment.get("chest").getItemStack()); } if (equipment.get("legs") != null) { trait.set(3, equipment.get("legs").getItemStack()); } if (equipment.get("boots") != null) { trait.set(4, equipment.get("boots").getItemStack()); } if (equipment.get("offhand") != null) { trait.set(5, equipment.get("offhand").getItemStack()); } if (npc.isSpawned()) { LivingEntity livingEntity = npc.getLivingEntity(); // TODO: Citizens API for this blob? if (livingEntity.getType() == EntityType.HORSE) { if (equipment.get("saddle") != null) { ((Horse) livingEntity).getInventory().setSaddle(equipment.get("saddle").getItemStack()); } if (equipment.get("horse_armor") != null) { ((Horse) livingEntity).getInventory().setArmor(equipment.get("horse_armor").getItemStack()); } } else if (livingEntity.getType() == EntityType.PIG) { if (equipment.get("saddle") != null) { dItem saddle = equipment.get("saddle"); if (saddle.getItemStack().getType() == Material.SADDLE) { ((Pig) livingEntity).setSaddle(true); } else { ((Pig) livingEntity).setSaddle(false); } } } } } } else { LivingEntity livingEntity = entity.getLivingEntity(); if (livingEntity != null) { if (livingEntity.getType() == EntityType.HORSE) { if (equipment.get("saddle") != null) { ((Horse) livingEntity).getInventory().setSaddle(equipment.get("saddle").getItemStack()); } if (equipment.get("horse_armor") != null) { ((Horse) livingEntity).getInventory().setArmor(equipment.get("horse_armor").getItemStack()); } } else if (livingEntity.getType() == EntityType.PIG) { if (equipment.get("saddle") != null) { dItem saddle = equipment.get("saddle"); if (saddle.getItemStack().getType() == Material.SADDLE) { ((Pig) livingEntity).setSaddle(true); } else { ((Pig) livingEntity).setSaddle(false); } } } else { if (equipment.get("hand") != null) { NMSHandler.getInstance().getEntityHelper().setItemInHand(livingEntity, equipment.get("hand").getItemStack()); } if (equipment.get("head") != null) { livingEntity.getEquipment().setHelmet(equipment.get("head").getItemStack()); } if (equipment.get("chest") != null) { livingEntity.getEquipment().setChestplate(equipment.get("chest").getItemStack()); } if (equipment.get("legs") != null) { livingEntity.getEquipment().setLeggings(equipment.get("legs").getItemStack()); } if (equipment.get("boots") != null) { livingEntity.getEquipment().setBoots(equipment.get("boots").getItemStack()); } if (equipment.get("offhand") != null) { NMSHandler.getInstance().getEntityHelper().setItemInOffHand(livingEntity, equipment.get("offhand").getItemStack()); } } } } } } }