From 90e752d1a53c9ff54d671da12504f74b3ad2dc27 Mon Sep 17 00:00:00 2001 From: ineedbots Date: Sat, 19 Jun 2021 17:28:12 -0600 Subject: [PATCH] working manager --- raw/scripts/mp/test-compiled.gsc | Bin 216 -> 8470 bytes raw/scripts/mp/test.gsc | 582 ++++++++++++++++++++++++++++++- 2 files changed, 574 insertions(+), 8 deletions(-) diff --git a/raw/scripts/mp/test-compiled.gsc b/raw/scripts/mp/test-compiled.gsc index 0e6a7cb0efc7df1525cb5f1fd6b29b696cce7020..f51e1aec37c06d1b365141fb73bc09a6468dcb96 100644 GIT binary patch literal 8470 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 literal 216 zcmZp04|e9|Vqjwcf;1rB1*H!F>1jZ`4v23+F_2<#U|?ooVqgR@!Js6yxP&1yFSCRp zIX^EiHMt};g`prPu`;!YAtkdID#jqr7{b8C;Kd*is=}bEE6HF2G>3t~%>LDX1_m{* zXa@dpP9Xp686R71`!7JTXWo;$K(28G;+rvVYny}D+kvLPUZfsru-$n*k= M=K$$wAl(9_0e$``fdBvi diff --git a/raw/scripts/mp/test.gsc b/raw/scripts/mp/test.gsc index 8486acf..f8fda83 100644 --- a/raw/scripts/mp/test.gsc +++ b/raw/scripts/mp/test.gsc @@ -1,19 +1,585 @@ +/* + _bot + Author: INeedGames + Date: 06/19/2021 + The entry point and manager of the bots. +*/ + +/* + Entry point to the bots +*/ init() +{ + level.bw_VERSION = "1.1.1"; + + if ( getDvar( "bots_main" ) == "" ) + setDvar( "bots_main", true ); + + if ( !getDvarInt( "bots_main" ) ) + return; + + if ( getDvar( "bots_main_waitForHostTime" ) == "" ) + setDvar( "bots_main_waitForHostTime", 10.0 ); //how long to wait to wait for the host player + + if ( getDvar( "bots_manage_add" ) == "" ) + setDvar( "bots_manage_add", 0 ); //amount of bots to add to the game + + if ( getDvar( "bots_manage_fill" ) == "" ) + setDvar( "bots_manage_fill", 0 ); //amount of bots to maintain + + if ( getDvar( "bots_manage_fill_spec" ) == "" ) + setDvar( "bots_manage_fill_spec", true ); //to count for fill if player is on spec team + + if ( getDvar( "bots_manage_fill_mode" ) == "" ) + setDvar( "bots_manage_fill_mode", 0 ); //fill mode, 0 adds everyone, 1 just bots, 2 maintains at maps, 3 is 2 with 1 + + if ( getDvar( "bots_manage_fill_kick" ) == "" ) + setDvar( "bots_manage_fill_kick", false ); //kick bots if too many + + if ( getDvar( "bots_team" ) == "" ) + setDvar( "bots_team", "autoassign" ); //which team for bots to join + + if ( getDvar( "bots_team_amount" ) == "" ) + setDvar( "bots_team_amount", 0 ); //amount of bots on axis team + + if ( getDvar( "bots_team_force" ) == "" ) + setDvar( "bots_team_force", false ); //force bots on team + + if ( getDvar( "bots_team_mode" ) == "" ) + setDvar( "bots_team_mode", 0 ); //counts just bots when 1 + + if ( getDvar( "bots_loadout_rank" ) == "" ) // what rank the bots should be around, -1 is around the players, 0 is all random + setDvar( "bots_loadout_rank", -1 ); + + if ( getDvar( "bots_loadout_prestige" ) == "" ) // what pretige the bots will be, -1 is the players, -2 is random + setDvar( "bots_loadout_prestige", -1 ); + + if ( getDvar( "bots_play_nade" ) == "" ) + setDvar( "bots_play_nade", true ); + + if ( getDvar( "bots_play_aim" ) == "" ) + setDvar( "bots_play_aim", true ); + + if ( !isDefined( game["botWarfare"] ) ) + game["botWarfare"] = true; + + thread fixGamemodes(); + + thread onPlayerConnect(); + + thread handleBots(); +} + +/* + Adds sd to bot logic +*/ +fixGamemodes() +{ + wait 0.25; + + if ( level.gametype == "sd" ) + level.bot_gametype = maps\mp\bots\_bot_sd::bot_sd_think; +} + +/* + Starts the threads for bots. +*/ +handleBots() +{ + thread diffBots(); + thread teamBots(); + addBots(); + + while ( !level.intermission ) + wait 0.05; + + setDvar( "bots_manage_add", getBotArray().size ); +} + +/* + Handles the diff of the bots +*/ +diffBots() { for ( ;; ) { - level waittill ( "connected", player ); + wait 1.5; - player thread test(); + bot_set_difficulty( maps\mp\_utility::getdvarintdefault( "bot_difficulty", 1 ) ); } } -test() +/* + Sets the difficulty of the bots +*/ +bot_set_difficulty( difficulty ) +{ + if ( difficulty == 3 ) + { + setdvar( "bot_MinDeathTime", "250" ); + setdvar( "bot_MaxDeathTime", "500" ); + setdvar( "bot_MinFireTime", "100" ); + setdvar( "bot_MaxFireTime", "250" ); + setdvar( "bot_PitchUp", "-5" ); + setdvar( "bot_PitchDown", "10" ); + setdvar( "bot_Fov", "160" ); + setdvar( "bot_MinAdsTime", "3000" ); + setdvar( "bot_MaxAdsTime", "5000" ); + setdvar( "bot_MinCrouchTime", "100" ); + setdvar( "bot_MaxCrouchTime", "400" ); + setdvar( "bot_TargetLeadBias", "2" ); + setdvar( "bot_MinReactionTime", "40" ); + setdvar( "bot_MaxReactionTime", "70" ); + setdvar( "bot_StrafeChance", "1" ); + setdvar( "bot_MinStrafeTime", "3000" ); + setdvar( "bot_MaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "512" ); + setdvar( "bot_AllowGrenades", "1" ); + setdvar( "bot_MinGrenadeTime", "1500" ); + setdvar( "bot_MaxGrenadeTime", "4000" ); + setdvar( "bot_MeleeDist", "70" ); + setdvar( "bot_YawSpeed", "2" ); + } + else if ( difficulty == 2 ) + { + setdvar( "bot_MinDeathTime", "250" ); + setdvar( "bot_MaxDeathTime", "500" ); + setdvar( "bot_MinFireTime", "400" ); + setdvar( "bot_MaxFireTime", "600" ); + setdvar( "bot_PitchUp", "-5" ); + setdvar( "bot_PitchDown", "10" ); + setdvar( "bot_Fov", "100" ); + setdvar( "bot_MinAdsTime", "3000" ); + setdvar( "bot_MaxAdsTime", "5000" ); + setdvar( "bot_MinCrouchTime", "100" ); + setdvar( "bot_MaxCrouchTime", "400" ); + setdvar( "bot_TargetLeadBias", "2" ); + setdvar( "bot_MinReactionTime", "400" ); + setdvar( "bot_MaxReactionTime", "700" ); + setdvar( "bot_StrafeChance", "0.9" ); + setdvar( "bot_MinStrafeTime", "3000" ); + setdvar( "bot_MaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "384" ); + setdvar( "bot_AllowGrenades", "1" ); + setdvar( "bot_MinGrenadeTime", "1500" ); + setdvar( "bot_MaxGrenadeTime", "4000" ); + setdvar( "bot_MeleeDist", "70" ); + setdvar( "bot_YawSpeed", "1.4" ); + } + else if ( difficulty == 0 ) + { + setdvar( "bot_MinDeathTime", "1000" ); + setdvar( "bot_MaxDeathTime", "2000" ); + setdvar( "bot_MinFireTime", "900" ); + setdvar( "bot_MaxFireTime", "1000" ); + setdvar( "bot_PitchUp", "-20" ); + setdvar( "bot_PitchDown", "40" ); + setdvar( "bot_Fov", "50" ); + setdvar( "bot_MinAdsTime", "3000" ); + setdvar( "bot_MaxAdsTime", "5000" ); + setdvar( "bot_MinCrouchTime", "4000" ); + setdvar( "bot_MaxCrouchTime", "6000" ); + setdvar( "bot_TargetLeadBias", "8" ); + setdvar( "bot_MinReactionTime", "1200" ); + setdvar( "bot_MaxReactionTime", "1600" ); + setdvar( "bot_StrafeChance", "0.1" ); + setdvar( "bot_MinStrafeTime", "3000" ); + setdvar( "bot_MaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "256" ); + setdvar( "bot_AllowGrenades", "0" ); + setdvar( "bot_MeleeDist", "40" ); + } + else + { + setdvar( "bot_MinDeathTime", "500" ); + setdvar( "bot_MaxDeathTime", "1000" ); + setdvar( "bot_MinFireTime", "600" ); + setdvar( "bot_MaxFireTime", "800" ); + setdvar( "bot_PitchUp", "-10" ); + setdvar( "bot_PitchDown", "20" ); + setdvar( "bot_Fov", "70" ); + setdvar( "bot_MinAdsTime", "3000" ); + setdvar( "bot_MaxAdsTime", "5000" ); + setdvar( "bot_MinCrouchTime", "2000" ); + setdvar( "bot_MaxCrouchTime", "4000" ); + setdvar( "bot_TargetLeadBias", "4" ); + setdvar( "bot_MinReactionTime", "600" ); + setdvar( "bot_MaxReactionTime", "800" ); + setdvar( "bot_StrafeChance", "0.6" ); + setdvar( "bot_MinStrafeTime", "3000" ); + setdvar( "bot_MaxStrafeTime", "6000" ); + setdvar( "scr_help_dist", "256" ); + setdvar( "bot_AllowGrenades", "1" ); + setdvar( "bot_MinGrenadeTime", "1500" ); + setdvar( "bot_MaxGrenadeTime", "4000" ); + setdvar( "bot_MeleeDist", "70" ); + setdvar( "bot_YawSpeed", "1.2" ); + } + + if ( level.gametype == "oic" && difficulty == 3 ) + { + setdvar( "bot_MinReactionTime", "400" ); + setdvar( "bot_MaxReactionTime", "500" ); + setdvar( "bot_MinAdsTime", "1000" ); + setdvar( "bot_MaxAdsTime", "2000" ); + } + + if ( ( difficulty == 2 || difficulty == 3 ) && level.gametype == "oic" ) + { + setdvar( "bot_SprintDistance", "256" ); + } + + if ( !getDvarInt( "bots_play_nade" ) ) + SetDvar( "bot_AllowGrenades", "0" ); + + if ( !getDvarInt( "bots_play_aim" ) ) + { + setdvar( "bot_YawSpeed", "0" ); + setdvar( "bot_PitchUp", "0" ); + setdvar( "bot_PitchDown", "0" ); + } +} + +/* + A server thread for monitoring all bot's teams for custom server settings. +*/ +teamBots_loop() +{ + teamAmount = getDvarInt( "bots_team_amount" ); + toTeam = getDvar( "bots_team" ); + + alliesbots = 0; + alliesplayers = 0; + axisbots = 0; + axisplayers = 0; + + playercount = level.players.size; + + for ( i = 0; i < playercount; i++ ) + { + player = level.players[i]; + + if ( isDefined( player.pers["team"] ) ) + { + if ( player maps\mp\_utility::is_bot() ) + { + if ( player.pers["team"] == "allies" ) + alliesbots++; + else if ( player.pers["team"] == "axis" ) + axisbots++; + } + else + { + if ( player.pers["team"] == "allies" ) + alliesplayers++; + else if ( player.pers["team"] == "axis" ) + axisplayers++; + } + } + } + + allies = alliesbots; + axis = axisbots; + + if ( !getDvarInt( "bots_team_mode" ) ) + { + allies += alliesplayers; + axis += axisplayers; + } + + if ( toTeam != "custom" ) + { + if ( getDvarInt( "bots_team_force" ) ) + { + if ( toTeam == "autoassign" ) + { + if ( abs( axis - allies ) > 1 ) + { + toTeam = "axis"; + + if ( axis > allies ) + toTeam = "allies"; + } + } + + if ( toTeam != "autoassign" ) + { + playercount = level.players.size; + + for ( i = 0; i < playercount; i++ ) + { + player = level.players[i]; + + if ( isDefined( player.pers["team"] ) && player maps\mp\_utility::is_bot() && ( player.pers["team"] != toTeam ) ) + { + if ( toTeam == "allies" ) + player thread [[level.allies]](); + else if ( toTeam == "axis" ) + player thread [[level.axis]](); + else + player thread [[level.spectator]](); + + break; + } + } + } + } + } + else + { + playercount = level.players.size; + + for ( i = 0; i < playercount; i++ ) + { + player = level.players[i]; + + if ( isDefined( player.pers["team"] ) && player maps\mp\_utility::is_bot() ) + { + if ( player.pers["team"] == "axis" ) + { + if ( axis > teamAmount ) + { + player thread [[level.allies]](); + break; + } + } + else + { + if ( axis < teamAmount ) + { + player thread [[level.axis]](); + break; + } + else if ( player.pers["team"] != "allies" ) + { + player thread [[level.allies]](); + break; + } + } + } + } + } +} + +/* + A server thread for monitoring all bot's teams for custom server settings. +*/ +teamBots() +{ + for ( ;; ) + { + wait 1.5; + teamBots_loop(); + } +} + +/* + Loop +*/ +addBots_loop() +{ + botsToAdd = GetDvarInt( "bots_manage_add" ); + + if ( botsToAdd > 0 ) + { + SetDvar( "bots_manage_add", 0 ); + + if ( botsToAdd > 64 ) + botsToAdd = 64; + + for ( ; botsToAdd > 0; botsToAdd-- ) + { + level add_bot(); + wait 0.5; + } + } + + fillMode = getDVarInt( "bots_manage_fill_mode" ); + + if ( fillMode == 2 || fillMode == 3 ) + setDvar( "bots_manage_fill", getGoodMapAmount() ); + + fillAmount = getDvarInt( "bots_manage_fill" ); + + players = 0; + bots = 0; + spec = 0; + + playercount = level.players.size; + + for ( i = 0; i < playercount; i++ ) + { + player = level.players[i]; + + if ( player maps\mp\_utility::is_bot() ) + bots++; + else if ( !isDefined( player.pers["team"] ) ) + spec++; + else if ( player.pers["team"] != "axis" && player.pers["team"] != "allies" ) // dude this compiler is kekware + spec++; + else + players++; + } + + if ( fillMode == 4 ) + { + axisplayers = 0; + alliesplayers = 0; + + playercount = level.players.size; + + for ( i = 0; i < playercount; i++ ) + { + player = level.players[i]; + + if ( !player maps\mp\_utility::is_bot() && isDefined( player.pers["team"] ) ) + { + if ( player.pers["team"] == "axis" ) + axisplayers++; + else if ( player.pers["team"] == "allies" ) + alliesplayers++; + } + } + + result = fillAmount - abs( axisplayers - alliesplayers ) + bots; + + if ( players == 0 ) + { + if ( bots < fillAmount ) + result = fillAmount - 1; + else if ( bots > fillAmount ) + result = fillAmount + 1; + else + result = fillAmount; + } + + bots = result; + } + + if ( !randomInt( 999 ) ) + { + setDvar( "testclients_doreload", true ); + wait 0.1; + setDvar( "testclients_doreload", false ); + doExtraCheck(); + } + + amount = bots; + + if ( fillMode == 0 || fillMode == 2 ) + amount += players; + + if ( getDVarInt( "bots_manage_fill_spec" ) ) + amount += spec; + + if ( amount < fillAmount ) + setDvar( "bots_manage_add", 1 ); + else if ( amount > fillAmount && getDvarInt( "bots_manage_fill_kick" ) ) + { + tempBot = PickRandom( getBotArray() ); + + if ( isDefined( tempBot ) ) + kick( tempBot getEntityNumber() ); + } +} + +/* + A server thread for monitoring all bot's in game. Will add and kick bots according to server settings. +*/ +addBots() +{ + level endon ( "game_ended" ); + + bot_wait_for_host(); + + for ( ;; ) + { + wait 1.5; + + addBots_loop(); + } +} + +/* + Adds a bot to the game. +*/ +add_bot() +{ + bot = addtestclient(); + + if ( isdefined( bot ) ) + { + bot.pers["isBot"] = true; + bot thread added(); + } +} + +/* + Player connects +*/ +onPlayerConnect() +{ + for ( ;; ) + { + level waittill( "connected", player ); + + player thread connected(); + } +} + +/* + Connects +*/ +connected() +{ + +} + +/* + Bot was added +*/ +added() { self endon( "disconnect" ); - - for ( ;; ) - { - wait 0.05; - } +} + +GetHostPlayer() +{ + return undefined; +} + +bot_wait_for_host() +{ + +} + +getGoodMapAmount() +{ + return 2; +} + +doExtraCheck() +{ + +} + +PickRandom( arr ) +{ + if ( !arr.size ) + return undefined; + + return arr[randomInt( arr.size )]; +} + +getBotArray() +{ + answer = []; + + for ( i = 0; i < level.players.size; i++ ) + { + if ( level.players[i] maps\mp\_utility::is_bot() ) + answer[answer.size] = level.players[i]; + } + + return answer; }