Перейти к содержимому


Фотография

Отслеживание смерти игрока


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 27 Март 2021 - 17:22

Привет, форумчане!
Недавно столкнулся с проблемой, что мой метод предотвращения смерти игрока оказался неэффективен.
В чём суть. Сейчас я отлавливаю возможную смерть через SDKHook_OnTakeDamage. Но вот проблема. Есть несколько плагинов, которые так или иначе отлавливают урон через это событие и как-либо меняют его.
Например. У меня на сервере стоит плагин, который не позволяет набивать очки урона зараженным за счёт урона от объектов (машины, контейнеры и тд). В ходе своей работы он меняет любой входящий урон от объекта до 100 единиц. Проблема в том, что проверка на смертельный урон происходит до того, как урон поменялся на 100, из-за чего игрок и умирает.
Логичный вопрос. Как сделать так, чтобы метод с проверкой на смертельный урон гарантированно вызывался последним в hook chain?



#2 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 28 Март 2021 - 12:54

Привет, форумчане!
Недавно столкнулся с проблемой, что мой метод предотвращения смерти игрока оказался неэффективен.
В чём суть. Сейчас я отлавливаю возможную смерть через SDKHook_OnTakeDamage. Но вот проблема. Есть несколько плагинов, которые так или иначе отлавливают урон через это событие и как-либо меняют его.
Например. У меня на сервере стоит плагин, который не позволяет набивать очки урона зараженным за счёт урона от объектов (машины, контейнеры и тд). В ходе своей работы он меняет любой входящий урон от объекта до 100 единиц. Проблема в том, что проверка на смертельный урон происходит до того, как урон поменялся на 100, из-за чего игрок и умирает.
Логичный вопрос. Как сделать так, чтобы метод с проверкой на смертельный урон гарантированно вызывался последним в hook chain?

 

Не совсем понял, что ты хочешь. Но по-моему достаточно просто выставить в хуке условие, когда клиент находится на грани смерти и любой входящий урон в этот момент обнулить



#3 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 28 Март 2021 - 21:17

Не совсем понял, что ты хочешь. Но по-моему достаточно просто выставить в хуке условие, когда клиент находится на грани смерти и любой входящий урон в этот момент обнулить

Говорю ж. Оно работает через раз из-за плагинов, которые меняют урон через хук. Проверка то эта есть, но она срабатывает раньше времени, а урон после этого поменялся.
Пример. У игрока 15 ХП и он ЧБ. Его ударил гром на 10 урона. 15-10 = 5. 5>2 (чтоб наверняка) => урон несмертельный, скрипт не срабатывает. Но сразу после этой проверки другой плагин изменил урон на 20 (тот же урон, что проверялся до этого). 20 уже смертельный урон, но проверка уже прошла и игрок умирает.



#4 8rutu5

8rutu5

    Пользователь

  • Пользователь
  • PipPipPip
  • 397 сообщений

Отправлено 29 Март 2021 - 1:45

Говорю ж. Оно работает через раз из-за плагинов, которые меняют урон через хук. Проверка то эта есть, но она срабатывает раньше времени, а урон после этого поменялся.
Пример. У игрока 15 ХП и он ЧБ. Его ударил гром на 10 урона. 15-10 = 5. 5>2 (чтоб наверняка) => урон несмертельный, скрипт не срабатывает. Но сразу после этой проверки другой плагин изменил урон на 20 (тот же урон, что проверялся до этого). 20 уже смертельный урон, но проверка уже прошла и игрок умирает.

 

Самый лучший вариант удалить из всех плагинов этот хук, и реализовать все в одном. Других вариантов я тут не вижу. Я в такой ситуации делал именно так



#5 anarki1980

anarki1980

    Участник

  • Пользователь
  • PipPip
  • 147 сообщений

Отправлено 29 Март 2021 - 4:52

Сделай convar булевский на бессмертие который во всех плагинах связанных с уроном чекается, если cv_godmode то любой урон игнорится во всех. Порядок в котором плагины обрабатывают хук не определен, так что иначе никак


Сообщение отредактировал anarki1980: 29 Март 2021 - 10:08


#6 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 29 Март 2021 - 12:30

Самый лучший вариант удалить из всех плагинов этот хук, и реализовать все в одном. Других вариантов я тут не вижу. Я в такой ситуации делал именно так

Делать солянку из плагинов с абсолютно разной логикой и назначением как то не комильфо



#7 Ren89

Ren89

    Пользователь

  • Пользователь
  • PipPipPip
  • 291 сообщений

Отправлено 29 Март 2021 - 12:43

И уж тем более не комильфо, если учесть, что эта работа весьма объемная, а профит минимален, но таков путь.

Еще можно попробовать использовать глобальные переменные чтобы была связь между плагинами, но это костыли, и не факт что проблема решится.

Если что то с бессмертием связанное нужно, то помимо квара можно юзать 

SetEntProp(client, Prop_Data, "m_takedamage", 0, 1); откл. урон

SetEntProp(client, Prop_Data, "m_takedamage", 2, 1); вкл. урон



#8 Goldfish

Goldfish

    Пользователь

  • Пользователь
  • PipPipPip
  • 388 сообщений

Отправлено 29 Март 2021 - 13:34

Говорю ж. Оно работает через раз из-за плагинов, которые меняют урон через хук. Проверка то эта есть, но она срабатывает раньше времени, а урон после этого поменялся.
Пример. У игрока 15 ХП и он ЧБ. Его ударил гром на 10 урона. 15-10 = 5. 5>2 (чтоб наверняка) => урон несмертельный, скрипт не срабатывает. Но сразу после этой проверки другой плагин изменил урон на 20 (тот же урон, что проверялся до этого). 20 уже смертельный урон, но проверка уже прошла и игрок умирает.

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



#9 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 30 Март 2021 - 13:22

Если по-простому, то можешь ставить SDKHook_OnTakeDamage хук отложенно, тогда он подцепится последним к цепочке вызовов.


  • PawnLomaster это нравится


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных