-
Автор темы
- #1
ПВП:
Есть много способов определить, играет ли игрок с читами во время ПВП;
Некоторые современные античиты проверяют ваш яв/скорость питча, ускорение, рандомизацию, GCD и тд.
- Combat rotation Speed :
Они будут смотреть если у вас есть постоянная скорость вращения в течение нескольких тиков (если у вас есть быстрое вращение)
Пример:
это задетектит если скорость разницы ява слишком похожа.
- Combat rotation Randomization:
Есть некоторые античиты, которые будут проверять разницу между явом + питчом и будут смотреть если у вас слишком высокая скорость ява без достаточного перемещения питча.
- Rotation GCD:
Теперь мы подойдем к забавной части, где будут в детекте все пастед киллауры 2015 года.
Майнкрафт обычно получает из питча наибольший общий делитель (находится в EntityRenderer#getMouseOver). Существуют античиты, которые перестраивают ваш gcd на стороне сервера и определяют, есть ли у вас недопустимая чувствительность/десятичные числа.
как его вычисляют античиты:
Как античиты используют его для обнаружения вашей неверной ротации:
---------------------------------------
Я закину вам спойлер расширенной проверки, которой нет ни у кого, потому что большинство пастед античитов не могут синхронизировать цель с вашим собственным пингом, чтобы иметь 0 различий между тем, что видит игрок и сервер.
Большинство людей использовали ротацию зомби из майнкрафта, так проверили это, во-первых, это было бесполезно, пока парень не попытался синхронизировать целевую позицию с точным пингом игрока, которого проверял античит.
Я не буду углубляться в это, но оставлю вам хороший пример
Movement:
здесь мы попадаем на территорию мозга, где большинство людей болтают о том, как обойти анти-чит, они дают советы которые даже не будут работать в 2017 античитах в 2022 году)))
Старый добрый MotionX/Z (SpeedHack, он же movement)
В 2022 есть какие-то античиты, которые полностью перестроили движок движения майнкрафта в свой античит и просто ищут отличия, если будут отличия 0.0001, вы провалите проверку
Другие методы:
Некоторые люди не хотели внедрять код майна в свой античит либо потому, что они не могут, потому что у них есть мусорная система синхронизации плеера, либо они слишком ленивы.
Например, есть проверки на трение в воздухе, по умолчанию в майнкрафте вы будете двигаться в воздухе примерно на 2% медленнее за тик, люди написали проверки, которые учитывают это, например:
MotionY, также известный как funny fly/glide ;
То же самое и выше, некоторые люди внедрили весь движок майна в свои античиты, а некоторые нет.
Почти все античиты предсказывают ваше движение Y, в EntityLivingBase майнкрафта вас будет тянуть вниз гравитация * 0,98 и фиксированное движение Y 0,08
Как античиты обнаруживают, что у вас аномальное движение Y:
Есть много способов определить, играет ли игрок с читами во время ПВП;
Некоторые современные античиты проверяют ваш яв/скорость питча, ускорение, рандомизацию, GCD и тд.
- Combat rotation Speed :
Они будут смотреть если у вас есть постоянная скорость вращения в течение нескольких тиков (если у вас есть быстрое вращение)
Пример:
Код:
private final Buffer sameYawStreak = new Buffer(80);
private final Buffer sameYawStreakHighYaw = new Buffer(20);
private final Buffer outOfStepStreak = new Buffer(5);
private double lastYaw, lastYawDelta, lastYawAccel;
private long possibleLag;
private final Deque<Double> samples = Lists.newLinkedList();
private final Deque<Double> finals = Lists.newLinkedList();
@override
public void handle(WrappedPacket packet) {
if (packet instanceof CPacketFlying) {
CPacketFlying wrapper = (CPacketFlying) packet;
if (wrapper.isRotation()) {
double yaw = wrapper.getYaw();
double yawDelta = Math.abs(yaw - lastYaw);
double yawAccel = Math.abs(yawDelta - lastYawDelta);
boolean isSame = (yawDelta == lastYawDelta);
if(yawDelta >= 2 && yawDelta <= 10 && lastYawDelta >= 2 && lastYawDelta <= 10){
if(samples.size() <= 40){
samples.add(yawDelta);
}
if(finals.size() <= 40){
finals.add(lastYawDelta);
}
if(finals.size() >= 40 && samples.size() >= 40){
double avgYawDelta = MathUtil.getAverage(samples);
double lastAvgYawDelta = MathUtil.getAverage(finals);
double dif = Math.abs(avgYawDelta - lastAvgYawDelta);
if(dif <= 0.01f){
fail("Too consistent average yaw speed=" + dif + " avy:" + avgYawDelta + " Lavy" + lastAvgYawDelta);
}
if(dif >= 0.8f) {
outOfStepStreak.add();
if (outOfStepStreak.getValue() >= 2) {
fail("Average yaw speed is out of step=" + dif + " avy:" + avgYawDelta + " Lavy" + lastAvgYawDelta);
}
}else{
outOfStepStreak.reduce(0.5f);
}
finals.clear();
samples.clear();
}
}
lastYaw = yaw;
lastYawDelta = yawDelta;
lastYawAccel = yawAccel;
}
}
}
это задетектит если скорость разницы ява слишком похожа.
- Combat rotation Randomization:
Есть некоторые античиты, которые будут проверять разницу между явом + питчом и будут смотреть если у вас слишком высокая скорость ява без достаточного перемещения питча.
Код:
@override
public void handle(WrappedPacket packet) {
if (packet instanceof CPacketFlying) {
CPacketFlying wrapper = (CPacketFlying) packet;
if (wrapper.isRotation()) {
double yaw = wrapper.getYaw();
double pitch = wrapper.getPitch();
double pitchDelta = Math.abs(pitch - lastPitch);
double yawDelta = Math.abs(yaw - lastYaw);
double yawAccel = Math.abs(yawDelta - lastYawDelta);
//Check for invalid flicking rotations
if(Math.abs(pitch) <= 88){
if(yawDelta >= 10 && pitchDelta <= 1E-6){ //1E-6 = 0.000001
streak.add();
if(streak.getValue() >= 20){
fail("Has impossible rotation differences");
}
}else{
streak.reduce(2);
}
}
//debug code
if(yawDelta > 1 && yawAccel > 0 && yawDelta <= 30) { //2.3
if(samples.size() <= 120){
samples.add(yawAccel);
}else{
if(finals.size() <= 5){
finals.add((double) MathUtil.getGraph(samples).getPositives());
}else{
//kurt < 0
/*Bukkit.broadcastMessage("avg" + MathUtil.getAverage(finals));
Bukkit.broadcastMessage("devit" + MathUtil.deviation(finals));
Bukkit.broadcastMessage("kurt" + MathUtil.kurtosis(finals));
Bukkit.broadcastMessage("med" + MathUtil.median(finals));
Bukkit.broadcastMessage("GRAPH:" + MathUtil.getGraph(samples).getGraph());
*/
finals.clear();
/* Bukkit.broadcastMessage("GRAPH:" + MathUtil.getGraph(samples).getGraph());
Bukkit.broadcastMessage("POSITIVES: " + MathUtil.getGraph(samples).getPositives());
Bukkit.broadcastMessage("NEGATIVES: " + MathUtil.getGraph(samples).getNegatives());*/
}
samples.clear();
}
/*Bukkit.broadcastMessage("------");
Bukkit.broadcastMessage("YAW ACCEL:" + yawAccel);
Bukkit.broadcastMessage("YAW DELTA:" + yawDelta);
Bukkit.broadcastMessage("------");*/
}
lastPitch = pitch;
lastYaw = yaw;
lastYawDelta = yawDelta;
lastYawAccel = yawAccel;
}
}
}
- Rotation GCD:
Теперь мы подойдем к забавной части, где будут в детекте все пастед киллауры 2015 года.
Майнкрафт обычно получает из питча наибольший общий делитель (находится в EntityRenderer#getMouseOver). Существуют античиты, которые перестраивают ваш gcd на стороне сервера и определяют, есть ли у вас недопустимая чувствительность/десятичные числа.
как его вычисляют античиты:
Код:
public void update(PlayerLocation to, PlayerLocation from) {
// Get the rotation deltas.
float deltaYaw = Math.abs(to.getYaw() - from.getYaw());
float deltaPitch = Math.abs(to.getPitch() - from.getPitch());
float joltYaw = Math.abs(deltaYaw - this.lastYawDelta);
float joltPitch = Math.abs(deltaPitch - this.lastPitchDelta);
// Make sure the player is rotating.
if (to.getYaw() != from.getYaw() || to.getPitch() != from.getPitch()) {
if(deltaPitch > 0 && deltaPitch < 30) {
handleCinematic(joltYaw, joltPitch);
final float gcd = (float) MathUtil.gcd(deltaPitch, this.lastPitchDelta);
final double sensitivityModifier = Math.cbrt(0.8333 * gcd);
final double sensitivityStepTwo = (sensitivityModifier / 0.6) - 0.3333;
final double finalSensitivity = sensitivityStepTwo * 200;
this.finalSensitivity = finalSensitivity;
this.sensitivitySamples.add((int) finalSensitivity);
if (this.sensitivitySamples.size() >= 40) {
this.sensitivity = (MathUtil.getMode(this.sensitivitySamples)).floatValue();
final float gcdOne = (float) ((this.sensitivity / 200F) * 0.6F + 0.2F);
this.gcd = (gcdOne * gcdOne * gcdOne * 1.2F);
this.processed = true;
this.sensitivitySamples.clear();
}
}
this.lastPitchDelta = deltaPitch;
this.lastYawDelta = deltaYaw;
this.lastJoltYaw = joltYaw;
this.lastJoltPitch = joltPitch;
if (processed) {
for (RotationHandler check : data.getCheckManager().getRotationChecks())
check.handle(to, from);
}
}
}
MATHUTIL:
public Number getMode(Collection<? extends Number> samples) {
Map<Number, Integer> frequencies = new HashMap<>();
samples.forEach(i -> frequencies.put(i, frequencies.getOrDefault(i, 0) + 1));
Number mode = null;
int highest = 0;
for (var entry : frequencies.entrySet()) {
if (entry.getValue() > highest) {
mode = entry.getKey();
highest = entry.getValue();
}
}
return mode;
}
Как античиты используют его для обнаружения вашей неверной ротации:
Код:
if(mouseTracker.getSensitivity() <= -1 || mouseTracker.getSensitivity() > 201){
this.fail(mouseTracker.getSensitivity() + "%");
}
---------------------------------------
Я закину вам спойлер расширенной проверки, которой нет ни у кого, потому что большинство пастед античитов не могут синхронизировать цель с вашим собственным пингом, чтобы иметь 0 различий между тем, что видит игрок и сервер.
Большинство людей использовали ротацию зомби из майнкрафта, так проверили это, во-первых, это было бесполезно, пока парень не попытался синхронизировать целевую позицию с точным пингом игрока, которого проверял античит.
Я не буду углубляться в это, но оставлю вам хороший пример
Пожалуйста, авторизуйтесь для просмотра ссылки.
Movement:
здесь мы попадаем на территорию мозга, где большинство людей болтают о том, как обойти анти-чит, они дают советы которые даже не будут работать в 2017 античитах в 2022 году)))
Старый добрый MotionX/Z (SpeedHack, он же movement)
В 2022 есть какие-то античиты, которые полностью перестроили движок движения майнкрафта в свой античит и просто ищут отличия, если будут отличия 0.0001, вы провалите проверку
Другие методы:
Некоторые люди не хотели внедрять код майна в свой античит либо потому, что они не могут, потому что у них есть мусорная система синхронизации плеера, либо они слишком ленивы.
Например, есть проверки на трение в воздухе, по умолчанию в майнкрафте вы будете двигаться в воздухе примерно на 2% медленнее за тик, люди написали проверки, которые учитывают это, например:
Код:
double deltaXZ = user.getMovementProcessor().getDeltaXZ();
double lastDeltaXZ = user.getMovementProcessor().getLastDeltaXZ();
double prediction = lastDeltaXZ * 0.91F+ 0.026F;
if (user.getCombatProcessor().getVelocityTicks() >= 1 && user.getCombatProcessor().getVelocityTicks() <= 8) {
if (user.getActionProcessor().getVelocityTimer().hasNotPassed(10
+ user.getConnectionProcessor().getClientTick())) {
prediction += user.getCombatProcessor().getVelocityHNoTrans();
}
}
double motionXZ = deltaXZ - prediction;
if (!user.getMovementProcessor().isOnGround() && !user.getMovementProcessor().isLastGround()) {
if (motionXZ > 0.001 && deltaXZ > 0.2) {
if (++threshold > 1) {
flag(user, "Modifying air speed", "mxz="+motionXZ);
}
} else {
threshold -= Math.min(threshold, 0.00000001);
}
}
MotionY, также известный как funny fly/glide ;
То же самое и выше, некоторые люди внедрили весь движок майна в свои античиты, а некоторые нет.
Почти все античиты предсказывают ваше движение Y, в EntityLivingBase майнкрафта вас будет тянуть вниз гравитация * 0,98 и фиксированное движение Y 0,08
Как античиты обнаруживают, что у вас аномальное движение Y:
Код:
@override
public void onPacket(PacketEvent event) {
User user = event.getUser();
switch (event.getType()) {
case Packet.Client.FLYING:
case Packet.Client.LOOK:
case Packet.Client.POSITION_LOOK:
case Packet.Client.POSITION: {
// Bukkit.broadcastMessage(""+user.getBlockData().nearWater);
if (user.shouldCancel()
|| user.getActionProcessor().getServerPositionTimer().hasNotPassed(3)
|| user.getLastTeleportTimer().hasNotPassed(20)
|| user.getMovementProcessor().isBouncedOnSlime()
|| user.getVehicleTicks() > 0
|| EntityUtil.isOnBoat(user)
|| user.getLastBlockPlaceCancelTimer().hasNotPassed(3)
|| user.getBlockData().webTicks > 0
|| user.getBlockData().cakeTicks > 0
|| user.getBlockData().climbableTicks > 0
|| user.getBlockData().stairTicks > 0
|| user.getBlockData().slabTicks > 0
|| user.getLastBlockPlaceTimer().hasNotPassed(3)
|| user.getBlockData().underBlockTicks > 0
|| user.getBlockData().waterTicks > 0
|| user.getBlockData().lavaTicks > 0
|| user.getBlockData().door
|| !user.isChunkLoaded()
|| user.getMovementProcessor().getDeltaXZ() < 0.2
&& user.getPotionProcessor().getJumpTicks() > 0
|| user.getActionProcessor().getVelocityTimer().hasNotPassed(9)
&& user.getLastFallDamageTimer().passed(20)
|| user.getTick() < 60) {
threshold = 0;
return;
}
double deltaY = user.getMovementProcessor().getDeltaY();
double lastDeltaY = user.getMovementProcessor().getLastDeltaY();
double gravity = 0.9800000190734863D;
double fallMotion = 0.08D;
double prediction = (lastDeltaY - fallMotion) * gravity;
if (!user.getMovementProcessor().isOnGround()
&& user.getMovementProcessor().isLastGround() && deltaY > 0.0) {
prediction = 0.42F + (user.getPotionProcessor().getJumpAmplifier() * 0.1F);
}
double totalUp = Math.abs(deltaY - prediction);
double max = 0.005;
if (!user.getMovementProcessor().isOnGround() && !user.getMovementProcessor().isLastGround()) {
if (totalUp > max && Math.abs(prediction) > max) {
if (++threshold > 1) {
flag(user, "Invalid motion prediction", "t="+totalUp + " y="+deltaY + " p="+prediction);
}
} else {
threshold -= Math.min(threshold, 0.0000001f);
}
}
}
}