1 #using scripts\codescripts\struct;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\laststand_shared;
5 #using scripts\shared\util_shared;
6 #using scripts\shared\system_shared;
8 #insert scripts\shared\shared.gsh;
10 #using scripts\zm\_zm_audio;
11 #using scripts\zm\_zm_equipment;
12 #using scripts\zm\_zm_laststand;
13 #using scripts\zm\_zm_pers_upgrades_functions;
14 #using scripts\zm\_zm_score;
15 #using scripts\zm\_zm_utility;
16 #using scripts\zm\_zm_weapons;
18 #insert scripts\zm\_zm_utility.gsh;
20 #namespace zm_melee_weapon;
47 if ( !isdefined( level._melee_weapons ) )
49 level._melee_weapons = [];
60 function init( weapon_name, flourish_weapon_name, ballistic_weapon_name, ballistic_upgraded_weapon_name, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn )
62 weapon = GetWeapon( weapon_name );
63 flourish_weapon = GetWeapon( flourish_weapon_name );
64 ballistic_weapon = level.weaponNone;
65 if ( isdefined( ballistic_weapon_name ) )
66 ballistic_weapon = GetWeapon( ballistic_weapon_name );
67 ballistic_upgraded_weapon = level.weaponNone;
68 if ( isdefined( ballistic_upgraded_weapon_name ) )
69 ballistic_upgraded_weapon = GetWeapon( ballistic_upgraded_weapon_name );
71 add_melee_weapon( weapon, flourish_weapon, ballistic_weapon, ballistic_upgraded_weapon, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn );
73 melee_weapon_triggers = GetEntArray( wallbuy_targetname,
"targetname" );
74 for ( i = 0; i < melee_weapon_triggers.size; i++ )
76 knife_model = GetEnt( melee_weapon_triggers[i].target,
"targetname" );
77 if ( isdefined( knife_model ) )
82 melee_weapon_triggers[i] thread
melee_weapon_think( weapon, cost, flourish_fn, vo_dialog_id, flourish_weapon, ballistic_weapon, ballistic_upgraded_weapon );
84 melee_weapon_triggers[i] SetHintString( hint_string, cost );
85 cursor_hint =
"HINT_WEAPON";
86 cursor_hint_weapon = weapon;
87 melee_weapon_triggers[i] setCursorHint( cursor_hint, cursor_hint_weapon );
88 melee_weapon_triggers[i] UseTriggerRequireLookAt();
95 for ( i = 0; i < melee_weapon_structs.size; i++ )
97 prepare_stub( melee_weapon_structs[i].trigger_stub, weapon, flourish_weapon, ballistic_weapon, ballistic_upgraded_weapon, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn );
105 if ( !isDefined( level.ballistic_weapon ) )
107 level.ballistic_weapon = [];
109 level.ballistic_weapon[weapon] = ballistic_weapon;
111 if ( !isDefined( level.ballistic_upgraded_weapon ) )
113 level.ballistic_upgraded_weapon = [];
115 level.ballistic_upgraded_weapon[weapon] = ballistic_upgraded_weapon;
119 function prepare_stub( stub, weapon, flourish_weapon, ballistic_weapon, ballistic_upgraded_weapon, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn )
121 if ( isdefined( stub ) )
123 stub.hint_string = hint_string;
124 stub.cursor_hint =
"HINT_WEAPON";
125 stub.cursor_hint_weapon = weapon;
127 if (!
IS_TRUE( level.weapon_cost_client_filled ))
129 stub.hint_parm1 = cost;
131 stub.weapon = weapon;
132 stub.vo_dialog_id = vo_dialog_id;
133 stub.flourish_weapon = flourish_weapon;
134 stub.ballistic_weapon = ballistic_weapon;
135 stub.ballistic_upgraded_weapon = ballistic_upgraded_weapon;
137 stub.flourish_fn = flourish_fn;
143 melee_weapon = undefined;
144 for ( i = 0; i < level._melee_weapons.size; i++ )
146 if ( level._melee_weapons[i].weapon == weapon )
148 return level._melee_weapons[i];
157 if ( isdefined( stub ) && isdefined( melee_weapon ) )
159 prepare_stub( stub, melee_weapon.weapon, melee_weapon.flourish_weapon, melee_weapon.ballistic_weapon, melee_weapon.ballistic_upgraded_weapon,
160 melee_weapon.cost, melee_weapon.wallbuy_targetname, melee_weapon.hint_string, melee_weapon.vo_dialog_id,
161 melee_weapon.flourish_fn );
165 function add_melee_weapon( weapon, flourish_weapon, ballistic_weapon, ballistic_upgraded_weapon, cost, wallbuy_targetname, hint_string, vo_dialog_id, flourish_fn )
167 melee_weapon = SpawnStruct();
168 melee_weapon.weapon = weapon;
169 melee_weapon.flourish_weapon = flourish_weapon;
170 melee_weapon.ballistic_weapon = ballistic_weapon;
171 melee_weapon.ballistic_upgraded_weapon = ballistic_upgraded_weapon;
172 melee_weapon.cost = cost;
173 melee_weapon.wallbuy_targetname = wallbuy_targetname;
174 melee_weapon.hint_string = hint_string;
175 melee_weapon.vo_dialog_id = vo_dialog_id;
176 melee_weapon.flourish_fn = flourish_fn;
178 if ( !isdefined( level._melee_weapons ) )
180 level._melee_weapons = [];
182 level._melee_weapons[level._melee_weapons.size] = melee_weapon;
188 if ( isdefined( melee_weapon ) )
190 melee_weapon.fallback_weapon = GetWeapon( fallback_weapon_name );
196 fallback_weapon = level.weaponZMFists;
200 if ( isdefined(melee_weapon) && isdefined(melee_weapon.fallback_weapon) )
202 return melee_weapon.fallback_weapon;
205 return fallback_weapon;
211 had_weapon =
self HasWeapon( fallback_weapon );
212 self GiveWeapon( fallback_weapon );
213 if( immediate && had_weapon )
215 self SwitchToWeaponImmediate( fallback_weapon );
219 self SwitchToWeapon( fallback_weapon );
226 had_weapon =
self HasWeapon( fallback_weapon );
233 if (
IS_TRUE( level._allow_melee_weapon_switching ) )
249 for ( i = 0; i < level._melee_weapons.size; i++ )
251 self spectator_respawn( level._melee_weapons[i].wallbuy_targetname, level._melee_weapons[i].weapon );
257 melee_triggers = GetEntArray( wallbuy_targetname,
"targetname" );
259 players = GetPlayers();
260 for ( i = 0; i < melee_triggers.size; i++ )
262 melee_triggers[i] SetVisibleToAll();
263 if ( !
IS_TRUE( level._allow_melee_weapon_switching ) )
265 for ( j = 0; j < players.size; j++ )
269 melee_triggers[i] SetInvisibleToPlayer( players[j] );
279 for ( i = 0; i < level._melee_weapons.size; i++ )
281 self trigger_hide( level._melee_weapons[i].wallbuy_targetname );
287 melee_triggers = GetEntArray( wallbuy_targetname,
"targetname" );
289 for ( i = 0; i < melee_triggers.size; i++ )
291 melee_triggers[i] SetInvisibleToPlayer(
self );
297 primaryWeapons =
self GetWeaponsListPrimaries();
299 for ( i = 0; i < primaryweapons.size; i++ )
301 if ( primaryWeapons[i].isBallisticKnife )
312 primaryWeapons =
self GetWeaponsListPrimaries();
314 for ( i = 0; i < primaryweapons.size; i++ )
328 if ( IsDefined( current_melee_weapon ) )
330 if ( upgraded && IsDefined( level.ballistic_upgraded_weapon ) && IsDefined( level.ballistic_upgraded_weapon[current_melee_weapon] ) )
332 weapon = level.ballistic_upgraded_weapon[current_melee_weapon];
334 if ( !upgraded && IsDefined( level.ballistic_weapon ) && IsDefined( level.ballistic_weapon[current_melee_weapon] ) )
336 weapon = level.ballistic_weapon[current_melee_weapon];
348 if ( current_melee_weapon != level.weaponNone && current_melee_weapon != weapon )
350 self TakeWeapon( current_melee_weapon );
355 had_ballistic_upgraded = 0;
356 ballistic_was_primary = 0;
358 primaryWeapons =
self GetWeaponsListPrimaries();
360 for ( i = 0; i < primaryweapons.size; i++ )
362 primary_weapon = primaryweapons[i];
363 if ( primary_weapon.isBallisticKnife )
366 if ( primary_weapon == current_weapon )
368 ballistic_was_primary = 1;
371 self notify(
"zmb_lost_knife" );
372 self TakeWeapon( primary_weapon );
375 had_ballistic_upgraded = 1;
383 if ( had_ballistic_upgraded )
385 new_ballistic = level.ballistic_upgraded_weapon[weapon];
386 if ( ballistic_was_primary )
388 current_weapon = new_ballistic;
395 new_ballistic = level.ballistic_weapon[weapon];
396 if ( ballistic_was_primary )
398 current_weapon = new_ballistic;
401 self GiveWeapon( new_ballistic, 0 );
405 if ( had_fallback_weapon )
410 return current_weapon;
415 function melee_weapon_think( weapon, cost, flourish_fn, vo_dialog_id, flourish_weapon, ballistic_weapon, ballistic_upgraded_weapon )
417 self.first_time_triggered =
false;
418 if ( isdefined(
self.stub ) )
420 self endon(
"kill_trigger" );
421 if ( isdefined(
self.stub.first_time_triggered ) )
423 self.first_time_triggered =
self.stub.first_time_triggered;
426 weapon =
self.stub.weapon;
427 cost =
self.stub.cost;
428 flourish_fn =
self.stub.flourish_fn;
429 vo_dialog_id =
self.stub.vo_dialog_id;
430 flourish_weapon =
self.stub.flourish_weapon;
431 ballistic_weapon =
self.stub.ballistic_weapon;
432 ballistic_upgraded_weapon =
self.stub.ballistic_upgraded_weapon;
434 players = GetPlayers();
436 if ( !
IS_TRUE( level._allow_melee_weapon_switching ) )
438 for ( i = 0; i < players.size; i++ )
442 self SetInvisibleToPlayer( players[i] );
451 self waittill(
"trigger", player );
466 if ( player isThrowingGrenade() )
478 player_has_weapon = player HasWeapon( weapon );
485 if ( player isSwitchingWeapons() )
491 current_weapon = player GetCurrentWeapon();
504 if ( IsDefined(player.check_override_melee_wallbuy_purchase) )
506 if ( player [[player.check_override_melee_wallbuy_purchase]]( vo_dialog_id, flourish_weapon, weapon, ballistic_weapon, ballistic_upgraded_weapon, flourish_fn,
self ) )
512 if ( !player_has_weapon )
514 cost =
self.stub.cost;
519 if (
self.first_time_triggered ==
false )
521 model = getent(
self.target,
"targetname" );
523 if ( isdefined( model ) )
527 else if ( isdefined(
self.clientFieldName ) )
532 self.first_time_triggered =
true;
533 if ( isdefined(
self.stub ) )
535 self.stub.first_time_triggered =
true;
542 player thread
give_melee_weapon( vo_dialog_id, flourish_weapon, weapon, ballistic_weapon, ballistic_upgraded_weapon, flourish_fn,
self );
552 if ( !
IS_TRUE( level._allow_melee_weapon_switching ) )
554 self SetInvisibleToPlayer( player );
562 player_angles = VectorToAngles( player.origin -
self.origin );
564 player_yaw = player_angles[1];
565 weapon_yaw =
self.angles[1];
567 yaw_diff = AngleClamp180( player_yaw - weapon_yaw );
571 yaw = weapon_yaw - 90;
575 yaw = weapon_yaw + 90;
578 self.og_origin =
self.origin;
579 self.origin =
self.origin + ( AnglesToForward( (0, yaw, 0) ) * 8 );
587 self MoveTo(
self.og_origin, time );
592 weapon = GetWeapon( weapon_name );
594 if ( isdefined( melee_weapon ) )
596 self give_melee_weapon( melee_weapon.vo_dialog_id, melee_weapon.flourish_weapon, melee_weapon.weapon, melee_weapon.ballistic_weapon, melee_weapon.ballistic_upgraded_weapon, melee_weapon.flourish_fn, undefined );
600 function give_melee_weapon( vo_dialog_id, flourish_weapon, weapon, ballistic_weapon, ballistic_upgraded_weapon, flourish_fn, trigger )
602 if ( isdefined( flourish_fn ) )
604 self thread [[flourish_fn]]();
610 self util::waittill_any(
"fake_death",
"death",
"player_downed",
"weapon_change_complete" );
621 if ( !
IS_TRUE( level._allow_melee_weapon_switching) )
623 if ( IsDefined( trigger ) )
625 trigger SetInvisibleToPlayer(
self );
638 original_weapon =
self GetCurrentWeapon();
639 weapon = flourish_weapon;
642 self SwitchToWeapon( weapon );
644 return original_weapon;
649 Assert( !original_weapon.isPerkBottle );
650 Assert( original_weapon != level.weaponReviveTool );
658 self TakeWeapon( weapon );
659 self.lastActiveWeapon = level.weaponNone;
663 self TakeWeapon( flourish_weapon );
668 if (
self HasWeapon( level.weaponBaseMelee ) )
670 self TakeWeapon( level.weaponBaseMelee );
678 else if ( original_weapon == level.weaponBaseMelee )
680 self SwitchToWeapon( weapon );
695 self waittill(
"weapon_change_complete" );