1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\system_shared;
7 #using scripts\shared\util_shared;
9 #insert scripts\shared\shared.gsh;
10 #insert scripts\shared\version.gsh;
12 #using scripts\shared\util_shared;
13 #using scripts\zm\_zm_utility;
15 #insert scripts\zm\_zm_weapons.gsh;
17 #namespace zm_weapons;
34 if ( GetMigrationStatus(localClientNum) )
37 ResetWeaponCosts( localClientNum );
42 foreach( weaponCost
in level.weapon_costs )
45 SetWeaponCosts( localClientNum, weaponCost.weapon, weaponCost.cost, weaponCost.ammo_cost, player_cost );
53 if ( !isdefined( level._included_weapons ) )
58 return IsDefined( level._included_weapons[weapon.rootWeapon] );
64 DEFAULT( n_base_non_wallbuy_cost, 750 );
65 DEFAULT( n_upgraded_non_wallbuy_cost, 5000 );
66 const N_WALLBUY_UPGRADE_COST = 4000;
68 w_root = weapon.rootweapon;
72 if(
is_wallbuy( level.zombie_weapons_upgraded[w_root] ) )
74 n_ammo_cost = N_WALLBUY_UPGRADE_COST;
78 n_ammo_cost = n_upgraded_non_wallbuy_cost;
90 n_ammo_cost = n_base_non_wallbuy_cost;
97 function include_weapon( weapon_name, display_in_box, cost, ammo_cost, upgraded=
false )
99 if ( !isdefined( level._included_weapons ) )
101 level._included_weapons = [];
104 weapon = GetWeapon( weapon_name );
105 level._included_weapons[weapon] = weapon;
108 if (!isdefined(level.weapon_costs[weapon_name]))
110 level.weapon_costs[weapon_name] = SpawnStruct();
111 level.weapon_costs[weapon_name].weapon = weapon;
113 level.weapon_costs[weapon_name].cost = cost;
114 if ( !IsDefined( ammo_cost ) || ammo_cost == 0 )
118 level.weapon_costs[weapon_name].ammo_cost = ammo_cost;
119 level.weapon_costs[weapon_name].upgraded = upgraded;
121 if ( isdefined( display_in_box ) && !display_in_box )
126 if ( !isdefined( level._resetZombieBoxWeapons ) )
128 level._resetZombieBoxWeapons =
true;
129 ResetZombieBoxWeapons();
132 if (!IsDefined(weapon.worldModel))
134 thread
util::error(
"Missing worldmodel for weapon " + weapon_name +
" (or weapon may be missing from fastfile)." );
138 AddZombieBoxWeapon( weapon, weapon.worldModel, weapon.isDualWield );
143 include_weapon( upgrade_name, display_in_box, cost, ammo_cost,
true );
145 if ( !IsDefined( level.zombie_weapons_upgraded ) )
147 level.zombie_weapons_upgraded = [];
150 weapon = GetWeapon( weapon_name );
151 upgrade = GetWeapon( upgrade_name );
152 level.zombie_weapons_upgraded[upgrade] = weapon;
157 rootWeapon = weapon.rootWeapon;
159 if ( IsDefined( level.zombie_weapons_upgraded[rootWeapon] ) )
171 spawnable_weapon_spawns = ArrayCombine( spawnable_weapon_spawns,
struct::get_array(
"bowie_upgrade",
"targetname" ),
true,
false );
172 spawnable_weapon_spawns = ArrayCombine( spawnable_weapon_spawns,
struct::get_array(
"sickle_upgrade",
"targetname" ),
true,
false );
173 spawnable_weapon_spawns = ArrayCombine( spawnable_weapon_spawns,
struct::get_array(
"tazer_upgrade",
"targetname" ),
true,
false );
174 spawnable_weapon_spawns = ArrayCombine( spawnable_weapon_spawns,
struct::get_array(
"buildable_wallbuy",
"targetname" ),
true,
false );
176 if (
IS_TRUE( level.use_autofill_wallbuy ) )
178 spawnable_weapon_spawns = ArrayCombine( spawnable_weapon_spawns, level.active_autofill_wallbuys,
true,
false );
181 if ( !
IS_TRUE( level.headshots_only ) )
183 spawnable_weapon_spawns = ArrayCombine( spawnable_weapon_spawns,
struct::get_array(
"claymore_purchase",
"targetname" ),
true,
false );
186 location = level.scr_zm_map_start_location;
187 if ( (location ==
"default" || location ==
"") && IsDefined( level.default_start_location ) )
189 location = level.default_start_location;
192 match_string = level.scr_zm_ui_gametype;
193 if (
"" != location )
195 match_string = match_string +
"_" + location;
197 match_string_plus_space =
" " + match_string;
199 for ( i = 0; i < spawnable_weapon_spawns.size; i++ )
201 spawnable_weapon = spawnable_weapon_spawns[i];
203 spawnable_weapon.weapon = GetWeapon( spawnable_weapon.zombie_weapon_upgrade );
204 if ( isDefined( spawnable_weapon.zombie_weapon_upgrade ) && spawnable_weapon.weapon.isGrenadeWeapon &&
IS_TRUE( level.headshots_only ) )
209 if ( !isdefined( spawnable_weapon.script_noteworthy ) || spawnable_weapon.script_noteworthy ==
"" )
211 spawn_list[spawn_list.size] = spawnable_weapon;
215 matches = strTok( spawnable_weapon.script_noteworthy,
"," );
217 for ( j = 0; j < matches.size; j++ )
219 if ( matches[j] == match_string || matches[j] == match_string_plus_space )
221 spawn_list[spawn_list.size] = spawnable_weapon;
228 level._active_wallbuys = [];
230 for ( i = 0; i < spawn_list.size; i++ )
232 spawn_list[i].script_label = spawn_list[i].zombie_weapon_upgrade +
"_" + spawn_list[i].origin;
234 level._active_wallbuys[spawn_list[i].script_label] = spawn_list[i];
238 if ( isdefined( level._wallbuy_override_num_bits ) )
240 numBits = level._wallbuy_override_num_bits;
245 target_struct =
struct::get( spawn_list[i].target,
"targetname" );
247 if ( spawn_list[i].targetname ==
"buildable_wallbuy" )
250 if ( IsDefined( level.buildable_wallbuy_weapons ) )
252 bits = GetMinBitCountForNum( level.buildable_wallbuy_weapons.size + 1 );
258 level
flag::set(
"weapon_wallbuys_created" );
266 w_base = w_to_check.rootWeapon;
268 foreach( s_wallbuy
in level._active_wallbuys )
270 if( s_wallbuy.weapon == w_base )
277 if ( isdefined( level._additional_wallbuy_weapons ) )
279 if ( IsInArray( level._additional_wallbuy_weapons, w_base ) )
290 keys = GetArrayKeys( level._active_wallbuys );
294 for ( i = 0; i < keys.size; i++ )
296 wallbuy = level._active_wallbuys[keys[i]];
298 fx = level._effect[
"870mcs_zm_fx"];
300 if ( isdefined( level._effect[wallbuy.zombie_weapon_upgrade +
"_fx"] ) )
302 fx = level._effect[wallbuy.zombie_weapon_upgrade +
"_fx"];
308 target_struct =
struct::get( wallbuy.target,
"targetname" );
312 target_model.parent_struct = target_struct;
314 wallbuy.models[localClientNum] = target_model;
318 function wallbuy_callback( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
322 while ( !isdefined( level._active_wallbuys ) || !isdefined( level._active_wallbuys[fieldName] ) )
328 struct = level._active_wallbuys[fieldName];
335 struct.models[localClientNum].origin =
struct.models[localClientNum].parent_struct.origin;
336 struct.models[localClientNum].angles =
struct.models[localClientNum].parent_struct.angles;
337 struct.models[localClientNum] hide();
343 if ( !isdefined(
struct.models ) )
345 while ( !isdefined(
struct.models ) )
350 while ( !isdefined(
struct.models[localClientNum] ) )
357 struct.models[localClientNum] show();
358 struct.models[localClientNum].origin =
struct.models[localClientNum].parent_struct.origin;
364 if ( localClientNum == 0 )
366 playsound( 0,
"zmb_weap_wall",
struct.origin );
369 vec_offset = (0,0,0);
371 if ( isDefined(
struct.models[localClientNum].parent_struct.script_vector ) )
373 vec_offset =
struct.models[localClientNum].parent_struct.script_vector;
376 struct.models[localClientNum].origin =
struct.models[localClientNum].parent_struct.origin + (AnglesToRight(
struct.models[localClientNum].angles + vec_offset) * 8);
377 struct.models[localClientNum] show();
378 struct.models[localClientNum] moveto(
struct.models[localClientNum].parent_struct.origin, 1 );
383 if ( isdefined( level.wallbuy_callback_hack_override ) )
385 struct.models[localClientNum] [[ level.wallbuy_callback_hack_override ]]();
393 basefield = GetSubStr( fieldName, 0, fieldName.size - 4 );
394 struct = level._active_wallbuys[basefield];
398 if ( isdefined(
struct.models[localClientNum] ) )
400 struct.models[localClientNum] hide();
403 else if ( newVal > 0 )
405 weaponname = level.buildable_wallbuy_weapons[newVal - 1];
406 weapon = GetWeapon( weaponname );
408 if ( !isdefined(
struct.models ) )
413 if ( !isdefined(
struct.models[localClientNum] ) )
415 target_struct =
struct::get(
struct.target,
"targetname" );
418 if ( isdefined( level.buildable_wallbuy_weapon_models[weaponname] ) )
420 model = level.buildable_wallbuy_weapon_models[weaponname];
423 angles = target_struct.angles;
424 if ( isdefined(level.buildable_wallbuy_weapon_angles[weaponname] ) )
426 switch ( level.buildable_wallbuy_weapon_angles[weaponname] )
428 case 90: angles = VectorToAngles( AnglesToRight( angles ) );
break;
429 case 180: angles = VectorToAngles( -AnglesToForward( angles ) );
break;
430 case 270: angles = VectorToAngles( -AnglesToRight( angles ) );
break;
436 target_model.parent_struct = target_struct;
438 struct.models[localClientNum] = target_model;
439 if ( isdefined(
struct.fx[localClientNum] ) )
441 StopFX( localClientNum,
struct.fx[localClientNum] );
442 struct.fx[localClientNum] = undefined;
445 fx = level._effect[
"870mcs_zm_fx"];
447 if ( isdefined( level._effect[weaponname +
"_fx"] ) )
449 fx = level._effect[weaponname +
"_fx"];
452 struct.fx[localClientNum] = playfx( localClientNum, fx,
struct.origin, AnglesToForward(
struct.angles ), AnglesToUp(
struct.angles ), 0.1 );
454 level notify(
"wallbuy_updated" );
468 gametype = GetDvarString(
"ui_gametype" );
470 row = TableLookupRow( table, index );
471 while ( isdefined( row ) )
480 ammo_cost = undefined;
500 if ( isdefined( upgrade_name ) )
525 row = TableLookupRow( table, index );
536 if (!isdefined(wallbuys) || wallbuys.size == 0 || !isdefined(level.wallbuy_autofill_weapons) || level.wallbuy_autofill_weapons.size == 0 )
539 level.use_autofill_wallbuy =
true;
541 array_keys[
"all"] = GetArrayKeys(level.wallbuy_autofill_weapons[
"all"]);
545 level.active_autofill_wallbuys = [];
548 foreach (wallbuy
in wallbuys)
550 weapon_class= wallbuy.script_string;
554 if (isdefined(weapon_class) && weapon_class !=
"")
557 if (!isdefined(array_keys[weapon_class]) && isdefined(level.wallbuy_autofill_weapons[weapon_class]))
558 array_keys[weapon_class] = GetArrayKeys(level.wallbuy_autofill_weapons[weapon_class]);
559 if (isdefined(array_keys[weapon_class]))
562 for (i = 0 ; i < array_keys[weapon_class].size; i ++)
564 if (level.wallbuy_autofill_weapons[
"all"][array_keys[weapon_class][i]])
566 weapon = array_keys[weapon_class][i];
568 level.wallbuy_autofill_weapons[
"all"][weapon] =
false;
580 class_all[class_all.size] = wallbuy;
586 if (!isdefined(weapon))
589 wallbuy.zombie_weapon_upgrade = weapon.name;
590 wallbuy.weapon = weapon;
593 right = AnglesToRight(wallbuy.angles);
594 wallbuy.origin -= right * 2;
596 wallbuy.target =
"autofill_wallbuy_" + index;
598 target_struct = SpawnStruct();
599 target_struct.targetname = wallbuy.target;
600 target_struct.angles = wallbuy.angles;
601 target_struct.origin = wallbuy.origin;
603 model = wallbuy.weapon.worldModel;
604 target_struct.model = model;
606 level.active_autofill_wallbuys[level.active_autofill_wallbuys.size] = wallbuy;
611 foreach (wallbuy
in class_all)
613 weapon_name = undefined;
614 for (i = 0 ; i < array_keys[
"all"].size; i ++)
616 if (level.wallbuy_autofill_weapons[
"all"][array_keys[
"all"][i]])
618 weapon = array_keys[
"all"][i];
619 level.wallbuy_autofill_weapons[
"all"][weapon] =
false;
624 if (!isdefined(weapon))
627 wallbuy.zombie_weapon_upgrade = weapon.name;
628 wallbuy.weapon = weapon;
631 right = AnglesToRight(wallbuy.angles);
632 wallbuy.origin -= right * 2;
634 wallbuy.target =
"autofill_wallbuy_" + index;
636 target_struct = SpawnStruct();
637 target_struct.targetname = wallbuy.target;
638 target_struct.angles = wallbuy.angles;
639 target_struct.origin = wallbuy.origin;
641 model = wallbuy.weapon.worldModel;
642 target_struct.model = model;
644 level.active_autofill_wallbuys[level.active_autofill_wallbuys.size] = wallbuy;