diff --git a/TODO b/TODO index 73f9bb292..805271afd 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ -Citizens2 TODO List- +-Add proper color parsing for names (separate it into a trait?) -Properly implement commands -Finish saving -Finish pathfinding API diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index 3e3dc919c..c994d6a76 100644 Binary files a/lib/CitizensAPI.jar and b/lib/CitizensAPI.jar differ diff --git a/src/net/citizensnpcs/Citizens.java b/src/net/citizensnpcs/Citizens.java index 79b9ae171..294050039 100644 --- a/src/net/citizensnpcs/Citizens.java +++ b/src/net/citizensnpcs/Citizens.java @@ -9,6 +9,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.Character; import net.citizensnpcs.api.npc.trait.Trait; import net.citizensnpcs.api.npc.trait.trait.SpawnLocation; +import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.npc.trait.CitizensCharacterManager; import net.citizensnpcs.npc.trait.CitizensTraitManager; @@ -18,6 +19,7 @@ import net.citizensnpcs.util.ByIdArray; import net.citizensnpcs.util.Messaging; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -80,7 +82,7 @@ public class Citizens extends JavaPlugin { @Override public boolean onCommand(CommandSender sender, Command cmd, String cmdName, String[] args) { if (args[0].equals("spawn")) { - NPC npc = npcManager.createNPC("aPunch"); + NPC npc = npcManager.createNPC(ChatColor.GREEN + "aPunch"); npc.spawn(((Player) sender).getLocation()); } else if (args[0].equals("despawn")) { for (NPC npc : npcManager.getSpawnedNPCs()) @@ -89,9 +91,10 @@ public class Citizens extends JavaPlugin { return true; } - // TODO possibly separate this out some more + // TODO separate this out some more private void setupNPCs() throws NPCLoadException { traitManager.registerTrait("location", SpawnLocation.class); + for (DataKey key : saves.getKey("npc").getIntegerSubKeys()) { int id = Integer.parseInt(key.name()); if (!key.keyExists("name")) @@ -131,7 +134,8 @@ public class Citizens extends JavaPlugin { for (NPC npc : npcManager.getAllNPCs()) { DataKey root = saves.getKey("npc." + npc.getId()); root.setString("name", npc.getFullName()); - root.setBoolean("spawned", !npc.getBukkitEntity().isDead()); + if (root.getBoolean("spawned")) + root.setBoolean("spawned", !npc.getBukkitEntity().isDead()); // Save the character if it exists if (npc.getCharacter() != null) { @@ -140,7 +144,7 @@ public class Citizens extends JavaPlugin { } // Save all existing traits - for (Trait trait : npc.getTraits()) + for (Trait trait : ((CitizensNPC) npc).getTraits()) trait.save(root.getRelative(trait.getName())); } saves.save(); diff --git a/src/net/citizensnpcs/npc/CitizensNPC.java b/src/net/citizensnpcs/npc/CitizensNPC.java index 4c8700305..9b396fb56 100644 --- a/src/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/net/citizensnpcs/npc/CitizensNPC.java @@ -87,11 +87,6 @@ public class CitizensNPC implements NPC { return t != null ? clazz.cast(t) : null; } - @Override - public Iterable getTraits() { - return traits.values(); - } - @Override public boolean hasTrait(Class trait) { return traits.containsKey(trait); @@ -153,7 +148,8 @@ public class CitizensNPC implements NPC { Bukkit.getPluginManager().callEvent(new NPCDespawnEvent(this)); manager.despawn(this); - mcEntity.die(); + getHandle().die(); + spawned = false; } @@ -166,7 +162,11 @@ public class CitizensNPC implements NPC { @Override public Entity getBukkitEntity() { - return mcEntity.getBukkitEntity(); + return getHandle().getBukkitEntity(); + } + + public Iterable getTraits() { + return traits.values(); } public CraftNPC getHandle() { diff --git a/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java b/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java index 512a6198d..a5f1f99d4 100644 --- a/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java +++ b/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java @@ -1,47 +1,49 @@ package net.citizensnpcs.npc.trait; -import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; +import net.citizensnpcs.api.Factory; import net.citizensnpcs.api.npc.trait.Character; import net.citizensnpcs.api.npc.trait.CharacterManager; public class CitizensCharacterManager implements CharacterManager { - private final Map> registered = new HashMap>(); - private final Set characters = new HashSet(); + private final Map> registered = new HashMap>(); @Override public Character getCharacter(String name) { - if (registered.get(name) == null) { + if (registered.get(name) == null) return null; + return registered.get(name).create(); + } + + @Override + public void registerCharacter(String name, Class clazz) { + registerCharacterWithFactory(name, new DefaultCharacterFactory(clazz)); + } + + @Override + public void registerCharacterWithFactory(String name, Factory factory) { + if (registered.get(name) != null) + throw new IllegalArgumentException("A character factory for the character '" + name + + "' has already been registered."); + registered.put(name, factory); + } + + private static class DefaultCharacterFactory implements Factory { + private final Class clazz; + + private DefaultCharacterFactory(Class clazz) { + this.clazz = clazz; } - for (Character character : characters) { - if (character.getName().equals(name)) { - return character; + + @Override + public Character create() { + try { + return clazz.newInstance(); + } catch (Exception ex) { + return null; } } - return null; - } - - @Override - public void registerCharacter(Class character) { - if (registered.containsValue(character)) { - return; - } - try { - Character register = character.newInstance(); - registered.put(register.getName(), character); - characters.add(register); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - @Override - public Collection getRegisteredCharacters() { - return characters; } } \ No newline at end of file diff --git a/src/net/citizensnpcs/npc/trait/CitizensTraitManager.java b/src/net/citizensnpcs/npc/trait/CitizensTraitManager.java index 9b3d11f6b..1f623bf2b 100644 --- a/src/net/citizensnpcs/npc/trait/CitizensTraitManager.java +++ b/src/net/citizensnpcs/npc/trait/CitizensTraitManager.java @@ -1,15 +1,14 @@ package net.citizensnpcs.npc.trait; +import java.util.HashMap; import java.util.Map; import net.citizensnpcs.api.Factory; import net.citizensnpcs.api.npc.trait.Trait; import net.citizensnpcs.api.npc.trait.TraitManager; -import com.google.common.collect.Maps; - public class CitizensTraitManager implements TraitManager { - private final Map> registered = Maps.newHashMap(); + private final Map> registered = new HashMap>(); @Override public Trait getTrait(String name) { @@ -20,20 +19,21 @@ public class CitizensTraitManager implements TraitManager { @Override public void registerTrait(String name, Class clazz) { - registerTraitWithFactory(name, new ReflectionFactory(clazz)); + registerTraitWithFactory(name, new DefaultTraitFactory(clazz)); } @Override public void registerTraitWithFactory(String name, Factory factory) { if (registered.get(name) != null) - throw new IllegalArgumentException("Trait factory already registered."); + throw new IllegalArgumentException("A trait factory for the trait '" + name + + "' has already been registered."); registered.put(name, factory); } - private static class ReflectionFactory implements Factory { + private static class DefaultTraitFactory implements Factory { private final Class clazz; - private ReflectionFactory(Class clazz) { + private DefaultTraitFactory(Class clazz) { this.clazz = clazz; }