Изменение урона

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
Никак не хочет менять силу урона, fNewDmg устанавливает нужное количество, но там дамаг fDamage никак не меняется, где ошибка?

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>

public void OnPluginStart()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i);
}

public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iClient, int &iAttaker, int &iInflictor, float &fDamage, int &iDamageType)
{
    PrintToChatAll("Нанёс [%.2f]", fDamage);
    float fDmgInc = 50.0, fNewDmg = fDamage;
    if(iAttaker && iAttaker <= MaxClients && IsClientInGame(iAttaker))
    {
        fNewDmg *= 1.0 + fDmgInc/100.0;
        PrintToChatAll("Игрок [%N] нанёс [%.2f] урона [%N]", iAttaker, fNewDmg, iClient);
        return Plugin_Changed;
    }
    PrintToChatAll("Нанёс 2 [%.2f]", fDamage);
    return Plugin_Continue;
}
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@Nekro, потому что fNewDamage - новый урон, который установится после окончания хука (то есть после return), а fDamage - в момент хука. Если меняется fNewDamage, то соответственно его и выводить в чат
P.S. Приравнять забыл
 

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
Тогда вообще урон не проходит
Сообщения автоматически склеены:

@Nekro, потому что fNewDamage - новый урон, который установится после окончания хука (то есть после return), а fDamage - в момент хука. Если меняется fNewDamage, то соответственно его и выводить в чат
P.S. Приравнять забыл
Так его и вывожу, можно по подробнее?
 

Madness aka null138

Участник
Сообщения
713
Реакции
739
Тогда вообще урон не проходит
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>

public void OnPluginStart()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i);
}

public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iClient, int &iAttaker, int &iInflictor, float &fDamage, int &iDamageType)
{
    PrintToChatAll("Нанёс [%.2f]", fDamage);
    float fDmgInc = 50.0, fNewDmg = fDamage;
    if(iAttaker && iAttaker <= MaxClients && IsClientInGame(iAttaker))
    {
        fNewDmg *= 1.0 + fDmgInc/100.0;
        fDamage = fNewDmg;
        PrintToChatAll("Игрок [%N] нанёс [%.2f] урона [%N]", iAttaker, fNewDmg, iClient);
        return Plugin_Changed;
    }
    PrintToChatAll("Нанёс 2 [%.2f]", fDamage);
    return Plugin_Continue;
}
 

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>

public void OnPluginStart()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i);
}

public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iClient, int &iAttaker, int &iInflictor, float &fDamage, int &iDamageType)
{
    PrintToChatAll("Нанёс [%.2f]", fDamage);
    float fDmgInc = 50.0, fNewDmg = fDamage;
    if(iAttaker && iAttaker <= MaxClients && IsClientInGame(iAttaker))
    {
        fNewDmg *= 1.0 + fDmgInc/100.0;
        fDamage = fNewDmg;
        PrintToChatAll("Игрок [%N] нанёс [%.2f] урона [%N]", iAttaker, fNewDmg, iClient);
        return Plugin_Changed;
    }
    PrintToChatAll("Нанёс 2 [%.2f]", fDamage);
    return Plugin_Continue;
}
Вообще нет урона
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@Nekro, а если без лишних переменных?
fDamage *= 1.0 + 0.01*fDmgInc;
 

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
@Nekro, а если без лишних переменных?
fDamage *= 1.0 + 0.01*fDmgInc;
Так работает, спасибо

C-подобный:
Нанёс [65.00]
Игрок [Nek.'a 2x2] нанёс [97.50] урона [Дедуськина бабус]

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>

public void OnPluginStart()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) OnClientPutInServer(i);
}

public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iClient, int &iAttaker, int &iInflictor, float &fDamage, int &iDamageType)
{
    PrintToChatAll("Нанёс [%.2f]", fDamage);
    float fDmgInc = 50.0, fNewDmg;
    
    if(iAttaker && iAttaker <= MaxClients && IsClientInGame(iAttaker))
    {
        fDamage *= 1.0 + 0.01*fDmgInc;
        //fNewDmg *= 1.0 + fDmgInc/100.0;
        //fDamage = fNewDmg;
        PrintToChatAll("Игрок [%N] нанёс [%.2f] урона [%N]", iAttaker, fDamage, iClient);
        return Plugin_Changed;
    }
    PrintToChatAll("Нанёс 2 [%.2f]", fDamage);
    return Plugin_Continue;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Nekro, а почему не просто fDamage *= 1.5;?
К чему неиспользуемые переменные?
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
Никак не хочет менять силу урона, fNewDmg устанавливает нужное количество, но там дамаг fDamage никак не меняется, где ошибка?

Странная какая-то схема.

Почему для определения нанесенного ущерба не пользоваться событиями в HookEvent("player_hurt",
там есть масса событий, одно из них это GetEventInt(event, "dmg_health"); получишь значение полученного ущерба.
А если нужно нанести определенный ущерб - использовать что нибудь типа env_explosion, point_hurt и т.п, и уже там задавать начальные значения ущерба, вплоть до рендомных.
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@tonline_kms65_1, а что мешает напрямую хукнуть получение урона, а не использовать кривой костыль?
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@tonline_kms65_1, а что мешает напрямую хукнуть получение урона, а не использовать кривой костыль?
С каких пор хук перестал быть кривым костылём а игровые события выпрямились 😉? Расскажи, очень интересно стало.
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@tonline_kms65_1, м/б потому что событие, которое отлавливается через HookEvent() вызывается в самую последнюю очередь?
и если нужно уменьшать получаемый урон, то в некоторых случаях придётся воскрешать игрока, возвращать всё оружие и патроны в обойме, что было у него, телепортировать его в ту же позицию, забирать смерть в счётчике у него и фраг у убийцы.

Это вместо того, чтобы просто изменить значение наносимого урона.

Ну ещё в событии уже посчитан урон с учётом брони и точки попадения (хэдшот или нога, например).
 

tonline_kms65_1

Участник
Сообщения
565
Реакции
225
@tonline_kms65_1,
Ну ещё в событии уже посчитан урон с учётом брони и точки попадения (хэдшот или нога, например).
Ну так я о чем и говорю, зачем что-то громоздить и заниматься <cut>, когда есть все готовое и легко осуществимое?
А вот если разговор идет об изменении каких либо игровых событий - это уже другое дело, там уже нужно хукать, хахать и т.д.
Вопрос - зачем это делать?
Да и не стоял так вопрос у автора, ему, как я понял, нужен был реальный ущерб - вот я и предложил реальное решение без головняков, без всяких хуков. Можно точно получить все события, кто стрелял, в какую часть тела попал, сколько нанес ущерба, и т.д. и т.п.
Вот это моё мнение, как по мне - это лучше чем хукать(если не нужно изменять игровые события).
 
Последнее редактирование модератором:
Сверху Снизу