Привет, форумчане!
Недавно столкнулся с проблемой, что мой метод предотвращения смерти игрока оказался неэффективен.
В чём суть. Сейчас я отлавливаю возможную смерть через SDKHook_OnTakeDamage. Но вот проблема. Есть несколько плагинов, которые так или иначе отлавливают урон через это событие и как-либо меняют его.
Например. У меня на сервере стоит плагин, который не позволяет набивать очки урона зараженным за счёт урона от объектов (машины, контейнеры и тд). В ходе своей работы он меняет любой входящий урон от объекта до 100 единиц. Проблема в том, что проверка на смертельный урон происходит до того, как урон поменялся на 100, из-за чего игрок и умирает.
Логичный вопрос. Как сделать так, чтобы метод с проверкой на смертельный урон гарантированно вызывался последним в hook chain?
Отслеживание смерти игрока
#1
Отправлено 27 Март 2021 - 17:22
#2
Отправлено 28 Март 2021 - 12:54
Привет, форумчане!
Недавно столкнулся с проблемой, что мой метод предотвращения смерти игрока оказался неэффективен.
В чём суть. Сейчас я отлавливаю возможную смерть через SDKHook_OnTakeDamage. Но вот проблема. Есть несколько плагинов, которые так или иначе отлавливают урон через это событие и как-либо меняют его.
Например. У меня на сервере стоит плагин, который не позволяет набивать очки урона зараженным за счёт урона от объектов (машины, контейнеры и тд). В ходе своей работы он меняет любой входящий урон от объекта до 100 единиц. Проблема в том, что проверка на смертельный урон происходит до того, как урон поменялся на 100, из-за чего игрок и умирает.
Логичный вопрос. Как сделать так, чтобы метод с проверкой на смертельный урон гарантированно вызывался последним в hook chain?
Не совсем понял, что ты хочешь. Но по-моему достаточно просто выставить в хуке условие, когда клиент находится на грани смерти и любой входящий урон в этот момент обнулить
#3
Отправлено 28 Март 2021 - 21:17
Не совсем понял, что ты хочешь. Но по-моему достаточно просто выставить в хуке условие, когда клиент находится на грани смерти и любой входящий урон в этот момент обнулить
Говорю ж. Оно работает через раз из-за плагинов, которые меняют урон через хук. Проверка то эта есть, но она срабатывает раньше времени, а урон после этого поменялся.
Пример. У игрока 15 ХП и он ЧБ. Его ударил гром на 10 урона. 15-10 = 5. 5>2 (чтоб наверняка) => урон несмертельный, скрипт не срабатывает. Но сразу после этой проверки другой плагин изменил урон на 20 (тот же урон, что проверялся до этого). 20 уже смертельный урон, но проверка уже прошла и игрок умирает.
#4
Отправлено 29 Март 2021 - 1:45
Говорю ж. Оно работает через раз из-за плагинов, которые меняют урон через хук. Проверка то эта есть, но она срабатывает раньше времени, а урон после этого поменялся.
Пример. У игрока 15 ХП и он ЧБ. Его ударил гром на 10 урона. 15-10 = 5. 5>2 (чтоб наверняка) => урон несмертельный, скрипт не срабатывает. Но сразу после этой проверки другой плагин изменил урон на 20 (тот же урон, что проверялся до этого). 20 уже смертельный урон, но проверка уже прошла и игрок умирает.
Самый лучший вариант удалить из всех плагинов этот хук, и реализовать все в одном. Других вариантов я тут не вижу. Я в такой ситуации делал именно так
#5
Отправлено 29 Март 2021 - 4:52
Сделай convar булевский на бессмертие который во всех плагинах связанных с уроном чекается, если cv_godmode то любой урон игнорится во всех. Порядок в котором плагины обрабатывают хук не определен, так что иначе никак
Сообщение отредактировал anarki1980: 29 Март 2021 - 10:08
#6
Отправлено 29 Март 2021 - 12:30
Самый лучший вариант удалить из всех плагинов этот хук, и реализовать все в одном. Других вариантов я тут не вижу. Я в такой ситуации делал именно так
Делать солянку из плагинов с абсолютно разной логикой и назначением как то не комильфо
#7
Отправлено 29 Март 2021 - 12:43
И уж тем более не комильфо, если учесть, что эта работа весьма объемная, а профит минимален, но таков путь.
Еще можно попробовать использовать глобальные переменные чтобы была связь между плагинами, но это костыли, и не факт что проблема решится.
Если что то с бессмертием связанное нужно, то помимо квара можно юзать
SetEntProp(client, Prop_Data, "m_takedamage", 0, 1); откл. урон
SetEntProp(client, Prop_Data, "m_takedamage", 2, 1); вкл. урон
#8
Отправлено 29 Март 2021 - 13:34
Говорю ж. Оно работает через раз из-за плагинов, которые меняют урон через хук. Проверка то эта есть, но она срабатывает раньше времени, а урон после этого поменялся.
Пример. У игрока 15 ХП и он ЧБ. Его ударил гром на 10 урона. 15-10 = 5. 5>2 (чтоб наверняка) => урон несмертельный, скрипт не срабатывает. Но сразу после этой проверки другой плагин изменил урон на 20 (тот же урон, что проверялся до этого). 20 уже смертельный урон, но проверка уже прошла и игрок умирает.
сделай натив отдельным плагином, и в тех плагах, где у тебя хук SDKHook_OnTakeDamage делай дополнительную проверку на смерть и уже тогда из нег вызывай натив с необходимым алгоритмом или пиши код в обоих плагинах если он короткий
#9
Отправлено 30 Март 2021 - 13:22
Если по-простому, то можешь ставить SDKHook_OnTakeDamage хук отложенно, тогда он подцепится последним к цепочке вызовов.
- PawnLomaster это нравится
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных