diff --git a/src/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java b/src/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java index 2e84d058..334c4319 100644 --- a/src/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java +++ b/src/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java @@ -22,8 +22,10 @@ import org.bukkit.event.player.PlayerBedLeaveEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerVelocityEvent; @@ -36,9 +38,9 @@ import fr.neatmonster.nocheatplus.checks.combined.Combined; import fr.neatmonster.nocheatplus.checks.combined.CombinedData; import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.players.Permissions; +import fr.neatmonster.nocheatplus.utilities.BlockCache; import fr.neatmonster.nocheatplus.utilities.BlockProperties; import fr.neatmonster.nocheatplus.utilities.PlayerLocation; -import fr.neatmonster.nocheatplus.utilities.BlockCache; /* * M"""""`'"""`YM oo @@ -693,4 +695,14 @@ public class MovingListener implements Listener { data.clearNoFallData(); // Entity fall-distance should be reset elsewhere. } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerQuit(final PlayerQuitEvent event){ + noFall.onLeave(event.getPlayer()); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerKick(final PlayerKickEvent event){ + noFall.onLeave(event.getPlayer()); + } } diff --git a/src/fr/neatmonster/nocheatplus/checks/moving/NoFall.java b/src/fr/neatmonster/nocheatplus/checks/moving/NoFall.java index 9380ed9a..2f90c077 100644 --- a/src/fr/neatmonster/nocheatplus/checks/moving/NoFall.java +++ b/src/fr/neatmonster/nocheatplus/checks/moving/NoFall.java @@ -151,6 +151,22 @@ public class NoFall extends Check { } } + + /** + * Quit or kick: adjust fall distance if necessary. + * @param player + */ + public void onLeave(final Player player) { + final MovingData data = MovingData.getData(player); + final float fallDistance = player.getFallDistance(); + if (data.noFallFallDistance - fallDistance > 0){ + // Might use tolerance, might log, might use method (compare: MovingListener.onEntityDamage). + // Might consider triggering violations here as well. + final float yDiff = (float) (data.noFallMaxY - player.getLocation().getY()); + final float maxDist = Math.max(yDiff, Math.max(data.noFallFallDistance, fallDistance)); + player.setFallDistance(maxDist); + } + } @Override protected Map getParameterMap(final ViolationData violationData) {