diff --git a/changelog.md b/changelog.md index 58387a4..ee5cded 100644 --- a/changelog.md +++ b/changelog.md @@ -17,6 +17,7 @@ These changes will (most likely) be included in the next version. ### Fixed - MobArena no longer throws errors when handling block explosions on Minecraft 1.21. +- The `shuffle-positions` ability now correctly shuffles the position of the boss as well if `monster-teleport` is set to `false`. ## [0.108] - 2024-01-01 ### Added diff --git a/src/main/java/com/garbagemule/MobArena/ArenaListener.java b/src/main/java/com/garbagemule/MobArena/ArenaListener.java index 9269bd4..a8503cd 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaListener.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaListener.java @@ -93,6 +93,7 @@ import org.bukkit.material.Attachable; import org.bukkit.material.Bed; import org.bukkit.material.Door; import org.bukkit.material.Redstone; +import org.bukkit.metadata.MetadataValue; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.projectiles.ProjectileSource; @@ -928,6 +929,11 @@ public class ArenaListener } if (isArenaMonster(event.getEntity())) { + for (MetadataValue metadata : event.getEntity().getMetadata("teleporting")) { + if (plugin.equals(metadata.getOwningPlugin())) { + return; + } + } if (!monsterTeleport || !region.contains(event.getTo())) { event.setCancelled(true); } @@ -1328,6 +1334,13 @@ public class ArenaListener return TeleportResponse.ALLOW; } + // Same deal for players being teleported by shuffle-positions. + for (MetadataValue metadata : p.getMetadata("teleporting")) { + if (plugin.equals(metadata.getOwningPlugin())) { + return TeleportResponse.ALLOW; + } + } + Location to = event.getTo(); Location from = event.getFrom(); diff --git a/src/main/java/com/garbagemule/MobArena/waves/ability/core/ShufflePositions.java b/src/main/java/com/garbagemule/MobArena/waves/ability/core/ShufflePositions.java index ab8ce38..82117a1 100644 --- a/src/main/java/com/garbagemule/MobArena/waves/ability/core/ShufflePositions.java +++ b/src/main/java/com/garbagemule/MobArena/waves/ability/core/ShufflePositions.java @@ -6,6 +6,8 @@ import com.garbagemule.MobArena.waves.ability.Ability; import com.garbagemule.MobArena.waves.ability.AbilityInfo; import org.bukkit.Location; import org.bukkit.entity.LivingEntity; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; import java.util.ArrayList; import java.util.Collections; @@ -30,6 +32,11 @@ public class ShufflePositions implements Ability locations.add(e.getLocation()); } + // Keep track of teleportees + MetadataValue metadata = new FixedMetadataValue(arena.getPlugin(), true); + List teleportees = new ArrayList<>(entities); + teleportees.forEach(e -> e.setMetadata("teleporting", metadata)); + // Shuffle the entities list. Collections.shuffle(entities); @@ -39,5 +46,8 @@ public class ShufflePositions implements Ability while (!entities.isEmpty() && !locations.isEmpty()) { entities.remove(0).teleport(locations.remove(0)); } + + // Remove teleportee metadata + teleportees.forEach(e -> e.removeMetadata("teleporting", arena.getPlugin())); } }