Implement NPC#teleport (untested)

This commit is contained in:
fullwall 2013-08-02 15:04:06 +08:00
parent 8457671a6e
commit 59af96c467
5 changed files with 53 additions and 20 deletions

View File

@ -34,7 +34,6 @@ import org.bukkit.Bukkit;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -48,7 +47,6 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.entity.EntityTeleportEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
@ -133,15 +131,6 @@ public class EventListen implements Listener {
checkCreationEvent(event); checkCreationEvent(event);
} }
@EventHandler(ignoreCancelled = true)
public void onEntityChangedWorld(EntityTeleportEvent event) {
if (event.getFrom() == null || event.getTo() == null)
return;
if (event.getFrom().getWorld() == event.getTo().getWorld() || !npcRegistry.isNPC(event.getEntity()))
return;
NMS.updateNavigationWorld((LivingEntity) event.getEntity(), event.getTo().getWorld());
}
/* /*
* Entity events * Entity events
*/ */

View File

@ -168,7 +168,7 @@ public class NPCCommands {
Anchor anchor = trait.getAnchor(args.getFlag("assume")); Anchor anchor = trait.getAnchor(args.getFlag("assume"));
if (anchor == null) if (anchor == null)
throw new CommandException(Messages.ANCHOR_MISSING, args.getFlag("assume")); throw new CommandException(Messages.ANCHOR_MISSING, args.getFlag("assume"));
npc.getBukkitEntity().teleport(anchor.getLocation()); npc.teleport(anchor.getLocation(), TeleportCause.COMMAND);
} else if (args.hasValueFlag("remove")) { } else if (args.hasValueFlag("remove")) {
if (args.getFlag("remove").isEmpty()) if (args.getFlag("remove").isEmpty())
throw new CommandException(Messages.INVALID_ANCHOR_NAME); throw new CommandException(Messages.INVALID_ANCHOR_NAME);
@ -198,7 +198,7 @@ public class NPCCommands {
return; return;
if (sender instanceof ConsoleCommandSender) if (sender instanceof ConsoleCommandSender)
throw new ServerCommandException(); throw new ServerCommandException();
npc.getBukkitEntity().teleport(args.getSenderLocation()); npc.teleport(args.getSenderLocation(), TeleportCause.COMMAND);
} }
@Command( @Command(
@ -244,7 +244,7 @@ public class NPCCommands {
if (copy.isSpawned() && args.getSenderLocation() != null) { if (copy.isSpawned() && args.getSenderLocation() != null) {
Location location = args.getSenderLocation(); Location location = args.getSenderLocation();
location.getChunk().load(); location.getChunk().load();
copy.getBukkitEntity().teleport(location); copy.teleport(location, TeleportCause.COMMAND);
copy.getTrait(CurrentLocation.class).setLocation(location); copy.getTrait(CurrentLocation.class).setLocation(location);
} }
@ -676,7 +676,7 @@ public class NPCCommands {
} }
} }
npc.getBukkitEntity().teleport(to, TeleportCause.COMMAND); npc.teleport(to, TeleportCause.COMMAND);
Messaging.sendTr(sender, Messages.MOVETO_TELEPORTED, npc.getName(), to); Messaging.sendTr(sender, Messages.MOVETO_TELEPORTED, npc.getName(), to);
} }
@ -1195,7 +1195,7 @@ public class NPCCommands {
npc.despawn(DespawnReason.REMOVAL); npc.despawn(DespawnReason.REMOVAL);
throw new CommandException(Messages.CANNOT_TELEPORT_ACROSS_WORLDS); throw new CommandException(Messages.CANNOT_TELEPORT_ACROSS_WORLDS);
} }
npc.getBukkitEntity().teleport(args.getSenderLocation(), TeleportCause.COMMAND); npc.teleport(args.getSenderLocation(), TeleportCause.COMMAND);
} }
Messaging.sendTr(sender, Messages.NPC_TELEPORTED, npc.getName()); Messaging.sendTr(sender, Messages.NPC_TELEPORTED, npc.getName());
} }

View File

@ -24,9 +24,11 @@ import net.minecraft.server.v1_6_R2.EntityLiving;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftLivingEntity; import org.bukkit.craftbukkit.v1_6_R2.entity.CraftLivingEntity;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.FixedMetadataValue;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
@ -187,6 +189,35 @@ public class CitizensNPC extends AbstractNPC {
return true; return true;
} }
private void teleport(final Entity entity, Location location, boolean loaded, int delay) {
if (!loaded)
location.getBlock().getChunk();
final Entity passenger = entity.getPassenger();
entity.eject();
entity.teleport(location);
if (passenger == null)
return;
teleport(passenger, location, true, delay++);
Runnable task = new Runnable() {
@Override
public void run() {
NMS.mount(entity, passenger);
}
};
if (!location.getWorld().equals(entity.getWorld())) {
Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), task, delay);
} else {
task.run();
}
}
@Override
public void teleport(Location location, TeleportCause cause) {
if (!this.isSpawned())
return;
teleport(getBukkitEntity(), location, false, 5);
}
@Override @Override
public void update() { public void update() {
try { try {
@ -203,5 +234,4 @@ public class CitizensNPC extends AbstractNPC {
} }
private static final String NPC_METADATA_MARKER = "NPC"; private static final String NPC_METADATA_MARKER = "NPC";
} }

View File

@ -216,12 +216,14 @@ public class CitizensNavigator implements Navigator, Runnable {
} }
private void switchStrategyTo(PathStrategy newStrategy) { private void switchStrategyTo(PathStrategy newStrategy) {
if (Messaging.isDebugging())
Messaging.debug(npc.getId(), "changing to new PathStrategy", newStrategy); Messaging.debug(npc.getId(), "changing to new PathStrategy", newStrategy);
if (executing != null) if (executing != null)
Bukkit.getPluginManager().callEvent(new NavigationReplaceEvent(this)); Bukkit.getPluginManager().callEvent(new NavigationReplaceEvent(this));
executing = newStrategy; executing = newStrategy;
stationaryTicks = 0; stationaryTicks = 0;
if (npc.isSpawned()) {
NMS.updateNavigationWorld(npc.getBukkitEntity(), npc.getBukkitEntity().getWorld());
}
Bukkit.getPluginManager().callEvent(new NavigationBeginEvent(this)); Bukkit.getPluginManager().callEvent(new NavigationBeginEvent(this));
} }

View File

@ -36,6 +36,7 @@ import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_6_R2.CraftServer; import org.bukkit.craftbukkit.v1_6_R2.CraftServer;
import org.bukkit.craftbukkit.v1_6_R2.CraftWorld; import org.bukkit.craftbukkit.v1_6_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftLivingEntity; import org.bukkit.craftbukkit.v1_6_R2.entity.CraftLivingEntity;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -98,6 +99,10 @@ public class NMS {
target.setOnFire(fireAspectLevel * 4); target.setOnFire(fireAspectLevel * 4);
} }
public static void changeWorlds(org.bukkit.entity.Entity entity, org.bukkit.World world) {
getHandle(entity).world = ((CraftWorld) world).getHandle();
}
public static void clearGoals(PathfinderGoalSelector... goalSelectors) { public static void clearGoals(PathfinderGoalSelector... goalSelectors) {
if (GOAL_FIELD == null || goalSelectors == null) if (GOAL_FIELD == null || goalSelectors == null)
return; return;
@ -138,6 +143,10 @@ public class NMS {
return ((CraftLivingEntity) entity).getHandle(); return ((CraftLivingEntity) entity).getHandle();
} }
public static net.minecraft.server.v1_6_R2.Entity getHandle(org.bukkit.entity.Entity entity) {
return ((CraftEntity) entity).getHandle();
}
public static float getHeadYaw(EntityLiving handle) { public static float getHeadYaw(EntityLiving handle) {
return handle.aP; return handle.aP;
} }
@ -188,6 +197,10 @@ public class NMS {
return npc == null ? baseSpeed : baseSpeed * npc.getNavigator().getLocalParameters().speedModifier(); return npc == null ? baseSpeed : baseSpeed * npc.getNavigator().getLocalParameters().speedModifier();
} }
public static void mount(org.bukkit.entity.Entity entity, org.bukkit.entity.Entity passenger) {
NMS.getHandle(passenger).mount(NMS.getHandle(entity));
}
public static void registerEntityClass(Class<?> clazz) { public static void registerEntityClass(Class<?> clazz) {
if (ENTITY_CLASS_TO_INT.containsKey(clazz)) if (ENTITY_CLASS_TO_INT.containsKey(clazz))
return; return;
@ -399,7 +412,6 @@ public class NMS {
} }
private static final float DEFAULT_SPEED = 1F; private static final float DEFAULT_SPEED = 1F;
private static Map<Class<?>, Integer> ENTITY_CLASS_TO_INT; private static Map<Class<?>, Integer> ENTITY_CLASS_TO_INT;
private static final Map<Class<?>, Constructor<?>> ENTITY_CONSTRUCTOR_CACHE = new WeakHashMap<Class<?>, Constructor<?>>(); private static final Map<Class<?>, Constructor<?>> ENTITY_CONSTRUCTOR_CACHE = new WeakHashMap<Class<?>, Constructor<?>>();
private static Map<Integer, Class<?>> ENTITY_INT_TO_CLASS; private static Map<Integer, Class<?>> ENTITY_INT_TO_CLASS;