//----------------------------------------------------------------------------- // 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; }