Как сделать так, чтобы раунд заканчивался только тогда, когда жив лишь 1 игрок?

Crossale

Участник
Сообщения
140
Реакции
22
Мне нужно, чтобы раунд заканчивался не когда останется в живых только одна команда, а когда останется в живых всего 1 игрок (например, так нужно на батл рояль картах). Может кто подсказать что делать?
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
PHP:
ConVar g_hCvar;

public void OnPluginStart()
{
    if((g_hCvar = FindConVar("mp_ignore_round_win_conditions")) == null) SetFailState("No found cvar: mp_ignore_round_win_conditions");

    HookEvent("round_prestart", view_as<EventHook>(RoundPreStart), EventHookMode_PostNoCopy);
    HookEvent("player_death", view_as<EventHook>(PlayerDeath), EventHookMode_Pre);
}

void RoundPreStart()
{
    g_hCvar.SetInt(1);
}

void PlayerDeath(Event hEvent)
{
    int i, iCount;
    for(i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i) && IsPlayerAlive(i)) iCount++;
    }

    if(iCount < 2) g_hCvar.SetInt(0);
}

Не проверял, да и скорее всего надо будет дорабатывать код, т.к эта не самая лучшая реализация, много моментов не учел... Но работать по идеи должно.
 

Вложения

  • LPER.smx
    3.9 КБ · Просмотры: 7
  • LPER.sp
    605 байт · Просмотры: 3

Crossale

Участник
Сообщения
140
Реакции
22
PHP:
ConVar g_hCvar;

public void OnPluginStart()
{
    if((g_hCvar = FindConVar("mp_ignore_round_win_conditions")) == null) SetFailState("No found cvar: mp_ignore_round_win_conditions");

    HookEvent("round_prestart", view_as<EventHook>(RoundPreStart), EventHookMode_PostNoCopy);
    HookEvent("player_death", view_as<EventHook>(PlayerDeath), EventHookMode_Pre);
}

void RoundPreStart()
{
    g_hCvar.SetInt(1);
}

void PlayerDeath(Event hEvent)
{
    int i, iCount;
    for(i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i) && IsPlayerAlive(i)) iCount++;
    }

    if(iCount < 2) g_hCvar.SetInt(0);
}

Не проверял, да и скорее всего надо будет дорабатывать код, т.к эта не самая лучшая реализация, много моментов не учел... Но работать по идеи должно.
Да, там что-то не работает. Потому что когда я тестил, то ничего не изменилось. Но спасибо за идею.
 

Crossale

Участник
Сообщения
140
Реакции
22
Действительно, ничего не меняется...

Понятно. Если зайти 2-м или большему количеству игроков за одну команду, а за другую не заходить, то тогда плагин не срабатывает. А так он работает.
 
Последнее редактирование:

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
П

Понятно. Если зайти 2-м или большему количеству игроков за одну команду, а за другую не заходить, то тогда плагин не срабатывает. А так он работает.
Что? Если больше 1 игрока в живых, раунд не будет заврешен.
 

Crossale

Участник
Сообщения
140
Реакции
22
Что? Если больше 1 игрока в живых, раунд не будет заврешен.
Вы не поняли. Да, он не будет завершён, но проблема в другом. Если в начале раунда все игроки зашли за террористов, а за кт никто не зашёл, то тогда плагин не сработает, когда останется 1 в живых игрок. Да это уже неважно (по крайней мере для меня), так как я смог решить эту проблему автобалансом команд.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
так как я смог решить эту проблему автобалансом команд.
В следующий раз будьте добры оставить 'свое' решение в теме, не вы один можете сталкиваться с подобной проблемой.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
хм, когда-то кому-то делал, чтобы при последнем живом террористе заканчивало раунд
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <cstrike>
#include <sdktools_functions>

int aliveTNum;

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

public void EventPlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    if(GetClientTeam(GetClientOfUserId(event.GetInt("userid"))) == CS_TEAM_T) aliveTNum++;
}

public void OnClientDisconnect(int client)
{
    if(GetClientTeam(client) != CS_TEAM_T) return;

    aliveTNum--;
    if(aliveTNum == 1) OnLastMan();
}

public void EventPlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    if(GetClientTeam(GetClientOfUserId(event.GetInt("userid"))) != CS_TEAM_T) return;

    aliveTNum--;
    if(aliveTNum == 1) OnLastMan();
}

void OnLastMan()
{
    CS_TerminateRound(0.1, CSRoundEnd_CTWin, false)
}
--- Добавлено позже ---
Можно аналогичное сделать для обеих команд
--- Добавлено позже ---
Вот для обеих команд:
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <cstrike>

int aliveTNum,
    aliveCTNum;

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

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    int client;
    if(!(client = GetClientOfUserId(event.GetInt("userid"))))
        return;

    switch(GetClientTeam(client))
    {
        case 2:    aliveTNum++;
        case 3:    aliveCTNum++;
    }
}

public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client;
    if((client = GetClientOfUserId(event.GetInt("userid")))) SubPlayers(client);
}

public void OnClientDisconnect(int client)
{
    SubPlayers(client);
}

stock void SubPlayers(int client)
{
    switch(GetClientTeam(client))
    {
        case 2:
        {
            aliveTNum--;
            if(aliveTNum == 1) CS_TerminateRound(0.1, CSRoundEnd_CTWin, false);
        }
        case 3:
        {
            aliveCTNum--;
            if(aliveCTNum == 1) CS_TerminateRound(0.1, CSRoundEnd_TerroristWin, false);
        }
    }
}
Если у тебя КСГО, то сталось дождаться когда пофиксят CS_TerminateRound()
 
Последнее редактирование:

StrAnn1k

Участник
Сообщения
237
Реакции
23
хм, когда-то кому-то делал, чтобы при последнем живом террористе заканчивало раунд
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <cstrike>
#include <sdktools_functions>

int aliveTNum;

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

public void EventPlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    if(GetClientTeam(GetClientOfUserId(event.GetInt("userid"))) == CS_TEAM_T) aliveTNum++;
}

public void OnClientDisconnect(int client)
{
    if(GetClientTeam(client) != CS_TEAM_T) return;

    aliveTNum--;
    if(aliveTNum == 1) OnLastMan();
}

public void EventPlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    if(GetClientTeam(GetClientOfUserId(event.GetInt("userid"))) != CS_TEAM_T) return;

    aliveTNum--;
    if(aliveTNum == 1) OnLastMan();
}

void OnLastMan()
{
    CS_TerminateRound(0.1, CSRoundEnd_CTWin, false)
}
--- Добавлено позже ---
Можно аналогичное сделать для обеих команд
--- Добавлено позже ---
Вот для обеих команд:
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <cstrike>

int aliveTNum,
    aliveCTNum;

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

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    int client;
    if(!(client = GetClientOfUserId(event.GetInt("userid"))))
        return;

    switch(GetClientTeam(client))
    {
        case 2:    aliveTNum++;
        case 3:    aliveCTNum++;
    }
}

public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client;
    if((client = GetClientOfUserId(event.GetInt("userid")))) SubPlayers(client);
}

public void OnClientDisconnect(int client)
{
    SubPlayers(client);
}

stock void SubPlayers(int client)
{
    switch(GetClientTeam(client))
    {
        case 2:
        {
            aliveTNum--;
            if(aliveTNum == 1) CS_TerminateRound(0.1, CSRoundEnd_CTWin, false);
        }
        case 3:
        {
            aliveCTNum--;
            if(aliveCTNum == 1) CS_TerminateRound(0.1, CSRoundEnd_TerroristWin, false);
        }
    }
}
Если у тебя КСГО, то сталось дождаться когда пофиксят CS_TerminateRound()
Можешь сделать когда в команде нет живых игроков но раунд заканчивался! Либо бывает Анти афк игрока переводит в наблюдатели и раунд не заканчивается!
 
Сверху Снизу