AntiGodMod
#1

Короче, сделал я этот античит и заметил, что опять разработчик сампа нам преподнёс ф-ию, про которую из-за своей баганутости можно забыть.
Речь пойдёт про новые ф-ии OnPlayerGiveDamag и OnPlayerTakeDamage.

Выкладываю весь античит, т.к. есть ложные срабатывания. Может общими мозгами получится доработать.
pawn Код:
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{   //вызывается когда игрок playerid наносит урон игроку damagedid

    if(playerid == INVALID_PLAYER_ID) return 1;//исключения на всякий случай
    if(damagedid == INVALID_PLAYER_ID) return 1;//исключения на всякий случай
    if(!ANTIGODMOD) return 1;//отбрасываем проверку кода, если Античит выключен
    if(GetPVarInt(damagedid, "IsPlayerControllable") != 0 ) return 1;//отбрасываем случаи  если игрок был замарожен
    if(amount < 2.0) return 1;//отбрасываем случаи ударов кулаком
    if(AFK_IdleTime[damagedid] >= 3) return 1;//отбрасываем случаи  если игрок был АФК

    //ИНФОРМИРОВАНИЕ
    new string[MAX_STRING];
    new Float:health; GetPlayerHealth(damagedid, health);
    format(string, sizeof(string), "%s give %.1f damage to %s, weapon: %s (LastHealth:%.1f)",
        PlayerName(playerid), amount, PlayerName(damagedid), WeaponName(weaponid),
        health);
    SendClientMessageToAll(COLOR_GREEN, string);

    WaitDetected[damagedid] = 2;//сделали задержку на 2 срабатывания проверки античита
    DetectedGiveDamage[damagedid] = floatround(amount);
    return 1;
}

public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid) //при год моде и АФК не вызывается
{  //вызывается когда игрок playerid получает урон от игрока issuerid
//всегда вызывается после OnPlayerGiveDamage
    if(playerid == INVALID_PLAYER_ID) return 1;
    if(issuerid == INVALID_PLAYER_ID) return 1;
    if(!ANTIGODMOD) return 1;
    if(amount < 2.0) return 1;
    //if(GetPVarInt(playerid, "IsPlayerControllable") != 0 ) return 1;//при замарозке не вызывается
    //if(AFK_IdleTime[playerid] >= 3) return 1;//при АФК не вызывается
   
    DetectedGiveDamage[playerid] = 0;//обнулили, проверка закончена. Игрок чист.

    //ИНФОРМИРОВАНИЕ
    new string[MAX_STRING];
    new Float:health; GetPlayerHealth(playerid, health);
    format(string, sizeof(string), "%s take %.1f damage from %s, weapon: %s (LastHealth:%.1f)",
        PlayerName(playerid), amount, PlayerName(issuerid), WeaponName(weaponid),
        health);
    SendClientMessageToAll(COLOR_RED, string);
    return 1;
}

//САМ АНТИЧИТ
public OnPlayerUpdate(playerid)
{
    WaitDetected[playerid]--;
    if(DetectedGiveDamage[playerid] != 0 && WaitDetected[playerid] <= 0)
    {
        new string[MAX_STRING];
        format(string, sizeof(string), "AdmWarning: %s[%d]. Подозрение на бессмертие (GiveDamage:%d)",
            PlayerName(playerid), playerid, DetectedGiveDamage[playerid]);
        SendAdminMessage(ADMINS_MESSAGE_COLOR, string, 3);
        DetectedGiveDamage[playerid] = 0;//останавливаем флуд в чат
        WaitDetected[playerid] = 0;
    }
    return 1;
}
Какие будут предложения?
Reply
#2

Повреждения может получить игрок с ид INVALID_PLAYER_ID, а нанести?
Reply
#3

INVALID_PLAYER_ID на всякий случай.
Лично не заметил, чтобы необходимость в них обоих была. Т.к. таких случаев не было.

Так как собейты покуда не пашут на новом сампе, т.е. не все.
То мы покуда не смогли проверить антифейккилл, чтобы узнать реагируют ли новые ф-ии на убийством фейккилом.
ДУмаю, что они нормально отработают как и public OnPlayerDeath(playerid, killerid, reason)
Reply
#4

А ты уверен что годмод работает по принципу блокировки наносимого урона?
Недочеты с поверхностного взгляда: нет связи между нанесенным уроном и тем кто его нанес.
Причем здесь вообще годмод и наносимый урон, урон может и наносится а человек будет бессмертен, смотри первое предложение.
Суть работы должна быть такая: нанесли урон, мы его запомнили, потом проверили здоровье игрока, если оно не изменилось на значение нанесенного урона, от предыдущего состояния - ты читер.
Reply
#5

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
А ты уверен что годмод работает по принципу блокировки наносимого урона?
Уверен. Я же это уже протестировал, а не просто выложил теоретический код.
OnPlayerTakeDamage не вызывается при год моде

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Недочеты с поверхностного взгляда: нет связи между нанесенным уроном и тем кто его нанес.
а зачем? ведь проверяем игрока в которого стреляют. И нам не важно кто. Зачем избыточный код?
Если нужен, ТО предложи вариант кода. Но я думаю ложных срабатываний меньше не станет.

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Причем здесь вообще годмод и наносимый урон, урон может и наносится а человек будет бессмертен, смотри первое предложение.
Суть работы должна быть такая: нанесли урон, мы его запомнили, потом проверили здоровье игрока, если оно не изменилось на значение нанесенного урона, от предыдущего состояния - ты читер.
Нет. Урон не наносится. ПРОВЕРЕНО.

Отнятое здоровье и урон могут отличаться на доли. Получения здоровья для проверки с кол-вом полученного урона можно сделать, но это не уменьшит ложные срабатывания. Т.к. они в основном предположительно из-за пинга (более 100), из-за использования ближнего оружия (приклад автомата),
из-за не точности модели, т.е. на моём экране игрок получил урон, а у игроков рядом стоящих на экране игрок даже не дернулся.
Reply
#6

У меня нет уверености что OnPlayerGiveDamag и OnPlayerTakeDamage работаю синхронно. Замечал когда у себя на "монеторе" попадал в скин срабатывал один из пабликов (забыл какой именно) но здоровье не снялось. пинги у меня 40 у апонента 120.
Reply
#7

Quote:
Originally Posted by DANGER1979
Посмотреть сообщение
OnPlayerTakeDamage не вызывается при год моде
Вот отсюда и пляшем, не срабатывают оба события или только отслеживающее потерю здоровья?
Reply
#8

Я же ясно написал, что OnPlayerTakeDamage не вызывается при год моде, при АФК, и при обездвиживании.

Естественно OnPlayerGiveDamage срабатывает во всех случаях. НО сказать что нормально нельзя.
Т.к. бывает один выстрел по оппоненту вызывает одно срабатывание OnPlayerGiveDamage и два срабатывания OnPlayerTakeDamage. А бывает у игрока нету год мода, но OnPlayerTakeDamage через раз не вызывается по непонятным причинам.

Кстати ГодМод проверяли Клео скриптами, а не собейтом. Но это не имеет значения.
Reply
#9

OnPlayerGiveDamag -- когда игрок попал в чейто СКИН, не по пингу, так что любой лаг или рассинхрон и античит будет гнать, если кстати отключить в собе Onfoot Data , то думаю ложно вызывать паблик можно будет, короче ничего хорошего не выйдет с этим
Reply
#10

А не надо думать и предполагать. Надо проверять.
Я лично проверил и выложил код. И расписал результаты проверки.
Reply
#11

Что на счёт присваивания всех игроков к одной команде и использования только OnPlayerGiveDamage: и будет как в мта и всё жестко будет держаться на стороне сервера(кстати, в WoT именно такой принцип - все выстрелы/столкновения танков рассчитываются на сервере)?
Reply
#12

Quote:
Originally Posted by Mutha_X
Посмотреть сообщение
Что на счёт присваивания всех игроков к одной команде и использования только OnPlayerGiveDamage: и будет как в мта и всё жестко будет держаться на стороне сервера(кстати, в WoT именно такой принцип - все выстрелы/столкновения танков рассчитываются на сервере)?
для этого нам придется изобрести новый мультиплеер для GTA:SA, который будет полностью серверным.
Reply
#13

Quote:
Originally Posted by Jon_De
Посмотреть сообщение
когда игрок попал в чейто СКИН, не по пингу, так что любой лаг или рассинхрон и античит будет гнать
Получится если стреляющий у себя попал(OnPlayerGiveDamage), а у того из-за пинга не попало (OnPlayerTakeDamage) будет сообщать о чите?
Reply
#14

Jon_De, капитан Очевидность.
Mutha_X, не пиши херню. Если бы, да кабы.

Geryy, да, в том то и дело. Что нету в сампе синхры.
вспомните ф-ию public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat).
И что-нибудь дельное с неё получилось у кого-нибудь, чтобы при онлайне хотя бы 30 работало?
У меня ф-ию OnUnoccupiedVehicleUpdate закоментирована, т.к. кривее не придумаешь. При её кривой работе только претензии от игроков сыпятся.
Reply
#15

Ну что?
так и ни кто не нашёл решение?

Степашка, OkStyle, Ziggi, скажите Вам удалось идеальный АнтиГодМод написать?
Reply
#16

У меня на сервере антиГМ работает отлично. Единственное, были проблемы с нажатием Esc, но это легко решается.
Reply
#17

Ну поведуй.
Я выложил код.
Ты по такому принципу делал?
Или ты делал через замеры хп в public OnPlayerUpdate(playerid) или в таймере.

Я написал что OnPlayerGiveDamage даёт ложные срабатывания когда игрок без чита
а ф-ия public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid) при этом не фиксирует урон.
Т.е. абсурд.

Какая твоя история?
Хотелось бы увидеть код. Т.к. борьба с читерами я считаю - это благородное общее дело.
Reply
#18

Quote:
Originally Posted by DANGER1979
Посмотреть сообщение
Ну поведуй.
Я выложил код.
Ты по такому принципу делал?
Или ты делал через замеры хп в public OnPlayerUpdate(playerid) или в таймере.

Я написал что OnPlayerGiveDamage даёт ложные срабатывания когда игрок без чита
а ф-ия public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid) при этом не фиксирует урон.
Т.е. абсурд.

Какая твоя история?
Хотелось бы увидеть код. Т.к. борьба с читерами я считаю - это благородное общее дело.
Я предполагаю что вся проблема ложных сбрасываний, заключается в if(amount < 2.0) return 1; Попробуй поставить if(amount < 10.0) return 1;
Reply
#19

Quote:
Originally Posted by DANGER1979
Посмотреть сообщение
Ну поведуй.
Я выложил код.
Ты по такому принципу делал?
Или ты делал через замеры хп в public OnPlayerUpdate(playerid) или в таймере.

Я написал что OnPlayerGiveDamage даёт ложные срабатывания когда игрок без чита
а ф-ия public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid) при этом не фиксирует урон.
Т.е. абсурд.

Какая твоя история?
Хотелось бы увидеть код. Т.к. борьба с читерами я считаю - это благородное общее дело.
К сожалению, кода не будет.

OnPlayerUpdate не советую вообще использовать при онлайне выше 80-100 человек.
OnPlayerGiveDamage - тут копайте.
Reply
#20

Quote:
Originally Posted by CKA3KuH
Посмотреть сообщение
OnPlayerGiveDamage - тут копайте.
Учитываются попадания только по скину => включу Disable onfoot data => все игроки для меня стоят на месте => стреляю и кикаю всех за ГМ Если не так то вот еще 1 вариант развитий: игрок бежит, вышел в АФК не останавливаясь, скин скользит по земле для других игроков, кто то попадает в него => опять же кик ( или что там у вас )
А если проверка какая, на то что скорость игрока = 0, то тоже бредово... хотя для онлайн 0-100 и при отсутвии даже малейших лагов возможно и будет более менее стабильно и что то рабочее
Reply


Forum Jump:


Users browsing this thread: 5 Guest(s)