From 1ee656c4494aa0ee0c1c5f5d2eefed345d4a7b18 Mon Sep 17 00:00:00 2001 From: Moderocky Date: Fri, 26 Apr 2024 13:13:45 +0100 Subject: [PATCH 1/3] Attempt to estimate world in teleport when it's not specified. --- .../ch/njol/skript/effects/EffTeleport.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/effects/EffTeleport.java b/src/main/java/ch/njol/skript/effects/EffTeleport.java index 3ba06d7d150..d6b0f9580e9 100644 --- a/src/main/java/ch/njol/skript/effects/EffTeleport.java +++ b/src/main/java/ch/njol/skript/effects/EffTeleport.java @@ -19,7 +19,6 @@ package ch.njol.skript.effects; import ch.njol.skript.Skript; -import ch.njol.skript.sections.EffSecSpawn; import ch.njol.skript.sections.EffSecSpawn.SpawnEvent; import ch.njol.skript.bukkitutil.EntityUtils; import ch.njol.skript.doc.Description; @@ -31,7 +30,6 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.Trigger; import ch.njol.skript.lang.TriggerItem; -import ch.njol.skript.lang.TriggerSection; import ch.njol.skript.timings.SkriptTimings; import ch.njol.skript.util.Direction; import ch.njol.skript.variables.Variables; @@ -53,7 +51,7 @@ "which may cause lag spikes or server crashes when using this effect to teleport entities to unloaded chunks." }) @Examples({ - "teleport the player to {homes.%player%}", + "teleport the player to {homes::%player%}", "teleport the attacker to the victim" }) @Since("1.0") @@ -101,6 +99,7 @@ protected TriggerItem walk(Event e) { Location loc = location.getSingle(e); if (loc == null) return next; + boolean unknownWorld = !loc.isWorldLoaded(); Entity[] entityArray = entities.getArray(e); // We have to fetch this before possible async execution to avoid async local variable access. if (entityArray.length == 0) @@ -108,11 +107,15 @@ protected TriggerItem walk(Event e) { if (!delayed) { if (e instanceof PlayerRespawnEvent && entityArray.length == 1 && entityArray[0].equals(((PlayerRespawnEvent) e).getPlayer())) { + if (unknownWorld) + return next; ((PlayerRespawnEvent) e).setRespawnLocation(loc); return next; } if (e instanceof PlayerMoveEvent && entityArray.length == 1 && entityArray[0].equals(((PlayerMoveEvent) e).getPlayer())) { + if (unknownWorld) // we can approximate the world + loc = new Location(((PlayerMoveEvent) e).getFrom().getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); ((PlayerMoveEvent) e).setTo(loc); return next; } @@ -125,6 +128,18 @@ protected TriggerItem walk(Event e) { return next; } + find_a_world: + if (unknownWorld) { // we can't fetch the chunk without a world + for (Entity entity : entityArray) { + if (entity == null) + continue; + // assume it's a local teleport, use the first entity we find as a reference + loc = new Location(entity.getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + break find_a_world; + } + return next; // no entities = no chunk = nobody teleporting + } + final Location fixed = loc; Delay.addDelayedEvent(e); Object localVars = Variables.removeLocals(e); @@ -132,7 +147,7 @@ protected TriggerItem walk(Event e) { PaperLib.getChunkAtAsync(loc).thenAccept(chunk -> { // The following is now on the main thread for (Entity entity : entityArray) { - EntityUtils.teleport(entity, loc); + EntityUtils.teleport(entity, fixed); } // Re-set local variables From 747eaa63bd91ad4eb96628064254ce1632edf694 Mon Sep 17 00:00:00 2001 From: Moderocky Date: Wed, 1 May 2024 18:59:43 +0100 Subject: [PATCH 2/3] Don't estimate world for multiple things. --- .../java/ch/njol/skript/effects/EffTeleport.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/ch/njol/skript/effects/EffTeleport.java b/src/main/java/ch/njol/skript/effects/EffTeleport.java index d6b0f9580e9..074a07e0582 100644 --- a/src/main/java/ch/njol/skript/effects/EffTeleport.java +++ b/src/main/java/ch/njol/skript/effects/EffTeleport.java @@ -128,16 +128,17 @@ protected TriggerItem walk(Event e) { return next; } - find_a_world: if (unknownWorld) { // we can't fetch the chunk without a world - for (Entity entity : entityArray) { + if (entityArray.length == 1) { // if there's 1 thing we can borrow its world + Entity entity = entityArray[0]; if (entity == null) - continue; + return next; // assume it's a local teleport, use the first entity we find as a reference - loc = new Location(entity.getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - break find_a_world; + loc = new Location(entity.getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), + loc.getPitch()); + } else { + return next; // no entities = no chunk = nobody teleporting } - return next; // no entities = no chunk = nobody teleporting } final Location fixed = loc; Delay.addDelayedEvent(e); From 9a45f368f93ca08c1b00bcdf25b831624cc5f5fd Mon Sep 17 00:00:00 2001 From: Moderocky Date: Wed, 1 May 2024 19:33:37 +0100 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Patrick Miller --- src/main/java/ch/njol/skript/effects/EffTeleport.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/effects/EffTeleport.java b/src/main/java/ch/njol/skript/effects/EffTeleport.java index 074a07e0582..990e1aa7ec1 100644 --- a/src/main/java/ch/njol/skript/effects/EffTeleport.java +++ b/src/main/java/ch/njol/skript/effects/EffTeleport.java @@ -114,8 +114,10 @@ protected TriggerItem walk(Event e) { } if (e instanceof PlayerMoveEvent && entityArray.length == 1 && entityArray[0].equals(((PlayerMoveEvent) e).getPlayer())) { - if (unknownWorld) // we can approximate the world - loc = new Location(((PlayerMoveEvent) e).getFrom().getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + if (unknownWorld) { // we can approximate the world + loc = loc.clone(); + loc.setWorld(((PlayerMoveEvent) e).getFrom().getWorld()); + } ((PlayerMoveEvent) e).setTo(loc); return next; } @@ -134,8 +136,8 @@ protected TriggerItem walk(Event e) { if (entity == null) return next; // assume it's a local teleport, use the first entity we find as a reference - loc = new Location(entity.getWorld(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), - loc.getPitch()); + loc = loc.clone(); + loc.setWorld(entity.getWorld()); } else { return next; // no entities = no chunk = nobody teleporting }