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