Added ability to equip the carried material for Enderman. This addresses CITIZENS-7.

This commit is contained in:
aPunch 2012-03-10 19:11:28 -06:00
parent 0c70b28803
commit d4113c1984
12 changed files with 170 additions and 107 deletions

View File

@ -17,8 +17,8 @@
<classpath> <classpath>
<pathelement path="${lib}" /> <pathelement path="${lib}" />
<pathelement location="${lib}/bukkit-1.2.3-R0.2-SNAPSHOT.jar" /> <pathelement location="${lib}/bukkit-1.2.3-R0.2-SNAPSHOT.jar" />
<pathelement location="${lib}/craftbukkit-1.2.3-R0.2-SNAPSHOT.jar" />
<pathelement location="${lib}/CitizensAPI.jar" /> <pathelement location="${lib}/CitizensAPI.jar" />
<pathelement location="${lib}/craftbukkit-1.2.3-R0.2-SNAPSHOT.jar" />
</classpath> </classpath>
</javac> </javac>
<antcall target="distcore" /> <antcall target="distcore" />

Binary file not shown.

Binary file not shown.

View File

@ -12,7 +12,6 @@ import net.citizensnpcs.api.event.CitizensReloadEvent;
import net.citizensnpcs.api.exception.NPCException; import net.citizensnpcs.api.exception.NPCException;
import net.citizensnpcs.api.exception.NPCLoadException; import net.citizensnpcs.api.exception.NPCLoadException;
import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.character.CharacterManager;
import net.citizensnpcs.api.util.DataKey; import net.citizensnpcs.api.util.DataKey;
import net.citizensnpcs.api.util.DatabaseStorage; import net.citizensnpcs.api.util.DatabaseStorage;
import net.citizensnpcs.api.util.Storage; import net.citizensnpcs.api.util.Storage;
@ -60,10 +59,6 @@ public class Citizens extends JavaPlugin {
private Storage saves; // TODO: refactor this into an NPCStore (remove private Storage saves; // TODO: refactor this into an NPCStore (remove
// dependency on Storage). // dependency on Storage).
public CharacterManager getCharacterManager() {
return characterManager;
}
public CommandManager getCommandManager() { public CommandManager getCommandManager() {
return commands; return commands;
} }
@ -255,8 +250,8 @@ public class Citizens extends JavaPlugin {
if (!key.keyExists("name")) if (!key.keyExists("name"))
throw new NPCLoadException("Could not find a name for the NPC with ID '" + id + "'."); throw new NPCLoadException("Could not find a name for the NPC with ID '" + id + "'.");
NPC npc = npcManager.createNPC(EntityType.valueOf(key.getString("traits.type").toUpperCase()), id, NPC npc = npcManager.createNPC(EntityType.valueOf(key.getString("traits.type").toUpperCase()), id, key
key.getString("name"), null); .getString("name"), null);
try { try {
((CitizensNPC) npc).load(key); ((CitizensNPC) npc).load(key);
} catch (NPCException ex) { } catch (NPCException ex) {

View File

@ -28,6 +28,8 @@ import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.google.common.collect.Sets;
public class CommandManager { public class CommandManager {
/* /*
@ -95,17 +97,23 @@ public class CommandManager {
if (cmdRequirements != null) { if (cmdRequirements != null) {
NPC npc = (NPC) methodArgs[2]; NPC npc = (NPC) methodArgs[2];
// Requirements
if (cmdRequirements.selected() && npc == null) if (cmdRequirements.selected() && npc == null)
throw new RequirementMissingException("You must have an NPC selected to execute that command."); throw new RequirementMissingException("You must have an NPC selected to execute that command.");
if (cmdRequirements.ownership() && npc != null if (cmdRequirements.ownership() && npc != null
&& !npc.getTrait(Owner.class).getOwner().equals(player.getName()) && !npc.getTrait(Owner.class).getOwner().equals(player.getName())
&& !player.hasPermission("citizens.admin")) && !player.hasPermission("citizens.admin"))
throw new RequirementMissingException("You must be the owner of this NPC to execute that command."); throw new RequirementMissingException("You must be the owner of this NPC to execute that command.");
if (cmdRequirements.type() != EntityType.UNKNOWN
&& !cmdRequirements.type().name().equals(npc.getTrait(MobType.class).getType())) Set<EntityType> types = Sets.newHashSet(cmdRequirements.types());
throw new RequirementMissingException("The NPC must be of the type '" if (!types.contains(EntityType.UNKNOWN)) {
+ cmdRequirements.type().name().toLowerCase().replace('_', '-') EntityType type = EntityType.valueOf(npc.getTrait(MobType.class).getType());
+ "' in order for you to use that command."); if (!types.contains(type)) {
throw new RequirementMissingException("The NPC cannot be the mob type '"
+ type.name().toLowerCase().replace('_', '-') + "' to use that command.");
}
}
} }
} }

View File

@ -12,5 +12,5 @@ public @interface Requirements {
boolean selected() default false; boolean selected() default false;
EntityType type() default EntityType.UNKNOWN; EntityType[] types() default { EntityType.UNKNOWN };
} }

View File

@ -23,7 +23,8 @@ public class EditorCommands {
min = 1, min = 1,
max = 1, max = 1,
permission = "npc.edit.equip") permission = "npc.edit.equip")
@Requirements(selected = true, ownership = true, type = EntityType.PLAYER) @Requirements(selected = true, ownership = true, types = { EntityType.ENDERMAN, EntityType.PLAYER, EntityType.PIG,
EntityType.SHEEP })
public void equip(CommandContext args, Player player, NPC npc) { public void equip(CommandContext args, Player player, NPC npc) {
Editor.enterOrLeave(player, new EquipmentEditor(player, npc)); Editor.enterOrLeave(player, new EquipmentEditor(player, npc));
} }

View File

@ -0,0 +1,8 @@
package net.citizensnpcs.editor;
import org.bukkit.entity.Player;
public interface Equipable {
public void equip(Player equipper);
}

View File

@ -2,17 +2,15 @@ package net.citizensnpcs.editor;
import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.trait.trait.Equipment; import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.util.Messaging; import net.citizensnpcs.util.Messaging;
import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Event.Result; import org.bukkit.event.Event.Result;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
public class EquipmentEditor extends Editor { public class EquipmentEditor extends Editor {
private final NPC npc; private final NPC npc;
@ -26,9 +24,10 @@ public class EquipmentEditor extends Editor {
@Override @Override
public void begin() { public void begin() {
Messaging.send(player, "<b>Entered the equipment editor!"); Messaging.send(player, "<b>Entered the equipment editor!");
Messaging.send(player, "<e>Right click <a>to equip armor and items."); Messaging.send(player, "<e>Right click <a>to equip the NPC!");
Messaging.send(player, "<e>Right click <a>while <e>crouching <a>to equip armor in the NPC's hand."); Messaging.send(player, "<e>Right click <a>with an <e>empty hand <a>to reset all items.");
Messaging.send(player, "<e>Right click <a>with an <e>empty hand <a>to remove all armor and items."); Messaging.send(player,
"<a>If the NPC is <e>human<a>, <e>right click <a>while <e>crouching <a>to equip armor its hand.");
} }
@Override @Override
@ -49,67 +48,10 @@ public class EquipmentEditor extends Editor {
|| !event.getPlayer().equals(player)) || !event.getPlayer().equals(player))
return; return;
ItemStack hand = player.getItemInHand(); CitizensNPC handle = (CitizensNPC) npc;
Equipment trait = npc.getTrait(Equipment.class); if (!(handle instanceof Equipable))
int slot = 0; return;
// First, determine the slot to edit
switch (hand.getType()) {
case PUMPKIN:
case JACK_O_LANTERN:
case LEATHER_HELMET:
case CHAINMAIL_HELMET:
case GOLD_HELMET:
case IRON_HELMET:
case DIAMOND_HELMET:
if (!player.isSneaking())
slot = 1;
break;
case LEATHER_CHESTPLATE:
case CHAINMAIL_CHESTPLATE:
case GOLD_CHESTPLATE:
case IRON_CHESTPLATE:
case DIAMOND_CHESTPLATE:
if (!player.isSneaking())
slot = 2;
break;
case LEATHER_LEGGINGS:
case CHAINMAIL_LEGGINGS:
case GOLD_LEGGINGS:
case IRON_LEGGINGS:
case DIAMOND_LEGGINGS:
if (!player.isSneaking())
slot = 3;
break;
case LEATHER_BOOTS:
case CHAINMAIL_BOOTS:
case GOLD_BOOTS:
case IRON_BOOTS:
case DIAMOND_BOOTS:
if (!player.isSneaking())
slot = 4;
break;
case AIR:
for (int i = 0; i < 5; i++) {
if (trait.get(i) != null && trait.get(i).getType() != Material.AIR) {
player.getWorld().dropItemNaturally(npc.getBukkitEntity().getLocation(), trait.get(i));
trait.set(i, null);
}
}
Messaging.send(player, "<e>" + npc.getName() + " <a>had all of its items removed.");
}
// Now edit the equipment based on the slot
if (trait.get(slot) != null && trait.get(slot).getType() != Material.AIR)
player.getWorld().dropItemNaturally(npc.getBukkitEntity().getLocation(), trait.get(slot));
ItemStack set = hand; ((Equipable) handle).equip(event.getPlayer());
if (set != null && set.getType() != Material.AIR) {
if (hand.getAmount() > 1)
hand.setAmount(hand.getAmount() - 1);
else
hand = null;
player.setItemInHand(hand);
set.setAmount(1);
}
trait.set(slot, set);
} }
} }

View File

@ -1,15 +1,22 @@
package net.citizensnpcs.npc.entity; package net.citizensnpcs.npc.entity;
import net.citizensnpcs.api.trait.trait.Equipment;
import net.citizensnpcs.editor.Equipable;
import net.citizensnpcs.npc.CitizensMobNPC; import net.citizensnpcs.npc.CitizensMobNPC;
import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.npc.CitizensNPCManager;
import net.citizensnpcs.util.Messaging;
import net.minecraft.server.EntityEnderman; import net.minecraft.server.EntityEnderman;
import net.minecraft.server.PathfinderGoalSelector; import net.minecraft.server.PathfinderGoalSelector;
import net.minecraft.server.World; import net.minecraft.server.World;
import org.bukkit.Material;
import org.bukkit.entity.Enderman; import org.bukkit.entity.Enderman;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
public class CitizensEndermanNPC extends CitizensMobNPC { public class CitizensEndermanNPC extends CitizensMobNPC implements Equipable {
public CitizensEndermanNPC(CitizensNPCManager manager, int id, String name) { public CitizensEndermanNPC(CitizensNPCManager manager, int id, String name) {
super(manager, id, name, EntityEndermanNPC.class); super(manager, id, name, EntityEndermanNPC.class);
@ -20,6 +27,37 @@ public class CitizensEndermanNPC extends CitizensMobNPC {
return (Enderman) getHandle().getBukkitEntity(); return (Enderman) getHandle().getBukkitEntity();
} }
@Override
public void equip(Player equipper) {
ItemStack hand = equipper.getItemInHand();
if (!hand.getType().isBlock()) {
Messaging.sendError(equipper, "Invalid block!");
return;
}
MaterialData carried = getBukkitEntity().getCarriedMaterial();
if (carried.getItemType() == Material.AIR) {
if (hand.getType() == Material.AIR) {
Messaging.sendError(equipper, "Invalid block!");
return;
}
} else {
equipper.getWorld().dropItemNaturally(getBukkitEntity().getLocation(), carried.toItemStack(1));
getBukkitEntity().setCarriedMaterial(hand.getData());
}
ItemStack set = hand;
if (set.getType() != Material.AIR) {
if (hand.getAmount() > 1)
hand.setAmount(hand.getAmount() - 1);
else
hand = null;
equipper.setItemInHand(hand);
set.setAmount(1);
}
getTrait(Equipment.class).set(0, set);
}
public static class EntityEndermanNPC extends EntityEnderman { public static class EntityEndermanNPC extends EntityEnderman {
public EntityEndermanNPC(World world) { public EntityEndermanNPC(World world) {

View File

@ -1,19 +1,24 @@
package net.citizensnpcs.npc.entity; package net.citizensnpcs.npc.entity;
import net.citizensnpcs.api.exception.NPCLoadException; import net.citizensnpcs.api.exception.NPCLoadException;
import net.citizensnpcs.api.trait.trait.Equipment;
import net.citizensnpcs.api.util.DataKey; import net.citizensnpcs.api.util.DataKey;
import net.citizensnpcs.editor.Equipable;
import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.npc.CitizensNPCManager;
import net.citizensnpcs.util.Messaging;
import net.citizensnpcs.util.StringHelper; import net.citizensnpcs.util.StringHelper;
import net.minecraft.server.EntityLiving; import net.minecraft.server.EntityLiving;
import net.minecraft.server.ItemInWorldManager; import net.minecraft.server.ItemInWorldManager;
import net.minecraft.server.WorldServer; import net.minecraft.server.WorldServer;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class CitizensHumanNPC extends CitizensNPC { public class CitizensHumanNPC extends CitizensNPC implements Equipable {
public CitizensHumanNPC(CitizensNPCManager manager, int id, String name) { public CitizensHumanNPC(CitizensNPCManager manager, int id, String name) {
super(manager, id, name); super(manager, id, name);
@ -22,8 +27,8 @@ public class CitizensHumanNPC extends CitizensNPC {
@Override @Override
protected EntityLiving createHandle(Location loc) { protected EntityLiving createHandle(Location loc) {
WorldServer ws = ((CraftWorld) loc.getWorld()).getHandle(); WorldServer ws = ((CraftWorld) loc.getWorld()).getHandle();
EntityHumanNPC handle = new EntityHumanNPC(ws.getServer().getServer(), ws, EntityHumanNPC handle = new EntityHumanNPC(ws.getServer().getServer(), ws, StringHelper
StringHelper.parseColors(getFullName()), new ItemInWorldManager(ws)); .parseColors(getFullName()), new ItemInWorldManager(ws));
handle.removeFromPlayerMap(getFullName()); handle.removeFromPlayerMap(getFullName());
handle.setPositionRotation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); handle.setPositionRotation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch());
return handle; return handle;
@ -59,4 +64,70 @@ public class CitizensHumanNPC extends CitizensNPC {
mcEntity.move(0, -0.1, 0); mcEntity.move(0, -0.1, 0);
} }
} }
@Override
public void equip(Player equipper) {
ItemStack hand = equipper.getItemInHand();
Equipment trait = getTrait(Equipment.class);
int slot = 0;
// First, determine the slot to edit
switch (hand.getType()) {
case PUMPKIN:
case JACK_O_LANTERN:
case LEATHER_HELMET:
case CHAINMAIL_HELMET:
case GOLD_HELMET:
case IRON_HELMET:
case DIAMOND_HELMET:
if (!equipper.isSneaking())
slot = 1;
break;
case LEATHER_CHESTPLATE:
case CHAINMAIL_CHESTPLATE:
case GOLD_CHESTPLATE:
case IRON_CHESTPLATE:
case DIAMOND_CHESTPLATE:
if (!equipper.isSneaking())
slot = 2;
break;
case LEATHER_LEGGINGS:
case CHAINMAIL_LEGGINGS:
case GOLD_LEGGINGS:
case IRON_LEGGINGS:
case DIAMOND_LEGGINGS:
if (!equipper.isSneaking())
slot = 3;
break;
case LEATHER_BOOTS:
case CHAINMAIL_BOOTS:
case GOLD_BOOTS:
case IRON_BOOTS:
case DIAMOND_BOOTS:
if (!equipper.isSneaking())
slot = 4;
break;
case AIR:
for (int i = 0; i < 5; i++) {
if (trait.get(i) != null && trait.get(i).getType() != Material.AIR) {
equipper.getWorld().dropItemNaturally(getBukkitEntity().getLocation(), trait.get(i));
trait.set(i, null);
}
}
Messaging.send(equipper, "<e>" + getName() + " <a>had all of its items removed.");
}
// Now edit the equipment based on the slot
if (trait.get(slot) != null && trait.get(slot).getType() != Material.AIR)
equipper.getWorld().dropItemNaturally(getBukkitEntity().getLocation(), trait.get(slot));
ItemStack set = hand;
if (set != null && set.getType() != Material.AIR) {
if (hand.getAmount() > 1)
hand.setAmount(hand.getAmount() - 1);
else
hand = null;
equipper.setItemInHand(hand);
set.setAmount(1);
}
trait.set(slot, set);
}
} }