mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-10-06 10:27:26 +02:00
Treat small range teleports differently. [Ticket: BukkitDev-452]
This commit is contained in:
parent
ac048474b7
commit
62102c7d8b
@ -828,25 +828,55 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
|||||||
data.onSetBack(teleported);
|
data.onSetBack(teleported);
|
||||||
} else {
|
} else {
|
||||||
// Only if it wasn't NoCheatPlus, drop data from more packets check.
|
// Only if it wasn't NoCheatPlus, drop data from more packets check.
|
||||||
if (!event.isCancelled()){
|
if (to != null && !event.isCancelled()){
|
||||||
// Normal teleport.
|
// Normal teleport.
|
||||||
ref = to;
|
|
||||||
double fallDistance = data.noFallFallDistance;
|
// Detect small distance teleports.
|
||||||
data.clearMorePacketsData();
|
boolean smallRange = false;
|
||||||
data.clearFlyData();
|
|
||||||
data.resetPositions(to);
|
final double margin = 0.1;
|
||||||
data.setSetBack(to);
|
final Location from = event.getFrom();
|
||||||
// TODO: How to account for plugins that reset the fall distance here?
|
|
||||||
if (fallDistance > 1.0 && fallDistance - player.getFallDistance() > 0.0){
|
if (event.getCause() == TeleportCause.UNKNOWN){
|
||||||
// Reset fall distance if set so in the config.
|
// Check special small range teleports (moved too quickly).
|
||||||
if (!MovingConfig.getConfig(player).noFallTpReset){
|
if (from != null && from.getWorld().equals(to.getWorld())){
|
||||||
// (Set fall distance if set to not reset.)
|
if (CheckUtils.distance(from, to) < margin){
|
||||||
player.setFallDistance((float) fallDistance);
|
smallRange = true;
|
||||||
|
}
|
||||||
|
else if (data.toX != Double.MAX_VALUE && data.hasSetBack()){
|
||||||
|
final Location setBack = data.getSetBack(to);
|
||||||
|
if (CheckUtils.distance(to.getX(), to.getY(), to.getZ(), setBack.getX(), setBack.getY(), setBack.getZ()) < margin){
|
||||||
|
smallRange = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (event.getCause() == TeleportCause.ENDER_PEARL){
|
|
||||||
// Prevent NoFall violations for ender-pearls.
|
if (smallRange){
|
||||||
data.noFallSkipAirCheck = true;
|
// Very small range teleport, keep set back etc.
|
||||||
|
ref = to;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// "real" teleport
|
||||||
|
ref = to;
|
||||||
|
double fallDistance = data.noFallFallDistance;
|
||||||
|
data.clearMorePacketsData();
|
||||||
|
data.clearFlyData();
|
||||||
|
data.resetPositions(to);
|
||||||
|
data.setSetBack(to);
|
||||||
|
// TODO: How to account for plugins that reset the fall distance here?
|
||||||
|
if (fallDistance > 1.0 && fallDistance - player.getFallDistance() > 0.0){
|
||||||
|
// Reset fall distance if set so in the config.
|
||||||
|
if (!MovingConfig.getConfig(player).noFallTpReset){
|
||||||
|
// (Set fall distance if set to not reset.)
|
||||||
|
player.setFallDistance((float) fallDistance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (event.getCause() == TeleportCause.ENDER_PEARL){
|
||||||
|
// Prevent NoFall violations for ender-pearls.
|
||||||
|
data.noFallSkipAirCheck = true;
|
||||||
|
}
|
||||||
|
data.sfHoverTicks = -1; // Important against concurrent modification exception.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -860,8 +890,8 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
|
|||||||
// Reset stuff.
|
// Reset stuff.
|
||||||
Combined.resetYawRate(player, ref.getYaw(), System.currentTimeMillis(), true);
|
Combined.resetYawRate(player, ref.getYaw(), System.currentTimeMillis(), true);
|
||||||
data.resetTeleported();
|
data.resetTeleported();
|
||||||
|
// Prevent further moving processing for nested events.
|
||||||
processingEvents.remove(player.getName());
|
processingEvents.remove(player.getName());
|
||||||
data.sfHoverTicks = -1; // Important against concurrent modification exception.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user