From a9b11216755fe9d02f27b834dd8fd1eb484e0a97 Mon Sep 17 00:00:00 2001 From: Fruitloopins <49851457+Fruitloopins@users.noreply.github.com> Date: Sat, 4 May 2024 14:46:58 +1000 Subject: [PATCH 1/3] Teleport pets with player --- .../towny/tasks/TeleportWarmupTimerTask.java | 9 +++- .../bukkit/towny/utils/SpawnUtil.java | 45 ++++++++++++++++++- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/TeleportWarmupTimerTask.java b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/TeleportWarmupTimerTask.java index fcf0c11c1e2..109c5f88f32 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/TeleportWarmupTimerTask.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/TeleportWarmupTimerTask.java @@ -13,12 +13,14 @@ import com.palmergames.bukkit.towny.object.Translatable; import com.palmergames.bukkit.towny.object.Translation; import com.palmergames.bukkit.towny.object.economy.Account; +import com.palmergames.bukkit.towny.utils.SpawnUtil; import com.palmergames.bukkit.util.BukkitTools; import io.papermc.lib.PaperLib; import org.bukkit.Location; import org.bukkit.NamespacedKey; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.jetbrains.annotations.Contract; @@ -26,6 +28,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -64,8 +67,10 @@ public void run() { // Only teleport & add cooldown if player is valid if (player == null) continue; - - PaperLib.teleportAsync(player, request.destinationLocation(), TeleportCause.COMMAND); + + List pets = SpawnUtil.getPets(player); + pets.add(player); + SpawnUtil.teleportEntities(request.destinationLocation(), pets, TeleportCause.COMMAND); if (request.cooldown() > 0) CooldownTimerTask.addCooldownTimer(resident.getName(), "teleport", request.cooldown()); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java index 854965fc89a..790207c20ca 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java @@ -1,5 +1,6 @@ package com.palmergames.bukkit.towny.utils; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -19,7 +20,11 @@ import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.AnimalTamer; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.entity.Sittable; +import org.bukkit.entity.Tameable; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import com.palmergames.bukkit.towny.Towny; @@ -669,12 +674,45 @@ private static void initiateSpawn(Player player, Location spawnLoc, int cooldown // Don't use teleport warmup if (player.getVehicle() != null) player.getVehicle().eject(); - PaperLib.teleportAsync(player, spawnLoc, TeleportCause.COMMAND); + + List pets = getPets(player); + pets.add(player); + teleportEntities(spawnLoc, pets, TeleportCause.COMMAND); if (cooldown > 0 && !hasPerm(player, PermissionNodes.TOWNY_SPAWN_ADMIN_NOCOOLDOWN)) CooldownTimerTask.addCooldownTimer(player.getName(), "teleport", cooldown); } } + /** + * Gets any pets owned by the specified player that are nearby them + * + * @param player The player to get the pets of + */ + public static List getPets(Player player) { + List pets = new ArrayList<>(); + + for (Entity entity : player.getNearbyEntities(16, 16, 16)) { + if (!(entity instanceof Tameable tameable)) continue; + + AnimalTamer tamer = tameable.getOwner(); + if (tamer == null) continue; + + if (!(entity instanceof Sittable sittable)) continue; + if (sittable.isSitting()) continue; + + if (tamer.equals(player)) + pets.add(entity); + } + + return pets; + } + + public static void teleportEntities(Location loc, List entities, TeleportCause cause) { + for (Entity entity : entities) { + PaperLib.teleportAsync(entity, loc, cause); + } + } + /** * Begin a costed teleportation. * @@ -745,8 +783,11 @@ private static void initiatePluginTeleport(Resident resident, Location loc, bool final Player player = resident.getPlayer(); if (player == null) return; + + List pets = getPets(player); + pets.add(player); - plugin.getScheduler().runLater(player, () -> PaperLib.teleportAsync(resident.getPlayer(), loc, TeleportCause.PLUGIN), + plugin.getScheduler().runLater(player, () -> teleportEntities(loc, pets, TeleportCause.PLUGIN), ignoreWarmup ? 0 : TownySettings.getTeleportWarmupTime() * 20L); } From 706e36c1fd176ab69a91aeac646ccbb140a065ae Mon Sep 17 00:00:00 2001 From: Fruitloopins <49851457+Fruitloopins@users.noreply.github.com> Date: Sat, 4 May 2024 15:31:34 +1000 Subject: [PATCH 2/3] Add comment to teleportEntities method --- .../com/palmergames/bukkit/towny/utils/SpawnUtil.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java index 790207c20ca..a8699709776 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java @@ -706,7 +706,14 @@ public static List getPets(Player player) { return pets; } - + + /** + * Teleports all specified entities to the specified location + * + * @param loc Location to teleport to + * @param entities Entities to teleport + * @param cause What caused the teleport + */ public static void teleportEntities(Location loc, List entities, TeleportCause cause) { for (Entity entity : entities) { PaperLib.teleportAsync(entity, loc, cause); From c1251fb9a3b374dc3eb34b02ecea22047ac3c832 Mon Sep 17 00:00:00 2001 From: Fruitloopins <49851457+Fruitloopins@users.noreply.github.com> Date: Tue, 14 May 2024 08:58:14 +1000 Subject: [PATCH 3/3] Some changes from review --- .../towny/tasks/TeleportWarmupTimerTask.java | 10 +++---- .../bukkit/towny/utils/SpawnUtil.java | 26 ++++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/TeleportWarmupTimerTask.java b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/TeleportWarmupTimerTask.java index 109c5f88f32..1f909aed96b 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/TeleportWarmupTimerTask.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/tasks/TeleportWarmupTimerTask.java @@ -16,8 +16,6 @@ import com.palmergames.bukkit.towny.utils.SpawnUtil; import com.palmergames.bukkit.util.BukkitTools; -import io.papermc.lib.PaperLib; - import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.entity.Entity; @@ -27,6 +25,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -68,9 +67,10 @@ public void run() { if (player == null) continue; - List pets = SpawnUtil.getPets(player); - pets.add(player); - SpawnUtil.teleportEntities(request.destinationLocation(), pets, TeleportCause.COMMAND); + Collection entities = SpawnUtil.getPets(player); + entities.add(player); + + SpawnUtil.teleportEntities(request.destinationLocation(), entities, TeleportCause.COMMAND); if (request.cooldown() > 0) CooldownTimerTask.addCooldownTimer(resident.getName(), "teleport", request.cooldown()); diff --git a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java index a8699709776..0b6551f6184 100644 --- a/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java +++ b/Towny/src/main/java/com/palmergames/bukkit/towny/utils/SpawnUtil.java @@ -1,6 +1,7 @@ package com.palmergames.bukkit.towny.utils; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -675,25 +676,32 @@ private static void initiateSpawn(Player player, Location spawnLoc, int cooldown if (player.getVehicle() != null) player.getVehicle().eject(); - List pets = getPets(player); - pets.add(player); - teleportEntities(spawnLoc, pets, TeleportCause.COMMAND); + Collection entities = getPets(player); + entities.add(player); + + teleportEntities(spawnLoc, entities, TeleportCause.COMMAND); if (cooldown > 0 && !hasPerm(player, PermissionNodes.TOWNY_SPAWN_ADMIN_NOCOOLDOWN)) CooldownTimerTask.addCooldownTimer(player.getName(), "teleport", cooldown); } } /** - * Gets any pets owned by the specified player that are nearby them + * Gets any conventional following/sittable pets owned by the specified player that are nearby them * * @param player The player to get the pets of */ - public static List getPets(Player player) { + public static Collection getPets(Player player) { List pets = new ArrayList<>(); - for (Entity entity : player.getNearbyEntities(16, 16, 16)) { - if (!(entity instanceof Tameable tameable)) continue; - + Collection entities = player.getWorld().getNearbyEntities( + player.getLocation(), + 16, 16, 16, + e -> e instanceof Tameable + ); + + for (Entity entity : entities) { + Tameable tameable = (Tameable) entity; + AnimalTamer tamer = tameable.getOwner(); if (tamer == null) continue; @@ -714,7 +722,7 @@ public static List getPets(Player player) { * @param entities Entities to teleport * @param cause What caused the teleport */ - public static void teleportEntities(Location loc, List entities, TeleportCause cause) { + public static void teleportEntities(Location loc, Iterable entities, TeleportCause cause) { for (Entity entity : entities) { PaperLib.teleportAsync(entity, loc, cause); }