mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-09-27 14:13:11 +02:00
Spaces + some formatting.
This commit is contained in:
parent
cc066292c8
commit
32589987c9
@ -25,184 +25,208 @@ import fr.neatmonster.nocheatplus.utilities.TickTask;
|
||||
*
|
||||
*/
|
||||
public class Combined {
|
||||
|
||||
/** All hits within this angle range are regarded as stationary. */
|
||||
private static float stationary = 32f;
|
||||
|
||||
/**
|
||||
* Check if a penalty is set by changing horizontal facing dierection too often.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
* @return
|
||||
*/
|
||||
public static final boolean checkYawRate(final Player player, final float yaw, final long now, final String worldName){
|
||||
return checkYawRate(player, yaw, now, worldName, CombinedData.getData(player));
|
||||
}
|
||||
|
||||
/**
|
||||
* Feed horizontal facing direction.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
*/
|
||||
public static final void feedYawRate(final Player player, final float yaw, final long now, final String worldName){
|
||||
feedYawRate(player, yaw, now, worldName, CombinedData.getData(player));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the yaw change data.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
* @param data
|
||||
*/
|
||||
public static final void feedYawRate(final Player player, float yaw, final long now, final String worldName, final CombinedData data) {
|
||||
// Reset on world change or timeout.
|
||||
|
||||
// Ensure the yaw is within bounds.
|
||||
if (yaw <= -360f) yaw = -((-yaw) % 360f);
|
||||
else if (yaw >= 360f) yaw = yaw % 360f;
|
||||
|
||||
// Timeout, world change.
|
||||
if (now - data.lastYawTime > 999 || !worldName.equals(data.lastWorld)){
|
||||
data.lastYaw = yaw;
|
||||
data.sumYaw = 0f;
|
||||
data.lastYawTime = now;
|
||||
data.lastWorld = worldName;
|
||||
}
|
||||
|
||||
// Ensure difference is between -180, 180 (shortest used).
|
||||
float yawDiff = data.lastYaw - yaw;
|
||||
if (yawDiff < -180f) yawDiff += 360f;
|
||||
else if (yawDiff > 180f) yawDiff -= 360f;
|
||||
|
||||
final long elapsed = now - data.lastYawTime;
|
||||
|
||||
// Set data to current state.
|
||||
data.lastYaw = yaw;
|
||||
data.lastYawTime = now;
|
||||
|
||||
final float dAbs = Math.abs(yawDiff);
|
||||
|
||||
// Skip adding small changes.
|
||||
if (dAbs < stationary){
|
||||
// This could also be done by keeping a "stationaryYaw" and taking the distance to yaw.
|
||||
data.sumYaw += yawDiff;
|
||||
if (Math.abs(data.sumYaw) < stationary){
|
||||
// Still stationary, keep sum, add nothing.
|
||||
data.yawFreq.update(now);
|
||||
return;
|
||||
}
|
||||
else{
|
||||
// Reset.
|
||||
data.sumYaw = 0f;
|
||||
}
|
||||
}
|
||||
else data.sumYaw = 0f;
|
||||
|
||||
// Normalize yaw-change vs. elapsed time.
|
||||
final float dNorm = (float) dAbs / (float) (1 + elapsed);
|
||||
|
||||
data.yawFreq.add(now, dNorm);
|
||||
}
|
||||
|
||||
/**
|
||||
* This calls feedLastYaw and does nothing but set the freezing time to be used by whatever check.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
* @return
|
||||
*/
|
||||
public static final boolean checkYawRate(final Player player, final float yaw, final long now, final String worldName, final CombinedData data) {
|
||||
/** All hits within this angle range are regarded as stationary. */
|
||||
private static float stationary = 32f;
|
||||
|
||||
feedYawRate(player, yaw, now, worldName, data);
|
||||
|
||||
final CombinedConfig cc = CombinedConfig.getConfig(player);
|
||||
|
||||
final float threshold = cc.yawRate;
|
||||
|
||||
// Angle diff per second
|
||||
final float stScore = data.yawFreq.bucketScore(0) * 3f; // TODO: Better have it 2.5 with lower threshold ?
|
||||
final float stViol;
|
||||
if (stScore > threshold){
|
||||
// Account for server side lag.
|
||||
if (!cc.lag || TickTask.getLag(data.yawFreq.bucketDuration(), true) < 1.2){
|
||||
stViol = stScore;
|
||||
}
|
||||
else{
|
||||
stViol = 0;
|
||||
}
|
||||
}
|
||||
else{
|
||||
stViol = 0f;
|
||||
}
|
||||
final float fullScore = data.yawFreq.score(1f);
|
||||
final float fullViol;
|
||||
if (fullScore > threshold){
|
||||
// Account for server side lag.
|
||||
if (cc.lag){
|
||||
fullViol = fullScore / TickTask.getLag(data.yawFreq.bucketDuration() * data.yawFreq.numberOfBuckets(), true);
|
||||
}
|
||||
else{
|
||||
fullViol = fullScore;
|
||||
}
|
||||
}
|
||||
else{
|
||||
fullViol = 0;
|
||||
}
|
||||
final float total = Math.max(stViol, fullViol);
|
||||
|
||||
boolean cancel = false;
|
||||
if (total > threshold){
|
||||
// Add time
|
||||
final float amount = ((total - threshold) / threshold * 1000f);
|
||||
data.timeFreeze.applyPenalty(now, (long) Math.min(Math.max(cc.yawRatePenaltyFactor * amount , cc.yawRatePenaltyMin), cc.yawRatePenaltyMax));
|
||||
// TODO: balance (100 ... 200 ) ?
|
||||
if (cc.yawRateImprobable && Improbable.check(player, amount / 100f, now, "combined.yawrate"))
|
||||
cancel = true;
|
||||
}
|
||||
if (data.timeFreeze.isPenalty()){
|
||||
cancel = true;
|
||||
}
|
||||
return cancel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the yawrate data to yaw and time.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param time
|
||||
* @param clear If to clear yaws.
|
||||
*/
|
||||
public static final void resetYawRate(final Player player, float yaw, final long time, final boolean clear){
|
||||
if (yaw <= -360f) yaw = -((-yaw) % 360f);
|
||||
else if (yaw >= 360f) yaw = yaw % 360f;
|
||||
final CombinedData data = CombinedData.getData(player);
|
||||
data.lastYaw = yaw;
|
||||
data.lastYawTime = time; // TODO: One might set to some past-time to allow any move at first.
|
||||
data.sumYaw = 0;
|
||||
if (clear) data.yawFreq.clear(time);
|
||||
}
|
||||
/**
|
||||
* Check if a penalty is set by changing horizontal facing dierection too often.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
* @return
|
||||
*/
|
||||
public static final boolean checkYawRate(final Player player, final float yaw, final long now,
|
||||
final String worldName) {
|
||||
return checkYawRate(player, yaw, now, worldName, CombinedData.getData(player));
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow to pass a config flag if to check or only to feed.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
* @param yawRateCheck If to actually check the yaw rate, or just feed.
|
||||
* @return
|
||||
*/
|
||||
public static final boolean checkYawRate(final Player player, final float yaw, final long now, final String worldName, final boolean yawRateCheck) {
|
||||
if (yawRateCheck) return checkYawRate(player, yaw, now, worldName);
|
||||
else {
|
||||
feedYawRate(player, yaw, now, worldName);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Feed horizontal facing direction.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
*/
|
||||
public static final void feedYawRate(final Player player, final float yaw, final long now,
|
||||
final String worldName) {
|
||||
feedYawRate(player, yaw, now, worldName, CombinedData.getData(player));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the yaw change data.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
* @param data
|
||||
*/
|
||||
public static final void feedYawRate(final Player player, float yaw, final long now,
|
||||
final String worldName, final CombinedData data) {
|
||||
// Reset on world change or timeout.
|
||||
|
||||
// Ensure the yaw is within bounds.
|
||||
if (yaw <= -360f) {
|
||||
yaw = -((-yaw) % 360f);
|
||||
}
|
||||
else if (yaw >= 360f) {
|
||||
yaw = yaw % 360f;
|
||||
}
|
||||
|
||||
// Timeout, world change.
|
||||
if (now - data.lastYawTime > 999 || !worldName.equals(data.lastWorld)) {
|
||||
data.lastYaw = yaw;
|
||||
data.sumYaw = 0f;
|
||||
data.lastYawTime = now;
|
||||
data.lastWorld = worldName;
|
||||
}
|
||||
|
||||
// Ensure difference is between -180, 180 (shortest used).
|
||||
float yawDiff = data.lastYaw - yaw;
|
||||
if (yawDiff < -180f) {
|
||||
yawDiff += 360f;
|
||||
}
|
||||
else if (yawDiff > 180f) {
|
||||
yawDiff -= 360f;
|
||||
}
|
||||
|
||||
final long elapsed = now - data.lastYawTime;
|
||||
|
||||
// Set data to current state.
|
||||
data.lastYaw = yaw;
|
||||
data.lastYawTime = now;
|
||||
|
||||
final float dAbs = Math.abs(yawDiff);
|
||||
|
||||
// Skip adding small changes.
|
||||
if (dAbs < stationary) {
|
||||
// This could also be done by keeping a "stationaryYaw" and taking the distance to yaw.
|
||||
data.sumYaw += yawDiff;
|
||||
if (Math.abs(data.sumYaw) < stationary) {
|
||||
// Still stationary, keep sum, add nothing.
|
||||
data.yawFreq.update(now);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
// Reset.
|
||||
data.sumYaw = 0f;
|
||||
}
|
||||
}
|
||||
else {
|
||||
data.sumYaw = 0f;
|
||||
}
|
||||
|
||||
// Normalize yaw-change vs. elapsed time.
|
||||
final float dNorm = (float) dAbs / (float) (1 + elapsed);
|
||||
|
||||
data.yawFreq.add(now, dNorm);
|
||||
}
|
||||
|
||||
/**
|
||||
* This calls feedLastYaw and does nothing but set the freezing time to be used by whatever check.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
* @return
|
||||
*/
|
||||
public static final boolean checkYawRate(final Player player, final float yaw, final long now,
|
||||
final String worldName, final CombinedData data) {
|
||||
|
||||
feedYawRate(player, yaw, now, worldName, data);
|
||||
|
||||
final CombinedConfig cc = CombinedConfig.getConfig(player);
|
||||
|
||||
final float threshold = cc.yawRate;
|
||||
|
||||
// Angle diff per second
|
||||
final float stScore = data.yawFreq.bucketScore(0) * 3f; // TODO: Better have it 2.5 with lower threshold ?
|
||||
final float stViol;
|
||||
if (stScore > threshold) {
|
||||
// Account for server side lag.
|
||||
if (!cc.lag || TickTask.getLag(data.yawFreq.bucketDuration(), true) < 1.2) {
|
||||
stViol = stScore;
|
||||
}
|
||||
else {
|
||||
stViol = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
stViol = 0f;
|
||||
}
|
||||
final float fullScore = data.yawFreq.score(1f);
|
||||
final float fullViol;
|
||||
if (fullScore > threshold) {
|
||||
// Account for server side lag.
|
||||
if (cc.lag) {
|
||||
fullViol = fullScore / TickTask.getLag(data.yawFreq.bucketDuration() * data.yawFreq.numberOfBuckets(), true);
|
||||
}
|
||||
else {
|
||||
fullViol = fullScore;
|
||||
}
|
||||
}
|
||||
else {
|
||||
fullViol = 0;
|
||||
}
|
||||
final float total = Math.max(stViol, fullViol);
|
||||
|
||||
boolean cancel = false;
|
||||
if (total > threshold) {
|
||||
// Add time
|
||||
final float amount = ((total - threshold) / threshold * 1000f);
|
||||
data.timeFreeze.applyPenalty(now, (long) Math.min(
|
||||
Math.max(cc.yawRatePenaltyFactor * amount , cc.yawRatePenaltyMin),
|
||||
cc.yawRatePenaltyMax));
|
||||
// TODO: balance (100 ... 200 ) ?
|
||||
if (cc.yawRateImprobable && Improbable.check(player, amount / 100f, now, "combined.yawrate"))
|
||||
cancel = true;
|
||||
}
|
||||
if (data.timeFreeze.isPenalty()) {
|
||||
cancel = true;
|
||||
}
|
||||
return cancel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the yawrate data to yaw and time.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param time
|
||||
* @param clear If to clear yaws.
|
||||
*/
|
||||
public static final void resetYawRate(final Player player, float yaw, final long time, final boolean clear) {
|
||||
if (yaw <= -360f) {
|
||||
yaw = -((-yaw) % 360f);
|
||||
}
|
||||
else if (yaw >= 360f) {
|
||||
yaw = yaw % 360f;
|
||||
}
|
||||
final CombinedData data = CombinedData.getData(player);
|
||||
data.lastYaw = yaw;
|
||||
data.lastYawTime = time; // TODO: One might set to some past-time to allow any move at first.
|
||||
data.sumYaw = 0;
|
||||
if (clear) {
|
||||
data.yawFreq.clear(time);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow to pass a config flag if to check or only to feed.
|
||||
* @param player
|
||||
* @param yaw
|
||||
* @param now
|
||||
* @param worldName
|
||||
* @param yawRateCheck If to actually check the yaw rate, or just feed.
|
||||
* @return
|
||||
*/
|
||||
public static final boolean checkYawRate(final Player player, final float yaw, final long now, final String worldName, final boolean yawRateCheck) {
|
||||
if (yawRateCheck) {
|
||||
return checkYawRate(player, yaw, now, worldName);
|
||||
}
|
||||
else {
|
||||
feedYawRate(player, yaw, now, worldName);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user