From 51e0313cb6f4a6edc08fea0ae1937f20ea0b9fb3 Mon Sep 17 00:00:00 2001 From: aPunch Date: Thu, 19 Jan 2012 04:52:58 -0600 Subject: [PATCH] refactor a bit --- lib/CitizensAPI.jar | Bin 11890 -> 14279 bytes plugin.yml | 5 +- src/net/citizensnpcs/Citizens.java | 55 +++++++++-- src/net/citizensnpcs/EventListen.java | 10 +- src/net/citizensnpcs/npc/CitizensNPC.java | 93 ++++++++++-------- .../citizensnpcs/npc/CitizensNPCManager.java | 25 +---- .../npc/trait/CitizensCharacterManager.java | 41 ++++++++ 7 files changed, 155 insertions(+), 74 deletions(-) create mode 100644 src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index e2b700f3e87f9e2d43d643fef1b0913d765cf8ab..0ce71cfabc94b0ea2f5d0313a528b6e9f531cf41 100644 GIT binary patch delta 6263 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 delta 4230 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 diff --git a/plugin.yml b/plugin.yml index 57a83cb3b..bcf5a9e2c 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,4 +1,7 @@ name: Citizens authors: [aPunch, fullwall] version: 2.0 -main: net.citizensnpcs.Citizens \ No newline at end of file +main: net.citizensnpcs.Citizens +commands: + npc: + description: Basic commands for all NPC-related things \ No newline at end of file diff --git a/src/net/citizensnpcs/Citizens.java b/src/net/citizensnpcs/Citizens.java index 46b6bb2bf..df7e08f7e 100644 --- a/src/net/citizensnpcs/Citizens.java +++ b/src/net/citizensnpcs/Citizens.java @@ -1,16 +1,30 @@ package net.citizensnpcs; +import java.io.File; + import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.DataKey; +import net.citizensnpcs.api.exception.NPCLoadException; 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.LocationTrait; import net.citizensnpcs.npc.CitizensNPCManager; +import net.citizensnpcs.npc.trait.CitizensCharacterManager; +import net.citizensnpcs.storage.Storage; +import net.citizensnpcs.storage.flatfile.YamlStorage; import net.citizensnpcs.util.Messaging; import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; public class Citizens extends JavaPlugin { private CitizensNPCManager npcManager; + private CitizensCharacterManager characterManager; + private Storage saves; @Override public void onDisable() { @@ -20,7 +34,12 @@ public class Citizens extends JavaPlugin { @Override public void onEnable() { npcManager = new CitizensNPCManager(); + characterManager = new CitizensCharacterManager(); CitizensAPI.setNPCManager(npcManager); + CitizensAPI.setCharacterManager(characterManager); + + // TODO database support + saves = new YamlStorage(getDataFolder() + File.separator + "saves.yml"); // Register events new EventListen(this); @@ -32,18 +51,42 @@ public class Citizens extends JavaPlugin { if (Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { @Override public void run() { - setupNPCs(); + try { + setupNPCs(); + } catch (NPCLoadException ex) { + ex.printStackTrace(); + } } - }, 100) == -1) { + }, /* TODO how long should delay be? */100) == -1) { Messaging.log("Issue enabling plugin. Disabling."); getServer().getPluginManager().disablePlugin(this); } } - private void setupNPCs() { - // TODO set up saving - for (NPC npc : npcManager.getNPCs()) { - npc.spawn(((LocationTrait) npc.getTrait("location")).getLocation()); + @Override + public boolean onCommand(CommandSender sender, Command cmd, String cmdName, String[] args) { + if (args[0].equals("test")) { + NPC npc = npcManager.createNPC("aPunch"); + npc.spawn(((Player) sender).getLocation()); + } + return true; + } + + private void setupNPCs() throws NPCLoadException { + // TODO needs fixing + 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); + if (character != null) { + character.load(key); + } + for (Trait t : npc.getTraits()) { + t.load(key); + } + npc.spawn(npc.getTrait(LocationTrait.class).getLocation()); } Messaging.log("Loaded " + npcManager.getNPCs().size() + " NPCs."); } diff --git a/src/net/citizensnpcs/EventListen.java b/src/net/citizensnpcs/EventListen.java index 4a7638c73..5f846f955 100644 --- a/src/net/citizensnpcs/EventListen.java +++ b/src/net/citizensnpcs/EventListen.java @@ -7,6 +7,7 @@ import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.trait.LocationTrait; +import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -57,7 +58,7 @@ public class EventListen implements Listener { public void onChunkLoad(ChunkLoadEvent event) { for (int id : toRespawn) { NPC npc = CitizensAPI.getNPCManager().getNPC(id); - npc.spawn(((LocationTrait) npc.getTrait("location")).getLocation()); + npc.spawn(npc.getTrait(LocationTrait.class).getLocation()); toRespawn.remove(id); } } @@ -68,10 +69,9 @@ public class EventListen implements Listener { return; for (NPC npc : CitizensAPI.getNPCManager().getNPCs()) { - LocationTrait loc = (LocationTrait) npc.getTrait("location"); - if (event.getWorld().equals(loc.getLocation().getWorld()) - && event.getChunk().getX() == loc.getLocation().getChunk().getX() - && event.getChunk().getZ() == loc.getLocation().getChunk().getZ()) { + Location loc = npc.getTrait(LocationTrait.class).getLocation(); + if (event.getWorld().equals(loc.getWorld()) && event.getChunk().getX() == loc.getChunk().getX() + && event.getChunk().getZ() == loc.getChunk().getZ()) { toRespawn.add(npc.getId()); npc.despawn(); } diff --git a/src/net/citizensnpcs/npc/CitizensNPC.java b/src/net/citizensnpcs/npc/CitizensNPC.java index 40b74e46d..eefc7040a 100644 --- a/src/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/net/citizensnpcs/npc/CitizensNPC.java @@ -1,7 +1,7 @@ package net.citizensnpcs.npc; -import java.util.HashSet; -import java.util.Set; +import java.util.HashMap; +import java.util.Map; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.event.NPCDespawnEvent; @@ -12,6 +12,7 @@ import net.citizensnpcs.api.npc.pathfinding.Navigator; import net.citizensnpcs.api.npc.trait.Trait; import net.citizensnpcs.api.npc.trait.trait.LocationTrait; import net.citizensnpcs.resources.lib.CraftNPC; +import net.citizensnpcs.util.Messaging; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -20,22 +21,27 @@ import org.bukkit.Location; public class CitizensNPC implements NPC { private final int id; private Character character = null; - private final Set traits = new HashSet(); + private final Map, Trait> traits = new HashMap, Trait>(); private String name; private CraftNPC mcEntity; private boolean spawned; private final CitizensNPCManager manager; + private final Factory factory = new Factory(); - protected CitizensNPC(String name, Character character, Trait... traits) { + public CitizensNPC(String name, Character character) { this.name = name; this.character = character; - for (Trait trait : traits) { - this.traits.add(trait); - } manager = (CitizensNPCManager) CitizensAPI.getNPCManager(); id = manager.getUniqueID(); } + public CitizensNPC(int id, String name, Character character) { + this.name = name; + this.character = character; + manager = (CitizensNPCManager) CitizensAPI.getNPCManager(); + this.id = id; + } + @Override public String getFullName() { return name; @@ -52,16 +58,11 @@ public class CitizensNPC implements NPC { } @Override - public void addTrait(Trait trait) { + public void addTrait(Class trait) { if (!hasTrait(trait)) - traits.add(trait); + traits.put(trait, factory.create(trait)); else - System.out.println("The NPC already has the trait '" + trait.getName() + "'."); - } - - @Override - public void addTrait(String name) { - addTrait(getTrait(name)); + Messaging.debug("The NPC already has the trait '" + trait.getName() + "'."); } @Override @@ -81,48 +82,40 @@ public class CitizensNPC implements NPC { } @Override - public Trait getTrait(String name) { - for (Trait trait : traits) { - if (trait.getName().equals(name)) { - return trait; - } + public T getTrait(Class trait) { + Trait t = traits.get(trait); + if (t != null) { + return trait.cast(t); } - return null; + + T create = factory.create(trait); + addTrait(trait); + return create; } @Override public Iterable getTraits() { - return traits; + return traits.values(); } @Override - public boolean hasTrait(Trait trait) { - return traits.contains(trait); + public boolean hasTrait(Class trait) { + return traits.containsKey(trait); } @Override - public boolean hasTrait(String name) { - return hasTrait(getTrait(name)); - } - - @Override - public void removeTrait(Trait trait) { + public void removeTrait(Class trait) { if (!hasTrait(trait)) { - System.out.println("The NPC does not have a trait with the name of '" + trait.getName() + "."); + Messaging.debug("The NPC does not have a trait with the name of '" + trait.getName() + "."); return; } traits.remove(trait); } - @Override - public void removeTrait(String name) { - removeTrait(getTrait(name)); - } - @Override public void setCharacter(Character character) { if (this.character.equals(character)) { - System.out.println("The NPC already has the character '" + character.getName() + "'."); + Messaging.debug("The NPC already has the character '" + character.getName() + "'."); return; } this.character = character; @@ -135,7 +128,7 @@ public class CitizensNPC implements NPC { @Override public void spawn(Location loc) { - if (spawned) { + if (isSpawned()) { System.out.println("The NPC is already spawned."); return; } @@ -147,13 +140,13 @@ public class CitizensNPC implements NPC { } spawned = true; - addTrait(new LocationTrait(loc)); + getTrait(LocationTrait.class).setLocation(loc); mcEntity = manager.spawn(this, loc); } @Override public void despawn() { - if (!spawned) { + if (!isSpawned()) { System.out.println("The NPC is already despawned."); return; } @@ -167,7 +160,7 @@ public class CitizensNPC implements NPC { @Override public void remove() { - if (spawned) { + if (isSpawned()) { despawn(); } manager.remove(this); @@ -176,4 +169,22 @@ public class CitizensNPC implements NPC { public CraftNPC getHandle() { return mcEntity; } + + private class Factory { + private final Map, Trait> created = new HashMap, Trait>(); + + public T create(Class clazz) { + if (created.containsKey(clazz)) { + return clazz.cast(created.get(clazz)); + } + try { + Trait trait = clazz.newInstance(); + created.put(clazz, trait); + return clazz.cast(trait); + } catch (Exception ex) { + ex.printStackTrace(); + return null; + } + } + } } \ No newline at end of file diff --git a/src/net/citizensnpcs/npc/CitizensNPCManager.java b/src/net/citizensnpcs/npc/CitizensNPCManager.java index e8279cbe5..af804b80b 100644 --- a/src/net/citizensnpcs/npc/CitizensNPCManager.java +++ b/src/net/citizensnpcs/npc/CitizensNPCManager.java @@ -35,12 +35,7 @@ public class CitizensNPCManager implements NPCManager { @Override public NPC createNPC(String name, Character character) { - return createNPC(name, character); - } - - @Override - public NPC createNPC(String name, Character character, Trait... traits) { - CitizensNPC npc = new CitizensNPC(name, character, traits); + CitizensNPC npc = new CitizensNPC(name, character); byID.put(npc.getId(), npc); return npc; } @@ -61,23 +56,11 @@ public class CitizensNPCManager implements NPCManager { } @Override - public Collection getNPCs(Trait trait) { + public Collection getNPCs(Class trait) { Set npcs = new HashSet(); for (NPC npc : spawned.values()) { - if (npc.hasTrait(trait)) { + if (npc.hasTrait(trait)) npcs.add(npc); - } - } - return npcs; - } - - @Override - public Collection getNPCs(String name) { - Set npcs = new HashSet(); - for (NPC npc : spawned.values()) { - if (npc.hasTrait(name)) { - npcs.add(npc); - } } return npcs; } @@ -112,7 +95,7 @@ public class CitizensNPCManager implements NPCManager { public void despawn(NPC npc) { CraftNPC mcEntity = ((CitizensNPC) npc).getHandle(); // TODO send Packet29DestroyEntity - getWorldServer(((LocationTrait) npc.getTrait("location")).getLocation().getWorld()).removeEntity(mcEntity); + 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 new file mode 100644 index 000000000..30fa440d6 --- /dev/null +++ b/src/net/citizensnpcs/npc/trait/CitizensCharacterManager.java @@ -0,0 +1,41 @@ +package net.citizensnpcs.npc.trait; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +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(); + + @Override + public Character getCharacter(String name) { + if (registered.get(name) == null) { + return null; + } + for (Character character : characters) { + if (character.getName().equals(name)) { + return character; + } + } + 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(); + } + } +} \ No newline at end of file