mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-12-28 03:57:35 +01:00
Second pass: error fixing, more invisibility fixes
Handle teleporting, avoid cross-world errors.
This commit is contained in:
parent
64ac8bed9e
commit
306138165f
@ -306,11 +306,22 @@ public class EventListen implements Listener {
|
|||||||
if (from.equals(to)) {
|
if (from.equals(to)) {
|
||||||
return; // Don't fire on every movement, just full block+.
|
return; // Don't fire on every movement, just full block+.
|
||||||
}
|
}
|
||||||
|
if (!from.getWorld().getName().equalsIgnoreCase(to.getWorld().getName())) {
|
||||||
|
return; // Ignore cross-world movement for now.
|
||||||
|
}
|
||||||
int maxRad = 50 * 50; // TODO: Adjust me to perfection
|
int maxRad = 50 * 50; // TODO: Adjust me to perfection
|
||||||
for (final NPC npc: getAllNPCs()) {
|
for (final NPC npc: getAllNPCs()) {
|
||||||
if (npc.isSpawned() && npc.getEntity().getType() == EntityType.PLAYER) {
|
if (npc.isSpawned() && npc.getEntity().getType() == EntityType.PLAYER) {
|
||||||
if (npc.getEntity().getLocation().distanceSquared(to) < maxRad &&
|
if (from.getWorld().getName().equalsIgnoreCase(npc.getEntity().getLocation().getWorld().getName())
|
||||||
npc.getEntity().getLocation().distanceSquared(from) > maxRad) {
|
&& npc.getEntity().getLocation().distanceSquared(to) < maxRad
|
||||||
|
&& npc.getEntity().getLocation().distanceSquared(from) > maxRad) {
|
||||||
|
showNPCReset(event.getPlayer(), npc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showNPCReset(final Player player, final NPC npc) {
|
||||||
// TODO: Replicate this with packets!
|
// TODO: Replicate this with packets!
|
||||||
npc.despawn();
|
npc.despawn();
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), new Runnable() {
|
Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), new Runnable() {
|
||||||
@ -320,6 +331,29 @@ public class EventListen implements Listener {
|
|||||||
}
|
}
|
||||||
}, 1);
|
}, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerTeleports(PlayerTeleportEvent event) {
|
||||||
|
if (event.getFrom().getY() > 255 || event.getFrom().getY() < 0
|
||||||
|
|| event.getTo().getY() > 255 || event.getTo().getY() < 0) {
|
||||||
|
return; // Don't fire if players go outside the world, as that would be more difficult to handle.
|
||||||
|
}
|
||||||
|
Location from = event.getFrom().getBlock().getLocation();
|
||||||
|
Location to = event.getTo().getBlock().getLocation();
|
||||||
|
if (from.equals(to)) {
|
||||||
|
return; // Don't fire on every movement, just full block+.
|
||||||
|
}
|
||||||
|
int maxRad = 50 * 50; // TODO: Adjust me to perfection
|
||||||
|
for (final NPC npc: getAllNPCs()) {
|
||||||
|
if (npc.isSpawned() && npc.getEntity().getType() == EntityType.PLAYER) {
|
||||||
|
// if to.world=npc.world and in-range, and if (from.world = npc.world and out-of-range, or from a different world)
|
||||||
|
if ((to.getWorld().getName().equalsIgnoreCase(npc.getEntity().getLocation().getWorld().getName())
|
||||||
|
&& npc.getEntity().getLocation().distanceSquared(to) < maxRad)
|
||||||
|
&& ((from.getWorld().getName().equalsIgnoreCase(npc.getEntity().getLocation().getWorld().getName())
|
||||||
|
&& npc.getEntity().getLocation().distanceSquared(from) > maxRad)
|
||||||
|
|| !from.getWorld().getName().equalsIgnoreCase(to.getWorld().getName()))) {
|
||||||
|
showNPCReset(event.getPlayer(), npc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user