#include common_scripts\utility; #include maps\mp\_utility; #include maps\mp\gametypes\_gamelogic; #include maps\mp\bots\_bots_util; #include maps\mp\bots\_bots_strategy; // #include maps\mp\bots\_bots_personality; #include maps\mp\gametypes\_damage; #include maps\mp\agents\_agent_utility; //======================================================= // main //======================================================= main() { setup_callbacks(); } setup_callbacks() { level.agent_funcs["civ_hvt"] = []; level.agent_funcs["civ_hvt"]["spawn"] = ::onSpawn; level.agent_funcs["civ_hvt"]["think"] = ::agentThink; level.agent_funcs["civ_hvt"]["on_killed"] = ::onAgentKilled; level.agent_funcs["civ_hvt"]["on_damaged"] = maps\mp\agents\_agents::on_agent_player_damaged; level.agent_funcs["civ_hvt"]["on_damaged_finished"] = maps\mp\agents\_agents::agent_damage_finished; } onSpawn( optional_spawnOrigin, optional_spawnAngles, optional_owner, use_randomized_personality, respawn_on_death, difficulty ) { self.hvtIsFollowing = false; self maps\mp\agents\_agents::spawn_agent_player( optional_spawnOrigin, optional_spawnAngles, optional_owner, use_randomized_personality, respawn_on_death, difficulty ); self thread handlePlayerUse(); } onAgentKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ) { self.defendNode = undefined; self.hvtTrigger MakeUnusable(); self.hvtTrigger = undefined; // ragdoll self.body = self CloneAgent( deathAnimDuration ); thread delayStartRagdoll( self.body, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath ); if ( IsDefined( self.onKilledCallback ) ) { self [[ self.onKilledCallback ]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); } self maps\mp\agents\_agent_utility::deactivateAgent(); // send a message to owner self.owner notify( "hvt_killed" ); } agentThink() { self notify( "agent_think" ); self endon( "agent_think" ); self endon( "death" ); self endon( "disconnect" ); level endon( "game_ended" ); self endon( "owner_disconnect" ); while ( true ) { if ( self.hvtIsFollowing ) { self followThink(); } else { self waitThink( 150 ); } } } waitThink( radius ) { self BotSetStance("none"); self BotClearScriptGoal(); self bot_disable_tactical_goals(); defendNode = self.owner getValidSpawnPathNodeNearPlayer(); self.cur_defend_node = undefined; self.bot_defending = true; self.bot_defending_center = defendNode.origin; self.bot_defending_radius = radius; self.cur_defend_stance = "crouch"; self.bot_defending_type = "protect"; result = ""; while( result != "goal" ) { self.cur_defend_node = defendNode; self BotSetScriptGoalNode( self.cur_defend_node, "tactical" ); result = self waittill_any_return( "goal", "bad_path" ); self.node_closest_to_defend_center = defendNode; self.cur_defend_node = undefined; } self childthread defense_watch_entrances_at_goal(); self waittill( "hvt_toggle" ); } followThink() // self == agent { self BotClearScriptGoal(); self bot_disable_tactical_goals(); if ( !self bot_is_guarding_player( self.owner ) ) { self bot_guard_player( self.owner, 250 ); } self waittill( "hvt_toggle" ); } handlePlayerUse() // self == agent { level endon( "game_ended" ); self endon( "death" ); if ( !IsDefined( self.hvtTrigger ) ) { self.hvtTrigger = Spawn( "script_model", self.origin ); self.hvtTrigger LinkTo( self ); } self.hvtTrigger MakeUsable(); foreach ( player in level.players ) { if ( player != self.owner ) { self.hvtTrigger DisablePlayerUse( player ); } else { self.hvtTrigger EnablePlayerUse( player ); } } self thread waitForPlayerConnect(); while ( true ) { self setFollowerHintString(); self.hvtTrigger waittill ( "trigger", player ); assert( player == self.owner ); self.hvtIsFollowing = !self.hvtIsFollowing; // do something with the AI print( "Is Following: " + self.hvtIsFollowing ); self notify( "hvt_toggle" ); } } setFollowerHintString() { hintString = &"MP_HVT_FOLLOW"; if ( self.hvtIsFollowing ) { hintString = &"MP_HVT_WAIT"; } self.hvtTrigger setHintString( hintString ); } waitForPlayerConnect() { level endon( "game_ended" ); self endon( "death" ); while ( true ) { level waittill( "connected", player ); self.hvtTrigger disablePlayerUse( player ); } }