Блокировка события урона

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
40
Реакции
6
Всем привет.
Столкнулся с простой задачей - блокировать полностью событие урона самому себе и от сервера (к примеру урон от токсичности, воды и т.п.)

Урон блочу так:
C-like:
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CPlayer_TakeDamage_Pre", .post = false);

public CPlayer_TakeDamage_Pre(iVictim, iInflictor, iAttacker, Float:flDamage, iBitsDamageType)
{

    if ((iVictim==iAttacker) || (iAttacker)==0)
    {
        SetHookChainArg(4,ATYPE_FLOAT, 0.0)
        return HC_SUPERCEDE;
    }
    
    //....

    return HC_CONTINUE
}
Есть ли универсальный способ запретить дальнейший вызов сопутствующих событию получения урона функций, а именно:
  • при падении с высоты не воспроизводить звук приземления
  • при получении урона от долгого нахождения в воде запретить дальнейший реген HP

Костылями это сделать можно (вроде проверки в Think'е), но возможно есть способ проще?
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
Полностью заблокировать урон (в том числе, ослепление от слеповых гранат) можно так: set_entvar(id, var_takedamage, DAMAGE_NO);
 
Сообщения
40
Реакции
6
w0w, ну не так кардинально, урон от игроков и ослепление нужно оставить.
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
hANSON, вместо SetHookChainArg(4, ATYPE_FLOAT, 0.0) нужно SetHookChainReturn(ATYPE_BOOL, false);
 
Сообщения
40
Реакции
6
fl0wer, заменил на SetHookChainReturn(ATYPE_BOOL, false) - так еще и урон проходит.
 
Сообщения
22
Реакции
12
hANSON, убрать звук падения +"common/bodysplat.wav" , когда игрок разбился
Код:
#include <amxmodx>
#include <reapi>

#pragma semicolon 1

public plugin_init() {
    register_plugin("No fall damage", "0.1", "s1lent");
    RegisterHookChain(RG_CSGameRules_FlPlayerFallDamage, "FwdTakeDamagePost", 1);
}

public FwdTakeDamagePost() {
    SetHookChainReturn(ATYPE_FLOAT, 0.0);
}
 
  • Нравится
Реакции: Ayk
Сообщения
40
Реакции
6
Dmitriy1999, спасибо, возьму на заметку. Нужно еще решить вторую задачку - при получении урона от долгого нахождения в воде запретить дальнейший реген HP.
Желательно конечно универсальное решение для обоих случаев (если оно существует)
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
hANSON, обнови реапи.
 
  • Нравится
Реакции: Ayk
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
iBitsDamageType в помощь. Игнорь весь урон, который тебе не нужен.
 
  • Нравится
Реакции: Ayk
Сообщения
40
Реакции
6
Minni, весь вопрос - что написать после этой проверки. Как проигнорить событие урона?
fl0wer, Обновился с 5.10.0.188 до 5.11.0.190 (+Regame), ситуация не изменилась :scratch_one-s_head:
Dmitriy1999, спасибо. Если не найдем универсального решения, буду использовать данные методы :)
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
hANSON, пример:
Код:
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CPlayer_TakeDamage_Pre", .post = false);

public CPlayer_TakeDamage_Pre(iVictim, iInflictor, iAttacker, Float:flDamage, iBitsDamageType)
{

    if ((iVictim==iAttacker) || (iAttacker)==0 || (~iBitsDamageType & DMG_BULLET))
    {
        SetHookChainArg(4, ATYPE_FLOAT, 0.0);
        return HC_CONTINUE;
    }
   
    //....

    return HC_CONTINUE;
}
 
Последнее редактирование:
Сообщения
40
Реакции
6
Minni, это понятно :) Вопрос - что нужно сделать после выполнения данного условия?
Нужно чтобы в движке по этому условию не вызывалось событие урона (не путать с тем как у меня написано - установкой урона в 0). fl0wer как раз и предложил заменить на SetHookChainReturn, но почему то он не срабатывает.
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
SetHookChainReturn(ATYPE_INTEGER, 0);
return HC_SUPERCEDE;
Прекрасно блочит.

Возможно дело в проверках. Можешь задебажить значения виктима, инфликтора и атакера.

И для твоих задач больше подойдет проверка iBitsDamageType & DMG_FALL. В случае с водой нужно ещё обнулять переменные, в инете вроде было уже.
 
Последнее редактирование:
  • Нравится
Реакции: Ayk
Сообщения
40
Реакции
6
Minni, хороший вариант
fl0wer, то что нужно:good2: В моем случае дамаг от воды тоже можно заблочить.

C-like:
    if (~iBitsDamageType & DMG_BULLET)
    {
        SetHookChainReturn(ATYPE_INTEGER, 0);
        return HC_SUPERCEDE;
    }
Здесь как раз не будет события урона от воды и как следствие не будет дальнейшего регена. То что нужно.
Спасибо.
 
Последнее редактирование:
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
hANSON, ты блочишь весь урон, кроме пуль, что выглядит как дурной тон. Лучше фолл и DMG_DROWN проверять.
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
fl0wer, так ему это изначально и нужно было, чтобы любой урон (падение, фриз, кислород и т.п.), вплоть от самого себя, кроме урона от пуль, не проходил по игроку.
 
Сообщения
40
Реакции
6
fl0wer, добавил в условие еще урон от гранат самому себе. Кроме пуль и нанесенного урона от гранаты противнику любой другой урон мне нужно блочить. Что я могу таким образом лишнее заблочить?
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу