//========================================== // BOT_InitPersistant // Persistant after respawns. To be class definition in the future //========================================== static void BOT_InitPersistant( edict_t *self ) { float sv_skill; //standard stuff self->think = NULL; self->nextThink = level.time + 1; self->ai->type = AI_ISBOT; self->classname = "bot"; self->yaw_speed = AI_DEFAULT_YAW_SPEED; self->die = player_die; // set skill based on sv_skilllevel cvar sv_skill = trap_Cvar_Value( "sv_skilllevel" ); // 0 = easy, 2 = hard sv_skill += random(); // so we have a float between 0 and 3 meaning the server skill clamp( sv_skill, 0.1f, 3.0f ); self->ai->pers.skillLevel = sv_skill/3.0f; // the same being a fraction of 1. if( self->ai->pers.skillLevel < 0.1f ) self->ai->pers.skillLevel = 0.1f; self->yaw_speed -= 20 * ( 1.0f - self->ai->pers.skillLevel ); if( self->r.client->netname[0] ) self->ai->pers.netname = self->r.client->netname; else self->ai->pers.netname = "SomeBot"; G_Printf( "%s skill %i\n", self->r.client->netname, (int)( self->ai->pers.skillLevel * 100 ) ); //class: always set up default first BOT_DMclass_InitPersistant( self ); }
/////////////////////////////////////////////////////////////////////// // Spawn the bot /////////////////////////////////////////////////////////////////////// void BOT_SpawnBot (char *team, char *name, char *skin, char *userinfo) { edict_t *bot; if( !nav.loaded ) { Com_Printf("Can't spawn bots without a valid navigation file\n"); return; } bot = BOT_FindFreeClient (); if (!bot) { safe_bprintf (PRINT_MEDIUM, "Server is full, increase Maxclients.\n"); return; } //init the bot bot->inuse = true; bot->yaw_speed = 100; // To allow bots to respawn if(userinfo == NULL) BOT_SetName(bot, name, skin, team); else ClientConnect (bot, userinfo); G_InitEdict (bot); G_SpawnAI(bot); //jabot092(2) bot->ai->is_bot = true; InitClientResp (bot->client); PutClientInServer(bot); BOT_StartAsSpectator (bot); //skill bot->ai->pers.skillLevel = (int)(random()*MAX_BOT_SKILL); if (bot->ai->pers.skillLevel > MAX_BOT_SKILL) //fix if off-limits bot->ai->pers.skillLevel = MAX_BOT_SKILL; else if (bot->ai->pers.skillLevel < 0) bot->ai->pers.skillLevel = 0; BOT_DMclass_InitPersistant(bot); AI_ResetWeights(bot); AI_ResetNavigation(bot); bot->think = BOT_JoinGame; bot->nextthink = level.time + (int)(random()*6.0); if( ctf->value && team != NULL ) { if( !Q_stricmp( team, "blue" ) ) bot->think = BOT_JoinBlue; else if( !Q_stricmp( team, "red" ) ) bot->think = BOT_JoinRed; } AI_EnemyAdded (bot); // let the ai know we added another }