From 55c1dc7be0ea5f96bc473c528d852487d477572f Mon Sep 17 00:00:00 2001 From: fullwall Date: Sat, 28 Jan 2012 12:11:23 +0800 Subject: [PATCH] Changes --- lib/CitizensAPI.jar | Bin 18410 -> 18349 bytes src/net/citizensnpcs/Citizens.java | 18 ++++----- src/net/citizensnpcs/EventListen.java | 4 +- src/net/citizensnpcs/Settings.java | 3 +- .../command/command/NPCCommands.java | 37 ++++++------------ src/net/citizensnpcs/npc/CitizensNPC.java | 32 +-------------- .../citizensnpcs/npc/CitizensNPCManager.java | 14 ++++--- src/net/citizensnpcs/util/ByIdArray.java | 8 +++- 8 files changed, 37 insertions(+), 79 deletions(-) diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index 089f0383ee6e2edd65f7d7b05e02432d7563d2a4..9e4c3083c18fc0db39df4676a2323d0d4540147d 100644 GIT binary patch literal 18349 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 B{&WBU literal 18410 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 characterManager = new DefaultInstanceFactory(); private final InstanceFactory traitManager = new DefaultInstanceFactory(); private CommandManager cmdManager; @@ -117,9 +115,8 @@ public class Citizens extends JavaPlugin { // Save and despawn all NPCs config.save(); saveNPCs(); - for (NPC npc : npcManager.getAllNPCs()) + for (NPC npc : npcManager) npc.despawn(); - Bukkit.getScheduler().cancelTasks(this); Messaging.log("v" + getDescription().getVersion() + " disabled."); @@ -174,8 +171,8 @@ public class Citizens extends JavaPlugin { } private void saveNPCs() { - for (NPC npc : npcManager.getAllNPCs()) - ((CitizensNPC) npc).save(); + for (NPC npc : npcManager) + npc.save(getNPCStorage().getKey("npc." + npc.getId())); getNPCStorage().save(); } @@ -187,7 +184,7 @@ public class Citizens extends JavaPlugin { 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.getInstance(key.getString("character")); + Character character = characterManager.getInstance(key.getString("character"), null); NPC npc = npcManager.createNPC(id, key.getString("name"), character); // Load the character if it exists, otherwise remove the character @@ -203,7 +200,7 @@ public class Citizens extends JavaPlugin { // Load traits for (DataKey traitKey : key.getSubKeys()) { - Trait trait = traitManager.getInstance(traitKey.name()); + Trait trait = traitManager.getInstance(traitKey.name(), npc); if (trait == null) continue; trait.load(traitKey); @@ -214,8 +211,7 @@ public class Citizens extends JavaPlugin { if (key.getBoolean("spawned")) npc.spawn(npc.getTrait(SpawnLocation.class).getLocation()); } - Messaging.log("Loaded " + ((ByIdArray) npcManager.getAllNPCs()).size() + " NPCs (" - + ((ByIdArray) npcManager.getSpawnedNPCs()).size() + " spawned)."); + Messaging.log("Loaded " + npcManager.size() + " NPCs"); } private void registerPermissions() { diff --git a/src/net/citizensnpcs/EventListen.java b/src/net/citizensnpcs/EventListen.java index baf88691b..90760fbf7 100644 --- a/src/net/citizensnpcs/EventListen.java +++ b/src/net/citizensnpcs/EventListen.java @@ -25,7 +25,7 @@ import org.bukkit.event.world.ChunkUnloadEvent; public class EventListen implements Listener { private final List toRespawn = new ArrayList(); - private final CitizensNPCManager npcManager; + private volatile CitizensNPCManager npcManager; public EventListen(CitizensNPCManager npcManager) { this.npcManager = npcManager; @@ -49,7 +49,7 @@ public class EventListen implements Listener { if (event.isCancelled()) return; - for (NPC npc : npcManager.getAllNPCs()) { + for (NPC npc : npcManager) { Location loc = npc.getBukkitEntity().getLocation(); if (event.getWorld().equals(loc.getWorld()) && event.getChunk().getX() == loc.getChunk().getX() && event.getChunk().getZ() == loc.getChunk().getZ()) { diff --git a/src/net/citizensnpcs/Settings.java b/src/net/citizensnpcs/Settings.java index 086c43ecd..1d429f0bd 100644 --- a/src/net/citizensnpcs/Settings.java +++ b/src/net/citizensnpcs/Settings.java @@ -34,8 +34,7 @@ public class Settings { USE_DATABASE("use-database", false), SELECTION_ITEM("npc.selection.item", 280), SELECTION_MESSAGE("npc.selection.message", "You selected !"), - QUICK_SELECT("npc.selection.quick-select", false), - PRINT_CHAT_TO_CONSOLE("npc.chat.print-to-console", true); + QUICK_SELECT("npc.selection.quick-select", false); private String path; private Object value; diff --git a/src/net/citizensnpcs/command/command/NPCCommands.java b/src/net/citizensnpcs/command/command/NPCCommands.java index dc4440b54..fbbc9b1eb 100644 --- a/src/net/citizensnpcs/command/command/NPCCommands.java +++ b/src/net/citizensnpcs/command/command/NPCCommands.java @@ -1,8 +1,5 @@ package net.citizensnpcs.command.command; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; - import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.Character; import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; @@ -16,6 +13,9 @@ import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.util.Messaging; import net.citizensnpcs.util.StringHelper; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + @Requirements(selected = true, ownership = true) public class NPCCommands { private final CitizensNPCManager npcManager; @@ -26,20 +26,15 @@ public class NPCCommands { this.characterManager = characterManager; } - @Command( - aliases = { "npc" }, - usage = "create [name] (character)", - desc = "Create a new NPC", - modifiers = { "create" }, - min = 2, - max = 3) + @Command(aliases = { "npc" }, usage = "create [name] (character)", desc = "Create a new NPC", + modifiers = { "create" }, min = 2, max = 3) @Permission("npc.create") @Requirements public void createNPC(CommandContext args, Player player, NPC npc) { CitizensNPC create = (CitizensNPC) npcManager.createNPC(args.getString(1)); String msg = ChatColor.GREEN + "You created " + StringHelper.wrap(create.getName()); - if (args.argsLength() == 3 && characterManager.getInstance(args.getString(2)) != null) { - create.setCharacter(characterManager.getInstance(args.getString(2))); + if (args.argsLength() == 3 && characterManager.getInstance(args.getString(2), create) != null) { + create.setCharacter(characterManager.getInstance(args.getString(2), create)); msg += " with the character " + StringHelper.wrap(args.getString(2)); } msg += " at your location."; @@ -53,13 +48,8 @@ public class NPCCommands { Messaging.send(player, msg); } - @Command( - aliases = { "npc" }, - usage = "spawn [id]", - desc = "Spawn an existing NPC", - modifiers = { "spawn" }, - min = 2, - max = 2) + @Command(aliases = { "npc" }, usage = "spawn [id]", desc = "Spawn an existing NPC", modifiers = { "spawn" }, + min = 2, max = 2) @Permission("npc.spawn") @Requirements(ownership = true) public void spawnNPC(CommandContext args, Player player, NPC npc) { @@ -78,13 +68,8 @@ public class NPCCommands { + " is already spawned at another location. Use '/npc tp' to teleport the NPC to your location."); } - @Command( - aliases = { "npc" }, - usage = "despawn", - desc = "Despawn an NPC", - modifiers = { "despawn" }, - min = 1, - max = 1) + @Command(aliases = { "npc" }, usage = "despawn", desc = "Despawn an NPC", modifiers = { "despawn" }, min = 1, + max = 1) @Permission("npc.despawn") public void despawnNPC(CommandContext args, Player player, NPC npc) { npc.despawn(); diff --git a/src/net/citizensnpcs/npc/CitizensNPC.java b/src/net/citizensnpcs/npc/CitizensNPC.java index 4d099fdc1..a80399e08 100644 --- a/src/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/net/citizensnpcs/npc/CitizensNPC.java @@ -1,13 +1,10 @@ package net.citizensnpcs.npc; -import net.citizensnpcs.Citizens; -import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.DataKey; import net.citizensnpcs.api.event.NPCDespawnEvent; import net.citizensnpcs.api.event.NPCSpawnEvent; import net.citizensnpcs.api.npc.AbstractNPC; import net.citizensnpcs.api.npc.ai.Navigator; -import net.citizensnpcs.api.npc.trait.Trait; import net.citizensnpcs.api.npc.trait.trait.SpawnLocation; import net.citizensnpcs.npc.ai.CitizensNavigator; import net.citizensnpcs.resources.lib.CraftNPC; @@ -16,7 +13,6 @@ import net.citizensnpcs.util.Messaging; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; public class CitizensNPC extends AbstractNPC { private CraftNPC mcEntity; @@ -41,7 +37,6 @@ public class CitizensNPC extends AbstractNPC { getHandle().die(); spawned = false; - save(); return true; } @@ -92,35 +87,10 @@ public class CitizensNPC extends AbstractNPC { addTrait(new SpawnLocation(loc)); spawned = true; - save(); return true; } @Override - public void chat(String message) { - String formatted = "<" + getName() + "> " + message; - for (Player player : Bukkit.getOnlinePlayers()) - player.sendMessage(formatted); - if (Setting.PRINT_CHAT_TO_CONSOLE.getBoolean()) - Messaging.log(formatted); - } - - public void save() { - DataKey key = Citizens.getNPCStorage().getKey("npc." + getId()); - key.setString("name", getFullName()); - if (!key.keyExists("spawned")) - key.setBoolean("spawned", true); - if (key.getBoolean("spawned")) - key.setBoolean("spawned", !getBukkitEntity().isDead()); - - // Save the character if it exists - if (getCharacter() != null) { - key.setString("character", getCharacter().getName()); - getCharacter().save(key.getRelative("characters." + getCharacter().getName())); - } - - // Save all existing traits - for (Trait trait : getTraits()) - trait.save(key.getRelative(trait.getName())); + public void load(DataKey root) { } } \ No newline at end of file diff --git a/src/net/citizensnpcs/npc/CitizensNPCManager.java b/src/net/citizensnpcs/npc/CitizensNPCManager.java index ec9410745..05cac0fe7 100644 --- a/src/net/citizensnpcs/npc/CitizensNPCManager.java +++ b/src/net/citizensnpcs/npc/CitizensNPCManager.java @@ -2,6 +2,7 @@ package net.citizensnpcs.npc; import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -16,7 +17,6 @@ import net.citizensnpcs.api.npc.trait.trait.SpawnLocation; import net.citizensnpcs.resources.lib.CraftNPC; import net.citizensnpcs.storage.Storage; import net.citizensnpcs.util.ByIdArray; - import net.minecraft.server.ItemInWorldManager; import net.minecraft.server.MinecraftServer; import net.minecraft.server.Packet29DestroyEntity; @@ -71,8 +71,8 @@ public class CitizensNPCManager implements NPCManager { } @Override - public Iterable getAllNPCs() { - return byID; + public Iterator iterator() { + return byID.iterator(); } private MinecraftServer getMinecraftServer(Server server) { @@ -92,9 +92,9 @@ public class CitizensNPCManager implements NPCManager { @Override public Collection getNPCs(Class character) { List npcs = new ArrayList(); - for (NPC npc : getAllNPCs()) { + for (NPC npc : this) { if (npc.getCharacter() != null - && CitizensAPI.getCharacterManager().getInstance(npc.getCharacter().getName()) != null) + && CitizensAPI.getCharacterManager().getInstance(npc.getCharacter().getName(), npc) != null) npcs.add(npc); } return npcs; @@ -171,4 +171,8 @@ public class CitizensNPCManager implements NPCManager { return null; return getNPC(selected.get(player.getName())); } + + public int size() { + return byID.size(); + } } \ No newline at end of file diff --git a/src/net/citizensnpcs/util/ByIdArray.java b/src/net/citizensnpcs/util/ByIdArray.java index bf9ed4fcc..5c4b478b1 100644 --- a/src/net/citizensnpcs/util/ByIdArray.java +++ b/src/net/citizensnpcs/util/ByIdArray.java @@ -35,7 +35,6 @@ public class ByIdArray implements Iterable { int index = 0; while (elementData[index++] != null) { if (index >= elementData.length) { - System.out.println(elementData.length + " " + index); ensureCapacity(elementData.length + 1); index = elementData.length - 1; } @@ -82,11 +81,13 @@ public class ByIdArray implements Iterable { @Override public Iterator iterator() { return new Iterator() { - private final int expected = ByIdArray.this.modCount; + private int expected = ByIdArray.this.modCount; private int idx = lowest; @Override public boolean hasNext() { + if (ByIdArray.this.modCount != expected) + throw new ConcurrentModificationException(); return highest + 1 > idx && size > 0; } @@ -106,7 +107,10 @@ public class ByIdArray implements Iterable { @Override public void remove() { + if (ByIdArray.this.modCount != expected) + throw new ConcurrentModificationException(); ByIdArray.this.fastRemove(idx); + expected = ByIdArray.this.modCount; } }; }