diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index 0ce71cfab..c98b32c78 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 761a4278f..aeb239279 100644 --- a/src/net/citizensnpcs/Citizens.java +++ b/src/net/citizensnpcs/Citizens.java @@ -11,6 +11,7 @@ import net.citizensnpcs.api.npc.trait.Trait; import net.citizensnpcs.api.npc.trait.trait.LocationTrait; import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.npc.trait.CitizensCharacterManager; +import net.citizensnpcs.npc.trait.CitizensTraitManager; import net.citizensnpcs.storage.Storage; import net.citizensnpcs.storage.flatfile.YamlStorage; import net.citizensnpcs.util.Messaging; @@ -24,6 +25,7 @@ import org.bukkit.plugin.java.JavaPlugin; public class Citizens extends JavaPlugin { private CitizensNPCManager npcManager; private CitizensCharacterManager characterManager; + private CitizensTraitManager traitManager; private Storage saves; @Override @@ -33,10 +35,13 @@ public class Citizens extends JavaPlugin { @Override public void onEnable() { + // Register API managers npcManager = new CitizensNPCManager(); characterManager = new CitizensCharacterManager(); + traitManager = new CitizensTraitManager(); CitizensAPI.setNPCManager(npcManager); CitizensAPI.setCharacterManager(characterManager); + CitizensAPI.setTraitManager(traitManager); // TODO database support saves = new YamlStorage(getDataFolder() + File.separator + "saves.yml"); @@ -54,10 +59,10 @@ public class Citizens extends JavaPlugin { try { setupNPCs(); } catch (NPCLoadException ex) { - ex.printStackTrace(); + Messaging.log("Failed to create NPC: " + ex.getMessage()); } } - }, /* TODO how long should delay be? */100) == -1) { + }) == -1) { Messaging.log("Issue enabling plugin. Disabling."); getServer().getPluginManager().disablePlugin(this); } @@ -68,24 +73,42 @@ public class Citizens extends JavaPlugin { if (args[0].equals("test")) { NPC npc = npcManager.createNPC("aPunch"); npc.spawn(((Player) sender).getLocation()); + } else if (args[0].equals("testremove")) { + for(NPC npc : npcManager.getNPCs()) { + npc.despawn(); + } } return true; } private void setupNPCs() throws NPCLoadException { // TODO needs fixing + traitManager.registerTrait(LocationTrait.class); for (DataKey key : saves.getKey("npc").getIntegerSubKeys()) { int id = Integer.parseInt(key.name()); if (!key.keyExists("name")) throw new NPCLoadException("Could not find a name for the NPC with ID '" + id + "'."); Character character = characterManager.getCharacter(key.getString("character")); NPC npc = npcManager.createNPC(key.getString("name"), character); + + // Load the character if it exists if (character != null) { character.load(key); } + + // Load traits + for (DataKey traitKey : key.getSubKeys()) { + for (Trait trait : traitManager.getRegisteredTraits()) { + if (trait.getName().equals(traitKey.name())) { + Messaging.debug("Found trait '" + trait.getName() + "' in the NPC with ID '" + id + "'."); + npc.addTrait(trait.getClass()); + } + } + } for (Trait trait : npc.getTraits()) { trait.load(key); } + // Spawn the NPC npc.spawn(npc.getTrait(LocationTrait.class).getLocation()); } Messaging.log("Loaded " + npcManager.getNPCs().size() + " NPCs."); diff --git a/src/net/citizensnpcs/npc/CitizensNPC.java b/src/net/citizensnpcs/npc/CitizensNPC.java index edb5f2cf7..c2b4c4bcd 100644 --- a/src/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/net/citizensnpcs/npc/CitizensNPC.java @@ -139,9 +139,12 @@ public class CitizensNPC implements NPC { return; } - spawned = true; + if (mcEntity == null) + mcEntity = manager.spawn(this, loc); + else + manager.spawn(this, loc); getTrait(LocationTrait.class).setLocation(loc); - mcEntity = manager.spawn(this, loc); + spawned = true; } @Override @@ -153,9 +156,9 @@ public class CitizensNPC implements NPC { Bukkit.getPluginManager().callEvent(new NPCDespawnEvent(this)); - spawned = false; mcEntity.die(); manager.despawn(this); + spawned = false; } @Override @@ -174,8 +177,7 @@ public class CitizensNPC implements NPC { public T create(Class clazz) { try { - Trait trait = clazz.newInstance(); - return clazz.cast(trait); + return clazz.cast(clazz.newInstance()); } catch (Exception ex) { ex.printStackTrace(); return null; diff --git a/src/net/citizensnpcs/npc/CitizensNPCManager.java b/src/net/citizensnpcs/npc/CitizensNPCManager.java index 5a1e6b346..30012fe00 100644 --- a/src/net/citizensnpcs/npc/CitizensNPCManager.java +++ b/src/net/citizensnpcs/npc/CitizensNPCManager.java @@ -6,12 +6,15 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPCManager; @@ -22,6 +25,7 @@ import net.citizensnpcs.resources.lib.CraftNPC; import net.minecraft.server.ItemInWorldManager; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.Packet29DestroyEntity; import net.minecraft.server.WorldServer; public class CitizensNPCManager implements NPCManager { @@ -94,7 +98,9 @@ public class CitizensNPCManager implements NPCManager { public void despawn(NPC npc) { CraftNPC mcEntity = ((CitizensNPC) npc).getHandle(); - // TODO send Packet29DestroyEntity + for (Player player : Bukkit.getOnlinePlayers()) { + ((CraftPlayer) player).getHandle().netServerHandler.sendPacket(new Packet29DestroyEntity(mcEntity.id)); + } getWorldServer(npc.getTrait(LocationTrait.class).getLocation().getWorld()).removeEntity(mcEntity); spawned.remove(mcEntity.getPlayer()); } diff --git a/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java b/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java index 7cabea042..512a6198d 100644 --- a/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java +++ b/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java @@ -1,5 +1,6 @@ package net.citizensnpcs.npc.trait; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -38,4 +39,9 @@ public class CitizensCharacterManager implements CharacterManager { 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 new file mode 100644 index 000000000..a4e5a684a --- /dev/null +++ b/src/net/citizensnpcs/npc/trait/CitizensTraitManager.java @@ -0,0 +1,47 @@ +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.npc.trait.Trait; +import net.citizensnpcs.api.npc.trait.TraitManager; + +public class CitizensTraitManager implements TraitManager { + private final Map> registered = new HashMap>(); + private final Set traits = new HashSet(); + + @Override + public Trait getTrait(String name) { + if (registered.get(name) == null) { + return null; + } + for (Trait trait : traits) { + if (trait.getName().equals(name)) { + return trait; + } + } + return null; + } + + @Override + public void registerTrait(Class trait) { + if (registered.containsValue(trait)) { + return; + } + try { + Trait register = trait.newInstance(); + registered.put(register.getName(), trait); + traits.add(register); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @Override + public Collection getRegisteredTraits() { + return traits; + } +} \ No newline at end of file diff --git a/src/net/citizensnpcs/storage/flatfile/YamlStorage.java b/src/net/citizensnpcs/storage/flatfile/YamlStorage.java index 2a8ba9127..5cd8bcce8 100644 --- a/src/net/citizensnpcs/storage/flatfile/YamlStorage.java +++ b/src/net/citizensnpcs/storage/flatfile/YamlStorage.java @@ -173,11 +173,7 @@ public class YamlStorage implements Storage { @Override public String getString(String key) { - String path = getKeyExt(key); - if (keyExists(path)) { - return config.get(path).toString(); - } - return ""; + return config.getString(getKeyExt(key)); } @Override