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

129 lines
7.4 KiB
Plaintext

#using scripts\shared\clientfield_shared;
#using scripts\shared\ai\systems\gib;
#using scripts\shared\ai_shared;
#precache( "client_fx", "zombie/fx_val_chest_burst");
#precache( "client_fx", "fire/fx_fire_ai_human_arm_left_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_arm_right_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_arm_left_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_arm_right_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_torso_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_hip_left_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_hip_right_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_leg_left_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_leg_right_loop_optim");
#precache( "client_fx", "fire/fx_fire_ai_human_head_loop_optim");
function autoexec precache()
{
}
function autoexec main()
{
level._effect["zombie_special_day_effect"] = "zombie/fx_val_chest_burst";
ai::add_archetype_spawn_function( "zombie", &ZombieClientUtils::zombie_override_burn_fx );
clientfield::register(
"actor",
"zombie",
1,
1,
"int",
&ZombieClientUtils::zombieHandler,
!true,
!true);
clientfield::register(
"actor",
"zombie_special_day",
6001,
1,
"counter",
&ZombieClientUtils::zombieSpecialDayEffectsHandler,
!true,
!true);
}
#namespace ZombieClientUtils;
function zombieHandler( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
entity = self;
if ( IsDefined( entity.archetype ) && entity.archetype != "zombie" )
{
return;
}
if ( !IsDefined( entity.initializedGibCallbacks ) || !entity.initializedGibCallbacks )
{
entity.initializedGibCallbacks = true;
GibClientUtils::AddGibCallback( localClientNum, entity, 8, &_gibCallback );
GibClientUtils::AddGibCallback( localClientNum, entity, 16, &_gibCallback );
GibClientUtils::AddGibCallback( localClientNum, entity, 32, &_gibCallback );
GibClientUtils::AddGibCallback( localClientNum, entity, 128, &_gibCallback );
GibClientUtils::AddGibCallback( localClientNum, entity, 256, &_gibCallback );
}
}
function private _gibCallback( localClientNum, entity, gibFlag )
{
switch (gibFlag)
{
case 8:
playsound(0, "zmb_zombie_head_gib", self.origin + (0,0,60));
break;
case 16:
case 32:
case 128:
case 256:
playsound(0, "zmb_death_gibs", self.origin + (0,0,30));
break;
}
}
function zombieSpecialDayEffectsHandler( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
{
entity = self;
if ( IsDefined( entity.archetype ) && entity.archetype != "zombie" )
{
return;
}
origin = entity GetTagOrigin( "j_spine4" );
fx = PlayFX( localClientNum, level._effect["zombie_special_day_effect"], origin );
SetFXIgnorePause( localClientNum, fx, true );
}
function zombie_override_burn_fx( localClientNum )
{
if( SessionModeIsZombiesGame() )
{
if( !isdefined( self._effect ))
{
self._effect = [];
}
level._effect["fire_zombie_j_elbow_le_loop"] = "fire/fx_fire_ai_human_arm_left_loop_optim"; // hand and forearm fires
level._effect["fire_zombie_j_elbow_ri_loop"] = "fire/fx_fire_ai_human_arm_right_loop_optim";
level._effect["fire_zombie_j_shoulder_le_loop"] = "fire/fx_fire_ai_human_arm_left_loop_optim"; // upper arm fires
level._effect["fire_zombie_j_shoulder_ri_loop"] = "fire/fx_fire_ai_human_arm_right_loop_optim";
level._effect["fire_zombie_j_spine4_loop"] = "fire/fx_fire_ai_human_torso_loop_optim"; // upper torso fires
level._effect["fire_zombie_j_hip_le_loop"] = "fire/fx_fire_ai_human_hip_left_loop_optim"; // thigh fires
level._effect["fire_zombie_j_hip_ri_loop"] = "fire/fx_fire_ai_human_hip_right_loop_optim";
level._effect["fire_zombie_j_knee_le_loop"] = "fire/fx_fire_ai_human_leg_left_loop_optim"; // shin fires
level._effect["fire_zombie_j_knee_ri_loop"] = "fire/fx_fire_ai_human_leg_right_loop_optim";
level._effect["fire_zombie_j_head_loop"] = "fire/fx_fire_ai_human_head_loop_optim"; // head fire
}
}