[1.6.4] Игрок и его передвижение / Антиспидхак

905
5
*sigh* он безнадежен.
А любой античит легко обходится - говорю как читер со стажем. Либо сильно мешается даже честным игрокам и съедает канал/лагает.
 
675
2
laz2727 написал(а):
*sigh* он безнадежен.
А любой античит легко обходится - говорю как читер со стажем. Либо сильно мешается даже честным игрокам и съедает канал/лагает.
С чего бы вдруг я безнадежен? Оо

Тот же NoCheatPlus мешает разве что задержкой дамага после прыжка с большой высоты и вполне оправдывает нагрузку на сервер.
Обойти простенькое ограничение скорости с доп условиями для эффектов/тулзов/брони уже будет невозможно. С этого и начну пожалуй... Для меня это будет опыт в программировании - как минимум.
 
1,990
18
105
Если ты закодишь на стороне сервера в виде проверок - безусловно.
Клиент можешь весь перелопатить, всё равно обойдут.
 
675
2
Как-то так?
Код:
    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 б/с
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
PlayerEvent - а ты в курсе, что его вообще нельзя применять и он используется только для наследования?
 
675
2
anti344 написал(а):
PlayerEvent - а ты в курсе, что его вообще нельзя применять и он используется только для наследования?
Теперь в курсе. В таком случае, какой эвент стоит ловить?
 
675
2
f1rSt1k написал(а):
LivingUpdateEvent имеется в виду? В таком случае придется делать проверку - "игрок ли это?".
Каковы будут последствия, если я буду ловить и что-то делать в том же PlayerEvent?
 
675
2
Код:
    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 + " б/с");
            }
        }
        
    }

На сколько я понял, событие вызывается чаже, чем раз в тик.
Мб стоит все это дело в отдельный поток сунуть? Там по идее можно и таймер делать, и sleep'ом орудовать.
 
675
2
Периодически происходят скачки, скорость измеряется не равномерно. Хотя иду по чистому полю, ровно в одну сторону:
Код:
    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 б/с

В чем проблема?
 
60
0
Как можно заметить, в лог информация выводится два раза в секунду, хотя
Код:
(event.entity.ticksExisted % 20 == 0)

должен обеспечивать вывод только 1 раз в секунду
значит эти выводы - клиент/сервер
=> надо добавить проверку на то что мир игрока серверный.
 
675
2
dimka написал(а):
Как можно заметить, в лог информация выводится два раза в секунду, хотя
Код:
(event.entity.ticksExisted % 20 == 0)

должен обеспечивать вывод только 1 раз в секунду
значит эти выводы - клиент/сервер
=> надо добавить проверку на то что мир игрока серверный.
Агась, спасибо.
[merge_posts_bbcode]Добавлено: 16.05.2014 00:09:05[/merge_posts_bbcode]

Как-то так:
Код:
    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 + " б/с");
                }
            }
        }
        
    }
Попробую сделать что-нибудь, а потом кину сюда, во имя оценки моих каркасов из чистых условий.
 
771
5
Сделай переменных, код реально не читаем)
 
675
2
Как-то так. Если я ничего не забыл - это полноценный анти-спидхак для ванильного кубача.
Ссылка
p.s. - Прошу критики :)
 
1,990
18
105
Try4W написал(а):
Как-то так. Если я ничего не забыл - это полноценный анти-спидхак для ванильного кубача.
Ссылка
p.s. - Прошу критики :)
Критика:
Не учтены:
- Паутина.
- Вода\Лава.
- Песок душ.
- Прыжки на льду, заметно ускоряют игрока.
- Зелье медлительности
- Отравление\игрок горит (игрока дергает и он снижает скорость)
- Еда на бегу, натянутый лук на бегу. (клиенты хакают, ага)
- Кнокбаки (чары\стрелы\меч\мобы)
- Эндер жемчуг

Ещё слишком тяжелый по нагрузке метод по проверке льда.
Это что вспомнил сразу.
 
675
2
Oldestkon написал(а):
Не учтены:
- Паутина.
Сделаем.

А оно нужно? Я просто не хочу сильно условий городить.

Опять же, просто сделать, но это ещё 1 условие на тик каждого игрока.

- Прыжки на льду, заметно ускоряют игрока.
Учтено, брал максимальную скорость распрыжки.

- Отравление\игрок горит (игрока дергает и он снижает скорость)
Не на столько важно, чтобы делать отдельно условие, как по мне)

- Кнокбаки (чары\стрелы\меч\мобы)
Если не продавать на сервере имбо-мечи, это и не нужно. Разве, что сделать для дракона отдельную проверку.

Кстати да, сделаем.

Ещё слишком тяжелый по нагрузке метод по проверке льда.
Есть идеи, мб альтернатива какая-нибудь? 

Я думал о том, чтобы вывести все действия в отдельный поток, но т.к. я ничего не знаю о многопоточности, просто спрошу - это возможно?
 
Сверху