This commit is contained in:
fullwall 2012-01-29 19:43:27 +08:00
parent dcbabe9ee1
commit ed6a05e7c4
5 changed files with 27 additions and 60 deletions

View File

@ -166,45 +166,28 @@ public class Citizens extends JavaPlugin {
}
}
public static Storage getNPCStorage() {
return saves;
}
private void saveNPCs() {
for (NPC npc : npcManager)
npc.save(getNPCStorage().getKey("npc." + npc.getId()));
getNPCStorage().save();
npc.save(saves.getKey("npc." + npc.getId()));
saves.save();
}
private void setupNPCs() throws NPCLoadException {
traitManager.register("location", SpawnLocation.class);
traitManager.register("owner", Owner.class);
for (DataKey key : getNPCStorage().getKey("npc").getIntegerSubKeys()) {
int created = 0, spawned = 0;
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.getInstance(key.getString("character"), null);
NPC npc = npcManager.createNPC(id, key.getString("name"), character);
// Load the character if it exists, otherwise remove the character
if (character != null)
character.load(key.getRelative("characters." + character.getName()));
// Load traits
for (DataKey traitKey : key.getSubKeys()) {
Trait trait = traitManager.getInstance(traitKey.name(), npc);
if (trait == null)
continue;
trait.load(traitKey);
npc.addTrait(trait);
}
// Spawn the NPC
if (key.getBoolean("spawned"))
npc.spawn(npc.getTrait(SpawnLocation.class).getLocation());
NPC npc = npcManager.createNPC(id, key.getString("name"), null);
npc.load(key);
++created;
if (npc.isSpawned())
++spawned;
}
Messaging.log("Loaded " + npcManager.size() + " NPCs");
Messaging.log("Loaded " + created + " NPCs (" + spawned + " spawned)");
}
private void registerPermissions() {

View File

@ -1,6 +1,5 @@
package net.citizensnpcs.npc;
import net.citizensnpcs.api.DataKey;
import net.citizensnpcs.api.event.NPCDespawnEvent;
import net.citizensnpcs.api.event.NPCSpawnEvent;
import net.citizensnpcs.api.npc.AbstractNPC;
@ -12,7 +11,7 @@ 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;
@ -40,8 +39,8 @@ public class CitizensNPC extends AbstractNPC {
}
@Override
public Entity getBukkitEntity() {
return getHandle().getBukkitEntity();
public Player getBukkitEntity() {
return getHandle().getPlayer();
}
public CraftNPC getHandle() {
@ -85,8 +84,4 @@ public class CitizensNPC extends AbstractNPC {
spawned = true;
return true;
}
@Override
public void load(DataKey root) {
}
}

View File

@ -2,14 +2,9 @@ package net.citizensnpcs.npc;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.NPCManager;
import net.citizensnpcs.api.npc.trait.Character;
@ -32,10 +27,14 @@ import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.SetMultimap;
public class CitizensNPCManager implements NPCManager {
// TODO: merge spawned and byID
private final ByIdArray<NPC> spawned = new ByIdArray<NPC>();
private final ByIdArray<NPC> byID = new ByIdArray<NPC>();
private final Map<Integer, Set<String>> selected = new ConcurrentHashMap<Integer, Set<String>>();
private final SetMultimap<Integer, String> selected = HashMultimap.create();
private final Storage saves;
public CitizensNPCManager(Storage saves) {
@ -53,6 +52,8 @@ public class CitizensNPCManager implements NPCManager {
}
public NPC createNPC(int id, String name, Character character) {
if (byID.contains(id))
throw new IllegalArgumentException("id already taken");
CitizensNPC npc = new CitizensNPC(this, id, name);
npc.setCharacter(character);
byID.put(npc.getId(), npc);
@ -64,12 +65,10 @@ public class CitizensNPCManager implements NPCManager {
Location loc = npc.getBukkitEntity().getLocation();
npc.getTrait(SpawnLocation.class).setLocation(loc);
if (selected.get(npc.getId()) != null)
selected.get(npc.getId()).clear();
selected.removeAll(npc.getId());
spawned.remove(mcEntity.getPlayer().getEntityId());
for (Player player : Bukkit.getOnlinePlayers())
((CraftPlayer) player).getHandle().netServerHandler.sendPacket(new Packet29DestroyEntity(mcEntity.id));
getWorldServer(loc.getWorld()).removeEntity(mcEntity);
mcEntity.die();
}
@ -96,9 +95,9 @@ public class CitizensNPCManager implements NPCManager {
public Collection<NPC> getNPCs(Class<? extends Character> character) {
List<NPC> npcs = new ArrayList<NPC>();
for (NPC npc : this) {
if (npc.getCharacter() != null
&& CitizensAPI.getCharacterManager().getInstance(npc.getCharacter().getName(), npc) != null)
if (npc.getCharacter() != null && npc.getCharacter().getClass().equals(character)) {
npcs.add(npc);
}
}
return npcs;
}
@ -120,11 +119,11 @@ public class CitizensNPCManager implements NPCManager {
}
public void remove(NPC npc) {
if (spawned.contains(((CitizensNPC) npc).getHandle().getPlayer().getEntityId()))
if (spawned.contains(npc.getBukkitEntity().getEntityId()))
despawn(npc);
byID.remove(npc.getId());
saves.getKey("npc").removeKey("" + npc.getId());
selected.remove(npc.getId());
selected.removeAll(npc.getId());
}
public CraftNPC spawn(NPC npc, Location loc) {
@ -145,12 +144,7 @@ public class CitizensNPCManager implements NPCManager {
NPC select = getSelectedNPC(player);
if (select != null)
selected.get(select.getId()).remove(player.getName());
Set<String> selectors = selected.get(npc.getId());
if (selectors == null)
selectors = new HashSet<String>();
selectors.add(player.getName());
selected.put(npc.getId(), selectors);
selected.put(npc.getId(), player.getName());
}
public boolean npcIsSelectedByPlayer(Player player, NPC npc) {
@ -166,8 +160,4 @@ public class CitizensNPCManager implements NPCManager {
}
return null;
}
public int size() {
return byID.size();
}
}

View File

@ -8,7 +8,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Entity;
public class CitizensNavigator implements Navigator {
private CitizensNPC npc;
private final CitizensNPC npc;
public CitizensNavigator(CitizensNPC npc) {
this.npc = npc;

View File

@ -18,7 +18,6 @@ import org.bukkit.entity.Entity;
@SuppressWarnings("unchecked")
public class CraftNPC extends EntityPlayer {
public CraftNPC(MinecraftServer minecraftServer, World world, String string, ItemInWorldManager itemInWorldManager) {
super(minecraftServer, world, string, itemInWorldManager);
itemInWorldManager.setGameMode(0);