1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\laststand_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\visionset_mgr_shared;
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\version.gsh;
14 #using scripts\shared\ai\zombie_utility;
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_laststand;
21 #using scripts\zm\_zm_melee_weapon;
22 #using scripts\zm\_zm_net;
23 #using scripts\zm\_zm_perks;
24 #using scripts\zm\_zm_pers_upgrades;
25 #using scripts\zm\_zm_pers_upgrades_functions;
26 #using scripts\zm\_zm_pers_upgrades_system;
27 #using scripts\zm\_zm_powerups;
28 #using scripts\zm\_zm_score;
29 #using scripts\zm\_zm_spawner;
30 #using scripts\zm\_zm_stats;
31 #using scripts\zm\_zm_utility;
32 #using scripts\zm\_zm_weapons;
34 #using scripts\zm\_zm_powerup_ww_grenade;
36 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
37 #insert scripts\zm\_zm_perks.gsh;
38 #insert scripts\zm\_zm_utility.gsh;
39 #insert scripts\zm\_zm_perk_widows_wine.gsh;
41 #namespace zm_perk_widows_wine;
43 #precache( "material", WIDOWS_WINE_SHADER );
44 #precache( "string", "ZOMBIE_PERK_WIDOWS_WINE" );
45 #precache( "fx", WIDOWS_WINE_FX_FILE_MACHINE_LIGHT );
46 #precache( "fx", WIDOWS_WINE_FX_FILE_WRAP );
71 if(
IS_TRUE( level.custom_widows_wine_perk_threads ) )
73 level thread [[ level.custom_widows_wine_perk_threads ]]();
83 if( isdefined(level.widows_wine_precache_override_func) )
85 [[ level.widows_wine_precache_override_func ]]();
114 use_trigger.script_sound =
"mus_perks_widow_jingle";
115 use_trigger.script_string =
"widowswine_perk";
116 use_trigger.script_label =
"mus_perks_widow_sting";
117 use_trigger.target =
"vending_widowswine";
118 perk_machine.script_string =
"widowswine_perk";
119 perk_machine.targetname =
"vending_widowswine";
121 if( isdefined( bump_trigger ) )
123 bump_trigger.script_string =
"widowswine_perk";
165 self TakeWeapon(
self.w_widows_wine_prev_grenade );
168 self GiveWeapon( level.w_widows_wine_grenade );
173 if ( isdefined(
self.widows_wine_knife_override ) )
175 self [[
self.widows_wine_knife_override]]();
180 self TakeWeapon(
self.w_widows_wine_prev_knife );
182 if(
self.w_widows_wine_prev_knife.name ==
"bowie_knife" )
185 self GiveWeapon( level.w_widows_wine_bowie_knife );
188 else if(
self.w_widows_wine_prev_knife.name ==
"sickle_knife" )
191 self GiveWeapon( level.w_widows_wine_sickle_knife );
197 self GiveWeapon( level.w_widows_wine_knife );
213 self MagicGrenadeType(
self.current_lethal_grenade,
self.origin + ( 0, 0, 48 ), ( 0, 0, 0 ), 0.0 );
214 self setWeaponAmmoClip(
self.current_lethal_grenade,
self getWeaponAmmoClip(
self.current_lethal_grenade ) - 1 );
218 #define WW_MELEE_COCOON_CHANCE 0.50
221 function widows_wine_zombie_damage_response( str_mod, str_hit_location, v_hit_origin, e_player, n_amount, w_weapon, direction_vec, tagName, modelName, partName, dFlags, inflictor, chargeLevel )
223 if ( ( isdefined(
self.damageweapon ) &&
self.damageweapon == level.w_widows_wine_grenade ) ||
231 n_dist_sq = DistanceSquared(
self.origin, v_hit_origin );
244 if ( !
IS_TRUE(
self.no_damage_points ) && IsDefined(e_player) )
246 damage_type =
"damage";
258 function widows_wine_vehicle_damage_response( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )
260 if ( isdefined( weapon ) && weapon == level.w_widows_wine_grenade && !
IS_TRUE(
self.b_widows_wine_cocoon ) )
269 if ( !
IS_TRUE(
self.no_damage_points ) && IsDefined(eAttacker) )
271 damage_type =
"damage";
284 if ( sWeapon == level.w_widows_wine_grenade )
294 if (
self.current_lethal_grenade == level.w_widows_wine_grenade
298 if ( ( sMeansOfDeath ==
"MOD_MELEE" && IsAI(eAttacker) ) ||
299 ( sMeansOfDeath ==
"MOD_EXPLOSIVE" && IsVehicle( eAttacker ) ) )
307 #define WW_POWERUP_DROP_CHANCE_WEBBING 0.15
308 #define WW_POWERUP_DROP_CHANCE_NORMAL 0.20
309 #define WW_POWERUP_DROP_CHANCE_MELEE 0.25
313 if ( (
IS_TRUE(
self.b_widows_wine_cocoon ) ||
IS_TRUE(
self.b_widows_wine_slow ) ) && !
IS_TRUE(
self.b_widows_wine_no_powerup ) )
315 if ( IsDefined(
self.attacker) && IsPlayer(
self.attacker) &&
self.attacker HasPerk(
PERK_WIDOWS_WINE ) )
318 if ( isdefined(
self.damageweapon ) &&
self.damageweapon == level.w_widows_wine_grenade )
322 else if ( isdefined(
self.damageweapon ) && (
self.damageweapon == level.w_widows_wine_knife ||
self.damageweapon == level.w_widows_wine_bowie_knife ||
self.damageweapon == level.w_widows_wine_sickle_knife ) )
326 if ( RandomFloat( 1.0 ) <= chance )
328 self.no_powerups =
true;
331 level._powerup_timeout_override = undefined;
340 self endon(
"powerup_grabbed" );
341 self endon(
"death" );
342 self endon(
"powerup_reset");
347 if (isDefined( level._powerup_timeout_custom_time ) )
349 time = [[level._powerup_timeout_custom_time]](
self);
360 for ( i = 20; i > 0; i-- )
390 self notify(
"powerup_timedout" );
395 #define WIDOWS_WINE_COCOON_MAX_SCORE 10
396 #define WIDOWS_WINE_SLOW_MAX_SCORE 6
400 self notify(
"widows_wine_cocoon_zombie_score" );
401 self endon(
"widows_wine_cocoon_zombie_score" );
402 self endon(
"death" );
405 start_time = GetTime();
406 end_time = start_time + (duration * 1000);
407 while( GetTime() < end_time &&
self.ww_points_given < max_score )
410 wait duration / max_score;
420 self notify(
"widows_wine_cocoon" );
422 self endon(
"widows_wine_cocoon" );
424 if (
IS_TRUE(
self.kill_on_wine_coccon ) )
429 if ( !
IS_TRUE(
self.b_widows_wine_cocoon ) )
431 self.b_widows_wine_cocoon =
true;
432 self.e_widows_wine_player = e_player;
434 if( isdefined(
self.widows_wine_cocoon_fraction_rate) )
436 widows_wine_cocoon_fraction_rate =
self.widows_wine_cocoon_fraction_rate;
443 self ASMSetAnimationRate( widows_wine_cocoon_fraction_rate );
448 if ( IsDefined(e_player) )
455 if (!IsDefined(
self))
458 self ASMSetAnimationRate( 1.0 );
461 if ( IsAlive(
self ) )
463 self.b_widows_wine_cocoon =
false;
473 self notify(
"widows_wine_slow" );
475 self endon(
"widows_wine_slow" );
477 if (
IS_TRUE(
self.b_widows_wine_cocoon ) )
484 if ( IsDefined(e_player) )
489 if ( !
IS_TRUE(
self.b_widows_wine_slow ) )
491 if( isdefined(
self.widows_wine_slow_fraction_rate) )
493 widows_wine_slow_fraction_rate =
self.widows_wine_slow_fraction_rate;
500 self.b_widows_wine_slow =
true;
501 self ASMSetAnimationRate( widows_wine_slow_fraction_rate );
506 if (!IsDefined(
self))
509 self ASMSetAnimationRate( 1.0 );
512 if ( IsAlive(
self ) )
514 self.b_widows_wine_slow =
false;
521 self endon(
"death" );
523 self waittill(
"grenade_stuck", e_grenade );
525 e_grenade Detonate();
531 self endon(
"disconnect" );
532 self endon(
"stop_widows_wine" );
536 self waittill(
"grenade_fire", e_grenade );
544 self endon(
"explode" );
546 self waittill(
"grenade_bounce", pos, normal,
e_target );
560 self endon(
"death" );
562 self.b_widows_wine_cocoon =
true;
564 if( IsDefined(
self.archetype ) )
574 self DoDamage(
self.health + 1000,
self.origin, attacker, undefined,
"none",
"MOD_EXPLOSIVE", 0, weapon );
580 self DoDamage(
self.maxhealth,
self.origin );
592 self notify(
"stop_widows_wine" );
593 self endon(
"death" );
597 self waittill(
"player_revived" );
606 self.check_override_wallbuy_purchase = undefined;
608 self TakeWeapon( level.w_widows_wine_grenade );
609 if ( isdefined(
self.w_widows_wine_prev_grenade ) )
612 self.lsgsar_lethal =
self.w_widows_wine_prev_grenade;
613 self GiveWeapon(
self.w_widows_wine_prev_grenade );
621 self GiveStartAmmo( grenade );
624 if( isdefined(
self.current_melee_weapon ) && !IsSubStr(
self.current_melee_weapon.name,
"widows_wine" ) )
626 self.w_widows_wine_prev_knife =
self.current_melee_weapon;
628 else if(
self.w_widows_wine_prev_knife.name ==
"bowie_knife" )
630 self TakeWeapon( level.w_widows_wine_bowie_knife );
632 else if(
self.w_widows_wine_prev_knife.name ==
"sickle_knife" )
634 self TakeWeapon( level.w_widows_wine_sickle_knife );
638 self TakeWeapon( level.w_widows_wine_knife );
641 if ( isdefined(
self.w_widows_wine_prev_knife ) )
643 self GiveWeapon(
self.w_widows_wine_prev_knife );
658 if ( isdefined( level.custom_generic_deny_vo_func ) )
660 self [[level.custom_generic_deny_vo_func]]();
677 if (
self.w_widows_wine_prev_knife != weapon )
679 cost = wallbuy.stub.cost;
683 if ( wallbuy.first_time_triggered ==
false )
685 model = getent( wallbuy.target,
"targetname" );
687 if ( isdefined( model ) )
691 else if ( isdefined( wallbuy.clientFieldName ) )
696 wallbuy.first_time_triggered =
true;
697 if ( isdefined( wallbuy.stub ) )
699 wallbuy.stub.first_time_triggered =
true;
707 assert( weapon.name ==
"bowie_knife" || weapon.name ==
"sickle_knife" );
708 self.w_widows_wine_prev_knife = weapon;
709 if(
self.w_widows_wine_prev_knife.name ==
"bowie_knife" )
713 else if(
self.w_widows_wine_prev_knife.name ==
"sickle_knife" )