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

289 lines
21 KiB
Plaintext

#using scripts\shared\ai_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\postfx_shared;
#using scripts\shared\visionset_mgr_shared;
#precache( "client_fx", "dlc1/castle/fx_mech_wpn_flamethrower" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_armor_face" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_armor" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_armor" );
#precache( "client_fx", "dlc1/castle/fx_wpn_115_muz" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_armor" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_armor" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_armor" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_armor" );
#precache( "client_fx", "dlc1/castle/fx_mech_head_light" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_sparks" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_sparks" );
#precache( "client_fx", "dlc1/castle/fx_mech_foot_step" );
#precache( "client_fx", "dlc1/castle/fx_mech_light_dmg" );
#precache( "client_fx", "dlc1/castle/fx_mech_foot_step_steam" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_knee_sparks" );
#precache( "client_fx", "dlc1/castle/fx_mech_dmg_body_light" );
function autoexec main()
{
clientfield::register( "actor", "mechz_ft", 5000, 1, "int", &MechzClientUtils::mechzFlamethrowerCallback, !true, !true );
clientfield::register( "actor", "mechz_faceplate_detached", 5000, 1, "int", &MechzClientUtils::mechz_detach_faceplate, !true, !true );
clientfield::register( "actor", "mechz_powercap_detached", 5000, 1, "int", &MechzClientUtils::mechz_detach_powercap, !true, !true );
clientfield::register( "actor", "mechz_claw_detached", 5000, 1, "int", &MechzClientUtils::mechz_detach_claw, !true, !true );
clientfield::register( "actor", "mechz_115_gun_firing", 5000, 1, "int", &MechzClientUtils::mechz_115_gun_muzzle_flash, !true, !true );
clientfield::register( "actor", "mechz_rknee_armor_detached", 5000, 1, "int", &MechzClientUtils::mechz_detach_rknee_armor, !true, !true );
clientfield::register( "actor", "mechz_lknee_armor_detached", 5000, 1, "int", &MechzClientUtils::mechz_detach_lknee_armor, !true, !true );
clientfield::register( "actor", "mechz_rshoulder_armor_detached", 5000, 1, "int", &MechzClientUtils::mechz_detach_rshoulder_armor, !true, !true );
clientfield::register( "actor", "mechz_lshoulder_armor_detached", 5000, 1, "int", &MechzClientUtils::mechz_detach_lshoulder_armor, !true, !true );
clientfield::register( "actor", "mechz_headlamp_off", 5000, 2, "int", &MechzClientUtils::mechz_headlamp_off, !true, !true );
clientfield::register( "actor", "mechz_face", 1, 3, "int", &MechzClientUtils::mechzFaceCallback, !true, !true );
ai::add_archetype_spawn_function( "mechz", &MechzClientUtils::mechzSpawn );
level._mechz_face = [];
level._mechz_face[ 1 ] = "ai_face_zombie_generic_attack_1";
level._mechz_face[ 2 ] = "ai_face_zombie_generic_death_1";
level._mechz_face[ 3 ] = "ai_face_zombie_generic_idle_1";
level._mechz_face[ 4 ] = "ai_face_zombie_generic_pain_1";
}
function autoexec precache()
{
level._effect[ "fx_mech_wpn_flamethrower" ] = "dlc1/castle/fx_mech_wpn_flamethrower";
level._effect[ "fx_mech_dmg_armor_face" ] = "dlc1/castle/fx_mech_dmg_armor_face";
level._effect[ "fx_mech_dmg_armor" ] = "dlc1/castle/fx_mech_dmg_armor";
level._effect[ "fx_mech_dmg_armor" ] = "dlc1/castle/fx_mech_dmg_armor";
level._effect[ "fx_wpn_115_muz" ] = "dlc1/castle/fx_wpn_115_muz";
level._effect[ "fx_mech_dmg_armor" ] = "dlc1/castle/fx_mech_dmg_armor";
level._effect[ "fx_mech_dmg_armor" ] = "dlc1/castle/fx_mech_dmg_armor";
level._effect[ "fx_mech_dmg_armor" ] = "dlc1/castle/fx_mech_dmg_armor";
level._effect[ "fx_mech_dmg_armor" ] = "dlc1/castle/fx_mech_dmg_armor";
level._effect[ "fx_mech_head_light" ] = "dlc1/castle/fx_mech_head_light";
level._effect[ "fx_mech_dmg_sparks" ] = "dlc1/castle/fx_mech_dmg_sparks";
level._effect[ "fx_mech_dmg_knee_sparks" ] = "dlc1/castle/fx_mech_dmg_knee_sparks";
level._effect[ "fx_mech_dmg_sparks" ] = "dlc1/castle/fx_mech_dmg_sparks";
level._effect[ "fx_mech_foot_step" ] = "dlc1/castle/fx_mech_foot_step";
level._effect[ "fx_mech_light_dmg" ] = "dlc1/castle/fx_mech_light_dmg";
level._effect[ "fx_mech_foot_step_steam" ] = "dlc1/castle/fx_mech_foot_step_steam";
level._effect[ "fx_mech_dmg_body_light" ] = "dlc1/castle/fx_mech_dmg_body_light";
}
#namespace MechzClientUtils;
function private mechzSpawn( localClientNum )
{
level._footstepCBFuncs[ self.archetype ] = &mechzProcessFootstep;
// setting sound context with wait to ensure the entity is fully spawned
level thread mechzSndContext( self );
self.headlight_fx = PlayFXOnTag( localClientNum, level._effect[ "fx_mech_head_light" ], self, "tag_headlamp_FX" );
self.headlamp_on = true;
}
function mechzSndContext ( mechz )
{
wait 1;
if ( IsDefined( mechz ) )
{
mechz setsoundentcontext("movement", "normal");
}
}
function mechzProcessFootstep( localClientNum, pos, surface, notetrack, bone )
{
e_player = GetLocalPlayer( localClientNum );
n_dist = DistanceSquared( pos, e_player.origin );
n_mechz_dist = ( 1000 * 1000 );
if(n_mechz_dist>0)
n_scale = ( n_mechz_dist - n_dist ) / n_mechz_dist;
else
return;
if( n_scale > 1 || n_scale < 0 ) return;
if( n_scale <= 0.01 ) return;
earthquake_scale = n_scale * 0.1;
if( earthquake_scale > 0.01)
{
e_player Earthquake( earthquake_scale, 0.1, pos, n_dist );
}
if( n_scale <= 1 && n_scale > 0.8 )
{
e_player PlayRumbleOnEntity( localClientNum, "shotgun_fire" );
}
else if( n_scale <= 0.8 && n_scale > 0.4 )
{
e_player PlayRumbleOnEntity( localClientNum, "damage_heavy" );
}
else
{
e_player PlayRumbleOnEntity( localClientNum, "reload_small" );
}
fx = PlayFXOnTag( localClientNum, level._effect[ "fx_mech_foot_step" ], self, bone );
if( bone == "j_ball_le" )
{
steam_bone = "tag_foot_steam_le";
}
else
{
steam_bone = "tag_foot_steam_ri";
}
steam_fx = PlayFXOnTag( localClientNum, level._effect[ "fx_mech_foot_step_steam" ], self, steam_bone );
}
function private mechzFlamethrowerCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
switch ( newValue )
{
case 1:
self.fire_beam_id = BeamLaunch( localclientnum, self, "tag_flamethrower_fx", undefined, "none", "flamethrower_beam_3p_zm_mechz" );
self playsound (0 , "wpn_flame_thrower_start_mechz");
self.sndLoopID = self PlayLoopSound ("wpn_flame_thrower_loop_mechz");
break;
case 0:
self notify( "stopFlamethrower" );
if ( IsDefined( self.fire_beam_id ) )
{
BeamKill( localclientnum, self.fire_beam_id );
self playsound (0 , "wpn_flame_thrower_stop_mechz");
self stoploopsound ( self.sndLoopID );
}
break;
}
}
function mechz_detach_faceplate( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
pos = self gettagorigin( "j_faceplate" );
ang = self gettagangles( "j_faceplate" );
velocity = self GetVelocity();
dynent = CreateDynEntAndLaunch( localClientNum, "c_zom_mech_faceplate", pos, ang, self.origin, velocity );
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_armor_face" ], self, "j_faceplate" );
self setsoundentcontext("movement", "loud");
self playsound (0, "zmb_ai_mechz_faceplate");
}
function mechz_detach_powercap( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
pos = self gettagorigin( "tag_powersupply" );
ang = self gettagangles( "tag_powersupply" );
velocity = self GetVelocity();
dynent = CreateDynEntAndLaunch( localClientNum, "c_zom_mech_powersupply_cap", pos, ang, self.origin, velocity );
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_armor" ], self, "tag_powersupply" );
self playsound (0, "zmb_ai_mechz_destruction");
self.mechz_powercore_fx = playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_body_light" ], self, "tag_powersupply" );
}
function mechz_detach_claw( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if( IsDefined( level.mechz_detach_claw_override ) )
{
self [[level.mechz_detach_claw_override]]( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump );
return;
}
pos = self gettagorigin( "tag_gun_spin" );
ang = self gettagangles( "tag_gun_spin" );
velocity = self GetVelocity();
dynent = CreateDynEntAndLaunch( localClientNum, "c_zom_mech_gun_barrel", pos, ang, self.origin, velocity );
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_armor" ], self, "tag_gun_spin" );
self playsound (0, "zmb_ai_mechz_destruction");
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_sparks" ], self, "tag_gun_spin" );
}
function mechz_115_gun_muzzle_flash( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
playFXonTag( localClientNum, level._effect[ "fx_wpn_115_muz" ], self, "tag_gun_barrel2" );
}
function mechz_detach_rknee_armor( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
pos = self gettagorigin( "j_knee_attach_ri" );
ang = self gettagangles( "j_knee_attach_ri" );
velocity = self GetVelocity();
dynent = CreateDynEntAndLaunch( localClientNum, "c_zom_mech_armor_knee_right", pos, ang, pos, velocity );
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_armor" ], self, "j_knee_attach_ri" );
self playsound (0, "zmb_ai_mechz_destruction");
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_knee_sparks" ], self, "j_knee_attach_ri" );
}
function mechz_detach_lknee_armor( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
pos = self gettagorigin( "j_knee_attach_le" );
ang = self gettagangles( "j_knee_attach_le" );
velocity = self GetVelocity();
dynent = CreateDynEntAndLaunch( localClientNum, "c_zom_mech_armor_knee_left", pos, ang, pos, velocity );
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_armor" ], self, "j_knee_attach_le" );
self playsound (0, "zmb_ai_mechz_destruction");
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_knee_sparks" ], self, "j_knee_attach_le" );
}
function mechz_detach_rshoulder_armor( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
pos = self gettagorigin( "j_shoulderarmor_ri" );
ang = self gettagangles( "j_shoulderarmor_ri" );
velocity = self GetVelocity();
dynent = CreateDynEntAndLaunch( localClientNum, "c_zom_mech_armor_shoulder_right", pos, ang, pos, velocity );
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_armor" ], self, "j_shoulderarmor_ri" );
self playsound (0, "zmb_ai_mechz_destruction");
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_sparks" ], self, "j_shoulderarmor_ri" );
}
function mechz_detach_lshoulder_armor( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
pos = self gettagorigin( "j_shoulderarmor_le" );
ang = self gettagangles( "j_shoulderarmor_le" );
velocity = self GetVelocity();
dynent = CreateDynEntAndLaunch( localClientNum, "c_zom_mech_armor_shoulder_left", pos, ang, pos, velocity );
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_armor" ], self, "j_shoulderarmor_le" );
self playsound (0, "zmb_ai_mechz_destruction");
playFXonTag( localClientNum, level._effect[ "fx_mech_dmg_sparks" ], self, "j_shoulderarmor_le" );
}
function mechz_headlamp_off( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if( self.headlamp_on === true && newValue != 0 && isDefined( self.headlight_fx ))
{
StopFX( localClientNum, self.headlight_fx );
self.headlamp_on = false;
if( newValue == 2 )
{
playFXonTag( localClientNum, level._effect[ "fx_mech_foot_step" ], self, "tag_headlamp_fx" );
//play break fx and sound
}
}
}
function private mechzFaceCallback( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
if ( newValue )
{
if ( IsDefined( self.prevFaceAnim ) )
{
self ClearAnim( self.prevFaceAnim, 0.2 );
}
faceAnim = level._mechz_face[ newValue ];
self SetAnim( faceAnim, 1.0, 0.2, 1.0 );
self.prevFaceAnim = faceAnim;
}
}