AntiGodMod -
DANGER1979 - 08.12.2011
Короче, сделал я этот античит и заметил, что опять разработчик сампа нам преподнёс ф-ию, про которую из-за своей баганутости можно забыть.
Речь пойдёт про новые ф-ии 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;
}
Какие будут предложения?
Re: AntiGodMod -
Stepashka - 08.12.2011
Повреждения может получить игрок с ид INVALID_PLAYER_ID, а нанести?
Re: AntiGodMod -
DANGER1979 - 08.12.2011
INVALID_PLAYER_ID на всякий случай.
Лично не заметил, чтобы необходимость в них обоих была. Т.к. таких случаев не было.
Так как собейты покуда не пашут на новом сампе, т.е. не все.
То мы покуда не смогли проверить антифейккилл, чтобы узнать реагируют ли новые ф-ии на убийством фейккилом.
ДУмаю, что они нормально отработают как и public OnPlayerDeath(playerid, killerid, reason)
Re: AntiGodMod -
Stepashka - 08.12.2011
А ты уверен что годмод работает по принципу блокировки наносимого урона?
Недочеты с поверхностного взгляда: нет связи между нанесенным уроном и тем кто его нанес.
Причем здесь вообще годмод и наносимый урон, урон может и наносится а человек будет бессмертен, смотри первое предложение.
Суть работы должна быть такая: нанесли урон, мы его запомнили, потом проверили здоровье игрока, если оно не изменилось на значение нанесенного урона, от предыдущего состояния - ты читер.
Re: AntiGodMod -
DANGER1979 - 08.12.2011
Quote:
Originally Posted by Stepashka
А ты уверен что годмод работает по принципу блокировки наносимого урона?
|
Уверен. Я же это уже протестировал, а не просто выложил теоретический код.
OnPlayerTakeDamage не вызывается при год моде
Quote:
Originally Posted by Stepashka
Недочеты с поверхностного взгляда: нет связи между нанесенным уроном и тем кто его нанес.
|
а зачем? ведь проверяем игрока в которого стреляют. И нам не важно кто. Зачем избыточный код?
Если нужен, ТО предложи вариант кода. Но я думаю ложных срабатываний меньше не станет.
Quote:
Originally Posted by Stepashka
Причем здесь вообще годмод и наносимый урон, урон может и наносится а человек будет бессмертен, смотри первое предложение.
Суть работы должна быть такая: нанесли урон, мы его запомнили, потом проверили здоровье игрока, если оно не изменилось на значение нанесенного урона, от предыдущего состояния - ты читер.
|
Нет. Урон не наносится. ПРОВЕРЕНО.
Отнятое здоровье и урон могут отличаться на доли. Получения здоровья для проверки с кол-вом полученного урона можно сделать, но это не уменьшит ложные срабатывания. Т.к. они в основном
предположительно из-за пинга (более 100), из-за использования ближнего оружия (приклад автомата),
из-за не точности модели, т.е. на моём экране игрок получил урон, а у игроков рядом стоящих на экране игрок даже не дернулся.
Re: AntiGodMod -
White_116 - 08.12.2011
У меня нет уверености что OnPlayerGiveDamag и OnPlayerTakeDamage работаю синхронно. Замечал когда у себя на "монеторе" попадал в скин срабатывал один из пабликов (забыл какой именно) но здоровье не снялось. пинги у меня 40 у апонента 120.
Re: AntiGodMod -
Stepashka - 08.12.2011
Quote:
Originally Posted by DANGER1979
OnPlayerTakeDamage не вызывается при год моде
|
Вот отсюда и пляшем, не срабатывают оба события или только отслеживающее потерю здоровья?
Re: AntiGodMod -
DANGER1979 - 08.12.2011
Я же ясно написал, что OnPlayerTakeDamage не вызывается при год моде, при АФК, и при обездвиживании.
Естественно
OnPlayerGiveDamage срабатывает во всех случаях. НО сказать что нормально нельзя.
Т.к. бывает один выстрел по оппоненту вызывает одно срабатывание OnPlayerGiveDamage и два срабатывания OnPlayerTakeDamage. А бывает у игрока нету год мода, но OnPlayerTakeDamage через раз не вызывается по непонятным причинам.
Кстати ГодМод проверяли Клео скриптами, а не собейтом. Но это не имеет значения.
Re: AntiGodMod -
Jon_De - 08.12.2011
OnPlayerGiveDamag -- когда игрок попал в чейто СКИН, не по пингу, так что любой лаг или рассинхрон и античит будет гнать, если кстати отключить в собе Onfoot Data , то думаю ложно вызывать паблик можно будет, короче ничего хорошего не выйдет с этим
Re: AntiGodMod -
DANGER1979 - 08.12.2011
А не надо думать и предполагать. Надо проверять.
Я лично проверил и выложил код. И расписал результаты проверки.
Re: AntiGodMod -
Mutha_X - 08.12.2011
Что на счёт присваивания всех игроков к одной команде и использования только OnPlayerGiveDamage: и будет как в мта и всё жестко будет держаться на стороне сервера(кстати, в WoT именно такой принцип - все выстрелы/столкновения танков рассчитываются на сервере)?
Re: AntiGodMod -
Stepashka - 08.12.2011
Quote:
Originally Posted by Mutha_X
Что на счёт присваивания всех игроков к одной команде и использования только OnPlayerGiveDamage: и будет как в мта и всё жестко будет держаться на стороне сервера(кстати, в WoT именно такой принцип - все выстрелы/столкновения танков рассчитываются на сервере)?
|
для этого нам придется изобрести новый мультиплеер для GTA:SA, который будет полностью серверным.
Re: AntiGodMod -
Geryy - 08.12.2011
Quote:
Originally Posted by Jon_De
когда игрок попал в чейто СКИН, не по пингу, так что любой лаг или рассинхрон и античит будет гнать
|
Получится если стреляющий у себя попал(OnPlayerGiveDamage), а у того из-за пинга не попало (OnPlayerTakeDamage) будет сообщать о чите?
Re: AntiGodMod -
DANGER1979 - 08.12.2011
Jon_De, капитан Очевидность.
Mutha_X, не пиши херню. Если бы, да кабы.
Geryy, да, в том то и дело. Что нету в сампе синхры.
вспомните ф-ию public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat).
И что-нибудь дельное с неё получилось у кого-нибудь, чтобы при онлайне хотя бы 30 работало?
У меня ф-ию OnUnoccupiedVehicleUpdate закоментирована, т.к. кривее не придумаешь. При её кривой работе только претензии от игроков сыпятся.
Re: AntiGodMod -
DANGER1979 - 27.12.2011
Ну что?
так и ни кто не нашёл решение?
Степашка, OkStyle, Ziggi, скажите Вам удалось идеальный АнтиГодМод написать?
Re: AntiGodMod -
CKA3KuH - 27.12.2011
У меня на сервере антиГМ работает отлично. Единственное, были проблемы с нажатием Esc, но это легко решается.
Re: AntiGodMod -
DANGER1979 - 27.12.2011
Ну поведуй.
Я выложил код.
Ты по такому принципу делал?
Или ты делал через замеры хп в public OnPlayerUpdate(playerid) или в таймере.
Я написал что OnPlayerGiveDamage даёт ложные срабатывания когда игрок без чита
а ф-ия public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid) при этом не фиксирует урон.
Т.е. абсурд.
Какая твоя история?
Хотелось бы увидеть код. Т.к. борьба с читерами я считаю - это благородное общее дело.
Re: AntiGodMod -
anonim15 - 27.12.2011
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;
Re: AntiGodMod -
CKA3KuH - 27.12.2011
Quote:
Originally Posted by DANGER1979
Ну поведуй.
Я выложил код.
Ты по такому принципу делал?
Или ты делал через замеры хп в public OnPlayerUpdate(playerid) или в таймере.
Я написал что OnPlayerGiveDamage даёт ложные срабатывания когда игрок без чита
а ф-ия public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid) при этом не фиксирует урон.
Т.е. абсурд.
Какая твоя история?
Хотелось бы увидеть код. Т.к. борьба с читерами я считаю - это благородное общее дело.
|
К сожалению, кода не будет.
OnPlayerUpdate не советую вообще использовать при онлайне выше 80-100 человек.
OnPlayerGiveDamage - тут копайте.
Re: AntiGodMod -
Jon_De - 27.12.2011
Quote:
Originally Posted by CKA3KuH
OnPlayerGiveDamage - тут копайте.
|
Учитываются попадания только по скину => включу Disable onfoot data => все игроки для меня стоят на месте => стреляю и кикаю всех за ГМ

Если не так то вот еще 1 вариант развитий: игрок бежит, вышел в АФК не останавливаясь, скин скользит по земле для других игроков, кто то попадает в него => опять же кик ( или что там у вас )
А если проверка какая, на то что скорость игрока = 0, то тоже бредово... хотя для онлайн 0-100 и при отсутвии даже малейших лагов
возможно и будет более менее стабильно и что то рабочее