1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\killstreaks_shared;
6 #using scripts\shared\scoreevents_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\version.gsh;
13 #precache( "fx", "_t6/weapon/riotshield/fx_riotshield_depoly_lights" );
14 #precache( "fx", "_t6/weapon/riotshield/fx_riotshield_depoly_dust" );
16 #using_animtree ( "mp_riotshield" );
18 #namespace riotshield;
22 if ( !isdefined( level.weaponRiotshield ) )
24 level.weaponRiotshield = GetWeapon(
"riotshield" );
27 level.deployedShieldModel =
"t6_wpn_shield_carry_world";
28 level.stowedShieldModel =
"t6_wpn_shield_stow_world";
29 level.carriedShieldModel =
"t6_wpn_shield_carry_world";
30 level.detectShieldModel =
"t6_wpn_shield_carry_world_detect";
32 level.riotshieldDestroyAnim = %o_riot_stand_destroyed;
33 level.riotshieldDeployAnim = %o_riot_stand_deploy;
35 level.riotshieldShotAnimFront = %o_riot_stand_shot;
36 level.riotshieldShotAnimBack = %o_riot_stand_shot_back;
38 level.riotshieldMeleeAnimFront = %o_riot_stand_melee_front;
39 level.riotshieldMeleeAnimBack = %o_riot_stand_melee_back;
41 level.riotshield_placement_zoffset = 26;
63 self endon (
"death" );
64 self endon (
"disconnect" );
65 self endon (
"track_riot_shield" );
67 self waittill(
"changed_class" );
69 if (( level.inGracePeriod && !
self.hasDoneCombat ))
71 self ClearStowedWeapon();
72 self RefreshShieldAttachment();
83 self endon (
"death" );
84 self endon (
"disconnect" );
85 self endon (
"track_riot_shield" );
87 self notify(
"watch_riotshield_pickup" );
88 self endon(
"watch_riotshield_pickup" );
93 self waittill(
"pickup_riotshield" );
94 self endon(
"weapon_change" );
96 /#println(
"Picked up riotshield, expecting weapon_change notify..." );#/
100 /#println(
"picked up shield but didn't change weapons, attach it!" );#/
102 currentWeapon =
self getCurrentWeapon();
103 self.hasRiotShield =
self HasRiotShield();
104 self.hasRiotShieldEquipped = ( currentWeapon.isRiotshield );
106 self RefreshShieldAttachment();
111 self endon(
"death" );
112 self endon(
"disconnect" );
114 self notify (
"track_riot_shield" );
115 self endon (
"track_riot_shield" );
119 self waittill(
"weapon_change", newWeapon );
121 self RefreshShieldAttachment();
123 currentWeapon =
self getCurrentWeapon();
124 self.hasRiotShield =
self HasRiotShield();
125 self.hasRiotShieldEquipped = ( currentWeapon.isRiotshield );
126 self.lastNonShieldWeapon = level.weaponNone;
131 currentWeapon =
self getCurrentWeapon();
133 currentWeapon =
self getCurrentWeapon();
134 self.hasRiotShield =
self HasRiotShield();
135 self.hasRiotShieldEquipped = ( currentWeapon.isRiotshield );
137 refresh_attach =
false;
139 self waittill(
"weapon_change", newWeapon );
141 if ( newWeapon.isRiotShield )
143 refresh_attach =
true;
146 if ( isdefined(
self.riotshieldEntity ))
148 self notify(
"destroy_riotshield" );
151 if (
self.hasRiotShield )
153 if ( isdefined(
self.riotshieldTakeWeapon ))
155 self TakeWeapon(
self.riotshieldTakeWeapon );
156 self.riotshieldTakeWeapon = undefined;
162 self.lastNonShieldWeapon = currentWeapon;
166 if (
self.hasRiotShield || ( refresh_attach ==
true ))
168 self RefreshShieldAttachment();
178 if( weapon.isCarriedKillstreak )
181 if( weapon.isGameplayWeapon )
184 if( weapon == level.weaponNone )
187 if ( weapon.isEquipment )
199 self notify(
"start_riotshield_deploy" );
209 if ( !isdefined(
self ) )
212 self SetInvisibleToAll();
213 self SetForceNoCull();
215 if ( !isdefined( owner ) )
218 for ( i = 0 ; i < level.players.size ; i++ )
220 if( level.players[i] HasPerk(
"specialty_showenemyequipment" ) )
222 if ( level.players[i].team ==
"spectator" )
227 if ( level.teamBased )
229 if ( level.players[i].team == owner.team )
234 if ( level.players[i] == owner )
240 self SetVisibleToPlayer( level.players[i] );
252 self endon(
"death" );
256 level waittill( eventName, newOwner );
257 if( isdefined( newOwner ) )
271 if ( !isdefined(
self ) )
274 reconModel =
spawn(
"script_model",
self.origin );
275 reconModel.angles =
self.angles;
276 reconModel SetModel( modelName );
277 reconModel.model_name = modelName;
278 reconModel linkto(
self );
279 reconModel SetContents( 0 );
285 self.reconModel = reconModel;
294 shield_ent =
spawn(
"script_model", origin, 1 );
295 shield_ent.targetname =
"riotshield_mp";
296 shield_ent.angles = angles;
297 shield_ent SetModel( level.deployedShieldModel );
298 shield_ent SetOwner(
self );
299 shield_ent.owner =
self;
300 shield_ent.team =
self.team;
301 shield_ent SetTeam(
self.team );
305 shield_ent UseAnimTree( #animtree );
306 shield_ent SetScriptMoverFlag( 0 );
308 shield_ent DisconnectPaths();
319 self endon(
"death" );
320 self endon(
"disconnect" );
321 self endon(
"start_riotshield_deploy" );
323 self waittill(
"deploy_riotshield", deploy_attempt, weapon );
324 self SetPlacementHint( 1 );
326 placement_hint =
false;
328 if ( deploy_attempt )
330 placement =
self CanPlaceRiotshield(
"deploy_riotshield" );
332 if ( placement[
"result"] )
334 self.hasDoneCombat =
true;
336 zoffset = level.riotshield_placement_zoffset;
339 item_ent = DeployRiotShield(
self, shield_ent );
341 primaries =
self GetWeaponsListPrimaries();
344 assert( isdefined( item_ent ));
345 assert( !isdefined(
self.riotshieldRetrieveTrigger ));
346 assert( !isdefined(
self.riotshieldEntity ));
347 if ( level.gameType !=
"shrp" )
349 assert( primaries.size > 0 );
356 if ( level.gameType !=
"shrp" )
358 if(
self.lastNonShieldWeapon != level.weaponNone &&
self hasWeapon(
self.lastNonShieldWeapon ) )
359 self SwitchToWeapon(
self.lastNonShieldWeapon );
361 self SwitchToWeapon( primaries[0] );
364 if ( !
self HasWeapon( level.weaponBaseMeleeHeld ))
366 self GiveWeapon( level.weaponBaseMeleeHeld );
367 self.riotshieldTakeWeapon = level.weaponBaseMeleeHeld;
370 self.riotshieldRetrieveTrigger = item_ent;
371 self.riotshieldEntity = shield_ent;
379 level notify(
"riotshield_planted",
self );
383 placement_hint =
true;
385 clip_max_ammo = weapon.clipSize;
386 self setWeaponAmmoClip( weapon, clip_max_ammo );
392 placement_hint =
true;
395 if ( placement_hint )
397 self SetRiotshieldFailHint();
410 assert ( isdefined( origin ));
413 min_dist_squared = GetDvarFloat(
"riotshield_deploy_limit_radius" );
414 min_dist_squared *= min_dist_squared;
416 for ( i = 0; i < level.players.size; i++ )
418 if ( isdefined( level.players[i].riotshieldEntity ))
420 dist_squared = DistanceSquared( level.players[i].riotshieldEntity.origin, origin );
421 if ( min_dist_squared > dist_squared )
424 println(
"Shield placement denied! Failed distance check to other riotshields." );
441 assert( isdefined(
self.riotshieldRetrieveTrigger ));
442 assert( isdefined(
self.riotshieldEntity ));
445 self waittill(
"destroy_riotshield" );
447 if ( isdefined(
self.riotshieldRetrieveTrigger ))
449 self.riotshieldRetrieveTrigger
delete();
452 if ( isdefined(
self.riotshieldEntity ))
454 if ( isdefined(
self.riotshieldEntity.reconModel ))
456 self.riotshieldEntity.reconModel
delete();
459 self.riotshieldEntity ConnectPaths();
460 self.riotshieldEntity
delete();
472 damageMax = GetDvarInt(
"riotshield_deployed_health");
473 self.damageTaken = 0;
477 self.maxhealth = 100000;
478 self.health =
self.maxhealth;
480 self waittill(
"damage",
damage, attacker, direction, point, type, tagName, modelName, partname, weapon, iDFlags );
482 if( !isdefined( attacker ) )
488 assert( isdefined(
self.owner ) && isdefined(
self.owner.team ));
491 if ( isplayer( attacker ) )
493 if ( (level.teamBased) && ( attacker.team ==
self.owner.team ) && ( attacker !=
self.owner))
499 if ( type ==
"MOD_MELEE" || type ==
"MOD_MELEE_ASSASSINATE" )
501 damage *= GetDvarfloat(
"riotshield_melee_damage_scale" );
503 else if ( type ==
"MOD_PISTOL_BULLET" || type ==
"MOD_RIFLE_BULLET" )
505 damage *= GetDvarfloat(
"riotshield_bullet_damage_scale" );
507 else if ( type ==
"MOD_GRENADE" || type ==
"MOD_GRENADE_SPLASH" || type ==
"MOD_EXPLOSIVE" || type ==
"MOD_EXPLOSIVE_SPLASH" || type ==
"MOD_PROJECTILE" || type ==
"MOD_PROJECTILE_SPLASH")
509 damage *= GetDvarfloat(
"riotshield_explosive_damage_scale" );
511 else if ( type ==
"MOD_IMPACT" )
513 damage *= GetDvarFloat(
"riotshield_projectile_damage_scale" );
515 else if ( type ==
"MOD_CRUSH" )
522 if(
self.damageTaken >= damageMax )
536 self notify(
"damageThenDestroyRiotshield" );
539 if ( isdefined(
self.owner.riotshieldRetrieveTrigger ))
541 self.owner.riotshieldRetrieveTrigger
delete();
544 if ( isdefined(
self.reconModel ))
546 self.reconModel
delete();
550 self.owner.riotshieldEntity = undefined;
555 if (isdefined (attacker) && attacker !=
self.owner && isplayer( attacker ) )
560 wait( GetDvarFloat(
"riotshield_destroyed_cleanup_time" ));
572 self notify(
"destroy_riotshield" );
581 shield_ent endon(
"death" );
582 shield_ent endon(
"damageThenDestroyRiotshield" );
595 grenade endon(
"death" );
597 self util::waittill_any(
"damageThenDestroyRiotshield",
"death",
"disconnect",
"weapon_change",
"deploy_riotshield" );
599 grenade Detonate( owner );
610 self endon(
"death" );
611 self endon(
"disconnect" );
618 self waittill(
"raise_riotshield" );
625 self endon(
"death" );
626 self endon(
"disconnect" );
628 self notify(
"riotshieldTrackingStart" );
629 self endon(
"riotshieldTrackingStart" );
633 self waittill (
"grenade_fire", grenade, weapon, cookTime );
640 switch ( weapon.name )
642 case "sticky_grenade":
643 case "proximity_grenade":
644 case "explosive_bolt":
654 self endon(
"death" );
656 self waittill(
"stuck_to_shield", other, owner );