iw6-scripts-dev/maps/mp/agents/_agents_civ_hvt.gsc
2024-12-11 11:28:08 +01:00

193 lines
4.4 KiB
Plaintext

#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 );
}
}