Add ability to edit sheep via the equipment editor. This address CITIZENS-5.

This commit is contained in:
aPunch 2012-03-17 10:43:43 -05:00
parent 126cfc8489
commit 9474532efb
33 changed files with 190 additions and 41 deletions

View File

@ -10,12 +10,12 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
public abstract class Editor implements Listener { public abstract class Editor implements Listener {
private static final Map<String, Editor> editing = new HashMap<String, Editor>();
public abstract void begin(); public abstract void begin();
public abstract void end(); public abstract void end();
private static final Map<String, Editor> editing = new HashMap<String, Editor>();
private static void enter(Player player, Editor editor) { private static void enter(Player player, Editor editor) {
editor.begin(); editor.begin();
player.getServer().getPluginManager() player.getServer().getPluginManager()

View File

@ -25,9 +25,6 @@ public class EquipmentEditor extends Editor {
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 the NPC!"); Messaging.send(player, "<e>Right click <a>to equip the NPC!");
Messaging.send(player, "<e>Right click <a>with an <e>empty hand <a>to reset all 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

View File

@ -49,10 +49,9 @@ public abstract class CitizensNPC extends AbstractNPC {
if (traits.containsKey(trait.getClass())) if (traits.containsKey(trait.getClass()))
runnables.remove(traits.get(trait.getClass())); runnables.remove(traits.get(trait.getClass()));
} }
if (trait instanceof Listener) { if (trait instanceof Listener)
Bukkit.getPluginManager().registerEvents((Listener) trait, null);
// TODO: insert plugin instance somehow // TODO: insert plugin instance somehow
} Bukkit.getPluginManager().registerEvents((Listener) trait, Bukkit.getPluginManager().getPlugin("Citizens"));
traits.put(trait.getClass(), trait); traits.put(trait.getClass(), trait);
} }

View File

@ -17,7 +17,9 @@ import net.citizensnpcs.api.trait.trait.Spawned;
import net.citizensnpcs.trait.CurrentLocation; import net.citizensnpcs.trait.CurrentLocation;
import net.citizensnpcs.trait.LookClose; import net.citizensnpcs.trait.LookClose;
import net.citizensnpcs.trait.Powered; import net.citizensnpcs.trait.Powered;
import net.citizensnpcs.trait.Sheared;
import net.citizensnpcs.trait.VillagerProfession; import net.citizensnpcs.trait.VillagerProfession;
import net.citizensnpcs.trait.WoolColor;
import net.citizensnpcs.trait.text.Text; import net.citizensnpcs.trait.text.Text;
import net.citizensnpcs.trait.waypoint.Waypoints; import net.citizensnpcs.trait.waypoint.Waypoints;
@ -27,17 +29,19 @@ public class CitizensTraitManager implements TraitManager {
public CitizensTraitManager() { public CitizensTraitManager() {
// Register Citizens traits // Register Citizens traits
registerTrait(new TraitFactory(CurrentLocation.class).withName("location"));
registerTrait(new TraitFactory(Equipment.class).withName("equipment")); registerTrait(new TraitFactory(Equipment.class).withName("equipment"));
registerTrait(new TraitFactory(Inventory.class).withName("inventory")); registerTrait(new TraitFactory(Inventory.class).withName("inventory"));
registerTrait(new TraitFactory(LookClose.class).withName("look-close")); registerTrait(new TraitFactory(LookClose.class).withName("look-close"));
registerTrait(new TraitFactory(MobType.class).withName("type")); registerTrait(new TraitFactory(MobType.class).withName("type"));
registerTrait(new TraitFactory(Owner.class).withName("owner")); registerTrait(new TraitFactory(Owner.class).withName("owner"));
registerTrait(new TraitFactory(Powered.class).withName("powered")); registerTrait(new TraitFactory(Powered.class).withName("powered"));
registerTrait(new TraitFactory(Sheared.class).withName("sheared"));
registerTrait(new TraitFactory(Spawned.class).withName("spawned")); registerTrait(new TraitFactory(Spawned.class).withName("spawned"));
registerTrait(new TraitFactory(CurrentLocation.class).withName("location"));
registerTrait(new TraitFactory(Text.class).withName("text")); registerTrait(new TraitFactory(Text.class).withName("text"));
registerTrait(new TraitFactory(VillagerProfession.class).withName("profession")); registerTrait(new TraitFactory(VillagerProfession.class).withName("profession"));
registerTrait(new TraitFactory(Waypoints.class).withName("waypoints")); registerTrait(new TraitFactory(Waypoints.class).withName("waypoints"));
registerTrait(new TraitFactory(WoolColor.class).withName("wool-color"));
} }
@Override @Override

View File

@ -26,7 +26,7 @@ public class CitizensBlazeNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityBlazeNPC(World world, NPC npc) { public EntityBlazeNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensCaveSpiderNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityCaveSpiderNPC(World world, NPC npc) { public EntityCaveSpiderNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensChickenNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityChickenNPC(World world, NPC npc) { public EntityChickenNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensCowNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityCowNPC(World world, NPC npc) { public EntityCowNPC(World world, NPC npc) {

View File

@ -27,7 +27,7 @@ public class CitizensCreeperNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityCreeperNPC(World world, NPC npc) { public EntityCreeperNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensEnderDragonNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityEnderDragonNPC(World world, NPC npc) { public EntityEnderDragonNPC(World world, NPC npc) {

View File

@ -64,7 +64,7 @@ public class CitizensEndermanNPC extends CitizensMobNPC implements Equipable {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityEndermanNPC(World world, NPC npc) { public EntityEndermanNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensGhastNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityGhastNPC(World world, NPC npc) { public EntityGhastNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensGiantNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityGiantNPC(World world, NPC npc) { public EntityGiantNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensIronGolemNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityIronGolemNPC(World world, NPC npc) { public EntityIronGolemNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensMagmaCubeNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityMagmaCubeNPC(World world, NPC npc) { public EntityMagmaCubeNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensMushroomCowNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityMushroomCowNPC(World world, NPC npc) { public EntityMushroomCowNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensOcelotNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityOcelotNPC(World world, NPC npc) { public EntityOcelotNPC(World world, NPC npc) {

View File

@ -27,7 +27,7 @@ public class CitizensPigNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityPigNPC(World world, NPC npc) { public EntityPigNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensPigZombieNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityPigZombieNPC(World world, NPC npc) { public EntityPigZombieNPC(World world, NPC npc) {

View File

@ -1,16 +1,25 @@
package net.citizensnpcs.npc.entity; package net.citizensnpcs.npc.entity;
import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPC;
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.npc.ai.NPCHandle; import net.citizensnpcs.npc.ai.NPCHandle;
import net.citizensnpcs.trait.Sheared;
import net.citizensnpcs.trait.WoolColor;
import net.citizensnpcs.util.Messaging;
import net.citizensnpcs.util.StringHelper;
import net.minecraft.server.EntitySheep; import net.minecraft.server.EntitySheep;
import net.minecraft.server.PathfinderGoalSelector; import net.minecraft.server.PathfinderGoalSelector;
import net.minecraft.server.World; import net.minecraft.server.World;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.entity.Sheep; import org.bukkit.entity.Sheep;
import org.bukkit.inventory.ItemStack;
public class CitizensSheepNPC extends CitizensMobNPC { public class CitizensSheepNPC extends CitizensMobNPC implements Equipable {
public CitizensSheepNPC(CitizensNPCManager manager, int id, String name) { public CitizensSheepNPC(CitizensNPCManager manager, int id, String name) {
super(manager, id, name, EntitySheepNPC.class); super(manager, id, name, EntitySheepNPC.class);
@ -21,12 +30,40 @@ public class CitizensSheepNPC extends CitizensMobNPC {
return (Sheep) getHandle().getBukkitEntity(); return (Sheep) getHandle().getBukkitEntity();
} }
@Override
public void equip(Player equipper) {
ItemStack hand = equipper.getItemInHand();
if (hand.getType() == Material.SHEARS) {
Messaging.send(equipper, StringHelper.wrap(getName()) + " is "
+ (getTrait(Sheared.class).toggle() ? "now" : "no longer") + " sheared.");
} else if (hand.getType() == Material.INK_SACK) {
if (getBukkitEntity().getColor() == DyeColor.getByData((byte) (15 - hand.getData().getData())))
return;
DyeColor color = DyeColor.getByData((byte) (15 - hand.getData().getData()));
getTrait(WoolColor.class).setColor(color);
Messaging.send(
equipper,
StringHelper.wrap(getName()) + " is now "
+ StringHelper.wrap(color.name().toLowerCase().replace("_", " ")) + ".");
if (hand.getAmount() > 1)
hand.setAmount(hand.getAmount() - 1);
else
hand = null;
equipper.setItemInHand(hand);
} else {
getTrait(WoolColor.class).setColor(DyeColor.WHITE);
Messaging.send(equipper, StringHelper.wrap(getName()) + " is now " + StringHelper.wrap("white") + ".");
}
}
public static class EntitySheepNPC extends EntitySheep implements NPCHandle { public static class EntitySheepNPC extends EntitySheep implements NPCHandle {
private final NPC npc; private final NPC npc;
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntitySheepNPC(World world, NPC npc) { public EntitySheepNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensSilverfishNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntitySilverfishNPC(World world, NPC npc) { public EntitySilverfishNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensSkeletonNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntitySkeletonNPC(World world, NPC npc) { public EntitySkeletonNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensSlimeNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntitySlimeNPC(World world, NPC npc) { public EntitySlimeNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensSnowmanNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntitySnowmanNPC(World world, NPC npc) { public EntitySnowmanNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensSpiderNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntitySpiderNPC(World world, NPC npc) { public EntitySpiderNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensSquidNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntitySquidNPC(World world, NPC npc) { public EntitySquidNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensVillagerNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityVillagerNPC(World world, NPC npc) { public EntityVillagerNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensWolfNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityWolfNPC(World world, NPC npc) { public EntityWolfNPC(World world, NPC npc) {

View File

@ -26,7 +26,7 @@ public class CitizensZombieNPC extends CitizensMobNPC {
@Override @Override
public NPC getNPC() { public NPC getNPC() {
return this.npc; return npc;
} }
public EntityZombieNPC(World world, NPC npc) { public EntityZombieNPC(World world, NPC npc) {

View File

@ -33,8 +33,7 @@ public class Powered extends Trait implements Toggleable {
@Override @Override
public boolean toggle() { public boolean toggle() {
powered = !powered; powered = !powered;
if (npc.getBukkitEntity() instanceof Creeper) ((Creeper) npc.getBukkitEntity()).setPowered(powered);
((Creeper) npc.getBukkitEntity()).setPowered(powered);
return powered; return powered;
} }

View File

@ -0,0 +1,58 @@
package net.citizensnpcs.trait;
import org.bukkit.entity.Sheep;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerShearEntityEvent;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.exception.NPCLoadException;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.util.DataKey;
public class Sheared extends Trait implements Toggleable, Listener {
private boolean sheared;
private final NPC npc;
public Sheared(NPC npc) {
this.npc = npc;
}
@Override
public void load(DataKey key) throws NPCLoadException {
sheared = key.getBoolean("");
}
@Override
public void save(DataKey key) {
key.setBoolean("", sheared);
}
@Override
public void onNPCSpawn() {
// TODO Get rid of instanceof's, add
// TraitFactory.withTypes(EntityType...) or similar
if (npc.getBukkitEntity() instanceof Sheep)
((Sheep) npc.getBukkitEntity()).setSheared(sheared);
}
@Override
public boolean toggle() {
sheared = !sheared;
((Sheep) npc.getBukkitEntity()).setSheared(sheared);
return sheared;
}
@EventHandler
public void onPlayerShearEntityEvent(PlayerShearEntityEvent event) {
// TODO: Complete trait/plugin system
if (CitizensAPI.getNPCManager().isNPC(event.getEntity()))
event.setCancelled(true);
}
@Override
public String toString() {
return "Sheared{" + sheared + "}";
}
}

View File

@ -0,0 +1,59 @@
package net.citizensnpcs.trait;
import org.bukkit.DyeColor;
import org.bukkit.entity.Sheep;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.SheepDyeWoolEvent;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.exception.NPCLoadException;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.util.DataKey;
public class WoolColor extends Trait implements Listener {
private DyeColor color = DyeColor.WHITE;
private final NPC npc;
public WoolColor(NPC npc) {
this.npc = npc;
}
@Override
public void load(DataKey key) throws NPCLoadException {
try {
color = DyeColor.valueOf(key.getString(""));
} catch (Exception ex) {
color = DyeColor.WHITE;
}
}
@Override
public void onNPCSpawn() {
if (npc.getBukkitEntity() instanceof Sheep)
((Sheep) npc.getBukkitEntity()).setColor(color);
}
@Override
public void save(DataKey key) {
key.setString("", color.name());
}
@EventHandler
public void onSheepDyeWool(SheepDyeWoolEvent event) {
// TODO: Complete trait/plugin system
if (CitizensAPI.getNPCManager().isNPC(event.getEntity()))
event.setCancelled(true);
}
public void setColor(DyeColor color) {
this.color = color;
((Sheep) npc.getBukkitEntity()).setColor(color);
}
@Override
public String toString() {
return "WoolColor{" + color.name() + "}";
}
}

View File

@ -71,10 +71,6 @@ public class StringHelper {
return ChatColor.YELLOW + string.toString() + ChatColor.GREEN; return ChatColor.YELLOW + string.toString() + ChatColor.GREEN;
} }
public static String wrap(Object string, ChatColor after) {
return ChatColor.YELLOW + string.toString() + after;
}
public static String wrapHeader(Object string) { public static String wrapHeader(Object string) {
return "<a>=====[ " + string.toString() + "<a> ]====="; return "<a>=====[ " + string.toString() + "<a> ]=====";
} }