mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2025-01-02 13:57:49 +01:00
Bleeding: Adjust keeping track of positions (from, preparatory: to).
Some corrections.
This commit is contained in:
parent
2764515190
commit
2e812f17f8
@ -84,8 +84,10 @@ public class MovingData extends ACheckData {
|
|||||||
public double verticalFreedom;
|
public double verticalFreedom;
|
||||||
public double verticalVelocity;
|
public double verticalVelocity;
|
||||||
public int verticalVelocityCounter;
|
public int verticalVelocityCounter;
|
||||||
|
/** Last from coordinates. */
|
||||||
|
public double fromX = Double.MAX_VALUE, fromY, fromZ;
|
||||||
/** Last to coordinates. */
|
/** Last to coordinates. */
|
||||||
public double fromX, fromY, fromZ, toY;
|
public double toX = Double.MAX_VALUE, toY, toZ;
|
||||||
|
|
||||||
// Data of the creative check.
|
// Data of the creative check.
|
||||||
public boolean creativeFlyPreviousRefused;
|
public boolean creativeFlyPreviousRefused;
|
||||||
@ -118,7 +120,7 @@ public class MovingData extends ACheckData {
|
|||||||
public int survivalFlyJumpPhase;
|
public int survivalFlyJumpPhase;
|
||||||
// public double survivalFlyLastFromY;
|
// public double survivalFlyLastFromY;
|
||||||
/** Last valid y distance covered by a move. Integer.MAX_VALUE indicates "not set". */
|
/** Last valid y distance covered by a move. Integer.MAX_VALUE indicates "not set". */
|
||||||
public double survivalFlyLastYDist = Integer.MAX_VALUE;
|
public double survivalFlyLastYDist = Double.MAX_VALUE;
|
||||||
public int survivalFlyOnIce;
|
public int survivalFlyOnIce;
|
||||||
public boolean survivalFlyWasInBed;
|
public boolean survivalFlyWasInBed;
|
||||||
public long survivalFlyCobwebTime;
|
public long survivalFlyCobwebTime;
|
||||||
@ -144,8 +146,8 @@ public class MovingData extends ACheckData {
|
|||||||
bunnyhopDelay = 0;
|
bunnyhopDelay = 0;
|
||||||
survivalFlyJumpPhase = 0;
|
survivalFlyJumpPhase = 0;
|
||||||
setBack = null;
|
setBack = null;
|
||||||
survivalFlyLastYDist = Integer.MAX_VALUE;
|
survivalFlyLastYDist = Double.MAX_VALUE;
|
||||||
fromX = Double.MAX_VALUE;
|
fromX = toX = Double.MAX_VALUE;
|
||||||
clearAccounting();
|
clearAccounting();
|
||||||
clearNoFallData();
|
clearNoFallData();
|
||||||
}
|
}
|
||||||
@ -174,4 +176,15 @@ public class MovingData extends ACheckData {
|
|||||||
noFallFallDistance = 0;
|
noFallFallDistance = 0;
|
||||||
noFallMaxY = 0D;
|
noFallMaxY = 0D;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resetPositions(final Location loc){
|
||||||
|
resetPositions(loc.getX(), loc.getY(), loc.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetPositions(final double x, final double y, final double z) {
|
||||||
|
fromX = toX = x;
|
||||||
|
fromY = toY = y;
|
||||||
|
fromZ = toZ = z;
|
||||||
|
survivalFlyLastYDist = Double.MAX_VALUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -322,8 +322,12 @@ public class MovingListener implements Listener {
|
|||||||
// plugin before we got it) or if the player is inside a vehicle.
|
// plugin before we got it) or if the player is inside a vehicle.
|
||||||
final Location from = event.getFrom();
|
final Location from = event.getFrom();
|
||||||
final Location to = event.getTo();
|
final Location to = event.getTo();
|
||||||
if (!from.getWorld().equals(to.getWorld()) || player.isInsideVehicle())
|
if (!from.getWorld().equals(to.getWorld()) || player.isInsideVehicle()){
|
||||||
|
// TODO: move somewhere else (monitor)
|
||||||
|
// TODO:
|
||||||
|
MovingData.getData(player).resetPositions(event.getTo());
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Use existent locations if possible.
|
// Use existent locations if possible.
|
||||||
final MoveInfo moveInfo;
|
final MoveInfo moveInfo;
|
||||||
@ -402,6 +406,13 @@ public class MovingListener implements Listener {
|
|||||||
// Remember where we send the player to.
|
// Remember where we send the player to.
|
||||||
data.teleported = newTo;
|
data.teleported = newTo;
|
||||||
}
|
}
|
||||||
|
// Set positions.
|
||||||
|
data.fromX = from.getX();
|
||||||
|
data.fromY = from.getY();
|
||||||
|
data.fromZ = from.getZ();
|
||||||
|
data.toX = to.getX();
|
||||||
|
data.toY = to.getY();
|
||||||
|
data.toZ = to.getZ();
|
||||||
// Cleanup.
|
// Cleanup.
|
||||||
moveInfo.cleanup();
|
moveInfo.cleanup();
|
||||||
parkedInfo.add(moveInfo);
|
parkedInfo.add(moveInfo);
|
||||||
@ -473,19 +484,33 @@ public class MovingListener implements Listener {
|
|||||||
*/
|
*/
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
final MovingData data = MovingData.getData(player);
|
final MovingData data = MovingData.getData(player);
|
||||||
|
|
||||||
|
final Location teleported = data.teleported;
|
||||||
|
|
||||||
// If it was a teleport initialized by NoCheatPlus, do it anyway even if another plugin said "no".
|
// If it was a teleport initialized by NoCheatPlus, do it anyway even if another plugin said "no".
|
||||||
if (data.teleported != null && data.teleported.equals(event.getTo()))
|
final Location to = event.getTo();
|
||||||
|
if (event.isCancelled() && teleported != null && data.teleported.equals(to)){
|
||||||
|
// TODO: even more strict enforcing ?
|
||||||
event.setCancelled(false);
|
event.setCancelled(false);
|
||||||
else
|
event.setTo(teleported);
|
||||||
|
event.setFrom(teleported);
|
||||||
|
data.clearFlyData();
|
||||||
|
data.resetPositions(teleported);
|
||||||
|
}
|
||||||
|
else{
|
||||||
// Only if it wasn't NoCheatPlus, drop data from more packets check. If it was NoCheatPlus, we don't
|
// Only if it wasn't NoCheatPlus, drop data from more packets check. If it was NoCheatPlus, we don't
|
||||||
// want players to exploit the fly check teleporting to get rid of the "morepackets" data.
|
// want players to exploit the fly check teleporting to get rid of the "morepackets" data.
|
||||||
|
// TODO: check if to do with cancelled teleports !
|
||||||
data.clearMorePacketsData();
|
data.clearMorePacketsData();
|
||||||
|
data.clearFlyData();
|
||||||
|
data.resetPositions(event.isCancelled() ? event.getFrom() : to);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Always drop data from fly checks, as it always loses its validity after teleports. Always!
|
// Always drop data from fly checks, as it always loses its validity after teleports. Always!
|
||||||
// TODO: NoFall might be necessary to be checked here ?
|
// TODO: NoFall might be necessary to be checked here ?
|
||||||
data.teleported = null;
|
data.teleported = null;
|
||||||
data.clearFlyData();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,10 +26,13 @@ public class Passable extends Check {
|
|||||||
// Allow moving into the same block.
|
// Allow moving into the same block.
|
||||||
if (from.isSameBlock(to)){
|
if (from.isSameBlock(to)){
|
||||||
if (!from.isPassable()){
|
if (!from.isPassable()){
|
||||||
|
|
||||||
// Only allow moving further out of the block (still allows going round in circles :p)
|
// Only allow moving further out of the block (still allows going round in circles :p)
|
||||||
|
// TODO: account for actual bounding box.
|
||||||
final Vector blockMiddle = new Vector(0.5 + from.getBlockX(), 0.5 + from.getBlockY(), 0.5 + from.getBlockZ());
|
final Vector blockMiddle = new Vector(0.5 + from.getBlockX(), 0.5 + from.getBlockY(), 0.5 + from.getBlockZ());
|
||||||
// TODO: Allow moving out of one block towards non-solid blocks (closest only ?).
|
// TODO: Allow moving out of one block towards non-solid blocks (closest only ?).
|
||||||
// TODO: Allow moving out of half steps ?
|
// TODO: Allow moving out of half steps ?
|
||||||
|
// TODO: Allow moving towards non solid blocks.
|
||||||
if (blockMiddle.distanceSquared(from.getVector()) < blockMiddle.distanceSquared(to.getVector())) {
|
if (blockMiddle.distanceSquared(from.getVector()) < blockMiddle.distanceSquared(to.getVector())) {
|
||||||
// Further check for the players location as possible set back.
|
// Further check for the players location as possible set back.
|
||||||
loc = player.getLocation();
|
loc = player.getLocation();
|
||||||
|
@ -277,7 +277,7 @@ public class SurvivalFly extends Check {
|
|||||||
data.survivalFlyJumpPhase = 0;
|
data.survivalFlyJumpPhase = 0;
|
||||||
data.setBack.setYaw(to.getYaw());
|
data.setBack.setYaw(to.getYaw());
|
||||||
data.setBack.setPitch(to.getPitch());
|
data.setBack.setPitch(to.getPitch());
|
||||||
data.survivalFlyLastYDist = Integer.MAX_VALUE;
|
data.survivalFlyLastYDist = Double.MAX_VALUE;
|
||||||
return data.setBack;
|
return data.setBack;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -359,7 +359,7 @@ public class SurvivalFly extends Check {
|
|||||||
vd.setParameter(ParameterName.DISTANCE, String.format(Locale.US, "%.2f", to.getLocation().distance(from.getLocation())));
|
vd.setParameter(ParameterName.DISTANCE, String.format(Locale.US, "%.2f", to.getLocation().distance(from.getLocation())));
|
||||||
}
|
}
|
||||||
if (executeActions(vd)){
|
if (executeActions(vd)){
|
||||||
data.survivalFlyLastYDist = Integer.MAX_VALUE;
|
data.survivalFlyLastYDist = Double.MAX_VALUE;
|
||||||
// Compose a new location based on coordinates of "newTo" and viewing direction of "event.getTo()" to
|
// Compose a new location based on coordinates of "newTo" and viewing direction of "event.getTo()" to
|
||||||
// allow the player to look somewhere else despite getting pulled back by NoCheatPlus.
|
// allow the player to look somewhere else despite getting pulled back by NoCheatPlus.
|
||||||
return new Location(player.getWorld(), data.setBack.getX(), data.setBack.getY(), data.setBack.getZ(),
|
return new Location(player.getWorld(), data.setBack.getX(), data.setBack.getY(), data.setBack.getZ(),
|
||||||
@ -381,10 +381,6 @@ public class SurvivalFly extends Check {
|
|||||||
data.clearAccounting();
|
data.clearAccounting();
|
||||||
}
|
}
|
||||||
data.survivalFlyLastYDist = yDistance;
|
data.survivalFlyLastYDist = yDistance;
|
||||||
data.fromX = from.getX();
|
|
||||||
data.fromY = from.getY();
|
|
||||||
data.fromZ = from.getZ();
|
|
||||||
data.toY = to.getY();
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user