boiii-scripts/shared/ai/margwa.csc
2023-04-13 17:30:38 +02:00

551 lines
26 KiB
Plaintext

#using scripts\shared\ai_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\postfx_shared;
#using scripts\shared\util_shared;
#precache( "client_fx", "zombie/fx_margwa_teleport_zod_zmb" );
#precache( "client_fx", "zombie/fx_margwa_teleport_travel_zod_zmb" );
#precache( "client_fx", "zombie/fx_margwa_teleport_tell_zod_zmb" );
#precache( "client_fx", "zombie/fx_margwa_teleport_intro_zod_zmb" );
#precache( "client_fx", "zombie/fx_margwa_head_shot_zod_zmb" );
#precache( "client_fx", "zombie/fx_margwa_roar_zod_zmb" );
#precache( "client_fx", "zombie/fx_margwa_roar_purple_zod_zmb" );
#using_animtree( "generic" );
function autoexec main()
{
clientfield::register( "actor", "margwa_head_left", 1, 2, "int", &MargwaClientUtils::margwaHeadLeftCallback, !true, !true );
clientfield::register( "actor", "margwa_head_mid", 1, 2, "int", &MargwaClientUtils::margwaHeadMidCallback, !true, !true );
clientfield::register( "actor", "margwa_head_right", 1, 2, "int", &MargwaClientUtils::margwaHeadRightCallback, !true, !true );
clientfield::register( "actor", "margwa_fx_in", 1, 1, "counter", &MargwaClientUtils::margwaFxInCallback, !true, !true );
clientfield::register( "actor", "margwa_fx_out", 1, 1, "counter", &MargwaClientUtils::margwaFxOutCallback, !true, !true );
clientfield::register( "actor", "margwa_fx_spawn", 1, 1, "counter", &MargwaClientUtils::margwaFxSpawnCallback, !true, !true );
clientfield::register( "actor", "margwa_smash", 1, 1, "counter", &MargwaClientUtils::margwaSmashCallback, !true, !true );
clientfield::register( "actor", "margwa_head_left_hit", 1, 1, "counter", &MargwaClientUtils::margwaLeftHitCallback, !true, !true );
clientfield::register( "actor", "margwa_head_mid_hit", 1, 1, "counter", &MargwaClientUtils::margwaMidHitCallback, !true, !true );
clientfield::register( "actor", "margwa_head_right_hit", 1, 1, "counter", &MargwaClientUtils::margwaRightHitCallback, !true, !true );
clientfield::register( "actor", "margwa_head_killed", 1, 2, "int", &MargwaClientUtils::margwaHeadKilledCallback, !true, !true );
clientfield::register( "actor", "margwa_jaw", 1, 6, "int", &MargwaClientUtils::margwaJawCallback, !true, !true );
clientfield::register( "toplayer", "margwa_head_explosion", 1, 1, "counter", &MargwaClientUtils::margwaHeadExplosion, !true, !true );
clientfield::register( "scriptmover", "margwa_fx_travel", 1, 1, "int", &MargwaClientUtils::margwaFxTravelCallback, !true, !true );
clientfield::register( "scriptmover", "margwa_fx_travel_tell", 1, 1, "int", &MargwaClientUtils::margwaFxTravelTellCallback, !true, !true );
clientfield::register( "actor", "supermargwa", 1, 1, "int", undefined, !true, !true ); // set this bit when spawning supermargwa for ee quest
ai::add_archetype_spawn_function( "margwa", &MargwaClientUtils::margwaSpawn );
level._jaw = [];
level._jaw[ 1 ] = "idle_1";
level._jaw[ 3 ] = "idle_pain_head_l_explode";
level._jaw[ 4 ] = "idle_pain_head_m_explode";
level._jaw[ 5 ] = "idle_pain_head_r_explode";
level._jaw[ 6 ] = "react_stun";
level._jaw[ 8 ] = "react_idgun";
level._jaw[ 9 ] = "react_idgun_pack";
level._jaw[ 7 ] = "run_charge_f";
level._jaw[ 13 ] = "run_f";
level._jaw[ 14 ] = "smash_attack_1";
level._jaw[ 15 ] = "swipe";
level._jaw[ 16 ] = "swipe_player";
level._jaw[ 17 ] = "teleport_in";
level._jaw[ 18 ] = "teleport_out";
level._jaw[ 19 ] = "trv_jump_across_256";
level._jaw[ 20 ] = "trv_jump_down_128";
level._jaw[ 21 ] = "trv_jump_down_36";
level._jaw[ 22 ] = "trv_jump_down_96";
level._jaw[ 23 ] = "trv_jump_up_128";
level._jaw[ 24 ] = "trv_jump_up_36";
level._jaw[ 25 ] = "trv_jump_up_96";
}
function autoexec precache()
{
level._effect[ "fx_margwa_teleport_zod_zmb" ] = "zombie/fx_margwa_teleport_zod_zmb";
level._effect[ "fx_margwa_teleport_travel_zod_zmb" ] = "zombie/fx_margwa_teleport_travel_zod_zmb";
level._effect[ "fx_margwa_teleport_tell_zod_zmb" ] = "zombie/fx_margwa_teleport_tell_zod_zmb";
level._effect[ "fx_margwa_teleport_intro_zod_zmb" ] = "zombie/fx_margwa_teleport_intro_zod_zmb";
level._effect[ "fx_margwa_head_shot_zod_zmb" ] = "zombie/fx_margwa_head_shot_zod_zmb";
level._effect[ "fx_margwa_roar_zod_zmb" ] = "zombie/fx_margwa_roar_zod_zmb";
level._effect[ "fx_margwa_roar_purple_zod_zmb" ] = "zombie/fx_margwa_roar_purple_zod_zmb";
}
#namespace MargwaClientUtils;
function private margwaSpawn( localClientNum )
{
self util::waittill_dobj(localClientNum);
if (!isdefined(self))
return;
self SetAnim( "ai_margwa_head_l_closed_add", 1.0, 0.2, 1.0 );
self SetAnim( "ai_margwa_head_m_closed_add", 1.0, 0.2, 1.0 );
self SetAnim( "ai_margwa_head_r_closed_add", 1.0, 0.2, 1.0 );
for ( i = 1; i <= 7; i++ )
{
leftTentacle = "ai_margwa_tentacle_l_0" + i;
rightTentacle = "ai_margwa_tentacle_r_0" + i;
self SetAnim( leftTentacle, 1.0, 0.2, 1.0 );
self SetAnim( rightTentacle, 1.0, 0.2, 1.0 );
}
level._footstepCBFuncs[self.archetype] = &margwaProcessFootstep;
self.heads = [];
self.heads[ 1 ] = SpawnStruct();
self.heads[ 1 ].index = 1;
self.heads[ 1 ].prevHeadAnim = "ai_margwa_head_l_closed_add";
self.heads[ 1 ].jawBase = "ai_margwa_jaw_l_";
self.heads[ 2 ] = SpawnStruct();
self.heads[ 2 ].index = 2;
self.heads[ 2 ].prevHeadAnim = "ai_margwa_head_m_closed_add";
self.heads[ 2 ].jawBase = "ai_margwa_jaw_m_";
self.heads[ 3 ] = SpawnStruct();
self.heads[ 3 ].index = 3;
self.heads[ 3 ].prevHeadAnim = "ai_margwa_head_r_closed_add";
self.heads[ 3 ].jawBase = "ai_margwa_jaw_r_";
}
function private margwaHeadLeftCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( IsDefined( self.leftGlowFx ) )
{
StopFx( localClientNum, self.leftGlowFx );
}
self util::waittill_dobj(localClientNum);
if (!isdefined(self))
return;
switch ( newValue )
{
case 1:
self.heads[ 1 ].prevHeadAnim = "ai_margwa_head_l_open_add";
self SetAnim( "ai_margwa_head_l_open_add", 1.0, 0.1, 1.0 );
self ClearAnim( "ai_margwa_head_l_closed_add", 0.1 );
roar_effect = level._effect[ "fx_margwa_roar_zod_zmb" ];
if( isDefined( self.margwa_roar_effect ))
{
roar_effect = self.margwa_roar_effect;
}
if( self clientfield::get( "supermargwa" ) )
{
self.leftGlowFx = PlayFxOnTag( localClientNum, level._effect[ "fx_margwa_roar_purple_zod_zmb" ], self, "tag_head_left" );
}
else
{
self.leftGlowFx = PlayFxOnTag( localClientNum, roar_effect, self, "tag_head_left" );
}
break;
case 2:
self.heads[ 1 ].prevHeadAnim = "ai_margwa_head_l_closed_add";
self SetAnim( "ai_margwa_head_l_closed_add", 1.0, 0.1, 1.0 );
self ClearAnim( "ai_margwa_head_l_open_add", 0.1 );
self ClearAnim( "ai_margwa_head_l_smash_attack_1", 0.1 );
break;
case 3:
self.heads[ 1 ].prevHeadAnim = "ai_margwa_head_l_smash_attack_1";
self ClearAnim( "ai_margwa_head_l_open_add", 0.1 );
self ClearAnim( "ai_margwa_head_l_closed_add", 0.1 );
self SetAnimRestart( "ai_margwa_head_l_smash_attack_1", 1, 0.1, 1);
roar_effect = level._effect[ "fx_margwa_roar_zod_zmb" ];
if( isDefined( self.margwa_roar_effect ))
{
roar_effect = self.margwa_roar_effect;
}
if( self clientfield::get( "supermargwa" ) )
{
self.leftGlowFx = PlayFxOnTag( localClientNum, level._effect[ "fx_margwa_roar_purple_zod_zmb" ], self, "tag_head_left" );
}
else
{
self.leftGlowFx = PlayFxOnTag( localClientNum, roar_effect, self, "tag_head_left" );
}
self thread margwaStopSmashFx( localClientNum );
break;
}
}
function private margwaHeadMidCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( IsDefined( self.midGlowFx ) )
{
StopFx( localClientNum, self.midGlowFx );
}
self util::waittill_dobj(localClientNum);
if (!isdefined(self))
return;
switch ( newValue )
{
case 1:
self SetAnim( "ai_margwa_head_m_open_add", 1.0, 0.1, 1.0 );
self ClearAnim( "ai_margwa_head_m_closed_add", 0.1 );
roar_effect = level._effect[ "fx_margwa_roar_zod_zmb" ];
if( isDefined( self.margwa_roar_effect ))
{
roar_effect = self.margwa_roar_effect;
}
if( self clientfield::get( "supermargwa" ) )
{
self.midGlowFx = PlayFxOnTag( localClientNum, level._effect[ "fx_margwa_roar_purple_zod_zmb" ], self, "tag_head_mid" );
}
else
{
self.midGlowFx = PlayFxOnTag( localClientNum, roar_effect, self, "tag_head_mid" );
}
break;
case 2:
self SetAnim( "ai_margwa_head_m_closed_add", 1.0, 0.1, 1.0 );
self ClearAnim( "ai_margwa_head_m_open_add", 0.1 );
self ClearAnim( "ai_margwa_head_m_smash_attack_1", 0.1 );
break;
case 3:
self ClearAnim( "ai_margwa_head_m_open_add", 0.1 );
self ClearAnim( "ai_margwa_head_m_closed_add", 0.1 );
self SetAnimRestart( "ai_margwa_head_m_smash_attack_1", 1, 0.1, 1);
roar_effect = level._effect[ "fx_margwa_roar_zod_zmb" ];
if( isDefined( self.margwa_roar_effect ))
{
roar_effect = self.margwa_roar_effect;
}
if( self clientfield::get( "supermargwa" ) )
{
self.midGlowFx = PlayFxOnTag( localClientNum, level._effect[ "fx_margwa_roar_purple_zod_zmb" ], self, "tag_head_mid" );
}
else
{
self.midGlowFx = PlayFxOnTag( localClientNum, roar_effect, self, "tag_head_mid" );
}
self thread margwaStopSmashFx( localClientNum );
break;
}
}
function private margwaHeadRightCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( IsDefined( self.rightGlowFx ) )
{
StopFx( localClientNum, self.rightGlowFx );
}
self util::waittill_dobj(localClientNum);
if (!isdefined(self))
return;
switch ( newValue )
{
case 1:
self SetAnim( "ai_margwa_head_r_open_add", 1.0, 0.1, 1.0 );
self ClearAnim( "ai_margwa_head_r_closed_add", 0.1 );
roar_effect = level._effect[ "fx_margwa_roar_zod_zmb" ];
if( isDefined( self.margwa_roar_effect ))
{
roar_effect = self.margwa_roar_effect;
}
if( self clientfield::get( "supermargwa" ) )
{
self.rightGlowFx = PlayFxOnTag( localClientNum, level._effect[ "fx_margwa_roar_purple_zod_zmb" ], self, "tag_head_right" );
}
else
{
self.rightGlowFx = PlayFxOnTag( localClientNum, roar_effect, self, "tag_head_right" );
}
break;
case 2:
self SetAnim( "ai_margwa_head_r_closed_add", 1.0, 0.1, 1.0 );
self ClearAnim( "ai_margwa_head_r_open_add", 0.1 );
self ClearAnim( "ai_margwa_head_r_smash_attack_1", 0.1 );
break;
case 3:
self ClearAnim( "ai_margwa_head_r_open_add", 0.1 );
self ClearAnim( "ai_margwa_head_r_closed_add", 0.1 );
self SetAnimRestart( "ai_margwa_head_r_smash_attack_1", 1, 0.1, 1);
roar_effect = level._effect[ "fx_margwa_roar_zod_zmb" ];
if( isDefined( self.margwa_roar_effect ))
{
roar_effect = self.margwa_roar_effect;
}
if( self clientfield::get( "supermargwa" ) )
{
self.rightGlowFx = PlayFxOnTag( localClientNum, level._effect[ "fx_margwa_roar_purple_zod_zmb" ], self, "tag_head_right" );
}
else
{
self.rightGlowFx = PlayFxOnTag( localClientNum, roar_effect, self, "tag_head_right" );
}
self thread margwaStopSmashFx( localClientNum );
break;
}
}
function private margwaStopSmashFx( localClientNum )
{
self endon( "entityshutdown" );
wait( 0.6 );
if ( IsDefined( self.leftGlowFx ) )
{
StopFx( localClientNum, self.leftGlowFx );
}
if ( IsDefined( self.midGlowFx ) )
{
StopFx( localClientNum, self.midGlowFx );
}
if ( IsDefined( self.rightGlowFx ) )
{
StopFx( localClientNum, self.rightGlowFx );
}
}
function private margwaFxInCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
self.teleportFxIn = PlayFx( localClientNum, level._effect[ "fx_margwa_teleport_zod_zmb" ], self GetTagOrigin( "j_spine_1" ) );
}
}
function private margwaFxOutCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
tagPos = self GetTagOrigin( "j_spine_1" );
self.teleportFxOut = PlayFx( localClientNum, level._effect[ "fx_margwa_teleport_zod_zmb" ], tagPos );
}
}
function private margwaFxTravelCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
switch ( newValue )
{
case 0:
DeleteFx( localClientNum, self.travelerFx );
break;
case 1:
self.travelerFx = PlayFxOnTag( localClientNum, level._effect[ "fx_margwa_teleport_travel_zod_zmb" ], self, "tag_origin" );
break;
}
}
function private margwaFxTravelTellCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
switch ( newValue )
{
case 0:
DeleteFx( localClientNum, self.travelerTellFx );
self notify( "stop_margwaTravelTell" );
break;
case 1:
self.travelerTellFx = PlayFxOnTag( localClientNum, level._effect[ "fx_margwa_teleport_tell_zod_zmb" ], self, "tag_origin" );
self thread margwaTravelTellUpdate( localClientNum );
break;
}
}
function private margwaTravelTellUpdate( localClientNum )
{
self notify( "stop_margwaTravelTell" );
self endon( "stop_margwaTravelTell" );
self endon( "entityshutdown" );
player = GetLocalPlayer( localClientNum );
while ( 1 )
{
if( isdefined(player) )
{
dist_sq = DistanceSquared( player.origin, self.origin );
if ( dist_sq < 1000 * 1000 )
{
player PlayRumbleOnEntity( localClientNum, "tank_rumble" );
}
}
wait( 0.05 );
}
}
function private margwaFxSpawnCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
spawnfx = level._effect[ "fx_margwa_teleport_intro_zod_zmb" ];
if( isDefined( self.margwa_spawn_effect ))
{
spawnfx = self.margwa_spawn_effect;
}
if ( isDefined( self.margwa_play_spawn_effect ) )
{
self thread [[ self.margwa_play_spawn_effect ]]( localClientNum );
}
else
{
self.spawnFx = PlayFx( localClientNum, spawnfx, self GetTagOrigin( "j_spine_1" ) );
}
playsound(0, "zmb_margwa_spawn", self GetTagOrigin( "j_spine_1" ) );
}
}
function private margwaHeadExplosion( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
self postfx::PlayPostfxBundle( "pstfx_parasite_dmg" );
}
}
function margwaProcessFootstep( localClientNum, pos, surface, notetrack, bone )
{
e_player = GetLocalPlayer( localClientNum );
n_dist = DistanceSquared( pos, e_player.origin );
n_margwa_dist = ( GetDvarInt( "scr_margwa_footstep_eq_radius", 1000) * GetDvarInt( "scr_margwa_footstep_eq_radius", 1000) );
if(n_margwa_dist>0)
n_scale = ( n_margwa_dist - n_dist ) / n_margwa_dist;
else
return;
if( n_scale > 1 || n_scale < 0 ) return;
n_scale = n_scale * 0.25;
if( n_scale <= 0.01 ) return;
e_player Earthquake( n_scale, 0.1, pos, n_dist );
if( n_scale <= 0.25 && n_scale > 0.2 )
{
e_player PlayRumbleOnEntity( localClientNum, "shotgun_fire" );
}
else if( n_scale <= 0.2 && n_scale > 0.1 )
{
e_player PlayRumbleOnEntity( localClientNum, "damage_heavy" );
}
else
{
e_player PlayRumbleOnEntity( localClientNum, "reload_small" );
}
}
function private margwaSmashCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
e_player = GetLocalPlayer( localClientNum );
smashPos = self.origin + VectorScale( AnglesToForward( self.angles ), 60 );
distSq = DistanceSquared( smashPos, e_player.origin );
if ( distSq < 144 * 144 )
{
e_player Earthquake( 0.7, 0.25, e_player.origin, 3000 );
e_player PlayRumbleOnEntity( localClientNum, "shotgun_fire" );
}
else if ( distSq < 192 * 192 )
{
e_player Earthquake( 0.7, 0.25, e_player.origin, 1500 );
e_player PlayRumbleOnEntity( localClientNum, "damage_heavy" );
}
}
}
function private margwaLeftHitCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
effect = level._effect[ "fx_margwa_head_shot_zod_zmb" ];
if( isdefined( self.margwa_head_hit_fx ))
{
effect = self.margwa_head_hit_fx;
}
self.leftHitFx = PlayFxOnTag( localClientNum, effect, self, "tag_head_left" );
}
}
function private margwaMidHitCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
effect = level._effect[ "fx_margwa_head_shot_zod_zmb" ];
if( isdefined( self.margwa_head_hit_fx ))
{
effect = self.margwa_head_hit_fx;
}
self.midHitFx = PlayFxOnTag( localClientNum, effect, self, "tag_head_mid" );
}
}
function private margwaRightHitCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
effect = level._effect[ "fx_margwa_head_shot_zod_zmb" ];
if( isdefined( self.margwa_head_hit_fx ))
{
effect = self.margwa_head_hit_fx;
}
self.rightHitFx = PlayFxOnTag( localClientNum, effect, self, "tag_head_right" );
}
}
function private margwaHeadKilledCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
self.heads[ newValue ].killed = true;
}
}
function private margwaJawCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
foreach( head in self.heads )
{
if ( ( isdefined( head.killed ) && head.killed ) )
{
if ( IsDefined( head.prevJawAnim ) )
{
self ClearAnim( head.prevJawAnim, 0.2 );
}
if ( IsDefined( head.prevHeadAnim ) )
{
self ClearAnim( head.prevHeadAnim, 0.1 );
}
jawAnim = head.jawBase + level._jaw[ newValue ];
head.prevJawAnim = jawAnim;
self SetAnim( jawAnim, 1.0, 0.2, 1.0 );
}
}
}
}