1 #using scripts\codescripts\struct;
3 #using scripts\shared\aat_shared;
4 #using scripts\shared\array_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\demo_shared;
7 #using scripts\shared\flag_shared;
8 #using scripts\shared\laststand_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\trigger_shared;
11 #using scripts\shared\util_shared;
13 #insert scripts\shared\shared.gsh;
14 #insert scripts\shared\version.gsh;
16 #using scripts\zm\_util;
17 #using scripts\zm\_zm;
18 #using scripts\zm\_zm_audio;
19 #using scripts\zm\_zm_bgb;
20 #using scripts\zm\_zm_equipment;
21 #using scripts\zm\_zm_laststand;
22 #using scripts\zm\_zm_magicbox;
23 #using scripts\zm\_zm_pers_upgrades_functions;
24 #using scripts\zm\_zm_pack_a_punch_util;
25 #using scripts\zm\_zm_power;
26 #using scripts\zm\_zm_score;
27 #using scripts\zm\_zm_stats;
28 #using scripts\zm\_zm_utility;
29 #using scripts\zm\_zm_weapons;
31 #insert scripts\zm\_zm_perks.gsh;
32 #insert scripts\zm\_zm_utility.gsh;
34 #precache( "string", "ZOMBIE_PERK_PACKAPUNCH" );
35 #precache( "string", "ZOMBIE_PERK_PACKAPUNCH_AAT" );
36 #precache( "triggerstring", "ZOMBIE_GET_UPGRADED_FILL" );
38 #define PAP_WEAPON_KNUCKLE_CRACK "zombie_knuckle_crack"
40 #define PAP_INITIAL_PIECE 0
41 #define PAP_PACKING_PIECE 1
42 #define PAP_FLAG_PIECE 2
43 #define PAP_WEAPON_PIECE 3
44 #define PAP_POWERED_PIECE 4
45 #define PAP_TELEPORT_PIECE 5
57 if ( !isdefined( level.pap_zbarrier_state_func ) )
68 if ( vending_weapon_upgrade_trigger.size >= 1 )
74 old_packs = GetEntArray(
"zombie_vending_upgrade",
"targetname" );
75 for( i = 0; i < old_packs.size; i++ )
77 vending_weapon_upgrade_trigger[vending_weapon_upgrade_trigger.size] = old_packs[i];
84 zbarriers = GetEntArray(
"zm_pack_a_punch",
"targetname");
86 for ( i = 0; i < zbarriers.size; i++ )
88 if ( !zbarriers[i] IsZbarrier() )
94 if (!IsDefined (level.pack_a_punch.interaction_height) )
96 level.pack_a_punch.interaction_height = 35;
98 if (!IsDefined (level.pack_a_punch.interaction_trigger_radius) )
100 level.pack_a_punch.interaction_trigger_radius = 40;
102 if (!IsDefined (level.pack_a_punch.interaction_trigger_height) )
104 level.pack_a_punch.interaction_trigger_height = 70;
106 use_trigger =
Spawn(
"trigger_radius_use", zbarriers[i].origin + (0, 0, level.pack_a_punch.interaction_height), 0, level.pack_a_punch.interaction_trigger_radius, level.pack_a_punch.interaction_trigger_height );
107 use_trigger.script_noteworthy =
"pack_a_punch";
108 use_trigger TriggerIgnoreTeam();
114 collision =
Spawn(
"script_model", zbarriers[i].origin, 1);
115 collision.angles = zbarriers[i].angles;
116 collision SetModel(
"zm_collision_perks1" );
117 collision.script_noteworthy =
"clip";
118 collision DisconnectPaths();
121 use_trigger.clip = collision;
122 use_trigger.zbarrier = zbarriers[i];
125 use_trigger.script_sound =
"mus_perks_packa_jingle";
126 use_trigger.script_label =
"mus_perks_packa_sting";
127 use_trigger.longJingleWait =
true;
130 use_trigger.target =
"vending_packapunch";
131 use_trigger.zbarrier.targetname =
"vending_packapunch";
137 if ( IsDefined( level.pack_a_punch.custom_power_think ) )
139 use_trigger thread [[level.pack_a_punch.custom_power_think]]( powered_on );
146 ARRAY_ADD( level.pack_a_punch.triggers, use_trigger );
153 level endon(
"Pack_A_Punch_off" );
154 level waittill(
"Pack_A_Punch_on" );
160 foreach( e_player
in level.players )
162 if ( e_player istouching(
self ) )
174 level waittill(
"Pack_A_Punch_off" );
181 level endon(
"Pack_A_Punch_off");
183 trigger endon(
"pap_player_disconnected");
185 current_weapon =
self GetBuildKitWeapon( current_weapon,
false );
186 upgrade_weapon =
self GetBuildKitWeapon( upgrade_weapon,
true );
188 trigger.current_weapon = current_weapon;
189 trigger.current_weapon_options =
self GetBuildKitWeaponOptions( trigger.current_weapon );
190 trigger.current_weapon_acvi =
self GetBuildKitAttachmentCosmeticVariantIndexes( trigger.current_weapon,
false );
192 trigger.upgrade_weapon = upgrade_weapon;
194 trigger.upgrade_weapon_options =
self GetBuildKitWeaponOptions( trigger.upgrade_weapon, upgrade_weapon.pap_camo_to_use );
195 trigger.upgrade_weapon_acvi =
self GetBuildKitAttachmentCosmeticVariantIndexes( trigger.upgrade_weapon,
true );
197 trigger.zbarrier SetWeapon( trigger.current_weapon );
198 trigger.zbarrier SetWeaponOptions( trigger.current_weapon_options );
199 trigger.zbarrier SetAttachmentCosmeticVariantIndexes( trigger.current_weapon_acvi );
203 rel_entity = trigger.pap_machine;
205 origin_offset = (0,0,0);
206 angles_offset = (0,0,0);
207 origin_base =
self.origin;
208 angles_base =
self.angles;
210 if( isDefined(rel_entity) )
212 origin_offset = (0, 0, level.pack_a_punch.interaction_height);
213 angles_offset = (0, 90, 0);
215 origin_base = rel_entity.origin;
216 angles_base = rel_entity.angles;
222 forward = anglesToForward( angles_base+angles_offset );
223 interact_offset = origin_offset+(forward*-25);
225 offsetdw = ( 3, 3, 3 );
227 pap_machine [[ level.pack_a_punch.move_in_func ]](
self, trigger, origin_offset, angles_offset );
229 self playsound(
"zmb_perks_packa_upgrade" );
234 trigger.zbarrier SetWeapon( upgrade_weapon );
235 trigger.zbarrier SetWeaponOptions( trigger.upgrade_weapon_options );
236 trigger.zbarrier SetAttachmentCosmeticVariantIndexes( trigger.upgrade_weapon_acvi );
240 if ( IsDefined(
self ) )
242 self playsound(
"zmb_perks_packa_ready" );
249 rel_entity thread [[ level.pack_a_punch.move_out_func ]](
self, trigger, origin_offset, interact_offset );
255 if ( weapon.isriotshield )
260 if ( level
flag::get(
"pack_machine_in_use") )
265 if( !
IS_TRUE( level.b_allow_idgun_pap ) && isdefined( level.idgun_weapons ) )
267 if ( IsInArray( level.idgun_weapons, weapon ) )
302 current_weapon =
self GetCurrentWeapon();
314 self endon(
"Pack_A_Punch_off");
315 self notify(
"pack_a_punch_trigger_think" );
316 self endon(
"pack_a_punch_trigger_think" );
320 players = GetPlayers();
322 for(i = 0; i < players.size; i ++)
324 if ( ( IsDefined(
self.pack_player ) &&
self.pack_player != players[i] ) ||
327 self SetInvisibleToPlayer( players[i],
true );
331 self SetInvisibleToPlayer( players[i],
false );
343 level endon(
"Pack_A_Punch_off");
345 pap_machine = GetEnt(
self.target,
"targetname" );
346 self.pap_machine = pap_machine;
347 pap_machine_sound = GetEntarray (
"perksacola",
"targetname");
348 packa_rollers =
spawn(
"script_origin",
self.origin);
349 packa_timer =
spawn(
"script_origin",
self.origin);
350 packa_rollers LinkTo(
self );
351 packa_timer LinkTo(
self );
353 self UseTriggerRequireLookAt();
354 self SetHintString( &
"ZOMBIE_NEED_POWER" );
355 self SetCursorHint(
"HINT_NOICON" );
357 power_off = !
self is_on();
362 pap_array[0] = pap_machine;
363 level waittill(
"Pack_A_Punch_on");
366 self TriggerEnable(
true );
368 if( IsDefined( level.pack_a_punch.power_on_callback ) )
370 pap_machine thread [[ level.pack_a_punch.power_on_callback ]]();
377 pap_machine playloopsound(
"zmb_perks_packa_loop");
384 self.pack_player = undefined;
386 self waittill(
"trigger", player );
388 if ( isdefined(pap_machine.state) && (pap_machine.state ==
"leaving") )
395 current_weapon = player getCurrentWeapon();
399 if( IsDefined( level.pack_a_punch.custom_validation ) )
401 valid =
self [[ level.pack_a_punch.custom_validation ]]( player );
411 player isThrowingGrenade() ||
418 if( player isSwitchingWeapons() )
421 if( player isSwitchingWeapons() )
430 current_cost =
self.cost;
431 player.restore_ammo = undefined;
432 player.restore_clip = undefined;
433 player.restore_stock = undefined;
434 player_restore_clip_size = undefined;
435 player.restore_max = undefined;
439 currentAATHashID = -1;
440 if ( b_weapon_supports_aat )
442 current_cost =
self.aat_cost;
444 if (isDefined(currentAAT))
446 currentAATHashID = currentAAT.hash_id;
448 player.restore_ammo =
true;
449 player.restore_clip = player GetWeaponAmmoClip( current_weapon );
450 player.restore_clip_size = current_weapon.clipSize;
451 player.restore_stock = player Getweaponammostock( current_weapon );
452 player.restore_max = current_weapon.maxAmmo;
464 self playsound(
"zmb_perks_packa_deny");
465 if(isDefined(level.pack_a_punch.custom_deny_func))
467 player [[level.pack_a_punch.custom_deny_func]]();
476 self.pack_player = player;
484 weaponIdx = undefined;
485 if (isDefined(current_weapon))
487 weaponIdx = MatchRecordGetWeaponIndex(current_weapon);
490 if (isDefined(weaponIdx))
494 player RecordMapEvent(
ZM_MAP_EVENT_PAP_USED, GetTime(), player.origin, level.round_number, weaponIdx, current_cost);
513 self TriggerEnable(
false );
518 self.current_weapon = current_weapon;
524 self TriggerEnable(
true );
525 self SetCursorHint(
"HINT_WEAPON", upgrade_weapon);
527 if ( IsDefined( player ) )
529 self setinvisibletoall();
530 self setvisibletoplayer( player );
547 self SetCursorHint(
"HINT_NOICON");
548 self.current_weapon = level.weaponNone;
554 self.pack_player = undefined;
564 level waittill(
"Pack_A_Punch_off" );
566 ent1 stoploopsound( .1 );
567 ent2 stoploopsound( .1 );
568 ent3 stoploopsound( .1 );
574 level waittill(
"Pack_A_Punch_on" );
575 ent playloopsound(
"zmb_perks_packa_loop" );
580 level endon(
"Pack_A_Punch_off");
584 self.aat_cost = 2500;
585 level waittill(
"powerup bonfire sale" );
589 level waittill(
"bonfire_sale_off" );
595 current_weapon =
self.current_weapon;
596 upgrade_weapon =
self.upgrade_weapon;
597 Assert( IsDefined( current_weapon ),
"wait_for_player_to_take: weapon does not exist" );
598 Assert( IsDefined( upgrade_weapon ),
"wait_for_player_to_take: upgrade_weapon does not exist" );
600 self endon(
"pap_timeout" );
601 level endon(
"Pack_A_Punch_off" );
603 while ( IsDefined( player ) )
605 packa_timer playloopsound(
"zmb_perks_packa_ticktock" );
606 self waittill(
"trigger", trigger_player );
607 if ( level.pack_a_punch.grabbable_by_anyone )
609 player = trigger_player;
612 packa_timer stoploopsound(.05);
613 if( trigger_player == player )
619 current_weapon = player GetCurrentWeapon();
621 if ( level.weaponNone == current_weapon )
623 iprintlnbold(
"WEAPON IS NONE, PACKAPUNCH RETRIEVAL DENIED" );
631 level.weaponNone!= current_weapon &&
636 self notify(
"pap_taken" );
637 player notify(
"pap_taken" );
638 player.pap_used =
true;
644 primaries = player GetWeaponsListPrimaries();
645 if( isDefined( primaries ) && primaries.size >= weapon_limit )
652 player GiveStartAmmo( upgrade_weapon );
654 player notify(
"weapon_give", upgrade_weapon );
657 if (
IS_TRUE( b_weapon_supports_aat ) )
661 if (isDefined(aatObj))
663 aatID = aatObj.hash_id;
671 weaponIdx = undefined;
672 if (isDefined(weapon))
674 weaponIdx = MatchRecordGetWeaponIndex(weapon);
677 if (isDefined(weaponIdx))
689 player SwitchToWeapon( upgrade_weapon );
693 new_clip = player.restore_clip + ( upgrade_weapon.clipSize - player.restore_clip_size );
694 new_stock = player.restore_stock + ( upgrade_weapon.maxAmmo - player.restore_max );
695 player SetWeaponAmmoStock( upgrade_weapon, new_stock );
696 player SetWeaponAmmoClip( upgrade_weapon, new_clip );
698 player.restore_ammo = undefined;
699 player.restore_clip = undefined;
700 player.restore_stock = undefined;
701 player.restore_max = undefined;
702 player.restore_clip_size = undefined;
717 self endon(
"pap_taken" );
718 self endon(
"pap_player_disconnected" );
722 wait( level.pack_a_punch.timeout );
724 self notify(
"pap_timeout" );
725 packa_timer stoploopsound(.05);
726 packa_timer playsound(
"zmb_perks_packa_deny" );
729 if(isDefined(player))
733 weaponIdx = undefined;
734 if (isDefined(weapon))
736 weaponIdx = MatchRecordGetWeaponIndex(weapon);
739 if (isDefined(weaponIdx))
749 if (isDefined(aatOnWeapon))
751 aatHash = aatOnWeapon.hash_id;
761 self endon(
"pap_taken" );
762 self endon(
"pap_timeout" );
764 while(isdefined(player))
769 /# println(
"*** PAP : User disconnected."); #/
771 self notify(
"pap_player_disconnected" );
776 self endon(
"pap_timeout" );
777 self endon(
"pap_taken" );
778 self endon (
"pap_player_disconnected" );
780 level waittill(
"Pack_A_Punch_off");
784 player playlocalsound( level.zmb_laugh_alias );
797 self endon(
"disconnect");
800 self util::waittill_any(
"fake_death",
"death",
"player_downed",
"weapon_change_complete" );
815 primaries =
self GetWeaponsListPrimaries();
817 original_weapon =
self GetCurrentWeapon();
822 self notify(
"zmb_lost_knife" );
823 self TakeWeapon( original_weapon );
830 self GiveWeapon( weapon );
831 self SwitchToWeapon( weapon );
845 self TakeWeapon(weapon);
851 self TakeWeapon(weapon);
852 primaries =
self GetWeaponsListPrimaries();
865 if (IsDefined(
self.target))
867 paporigin =
self.target.origin;
868 if(
IS_TRUE(
self.target.trigger_off ) )
869 paporigin =
self.target.realorigin;
870 else if(
IS_TRUE(
self.target.disabled ) )
871 paporigin = paporigin + ( 0, 0, 10000 );
873 if ( DistanceSquared( paporigin, origin ) < radius * radius )
881 /# println(
"^1ZM POWER: PaP on\n" ); #/
882 level notify(
"Pack_A_Punch_on" );
887 /# println(
"^1ZM POWER: PaP off\n" ); #/
890 level notify(
"Pack_A_Punch_off" );
891 self.target notify(
"death" );
897 if (isdefined(
self.powered))
898 return self.powered.power;
904 if (
IS_TRUE( level.vending_machines_powered_on_at_start ) )
914 if (isdefined(
self.one_time_cost))
916 cost =
self.one_time_cost;
917 self.one_time_cost=undefined;
933 level waittill(
"Pack_A_Punch_on" );
940 level waittill(
"Pack_A_Punch_off" );
944 level waittill(
"Pack_A_Punch_on" );
962 self endon(
"zbarrier_state_change" );
970 self playsound(
"zmb_perks_power_on" );
977 self endon(
"zbarrier_state_change" );
981 if(
self.classname ===
"zbarrier_zm_castle_packapunch" ||
self.classname ===
"zbarrier_zm_tomb_packapunch" )
988 wait( randomfloatrange( 180, 1800 ) );
991 wait( randomfloatrange( 180, 1800 ) );
1003 if(
self.classname ===
"zbarrier_zm_castle_packapunch" ||
self.classname ===
"zbarrier_zm_tomb_packapunch" )
1026 self notify (
"leave_anim_done");
1032 self endon(
"zbarrier_state_change" );
1040 self playsound(
"zmb_perks_power_on" );
1053 for ( i = 0; i <
self GetNumZBarrierPieces(); i++ )
1055 self HideZBarrierPiece( i );
1058 self notify(
"zbarrier_state_change" );
1060 self [[level.pap_zbarrier_state_func]]( state );
1070 self.state =
"initial";
1075 self.state =
"power_off";
1080 self.state =
"power_on";
1085 self.state =
"powered";
1092 self.state =
"take_gun";
1099 self.state =
"eject_gun";
1104 self.state =
"leaving";
1109 self.state =
"arriving";
1112 self.state =
"hidden";
1115 if ( IsDefined( level.custom_pap_state_handler ) )
1117 self [[ level.custom_pap_state_handler ]]( state );