Помогите с бонусом за 2 убийства за 20 сек

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

  1. -LeXuS-

    -LeXuS-

    Сообщения:
    117
    Симпатии:
    51
    Помогите сделать чтобы после первого убийства включался таймер на 20 сек, и если игрок за это время совершит 2 убийство, то ему давался бонус. Так же если он после этого, в течении 10 сек совершит 3 убийство давался еще больший бонус.
    PHP:
    public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    attacker =  GetClientOfUserId(GetEventInt(event"attacker"));

        if(
    attacker && !IsFakeClient(attacker))
        {
            
    killcount[attacker] += 1;

            if(
    killcount[attacker] >= 2)
            {
                
    SetEntProp(attackerProp_Send"m_iHealth"120);
                
    SetEntProp(attackerProp_Send"m_ArmorValue"120);
            }
            if(
    killcount[attacker] >= 3)
            {
                
    SetEntProp(attackerProp_Send"m_iHealth"150);
                
    SetEntProp(attackerProp_Send"m_ArmorValue"150);
                
    killcount[attacker] == 0;
            }
        }
    }
     
  2. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.565
    Симпатии:
    1.150
    -LeXuS-, вот тебе пример кода.
    PHP:
    #pragma semicolon 1

    #include <sourcemod>

    new g_iKills[MAXPLAYERS+1],
        
    Handle:g_hTimerKill[MAXPLAYERS+1] = INVALID_HANDLE;
        
    public 
    Plugin:myinfo =  
    {
        
    name "Kill Bonus",
        
    author "",
        
    description "Gives someone Hp, Armor on a kill",
        
    version "0.1",
        
    url "www.hlmod.ru"
    }

    public 
    OnPluginStart()
    {
        
    HookEvent("player_death"Event_PlayerDeath);
    }

    public 
    Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    iClient =  GetClientOfUserId(GetEventInt(event"attacker"));
      
        if(
    iClient && !IsFakeClient(iClient))
        {
            
    g_iKills[iClient]++;
        
            if(
    g_hTimerKill[iClient] == INVALID_HANDLE)
                
    g_hTimerKill[iClient] = CreateTimer(20.0TimerKilliClient);
        }
    }

    public 
    Action:TimerKill(Handle:timerany:iClient)
    {
        if (
    IsClientInGame(iClient) && IsPlayerAlive(iClient))
        {    
            
    g_iKills[iClient] = iKill;
            
            new 
    iCurrentHp    GetClientHealth(iClient),
                
    iCurrentAr    GetClientArmor(iClient);
            
            switch(
    iKill)
            {
                case 
    1:
                {
                    
    SetEntProp(iClientProp_Send"m_iHealth"iCurrentHp 10);
                    
    SetEntProp(iClientProp_Send"m_ArmorValue"iCurrentAr 10);
                }
                case 
    2:
                {
                    
    SetEntProp(iClientProp_Send"m_iHealth"iCurrentHp 20);
                    
    SetEntProp(iClientProp_Send"m_ArmorValue"iCurrentAr 20);
                }
                case 
    3:
                {
                    
    SetEntProp(iClientProp_Send"m_iHealth"iCurrentHp 30);
                    
    SetEntProp(iClientProp_Send"m_ArmorValue"iCurrentAr 30);
                }
                
    // и хоть сколько
                
    default:  // тут все остальные
                
    {
                    
    SetEntProp(iClientProp_Send"m_iHealth"iCurrentHp 50);
                    
    SetEntProp(iClientProp_Send"m_ArmorValue"iCurrentAr 50);
                }
            }
        }
        
    g_iKills[iClient] = 0;
        
    g_hTimerKill[iClient] == INVALID_HANDLE;
    }  
     
    Последнее редактирование: 22 фев 2015
    -LeXuS- нравится это.
  3. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Лучше не таймером это делать, а получать время сервера. Пример можно глянуть в QUAKE sounds.
     
    -LeXuS- нравится это.
  4. vanbka9

    vanbka9

    Сообщения:
    14
    Симпатии:
    13
    -LeXuS-, Надеюсь понятный пример кода без таймера
    PHP:
    #pragma semicolon 1

    #define PERVIY_KILL     20.0
    #define VTOROY_KILL     10.0

    #define BONUS_HEALT_KILL     15
    #define BONUS_ARMOR_KILL     15

    #define BONUS_HEALT_KILL2    30
    #define BONUS_ARMOR_KILL2    30


    new bool:raz[MAXPLAYERS+1] = false;
    new 
    bool:dva[MAXPLAYERS+1] = false;
    new 
    Float:raz_time[MAXPLAYERS+1];
    new 
    Float:dva_time[MAXPLAYERS+1];
    new 
    Float:null_dva_time[MAXPLAYERS+1];
    new 
    Float:null_tri_time[MAXPLAYERS+1];

    public 
    OnPluginStart()
    {
        
    HookEvent("player_death",    player_death,    EventHookMode_Post);
    }

    public 
    Action:player_death(Handle:event,const String:name[],bool:dontBroadcast)
    {
        
    decl icurr_healtcurr_armor;
        
    GetClientOfUserId(GetEventInt(event"attacker"));
        
    curr_healt GetClientHealth(i);
        
    curr_armor GetClientArmor(i);
        if (!
    raz[i])
        {
            
    raz_time[i] = GetEngineTime();
            
    PrintToServer("[TEST] => raz_time[i] %f"raz_time[i]);
            
    raz[i] = true;
            return 
    Plugin_Continue;
        }
        else
        {
            
    null_dva_time[i] = GetEngineTime()-raz_time[i];
            
    PrintToServer("[TEST] => null_dva_time[i] %f"null_dva_time[i]);
            if (
    null_dva_time[i] < PERVIY_KILL && !dva[i])
            {
                
    dva_time[i] = GetEngineTime();
                
    PrintToServer("[TEST] => dva_time[i] %f"dva_time[i]);
                
    SetEntProp(iProp_Send"m_iHealth"curr_healt BONUS_HEALT_KILL);
                
    SetEntProp(iProp_Send"m_ArmorValue"curr_armor BONUS_ARMOR_KILL);
                
    dva[i] = true;
                return 
    Plugin_Continue;
            }
            else
                
    raz[i] = false;
        }
        if (
    dva[i])
        {
            
    null_tri_time[i] = GetEngineTime()-dva_time[i];
            
    PrintToServer("[TEST] => null_tri_time[i] %f"null_tri_time[i]);
            
            if (
    null_tri_time[i] < VTOROY_KILL)
            {
                
    PrintToServer("[TEST] => ACTION!!!");
                
    SetEntProp(iProp_Send"m_iHealth"curr_healt BONUS_HEALT_KILL2);
                
    SetEntProp(iProp_Send"m_ArmorValue"curr_armor BONUS_ARMOR_KILL2);
                
    raz[i] = false;
                
    dva[i] = false;
            }
            else
            {
                
    PrintToServer("[TEST] => NE USPEL");
                
    raz[i] = false;
                
    dva[i] = false;
            }
        }
        return 
    Plugin_Continue;
    }

     

    Вложения:

    • primer.sp
      Размер файла:
      2 КБ
      Просмотров:
      1
    -LeXuS- нравится это.
  5. AlmazON

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

    Сообщения:
    4.539
    Симпатии:
    1.984
    Simple Kill Bonus - бонус за 2-3 убийства на время

    Такая куча переменных и действий с ними...
    Вот мой более оптимальный и простой пример:
    PHP:
    #define VTOROJ_KILL     20.0 
    #define TRETIJ_KILL     30.0 

    #define BONUS_HEALT_KILL     15 
    #define BONUS_ARMOR_KILL     15 

    #define BONUS_HEALT_KILL2    30 
    #define BONUS_ARMOR_KILL2    30 

    new bool:DoubleKill[MAXPLAYERS+1], Float:fTime[MAXPLAYERS+1]; 

    public 
    OnPluginStart() 
    {
        
    HookEvent("player_death",        player_death);
        
    HookEvent("player_activate",    player_activate);
    }

    public 
    player_activate(Handle:event,String:name[],bool:dontBroadcast)
    {
        new 
    GetClientOfUserId(GetEventInt(event"userid"));
        
    fTime[i] = 0.0;
        
    DoubleKill[i] = false;
    }

    public 
    player_death(Handle:event,String:name[],bool:dontBroadcast)
    {
        new 
    GetEventInt(event"attacker");
        if (
    GetEventInt(event"userid") != && (GetClientOfUserId(i)))
        {
            if (
    DoubleKill[i])
            {
                
    DoubleKill[i] = false;
                if ((
    GetEngineTime() - fTime[i]) <= TRETIJ_KILL)
                {
                    
    SetEntProp(iProp_Send"m_iHealth"GetClientHealth(i) + BONUS_HEALT_KILL2);
                    
    SetEntProp(iProp_Send"m_ArmorValue"GetClientArmor(i) + BONUS_ARMOR_KILL2);
                    
    PrintToChat(i"Третье убийство! Вы получили бонус в размере %i HP и %i брони!"BONUS_HEALT_KILL2BONUS_ARMOR_KILL2);
                }
                
    fTime[i] = 0.0;
            }
            else if (
    fTime[i])
            {
                if ((
    GetEngineTime() - fTime[i]) <= VTOROJ_KILL)
                {
                    
    SetEntProp(iProp_Send"m_iHealth"GetClientHealth(i) + BONUS_HEALT_KILL);
                    
    SetEntProp(iProp_Send"m_ArmorValue"GetClientArmor(i) + BONUS_ARMOR_KILL);
                    
    DoubleKill[i] = true;
                    
    PrintToChat(i"Второе убийство! Вы получили бонус в размере %i HP и %i брони!"BONUS_HEALT_KILLBONUS_ARMOR_KILL);
                }
                else 
    fTime[i] = 0.0;
            }
            else
            {
                
    fTime[i] = GetEngineTime();
                
    PrintToChat(i"Соверши другие убийства быстро и получи бонус!");
            }
        }
    }
    За самое первое убийство ничего не даётся.
    Если второе совершено за VTOROJ_KILL секунд времени, то ему выдаст бонус в размере BONUS_HEALT_KILL HP к его здоровью и BONUS_ARMOR_KILL к его броне.
    Если третье совершено за TRETIJ_KILL секунд времени, то ему выдаст бонус в размере BONUS_HEALT_KILL2 HP к его здоровью и BONUS_ARMOR_KILL2 к его броне.
    Если игрок не успевает - сброс и нужно снова совершить 2-3 убийства подряд.
    player_activate осуществляет новый счёт бонусов, когда игрок переподключился (или это другой игрок), а также в случае смены карты на сервере.
    Предусмотрены самоубийства, в отличии от примеров выше, но нет моментального сброса, когда самого "лидера" убивают.
     
    TWRP, -LeXuS- и Hejter нравится это.
  6. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Re: Simple Kill Bonus - бонус за 2-3 убийства на время

    Самый адекватный пример кода, имхо.
     
    AlmazON нравится это.
  7. -LeXuS-

    -LeXuS-

    Сообщения:
    117
    Симпатии:
    51
    Re: Simple Kill Bonus - бонус за 2-3 убийства на время

    AlmazON,
    Иногда бывает, совершаешь убийство и выходит сообщение "Соверши другие убийства быстро и получи бонус!". Убиваешь второго, но если не успеваешь убить за VTOROJ_KILL секунд, то ничего не происходит (по сути же должно вылезти тоже самое сообщение?), убиваешь третьего и тут снова это сообщение
     
  8. AlmazON

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

    Сообщения:
    4.539
    Симпатии:
    1.984
    Неа. Внимательней:
    Сбрасывает твою попытку на 0. Оффтоп Если хочешь исправить, чтобы это считалось 1 убийством, то приравняй: fTime = GetEngineTime(); для функции во втором убийстве, вместо 0.0.
    Ты имеешь ввиду после третьего? Потому что это конец бонусов)
    Как сам хотел то? Я просто дал "разнообразный" пример.
     
    Последнее редактирование: 23 фев 2015
    -LeXuS- нравится это.