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\system_shared;
9 #using scripts\shared\util_shared;
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\version.gsh;
14 #using scripts\zm\_bb;
15 #using scripts\zm\_zm_audio;
16 #using scripts\zm\_zm_bgb;
17 #using scripts\zm\_zm_daily_challenges;
18 #using scripts\zm\_zm_equipment;
19 #using scripts\zm\_zm_pack_a_punch_util;
20 #using scripts\zm\_zm_pers_upgrades_functions;
21 #using scripts\zm\_zm_score;
22 #using scripts\zm\_zm_stats;
23 #using scripts\zm\_zm_unitrigger;
24 #using scripts\zm\_zm_utility;
25 #using scripts\zm\_zm_weapons;
27 #insert scripts\zm\_zm_perks.gsh;
28 #insert scripts\zm\_zm_utility.gsh;
30 #precache( "fx", "zombie/fx_weapon_box_marker_zmb" );
31 #precache( "fx", "zombie/fx_weapon_box_marker_fl_zmb" );
32 #precache( "fx", "zombie/fx_barrier_buy_zmb" );
48 #namespace zm_magicbox;
50 #precache( "triggerstring", "ZOMBIE_TRADE_EQUIP_FILL" );
51 #precache( "triggerstring", "ZOMBIE_TRADE_WEAPON_FILL" );
58 level.start_chest_name =
"start_chest";
60 level._effect[
"lght_marker"] =
"zombie/fx_weapon_box_marker_zmb";
61 level._effect[
"lght_marker_flare"] =
"zombie/fx_weapon_box_marker_fl_zmb";
62 level._effect[
"poltergeist"] =
"zombie/fx_barrier_buy_zmb";
78 if( !IsDefined( level.chest_joker_model ) )
80 level.chest_joker_model =
"p7_zm_teddybear";
83 if( !IsDefined( level.magic_box_zbarrier_state_func ) )
88 if (!IsDefined(level.magic_box_check_equipment))
119 level.chest_moves = 0;
120 level.chest_level = 0;
125 if( level.chests.size==0 )
128 for (i=0; i<level.chests.size; i++ )
130 level.chests[i].box_hacks = [];
132 level.chests[i].orig_origin = level.chests[i].origin;
135 if ( isDefined( level.chests[i].zombie_cost ) )
137 level.chests[i].old_cost = level.chests[i].zombie_cost;
142 level.chests[i].old_cost = 950;
146 if(!level.enable_magic)
148 foreach(chest
in level.chests)
155 level.chest_accessed = 0;
157 if (level.chests.size > 1)
161 level.chests = array::randomize(level.chests);
168 level.chest_index = 0;
169 level.chests[0].no_fly_away =
true;
180 level.chest_index = 0;
181 start_chest_found =
false;
183 if( level.chests.size==1 )
186 start_chest_found =
true;
188 if(isdefined(level.chests[level.chest_index].zbarrier))
196 for( i = 0; i < level.chests.size; i++ )
198 if( isdefined( level.random_pandora_box_start ) && level.random_pandora_box_start ==
true )
201 if ( start_chest_found || (IsDefined( level.chests[i].start_exclude ) && level.chests[i].start_exclude == 1) )
207 level.chest_index = i;
208 level.chests[level.chest_index].hidden =
false;
209 if(isdefined(level.chests[level.chest_index].zbarrier))
214 start_chest_found =
true;
223 if ( start_chest_found || !IsDefined(level.chests[i].script_noteworthy ) || ( !IsSubStr( level.chests[i].script_noteworthy, start_chest_name ) ) )
229 level.chest_index = i;
230 level.chests[level.chest_index].hidden =
false;
231 if(isdefined(level.chests[level.chest_index].zbarrier))
236 start_chest_found =
true;
243 if( !isDefined( level.pandora_show_func ) )
245 if ( isdefined( level.custom_pandora_show_func ) )
247 level.pandora_show_func = level.custom_pandora_show_func;
255 level.chests[level.chest_index] thread [[ level.pandora_show_func ]]();
260 level.zombie_treasure_chest_cost = cost;
273 self.chest_box = GetEnt(
self.script_noteworthy +
"_zbarrier",
"script_noteworthy" );
276 self.chest_rubble = [];
277 rubble = GetEntArray(
self.script_noteworthy +
"_rubble",
"script_noteworthy" );
278 for ( i=0; i<rubble.size; i++ )
280 if ( DistanceSquared(
self.origin, rubble[i].origin ) < 10000 )
282 self.chest_rubble[
self.chest_rubble.size ] = rubble[i];
286 self.zbarrier = GetEnt(
self.script_noteworthy +
"_zbarrier",
"script_noteworthy");
287 if(isdefined(
self.zbarrier))
289 self.zbarrier ZBarrierPieceUseBoxRiseLogic(3);
290 self.zbarrier ZBarrierPieceUseBoxRiseLogic(4);
293 self.unitrigger_stub = spawnstruct();
294 self.unitrigger_stub.origin =
self.origin + (anglestoright(
self.angles) * -22.5);
295 self.unitrigger_stub.angles =
self.angles;
296 self.unitrigger_stub.script_unitrigger_type =
"unitrigger_box_use";
297 self.unitrigger_stub.script_width = 104;
298 self.unitrigger_stub.script_height = 50;
299 self.unitrigger_stub.script_length = 45;
300 self.unitrigger_stub.trigger_target =
self;
303 self.zbarrier.owner =
self;
310 if(isdefined(
self.hint_string))
312 if (IsDefined(
self.hint_parm1))
313 self SetHintString(
self.hint_string,
self.hint_parm1 );
315 self SetHintString(
self.hint_string );
327 if( isdefined( level.func_magicbox_update_prompt_use_override ) )
329 if( [[ level.func_magicbox_update_prompt_use_override ]]() )
335 self.hint_parm1 = undefined;
336 if(
IS_TRUE(
self.stub.trigger_target.grab_weapon_hint))
338 cursor_hint =
"HINT_WEAPON";
339 cursor_hint_weapon =
self.stub.trigger_target.grab_weapon;
340 self setCursorHint( cursor_hint, cursor_hint_weapon );
341 if (IsDefined(level.magic_box_check_equipment) && [[level.magic_box_check_equipment]]( cursor_hint_weapon ) )
342 self.hint_string = &
"ZOMBIE_TRADE_EQUIP_FILL";
344 self.hint_string = &
"ZOMBIE_TRADE_WEAPON_FILL";
348 self setCursorHint(
"HINT_NOICON" );
349 self.hint_parm1 =
self.stub.trigger_target.zombie_cost;
363 self SetInvisibleToPlayer(player);
367 if(IsDefined(
self.stub.trigger_target.chest_user) && !IsDefined(
self.stub.trigger_target.box_rerespun))
394 self SetVisibleToPlayer(player);
400 self endon(
"kill_trigger");
404 self waittill(
"trigger", player );
405 self.stub.trigger_target notify(
"trigger", player);
411 self playlocalsound( level.zmb_laugh_alias );
423 self thread [[ level.pandora_show_func ]]();
434 if(IsDefined(
self.box_hacks[
"summon_box"]))
436 self [[
self.box_hacks[
"summon_box"]]](
false);
444 if(isDefined(
self.unitrigger_stub))
448 if ( IsDefined(
self.pandora_light ) )
450 self.pandora_light
delete();
457 if(isDefined(
self.box_hacks) && IsDefined(
self.box_hacks[
"summon_box"]))
459 self [[
self.box_hacks[
"summon_box"]]](
true);
462 if(isdefined(
self.zbarrier))
471 self.zbarrier waittill(
"left");
473 playfx( level._effect[
"poltergeist"],
self.zbarrier.origin, AnglesToUp(
self.zbarrier.angles ), AnglesToForward(
self.zbarrier.angles ) );
476 playsoundatposition (
"zmb_box_poof",
self.zbarrier.origin);
488 self waittill(
"left");
494 self endon(
"death" );
496 self.pandora_light =
Spawn(
"script_model",
self.zbarrier.origin );
497 self.pandora_light.angles =
self.zbarrier.angles + (-90, 0, -90);
499 self.pandora_light SetModel(
"tag_origin" );
500 if(!
IS_TRUE(level._box_initialized))
503 level._box_initialized =
true;
506 if ( IsDefined(
self ) && IsDefined(
self.pandora_light ) )
508 playfxontag(level._effect[
"lght_marker"],
self.pandora_light,
"tag_origin");
520 if ( !IsDefined(
self.pandora_light) )
523 if( !IsDefined( level.pandora_fx_func ) )
527 self thread [[ level.pandora_fx_func ]]();
530 playfx( level._effect[
"lght_marker_flare"],
self.pandora_light.origin );
538 self notify(
"unregister_unitrigger_on_kill_think" );
539 self endon(
"unregister_unitrigger_on_kill_think" );
541 self waittill(
"kill_chest_think");
548 self endon(
"kill_chest_think");
551 user_cost = undefined;
552 self.box_rerespun = undefined;
553 self.weapon_out = undefined;
559 if(!IsDefined(
self.forced_user))
561 self waittill(
"trigger", user );
567 user =
self.forced_user;
588 if( user GetCurrentWeapon() == level.weaponNone )
595 if (
IS_TRUE(
self.being_removed ) )
601 reduced_cost = undefined;
606 if(!IsDefined(
self.no_charge))
609 user_cost =
self.zombie_cost;
616 self.chest_user = user;
623 user_cost =
self.zombie_cost;
624 self.chest_user = user;
631 user_cost = reduced_cost;
632 self.chest_user = user;
655 if ( isDefined( level._magic_box_used_VO ) )
657 user thread [[ level._magic_box_used_VO ]]();
662 self._box_open =
true;
663 self._box_opened_by_fire_sale =
false;
664 if (
IS_TRUE( level.zombie_vars[
"zombie_powerup_fire_sale_on"] ) && !IsDefined(
self.auto_open) &&
self [[level._zombiemode_check_firesale_loc_valid_func]]())
666 self._box_opened_by_fire_sale =
true;
670 if(isdefined(
self.chest_lid))
675 if(isdefined(
self.zbarrier))
683 self.timedOut =
false;
686 self.weapon_out =
true;
690 if ( isdefined(level.custom_treasure_chest_glowfx ) )
692 self.zbarrier thread [[level.custom_treasure_chest_glowfx]]();
706 if ( level
flag::get(
"moving_chest_now" ) && !
self._box_opened_by_fire_sale && isdefined( user_cost ) )
711 if ( level
flag::get(
"moving_chest_now" ) && !level.zombie_vars[
"zombie_powerup_fire_sale_on" ] && !
self._box_opened_by_fire_sale )
719 if( !
IS_TRUE(
self.unbearable_respin ) )
722 self.grab_weapon_hint =
true;
723 self.grab_weapon =
self.zbarrier.weapon;
724 self.chest_user = user;
725 weaponIdx = undefined;
726 if (isDefined(
self.grab_weapon))
728 weaponIdx = MatchRecordGetWeaponIndex(
self.grab_weapon);
731 if ( isDefined(weaponIdx) )
740 if( isDefined(
self.zbarrier) && !
IS_TRUE(
self.zbarrier.closed_by_emp) )
748 while( !
IS_TRUE(
self.closed_by_emp) )
750 self waittill(
"trigger", grabber );
751 self.weapon_out = undefined;
753 if (
IS_TRUE( level.magic_box_grab_by_anyone ) )
755 if( IsPlayer(grabber) )
761 if( IsDefined( grabber.is_drinking ) &&
IS_DRINKING(grabber.is_drinking) )
767 if ( grabber == user && user GetCurrentWeapon() == level.weaponNone )
773 if(grabber != level && (IsDefined(
self.box_rerespun) &&
self.box_rerespun))
778 if( grabber == user || grabber == level )
780 self.box_rerespun = undefined;
781 current_weapon = level.weaponNone;
785 current_weapon = user GetCurrentWeapon();
788 if( grabber == user &&
794 !current_weapon.isheroweapon &&
795 !current_weapon.isgadget )
797 weaponIdx = undefined;
798 if (isDefined(
self.zbarrier) && isDefined(
self.zbarrier.weapon))
800 weaponIdx = MatchRecordGetWeaponIndex(
self.zbarrier.weapon);
803 if (isDefined(weaponidx))
808 self notify(
"user_grabbed_weapon" );
809 user notify(
"user_grabbed_weapon" );
820 else if( grabber == level )
823 self.timedOut =
true;
824 weaponIdx = undefined;
825 if (isDefined(
self.zbarrier) && isDefined(
self.zbarrier.weapon))
827 weaponIdx = MatchRecordGetWeaponIndex(
self.zbarrier.weapon);
829 if (isDefined(weaponidx))
840 self.grab_weapon_hint =
false;
841 self.zbarrier notify(
"weapon_grabbed" );
843 if ( !
IS_TRUE(
self._box_opened_by_fire_sale ) )
846 level.chest_accessed += 1;
854 if(isdefined(
self.chest_lid))
859 if(isdefined(
self.zbarrier))
863 self.zbarrier waittill(
"closed");
873 if ( (
IS_TRUE( level.zombie_vars[
"zombie_powerup_fire_sale_on"] ) &&
self [[level._zombiemode_check_firesale_loc_valid_func]]()) ||
self == level.chests[level.chest_index] )
882 self._box_open =
false;
883 self._box_opened_by_fire_sale =
false;
884 self.unbearable_respin = undefined;
885 self.chest_user = undefined;
887 self notify(
"chest_accessed" );
894 self endon(
"chest_accessed" );
895 self.closed_by_emp = 0;
898 if(isDefined(
self.zbarrier))
900 self.zbarrier.closed_by_emp = 0;
905 level waittill(
"emp_detonate",origin,radius);
906 if ( DistanceSquared( origin,
self.origin) < radius * radius )
916 self.closed_by_emp = 1;
917 if(isdefined(
self.zbarrier))
919 self.zbarrier.closed_by_emp = 1;
920 self.zbarrier notify(
"box_hacked_respin");
921 if(isDefined(
self.zbarrier.weapon_model))
923 self.zbarrier.weapon_model notify(
"kill_weapon_movement");
925 if(IsDefined(
self.zbarrier.weapon_model_dw))
927 self.zbarrier.weapon_model_dw notify(
"kill_weapon_movement");
933 self notify(
"trigger", level );
939 if( IsDefined(
self.is_drinking ) &&
IS_DRINKING(
self.is_drinking) )
949 current_weapon =
self GetCurrentWeapon();
959 if( current_weapon == level.weaponNone )
964 if ( current_weapon.isheroweapon || current_weapon.isgadget )
979 for ( i=0; i<level.chests.size; i++ )
982 if ( IsSubStr( level.chests[i].script_noteworthy, (
"move"+(level.chest_moves+1)) ) &&
983 i != level.chest_index )
992 level.chest_index = index;
999 if (level.chest_index >= level.chests.size)
1002 temp_chest_name = level.chests[level.chest_index - 1].script_noteworthy;
1003 level.chest_index = 0;
1004 level.chests = array::randomize(level.chests);
1007 if (temp_chest_name == level.chests[level.chest_index].script_noteworthy)
1009 level.chest_index++;
1020 level waittill(
"weapon_fly_away_start");
1022 players = GetPlayers();
1027 if( IsDefined( player_vox ) )
1032 level waittill(
"weapon_fly_away_end");
1034 if(isdefined(
self.zbarrier))
1041 post_selection_wait_duration = 7;
1044 if(level.zombie_vars[
"zombie_powerup_fire_sale_on"] ==
true &&
self [[level._zombiemode_check_firesale_loc_valid_func]]())
1046 current_sale_time = level.zombie_vars[
"zombie_powerup_fire_sale_time"];
1051 level.zombie_vars[
"zombie_powerup_fire_sale_time"] = current_sale_time;
1053 while(level.zombie_vars[
"zombie_powerup_fire_sale_time"] > 0)
1060 post_selection_wait_duration += 5;
1062 level.verify_chest =
false;
1065 if(IsDefined(level._zombiemode_custom_box_move_logic))
1067 [[level._zombiemode_custom_box_move_logic]]();
1074 if(IsDefined(level.chests[level.chest_index].box_hacks[
"summon_box"]))
1076 level.chests[level.chest_index] [[level.chests[level.chest_index].box_hacks[
"summon_box"]]](
false);
1082 wait(post_selection_wait_duration);
1084 playfx(level._effect[
"poltergeist"], level.chests[level.chest_index].zbarrier.origin, AnglesToUp( level.chests[level.chest_index].zbarrier.angles ), AnglesToForward( level.chests[level.chest_index].zbarrier.angles ));
1088 self.zbarrier.chest_moving =
false;
1094 if( !isdefined ( level.zombie_vars[
"zombie_powerup_fire_sale_on"] ) )
1099 if( level.zombie_vars[
"zombie_powerup_fire_sale_on"] )
1101 self.old_cost = 950;
1103 self.zombie_cost = 10;
1108 level waittill(
"fire_sale_off" );
1117 self.zombie_cost =
self.old_cost;
1123 if( !isdefined( level.desirable_chest_location ) )
1124 return level.chest_index;
1126 if( level.chests[level.chest_index].script_noteworthy == level.desirable_chest_location )
1128 level.desirable_chest_location = undefined;
1129 return level.chest_index;
1131 for(i = 0 ; i < level.chests.size; i++ )
1133 if( level.chests[i].script_noteworthy == level.desirable_chest_location )
1135 level.desirable_chest_location = undefined;
1140 level.desirable_chest_location = undefined;
1141 return level.chest_index;
1150 while(isdefined(
self))
1152 self RotateRoll(angles + angles2, 0.5);
1155 self RotateRoll(angles * -2, 0.5);
1168 for (i = 0; i < level.open_chest_location.size; i++)
1170 if(isdefined(level.open_chest_location[i]))
1172 if(level.open_chest_location[i] == level.chests[level.chest_index].script_noteworthy)
1174 level.verify_chest =
true;
1181 level.verify_chest =
false;
1189 self endon(
"user_grabbed_weapon" );
1190 self.zbarrier endon(
"box_hacked_respin" );
1191 self.zbarrier endon(
"box_hacked_rerespin" );
1194 self notify(
"trigger", level );
1202 self RotateRoll( 105, openTime, ( openTime * 0.5 ) );
1213 self RotateRoll( closeRoll, closeTime, ( closeTime * 0.5 ) );
1216 self notify(
"lid_closed");
1238 if(isdefined(level.custom_magic_box_selection_logic))
1240 if(![[level.custom_magic_box_selection_logic]](weapon, player, pap_triggers))
1246 if ( weapon.name ==
"ray_gun" )
1254 if ( weapon.name ==
"raygun_mark2" )
1263 if( IsDefined( player ) && isdefined( level.special_weapon_magicbox_check ) )
1265 return player [[level.special_weapon_magicbox_check]]( weapon );
1273 keys = array::randomize( GetArrayKeys( level.zombie_weapons ) );
1274 if (IsDefined(level.CustomRandomWeaponWeights))
1276 keys = player [[level.CustomRandomWeaponWeights]](keys);
1279 for ( i = 0; i < keys.size; i++ )
1293 level._weapon_show_hint_choke = 0;
1298 level._weapon_show_hint_choke = 0;
1304 self endon(
"death");
1306 if( isDefined( endon_notify ) )
1308 self endon( endon_notify );
1311 if( isDefined( second_endon_notify ))
1313 self endon( second_endon_notify );
1316 if(!IsDefined(level._weapon_show_hint_choke))
1323 if(IsDefined(level._use_choke_weapon_hints) && level._use_choke_weapon_hints == 1)
1332 last_update = GetTime();
1334 if ( IsDefined(
self.chest_user ) && !IsDefined(
self.box_rerespun ) )
1338 self SetInvisibleToPlayer(
self.chest_user);
1342 self SetVisibleToPlayer(
self.chest_user );
1345 else if ( IsDefined( onlyplayer ) )
1347 if ( onlyplayer
can_buy_weapon() && ( !IsDefined( can_buy_weapon_extra_check_func ) || onlyplayer [[ can_buy_weapon_extra_check_func ]](
self.weapon ) ) && !onlyplayer
bgb::is_enabled(
"zm_bgb_disorderly_combat" ) )
1349 self SetInvisibleToPlayer( onlyplayer,
false );
1353 self SetInvisibleToPlayer( onlyplayer,
true );
1358 players = GetPlayers();
1359 for ( i = 0; i < players.size; i++ )
1361 if ( players[ i ]
can_buy_weapon() && ( !IsDefined( can_buy_weapon_extra_check_func ) || players[ i ] [[ can_buy_weapon_extra_check_func ]](
self.weapon ) ) && !players[ i ]
bgb::is_enabled(
"zm_bgb_disorderly_combat" ) )
1363 self SetInvisibleToPlayer( players[i],
false );
1367 self SetInvisibleToPlayer( players[i],
true );
1374 while((level._weapon_show_hint_choke > 4) && (GetTime() < (last_update + 150)))
1384 level._weapon_show_hint_choke ++;
1390 dw_weapon = weapon.dualWieldWeapon;
1391 if ( dw_weapon != level.weaponNone )
1393 return dw_weapon.worldModel;
1396 return weapon.worldModel;
1401 self waittill(
"box_hacked_respin");
1402 self endon(
"box_spin_done");
1404 if(IsDefined(
self.weapon_model))
1406 self.weapon_model Delete();
1407 self.weapon_model = undefined;
1410 if(IsDefined(
self.weapon_model_dw))
1412 self.weapon_model_dw Delete();
1413 self.weapon_model_dw = undefined;
1417 self HideZBarrierPiece(3);
1418 self HideZBarrierPiece(4);
1419 self SetZBarrierPieceState(3,
"closed");
1420 self SetZBarrierPieceState(4,
"closed");
1426 return IS_TRUE( level.zombie_vars[
"zombie_powerup_fire_sale_on"] );
1432 if( ( GetDvarString(
"magic_chest_movable") ==
"1") &&
1433 !
IS_TRUE( chest._box_opened_by_fire_sale ) &&
1435 self [[level._zombiemode_check_firesale_loc_valid_func]]() )
1438 random = Randomint(100);
1440 if( !isdefined( level.chest_min_move_usage ) )
1442 level.chest_min_move_usage = 4;
1445 if( level.chest_accessed < level.chest_min_move_usage )
1447 chance_of_joker = -1;
1451 chance_of_joker = level.chest_accessed + 20;
1454 if ( level.chest_moves == 0 && level.chest_accessed >= 8 )
1456 chance_of_joker = 100;
1461 if( level.chest_accessed >= 4 && level.chest_accessed < 8 )
1465 chance_of_joker = 100;
1469 chance_of_joker = -1;
1474 if ( level.chest_moves > 0 )
1477 if( level.chest_accessed >= 8 && level.chest_accessed < 13 )
1481 chance_of_joker = 100;
1485 chance_of_joker = -1;
1490 if( level.chest_accessed >= 13 )
1494 chance_of_joker = 100;
1498 chance_of_joker = -1;
1504 if(IsDefined(chest.no_fly_away))
1506 chance_of_joker = -1;
1509 if(IsDefined(level._zombiemode_chest_joker_chance_override_func))
1511 chance_of_joker = [[level._zombiemode_chest_joker_chance_override_func]](chance_of_joker);
1514 if ( chance_of_joker > random )
1525 weapon_model =
spawn(
"script_model", origin );
1526 if ( isdefined( angles ) )
1528 weapon_model.angles = angles;
1530 weapon_model SetModel(model);
1531 return weapon_model;
1538 if ( isdefined(
self.locked_model) )
1540 self.locked_model
delete();
1541 self.locked_model = undefined;
1546 if ( weapon == level.weaponNone )
1554 self.locked_model Ghost();
1561 self endon(
"box_hacked_respin");
1563 assert(IsDefined(player));
1573 self.chest_moving =
false;
1576 preferred_weapon = undefined;
1580 preferred_weapon = level.weaponNone;
1593 const FLOAT_HEIGHT = 40;
1594 const BOX_MOVE_BEAR_FLYAWAY_DISTANCE = 500;
1595 const BOX_MOVE_BEAR_FLYAWAY_TIME = 4;
1596 const BOX_MOVE_BEAR_FLYAWAY_ACCEL = 3;
1597 self.weapon = level.weaponNone;
1598 modelname = undefined;
1602 if(isdefined(chest.zbarrier))
1604 if ( IsDefined( level.custom_magic_box_do_weapon_rise ) )
1606 chest.zbarrier thread [[level.custom_magic_box_do_weapon_rise]]();
1614 for( i = 0; i < number_cycles; i++ )
1635 if ( IsDefined( level.custom_magic_box_weapon_wait ) )
1637 [[level.custom_magic_box_weapon_wait]]();
1649 move_the_box =
false;
1656 rand = preferred_weapon;
1672 if ( isdefined( level.func_magicbox_weapon_spawned ) )
1674 self thread [[ level.func_magicbox_weapon_spawned ]](
self.weapon );
1681 if ( IsDefined( level.custom_magicbox_float_height ) )
1683 v_float = AnglesToUp(
self.angles ) * level.custom_magicbox_float_height;
1687 v_float = AnglesToUp(
self.angles ) * FLOAT_HEIGHT;
1690 self.model_dw = undefined;
1694 if ( rand.isDualWield )
1697 if ( isdefined( rand.dualwieldweapon ) && rand.dualwieldweapon != level.weaponNone )
1699 dweapon = rand.dualwieldweapon;
1705 if ( move_the_box && !(level.zombie_vars[
"zombie_powerup_fire_sale_on"] &&
self [[level._zombiemode_check_firesale_loc_valid_func]]()) )
1707 self.weapon_model SetModel(level.chest_joker_model);
1709 if(IsDefined(
self.weapon_model_dw))
1711 self.weapon_model_dw Delete();
1712 self.weapon_model_dw = undefined;
1715 if( IsPlayer( chest.chest_user ) && chest.chest_user
bgb::is_enabled(
"zm_bgb_unbearable" ) )
1717 level.chest_accessed = 0;
1718 chest.unbearable_respin =
true;
1719 chest.chest_user notify(
"zm_bgb_unbearable", chest );
1720 chest waittill(
"forever" );
1723 self.chest_moving =
true;
1725 level.chest_accessed = 0;
1727 level.chest_moves++;
1730 self notify(
"randomization_done" );
1734 if( IsDefined( level.chest_joker_custom_movement ) )
1736 self [[ level.chest_joker_custom_movement ]]();
1741 v_origin =
self.weapon_model.origin;
1742 self.weapon_model Delete();
1745 self.weapon_model =
Spawn(
"script_model", v_origin );
1746 self.weapon_model SetModel( level.chest_joker_model );
1747 self.weapon_model.angles =
self.angles + ( 0, 180, 0 );
1750 level notify(
"weapon_fly_away_start");
1752 if( IsDefined(
self.weapon_model ) )
1754 v_fly_away =
self.origin + ( AnglesToUp(
self.angles ) * BOX_MOVE_BEAR_FLYAWAY_DISTANCE );
1755 self.weapon_model MoveTo( v_fly_away, BOX_MOVE_BEAR_FLYAWAY_TIME, BOX_MOVE_BEAR_FLYAWAY_ACCEL );
1758 if ( IsDefined(
self.weapon_model_dw ) )
1760 v_fly_away =
self.origin + ( AnglesToUp(
self.angles ) * BOX_MOVE_BEAR_FLYAWAY_DISTANCE );
1761 self.weapon_model_dw MoveTo( v_fly_away, BOX_MOVE_BEAR_FLYAWAY_TIME, BOX_MOVE_BEAR_FLYAWAY_ACCEL );
1764 self.weapon_model waittill(
"movedone");
1765 self.weapon_model
delete();
1767 if(IsDefined(
self.weapon_model_dw))
1769 self.weapon_model_dw Delete();
1770 self.weapon_model_dw = undefined;
1773 self notify(
"box_moving" );
1774 level notify(
"weapon_fly_away_end");
1779 if(!IsDefined(respin))
1781 if(IsDefined(chest.box_hacks[
"respin"]))
1783 self [[chest.box_hacks[
"respin"]]](chest, player);
1788 if(IsDefined(chest.box_hacks[
"respin_respin"]))
1790 self [[chest.box_hacks[
"respin_respin"]]](chest, player);
1795 if(IsDefined(level.custom_magic_box_timer_til_despawn))
1797 self.weapon_model thread [[level.custom_magic_box_timer_til_despawn]]( self );
1805 if(IsDefined(
self.weapon_model_dw))
1807 if(IsDefined(level.custom_magic_box_timer_til_despawn))
1809 self.weapon_model_dw thread [[level.custom_magic_box_timer_til_despawn]]( self );
1817 self waittill(
"weapon_grabbed" );
1819 if( !chest.timedOut )
1821 if(IsDefined(
self.weapon_model))
1823 self.weapon_model Delete();
1826 if(IsDefined(
self.weapon_model_dw))
1828 self.weapon_model_dw Delete();
1835 self.weapon = level.weaponNone;
1836 self notify(
"box_spin_done");
1845 return( min_usage );
1854 players = GetPlayers();
1857 if( level.chest_moves == 0 )
1859 if( players.size == 1 )
1863 else if( players.size == 2 )
1867 else if( players.size == 3 )
1879 if( players.size == 1 )
1883 else if( players.size == 2 )
1887 else if( players.size == 3 )
1896 return( max_usage );
1902 self endon(
"kill_weapon_movement");
1905 self MoveTo(
self.origin - ( v_float * 0.85 ), putBackTime, ( putBackTime * 0.5 ) );
1906 wait( putBackTime );
1923 if (
"box_moving" != ret_val )
1932 self.last_box_weapon = GetTime();
1937 if( weapon.name ==
"ray_gun" || weapon.name ==
"raygun_mark2" )
1939 playsoundatposition(
"mus_raygun_stinger", (0,0,0) );
1947 self notify(
"zm_bgb_crate_power_used" );
1960 if( isdefined(weapon) )
1969 w_previous =
self GetCurrentWeapon();
1971 self GadgetPowerSet( 0, 99 );
1972 self SwitchToWeapon( weapon );
1973 self waittill(
"weapon_change_complete" );
1974 self SetLowReady(
true );
1975 self SwitchToWeapon( w_previous );
1977 self SetLowReady(
false );
1978 self GadgetPowerSet( 0, 100 );
1983 if( isdefined( level.magicbox_should_upgrade_weapon_override ) )
1985 return [[ level.magicbox_should_upgrade_weapon_override ]]( player, weapon );
1998 self SetZBarrierPieceState(1,
"open");
2005 self SetZBarrierPieceState(1,
"opening");
2006 while(
self GetZBarrierPieceState(1) ==
"opening")
2010 self notify(
"arrived");
2015 self SetZBarrierPieceState(1,
"closing");
2016 while(
self GetZBarrierPieceState(1) ==
"closing")
2020 self notify(
"left");
2025 self SetZBarrierPieceState(2,
"opening");
2026 while(
self GetZBarrierPieceState(2) ==
"opening")
2030 self notify(
"opened");
2035 self SetZBarrierPieceState(2,
"closing");
2036 while(
self GetZBarrierPieceState(2) ==
"closing")
2040 self notify(
"closed");
2045 self endon(
"box_hacked_respin");
2047 self SetZBarrierPieceState(3,
"closed");
2048 self SetZBarrierPieceState(4,
"closed");
2052 self ZBarrierPieceUseBoxRiseLogic(3);
2053 self ZBarrierPieceUseBoxRiseLogic(4);
2055 self ShowZBarrierPiece(3);
2056 self ShowZBarrierPiece(4);
2057 self SetZBarrierPieceState(3,
"opening");
2058 self SetZBarrierPieceState(4,
"opening");
2060 while(
self GetZBarrierPieceState(3) !=
"open")
2065 self HideZBarrierPiece(3);
2066 self HideZBarrierPiece(4);
2072 self ShowZBarrierPiece(3);
2073 self SetZBarrierPieceState(3,
"closing");
2085 if( curr_state ==
"open" || curr_state ==
"close" )
2100 for(i = 0; i <
self GetNumZBarrierPieces(); i ++)
2102 self HideZBarrierPiece(i);
2104 self notify(
"zbarrier_state_change");
2106 self [[level.magic_box_zbarrier_state_func]](state);
2114 self ShowZBarrierPiece(0);
2115 self.state =
"away";
2118 self ShowZBarrierPiece(1);
2120 self.state =
"arriving";
2123 self ShowZBarrierPiece(1);
2126 self.state =
"initial";
2129 self ShowZBarrierPiece(2);
2131 self.state =
"open";
2134 self ShowZBarrierPiece(2);
2136 self.state =
"close";
2139 self showZBarrierPiece(1);
2141 self.state =
"leaving";
2144 if( IsDefined( level.custom_magicbox_state_handler ) )
2146 self [[ level.custom_magicbox_state_handler ]]( state );
2154 level endon(
"end_game");
2156 level notify(
"mb_hostmigration");
2157 level endon(
"mb_hostmigration");
2161 level waittill(
"host_migration_end");
2163 if(!isDefined(level.chests))
2166 foreach( chest
in level.chests )
2170 if ( IsDefined( chest ) && IsDefined( chest.pandora_light ) )
2172 playfxontag(level._effect[
"lght_marker"], chest.pandora_light,
"tag_origin");
2188 foreach (player
in getPlayers())
2190 distanceFromPlayerToBox = distance(player.origin,
self.origin);