1 #using scripts\shared\ai_shared;
2 #using scripts\shared\math_shared;
3 #using scripts\shared\sound_shared;
4 #using scripts\shared\throttle_shared;
5 #using scripts\shared\util_shared;
7 #using scripts\shared\ai\systems\debug;
8 #using scripts\shared\ai\systems\init;
9 #using scripts\shared\ai\archetype_utility;
10 #using scripts\shared\ai\systems\weaponList;
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\ai\utility.gsh;
15 #using_animtree("generic");
19 level.ai_weapon_throttle =
new Throttle();
20 [[ level.ai_weapon_throttle ]]->Initialize( 1, 0.1 );
25 entity waittill(
"death" );
36 function StowWeapon( weapon, positionOffset, orientationOffset )
40 if ( !IsDefined( positionOffset ) )
42 positionOffset = (0, 0, 0);
45 if ( !IsDefined( orientationOffset ) )
47 orientationOffset = (0, 0, 0);
50 weaponModel =
Spawn(
"script_model", (0, 0, 0) );
51 weaponModel SetModel( weapon.worldmodel );
53 weaponModel LinkTo( entity,
"tag_stowed_back", positionOffset, orientationOffset );
60 self notify(
"weapon_position_change");
62 if ( IsString( weapon ) )
64 weapon = GetWeapon( weapon );
67 if (!isdefined(
self.weaponInfo[weapon.name]))
70 curPosition =
self.weaponInfo[weapon.name].position;
73 assert( curPosition ==
"none" ||
self.
a.weaponPos[curPosition] == weapon );
75 if ( !IsArray(
self.
a.weaponPos ) )
77 self.a.weaponPos = [];
80 assert( IsArray(
self.
a.weaponPos ) );
81 assert( position ==
"none" || IsDefined(
self.
a.weaponPos[position] ),
"Weapon position \"" + position +
"\"" );
82 assert( IsWeapon( weapon ) );
85 if ( position !=
"none" &&
self.
a.weaponPos[position] == weapon )
92 if ( curPosition !=
"none" )
96 if ( position ==
"none" )
104 if (
self.
a.weaponPos[position] != level.weaponNone )
108 if ( position ==
"left" || position ==
"right" )
121 assert(
self.
a.weaponPos[
"left"] == level.weaponNone ||
self.a.weaponPos[
"right"] == level.weaponNone );
126 self.a.weaponPos[
self.weaponInfo[weapon.name].position] = level.weaponNone;
127 self.weaponInfo[weapon.name].position =
"none";
133 self.weaponInfo[weapon.name].position = position;
134 self.a.weaponPos[position] = weapon;
139 if( isdefined(
self.weapon_positions) )
141 for ( index = 0; index <
self.weapon_positions.size; index++ )
143 weapon =
self.a.weaponPos[
self.weapon_positions[index]];
145 if ( weapon == level.weaponNone )
148 self SetActorWeapon( level.weaponNone,
self GetActorWeaponOptions() );
155 if( isdefined(
self.weapon_positions) )
157 for ( index = 0; index <
self.weapon_positions.size; index++ )
159 weapon =
self.a.weaponPos[
self.weapon_positions[index]];
161 if ( weapon == level.weaponNone )
165 if(
self.weapon_positions[index] !=
"right" )
168 self SetActorWeapon( weapon,
self GetActorWeaponOptions() );
170 if (
self.weaponInfo[weapon.name].useClip && !
self.weaponInfo[weapon.name].hasClip )
171 self hidepart(
"tag_clip" );
181 return "tag_weapon_chest";
183 return "tag_stowed_back";
185 return "tag_weapon_left";
187 return "tag_weapon_right";
191 assertMsg(
"unknown weapon placement position: " + position );
203 startPosition =
self GetTagOrigin( positionTag );
204 startAngles =
self GetTagAngles( positionTag );
209 if ( IsDefined(
self ) )
211 endPosition =
self GetTagOrigin( positionTag );
212 endAngles =
self GetTagAngles( positionTag );
214 linearVelocity = ( endPosition - startPosition ) * ( 1.0 / waitTime ) * linearScalar;
215 angularVelocity = VectorNormalize( endAngles - startAngles ) * angularScalar;
217 throwWeapon =
self DropWeapon( weapon, positionTag, linearVelocity, angularVelocity, scavenger );
218 if ( IsDefined( throwWeapon ) )
230 if(
self.weapon == level.weaponNone )
235 if (
IS_TRUE(
self.script_nodropsecondaryweapon) && (
self.weapon ==
self.initial_secondaryweapon))
237 /#PrintLn(
"Not dropping secondary weapon '" +
self.weapon.name +
"'");#/
240 else if (
IS_TRUE(
self.script_nodropsidearm) && (
self.weapon ==
self.sidearm))
242 /#PrintLn(
"Not dropping sidearm '" +
self.weapon.name +
"'");#/
246 [[ level.ai_weapon_throttle ]]->WaitInQueue(
self );
248 current_weapon =
self.weapon;
250 position =
self.weaponInfo[ current_weapon.name ].position;
252 shouldDropWeapon = !IsDefined(
self.dontDropWeapon ) ||
self.dontDropWeapon ===
false;
254 if( current_weapon.isScavengable ==
false )
256 shouldDropWeapon =
false;
259 if ( shouldDropWeapon &&
self.dropWeapon )
261 self.dontDropWeapon =
true;
268 if (
self.weapon != level.weaponNone )
272 if(
self.weapon ==
self.primaryweapon )
276 else if(
self.weapon ==
self.secondaryweapon )
293 if( !
self.dropweapon )
295 if(
self.weapon != level.weaponNone )
304 self.a.dropping_weapons =
true;
308 droppedSideArm =
false;
310 if( isdefined(
self.weapon_positions) )
312 for ( index = 0; index <
self.weapon_positions.size; index++ )
314 weapon =
self.a.weaponPos[
self.weapon_positions[ index ] ];
316 if ( weapon != level.weaponNone )
318 self.weaponInfo[ weapon.name ].position =
"none";
319 self.a.weaponPos[
self.weapon_positions[ index ] ] = level.weaponNone;
321 if (
IS_TRUE(
self.script_nodropsecondaryweapon) && (weapon ==
self.initial_secondaryweapon))
323 /#PrintLn(
"Not dropping secondary weapon '" + weapon.name +
"'");#/
325 else if (
IS_TRUE(
self.script_nodropsidearm) && (weapon ==
self.sidearm))
327 /#PrintLn(
"Not dropping sidearm '" + weapon.name +
"'");#/
332 velocity =
self GetVelocity();
333 speed = Length( velocity ) * 0.5;
337 droppedWeapon =
self DropWeapon( weapon,
self.weapon_positions[ index ], speed );
339 if (
self.sideArm != level.weaponNone )
341 if ( weapon ==
self.sideArm )
342 droppedSideArm =
true;
349 if( !droppedSideArm &&
self.sideArm != level.weaponNone )
352 if( RandomInt(100) <= 10 )
354 velocity =
self GetVelocity();
355 speed = Length( velocity ) * 0.5;
357 droppedWeapon =
self DropWeapon(
self.sideArm,
"chest", speed );
363 self.a.dropping_weapons = undefined;
368 if ( IsSubStr( weapon.name,
"rpg" ) )
370 return GetWeapon(
"rpg_player" );
391 self waittill (flagName, note);
393 if ( !isdefined( note ) )
400 if ( isdefined( val ) )
410 assert( isdefined( interceptFunction ) );
414 self waittill ( flagName, note );
416 if ( !isdefined( note ) )
421 intercepted = [[interceptFunction]]( note );
422 if ( isdefined( intercepted ) && intercepted )
429 if ( isdefined( val ) )
439 assert( isdefined( postFunction ) );
443 self waittill ( flagName, note );
445 if ( !isdefined( note ) )
452 [[postFunction]]( note );
454 if ( isdefined( val ) )
474 if (isdefined (killString))
476 self endon (killString);
479 self endon (
"killanimscript");
481 if (!isdefined(debugIdentifier))
483 debugIdentifier =
"undefined";
489 returnedNote = [[notetracksFunc]](flagName, customFunction, debugIdentifier);
490 timetaken = GetTime() - time;
491 if ( timetaken < 0.05)
494 returnedNote = [[notetracksFunc]](flagName, customFunction, debugIdentifier);
495 timetaken = GetTime() - time;
496 if ( timetaken < 0.05)
498 /#println (GetTime()+
" "+debugIdentifier+
" shared::DoNoteTracksForever is trying to cause an infinite loop on anim "+flagName+
", returned "+returnedNote+
".");#/
499 wait ( 0.05 - timetaken );
523 ent endon (
"stop_notetracks");
524 [[doNoteTracksForeverFunc]](flagName, undefined, customFunction, debugIdentifier);
530 self notify (
"stop_notetracks");