//========================================== // BOT_DMclass_RunFrame // States Machine & call client movement //========================================== static void BOT_DMclass_RunFrame( edict_t *self ) { usercmd_t ucmd; float weapon_quality; bool inhibitCombat = false; int i; if( G_ISGHOSTING( self ) ) { BOT_DMclass_GhostingFrame( self ); return; } memset( &ucmd, 0, sizeof( ucmd ) ); //get ready if in the game if( GS_MatchState() <= MATCH_STATE_WARMUP && !level.ready[PLAYERNUM(self)] && self->r.client->teamstate.timeStamp + 4000 < level.time ) G_Match_Ready( self ); if( level.gametype.dummyBots || bot_dummy->integer ) { self->r.client->level.last_activity = level.time; } else { BOT_DMclass_FindEnemy( self ); weapon_quality = BOT_DMclass_ChooseWeapon( self ); inhibitCombat = ( AI_CurrentLinkType( self ) & (LINK_JUMPPAD|LINK_JUMP|LINK_ROCKETJUMP) ) != 0 ? true : false; if( self->enemy && weapon_quality >= 0.3 && !inhibitCombat ) // don't fight with bad weapons { if( BOT_DMclass_FireWeapon( self, &ucmd ) ) self->ai->state_combat_timeout = level.time + AI_COMBATMOVE_TIMEOUT; } if( inhibitCombat ) self->ai->state_combat_timeout = 0; if( self->ai->state_combat_timeout > level.time ) { BOT_DMclass_CombatMovement( self, &ucmd ); } else { BOT_DMclass_Move( self, &ucmd ); } //set up for pmove for( i = 0; i < 3; i++ ) ucmd.angles[i] = ANGLE2SHORT( self->s.angles[i] ) - self->r.client->ps.pmove.delta_angles[i]; VectorSet( self->r.client->ps.pmove.delta_angles, 0, 0, 0 ); } // set approximate ping and show values ucmd.msec = game.frametime; ucmd.serverTimeStamp = game.serverTime; ClientThink( self, &ucmd, 0 ); self->nextThink = level.time + 1; BOT_DMclass_VSAYmessages( self ); }
//========================================== // M_default_FindEnemy //========================================== qboolean M_default_FindEnemy(edict_t *self) { return BOT_DMclass_FindEnemy(self); }