Изменить дамаг

Тема в разделе "Программирование / Скриптинг", создана пользователем semjef, 10 апр 2012.

  1. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    такой вопрос: как изменить дамаг наносимый одним игроком другому?

    Вот что я попытался сделать через sdkhooks:
    PHP:
    #pragma semicolon 1

    #include <sdkhooks>

    public OnClientPostAdminCheck(client)
    {
        
    SDKHook(clientSDKHook_OnTakeDamageOnTakeDamage);
    }

    public 
    Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
    {
        if (
    AuraAuth[attacker])
        {
            if (
    auradamage[attacker] != 0)
            {
                new 
    victimhealth GetClientHealth(victim);
                new 
    newdamage
                new 
    String:s_damage[256];
                
    FloatToString(damages_damage256);
                new 
    i_damage StringToInt(s_damage);
                if(
    auradamagemode[attacker] == 0)
                {
                    
    newdamage =    i_damage auradamage[attacker];
                }    
                else
                {
                    
    newdamage i_damage RoundToNearest(i_damage 0.01 auradamage[attacker]);
                }
                
    victimhealth -= newdamage;
                if(
    victimhealth 1)
                {
                    
    victimhealth 0;
                }    
                
    SetEntityHealth(victimvictimhealth);
                return 
    Plugin_Handled;
            }    
            return 
    Plugin_Continue;
        }    
        else
        {
            return 
    Plugin_Continue;
        }
    }

    получается так что игрок с повышенным дамагом не может убить другого, тому просто выставляет 0 хп.
    а если игрок у которого нет этого повышеного дамага когонить коцает, сервер падает:DDD
     
  2. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Самый лёгкий способ так это хукнуть player_hurt и через SetEntityHealth(); отнимать хп до нужного колличества, но если отнимается хп больше, чем есть у клиента, то ставь SetEntityHealth(client, 0); тогда автоматом создаётся евент player_death и кароч всё ок. Можно даже переменные евента не изменять.

    И кстати, зачем при использовании СДК Хукс ты делал
    PHP:
    SetEntityHealth(victimvictimhealth);
    Там ведь указано в параметрах &Float:damage, то-есть указатель на адрес переменной. Достаточно было переприсвоить и вернуть Plugin_Changed.
     
    Последнее редактирование: 11 апр 2012
    semjef нравится это.
  3. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    PHP:
    public Player_Hurt(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    victim GetClientOfUserId(GetEventInt(event"userid"));
        new 
    client GetClientOfUserId(GetEventInt(event"attacker"));
        if (
    AuraAuth[client] && auradamage[client] != 0)
        {
            new 
    newdamage;
            new 
    dmg GetEventInt(event"dmg_health");
            new 
    hpvictim GetEventInt(event"health");
            if(
    auradamagemode[client] == 0)
            {
                
    newdamage =    auradamage[client];
            }    
            else
            {
                
    newdamage RoundToNearest(dmg 0.01 auradamage[client]);
            }
            
    hpvictim -= newdamage;
            if(
    hpvictim 1)
            {
                
    hpvictim 0;
            }    
            
    SetEntityHealth(victimhpvictim);
        }
    }
    когда атакует тот у кого повышен дамаг - всё супер, а когда тот у кого этого дамага нет - сервер падает((
     
  4. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Что это за код? O_O Просто ужас.
    Так много лишних участков, ужас прямо.
    PHP:
        new String:s_damage[256];
        
    FloatToString(damages_damage256);
        new 
    i_damage StringToInt(s_damage);
    Вот это вообще уникально, приводить к целому типу используя перевод числа с плавающей точкой в строку и из строки в целое? Такого способа я еще не видел :D

    Вот реализация через sdkhooks
    PHP:
    public OnClientPutInServer(client)
    {
     
    SDKHook(clientSDKHook_OnTakeDamageOnDamage);
    }
    public 
    Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
    {
     if (
    attacker && attacker MaxClients && AuraAuth[attacker] && auradamage[attacker]) {
      
    damage += (auradamagemode[attacker] == 0) ? auradamage[attacker] : RoundToNearest(damage 0.01 auradamage[attacker]);
      return 
    Plugin_Changed;
     }
     return 
    Plugin_Continue;
    }
    Не проверял, но должно работать.
     
    semjef нравится это.
  5. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Евент - это уведомление, то-есть евент уже говорит о том, что хп у виктима уже отнялось, ты должен отнять "дополнительно".
    PHP:
    newdamage RoundToNearest((dmg 0.01 auradamage[client]) - dmg);
    И если хп меньше, чем колличество дамаги, то ставить хп 0, то-есть
    PHP:
    if(newdamage hpvictim)
    {
        
    SetEntityHealth(victim0);
    }
    else
    {
        
    SetEntityHealth(victimhpvictim newdamage);
    }
    Пока писал ответ, S1deX уже тоже накалякал))
     
    S1deX нравится это.
  6. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    Игорь Охремчук, сервер падал при атаке того у кого нет дополнительного дамага, при том когда атачил человек с дамагом всё нормально.
     
  7. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Ты ведь хп виктиму в минуса загонял)) Что ты ещё ожидал?:lol:
     
  8. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    и new hpvictim = GetEventInt(event, "health"); помоему уже берёт то хп которое установилось игроку после попадания, разве нет?

    Добавлено через 46 секунд

         
    PHP:
     if(hpvictim 1)  
                hpvictim = 0
            }
    внимательнее...

    Добавлено через 15 минут
    S1deX, работает, но серв падает, ща попробую отдельным плагином это замутить, посмотрим что будет))
     
    Последнее редактирование: 11 апр 2012
  9. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Ну да, проморгал. А ты уверен, что именно из-за этого сервер падает?
    Я обоими вариантами делал и всё было ок.
     
  10. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    сейчас запилил вот такое:

    PHP:
    #pragma semicolon 1

    #include <sdkhooks>
    #include <sourcemod>
    #include <sdktools>
    #include <cstrike>

    public OnClientPostAdminCheck(client)
    {
        
    SDKHook(clientSDKHook_OnTakeDamageOnDamage);
    }

    public 
    Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
    {
        if (
    attacker && attacker MaxClients && !IsFakeClient(attacker)) 
        {
            
    damage += 1000;
            return 
    Plugin_Changed;
        }
        return 
    Plugin_Continue;
    }  
    всё норм работает, никак не вылетает, сейчас буду дальше тестить))

    Добавлено через 12 минут
    отключил HookEvent("player_hurt", Player_Hurt); и всё заработало, походу конфликтили:D
     
    Последнее редактирование: 11 апр 2012
  11. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    [email protected] :lol::lol::lol::lol::lol:
     
  12. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    ппц,
    работает:
    PHP:
    public Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
    {
        if (
    attacker && attacker MaxClients && AuraAuth[attacker] && auradamage[attacker]) 
        {
            
    damage += (auradamagemode[attacker] == 0) ? auradamage[attacker] : RoundToNearest(damage 0.01 auradamage[attacker]);
            return 
    Plugin_Changed;
        }
        return 
    Plugin_Continue;
    не работает:
    PHP:
    public Action:OnDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
    {
        if (
    attacker && attacker MaxClients && AuraAuth[attacker] && auradamage[attacker]) 
        {
            
    damage += (auradamagemode[attacker] == 0) ? auradamage[attacker] : RoundToNearest(damage 0.01 auradamage[attacker]);
            return 
    Plugin_Changed;
        }
        if (
    victim && victim MaxClients && AuraAuth[victim] && TimerReghp[victim] == INVALID_HANDLE && regHealthclient[client])
        {
            
    TimerReghp[victim] = CreateTimer(RegenTimer[victim] , RegenHPvictim);
        }
        return 
    Plugin_Continue;
    }
    Что за бред!?!?
     
  13. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Во-первых, индекс виктима проверять не надо, он в любом случае будет валиден. Ну а так - что именно не работает?
     
  14. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Думаю не работает таймер для регена хп при атаке игрока с увеличённым дамагом) Наверное, не все в курсе, что return - это не только возврат значения, но и в придачу выход из функции.

    semjef, если плагин не приватный, то лучше выложи весь исходник в спойлер, думаю так будет гораздо меньше гемороя.
     
    Последнее редактирование: 11 апр 2012
  15. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    http://hlmod.ru/forum/plaginy-dlya-sourcemod/7197-aura-database-v-3-0-1-a.html

    исходник более 700 строк))

    дамаг мб будет приваткой, как и ещё пара функций))
    также думаю сделать панельку для сайта))
    цена будет меньше некуда, просто хочу игрушку в стиме:DDDD
     
  16. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    До плагина дела нет, интерестно чё ты там намутил такого, что сервер падает :-D
     
  17. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    то что добавлял всё есть в теме, больше ничего))
     
  18. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Наверное, ты долго писал свою ауру)
    Я её даже один раз редактировал под kv, некоторым пользователям не по силам редактировать бд)
     
  19. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Хех, я в силу некоторых обстоятельств вернулся к бд :)
     
  20. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Даже не вики рекомендуется использовать бд, если размер кв превышает 10 кб вроде. :)
    Я на кв лично стараюсь только конфиги делать. Удобней для редактирования, чем миллион кваров)