1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\exploder_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\laststand_shared;
8 #using scripts\shared\system_shared;
9 #using scripts\shared\trigger_shared;
10 #using scripts\shared\util_shared;
11 #using scripts\shared\visionset_mgr_shared;
13 #insert scripts\shared\shared.gsh;
14 #insert scripts\shared\version.gsh;
16 #using scripts\shared\ai\zombie_death;
18 #using scripts\zm\_util;
19 #using scripts\zm\_zm_laststand;
20 #using scripts\zm\_zm_net;
21 #using scripts\zm\_zm_score;
22 #using scripts\zm\_zm_stats;
23 #using scripts\zm\_zm_utility;
24 #using scripts\zm\_zm_audio;
26 #insert scripts\zm\_zm_perks.gsh;
27 #insert scripts\zm\_zm_traps.gsh;
28 #insert scripts\zm\_zm_utility.gsh;
32 #precache( "model", "zombie_zapper_cagelight_red");
33 #precache( "model", "zombie_zapper_cagelight_green");
34 #precache( "model", "zombie_zapper_cagelight" );
35 #precache( "model", "zombie_zapper_handle" );
37 #precache( "triggerstring", "ZOMBIE_TRAP_ACTIVE" );
38 #precache( "triggerstring", "ZOMBIE_TRAP_COOLDOWN" );
58 level.burning_zombies = [];
65 traps = GetEntArray(
"zombie_trap",
"targetname" );
73 traps = GetEntArray(
"zombie_trap",
"targetname" );
101 self._trap_type =
"";
103 if ( isdefined(
self.script_noteworthy) )
105 self._trap_type =
self.script_noteworthy;
108 if( isdefined( level._custom_traps ) && isdefined( level._custom_traps[
self.script_noteworthy ] ) && isdefined( level._custom_traps[
self.script_noteworthy ].activate ) )
110 self._trap_activate_func = level._custom_traps[
self.script_noteworthy ].activate;
114 switch(
self.script_noteworthy )
128 if ( isdefined( level._zombiemode_trap_use_funcs ) &&
129 isdefined( level._zombiemode_trap_use_funcs[
self._trap_type ] ) )
131 self._trap_use_func = level._zombiemode_trap_use_funcs[
self._trap_type ];
143 self._trap_use_trigs = [];
144 self._trap_lights = [];
145 self._trap_movers = [];
146 self._trap_switches = [];
148 components = GetEntArray(
self.target,
"targetname" );
149 for ( i=0; i<components.size; i++ )
151 if ( isdefined( components[i].script_noteworthy ) )
153 switch ( components[i].script_noteworthy )
156 self.counter_1s = components[i];
160 self.counter_10s = components[i];
164 self.counter_100s = components[i];
168 self._trap_movers[
self._trap_movers.size ] = components[i];
171 self._trap_switches[
self._trap_switches.size ] = components[i];
174 self._trap_lights[
self._trap_lights.size ] = components[i];
178 if( isdefined( components[i].script_string ) )
180 switch ( components[i].script_string )
183 self.flipper1 = components[i];
186 self.flipper2 = components[i];
188 case "flipper1_radius_check":
189 self.flipper1_radius_check = components[i];
191 case "flipper2_radius_check":
192 self.flipper2_radius_check = components[i];
195 self.target1 = components[i];
198 self.target2 = components[i];
201 self.target3 = components[i];
206 switch ( components[i].classname )
209 self._trap_use_trigs[
self._trap_use_trigs.size ] = components[i];
212 if ( components[i].model ==
self._trap_light_model_off )
214 self._trap_lights[
self._trap_lights.size ] = components[i];
216 else if ( components[i].model ==
self._trap_switch_model )
218 self._trap_switches[
self._trap_switches.size ] = components[i];
225 self._trap_fx_structs = [];
228 for ( i=0; i<components.size; i++ )
230 if ( isdefined( components[i].script_string ) && components[i].script_string ==
"use_this_angle" )
232 self.use_this_angle = components[i];
236 self._trap_fx_structs[
self._trap_fx_structs.size ] = components[i];
240 assert(
self._trap_use_trigs.size > 0,
"zm_traps::init no use triggers found for "+
self.target );
242 if ( !isdefined(
self.zombie_cost ) )
244 self.zombie_cost = 1000;
246 self._trap_in_use = 0;
247 self._trap_cooling_down = 0;
257 for ( i=0; i<
self._trap_use_trigs.size; i++ )
259 self._trap_use_trigs[i] SetCursorHint(
"HINT_NOICON" );
263 if ( !isdefined(
self.script_string ) ||
"disable_wait_for_power" !=
self.script_string )
267 if ( IsDefined(
self.script_int ) )
280 self TriggerEnable(
false );
283 if ( !isdefined( level.flag[
self.script_flag_wait ] ) )
289 self TriggerEnable(
true );
298 for ( i=0; i<
self._trap_use_trigs.size; i++ )
300 self._trap_use_trigs[i] thread [[
self._trap_use_func ]]( self );
316 self waittill(
"trigger",who);
331 players = GetPlayers();
354 self playsound(
"zmb_trap_deny");
359 trap.activated_by_player = who;
360 trap._trap_in_use = 1;
365 if( !
IS_TRUE( level.b_trap_start_custom_vo ))
370 if ( trap._trap_switches.size )
374 trap waittill(
"switch_activated");
378 trap TriggerEnable(
true );
381 trap thread [[ trap._trap_activate_func ]]();
383 trap waittill(
"trap_done");
386 trap TriggerEnable(
false );
388 trap._trap_cooling_down = 1;
390 wait( trap._trap_cooldown_time );
391 trap._trap_cooling_down = 0;
395 playsoundatposition(
"zmb_trap_ready", trap.origin);
397 if ( isdefined( level.sndTrapFunc ) )
399 level thread [[ level.sndTrapFunc ]]( trap, 0 );
402 trap notify(
"available");
404 trap._trap_in_use = 0;
416 self endon(
"death" );
419 const N_DIST_SQ = 16384;
423 for( i = 0; i < level.players.size; i++ )
425 if( DistanceSquared( level.players[i].origin,
self.origin ) < N_DIST_SQ )
429 self SetInvisibleToPlayer( level.players[i],
true );
433 self SetInvisibleToPlayer( level.players[i],
false );
447 for(i=0;i<
self._trap_lights.size;i++)
449 light =
self._trap_lights[i];
451 str_light_red = light.targetname +
"_red";
452 str_light_green = light.targetname +
"_green";
465 for(i=0;i<
self._trap_lights.size;i++)
467 light =
self._trap_lights[i];
468 if(isdefined(light._switch_disabled))
473 str_light_red = light.targetname +
"_red";
474 str_light_green = light.targetname +
"_green";
488 for ( i=0; i<
self._trap_use_trigs.size; i++ )
490 if ( !isdefined(param1) )
492 self._trap_use_trigs[i] SetHintString(
string );
494 else if ( !isdefined(param2) )
496 self._trap_use_trigs[i] SetHintString(
string, param1 );
500 self._trap_use_trigs[i] SetHintString(
string, param1, param2 );
513 for ( i=0; i<
self._trap_switches.size; i++ )
516 self._trap_switches[i] rotatepitch( 180, .5 );
517 if(IsDefined (
self._trap_type) && (
self._trap_type ==
"fire"))
519 self._trap_switches[i] playsound(
"evt_switch_flip_trap_fire" );
523 self._trap_switches[i] playsound(
"evt_switch_flip_trap" );
526 self._trap_switches[0] waittill(
"rotatedone" );
529 self notify(
"switch_activated" );
531 self waittill(
"available" );
532 for ( i=0; i<
self._trap_switches.size; i++ )
535 self._trap_switches[i] rotatepitch( -180, .5 );
537 self._trap_switches[0] waittill(
"rotatedone" );
547 self._trap_duration = 40;
548 self._trap_cooldown_time = 60;
556 for( i=0; i<fx_points.size; i++ )
564 wait(
self._trap_duration );
567 self notify (
"trap_done");
579 self endon(
"trap_done" );
581 self._trap_duration = 30;
582 self._trap_cooldown_time = 60;
595 old_angles =
self._trap_movers[0].angles;
600 for ( i=0; i<
self._trap_movers.size; i++ )
602 self._trap_movers[i] RotateYaw( 360, 5.0, 4.5 );
610 for (t=0; t<
self._trap_duration; t=t+step )
612 for ( i=0; i<
self._trap_movers.size; i++ )
614 self._trap_movers[i] RotateYaw( 360, step );
623 for ( i=0; i<
self._trap_movers.size; i++ )
625 self._trap_movers[i] RotateYaw( 360, 5.0, 0.0, 4.5 );
628 for ( i=0; i<
self._trap_movers.size; i++ )
630 self._trap_movers[i].angles = old_angles;
634 self notify (
"trap_done");
670 if( isdefined( level._custom_traps ) && isdefined( level._custom_traps[ trap.script_noteworthy ] ) && isdefined( level._custom_traps[ trap.script_noteworthy ].audio ) )
672 self [[ level._custom_traps[ trap.script_noteworthy ].audio ]]( trap );
676 sound_origin = undefined;
680 if(isdefined(sound_origin))
682 playsoundatposition(
"wpn_zmb_electrap_stop", sound_origin.origin );
684 sound_origin stoploopsound();
686 sound_origin
delete();
697 self endon(
"trap_done" );
701 self waittill(
"trigger", ent );
706 if( isdefined( level._custom_traps ) && isdefined( level._custom_traps[
self._trap_type ] ) && isdefined( level._custom_traps[
self._trap_type ].player_damage ) )
708 ent thread [[ level._custom_traps[
self._trap_type ].player_damage ]]();
713 switch (
self._trap_type )
719 if ( ent GetStance() ==
"stand" )
721 ent dodamage( 50, ent.origin+(0,0,20) );
722 ent SetStance(
"crouch" );
730 if(!isdefined(ent.marked_for_death))
732 if( isdefined( level._custom_traps ) && isdefined( level._custom_traps[
self._trap_type ] ) && isdefined( level._custom_traps[
self._trap_type ].damage ) )
734 ent thread [[ level._custom_traps[
self._trap_type ].damage ]]( self );
739 switch (
self._trap_type )
765 self endon(
"trap_done" );
767 start_angles =
self.angles;
771 self.angles = parent.angles;
787 self endon(
"disconnect");
789 if( !isdefined(level.elec_loop) )
798 if (
IS_TRUE(level.trap_electric_visionset_registered))
804 self setelectrified(1.25);
807 if ( isdefined( level.str_elec_damage_shellshock_override ) )
809 str_elec_shellshock = level.str_elec_damage_shellshock_override;
813 str_elec_shellshock =
"electrocution";
817 self shellshock(str_elec_shellshock, shocktime);
819 self PlayRumbleOnEntity(
"damage_heavy" );
821 if(level.elec_loop == 0)
825 self playsound(
"wpn_zmb_electrap_zap");
829 self DoDamage(
self.health + 100,
self.origin );
830 self.is_burning = undefined;
835 self DoDamage( 50,
self.origin );
838 self.is_burning = undefined;
846 self endon(
"disconnect");
851 if (
IS_TRUE(level.trap_fire_visionset_registered))
856 self notify(
"burned");
860 radiusdamage(
self.origin,10,
self.health + 100,
self.health + 100);
861 self.is_burning = undefined;
865 self dodamage(50,
self.origin);
868 self.is_burning = undefined;
882 self.marked_for_death =
true;
884 switch (trap._trap_type)
889 if ( isdefined(
self.animname ) &&
self.animname !=
"zombie_dog" )
893 if( (param > 90) && (level.burning_zombies.size < 6) )
895 level.burning_zombies[level.burning_zombies.size] =
self;
897 self playsound(
"zmb_ignite");
900 PlayFxOnTag( level._effect[
"character_fire_death_torso"],
self,
"J_SpineLower" );
902 wait( randomfloat(1.25) );
907 refs[1] =
"right_arm";
908 refs[2] =
"left_arm";
909 refs[3] =
"right_leg";
910 refs[4] =
"left_leg";
913 self.a.gib_ref = refs[randomint(refs.size)];
915 playsoundatposition(
"wpn_zmb_electrap_zap",
self.origin);
917 wait(randomfloat(1.25));
918 self playsound(
"wpn_zmb_electrap_zap");
923 if ( isdefined(
self.fire_damage_func ) )
925 self [[
self.fire_damage_func ]]( trap );
929 level notify(
"trap_kill",
self, trap );
930 self dodamage(
self.health + 666,
self.origin, trap);
942 ang = VectorToAngles( trap.origin -
self.origin );
945 direction_vec = VectorScale( AnglesToRight( ang ), param);
948 if ( isdefined(
self.trap_reaction_func ) )
950 self [[
self.trap_reaction_func ]]( trap );
953 level notify(
"trap_kill",
self, trap );
955 self launchragdoll(direction_vec);
959 self.a.gib_ref =
"head";
960 self dodamage(
self.health,
self.origin, trap);
965 if ( IsDefined( trap.activated_by_player ) && IsPlayer( trap.activated_by_player ) )
978 self waittill(
"death");
979 self stoploopsound();
980 ArrayRemoveValue(level.burning_zombies,
self);
990 if( isdefined (
self) )
994 playsoundatposition(
"zmb_elec_vocals", org);
995 playsoundatposition(
"wpn_zmb_electrap_zap", org);
996 playsoundatposition(
"zmb_exp_jib_zombie", org);
1007 self endon(
"death" );
1009 if (isdefined(
self.is_electrocuted) &&
self.is_electrocuted )
1014 self.is_electrocuted =
true;
1020 level.bcOnFireTime = gettime();
1021 level.bcOnFireOrg =
self.origin;
1024 if (isdefined(level._effect[
"elec_torso"]))
1025 PlayFxOnTag( level._effect[
"elec_torso"],
self,
"J_SpineLower" );
1026 self playsound (
"zmb_elec_jib_zombie");
1030 tagArray[0] =
"J_Elbow_LE";
1031 tagArray[1] =
"J_Elbow_RI";
1032 tagArray[2] =
"J_Knee_RI";
1033 tagArray[3] =
"J_Knee_LE";
1034 tagArray = array::randomize( tagArray );
1036 if (isdefined(level._effect[
"elec_md"]))
1037 PlayFxOnTag( level._effect[
"elec_md"],
self, tagArray[0] );
1038 self playsound (
"zmb_elec_jib_zombie");
1041 self playsound (
"zmb_elec_jib_zombie");
1043 tagArray[0] =
"J_Wrist_RI";
1044 tagArray[1] =
"J_Wrist_LE";
1045 if( !isdefined(
self.
a.gib_ref ) ||
self.a.gib_ref !=
"no_legs" )
1047 tagArray[2] =
"J_Ankle_RI";
1048 tagArray[3] =
"J_Ankle_LE";
1050 tagArray = array::randomize( tagArray );
1052 if (isdefined(level._effect[
"elec_sm"]))
1054 PlayFxOnTag( level._effect[
"elec_sm"],
self, tagArray[0] );
1055 PlayFxOnTag( level._effect[
"elec_sm"],
self, tagArray[1] );
1066 self endon (
"death");
1067 self playloopsound(
"amb_fire_manager_0");
1070 self stoploopsound();
1071 if (isdefined(
self) && isalive(
self))
1073 self.is_electrocuted =
false;
1074 self notify (
"stop_flame_damage");
1087 self endon (
"warning_dialog");
1088 level endon(
"switch_flipped");
1093 players = GetPlayers();
1094 for(i = 0; i < players.size; i++)
1096 if (!IsDefined(players[i]))
1098 dist = distancesquared(players[i].origin,
self.origin );
1104 if(dist < 70*70 &&
timer < 3)
1109 if(dist < 70*70 &&
timer == 3)
1113 plr =
"plr_" + index +
"_";
1116 self notify (
"warning_dialog");
1129 ents = GetEntArray(
"zombie_trap",
"targetname" );
1131 for ( i=0; i<ents.size; i++ )
1133 if ( ents[i].script_noteworthy == trap_type )
1135 traps[ traps.size ] = ents[i];
1147 cooldown =
self._trap_cooldown_time;
1149 if (
self._trap_in_use )
1151 self notify(
"trap_done" );
1152 self._trap_cooldown_time = 0.05;
1153 self waittill(
"available" );
1156 array::thread_all(
self._trap_use_trigs,&TriggerEnable,
false );
1158 self._trap_cooldown_time = cooldown;
1166 array::thread_all(
self._trap_use_trigs,&TriggerEnable,
true );
1178 if( !isdefined(
self.script_parameters ) )
1180 self.script_parameters =
"default";
1184 switch(
self.script_parameters )
1186 case "pentagon_electric":
1187 self._trap_light_model_off =
"zombie_trap_switch_light";
1188 self._trap_light_model_green =
"zombie_trap_switch_light_on_green";
1189 self._trap_light_model_red =
"zombie_trap_switch_light_on_red";
1190 self._trap_switch_model =
"zombie_trap_switch_handle";
1195 self._trap_light_model_off =
"zombie_zapper_cagelight";
1196 self._trap_light_model_green =
"zombie_zapper_cagelight";
1197 self._trap_light_model_red =
"zombie_zapper_cagelight";
1198 self._trap_switch_model =
"zombie_zapper_handle";
1206 return isdefined( a_registered_traps[
self.script_noteworthy ] );
1222 Assert( IsDefined( str_trap ),
"str_trap is a required argument for register_trap_basic_info!" );
1223 Assert( IsDefined( func_activate ),
"str_alias is a required argument for register_trap_basic_info!" );
1224 Assert( IsDefined( func_audio ),
"n_perk_cost is a required argument for register_trap_basic_info!" );
1228 level._custom_traps[ str_trap ].activate = func_activate;
1229 level._custom_traps[ str_trap ].audio = func_audio;
1235 if ( !IsDefined( level._custom_traps ) )
1237 level._custom_traps = [];
1240 if ( !IsDefined( level._custom_traps[ str_trap ] ) )
1242 level._custom_traps[ str_trap ] = SpawnStruct();
1259 Assert( IsDefined( str_trap ),
"str_trap is a required argument for register_trap_basic_info!" );
1263 level._custom_traps[ str_trap ].player_damage = func_player_damage;
1264 level._custom_traps[ str_trap ].damage = func_damage;