From 3e23e46d92c60337d05758e9e0e35e20f0b40619 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Mon, 16 Feb 2026 01:42:47 +0100 Subject: [PATCH 1/2] 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()); From e182e7c60cd990dedcdd25cb9f5ad080116714de Mon Sep 17 00:00:00 2001 From: Rollczi Date: Wed, 25 Feb 2026 00:03:10 +0100 Subject: [PATCH 2/2] CR --- .../knockback/KnockbackRegionController.java | 13 ++++---- .../fight/knockback/KnockbackService.java | 33 +++++++++---------- 2 files changed, 22 insertions(+), 24 deletions(-) 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 2c82ae45..109e8cd7 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 @@ -103,12 +103,6 @@ void onVehicleMove(VehicleMoveEvent event) { 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; @@ -118,7 +112,12 @@ void onVehicleMove(VehicleMoveEvent event) { continue; } - player.leaveVehicle(); + Optional regionOptional = this.regionProvider.getRegion(locationTo); + if (regionOptional.isEmpty()) { + return; + } + + Region region = regionOptional.get(); if (region.contains(locationFrom)) { this.knockbackService.knockback(region, player); this.knockbackService.forceKnockbackLater(player, region); 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 6b3439c8..bae8afab 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 @@ -41,23 +41,22 @@ public void forceKnockbackLater(Player player, Region region) { insideRegion.put(player.getUniqueId(), 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; - } - - Location location = - generate(playerLocation, Point2D.from(region.getMin()), Point2D.from(region.getMax())); - - PaperLib.teleportAsync(player, location, TeleportCause.PLUGIN); - }, this.config.knockback.forceDelay); + scheduler.runLater(player.getLocation(), () -> { + insideRegion.remove(player.getUniqueId()); + + Location playerLocation = player.getLocation(); + if (!region.contains(playerLocation) && !regionProvider.isInRegion(playerLocation)) { + return; + } + + if (player.isInsideVehicle()) { + player.leaveVehicle(); + } + + Location location = generate(playerLocation, Point2D.from(region.getMin()), Point2D.from(region.getMax())); + + PaperLib.teleportAsync(player, location, TeleportCause.PLUGIN); + }, this.config.knockback.forceDelay); } private Location generate(Location playerLocation, Point2D minX, Point2D maxX) {