PDA

Просмотр полной версии : [Вопрос] NOP OnPlayerTakeDamage



Geebrox
08.07.2016, 12:16
Как можно бороться с NOP OnPlayerTakeDamage? Была идея создать 2 переменные и каждую секунду через таймер обменяться данными. Есть идеи по лучше?

DeimoS
08.07.2016, 13:54
Как можно бороться с NOP OnPlayerTakeDamage? Была идея создать 2 переменные и каждую секунду через таймер обменяться данными. Есть идеи по лучше?

Какова нужда использовать OnPlayerTakeDamage? Есть же OnPlayerWeaponShot.
Ну а вообще можно при вызове OnPlayerGiveDamage одним игроком, запускать таймер и проверять, вызвался ли OnPlayerTakeDamage у другого игрока. Но суть в том, что в SA-MP с синхронизацией плохо и античит вполне легко может срабатывать ложно. Если на этой основе делается античит на GM, то проще, имхо, использовать OnPlayerWeaponShot

Geebrox
08.07.2016, 13:58
Какова нужда использовать OnPlayerTakeDamage? Есть же OnPlayerWeaponShot.
Ну а вообще можно при вызове OnPlayerGiveDamage одним игроком, запускать таймер и проверять, вызвался ли OnPlayerTakeDamage у другого игрока. Но суть в том, что в SA-MP с синхронизацией плохо и античит вполне легко может срабатывать ложно. Если на этой основе делается античит на GM, то проще, имхо, использовать OnPlayerWeaponShot

Да я уже обдумал такой вариант, но при падение не вызывается OnPlayerWeaponShot или OnPlayerGiveDamage, а вызывается именно OnPlayerTakeDamage, а с читом можно заблокировать вызов этого паблика.

Nash_Brigers
08.07.2016, 14:07
Да я уже обдумал такой вариант, но при падение не вызывается OnPlayerWeaponShot или OnPlayerGiveDamage, а вызывается именно OnPlayerTakeDamage, а с читом можно заблокировать вызов этого паблика.
GM при падении - не самое страшное.
В своё время тоже запарился с этим делом.. Месяц убил на красивую, шикарную, но не рабочую систему..

Daniel_Cortez
08.07.2016, 14:08
Бороться вряд ли, но обнаружить можно. Как именно - вы сами только что сказали (написали).

Geebrox
08.07.2016, 14:13
Бороться вряд ли, но обнаружить можно. Как именно - вы сами только что сказали (написали).

То есть обмен данными между пабликом, единственный выход?

- - - Добавлено - - -


GM при падении - не самое страшное.
В своё время тоже запарился с этим делом.. Месяц убил на красивую, шикарную, но не рабочую систему..

Может быть для Вас не страшное) или для РП, но у меня другой жанр) От падение многое зависит в моем проекте

DeimoS
08.07.2016, 14:15
Да я уже обдумал такой вариант, но при падение не вызывается OnPlayerWeaponShot или OnPlayerGiveDamage, а вызывается именно OnPlayerTakeDamage, а с читом можно заблокировать вызов этого паблика.

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

Но вообще можешь попробовать вот в этом инклюде найти нужный тебе код:
https://github.com/oscar-broman/samp-weapon-config/blob/master/weapon-config.inc
Как говорит автор, этот инклюд полностью реализует здоровье на стороне сервера. Можешь взять прямо его, а можешь попробовать вырезать нужный код. Но за работу не ручаюсь, ибо не копался в нём

Geebrox
08.07.2016, 14:17
Вряд ли получится написать NOP, который будет работать без ложных срабатываний. Да и часто ли игроки падают с больших высот, спасая себя GM-ом?

Но вообще можешь попробовать вот в этом инклюде найти нужный тебе код:
https://github.com/oscar-broman/samp-weapon-config/blob/master/weapon-config.inc
Как говорит автор, этот инклюд полностью реализует здоровье на стороне сервера. Можешь взять прямо его, а можешь попробовать вырезать нужный код. Но за работу не ручаюсь, ибо не копался в нём

Опять таки прочитайте пост выше. А насчет инклуда, я в нем уже порылся, код не "супер", лучше уж свою реализовать, вот и открыл тему...

DeimoS
08.07.2016, 14:57
Опять таки прочитайте пост выше. А насчет инклуда, я в нем уже порылся, код не "супер", лучше уж свою реализовать, вот и открыл тему...

Так я и не предлагаю копировать код инка. Возьми за основу, разобравшись в принципе работы и напиши свой.

Geebrox
08.07.2016, 16:17
Так я и не предлагаю копировать код инка. Возьми за основу, разобравшись в принципе работы и напиши свой.

Я уже реализовал свою систему хп, мне просто нужен совет для обнаружение NOP'а.



То есть обмен данными между пабликом, единственный выход?

Daniel_Cortez
08.07.2016, 20:32
То есть обмен данными между пабликом, единственный выход?
Вообще-то я имел в виду ваши слова о том, что OnPlayerTakeDamage вызывается при падении. Впрочем, я не знаю, как это можно использовать, да ещё и без ложных срабатываний.



Но вообще можешь попробовать вот в этом инклюде найти нужный тебе код:
https://github.com/oscar-broman/samp-weapon-config/blob/master/weapon-config.inc
Как говорит автор, этот инклюд полностью реализует здоровье на стороне сервера.
Этот инклуд блокирует обычный урон, добавляя всех в одну команду (SetPlayerTeam). Правда, его использование может показаться немного сложным из-за того, что он предоставляет не совсем тот набор коллбэков, которые есть в SA-MP. Вместо OnPlayerGiveDamage и OnPlayerTakeDamage остался только коллбэк OnPlayerDamage. Мало того, добавились новые коллбэки OnPlayerDamageDone, OnPlayerPrepareDeath, OnPlayerDeathFinished, OnRejectedHit и OnInvalidWeaponDamage.

Из плюсов можно отметить то, что в инклуде многое продумано: проверяется каждый выстрел и попадание - сделано это, чтобы избавиться от дефектов, возникающих из-за лагов, и исключить читерство.
Например, если кто-то читами заставит дигл стрелять со скоростью пулемёта - видимый эффект останется, но слишком частого урона не будет. Мало того, будет вызываться коллбэк OnRejectedHit с информацией о выстреле/ударе (ID оружия, время выстрела, причина "отсеивания"), по которой можно будет сделать определённые выводы и забанить читера.

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



Можешь взять прямо его, а можешь попробовать вырезать нужный код.
Нарушение авторских прав же.



А насчет инклуда, я в нем уже порылся, код не "супер", лучше уж свою реализовать, вот и открыл тему...
Либо вы не имеете представления о качестве кода, либо плохо понимаете, с чем работаете - а работаете вы с SA-MP, мультплеером, в котором любые баги нужно исправлять с помощью своих костылей, ибо глупо надеяться, что Kalcor просто так возьмёт и исправит их сам.
Да, тот инклуд не до конца исправляет проблему с NOP OnPlayerTakeDamage (при падении с высоты всё ещё можно заблокировать урон) но он и не специализируется на этой конкретной проблеме - зато устраняет кучу других проблем, которые могут возникнуть, если вы попытаетесь сделать свою систему серверного урона.
Что касается урона от падений - вряд ли можно однозначно обнаружить читера, блокирующего такой тип урона. Можете попытаться установить факт падения (по анимации, скорости перемещения по оси Z, ненахождению в машине) и при остановке проверять изменение HP, но будут ложные срабатывания, поскольку можно даже без читов упасть с высоты и не разбиться (приземлиться на машину, в воду, на наклонную поверхность или узкий участок поверхности, на котором игрок застрянет).

Geebrox
08.07.2016, 21:30
Daniel_Cortez, спасибо за ответ, я еще раз попытаюсь разобраться в этом инклуде



Что касается урона от падений - вряд ли можно однозначно обнаружить читера, блокирующего такой тип урона. Можете попытаться установить факт падения (по анимации, скорости перемещения по оси Z, ненахождению в машине) и при остановке проверять изменение HP, но будут ложные срабатывания, поскольку можно даже без читов упасть с высоты и не разбиться (приземлиться на машину, в воду, на наклонную поверхность или узкий участок поверхности, на котором игрок застрянет).

можно же отследить падение игрока в OnPlayerTakeDamage без ложных срабатывание

Выглядит это примерно так:


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);
}

или это не сработает?

Daniel_Cortez
08.07.2016, 22:20
можно же отследить падение игрока в OnPlayerTakeDamage без ложных срабатывание
Просто взгляните ещё раз на название темы.

ziggi
08.07.2016, 23:38
Нарушение авторских прав же.

Оно лицензируется под Apache License 2.0, а это значит, что библиотеку или её часть, можно использовать практически как угодно. Wiki (https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F_Apache#.D0.A3.D1.81.D0.BB.D0.BE.D0.B2.D0.B8.D1.8F_.D0.BB.D0.B8.D1.86.D0.B5.D0.BD.D0.B7.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F): "Единственным условием, накладываемым лицензией Apache, является информирование получателя о факте использования исходного кода.".
Сама библиотека хорошая, но мне интересно услышать отзывы от держателей более-менее нагруженных серверов.

Geebrox
09.07.2016, 01:05
Сделал примерное обмен данными между OnPlayerTakeDamage и секундным пабликом:



//Уникальные параметры, что бы понимать, что 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;
}


Вроде все без ошибки реализовал, но не ловит NOP. Помогите пожалуйста

P.S. weapon_config.inc не буду использовать, я почти все реализовал и не хочу менять

Nexius_Tailer
09.07.2016, 01:07
Удивительно, что никто до сих пор не написал урока по использованию этого инклуда.
На самом деле самым сложным было лишь найти плагин SKY, на котором это всё работает, под линукс (благо добрые люди скомпилили в комментах). Какие проблемы могут возникнуть при простом вырезании кода из OnPlayerGive/TakeDamage в OnPlayerDamage я не понмаю (ну разве что те люди будут умом тронутые). А все остальные фичи, такие как настройка урона от выстрелов или падения выставляются парой функций, также ничего сложного.


Вроде все без ошибки реализовал, но не ловит NOP. Помогите пожалуйста
Опиши принцип работы твоего кода, а то во все эти битовые операции лень вникать.

Geebrox
09.07.2016, 01:21
Опиши принцип работы твоего кода, а то во все эти битовые операции лень вникать.

Если описать как обычный переменный, то в секундном таймере проверяется, если переменный не равен 0 значит заблокирован вызов OPTD, далее присваивается переменному 0, вызывается OPTD с уникальными параметрами что бы понять, что вызов был для проверки синхронизации, там присваивается переменному 1, и так далее по кругу, если один из public'ов сбился со счета значит чит, ну примерно так, я не мастер объяснений

Nexius_Tailer
09.07.2016, 01:37
Если описать как обычный переменный, то в секундном таймере проверяется, если переменный не равен 0 значит заблокирован вызов OPTD, далее присваивается переменному 0, вызывается OPTD с уникальными параметрами что бы понять, что вызов был для проверки синхронизации, там присваивается переменному 1, и так далее по кругу, если один из public'ов сбился со счета значит чит, ну примерно так, я не мастер объяснений
Так ты же сервером этот паблик вызываешь. Ноп - это игнорирование пакетов сервера клиентом, а не сервером :D
Т.е. вызывая этот паблик самому, он будет вызываться независимо от того, стоят ли нопы у игрока, есть ли такой игрок на сервере вообще и тому подобное.
Кароче выход из ситуации это наверное вышеупомянутый wc. Либо проверка, как написали выше, анимаций и подобного (кстати, когда-то анти-гм даже от пуль видел сделанный через проверку анимок, когда ещё даже OnPlayerGiveDamage не было). Хотя обойти это, зная что ты проверяешь будет скорее всего не сложно.

П.с. Вся соль ещё и в том, что при нанесении урона одним игроком другому мы точно знаем хотя-бы на 50%, что урон должен быть нанесён, и даже отключив вызов TakeDamage у жертвы, нам об этом сообщал киллер. А в данном случае у нас нет больше данных, кроме как от самой жертвы.

Geebrox
09.07.2016, 01:48
ааа вот значит что! Простите я просто не до конца понял принцип работы NOP

Да Вы обсолютно правы, про жертву и цель) Попробую что-то другое реализовать. Спасибо за ответ

P.S. а можно обратится к памяти клиента и отследить работу OnPlayerTakeDamage?

Nexius_Tailer
09.07.2016, 01:54
P.S. а можно обратится к памяти клиента и отследить работу OnPlayerTakeDamage?
Скорее всего можно.
Увы, я на этот вопрос не отвечу, ибо я против любых вмешательств в память клиента, даже если тот читер (такие уж у меня взгляды).
Был где-то мануал как пользоваться самой функцией, но адресов там очень много, и наверное потребуется какое-то время, чтобы найти нужный.

Geebrox
09.07.2016, 02:04
Спасибо всем кто пытался помочь. Тему оставлю открытым может кто-то знает адрес памяти и может ответит

ziggi
09.07.2016, 02:29
ааа вот значит что! Простите я просто не до конца понял принцип работы NOP

Да Вы обсолютно правы, про жертву и цель) Попробую что-то другое реализовать. Спасибо за ответ

P.S. а можно обратится к памяти клиента и отследить работу OnPlayerTakeDamage?

Нельзя, SendClientCheck может предоставить очень ограниченный набор данных.

Определить падение можно лишь с помощью проверки анимации (конечно, если и на анимации не включен NOP), пример можно посмотреть здесь (https://github.com/oscar-broman/samp-weapon-config/blob/master/weapon-config.inc#L2898-L2966).

Daniel_Cortez
09.07.2016, 09:25
Оно лицензируется под Apache License 2.0, а это значит, что библиотеку или её часть, можно использовать практически как угодно. Wiki (https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F_Apache#.D0.A3.D1.81.D0.BB.D0.BE.D0.B2.D0.B8.D1.8F_.D0.BB.D0.B8.D1.86.D0.B5.D0.BD.D0.B7.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F): "Единственным условием, накладываемым лицензией Apache, является информирование получателя о факте использования исходного кода."
Так об этом и речь: если просто вырезать код, это будет нарушением условий лицензии.



Определить падение можно лишь с помощью проверки анимации (конечно, если и на анимации не включен NOP), пример можно посмотреть здесь (https://github.com/oscar-broman/samp-weapon-config/blob/master/weapon-config.inc#L2898-L2966).
Знаю, что адресовано не мне, но беру свои слова обратно по поводу урона от падения: в этом инклуде реально учтено всё.



На самом деле самым сложным было лишь найти плагин SKY, на котором это всё работает, под линукс (благо добрые люди скомпилили в комментах).
Что верно, то верно. Раньше Slice размещал билды плагина на GitHub, но потом удалил их все (кроме последней версии для Windows), аргументируя тем, что версию для Linux легко собрать самостоятельно.
Видимо, решил, что раз легко ему, то и любой другой пользователь сможет собрать плагин. Довольно странное решение, на самом деле.

ziggi
09.07.2016, 10:05
Так об этом и речь: если просто вырезать код, это будет нарушением условий лицензии.

Почему? Если оставить пометку о том, откуда часть кода была заимствована и сообщить об этом автору, то условия не нарушаются. Или нет?


Что верно, то верно. Раньше Slice размещал билды плагина на GitHub, но потом удалил их все (кроме последней версии для Windows), аргументируя тем, что версию для Linux легко собрать самостоятельно.
Видимо, решил, что раз легко ему, то и любой другой пользователь сможет собрать плагин. Довольно странное решение, на самом деле.

Скорее всего многие жаловались на то, что плагин не работает на их дистрибутиве Linux. У каждого дистрибутива разные версии библиотек, поэтому не выкладывать бинарник Linux версии плагина вполне разумно (мне это предлагали для FCNPC).

vovandolg
09.07.2016, 11:51
А ведь можно просто чек на ID анимации падения(когда игрок падает он вроде бы не меняет анимку, если не сбивать её разве что) и прибавлять к переменной ++,
затем если анимация окончилась и хп не изменились можно дать поджопничка))

Daniel_Cortez
09.07.2016, 12:34
Почему? Если оставить пометку о том, откуда часть кода была заимствована и сообщить об этом автору, то условия не нарушаются. Или нет?
Речь была о том, чтобы только скопировать код.
А по поводу "указать, откуда было заимствовано" и "сообщить автору" - в лицензии об этом ни слова.
Зато есть требование передать получателю работы (как оригинала, так и производной) копию оригинальной лицензии. Благо, этот пункт лицензии безвреден - игроки на сервере не получают копию мода, а играют по сети, так что никаких получателей нет.
Ещё в изменённых файлах нужно оставлять пометки о том, что они были изменены, ну и, естественно, нужно сохранять в исходных файлах все упоминания об авторстве.
А теперь самое интересное: никаких упоминаний об авторстве нет ни в инклуде, ни в лицензии - и фиг пойми, в чём вообще был смысл добавлять лицензию, да ещё и в отдельном файле.
Вполне возможно, что в суде это можно интерпретировать, как отказ автора от авторских прав на код.



Скорее всего многие жаловались на то, что плагин не работает на их дистрибутиве Linux. У каждого дистрибутива разные версии библиотек, поэтому не выкладывать бинарник Linux версии плагина вполне разумно (мне это предлагали для FCNPC).
Так можно ж сделать пометку о том, для какого дистра бинарник. Хотя, вполне возможно, что ему просто надоели нубы личности, страдающие манией нажать кнопку "Download", ничего не читая.



А ведь можно просто чек на ID анимации падения(когда игрок падает он вроде бы не меняет анимку, если не сбивать её разве что) и прибавлять к переменной ++,
затем если анимация окончилась и хп не изменились можно дать поджопничка))
Анимацию можно отключить читами.

Geebrox
09.07.2016, 13:05
Знаю, что адресовано не мне, но беру свои слова обратно по поводу урона от падения: в этом инклуде реально учтено всё.

Подключил инклуд, все работает, но если включаю NOP, перестает распознавать урон. Я что-то не правильно делаю? Может что-то нужно настроить? (Честно говоря мне лень разбираться в этом инклуде)

ziggi
09.07.2016, 14:08
Подключил инклуд, все работает, но если включаю NOP, перестает распознавать урон. Я что-то не правильно делаю? Может что-то нужно настроить? (Честно говоря мне лень разбираться в этом инклуде)

Какой урон не распознаётся? Вызываются ли OnRejectedHit и OnInvalidWeaponDamage? Если да, то с какими данными?

DeimoS
09.07.2016, 14:47
А ведь можно просто чек на ID анимации падения(когда игрок падает он вроде бы не меняет анимку, если не сбивать её разве что) и прибавлять к переменной ++,
затем если анимация окончилась и хп не изменились можно дать поджопничка))

Говорилось же, что и на анимации можно отрубить NOP-ом.
А если не отрубать, то GTA сама имеет много случаев, когда урон от падения не проходит (наклонная поверхность/падение в воду и т.п.).
SA-MP - не тот мультиплеер, где можно скриптами создать 100% античит на урон без ложных срабатываний. Точнее, можно, но такой античит будет обходиться обычными NOP'ами. В общем, не в том мультиплеере вы этим занимаетесь.
Лучшим вариантом будет написать свой лаунчер с соответствующими античитами. Хотя и его умелые люди могут обойти.
Пишите свой мультиплеер, крч

- - - Добавлено - - -


Речь была о том, чтобы только скопировать код.
А по поводу "указать, откуда было заимствовано" и "сообщить автору" - в лицензии об этом ни слова.
Зато есть требование передать получателю работы (как оригинала, так и производной) копию оригинальной лицензии. Благо, этот пункт лицензии безвреден - игроки на сервере не получают копию мода, а играют по сети, так что никаких получателей нет.
Ещё в изменённых файлах нужно оставлять пометки о том, что они были изменены, ну и, естественно, нужно сохранять в исходных файлах все упоминания об авторстве.
А теперь самое интересное: никаких упоминаний об авторстве нет ни в инклуде, ни в лицензии - и фиг пойми, в чём вообще был смысл добавлять лицензию, да ещё и в отдельном файле.
Вполне возможно, что в суде это можно интерпретировать, как отказ автора от авторских прав на код.

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

vovandolg
09.07.2016, 14:57
Зачем тогда обсуждать тут это...
Зачем нагружать сервер Античитами если они обходятся...
Выдайте какому нибудь балбесу админку и пусть гоняет всех на сервере
Сделать привязку по мыльнице или мобиле и тогда после банов нарушителя за....ет регаться
и он прекратит вести себя так распущенно(или будет по всем фронтам забанен:diablo:)
И серв не нагружен и нарушители в бане:grin:

Geebrox
09.07.2016, 15:51
Какой урон не распознаётся? Вызываются ли OnRejectedHit и OnInvalidWeaponDamage? Если да, то с какими данными?

Любой урон не наносится при включение читов, без читов работает все нормально. Логировал OnPlayerDamage || OnInvalidWeaponDamage || OnRejectedHit. Сделал скрины:

Листать снизу --> вверх! (http://imgur.com/a/gj6i1)

Nexius_Tailer
09.07.2016, 16:45
Любой урон не наносится при включение читов, без читов работает все нормально. Логировал OnPlayerDamage || OnInvalidWeaponDamage || OnRejectedHit. Сделал скрины:

Листать снизу --> вверх! (http://imgur.com/a/gj6i1)
А вот тут действительно отловить невозможно, потому что игрок не падает и огонь на стороне клиента.

Geebrox
09.07.2016, 17:17
- - - Добавлено - - -


А вот тут действительно отловить невозможно, потому что игрок не падает и огонь на стороне клиента.

От падение тоже не наносится урон, вот только от другого игрока работает

- - - Добавлено - - -

Всем огромное спасибо за уделенное время на эту тему, возьму инклуд wc, полностью изучу систему урона. И реализую свою систему с похожим алгоритмом. А насчет урона от падение, огня, взрыва, я думаю невозможно полностью взять под свой контроль. Тему я думаю можно закрывать.