С чего бы вдруг я безнадежен? Ооlaz2727 написал(а):*sigh* он безнадежен.
А любой античит легко обходится - говорю как читер со стажем. Либо сильно мешается даже честным игрокам и съедает канал/лагает.
Понятное дело.Oldestkon написал(а):Если ты закодишь на стороне сервера в виде проверок - безусловно.
Клиент можешь весь перелопатить, всё равно обойдут.
int i;
int lastCheckPosX = 0;
int lastCheckPosZ = 0;
@ForgeSubscribe
public void detect(PlayerEvent event) {
i++;
if(i == 20) {
int playerSpeed = (int) Math.hypot(event.entityPlayer.posX - lastCheckPosX, event.entityPlayer.posZ - lastCheckPosZ);
this.i = 0;
lastCheckPosX = (int) event.entityPlayer.posX;
lastCheckPosZ = (int) event.entityPlayer.posZ;
System.out.println(playerSpeed + " б/с");
}
}
2014-05-14 21:15:32 [INFO] [STDOUT] 180 б/с
2014-05-14 21:15:32 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:33 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:33 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:34 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:34 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:35 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:35 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:36 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:36 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:37 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:37 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:38 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:38 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:39 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:39 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:40 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:40 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:41 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:41 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:42 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:42 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:43 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:43 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:44 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:44 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:45 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:45 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:46 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:46 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:47 [INFO] [STDOUT] 3 б/с
2014-05-14 21:15:47 [INFO] [STDOUT] 2 б/с
2014-05-14 21:15:47 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:47 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:47 [INFO] [STDOUT] 0 б/с
2014-05-14 21:15:47 [INFO] [STDOUT] 0 б/с
Теперь в курсе. В таком случае, какой эвент стоит ловить?anti344 написал(а):PlayerEvent - а ты в курсе, что его вообще нельзя применять и он используется только для наследования?
LivingUpdateEvent имеется в виду? В таком случае придется делать проверку - "игрок ли это?".f1rSt1k написал(а):Апдейт?
int second = 0;
int lastCheckPosX = 0;
int lastCheckPosY = 0;
int lastCheckPosZ = 0;
@ForgeSubscribe
public void detect(LivingUpdateEvent event) {
second++;
if(event.entityLiving instanceof EntityPlayer) {
if(second >= 20) {
int playerSpeed = (int) Math.hypot(event.entity.posX - lastCheckPosX, event.entity.posZ - lastCheckPosZ);
this.second = 0;
if(playerSpeed > 4) {
event.entity.moveEntity(lastCheckPosX, lastCheckPosY, lastCheckPosZ);
}
this.lastCheckPosX = (int) event.entity.posX;
this.lastCheckPosY = (int) event.entity.posY;
this.lastCheckPosZ = (int) event.entity.posZ;
System.out.println(playerSpeed + " б/с");
}
}
}
double lastCheckPosX = 0;
double lastCheckPosY = 0;
double lastCheckPosZ = 0;
@ForgeSubscribe
public void detect(LivingUpdateEvent event) {
if(event.entityLiving instanceof EntityPlayer) {
if(event.entity.ticksExisted % 20 == 0) {
double playerSpeed = Math.hypot(event.entityLiving.posX - lastCheckPosX, event.entityLiving.posZ - lastCheckPosZ);
if(playerSpeed > 5 && lastCheckPosX != 0) {
event.entityLiving.setPositionAndUpdate(lastCheckPosX, lastCheckPosY, lastCheckPosZ);
}
this.lastCheckPosX = event.entityLiving.posX;
this.lastCheckPosY = event.entityLiving.posY;
this.lastCheckPosZ = event.entityLiving.posZ;
System.out.println(playerSpeed + " б/с");
}
}
}
2014-05-15 21:44:44 [INFO] [STDOUT] 4.57196193038274 б/с
2014-05-15 21:44:44 [INFO] [STDOUT] 0.7770687785141961 б/с
2014-05-15 21:44:45 [INFO] [STDOUT] 3.5332627392199267 б/с
2014-05-15 21:44:45 [INFO] [STDOUT] 0.7763990955936748 б/с
2014-05-15 21:44:46 [INFO] [STDOUT] 1.3951407912824771 б/с
2014-05-15 21:44:46 [INFO] [STDOUT] 0.7288671818938802 б/с
2014-05-15 21:44:47 [INFO] [STDOUT] 4.232973499506465 б/с
2014-05-15 21:44:47 [INFO] [STDOUT] 0.7345270194473649 б/с
2014-05-15 21:44:48 [INFO] [STDOUT] 4.219651380380143 б/с
2014-05-15 21:44:48 [INFO] [STDOUT] 0.7766274465255173 б/с
2014-05-15 21:44:49 [INFO] [STDOUT] 4.4031428558194445 б/с
2014-05-15 21:44:49 [INFO] [STDOUT] 0.7770393387175991 б/с
2014-05-15 21:44:50 [INFO] [STDOUT] 4.403222931896684 б/с
2014-05-15 21:44:50 [INFO] [STDOUT] 0.777039341001186 б/с
2014-05-15 21:44:51 [INFO] [STDOUT] 4.4032229323400545 б/с
2014-05-15 21:44:51 [INFO] [STDOUT] 0.777039341001186 б/с
2014-05-15 21:44:52 [INFO] [STDOUT] 4.229291095867176 б/с
2014-05-15 21:44:52 [INFO] [STDOUT] 0.7741894882428515 б/с
2014-05-15 21:44:53 [INFO] [STDOUT] 2.504367209637355 б/с
2014-05-15 21:44:53 [INFO] [STDOUT] 0.7294902570530382 б/с
2014-05-15 21:44:54 [INFO] [STDOUT] 4.177336481611203 б/с
2014-05-15 21:44:54 [INFO] [STDOUT] 0.726948439472229 б/с
Агась, спасибо.dimka написал(а):Как можно заметить, в лог информация выводится два раза в секунду, хотя
Код:(event.entity.ticksExisted % 20 == 0)
должен обеспечивать вывод только 1 раз в секунду
значит эти выводы - клиент/сервер
=> надо добавить проверку на то что мир игрока серверный.
double lastCheckPosX = 0;
double lastCheckPosY = 0;
double lastCheckPosZ = 0;
@ForgeSubscribe
public void detect(LivingUpdateEvent event) {
if(event.entityLiving.worldObj.isRemote) {
if(event.entityLiving instanceof EntityPlayer) {
if(event.entity.ticksExisted % 20 == 0) {
double playerSpeed = Math.hypot(event.entityLiving.posX - lastCheckPosX, event.entityLiving.posZ - lastCheckPosZ);
if(playerSpeed > 7.3 && lastCheckPosX != 0 && event.entityLiving.worldObj.getBlockId((int)event.entityLiving.posX, (int)event.entityLiving.posY-1, (int)event.entityLiving.posZ) != Block.ice.blockID && event.entityLiving.worldObj.getBlockId((int)event.entityLiving.posX, (int)event.entityLiving.posY-2, (int)event.entityLiving.posZ) != Block.ice.blockID && event.entityLiving.worldObj.getBlockId((int)event.entityLiving.posX, (int)event.entityLiving.posY-3, (int)event.entityLiving.posZ) != Block.ice.blockID) {
event.entityLiving.setPositionAndUpdate(lastCheckPosX, lastCheckPosY, lastCheckPosZ);
}
this.lastCheckPosX = event.entityLiving.posX;
this.lastCheckPosY = event.entityLiving.posY;
this.lastCheckPosZ = event.entityLiving.posZ;
System.out.println(playerSpeed + " б/с");
}
}
}
}
Ну окей, сяп за пожеланияf1rSt1k написал(а):Сделай переменных, код реально не читаем)
Критика:Try4W написал(а):Как-то так. Если я ничего не забыл - это полноценный анти-спидхак для ванильного кубача.
Ссылка
p.s. - Прошу критики
Сделаем.Oldestkon написал(а):Не учтены:
- Паутина.
А оно нужно? Я просто не хочу сильно условий городить.- Вода\Лава.
Опять же, просто сделать, но это ещё 1 условие на тик каждого игрока.- Песок душ.
Учтено, брал максимальную скорость распрыжки.- Прыжки на льду, заметно ускоряют игрока.
Не на столько важно, чтобы делать отдельно условие, как по мне)- Отравление\игрок горит (игрока дергает и он снижает скорость)
Если не продавать на сервере имбо-мечи, это и не нужно. Разве, что сделать для дракона отдельную проверку.- Кнокбаки (чары\стрелы\меч\мобы)
Кстати да, сделаем.- Эндер жемчуг
Есть идеи, мб альтернатива какая-нибудь?Ещё слишком тяжелый по нагрузке метод по проверке льда.