Raised This Month: $51 Target: $400
 12% 

[CS:GO] Bot Quota Fix


Post New Thread Reply   
 
Thread Tools Display Modes
Author
Ilusion9
Veteran Member
Join Date: Jun 2018
Location: Romania
Plugin ID:
7080
Plugin Version:
Plugin Category:
General Purpose
Plugin Game:
Any
Plugin Dependencies:
    Servers with this Plugin:
     
    Plugin Description:
    Bot quota fix for CS:GO.
    Old 05-03-2020 , 07:30   [CS:GO] Bot Quota Fix
    Reply With Quote #1

    Description: Bot quota fix for CS:GO.

    ConVars:
    Code:
    sm_bot_quota 4 - Determines the total number of bots in the game.
    sm_bot_quota_mode casual - Determines the type of quota. Allowed values: normal, casual, fill and even.
    GitHub: https://github.com/Ilusion9/bot-quota-fix-sm
    __________________

    Last edited by Ilusion9; 04-13-2021 at 14:44.
    Ilusion9 is offline
    Ilusion9
    Veteran Member
    Join Date: Jun 2018
    Location: Romania
    Old 05-18-2020 , 08:13   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #2

    Updated.
    In warmup, bots mode will be treated as "dm".
    __________________
    Ilusion9 is offline
    penalte
    Member
    Join Date: Jan 2016
    Old 07-17-2020 , 08:48   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #3

    Hello, Ilusion9
    Im loving this plugin can you add one litle thing and maybe a cvar to enable/disable.
    I would want a funtion to add a bot if number of players uneven, and then remove when players are even.
    it can work like warmup "dm" so it is faster removing the bots, that way i can use it with splewis csgo-multi-1v1 plugin and it will not mess with the arenas queue.

    Thank you.

    Last edited by penalte; 07-17-2020 at 08:49.
    penalte is offline
    penalte
    Member
    Join Date: Jan 2016
    Old 07-19-2020 , 09:03   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #4

    Sorry, i think I was not explicit enough.
    Can you make another sm_bots_mode called "even" that will add a bot if number of players not even?

    Thank you.
    penalte is offline
    Ilusion9
    Veteran Member
    Join Date: Jun 2018
    Location: Romania
    Old 07-20-2020 , 10:25   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #5

    Quote:
    Originally Posted by penalte View Post
    Sorry, i think I was not explicit enough.
    Can you make another sm_bots_mode called "even" that will add a bot if number of players not even?

    Thank you.
    You can try this: sm_bots_mode "even".
    Untested.

    PHP Code:

    #include <sourcemod>
    #include <sdktools>
    #include <cstrike>
    #pragma newdecls required

    public Plugin myinfo =
    {
        
    name "Bot Quota Fix",
        
    author "Ilusion9",
        
    description "Bot quota fix.",
        
    version "1.0",
        
    url "https://github.com/Ilusion9/"
    };

    enum BotsMode
    {
        
    BotsMode_Fix,
        
    BotsMode_Round,
        
    BotsMode_Deathmatch,
        
    BotsMode_Even
    };

    ConVar g_Cvar_BotsNum;
    ConVar g_Cvar_BotsMode;
    ConVar g_Cvar_BotQuota;
    ConVar g_Cvar_BotQuotaMode;

    BotsMode g_BotsMode;
    int g_NumBotsOnServer;

    public 
    void OnPluginStart()
    {
        
    g_Cvar_BotsNum CreateConVar("sm_bots_num""6""Determines the total number of bots in the game."FCVAR_NONEtrue0.0);
        
    g_Cvar_BotsNum.AddChangeHook(ConVarChange_BotsNum);
        
    g_Cvar_BotsMode CreateConVar("sm_bots_mode""round""Determines the type of quota. Allowed values: \"fix\", \"round\", \"dm\" and \"even\"."FCVAR_NONEtrue0.0);
        
    g_Cvar_BotsMode.AddChangeHook(ConVarChange_BotsMode);

        
    g_Cvar_BotQuota FindConVar("bot_quota");
        
    g_Cvar_BotQuota.AddChangeHook(ConVarChange_BotQuota);
        
    g_Cvar_BotQuotaMode FindConVar("bot_quota_mode");
        
    g_Cvar_BotQuotaMode.AddChangeHook(ConVarChange_BotQuotaMode);

        
    HookEvent("player_team"Event_PlayerTeam);
        
    HookEvent("round_start"Event_RoundStartEventHookMode_Pre);
    }

    public 
    void OnMapEnd()
    {
        
    g_NumBotsOnServer 0;
    }

    public 
    void OnConfigsExecuted()
    {
        
    g_NumBotsOnServer 0;
        
    g_Cvar_BotQuota.SetInt(0);
        
    g_Cvar_BotQuotaMode.SetString("normal");
        
        
    // Get bots mode
        
    char mode[128];
        
    g_Cvar_BotsMode.GetString(modesizeof(mode));
        
        if (
    StrEqual(mode"dm"true))
        {
            
    g_BotsMode BotsMode_Deathmatch;
        }
        else if (
    StrEqual(mode"fix"true))
        {
            
    g_BotsMode BotsMode_Fix;
        }
        else if (
    StrEqual(mode"even"true))
        {
            
    g_BotsMode BotsMode_Even;
        }
        else
        {
            
    g_BotsMode BotsMode_Round;
        }
    }

    /* Change of valve cvars */
    public void ConVarChange_BotQuota(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        if (
    g_Cvar_BotQuota.IntValue != g_NumBotsOnServer)
        {
            
    g_Cvar_BotQuota.SetInt(g_NumBotsOnServer);
        }
    }

    public 
    void ConVarChange_BotQuotaMode(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        if (!
    StrEqual(newValue"normal"true))
        {
            
    g_Cvar_BotQuotaMode.SetString("normal");
        }
    }

    /* Hook change of our convars */
    public void ConVarChange_BotsNum(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        
    int num_players;
        
    int num_bots g_NumBotsOnServer;
        
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else if (
    g_BotsMode == BotsMode_Deathmatch)
        {
            if (
    g_Cvar_BotsNum.IntValue)
            {
                
    num_players GetNumOfPlayers();
                
    num_bots g_Cvar_BotsNum.IntValue num_players;
                if (
    num_bots || !num_players)
                {
                    
    num_bots 0;
                }
            }
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    public 
    void ConVarChange_BotsMode(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        
    // Get bots mode
        
    if (StrEqual(newValue"dm"true))
        {
            
    g_BotsMode BotsMode_Deathmatch;
        }
        else if (
    StrEqual(newValue"fix"true))
        {
            
    g_BotsMode BotsMode_Fix;
        }
        else if (
    StrEqual(newValue"even"true))
        {
            
    g_BotsMode BotsMode_Even;
        }
        else
        {
            
    g_BotsMode BotsMode_Round;
        }
        
        
    // Change num bots on server
        
    int num_players;
        
    int num_bots g_NumBotsOnServer;    
        
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else if (
    g_BotsMode == BotsMode_Deathmatch)
        {
            if (
    g_Cvar_BotsNum.IntValue)
            {
                
    num_players GetNumOfPlayers();
                
    num_bots g_Cvar_BotsNum.IntValue num_players;
                
                if (
    num_bots || !num_players)
                {
                    
    num_bots 0;
                }
            }
        }
        else if (
    g_BotsMode == BotsMode_Even)
        {
            
    int numT GetTeamClientCount(CS_TEAM_T);
            
    int numCT GetTeamClientCount(CS_TEAM_CT);

            
    num_bots numT numCT;
            if (
    num_bots 0)
            {
                
    num_bots *= -1;
            }
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    public 
    void Event_PlayerTeam(Event event, const char[] namebool dontBroadcast
    {
        if (
    event.GetBool("isbot") || !g_Cvar_BotsNum.IntValue)
        {
            return;
        }
        
        
    RequestFrame(Frame_PlayerTeam);
    }

    void Frame_PlayerTeam(any data)
    {
        
    int num_bots 0num_players 0;
        if (
    g_BotsMode == BotsMode_Deathmatch || IsWarmupPeriod() && g_BotsMode == BotsMode_Round)
        {
            
    num_players GetNumOfPlayers();
            
    num_bots g_Cvar_BotsNum.IntValue num_players;
            
            if (
    num_bots || !num_players)
            {
                
    num_bots 0;
            }
            
            if (
    num_bots != g_NumBotsOnServer)
            {
                
    g_NumBotsOnServer num_bots;
                
    g_Cvar_BotQuota.SetInt(num_bots);
            }
        }
        else if (
    g_BotsMode == BotsMode_Even)
        {
            
    int numT GetTeamClientCount(CS_TEAM_T);
            
    int numCT GetTeamClientCount(CS_TEAM_CT);

            
    num_bots numT numCT;
            if (
    num_bots 0)
            {
                
    num_bots *= -1;
            }
            
            if (
    num_bots != g_NumBotsOnServer)
            {
                
    g_NumBotsOnServer num_bots;
                
    g_Cvar_BotQuota.SetInt(num_bots);
            }
        }
    }

    public 
    void Event_RoundStart(Event event, const char[] namebool dontBroadcast
    {
        if (!
    g_Cvar_BotsNum.IntValue || g_BotsMode == BotsMode_Deathmatch || g_BotsMode == BotsMode_Even)
        {
            return;
        }
        
        
    int num_bots 0num_players 0;
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else
        {
            
    num_players GetNumOfPlayers();
            
    num_bots g_Cvar_BotsNum.IntValue num_players;
            
            if (
    num_bots || !num_players)
            {
                
    num_bots 0;
            }
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    int GetNumOfPlayers()
    {
        
    int num 0;
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) > CS_TEAM_SPECTATOR)
            {
                
    num++;
            }
        }
        
        return 
    num;
    }

    bool IsWarmupPeriod()
    {
        return 
    view_as<bool>(GameRules_GetProp("m_bWarmupPeriod"));

    __________________
    Ilusion9 is offline
    penalte
    Member
    Join Date: Jan 2016
    Old 07-21-2020 , 20:36   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #6

    Its works but sometimes it adds 2 or 3 bots to same team.
    I changed you implementation of ODD and EVEN and now it is working very good and perfect.
    thanks.

    my changes where this
    PHP Code:
            int numT GetTeamClientCount(CS_TEAM_T);
            
    int numCT GetTeamClientCount(CS_TEAM_CT);

            
    num_bots numT numCT;
            if (
    num_bots 0)
            {
                
    num_bots *= -1;
            } 
    to this
    PHP Code:
            g_Cvar_BotsNum.SetInt(1);
            
    num_players GetNumOfPlayers() + GetNumOfPlayersQueue();
            
    num_bots g_Cvar_BotsNum.IntValue;
            if (
    num_players)
            {
                
    num_bots 0;
            } 
    and add this
    PHP Code:
    int GetNumOfPlayersQueue()
    {
        
    int num 0;
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == CS_TEAM_SPECTATOR && Multi1v1_IsInWaitingQueue(i))
            {
                
    num++;
            }
        }
        
        return 
    num;
    }

    bool IsEven(int iNum)
    {
        return 
    iNum == 0;

    and i made it compatible with multi 1v1 by adding #include <multi1v1> to check if player is in a Queue, because splwis puts players in spectator in Queue and i counted that players with GetNumOfPlayersQueue()

    thank you very much ;)
    penalte is offline
    Ilusion9
    Veteran Member
    Join Date: Jun 2018
    Location: Romania
    Old 07-22-2020 , 07:24   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #7

    ok, I changed even to arena as bots_mode
    I will release it as a new version if everything works fine:

    PHP Code:

    #include <sourcemod>
    #include <sdktools>
    #include <cstrike>
    #undef REQUIRE_PLUGIN
    #include <multi1v1>
    #pragma newdecls required

    public Plugin myinfo =
    {
        
    name "Bot Quota Fix",
        
    author "Ilusion9",
        
    description "Bot quota fix.",
        
    version "1.0",
        
    url "https://github.com/Ilusion9/"
    };

    enum BotsMode
    {
        
    BotsMode_Fix,
        
    BotsMode_Round,
        
    BotsMode_Deathmatch,
        
    BotsMode_Arena
    };

    ConVar g_Cvar_BotsNum;
    ConVar g_Cvar_BotsMode;
    ConVar g_Cvar_BotQuota;
    ConVar g_Cvar_BotQuotaMode;

    BotsMode g_BotsMode;
    int g_NumBotsOnServer;

    public 
    void OnPluginStart()
    {
        
    g_Cvar_BotsNum CreateConVar("sm_bots_num""6""Determines the total number of bots in the game."FCVAR_NONEtrue0.0);
        
    g_Cvar_BotsNum.AddChangeHook(ConVarChange_BotsNum);
        
    g_Cvar_BotsMode CreateConVar("sm_bots_mode""round""Determines the type of quota. Allowed values: \"fix\", \"round\", \"dm\" and \"arena\"."FCVAR_NONEtrue0.0);
        
    g_Cvar_BotsMode.AddChangeHook(ConVarChange_BotsMode);

        
    g_Cvar_BotQuota FindConVar("bot_quota");
        
    g_Cvar_BotQuota.AddChangeHook(ConVarChange_BotQuota);
        
    g_Cvar_BotQuotaMode FindConVar("bot_quota_mode");
        
    g_Cvar_BotQuotaMode.AddChangeHook(ConVarChange_BotQuotaMode);

        
    HookEvent("player_team"Event_PlayerTeam);
        
    HookEvent("round_start"Event_RoundStartEventHookMode_Pre);
    }

    public 
    void OnMapEnd()
    {
        
    g_NumBotsOnServer 0;
    }

    public 
    void OnConfigsExecuted()
    {
        
    g_NumBotsOnServer 0;
        
    g_Cvar_BotQuota.SetInt(0);
        
    g_Cvar_BotQuotaMode.SetString("normal");
        
        
    // Get bots mode
        
    char mode[128];
        
    g_Cvar_BotsMode.GetString(modesizeof(mode));
        
        if (
    StrEqual(mode"dm"true))
        {
            
    g_BotsMode BotsMode_Deathmatch;
        }
        else if (
    StrEqual(mode"fix"true))
        {
            
    g_BotsMode BotsMode_Fix;
        }
        else if (
    StrEqual(mode"arena"true))
        {
            
    g_BotsMode BotsMode_Arena;
        }
        else
        {
            
    g_BotsMode BotsMode_Round;
        }
    }

    /* Change of valve cvars */
    public void ConVarChange_BotQuota(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        if (
    g_Cvar_BotQuota.IntValue != g_NumBotsOnServer)
        {
            
    g_Cvar_BotQuota.SetInt(g_NumBotsOnServer);
        }
    }

    public 
    void ConVarChange_BotQuotaMode(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        if (!
    StrEqual(newValue"normal"true))
        {
            
    g_Cvar_BotQuotaMode.SetString("normal");
        }
    }

    /* Hook change of our convars */
    public void ConVarChange_BotsNum(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        
    int num_players;
        
    int num_bots g_NumBotsOnServer;
        
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else if (
    g_BotsMode == BotsMode_Deathmatch)
        {
            if (
    g_Cvar_BotsNum.IntValue)
            {
                
    num_players GetNumOfPlayers();
                
    num_bots g_Cvar_BotsNum.IntValue num_players;
                if (
    num_bots || !num_players)
                {
                    
    num_bots 0;
                }
            }
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    public 
    void ConVarChange_BotsMode(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        
    // Get bots mode
        
    if (StrEqual(newValue"dm"true))
        {
            
    g_BotsMode BotsMode_Deathmatch;
        }
        else if (
    StrEqual(newValue"fix"true))
        {
            
    g_BotsMode BotsMode_Fix;
        }
        else if (
    StrEqual(newValue"arena"true))
        {
            
    g_BotsMode BotsMode_Arena;
        }
        else
        {
            
    g_BotsMode BotsMode_Round;
        }
        
        
    // Change num bots on server
        
    int num_players;
        
    int num_bots g_NumBotsOnServer;    
        
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else if (
    g_BotsMode == BotsMode_Deathmatch)
        {
            if (
    g_Cvar_BotsNum.IntValue)
            {
                
    num_players GetNumOfPlayers();
                
    num_bots g_Cvar_BotsNum.IntValue num_players;
                
                if (
    num_bots || !num_players)
                {
                    
    num_bots 0;
                }
            }
        }
        else if (
    g_BotsMode == BotsMode_Arena)
        {
            
    num_players GetNumOfPlayers() + GetNumOfPlayersQueue();
            
    num_bots num_players 2;
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    public 
    void Event_PlayerTeam(Event event, const char[] namebool dontBroadcast
    {
        if (
    event.GetBool("isbot") || !g_Cvar_BotsNum.IntValue)
        {
            return;
        }
        
        
    RequestFrame(Frame_PlayerTeam);
    }

    void Frame_PlayerTeam(any data)
    {
        
    int num_bots 0num_players 0;
        if (
    g_BotsMode == BotsMode_Deathmatch || IsWarmupPeriod() && g_BotsMode == BotsMode_Round)
        {
            
    num_players GetNumOfPlayers();
            
    num_bots g_Cvar_BotsNum.IntValue num_players;
            
            if (
    num_bots || !num_players)
            {
                
    num_bots 0;
            }
            
            if (
    num_bots != g_NumBotsOnServer)
            {
                
    g_NumBotsOnServer num_bots;
                
    g_Cvar_BotQuota.SetInt(num_bots);
            }
        }
        else if (
    g_BotsMode == BotsMode_Arena)
        {
            
    num_players GetNumOfPlayers() + GetNumOfPlayersQueue();
            
    num_bots num_players 2;
            
            if (
    num_bots != g_NumBotsOnServer)
            {
                
    g_NumBotsOnServer num_bots;
                
    g_Cvar_BotQuota.SetInt(num_bots);
            }
        }
    }

    public 
    void Event_RoundStart(Event event, const char[] namebool dontBroadcast
    {
        if (!
    g_Cvar_BotsNum.IntValue || g_BotsMode == BotsMode_Deathmatch || g_BotsMode == BotsMode_Arena)
        {
            return;
        }
        
        
    int num_bots 0num_players 0;
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else
        {
            
    num_players GetNumOfPlayers();
            
    num_bots g_Cvar_BotsNum.IntValue num_players;
            
            if (
    num_bots || !num_players)
            {
                
    num_bots 0;
            }
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    bool IsWarmupPeriod()
    {
        return 
    view_as<bool>(GameRules_GetProp("m_bWarmupPeriod"));
    }

    int GetNumOfPlayers()
    {
        
    int num 0;
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) > CS_TEAM_SPECTATOR)
            {
                
    num++;
            }
        }
        
        return 
    num;
    }

    int GetNumOfPlayersQueue()
    {
        
    int num 0;
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == CS_TEAM_SPECTATOR && Multi1v1_IsInWaitingQueue(i))
            {
                
    num++;
            }
        }
        
        return 
    num;

    __________________
    Ilusion9 is offline
    penalte
    Member
    Join Date: Jan 2016
    Old 07-22-2020 , 13:46   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #8

    Perfect i love it, thank you.

    I added a Even for my competitive servers it will do the same as Arena but insted on player join "Event_PlayerTeam" it is on round start "Event_RoundStart" and does not check GetNumOfPlayersQueue()
    PHP Code:
          num_players GetNumOfPlayers();
          
    num_bots num_players 2
    here is the code, i used your code struture it is tested and working fine.
    PHP Code:
    #include <sourcemod>
    #include <sdktools>
    #include <cstrike>
    #undef REQUIRE_PLUGIN
    #include <multi1v1>
    #pragma newdecls required

    public Plugin myinfo =
    {
        
    name "Bot Quota Fix",
        
    author "Ilusion9",
        
    description "Bot quota fix.",
        
    version "1.0",
        
    url "https://github.com/Ilusion9/"
    };

    enum BotsMode
    {
        
    BotsMode_Fix,
        
    BotsMode_Round,
        
    BotsMode_Deathmatch,
        
    BotsMode_Even,
        
    BotsMode_Arena
    };

    ConVar g_Cvar_BotsNum;
    ConVar g_Cvar_BotsMode;
    ConVar g_Cvar_BotQuota;
    ConVar g_Cvar_BotQuotaMode;

    BotsMode g_BotsMode;
    int g_NumBotsOnServer;

    public 
    void OnPluginStart()
    {
        
    g_Cvar_BotsNum CreateConVar("sm_bots_num""6""Determines the total number of bots in the game."FCVAR_NONEtrue0.0);
        
    g_Cvar_BotsNum.AddChangeHook(ConVarChange_BotsNum);
        
    g_Cvar_BotsMode CreateConVar("sm_bots_mode""round""Determines the type of quota. Allowed values: \"fix\", \"round\", \"dm\" and \"arena\"."FCVAR_NONEtrue0.0);
        
    g_Cvar_BotsMode.AddChangeHook(ConVarChange_BotsMode);

        
    g_Cvar_BotQuota FindConVar("bot_quota");
        
    g_Cvar_BotQuota.AddChangeHook(ConVarChange_BotQuota);
        
    g_Cvar_BotQuotaMode FindConVar("bot_quota_mode");
        
    g_Cvar_BotQuotaMode.AddChangeHook(ConVarChange_BotQuotaMode);

        
    HookEvent("player_team"Event_PlayerTeam);
        
    HookEvent("round_start"Event_RoundStartEventHookMode_Pre);
    }

    public 
    void OnMapEnd()
    {
        
    g_NumBotsOnServer 0;
    }

    public 
    void OnConfigsExecuted()
    {
        
    g_NumBotsOnServer 0;
        
    g_Cvar_BotQuota.SetInt(0);
        
    g_Cvar_BotQuotaMode.SetString("normal");
        
        
    // Get bots mode
        
    char mode[128];
        
    g_Cvar_BotsMode.GetString(modesizeof(mode));
        
        if (
    StrEqual(mode"dm"true))
        {
            
    g_BotsMode BotsMode_Deathmatch;
        }
        else if (
    StrEqual(mode"fix"true))
        {
            
    g_BotsMode BotsMode_Fix;
        }
        else if (
    StrEqual(mode"even"true))
        {
            
    g_BotsMode BotsMode_Even;
        }
        else if (
    StrEqual(mode"arena"true))
        {
            
    g_BotsMode BotsMode_Arena;
        }
        else
        {
            
    g_BotsMode BotsMode_Round;
        }
    }

    /* Change of valve cvars */
    public void ConVarChange_BotQuota(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        if (
    g_Cvar_BotQuota.IntValue != g_NumBotsOnServer)
        {
            
    g_Cvar_BotQuota.SetInt(g_NumBotsOnServer);
        }
    }

    public 
    void ConVarChange_BotQuotaMode(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        if (!
    StrEqual(newValue"normal"true))
        {
            
    g_Cvar_BotQuotaMode.SetString("normal");
        }
    }

    /* Hook change of our convars */
    public void ConVarChange_BotsNum(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        
    int num_players;
        
    int num_bots g_NumBotsOnServer;
        
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else if (
    g_BotsMode == BotsMode_Deathmatch)
        {
            if (
    g_Cvar_BotsNum.IntValue)
            {
                
    num_players GetNumOfPlayers();
                
    num_bots g_Cvar_BotsNum.IntValue num_players;
                if (
    num_bots || !num_players)
                {
                    
    num_bots 0;
                }
            }
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    public 
    void ConVarChange_BotsMode(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        
    // Get bots mode
        
    if (StrEqual(newValue"dm"true))
        {
            
    g_BotsMode BotsMode_Deathmatch;
        }
        else if (
    StrEqual(newValue"fix"true))
        {
            
    g_BotsMode BotsMode_Fix;
        }
        else if (
    StrEqual(newValue"even"true))
        {
            
    g_BotsMode BotsMode_Even;
        }
        else if (
    StrEqual(newValue"arena"true))
        {
            
    g_BotsMode BotsMode_Arena;
        }
        else
        {
            
    g_BotsMode BotsMode_Round;
        }
        
        
    // Change num bots on server
        
    int num_players;
        
    int num_bots g_NumBotsOnServer;    
        
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else if (
    g_BotsMode == BotsMode_Deathmatch)
        {
            if (
    g_Cvar_BotsNum.IntValue)
            {
                
    num_players GetNumOfPlayers();
                
    num_bots g_Cvar_BotsNum.IntValue num_players;
                
                if (
    num_bots || !num_players)
                {
                    
    num_bots 0;
                }
            }
        }
        else if (
    g_BotsMode == BotsMode_Even)
        {
            
    num_players GetNumOfPlayers();
            
    num_bots num_players 2;
        }
        else if (
    g_BotsMode == BotsMode_Arena)
        {
            
    num_players GetNumOfPlayers() + GetNumOfPlayersQueue();
            
    num_bots num_players 2;
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    public 
    void Event_PlayerTeam(Event event, const char[] namebool dontBroadcast
    {
        if (
    event.GetBool("isbot") || !g_Cvar_BotsNum.IntValue)
        {
            return;
        }
        
        
    RequestFrame(Frame_PlayerTeam);
    }

    void Frame_PlayerTeam(any data)
    {
        
    int num_bots 0num_players 0;
        if (
    g_BotsMode == BotsMode_Deathmatch || IsWarmupPeriod() && g_BotsMode == BotsMode_Round || IsWarmupPeriod() && g_BotsMode == BotsMode_Even)
        {
            
    num_players GetNumOfPlayers();
            
    num_bots g_Cvar_BotsNum.IntValue num_players;
            
            if (
    num_bots || !num_players)
            {
                
    num_bots 0;
            }
            
            if (
    num_bots != g_NumBotsOnServer)
            {
                
    g_NumBotsOnServer num_bots;
                
    g_Cvar_BotQuota.SetInt(num_bots);
            }
        }
        else if (
    g_BotsMode == BotsMode_Even)
        {
            
    num_players GetNumOfPlayers();
            
    num_bots num_players 2;
            
            if (
    num_bots != g_NumBotsOnServer)
            {
                
    g_NumBotsOnServer num_bots;
                
    g_Cvar_BotQuota.SetInt(num_bots);
            }
        }
        else if (
    g_BotsMode == BotsMode_Arena)
        {
            
    num_players GetNumOfPlayers() + GetNumOfPlayersQueue();
            
    num_bots num_players 2;
            
            if (
    num_bots != g_NumBotsOnServer)
            {
                
    g_NumBotsOnServer num_bots;
                
    g_Cvar_BotQuota.SetInt(num_bots);
            }
        }
    }

    public 
    void Event_RoundStart(Event event, const char[] namebool dontBroadcast
    {
        if (!
    g_Cvar_BotsNum.IntValue || g_BotsMode == BotsMode_Deathmatch || g_BotsMode == BotsMode_Arena)
        {
            return;
        }
        
        
    int num_bots 0num_players 0;
        if (
    g_BotsMode == BotsMode_Fix)
        {
            
    num_bots g_Cvar_BotsNum.IntValue;
        }
        else if (
    g_BotsMode == BotsMode_Even)
        {
            
    num_players GetNumOfPlayers();
            
    num_bots num_players 2;
        }
        else
        {
            
    num_players GetNumOfPlayers();
            
    num_bots g_Cvar_BotsNum.IntValue num_players;
            
            if (
    num_bots || !num_players)
            {
                
    num_bots 0;
            }
        }
        
        if (
    num_bots != g_NumBotsOnServer)
        {
            
    g_NumBotsOnServer num_bots;
            
    g_Cvar_BotQuota.SetInt(num_bots);
        }
    }

    bool IsWarmupPeriod()
    {
        return 
    view_as<bool>(GameRules_GetProp("m_bWarmupPeriod"));
    }

    int GetNumOfPlayers()
    {
        
    int num 0;
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) > CS_TEAM_SPECTATOR)
            {
                
    num++;
            }
        }
        
        return 
    num;
    }

    int GetNumOfPlayersQueue()
    {
        
    int num 0;
        for (
    int i 1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == CS_TEAM_SPECTATOR && Multi1v1_IsInWaitingQueue(i))
            {
                
    num++;
            }
        }
        
        return 
    num;


    Last edited by penalte; 07-23-2020 at 14:18.
    penalte is offline
    Ejziponken
    AlliedModders Donor
    Join Date: Apr 2008
    Old 02-20-2021 , 14:00   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #9

    Would this work with retakes mode?
    Ejziponken is offline
    Ilusion9
    Veteran Member
    Join Date: Jun 2018
    Location: Romania
    Old 02-20-2021 , 16:50   Re: [CS:GO] Bot Quota Fix
    Reply With Quote #10

    Quote:
    Originally Posted by Ejziponken View Post
    Would this work with retakes mode?
    Yes, "round" type should do the trick.
    __________________
    Ilusion9 is offline
    Reply



    Posting Rules
    You may not post new threads
    You may not post replies
    You may not post attachments
    You may not edit your posts

    BB code is On
    Smilies are On
    [IMG] code is On
    HTML code is Off

    Forum Jump


    All times are GMT -4. The time now is 13:55.


    Powered by vBulletin®
    Copyright ©2000 - 2024, vBulletin Solutions, Inc.
    Theme made by Freecode