1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\demo_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
10 #insert scripts\shared\shared.gsh;
12 #using scripts\shared\ai\zombie_utility;
14 #using scripts\zm\_util;
15 #using scripts\zm\_zm_blockers;
16 #using scripts\zm\_zm_perks;
17 #using scripts\zm\_zm_utility;
19 #insert scripts\zm\_zm_perks.gsh;
20 #insert scripts\zm\_zm_utility.gsh;
28 level.powered_items = [];
29 level.local_power = [];
41 trigs = GetEntArray(
"use_elec_switch",
"targetname" );
43 if( isdefined( level.temporary_power_switch_logic ) )
45 array::thread_all( trigs, level.temporary_power_switch_logic, trigs );
57 if( !isdefined(
self ) )
62 if( isdefined(
self.target ) )
64 ent_parts = GetEntArray(
self.target,
"targetname");
67 foreach(ent
in ent_parts)
69 if(IsDefined(ent.script_noteworthy) && ent.script_noteworthy ==
"elec_switch")
72 master_switch NotSolid();
76 foreach(
struct in struct_parts)
78 if(IsDefined(
struct.script_noteworthy) &&
struct.script_noteworthy ==
"elec_switch_fx")
85 while ( IsDefined(
self) )
89 self SetHintString( &
"ZOMBIE_ELECTRIC_SWITCH" );
91 self SetVisibleToAll();
92 self waittill(
"trigger", user );
93 self SetInvisibleToAll();
95 if( isdefined( master_switch ) )
97 master_switch rotateroll( -90, .3 );
98 master_switch playsound(
"zmb_switch_flip" );
101 power_zone = undefined;
102 if(isDefined(
self.script_int))
104 power_zone =
self.script_int;
108 if( isdefined( master_switch ) )
110 master_switch waittill(
"rotatedone" );
111 PlayFX( level._effect[
"switch_sparks" ] ,fx_pos.origin );
112 master_switch playsound(
"zmb_turn_on");
116 switchEntNum =
self GetEntityNumber();
117 if ( isDefined(switchEntNum) && isDefined(user) )
123 if( !isdefined(
self.script_noteworthy ) ||
self.script_noteworthy !=
"allow_power_off" )
131 self SetHintString( &
"ZOMBIE_ELECTRIC_SWITCH_OFF" );
132 self SetVisibleToAll();
134 self waittill(
"trigger", user );
135 self SetInvisibleToAll();
137 if( isdefined( master_switch ) )
139 master_switch rotateroll( 90,.3 );
140 master_switch playsound(
"zmb_switch_flip" );
145 if( isdefined( master_switch ) )
147 master_switch waittill(
"rotatedone" );
149 if (isDefined(switchEntNum) && isDefined(user))
180 vending_triggers = GetEntArray(
"zombie_vending",
"targetname" );
181 foreach ( trigger
in vending_triggers )
185 if(IsDefined(trigger.script_int))
193 zombie_doors = GetEntArray(
"zombie_door",
"targetname" );
194 foreach ( door
in zombie_doors )
196 if ( IsDefined( door.script_noteworthy ) && (door.script_noteworthy ==
"electric_door" || door.script_noteworthy ==
"electric_buyable_door"))
200 else if ( IsDefined( door.script_noteworthy ) && door.script_noteworthy ==
"local_electric_door" )
203 if (!
IS_TRUE(level.power_local_doors_globally))
216 power_flag = (
"power_on" + zone);
231 powered = spawnstruct();
232 powered.power_on_func = power_on_func;
233 powered.power_off_func = power_off_func;
234 powered.range_func = range_func;
235 powered.power_sources = power_sources;
236 powered.self_powered = self_powered;
237 powered.target = target;
240 powered.power = self_powered;
242 powered.powered_count = self_powered;
243 powered.depowered_count = 0;
245 level.powered_items[level.powered_items.size]=powered;
251 ArrayRemoveValue( level.powered_items, powered,
false );
260 if (isdefined(level.local_power))
262 foreach (localpower
in level.local_power)
264 if ( powered [[powered.range_func]]( 1, localpower.origin, localpower.radius ) )
266 powered
change_power(1, localpower.origin, localpower.radius);
267 if (!isdefined(localpower.added_list))
268 localpower.added_list = [];
269 localpower.added_list[localpower.added_list.size]=powered;
279 powered.target waittill(
"death");
281 if (isdefined(level.local_power))
283 foreach (localpower
in level.local_power)
285 if (isdefined(localpower.added_list))
286 ArrayRemoveValue( localpower.added_list, powered,
false );
287 if (isdefined(localpower.enabled_list))
288 ArrayRemoveValue( localpower.enabled_list, powered,
false );
302 for( i=0; i<level.powered_items.size; i++ )
304 powered = level.powered_items[i];
307 if ( powered [[powered.range_func]]( delta, origin, radius ) )
310 changed_list[changed_list.size]=powered;
323 self [[
self.power_on_func]](origin, radius);
325 self.powered_count++;
332 self [[
self.power_off_func]](origin, radius);
334 self.depowered_count++;
340 for( i=0; i<powered_list.size; i++ )
342 powered = powered_list[i];
351 self.depowered_count--;
352 assert(
self.depowered_count >= 0,
"Depower underflow in power system");
353 if (
self.depowered_count == 0 &&
self.powered_count > 0 && !
self.power )
356 self [[
self.power_on_func]](origin, radius);
361 self.powered_count--;
362 assert(
self.powered_count >= 0,
"Repower underflow in power system");
363 if (
self.powered_count == 0 &&
self.power )
366 self [[
self.power_off_func]](origin, radius);
376 localpower = spawnstruct();
379 localpower.origin = origin;
380 localpower.radius = radius;
383 level.local_power[level.local_power.size]=localpower;
391 for( i=0; i<level.powered_items.size; i++ )
393 powered = level.powered_items[i];
396 waspowered = ( IsInArray( localpower.enabled_list, powered) );
397 ispowered = powered [[powered.range_func]]( 1, origin, localpower.radius );
398 if ( ispowered && !waspowered )
401 localpower.enabled_list[localpower.enabled_list.size] = powered;
403 else if ( !ispowered && waspowered )
405 powered
revert_power( -1, localpower.origin, localpower.radius, localpower.enabled_list );
406 ArrayRemoveValue( localpower.enabled_list, powered,
false );
409 localpower.origin = origin;
416 if (isdefined(localpower.enabled_list))
418 localpower.enabled_list=undefined;
419 if (isdefined(localpower.added_list))
421 localpower.added_list=undefined;
422 ArrayRemoveValue( level.local_power, localpower,
false );
427 if (isdefined(level.local_power))
429 foreach (localpower
in level.local_power)
431 if ( DistanceSquared( localpower.origin, origin ) < localpower.radius * localpower.radius )
446 cost = [[
self.cost_func]]();
448 power_sources =
self.powered_count;
452 return cost/power_sources;
458 if ( isdefined(localpower) && isdefined(localpower.enabled_list))
460 foreach(powered
in localpower.enabled_list)
463 if ( isdefined(localpower) && isdefined(localpower.added_list))
465 foreach(powered
in localpower.added_list)
478 level._power_global = on_off;
479 for( i=0; i<level.powered_items.size; i++ )
481 powered = level.powered_items[i];
498 self [[
self.power_on_func]]();
500 self.powered_count++;
505 self.powered_count--;
506 assert(
self.powered_count >= 0,
"Repower underflow in power system");
507 if (
self.powered_count == 0 &&
self.power )
510 self [[
self.power_off_func]]();
528 if (isdefined(
self.one_time_cost))
530 cost =
self.one_time_cost;
531 self.one_time_cost=undefined;
539 if (isdefined(
self.one_time_cost))
541 cost =
self.one_time_cost;
542 self.one_time_cost=undefined;
554 if (isdefined(
self.one_time_cost))
556 cost =
self.one_time_cost;
557 self.one_time_cost=undefined;
571 if ( DistanceSquared(
self.target.origin, origin ) < ( radius * radius ) )
580 self.target.power_on=1;
581 self.target notify(
"power_on" );
587 self.target notify(
"power_off" );
588 self.target.power_on=0;
593 self.target.local_power_on=1;
594 self.target notify(
"local_power_on" );
600 self.target notify(
"local_power_off" );
601 self.target.local_power_on=0;
607 if (isdefined(
self.target.power_cost ) )
609 if (!isdefined(
self.one_time_cost))
610 self.one_time_cost=0;
611 self.one_time_cost +=
self.target.power_cost;
612 self.target.power_cost=0;
614 if (isdefined(
self.one_time_cost))
616 cost =
self.one_time_cost;
617 self.one_time_cost=undefined;
633 if ( !isDefined(
self.zombies ) )
643 for (i=0; i<
self.zombies.size; i++)
652 self notify(
"stun_zombie" );
653 self endon(
"stun_zombie" );
655 if (
self.health <= 0 )
660 if (
IS_TRUE(
self.ignore_inert ) )
667 self thread [[
self.stun_zombie ]]();
680 if (IsDefined(
self.target))
682 perkorigin =
self.target.origin;
683 if(
IS_TRUE(
self.target.trigger_off ) )
684 perkorigin =
self.target.realorigin;
685 else if(
IS_TRUE(
self.target.disabled ) )
686 perkorigin = perkorigin + ( 0, 0, 10000 );
687 if ( DistanceSquared( perkorigin, origin ) < radius * radius )
702 if(isDefined(notify_name) && notify_name ==
"revive")
711 self.target notify(
"death" );
713 if ( IsDefined(
self.target.perk_hum ) )
715 self.target.perk_hum Delete();
725 level.local_doors_stay_open =
true;
726 level.power_local_doors_globally = 1;
728 if(!IsDefined( power_zone ))
739 zombie_doors = GetEntArray(
"zombie_door",
"targetname" );
740 foreach ( door
in zombie_doors )
742 if(!IsDefined(door.script_noteworthy))
745 if (!IsDefined( power_zone) && (door.script_noteworthy ==
"electric_door" || door.script_noteworthy ==
"electric_buyable_door"))
747 door notify(
"power_on" );
749 else if((IsDefined(door.script_int) && door.script_int == power_zone) && (door.script_noteworthy ==
"electric_door" || door.script_noteworthy ==
"electric_buyable_door"))
751 door notify(
"power_on" );
754 if( isdefined( level.temporary_power_switch_logic ) )
756 door.power_on =
true;
759 else if( ( isdefined(door.script_int) && door.script_int == power_zone ) && door.script_noteworthy ===
"local_electric_door" )
761 door notify(
"local_power_on" );
768 level.local_doors_stay_open =
false;
769 level.power_local_doors_globally =
false;
771 if(!IsDefined( power_zone ))
783 zombie_doors = GetEntArray(
"zombie_door",
"targetname" );
784 foreach ( door
in zombie_doors )
786 if(!IsDefined(door.script_noteworthy))
789 if (!IsDefined( power_zone) && (door.script_noteworthy ==
"electric_door" || door.script_noteworthy ==
"electric_buyable_door"))
791 door notify(
"power_on" );
793 else if((IsDefined(door.script_int) && door.script_int == power_zone) && (door.script_noteworthy ==
"electric_door" || door.script_noteworthy ==
"electric_buyable_door"))
795 door notify(
"power_on" );
799 if( isdefined( level.temporary_power_switch_logic ) )
801 door.power_on =
false;
802 door sethintstring(&
"ZOMBIE_NEED_POWER");
803 door notify(
"kill_door_think" );
807 else if ( isdefined( door.script_noteworthy ) && door.script_noteworthy ==
"local_electric_door" )
809 door notify(
"local_power_on" );