Possible fix for spawning bugs... TODO implement better

This commit is contained in:
fullwall 2012-09-14 15:21:07 +08:00
parent 1c2181fafc
commit 9d34a6b4f2
5 changed files with 56 additions and 18 deletions

View File

@ -210,17 +210,9 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
CitizensAPI.setImplementation(this); CitizensAPI.setImplementation(this);
getServer().getPluginManager().registerEvents(new EventListen(), this); getServer().getPluginManager().registerEvents(new EventListen(), this);
if (Setting.NPC_COST.asDouble() > 0) { if (Setting.NPC_COST.asDouble() > 0) {
try { setupEconomy();
RegisteredServiceProvider<Economy> provider = Bukkit.getServicesManager().getRegistration(
Economy.class);
if (provider != null && provider.getProvider() != null) {
Economy economy = provider.getProvider();
Bukkit.getPluginManager().registerEvents(new PaymentListener(economy), this);
}
} catch (NoClassDefFoundError e) {
Messaging.log("Unable to use economy handling. Has Vault been enabled?");
}
} }
registerCommands(); registerCommands();
@ -244,6 +236,19 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
} }
} }
private void setupEconomy() {
try {
RegisteredServiceProvider<Economy> provider = Bukkit.getServicesManager().getRegistration(
Economy.class);
if (provider != null && provider.getProvider() != null) {
Economy economy = provider.getProvider();
Bukkit.getPluginManager().registerEvents(new PaymentListener(economy), this);
}
} catch (NoClassDefFoundError e) {
Messaging.log("Unable to use economy handling. Has Vault been enabled?");
}
}
@Override @Override
public void onImplementationChanged() { public void onImplementationChanged() {
Messaging.severe("Citizens implementation changed, disabling plugin."); Messaging.severe("Citizens implementation changed, disabling plugin.");

View File

@ -55,6 +55,10 @@ public class EventListen implements Listener {
private final NPCRegistry npcRegistry = CitizensAPI.getNPCRegistry(); private final NPCRegistry npcRegistry = CitizensAPI.getNPCRegistry();
private final ListMultimap<ChunkCoord, Integer> toRespawn = ArrayListMultimap.create(); private final ListMultimap<ChunkCoord, Integer> toRespawn = ArrayListMultimap.create();
public EventListen() {
instance = this;
}
/* /*
* Chunk events * Chunk events
*/ */
@ -283,4 +287,12 @@ public class EventListen implements Listener {
return prime * (prime + x) + z; return prime * (prime + x) + z;
} }
} }
public static void add(Location loc, int id) {
if (instance == null)
return;
instance.toRespawn.put(instance.toCoord(loc.getChunk()), id);
}
private static EventListen instance;
} }

View File

@ -1,5 +1,6 @@
package net.citizensnpcs.npc; package net.citizensnpcs.npc;
import net.citizensnpcs.EventListen;
import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.ai.Navigator; import net.citizensnpcs.api.ai.Navigator;
import net.citizensnpcs.api.event.NPCDespawnEvent; import net.citizensnpcs.api.event.NPCDespawnEvent;
@ -132,15 +133,25 @@ public abstract class CitizensNPC extends AbstractNPC {
Messaging.debug("NPC (ID: " + getId() + ") is already spawned."); Messaging.debug("NPC (ID: " + getId() + ") is already spawned.");
return false; return false;
} }
NPCSpawnEvent spawnEvent = new NPCSpawnEvent(this, loc);
Bukkit.getPluginManager().callEvent(spawnEvent);
if (spawnEvent.isCancelled())
return false;
mcEntity = createHandle(loc); mcEntity = createHandle(loc);
mcEntity.world.addEntity(mcEntity, SpawnReason.CUSTOM); boolean couldSpawn = mcEntity.world.addEntity(mcEntity, SpawnReason.CUSTOM);
if (!couldSpawn) {
// we need to wait for a chunk load before trying to spawn
mcEntity = null;
EventListen.add(loc, getId());
return true;
}
mcEntity.world.players.remove(mcEntity); mcEntity.world.players.remove(mcEntity);
NPCSpawnEvent spawnEvent = new NPCSpawnEvent(this, loc);
Bukkit.getPluginManager().callEvent(spawnEvent);
if (spawnEvent.isCancelled()) {
mcEntity = null;
return false;
}
getBukkitEntity().setMetadata(NPC_METADATA_MARKER, getBukkitEntity().setMetadata(NPC_METADATA_MARKER,
new FixedMetadataValue(CitizensAPI.getPlugin(), true)); new FixedMetadataValue(CitizensAPI.getPlugin(), true));

View File

@ -5,6 +5,7 @@ import net.citizensnpcs.api.ai.NavigatorParameters;
import net.citizensnpcs.api.ai.TargetType; import net.citizensnpcs.api.ai.TargetType;
import net.citizensnpcs.api.ai.event.CancelReason; import net.citizensnpcs.api.ai.event.CancelReason;
import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.util.NMS;
import net.citizensnpcs.util.Util; import net.citizensnpcs.util.Util;
import net.minecraft.server.EntityLiving; import net.minecraft.server.EntityLiving;
import net.minecraft.server.EntityMonster; import net.minecraft.server.EntityMonster;
@ -90,12 +91,12 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget {
} }
if (cancelReason != null) if (cancelReason != null)
return true; return true;
navigation.a(parameters.avoidWater());
navigation.a(target, parameters.speed()); navigation.a(target, parameters.speed());
handle.getControllerLook().a(target, 10.0F, handle.bf()); NMS.look(handle.getControllerLook(), handle, target);
if (aggro && canAttack()) { if (aggro && canAttack()) {
if (handle instanceof EntityMonster) { if (handle instanceof EntityMonster) {
((EntityMonster) handle).k(target); NMS.attack(handle, target);
// the cast is necessary to resolve overloaded method a
} else if (handle instanceof EntityPlayer) { } else if (handle instanceof EntityPlayer) {
EntityPlayer humanHandle = (EntityPlayer) handle; EntityPlayer humanHandle = (EntityPlayer) handle;
humanHandle.attack(target); humanHandle.attack(target);

View File

@ -5,6 +5,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.CitizensNPC;
import net.minecraft.server.ControllerLook;
import net.minecraft.server.Entity; import net.minecraft.server.Entity;
import net.minecraft.server.EntityLiving; import net.minecraft.server.EntityLiving;
import net.minecraft.server.EntityTypes; import net.minecraft.server.EntityTypes;
@ -159,4 +160,12 @@ public class NMS {
} catch (Exception e) { } catch (Exception e) {
} }
} }
public static void attack(EntityLiving handle, EntityLiving target) {
handle.k(target);
}
public static void look(ControllerLook controllerLook, EntityLiving handle, EntityLiving target) {
controllerLook.a(target, 10.0F, handle.bf());
}
} }