static CBasePlayer* ClientPutInServerOverride_Bot( edict_t *pEdict, const char *playername ) { // This tells it which edict to use rather than creating a new one. CBasePlayer::s_PlayerEdict = pEdict; CSDKBot *pPlayer = static_cast<CSDKBot *>( CreateEntityByName( "sdk_bot" ) ); if ( pPlayer ) { pPlayer->SetPlayerName( playername ); } return pPlayer; }
//----------------------------------------------------------------------------- // Purpose: Run through all the Bots in the game and let them think. //----------------------------------------------------------------------------- void Bot_RunAll(void) { /*if (g_iWaitingAmount && g_bServerReady) //Kind of a shitty hack. But this will allow people to spawn a certain amount of bots in { //the server.cfg. Anyway, the server is ready, so do it. BotPutInServer(g_iWaitingAmount, false); g_iWaitingAmount = 0; //Make sure we've reset the waiting count. }*/ //bot manager handles bot population via the svars CBotManager::Think(); //let the vcomm managers do their thing g_BotAmerComms.Think(); g_BotBritComms.Think(); if (bot_pause.GetBool()) //If we're true, just don't run the thinking cycle. Effectively "pausing" the bots. return; BotDebugThink(); //we're testing something, don't let the AI interfere! extern ConVar bot_mimic; if (bot_mimic.GetBool()) return; #ifdef PROFILE_BOT_PERFORMANCE auto preThinkTime = std::chrono::system_clock::now(); #endif for (int i = 1; i <= gpGlobals->maxClients; i++) { CSDKPlayer *pPlayer = UTIL_PlayerByIndex(i);// ); if (pPlayer && (pPlayer->GetFlags() & FL_FAKECLIENT)) { CSDKBot *pBot = CSDKBot::ToBot(pPlayer); if (pBot) {//Do most of the "filtering" here. pBot->Think(); } } } #ifdef PROFILE_BOT_PERFORMANCE auto postThinkTime = std::chrono::system_clock::now(); int deltaTime = std::chrono::duration_cast<std::chrono::milliseconds>(postThinkTime - preThinkTime).count(); static int counter = 0; counter++; if (counter == 500) { counter = 0; Msg("%i\n", deltaTime); } #endif }
//----------------------------------------------------------------------------- // Purpose: Create a new Bot and put it in the game. // Output : Pointer to the new Bot, or NULL if there's no free clients. //----------------------------------------------------------------------------- CBasePlayer *BotPutInServer( bool bFrozen ) { char botname[ 64 ]; Q_snprintf( botname, sizeof( botname ), "Bot%02i", g_CurBotNumber ); // This trick lets us create a CSDKBot for this client instead of the CSDKPlayer // that we would normally get when ClientPutInServer is called. ClientPutInServerOverride( &CBotManager::ClientPutInServerOverride_Bot ); edict_t *pEdict = engine->CreateFakeClient( botname ); ClientPutInServerOverride( NULL ); if (!pEdict) { Msg( "Failed to create Bot.\n"); return NULL; } // Allocate a player entity for the bot, and call spawn CSDKBot *pPlayer = ((CSDKBot*)CBaseEntity::Instance( pEdict )); pPlayer->ClearFlags(); pPlayer->AddFlag( FL_CLIENT | FL_FAKECLIENT ); if ( bFrozen ) pPlayer->AddEFlags( EFL_BOT_FROZEN ); pPlayer->ChangeTeam( TEAM_UNASSIGNED ); pPlayer->RemoveAllItems( true ); pPlayer->Spawn(); g_CurBotNumber++; return pPlayer; }
//----------------------------------------------------------------------------- // Purpose: Create a new Bot and put it in the game. // Output : Pointer to the new Bot, or NULL if there's no free clients. //----------------------------------------------------------------------------- CBasePlayer *BotPutInServer( bool bFrozen ) { char botname[ 64 ]; Q_snprintf( botname, sizeof( botname ), "Bot%02i", g_CurBotNumber ); // This trick lets us create a CSDKBot for this client instead of the CSDKPlayer // that we would normally get when ClientPutInServer is called. ClientPutInServerOverride( &CBotManager::ClientPutInServerOverride_Bot ); edict_t *pEdict = engine->CreateFakeClient( botname ); ClientPutInServerOverride( NULL ); if (!pEdict) { Msg( "Failed to create Bot.\n"); return NULL; } // Allocate a player entity for the bot, and call spawn CSDKBot *pPlayer = ((CSDKBot*)CBaseEntity::Instance( pEdict )); pPlayer->ClearFlags(); pPlayer->AddFlag( FL_CLIENT | FL_FAKECLIENT ); if ( bFrozen ) pPlayer->AddEFlags( EFL_BOT_FROZEN ); pPlayer->ChangeTeam( TEAM_UNASSIGNED ); pPlayer->RemoveAllItems( true ); SDKWeaponID eWeapon = SDK_WEAPON_NONE; while (eWeapon == SDK_WEAPON_NONE || eWeapon == SDK_WEAPON_BRAWL) eWeapon = (SDKWeaponID)RandomInt(1, WEAPON_MAX-1); pPlayer->AddToLoadout(eWeapon); pPlayer->State_Transition( STATE_ACTIVE ); CCommand args; args.Tokenize( "menuclosed" ); pPlayer->ClientCommand( args ); g_CurBotNumber++; return pPlayer; }