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 fcf0c11c1e..109c5f88f3 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 854965fc89..790207c20c 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); }