Кровотечение

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

  1. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Последнее редактирование: 11 дек 2015
  2. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    И что мне тогда делать? Как сделать так чтобы отнималось хп в X секунд и убивало мгновенно.
     
  3. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.593
    Симпатии:
    1.999
    В любом случае, не дело совмещать такое. Выполнять либо одно, либо другое.
    Больше смысла использовать обычное событие урона. Оффтоп
     
  4. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Мне бы придумать что-то с таймером который отнимает ХП.
    Оффтоп
     
  5. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.593
    Симпатии:
    1.999
    PHP:
    public Action:Bleed_Timer(Handle:timerany:userid){
        new 
    client GetClientOfUserId(userid);
        
        if (
    client)
        {
            new 
    cHealth GetClientHealth(client) - MINUS_BLEED_HP;
            
            if (
    cHealth 0){
                
    SetEntityHealth(clientcHealth);
            }
            else{
                
    PrintToChat(client"Ты умер");
                
    EmitSoundToClient(client"player/death1.wav"____1.0);
                
    ForcePlayerSuicide(client);
                
    Bleed[client] = false;
                return 
    Plugin_Stop;
            }
        }
        
        return 
    Plugin_Continue;
    }
    И никаких Datapack-таймеров! У тебя всего одно передаваемое int значение.
     
  6. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Primo так научил.
     
  7. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.006
    Симпатии:
    2.994
    Hejter, напиши изначальное тз, а то лень по коду разбираться.

    так нужно только когда у тебя больше 1 переменной или нужно передать строку
     
  8. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Если у игрока 30 хп или меньше вызывается кровотечение, так же есть шанс получения кровотечение.
    Кровотечение может быть вызвано путем повреждения.
     
  9. Primo

    Primo Где мои манеры

    Сообщения:
    1.192
    Симпатии:
    310
    Оффтоп
     
  10. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Нет команда не нужна, это я проверить, убивается ли таймер. Возможно потом добавил бы для других плагинов.
     
  11. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.006
    Симпатии:
    2.994
    ванг

    ванг #2

    PHP:
    public OnPluginStart()
    {
        
    HookEvent("player_death"PlayerDeath);
        
    HookEvent("player_hurt"PlayerHurt);
    }

    public 
    PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        
    Bleed[client] = false;
        
    ClientCommand(client,"r_screenoverlay 0");
        
        if(
    BleedTimerKill[client]) // это в ф-ю нужно вынести
        
    {
            
    KillTimer(BleedTimerKill[client]);
            
    BleedTimerKill[client] = INVALID_HANDLE;
        }
    }

    public 
    OnClientPutInServer(client)
    {
        
    Bleed[client] = false;
        
        if(
    BleedTimerKill[client])
        {
            
    KillTimer(BleedTimerKill[client]);
            
    BleedTimerKill[client] = INVALID_HANDLE;
        }
    }

    public 
    OnClientDisconnect(client)
    {
        
    Bleed[client] = false;
        
        if(
    BleedTimerKill[client])
        {
            
    KillTimer(BleedTimerKill[client]);
            
    BleedTimerKill[client] = INVALID_HANDLE;
        }
    }

    public 
    PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if(
    IsPlayerAlive(client) && Bleed[client] == false && client != GetClientOfUserId(GetEventInt(event"attacker")))
        {
            if(
    GetEventInt(event"health") < 30 && GetConVarFloat(BleedChance) >= GetRandomInt(0100)) // BleedChance от 0 до 100 %
            
    {
                
    BleedTimerKill[client] = CreateTimer(BLEED_TIMERBleed_TimerGetClientUserId(client), TIMER_REPEAT);
                
    PrintToChat(client"У тебя кровотечение");
                
    ClientCommand(clientg_blood[GetRandomInt(01)]);
                
    Bleed[victim] = true;
            }
        }
    }

    public 
    Action:Bleed_Timer(Handle:timerany:UserID)
    {
        new 
    client GetClientOfUserId(UserID);
        if (
    client && IsPlayerAlive(client) && Bleed[client])
        {
            new 
    cHealth GetClientHealth(client) - MINUS_BLEED_HP;
            if (
    cHealth 0)
            {
                
    SetEntityHealth(clientcHealth);
                return 
    Plugin_Continue;
            }
            
            
    PrintToChat(client"Ты умер");
            
    EmitSoundToClient(client"player/death1.wav"____1.0);
            
    ForcePlayerSuicide(client);
            
    Bleed[client] = false;
            
    BleedTimerKill[client] = INVALID_HANDLE;
        } 

        return 
    Plugin_Stop;
    }
     
  12. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Оффтоп
     
  13. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.593
    Симпатии:
    1.999
    Да прибудет строк в логах ошибок)
    Оффтоп Правильно, если бы тебе указывали на ошибки, а ты их исправлял, обновляя код. А так особо не научишься.
     
  14. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.006
    Симпатии:
    2.994
    AlmazON, что не так?

    Оффтоп

    Тут изначальн подход не тот
     
  15. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.006
    Симпатии:
    2.994
    AlmazON, вроде как везде всё сбрасывается
     
  16. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Как-то так.
    PHP:
    #pragma semicolon 1

    #include <sdkhooks>
    #include <sdktools>

    /* Переменные */
    #define BLEED_TIMER 3.0
    #define MINUS_BLEED_HP 2
    /* ========== */

    new Handle:BleedChance;

    new 
    bool:Bleed[MAXPLAYERS+1];

    new 
    Handle:BleedTimerKill[MAXPLAYERS+1];

    public 
    Plugin:myinfo = {
        
    author "Hejter",
        
    name "[CS:GO] Bleeding",
        
    description "Вызывает кровотечение с X шансом.",
        
    version "0.1",
        
    url "hlmod.ru & excw.ru",
    }

    public 
    OnPluginStart(){
        
    BleedChance CreateConVar("sm_bbb_chance""0.33""Шанс кровотечения, 1.00 = 100%, 0.50 = 50%, и т.д"FCVAR_PLUGIN);
        
        
    HookEvent("player_death"PlayerDeath);
        
    HookEvent("player_hurt"PlayerHurt);
        
        
    AutoExecConfig(true"sm_bleeding");
    }

    public 
    PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid")); 
        
    Bleed[client] = false
        
    ClientCommand(client,"r_screenoverlay 0"); 
         
        if(
    BleedTimerKill[client])
        { 
            
    KillTimer(BleedTimerKill[client]); 
            
    BleedTimerKill[client] = INVALID_HANDLE
        } 
    }

    public 
    OnClientPutInServer(client)
    {
        
    Bleed[client] = false;
        
        if(
    BleedTimerKill[client]) 
        { 
            
    KillTimer(BleedTimerKill[client]); 
            
    BleedTimerKill[client] = INVALID_HANDLE
        }
    }

    public 
    OnClientDisconnect(client)
    {
        if(
    BleedTimerKill[client]) 
        { 
            
    KillTimer(BleedTimerKill[client]); 
            
    BleedTimerKill[client] = INVALID_HANDLE
        }
        
        
    Bleed[client] = false;
    }

    /*
    public Action:Command_Bandage(client, args){
        if(IsClientInGame(client) && IsPlayerAlive(client)){
            {
                PrintToChat(client, "Ты перевязал себя!");
                ClientCommand(client,"r_screenoverlay 0");
                if(BleedTimerKill[client]) 
                { 
                    KillTimer(BleedTimerKill[client]); 
                    BleedTimerKill[client] = INVALID_HANDLE; 
                }
            }
        }
        return Plugin_Handled;
    } */
        
    public PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast){
        new 
    client GetClientOfUserId(GetEventInt(event"userid")); 
        
        new 
    Float:iBleedChance GetConVarFloat(BleedChance);
        new 
    Float:iRoll GetRandomFloat();
        if(
    IsPlayerAlive(client) && Bleed[client] == false && client != GetClientOfUserId(GetEventInt(event"attacker")))
        {
            if (
    iBleedChance >= iRoll)
            {    
                if (
    GetEventInt(event"health") < 30)
                {
                    
    BleedTimerKill[client] = CreateTimer(BLEED_TIMERBleed_TimerGetClientUserId(client), TIMER_REPEAT);
                    
    //ClientCommand(client,g_blood[GetRandomInt(0, 1)]);
                    
    Bleed[client] = true;
                }
            }
        }
    }

    public 
    Action:Bleed_Timer(Handle:timerany:UserID){ 
        new 
    client GetClientOfUserId(UserID); 
         
        if (
    client && IsPlayerAlive(client) && Bleed[client])  
        { 
            new 
    cHealth GetClientHealth(client) - MINUS_BLEED_HP
             
            if (
    cHealth 0){ 
                
    SetEntityHealth(clientcHealth);
                
    ClientCommand(client,"r_screenoverlay effects/blood2.vmt");             
                return 
    Plugin_Continue
            }
            
            
    EmitSoundToClient(client"player/death1.wav"____1.0);            
            
    ForcePlayerSuicide(client); 
            
    Bleed[client] = false
            if(
    BleedTimerKill[client]) 
            { 
                
    KillTimer(BleedTimerKill[client]); 
                
    BleedTimerKill[client] = INVALID_HANDLE
            }        
        } 
        return 
    Plugin_Stop
    }
    Осталось найти нормальный оверлей и пару мелочей дописать.
     
  17. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.006
    Симпатии:
    2.994
    Hejter, и оптимизировать.
    И
    тут согласен. при интервалах меньше 3 сек можно юзать 1 таймер. Игроки не заметят разницы.
     
  18. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.006
    Симпатии:
    2.994
    и оптимизировать
     
  19. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Нету ошибок.
    Мне бы функцию затемнение экрана. Функцию то нашел, но не понимаю как к ней прибавлять +1.
     
  20. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.006
    Симпатии:
    2.994