From 3e23e46d92c60337d05758e9e0e35e20f0b40619 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Mon, 16 Feb 2026 01:42:47 +0100 Subject: [PATCH] fix: enforce region knockback for mounted combat players --- .../knockback/KnockbackRegionController.java | 65 +++++++++++++++++++ .../fight/knockback/KnockbackService.java | 8 +++ 2 files changed, 73 insertions(+) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackRegionController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackRegionController.java index e4c3143b..2c82ae45 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackRegionController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackRegionController.java @@ -9,12 +9,15 @@ import java.util.Optional; import org.bukkit.Location; import org.bukkit.Server; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.vehicle.VehicleMoveEvent; +import org.spigotmc.event.entity.EntityMountEvent; public class KnockbackRegionController implements Listener { @@ -89,6 +92,68 @@ void onPlayerTeleport(PlayerTeleportEvent event) { } } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + void onVehicleMove(VehicleMoveEvent event) { + Location locationTo = event.getTo(); + Location locationFrom = event.getFrom(); + + if (locationTo.getBlockX() == locationFrom.getBlockX() + && locationTo.getBlockY() == locationFrom.getBlockY() + && locationTo.getBlockZ() == locationFrom.getBlockZ()) { + return; + } + + Optional regionOptional = this.regionProvider.getRegion(locationTo); + if (regionOptional.isEmpty()) { + return; + } + + Region region = regionOptional.get(); + for (Entity passenger : event.getVehicle().getPassengers()) { + if (!(passenger instanceof Player player)) { + continue; + } + + if (!this.fightManager.isInCombat(player.getUniqueId())) { + continue; + } + + player.leaveVehicle(); + if (region.contains(locationFrom)) { + this.knockbackService.knockback(region, player); + this.knockbackService.forceKnockbackLater(player, region); + } else { + this.knockbackService.knockbackLater(region, player, Duration.ofMillis(50)); + } + + this.noticeService.create() + .player(player.getUniqueId()) + .notice(config -> config.messagesSettings.cantEnterOnRegion) + .send(); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + void onEntityMount(EntityMountEvent event) { + if (!(event.getEntity() instanceof Player player)) { + return; + } + + if (!this.fightManager.isInCombat(player.getUniqueId())) { + return; + } + + if (!this.regionProvider.isInRegion(event.getMount().getLocation())) { + return; + } + + event.setCancelled(true); + this.noticeService.create() + .player(player.getUniqueId()) + .notice(config -> config.messagesSettings.cantEnterOnRegion) + .send(); + } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) void onTag(FightTagEvent event) { Player player = this.server.getPlayer(event.getPlayer()); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java index 99c91d64..6b3439c8 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java @@ -44,6 +44,10 @@ public void forceKnockbackLater(Player player, Region region) { scheduler.runLater( player.getLocation(), () -> { insideRegion.remove(player.getUniqueId()); + if (player.isInsideVehicle()) { + player.leaveVehicle(); + } + Location playerLocation = player.getLocation(); if (!region.contains(playerLocation) && !regionProvider.isInRegion(playerLocation)) { return; @@ -68,6 +72,10 @@ private Location generate(Location playerLocation, Point2D minX, Point2D maxX) { } public void knockback(Region region, Player player) { + if (player.isInsideVehicle()) { + player.leaveVehicle(); + } + Point point = region.getCenter(); Location subtract = player.getLocation().subtract(point.x(), 0, point.z());