Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
MULTIKILL, вывод последнего значения!?
Sunday Дата: Вторник, 23.04.2013, 02:04:53 | Сообщение # 1
Сообщений: 186
Репутация: 24 [ +/- ]
Здорова мужики, второй день ломаю голову, делаю МУЛЬТИКИЛЛ, когда более 2х или 3х, 4х игроков убиваешь то выполняется функция. В общем проблема в том что не получается задержать последнее значение и выполнить его... Выходит так, если я убиваю 2х одновременно, то все в порядке, если я убиваю 3х то срабатывает 2х и сразу 3х, а нужно что бы сработало только трех. Возможно есть более простой способ как это сделать без таймера?

Вот что на данном этапе получилось:

Код

#include <sourcemod>

new Float:NewKillTime[MAXPLAYERS+1];
new GetNumberKills[MAXPLAYERS+1];

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

public Action:Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    new PlayerVictim = GetClientOfUserId(GetEventInt(event, "userid"));
    new PlayerWinner = GetClientOfUserId(GetEventInt(event, "attacker"));

    new Float:LastKillTime = NewKillTime[PlayerWinner];
    NewKillTime[PlayerWinner] = GetEngineTime();

    if(LastKillTime == -1.0 || (NewKillTime[PlayerWinner] - LastKillTime) > 0.3)
    {
     GetNumberKills[PlayerWinner] = 1;
    }
    else
    {
     GetNumberKills[PlayerWinner]++;
    }

    switch (GetNumberKills[PlayerWinner])
    {
     case 2:
     {
      PrintToChatAll("Double Kill");
     }
     case 3:
     {
      PrintToChatAll("Triple Kill");
     }
     case 4:
     {
      PrintToChatAll("Quadruple Kill");
     }
    }

    NewKillTime[PlayerVictim] = -1.0;
}

Гости не могут скачивать файлы


Сообщение отредактировал Sunday - Вторник, 23.04.2013, 02:44:33
 
_wS_ Дата: Вторник, 23.04.2013, 03:20:46 | Сообщение # 2
Можно так:

Код
new Handle:g_Timer[MAXPLAYERS + 1];
new g_Kills[MAXPLAYERS + 1];

player_death..
{
     g_Kills[PlayerWinner]++;

     // Тут нужно число правильное подобрать, на счет 0.1 я не уверен, может лучше меньше.
     if (g_Timer[PlayerWinner] == INVALID_HANDLE)
         g_Timer[PlayerWinner] = CreateTimer(0.1, g_Timer_CallBack, PlayerWinner);
}

public Action:g_Timer_CallBack(Handle:timer, any:client)
{
     if (g_Kills[client] > 1 && IsValidEntity(client) && IsClienInGame(client))
     {
         PrintToChatAll("%N сделал мультикил (-%d чел)", client, g_Kills[client]);
     }

     // сбрасываем
     g_Kills[client] = 0;
     g_Timer[PlayerWinner] = INVALID_HANDLE;

     return Plugin_Stop;
}
 
Sunday Дата: Вторник, 23.04.2013, 04:26:17 | Сообщение # 3
Сообщений: 186
Репутация: 24 [ +/- ]
Цитата (_wS_)
new Handle:g_Timer[MAXPLAYERS + 1];
new g_Kills[MAXPLAYERS + 1];

player_death..
{
g_Kills[PlayerWinner]++;

// Тут нужно число правильное подобрать, на счет 0.1 я не уверен, может лучше меньше.
if (g_Timer[PlayerWinner] == INVALID_HANDLE)
g_Timer[PlayerWinner] = CreateTimer(0.1, g_Timer_CallBack, PlayerWinner);
}

public Action:g_Timer_CallBack(Handle:timer, any:client)
{
if (g_Kills[client] > 1 && IsValidEntity(client) && IsClienInGame(client))
{
PrintToChatAll("%N сделал мультикил (-%d чел)", client, g_Kills[client]);
}

// сбрасываем
g_Kills[client] = 0;
g_Timer[PlayerWinner] = INVALID_HANDLE;

return Plugin_Stop;
}


Я как раз примерно так и сделал:

Код

#include <sourcemod>

new Float:NewKillTime[MAXPLAYERS+1];
new Handle:h_Timers[MAXPLAYERS+1]
new GetNumberMultiKills[MAXPLAYERS+1];

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

public OnClientDisconnect(PlayerVictim)
{
   if (h_Timers[PlayerVictim] != INVALID_HANDLE)
   {
    KillTimer(h_Timers[PlayerVictim])
    h_Timers[PlayerVictim] = INVALID_HANDLE
   }
}

public Action:Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
   new PlayerVictim = GetClientOfUserId(GetEventInt(event, "userid"));
   new PlayerWinner = GetClientOfUserId(GetEventInt(event, "attacker"));

   new Float:LastKillTime = NewKillTime[PlayerWinner];
   NewKillTime[PlayerWinner] = GetEngineTime();

   if(LastKillTime == -1.0 || (NewKillTime[PlayerWinner] - LastKillTime) > 0.3)
   {
    GetNumberMultiKills[PlayerWinner] = 1;
   }
   else
   {
    GetNumberMultiKills[PlayerWinner]++;
   }
   if (GetNumberMultiKills[PlayerWinner] >= 2)
   {
    if (h_Timers[PlayerWinner] == INVALID_HANDLE)
    {
     h_Timers[PlayerWinner] = CreateTimer(0.3, TIMER_MULTIKILL, PlayerWinner);
    }
   }
   NewKillTime[PlayerVictim] = -1.0;
}

public Action:TIMER_MULTIKILL(Handle:timer, any:PlayerWinner)
{
   switch (GetNumberMultiKills[PlayerWinner])
   {
    case 2:
    {
     PrintToChatAll("%N Double Kill!", PlayerWinner);
    }
    case 3:
    {
     PrintToChatAll("%N Triple Kill!", PlayerWinner);
    }
    case 4:
    {
     PrintToChatAll("%N Quadruple Kill!", PlayerWinner);
    }
    case 5:
    {
     PrintToChatAll("%N Sextuple Kill!", PlayerWinner);
    }
    case 6:
    {
     PrintToChatAll("%N Septuple Kill!", PlayerWinner);
    }
    case 7:
    {
     PrintToChatAll("%N Octuple Kill!", PlayerWinner);
    }
    default:
    {
     GetNumberMultiKills[PlayerWinner] = 0;
    }
   }
     
   h_Timers[PlayerWinner] = INVALID_HANDLE;
   return Plugin_Stop;
}


но добавил что бы таймер каждый раз не запускался при каждом убийстве игрока... Я просто думал что можно как то без таймера обойтись. Спасибо _wS_ за помощь!


Сообщение отредактировал Sunday - Вторник, 23.04.2013, 05:23:48
 
  • Страница 1 из 1
  • 1
Поиск: