mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2025-01-04 07:27:59 +01:00
Change Navigation world when the entity changes world
This commit is contained in:
parent
22ace31fbe
commit
547df2487f
@ -20,6 +20,7 @@ import net.citizensnpcs.api.trait.trait.Owner;
|
|||||||
import net.citizensnpcs.editor.Editor;
|
import net.citizensnpcs.editor.Editor;
|
||||||
import net.citizensnpcs.npc.entity.EntityHumanNPC;
|
import net.citizensnpcs.npc.entity.EntityHumanNPC;
|
||||||
import net.citizensnpcs.trait.CurrentLocation;
|
import net.citizensnpcs.trait.CurrentLocation;
|
||||||
|
import net.citizensnpcs.util.NMS;
|
||||||
import net.minecraft.server.EntityPlayer;
|
import net.minecraft.server.EntityPlayer;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -40,6 +41,7 @@ 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;
|
||||||
@ -90,6 +92,15 @@ public class EventListen implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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(event.getEntity(), event.getTo().getWorld());
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Entity events
|
* Entity events
|
||||||
*/
|
*/
|
||||||
@ -170,8 +181,8 @@ public class EventListen implements Listener {
|
|||||||
EntityPlayer handle = ((CraftPlayer) event.getPlayer()).getHandle();
|
EntityPlayer handle = ((CraftPlayer) event.getPlayer()).getHandle();
|
||||||
if (!(handle instanceof EntityHumanNPC))
|
if (!(handle instanceof EntityHumanNPC))
|
||||||
return;
|
return;
|
||||||
|
if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())
|
||||||
((CraftServer) Bukkit.getServer()).getHandle().players.remove(handle);
|
((CraftServer) Bukkit.getServer()).getHandle().players.remove(handle);
|
||||||
// on teleport, player NPCs are added to the server player list. this is
|
// on teleport, player NPCs are added to the server player list. this is
|
||||||
// undesirable as player NPCs are not real players and confuse plugins.
|
// undesirable as player NPCs are not real players and confuse plugins.
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,12 @@ import net.minecraft.server.EntityTypes;
|
|||||||
import net.minecraft.server.Navigation;
|
import net.minecraft.server.Navigation;
|
||||||
import net.minecraft.server.NetworkManager;
|
import net.minecraft.server.NetworkManager;
|
||||||
import net.minecraft.server.PathfinderGoalSelector;
|
import net.minecraft.server.PathfinderGoalSelector;
|
||||||
|
import net.minecraft.server.World;
|
||||||
|
|
||||||
|
import org.bukkit.craftbukkit.CraftWorld;
|
||||||
|
import org.bukkit.craftbukkit.entity.CraftLivingEntity;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
@ -29,10 +33,9 @@ public class NMS {
|
|||||||
private static Field GOAL_FIELD;
|
private static Field GOAL_FIELD;
|
||||||
private static Field LAND_SPEED_MODIFIER_FIELD;
|
private static Field LAND_SPEED_MODIFIER_FIELD;
|
||||||
private static final Map<EntityType, Float> MOVEMENT_SPEEDS = Maps.newEnumMap(EntityType.class);
|
private static final Map<EntityType, Float> MOVEMENT_SPEEDS = Maps.newEnumMap(EntityType.class);
|
||||||
|
private static Field NAVIGATION_WORLD_FIELD;
|
||||||
private static Field PATHFINDING_RANGE;
|
private static Field PATHFINDING_RANGE;
|
||||||
|
|
||||||
private static Field SPEED_FIELD;
|
private static Field SPEED_FIELD;
|
||||||
|
|
||||||
private static Field THREAD_STOPPER;
|
private static Field THREAD_STOPPER;
|
||||||
|
|
||||||
public static void attack(EntityLiving handle, EntityLiving target) {
|
public static void attack(EntityLiving handle, EntityLiving target) {
|
||||||
@ -125,6 +128,17 @@ public class NMS {
|
|||||||
entity.getControllerJump().b();
|
entity.getControllerJump().b();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void updateNavigationWorld(org.bukkit.entity.Entity entity, org.bukkit.World world) {
|
||||||
|
if (NAVIGATION_WORLD_FIELD == null || !(entity instanceof LivingEntity))
|
||||||
|
return;
|
||||||
|
EntityLiving handle = ((CraftLivingEntity) entity).getHandle();
|
||||||
|
World worldHandle = ((CraftWorld) world).getHandle();
|
||||||
|
try {
|
||||||
|
NAVIGATION_WORLD_FIELD.set(handle.getNavigation(), worldHandle);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void updatePathfindingRange(CitizensNPC npc, float pathfindingRange) {
|
public static void updatePathfindingRange(CitizensNPC npc, float pathfindingRange) {
|
||||||
if (PATHFINDING_RANGE == null)
|
if (PATHFINDING_RANGE == null)
|
||||||
return;
|
return;
|
||||||
@ -155,6 +169,7 @@ public class NMS {
|
|||||||
|
|
||||||
LAND_SPEED_MODIFIER_FIELD = getField(EntityLiving.class, "bB");
|
LAND_SPEED_MODIFIER_FIELD = getField(EntityLiving.class, "bB");
|
||||||
SPEED_FIELD = getField(EntityLiving.class, "bw");
|
SPEED_FIELD = getField(EntityLiving.class, "bw");
|
||||||
|
NAVIGATION_WORLD_FIELD = getField(Navigation.class, "b");
|
||||||
PATHFINDING_RANGE = getField(Navigation.class, "e");
|
PATHFINDING_RANGE = getField(Navigation.class, "e");
|
||||||
GOAL_FIELD = getField(PathfinderGoalSelector.class, "a");
|
GOAL_FIELD = getField(PathfinderGoalSelector.class, "a");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user