1 #using scripts\shared\gameskill_shared;
2 #using scripts\shared\name_shared;
3 #using scripts\shared\util_shared;
4 #using scripts\shared\ai\systems\debug;
5 #using scripts\shared\ai\systems\shared;
6 #using scripts\shared\ai\archetype_utility;
7 #using scripts\shared\ai\systems\weaponList;
9 #insert scripts\shared\shared.gsh;
10 #insert scripts\shared\ai\utility.gsh;
13 #using_animtree("generic");
20 self.weaponInfo[weapon.name] = SpawnStruct();
22 self.weaponInfo[weapon.name].position =
"none";
23 self.weaponInfo[weapon.name].hasClip =
true;
25 if ( IsDefined( weapon.ClipModel ) )
26 self.weaponInfo[weapon.name].useClip =
true;
28 self.weaponInfo[weapon.name].useClip =
false;
36 self.a = SpawnStruct();
37 self.a.weaponPos = [];
42 if (
self.weapon == level.weaponNone )
49 if (
self.secondaryweapon == level.weaponNone )
55 self.initial_primaryweapon =
self.primaryweapon;
56 self.initial_secondaryweapon =
self.secondaryweapon;
62 self.weapon_positions =
array(
"left",
"right",
"chest",
"back" );
64 for (i = 0; i <
self.weapon_positions.size; i++)
66 self.a.weaponPos[
self.weapon_positions[i]] = level.weaponNone;
69 self.lastWeapon =
self.weapon;
78 self.a.rocketVisible =
true;
81 self.a.pose =
"stand";
82 self.a.prevPose =
self.a.pose;
83 self.a.movement =
"stop";
84 self.a.special =
"none";
85 self.a.gunHand =
"none";
88 if ( isdefined(
self.secondaryweaponclass ) &&
self.secondaryweaponclass !=
"none" &&
self.secondaryweaponclass !=
"pistol" )
91 self.a.combatEndTime = GetTime();
92 self.a.nextGrenadeTryTime = 0;
95 self.a.isAiming =
false;
96 self.rightAimLimit = 45;
97 self.leftAimLimit = -45;
99 self.downAimLimit = -45;
105 self.a.postScriptFunc = undefined;
108 self.baseAccuracy =
self.accuracy;
111 if( !isdefined(
self.script_accuracy) )
112 self.script_accuracy = 1;
115 if(
self.team ==
"axis" ||
self.team ==
"team3" )
117 else if (
self.team ==
"allies")
121 self.bulletsInClip =
self.weapon.clipSize;
124 self.lastEnemySightTime = 0;
127 self.suppressed =
false;
128 self.suppressedTime = 0;
130 if (
self.team ==
"allies" )
131 self.suppressionThreshold = 0.75;
133 self.suppressionThreshold = 0.5;
136 if (
self.team ==
"allies" )
137 self.randomGrenadeRange = 0;
139 self.randomGrenadeRange = 128;
141 self.reacquire_state = 0;
146 self endon (
"death" );
157 self.animplaybackrate = 0.9 + RandomFloat( 0.2 );
158 self.moveplaybackrate = 1;
163 self endon (
"death");
167 self.oldOrigin =
self.origin;
175 idealTransAngles[1] = 45;
176 idealTransAngles[2] = 0;
177 idealTransAngles[3] = -45;
178 idealTransAngles[4] = 90;
179 idealTransAngles[6] = -90;
180 idealTransAngles[7] = 135;
181 idealTransAngles[8] = 180;
182 idealTransAngles[9] = -135;
186 for ( i = 1; i <= 9; i++ )
188 for ( j = 0; j < transTypes.size; j++ )
190 trans = transTypes[j];
193 if ( trans ==
"left" || trans ==
"left_crouch" )
197 else if ( trans ==
"right" || trans ==
"right_crouch" )
202 if ( isdefined( anim.coverTransAngles[ trans ][i] ) )
204 correctAngle = AngleClamp180( idealTransAngles[i] + idealAdd );
205 actualAngle = AngleClamp180( anim.coverTransAngles[ trans ][i] );
206 if ( AbsAngleClamp180( actualAngle - correctAngle ) > 7 )
208 println(
"^1Cover approach animation has bad yaw delta: anim.coverTrans[\"" + trans +
"\"][" + i +
"]; is ^2" + actualAngle +
"^1, should be closer to ^2" + correctAngle +
"^1." );
214 for ( i = 1; i <= 9; i++ )
216 for ( j = 0; j < transTypes.size; j++ )
218 trans = transTypes[j];
221 if ( trans ==
"left" || trans ==
"left_crouch" )
225 else if ( trans ==
"right" || trans ==
"right_crouch" )
230 if ( isdefined( anim.coverExitAngles[ trans ][i] ) )
232 correctAngle = AngleClamp180( -1 * (idealTransAngles[i] + idealAdd + 180) );
233 actualAngle = AngleClamp180( anim.coverExitAngles[ trans ][i] );
234 if ( AbsAngleClamp180( actualAngle - correctAngle ) > 7 )
236 println(
"^1Cover exit animation has bad yaw delta: anim.coverTrans[\"" + trans +
"\"][" + i +
"]; is ^2" + actualAngle +
"^1, should be closer to ^2" + correctAngle +
"^1." );
246 return anim.coverExitSplit[ approachType ][ dir ];
251 return anim.coverTransSplit[ approachType ][ dir ];
257 if ( IsDefined(anim.NotFirstTime) )
262 anim.NotFirstTime =
true;
264 anim.grenadeTimers[
"player_frag_grenade_sp"] = randomIntRange( 1000, 20000 );
265 anim.grenadeTimers[
"player_flash_grenade_sp"] = randomIntRange( 1000, 20000 );
266 anim.grenadeTimers[
"player_double_grenade"] = randomIntRange( 10000, 60000 );
267 anim.grenadeTimers[
"AI_frag_grenade_sp"] = randomIntRange( 0, 20000 );
268 anim.grenadeTimers[
"AI_flash_grenade_sp"] = randomIntRange( 0, 20000 );
270 anim.numGrenadesInProgressTowardsPlayer = 0;
271 anim.lastGrenadeLandedNearPlayerTime = -1000000;
272 anim.lastFragGrenadeToPlayerStart = -1000000;
275 if ( !isdefined( level.flag ) )
280 level.painAI = undefined;
281 anim.coverCrouchLeanPitch = -55;
291 player.invul =
false;
298 if ( isdefined( anim.playerGrenadeRangeTime ) )
300 maxTime = int( anim.playerGrenadeRangeTime * 0.7 );
306 anim.grenadeTimers[
"player_frag_grenade_sp"] = randomIntRange( 0, maxTime );
307 anim.grenadeTimers[
"player_flash_grenade_sp"] = randomIntRange( 0, maxTime );
310 if ( isdefined( anim.playerDoubleGrenadeTime ) )
312 maxTime = int( anim.playerDoubleGrenadeTime );
313 minTime = int( maxTime / 2 );
314 if ( maxTime <= minTime )
316 maxTime = minTime + 1;
319 anim.grenadeTimers[
"player_double_grenade"] = randomIntRange( minTime, maxTime );
328 while ( IsDefined(grenade) )
333 ArrayRemoveValue(level.missileEntities,grenade);
341 self endon (
"death" );
347 self waittill (
"grenade_fire", grenade, weapon );
349 grenade.weapon = weapon;
356 self endon (
"death" );
360 self waittill (
"grenade_launcher_fire", grenade, weapon );
362 grenade.weapon = weapon;
369 self endon (
"death" );
373 self waittill (
"missile_fire", grenade, weapon );
375 grenade.weapon = weapon;
382 self endon (
"death" );
386 self waittill (
"grenade_fire", grenade, weapon );
393 self waittill(
"death" );
395 self notify (
"end_explode" );
401 self endon(
"end_explode" );
402 self waittill(
"explode", position );
403 PlayRumbleOnPosition(
"grenade_rumble", position );