Подсчёт Alive

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
Подмагите ребята.
Идея плагина: после смерти игроков раунд должен завершиться игнорируя ботов.
C-подобный:
#pragma semicolon 1

#include <sourcemod>
#include <cstrike>

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

public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
    for (new i = 1; i <= MaxClients && IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i);)
    {
        new plaeyr = GetClientOfUserId(GetEventInt(event, "userid"));
        if ((GetClientTeam(plaeyr) == 2 && i == 0 || i == 1) || (GetClientTeam(plaeyr) == 1 && i == 0))
        {
            CS_TerminateRound(3.0, CSRoundEnd_TargetBombed);
        }
        else if((GetClientTeam(plaeyr) == 1 && i == 0 || i == 1) || (GetClientTeam(plaeyr) == 2 && i == 0))
        {
            CS_TerminateRound(3.0, CSRoundEnd_CTWin);
        }
        return;
    }
}
Проблемы:
Тестировал один с ботами(естественно). Ботов поставил 10 штук.
Смерть игрока - игнорирует
Смерть бота - окончание раунда
Смерть игрока, а потом бота - игнорирует
 
Последнее редактирование:

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
C-подобный:
#pragma newdecls required

#include cstrike

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

public void player_death(Event event, const char[] name, bool dontBroadcast)
{
    int a, i, buffer = GetClientOfUserId(event.GetInt("userid"));
  
    if(IsFakeClient(buffer))
        return;
  
    buffer = GetClientTeam(buffer);

    while(i++ < MaxClients)
        if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i) && buffer == GetClientTeam(i))
            a++;
  
    if(!a)
        CS_TerminateRound(
            3.0,
            (buffer == 3) ?
                CSRoundEnd_CTWin :
                CSRoundEnd_TargetBombed
        );
}
 
Последнее редактирование:

Nekro

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

#include cstrike

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

public void player_death(Event event, const char[] name, bool dontBroadcast)
{
    int i, a;
    while(i++ < MaxClients)
        if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i))
            a++;
   
    if(!a)
        CS_TerminateRound(
            3.0,
            (GetClientTeam(GetClientOfUserId(event.GetInt("userid"))) == 3) ?
                CSRoundEnd_CTWin :
                CSRoundEnd_TargetBombed
        );
}
Таки, а если будет 7 игроков т и 1 убийтый кт и 6 ботов кт.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
while(i++ < MaxClients) if(IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i)) a++;
Тут не хватает проверки команды, чтобы считало игроков в команде умершего
Сообщения автоматически склеены:

PHP:
#pragma semicolon 1

#include <cstrike>

public void OnPluginStart()
{
    HookEvent("player_death", Event_Death);
}

public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid")), team;
    if(!client || IsFakeClient(client) || (team = GetClientTeam(client)) < 2)
        return;

    for(int i = 1; i <= MaxClients; i++)
        if(i != client && IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i) && GetClientTeam(i) == team)
            return;

    CS_TerminateRound(3.0, team == CS_TEAM_T ? CSRoundEnd_CTWin : CSRoundEnd_TargetBombed);
}
 
Последнее редактирование:
Сверху Снизу