Как можно бороться с NOP OnPlayerTakeDamage? Была идея создать 2 переменные и каждую секунду через таймер обменяться данными. Есть идеи по лучше?
Вид для печати
Как можно бороться с NOP OnPlayerTakeDamage? Была идея создать 2 переменные и каждую секунду через таймер обменяться данными. Есть идеи по лучше?
Какова нужда использовать OnPlayerTakeDamage? Есть же OnPlayerWeaponShot.
Ну а вообще можно при вызове OnPlayerGiveDamage одним игроком, запускать таймер и проверять, вызвался ли OnPlayerTakeDamage у другого игрока. Но суть в том, что в SA-MP с синхронизацией плохо и античит вполне легко может срабатывать ложно. Если на этой основе делается античит на GM, то проще, имхо, использовать OnPlayerWeaponShot
Бороться вряд ли, но обнаружить можно. Как именно - вы сами только что сказали (написали).
Вряд ли получится написать NOP, который будет работать без ложных срабатываний. Да и часто ли игроки падают с больших высот, спасая себя GM-ом?
Но вообще можешь попробовать вот в этом инклюде найти нужный тебе код:
https://github.com/oscar-broman/samp...pon-config.inc
Как говорит автор, этот инклюд полностью реализует здоровье на стороне сервера. Можешь взять прямо его, а можешь попробовать вырезать нужный код. Но за работу не ручаюсь, ибо не копался в нём
Вообще-то я имел в виду ваши слова о том, что OnPlayerTakeDamage вызывается при падении. Впрочем, я не знаю, как это можно использовать, да ещё и без ложных срабатываний.
Этот инклуд блокирует обычный урон, добавляя всех в одну команду (SetPlayerTeam). Правда, его использование может показаться немного сложным из-за того, что он предоставляет не совсем тот набор коллбэков, которые есть в SA-MP. Вместо OnPlayerGiveDamage и OnPlayerTakeDamage остался только коллбэк OnPlayerDamage. Мало того, добавились новые коллбэки OnPlayerDamageDone, OnPlayerPrepareDeath, OnPlayerDeathFinished, OnRejectedHit и OnInvalidWeaponDamage.
Из плюсов можно отметить то, что в инклуде многое продумано: проверяется каждый выстрел и попадание - сделано это, чтобы избавиться от дефектов, возникающих из-за лагов, и исключить читерство.
Например, если кто-то читами заставит дигл стрелять со скоростью пулемёта - видимый эффект останется, но слишком частого урона не будет. Мало того, будет вызываться коллбэк OnRejectedHit с информацией о выстреле/ударе (ID оружия, время выстрела, причина "отсеивания"), по которой можно будет сделать определённые выводы и забанить читера.
Удивительно, что никто до сих пор не написал урока по использованию этого инклуда.
По сути он реализует то, что могло бы быть в SA-MP из коробки, если бы куй реально занимался развитием мультиплеера, а не прикрывался "мнением держателей крупных проектов".
Нарушение авторских прав же.
Либо вы не имеете представления о качестве кода, либо плохо понимаете, с чем работаете - а работаете вы с SA-MP, мультплеером, в котором любые баги нужно исправлять с помощью своих костылей, ибо глупо надеяться, что Kalcor просто так возьмёт и исправит их сам.
Да, тот инклуд не до конца исправляет проблему с NOP OnPlayerTakeDamage (при падении с высоты всё ещё можно заблокировать урон) но он и не специализируется на этой конкретной проблеме - зато устраняет кучу других проблем, которые могут возникнуть, если вы попытаетесь сделать свою систему серверного урона.
Что касается урона от падений - вряд ли можно однозначно обнаружить читера, блокирующего такой тип урона. Можете попытаться установить факт падения (по анимации, скорости перемещения по оси Z, ненахождению в машине) и при остановке проверять изменение HP, но будут ложные срабатывания, поскольку можно даже без читов упасть с высоты и не разбиться (приземлиться на машину, в воду, на наклонную поверхность или узкий участок поверхности, на котором игрок застрянет).
Daniel_Cortez, спасибо за ответ, я еще раз попытаюсь разобраться в этом инклуде
можно же отследить падение игрока в OnPlayerTakeDamage без ложных срабатывание
Выглядит это примерно так:
или это не сработает?PHP код:
if(issuerid == INVALID_PLAYER_ID && amount > 2.5
&& weaponid == WEAPON_COLLISION && bodypart == 3)
{
new Float:health;
GetPlayerHealth(playerid, health);
health -= amount;
return SetPlayerHealth(playerid, health);
}
Оно лицензируется под Apache License 2.0, а это значит, что библиотеку или её часть, можно использовать практически как угодно. Wiki: "Единственным условием, накладываемым лицензией Apache, является информирование получателя о факте использования исходного кода.".
Сама библиотека хорошая, но мне интересно услышать отзывы от держателей более-менее нагруженных серверов.
Сделал примерное обмен данными между OnPlayerTakeDamage и секундным пабликом:
Вроде все без ошибки реализовал, но не ловит NOP. Помогите пожалуйстаPHP код:
//Уникальные параметры, что бы понимать, что public был вызван секундным таймером:
#define WEAPON_SYNC 99
#define BODY_PART_SYNC 99
//Использовал бит, что бы добавить синхронизацию и для других public'ов, если все выйдет успешным
enum(<<= 1)
{
OPTD_sync = 1,
OPGD_sync
};
new player_sync[playerid];
//Секундный таймер
public OnPlayerUpdateStatus(playerid)
{
if((player_sync[playerid] & OPTD_sync) != 0)
Kick(playerid);
player_sync[playerid] ^= OPTD_sync;
CallLocalFunction("OnPlayerTakeDamage", "iifii",
playerid, INVALID_PLAYER_ID, 0.0, WEAPON_SYNC, BODY_PART_SYNC); //вызов OPTD с уникальными параметрами
//Повторная настройка таймера, не добавил сюда
return 1;
}
//OPTD
public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
{
if(issuerid == INVALID_PLAYER_ID && amount == 0.0
&& weaponid == WEAPON_SYNC && bodypart == BODY_PART_SYNC) //Если все параметры совпадают с уникальными для синхронизации
{
if((player_sync[playerid] & OPTD_sync) == 0)
Kick(playerid);
player_sync[playerid] ^= OPTD_sync;
return 0;
}
return 1;
}
P.S. weapon_config.inc не буду использовать, я почти все реализовал и не хочу менять
На самом деле самым сложным было лишь найти плагин SKY, на котором это всё работает, под линукс (благо добрые люди скомпилили в комментах). Какие проблемы могут возникнуть при простом вырезании кода из OnPlayerGive/TakeDamage в OnPlayerDamage я не понмаю (ну разве что те люди будут умом тронутые). А все остальные фичи, такие как настройка урона от выстрелов или падения выставляются парой функций, также ничего сложного.
Опиши принцип работы твоего кода, а то во все эти битовые операции лень вникать.
Если описать как обычный переменный, то в секундном таймере проверяется, если переменный не равен 0 значит заблокирован вызов OPTD, далее присваивается переменному 0, вызывается OPTD с уникальными параметрами что бы понять, что вызов был для проверки синхронизации, там присваивается переменному 1, и так далее по кругу, если один из public'ов сбился со счета значит чит, ну примерно так, я не мастер объяснений
Так ты же сервером этот паблик вызываешь. Ноп - это игнорирование пакетов сервера клиентом, а не сервером :D
Т.е. вызывая этот паблик самому, он будет вызываться независимо от того, стоят ли нопы у игрока, есть ли такой игрок на сервере вообще и тому подобное.
Кароче выход из ситуации это наверное вышеупомянутый wc. Либо проверка, как написали выше, анимаций и подобного (кстати, когда-то анти-гм даже от пуль видел сделанный через проверку анимок, когда ещё даже OnPlayerGiveDamage не было). Хотя обойти это, зная что ты проверяешь будет скорее всего не сложно.
П.с. Вся соль ещё и в том, что при нанесении урона одним игроком другому мы точно знаем хотя-бы на 50%, что урон должен быть нанесён, и даже отключив вызов TakeDamage у жертвы, нам об этом сообщал киллер. А в данном случае у нас нет больше данных, кроме как от самой жертвы.
ааа вот значит что! Простите я просто не до конца понял принцип работы NOP
Да Вы обсолютно правы, про жертву и цель) Попробую что-то другое реализовать. Спасибо за ответ
P.S. а можно обратится к памяти клиента и отследить работу OnPlayerTakeDamage?
Скорее всего можно.
Увы, я на этот вопрос не отвечу, ибо я против любых вмешательств в память клиента, даже если тот читер (такие уж у меня взгляды).
Был где-то мануал как пользоваться самой функцией, но адресов там очень много, и наверное потребуется какое-то время, чтобы найти нужный.
Спасибо всем кто пытался помочь. Тему оставлю открытым может кто-то знает адрес памяти и может ответит
Нельзя, SendClientCheck может предоставить очень ограниченный набор данных.
Определить падение можно лишь с помощью проверки анимации (конечно, если и на анимации не включен NOP), пример можно посмотреть здесь.
Так об этом и речь: если просто вырезать код, это будет нарушением условий лицензии.
Знаю, что адресовано не мне, но беру свои слова обратно по поводу урона от падения: в этом инклуде реально учтено всё.
Что верно, то верно. Раньше Slice размещал билды плагина на GitHub, но потом удалил их все (кроме последней версии для Windows), аргументируя тем, что версию для Linux легко собрать самостоятельно.
Видимо, решил, что раз легко ему, то и любой другой пользователь сможет собрать плагин. Довольно странное решение, на самом деле.
Почему? Если оставить пометку о том, откуда часть кода была заимствована и сообщить об этом автору, то условия не нарушаются. Или нет?
Скорее всего многие жаловались на то, что плагин не работает на их дистрибутиве Linux. У каждого дистрибутива разные версии библиотек, поэтому не выкладывать бинарник Linux версии плагина вполне разумно (мне это предлагали для FCNPC).
А ведь можно просто чек на ID анимации падения(когда игрок падает он вроде бы не меняет анимку, если не сбивать её разве что) и прибавлять к переменной ++,
затем если анимация окончилась и хп не изменились можно дать поджопничка))
Речь была о том, чтобы только скопировать код.
А по поводу "указать, откуда было заимствовано" и "сообщить автору" - в лицензии об этом ни слова.
Зато есть требование передать получателю работы (как оригинала, так и производной) копию оригинальной лицензии. Благо, этот пункт лицензии безвреден - игроки на сервере не получают копию мода, а играют по сети, так что никаких получателей нет.
Ещё в изменённых файлах нужно оставлять пометки о том, что они были изменены, ну и, естественно, нужно сохранять в исходных файлах все упоминания об авторстве.
А теперь самое интересное: никаких упоминаний об авторстве нет ни в инклуде, ни в лицензии - и фиг пойми, в чём вообще был смысл добавлять лицензию, да ещё и в отдельном файле.
Вполне возможно, что в суде это можно интерпретировать, как отказ автора от авторских прав на код.
Так можно ж сделать пометку о том, для какого дистра бинарник. Хотя, вполне возможно, что ему просто надоелинубыличности, страдающие манией нажать кнопку "Download", ничего не читая.
Анимацию можно отключить читами.
Подключил инклуд, все работает, но если включаю NOP, перестает распознавать урон. Я что-то не правильно делаю? Может что-то нужно настроить? (Честно говоря мне лень разбираться в этом инклуде)Цитата:
Знаю, что адресовано не мне, но беру свои слова обратно по поводу урона от падения: в этом инклуде реально учтено всё.
Говорилось же, что и на анимации можно отрубить NOP-ом.
А если не отрубать, то GTA сама имеет много случаев, когда урон от падения не проходит (наклонная поверхность/падение в воду и т.п.).
SA-MP - не тот мультиплеер, где можно скриптами создать 100% античит на урон без ложных срабатываний. Точнее, можно, но такой античит будет обходиться обычными NOP'ами. В общем, не в том мультиплеере вы этим занимаетесь.
Лучшим вариантом будет написать свой лаунчер с соответствующими античитами. Хотя и его умелые люди могут обойти.
Пишите свой мультиплеер, крч
- - - Добавлено - - -
Я не говорил о том, что нужно только скопировать код. Я просто натолкнул автора на мысль, подразумевая, что все вытекающие последствия он поймёт сам. Если бы я скинул ему готовый код, вырезанный из инклюда, твои замечания были бы уместны. А так - это придирки к словам, имхо.
Зачем тогда обсуждать тут это...
Зачем нагружать сервер Античитами если они обходятся...
Выдайте какому нибудь балбесу админку и пусть гоняет всех на сервере
Сделать привязку по мыльнице или мобиле и тогда после банов нарушителя за....ет регаться
и он прекратит вести себя так распущенно(или будет по всем фронтам забанен:diablo:)
И серв не нагружен и нарушители в бане:grin:
Любой урон не наносится при включение читов, без читов работает все нормально. Логировал OnPlayerDamage || OnInvalidWeaponDamage || OnRejectedHit. Сделал скрины:
Листать снизу --> вверх!
- - - Добавлено - - -
От падение тоже не наносится урон, вот только от другого игрока работает
- - - Добавлено - - -
Всем огромное спасибо за уделенное время на эту тему, возьму инклуд wc, полностью изучу систему урона. И реализую свою систему с похожим алгоритмом. А насчет урона от падение, огня, взрыва, я думаю невозможно полностью взять под свой контроль. Тему я думаю можно закрывать.