1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\flagsys_shared;
8 #using scripts\shared\system_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\visionset_mgr_shared;
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\version.gsh;
14 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
16 #using scripts\shared\ai\zombie_utility;
18 #using scripts\zm\_util;
19 #using scripts\zm\_zm_audio;
20 #using scripts\zm\_zm_devgui;
21 #using scripts\zm\_zm_equipment;
22 #using scripts\zm\_zm_laststand;
23 #using scripts\zm\_zm_spawner;
24 #using scripts\zm\_zm_stats;
25 #using scripts\zm\_zm_unitrigger;
26 #using scripts\zm\_zm_utility;
27 #using scripts\zm\_zm_weapons;
28 #using scripts\zm\_zm_weap_riotshield;
30 #using scripts\zm\craftables\_zm_craft_shield;
32 #insert scripts\zm\_zm_buildables.gsh;
33 #insert scripts\zm\_zm_utility.gsh;
35 #define HINT_ICON "riotshield_zm_icon"
36 #define GROUND_LEVEL 0
38 #precache( "material", HINT_ICON );
39 #precache( "string", "ZOMBIE_EQUIP_RIOTSHIELD_PICKUP_HINT_STRING" );
40 #precache( "triggerstring", "ZOMBIE_PICKUP_BOTTLE" );
42 #namespace rocketshield;
47 #define ROCKETSHIELD_NAME "craft_shield_zm"
48 #define ROCKETSHIELD_WEAPON "zod_riotshield"
49 #define ROCKETSHIELD_WEAPON_UPGRADED "zod_riotshield_upgraded"
50 #define ROCKETSHIELD_MODEL "wpn_t7_zmb_zod_rocket_shield_world"
52 #define MODEL_SHIELD_RECHARGE "p7_zm_zod_nitrous_tank"
53 #precache( "model", MODEL_SHIELD_RECHARGE );
55 #define ROCKETSHIELD_REFILL_ON_MAX_AMMO true
84 SetDvar(
"juke_enabled", 1 );
107 #define ROCKET_SHIELD_HINT_TEXT &"ZOMBIE_ROCKET_HINT"
108 #define ROCKET_SHIELD_HINT_TIMER 5
113 self endon(
"disconnect");
114 while ( IsDefined(
self) )
116 self waittill (
"weapon_change", newWeapon );
117 if ( newWeapon.isriotshield )
120 self.rocket_shield_hint_shown=1;
136 self notify(
"player_watch_ammo_change");
137 self endon(
"player_watch_ammo_change");
141 self waittill(
"equipment_ammo_changed", equipment );
142 if ( IsString(equipment) )
143 equipment = GetWeapon(equipment);
153 self notify(
"player_watch_max_ammo");
154 self endon(
"player_watch_max_ammo");
158 self waittill(
"zmb_max_ammo" );
172 if ( IsDefined(
self) )
174 ammo =
self getWeaponAmmoClip( weapon );
182 self notify(
"player_watch_upgraded_pickup_from_table");
183 self endon(
"player_watch_upgraded_pickup_from_table");
186 str_wpn_name = level.weaponRiotshield.name;
187 str_notify = str_wpn_name +
"_pickup_from_table";
191 self waittill( str_notify );
192 if (
IS_TRUE(
self.b_has_upgraded_shield ) )
202 shieldDamage = iDamage;
205 shieldDamage += iDamage * 2;
216 self notify(
"player_watch_shield_juke");
217 self endon(
"player_watch_shield_juke");
221 self waittill(
"weapon_melee_juke", weapon );
222 if ( weapon.isriotshield )
224 self DisableOffhandWeapons();
225 self playsound(
"zmb_rocketshield_start" );
227 self playsound(
"zmb_rocketshield_end" );
228 self EnableOffhandWeapons();
230 self notify(
"shield_juke_done" );
235 #define RS_JUKE_MELEE_DAMAGE_RADIUS (12*5)
236 #define RS_JUKE_MELEE_DAMAGE_AMOUNT 5000
240 self endon(
"weapon_melee" );
241 self endon(
"weapon_melee_power" );
242 self endon(
"weapon_melee_charge" );
244 start_time = GetTime();
246 DEFAULT(level.riotshield_knockdown_enemies,[]);
247 DEFAULT(level.riotshield_knockdown_gib,[]);
248 DEFAULT(level.riotshield_fling_enemies,[]);
249 DEFAULT(level.riotshield_fling_vecs,[]);
251 while( start_time + 3000 > GetTime() )
253 self PlayRumbleOnEntity(
"zod_shield_juke" );
254 forward = AnglesToForward(
self GetPlayerAngles());
258 if ( isdefined( level.riotshield_melee_juke_callback ) && IsFunctionPtr( level.riotshield_melee_juke_callback ) )
260 [[ level.riotshield_melee_juke_callback ]]( enemies );
263 foreach( zombie
in enemies )
265 self playsound(
"zmb_rocketshield_imp" );
267 shield_damage += level.zombie_vars[
"riotshield_juke_damage_shield"];
273 level.riotshield_knockdown_enemies = [];
274 level.riotshield_knockdown_gib = [];
275 level.riotshield_fling_enemies = [];
276 level.riotshield_fling_vecs = [];
284 #define RIOTSHIELD_JUKE_DISTANCE (10 * 12)
285 #define RIOTSHIELD_JUKE_KILL_HALFWIDTH (3 * 12)
286 #define RIOTSHIELD_JUKE_KILL_HALFWIDTH_SQ (RIOTSHIELD_JUKE_KILL_HALFWIDTH * RIOTSHIELD_JUKE_KILL_HALFWIDTH)
287 #define RIOTSHIELD_JUKE_KILL_VERT_LIMIT (6 * 12)
291 view_pos =
self.origin;
292 zombies = array::get_all_closest( view_pos, GetAITeamArray( level.zombie_team ), undefined, undefined,
RIOTSHIELD_JUKE_DISTANCE );
293 if ( !isDefined( zombies ) )
298 forward = AnglesToForward(
self GetPlayerAngles());
299 up = AnglesToUp(
self GetPlayerAngles());
303 fling_force = level.zombie_vars[
"riotshield_fling_force_juke"];
304 fling_force_vlo = fling_force * 0.5;
305 fling_force_vhi = fling_force * 0.6;
309 for ( i = 0; i < zombies.size; i++ )
311 if ( !IsDefined( zombies[i] ) || !IsAlive( zombies[i] ) )
322 test_origin = zombies[i] getcentroid();
324 radial_origin = PointOnSegmentNearestToPoint( segment_start, segment_end, test_origin );
325 lateral = test_origin - radial_origin;
330 lateral = (lateral[0],lateral[1],0);
331 len = Length(lateral);
337 lateral = (lateral[0],lateral[1],0);
338 zombies[i].fling_vec = fling_force * forward + randomfloatrange(fling_force_vlo,fling_force_vhi) * up;
341 enemies[enemies.size] = zombies[i];
352 #define MIN_CHARGES_IN_LEVEL 3
362 foreach ( e_spawnpoint
in a_e_spawnpoints )
364 if (
IS_TRUE( e_spawnpoint.spawned ) )
370 foreach ( e_spawnpoint
in a_e_spawnpoints )
372 if ( n_spawned < n_charges )
374 if ( !
IS_TRUE( e_spawnpoint.spawned ) )
386 level waittill(
"start_of_round" );
396 s_struct = SpawnStruct();
397 s_struct.origin = v_origin;
398 s_struct.angles = v_angles;
405 unitrigger_stub = SpawnStruct();
406 unitrigger_stub.origin = v_origin;
407 unitrigger_stub.angles = v_angles;
408 unitrigger_stub.script_unitrigger_type =
"unitrigger_box_use";
409 unitrigger_stub.cursor_hint =
"HINT_NOICON";
410 unitrigger_stub.script_width = width;
411 unitrigger_stub.script_height = height;
412 unitrigger_stub.script_length = length;
413 unitrigger_stub.require_look_at =
false;
416 unitrigger_stub.mdl_shield_recharge =
Spawn(
"script_model", v_origin );
418 if ( isdefined( s_struct.model ) && IsString( s_struct.model ) )
419 modelname = s_struct.model;
420 unitrigger_stub.mdl_shield_recharge SetModel( modelname );
421 unitrigger_stub.mdl_shield_recharge.angles = v_angles;
423 s_struct.spawned =
true;
424 unitrigger_stub.shield_recharge_spawnpoint = s_struct;
429 return unitrigger_stub;
435 self SetHintString( &
"ZOMBIE_PICKUP_BOTTLE" );
440 if ( !(
IS_TRUE(player.hasRiotShield) ) || ( ( player GetAmmoCount( player.weaponRiotshield ) ) == player.weaponRiotshield.maxammo ) )
448 self setInvisibleToPlayer( player, b_is_invis );
458 self waittill(
"trigger", player );
483 trig_stub notify(
"bottle_collected" );
485 if (
IS_TRUE(player.hasRiotShield) )
490 v_origin = trig_stub.mdl_shield_recharge.origin;
491 v_angles = trig_stub.mdl_shield_recharge.angles;
493 trig_stub.mdl_shield_recharge Delete();
498 trig_stub.shield_recharge_spawnpoint.spawned = undefined;