IL-GSC/BO1/PC/ZM/animscripts/zombie_utility.gsc
2024-02-18 17:32:07 -05:00

1204 lines
27 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include animscripts\zombie_SetPoseMovement;
#include animscripts\combat_utility;
#include animscripts\debug;
#include common_scripts\utility;
#include maps\_utility;
#using_animtree ("generic_human");
initAnimTree(animscript)
{
if ( isValidEnemy( self.a.personImMeleeing ) )
{
ImNotMeleeing( self.a.personImMeleeing );
}
self ClearAnim( %body, 0.2 );
if ( animscript != "pain" && animscript != "death" )
{
self.a.special = "none";
}
self.missedSightChecks = 0;
IsInCombat();
assertEX( IsDefined( animscript ), "Animscript not specified in initAnimTree" );
self.a.script = animscript;
[[self.a.StopCowering]]();
}
UpdateAnimPose()
{
assertEX( self.a.movement=="stop" || self.a.movement=="walk" || self.a.movement=="run", "UpdateAnimPose "+self.a.pose+" "+self.a.movement );
self.desired_anim_pose = undefined;
}
initialize( animscript )
{
if ( IsDefined( self.longDeathStarting ) )
{
if ( animscript != "pain" && animscript != "death" )
{
self DoDamage( self.health + 100, self.origin );
}
if ( animscript != "pain" )
{
self.longDeathStarting = undefined;
self notify( "kill_long_death" );
}
}
if ( IsDefined( self.a.mayOnlyDie ) && animscript != "death" )
{
self DoDamage( self.health + 100, self.origin );
}
if ( IsDefined( self.a.postScriptFunc ) )
{
scriptFunc = self.a.postScriptFunc;
self.a.postScriptFunc = undefined;
[[scriptFunc]]( animscript );
}
if ( animscript != "death" )
{
self.a.nodeath = false;
}
if ( IsDefined( self.isHoldingGrenade ) && (animscript == "pain" || animscript == "death" || animscript == "flashed") )
{
self dropGrenade();
}
self.isHoldingGrenade = undefined;
self.coverNode = undefined;
self.changingCoverPos = false;
self.a.scriptStartTime = GetTime();
self.a.atConcealmentNode = false;
if ( IsDefined( self.node ) && (self.node.type == "Conceal Crouch" || self.node.type == "Conceal Stand") )
{
self.a.atConcealmentNode = true;
}
initAnimTree( animscript );
UpdateAnimPose();
}
should_find_a_new_node()
{
self.a.next_move_to_new_cover--;
if ( self.a.next_move_to_new_cover > 0 )
{
return false;
}
anim_set_next_move_to_new_cover();
return true;
}
badplacer(time, org, radius)
{
for (i=0;i<time*20;i++)
{
for (p=0;p<10;p++)
{
angles = (0,RandomInt(360),0);
forward = AnglesToForward(angles);
scale = vector_scale(forward, radius);
line (org, org + scale, (1,0.3,0.3));
}
wait(0.05);
}
}
printDisplaceInfo()
{
self endon ("death");
self notify ("displaceprint");
self endon ("displaceprint");
for (;;)
{
Print3d (self.origin + (0,0,60), "displacer", (0,0.4,0.7), 0.85, 0.5);
wait (0.05);
}
}
getOldRadius()
{
self notify ("newOldradius");
self endon ("newOldradius");
self endon ("death");
wait (6);
self.goalradius = self.a.oldgoalradius;
}
IsInCombat()
{
if ( isValidEnemy( self.enemy ) )
{
self.a.combatEndTime = GetTime() + anim.combatMemoryTimeConst + RandomInt(anim.combatMemoryTimeRand);
return true;
}
return ( self.a.combatEndTime > GetTime() );
}
GetNodeYawToOrigin(pos)
{
if (IsDefined (self.node))
{
yaw = self.node.angles[1] - GetYaw(pos);
}
else
{
yaw = self.angles[1] - GetYaw(pos);
}
yaw = AngleClamp180( yaw );
return yaw;
}
GetNodeYawToEnemy()
{
pos = undefined;
if ( isValidEnemy( self.enemy ) )
{
pos = self.enemy.origin;
}
else
{
if (IsDefined (self.node))
{
forward = AnglesToForward(self.node.angles);
}
else
{
forward = AnglesToForward(self.angles);
}
forward = vector_scale (forward, 150);
pos = self.origin + forward;
}
if (IsDefined (self.node))
{
yaw = self.node.angles[1] - GetYaw(pos);
}
else
{
yaw = self.angles[1] - GetYaw(pos);
}
yaw = AngleClamp180( yaw );
return yaw;
}
GetCoverNodeYawToEnemy()
{
pos = undefined;
if ( isValidEnemy( self.enemy ) )
{
pos = self.enemy.origin;
}
else
{
forward = AnglesToForward(self.coverNode.angles + self.animarray["angle_step_out"][self.a.cornerMode]);
forward = vector_scale (forward, 150);
pos = self.origin + forward;
}
yaw = self.CoverNode.angles[1] + self.animarray["angle_step_out"][self.a.cornerMode] - GetYaw(pos);
yaw = AngleClamp180( yaw );
return yaw;
}
GetYawToSpot(spot)
{
pos = spot;
yaw = self.angles[1] - GetYaw(pos);
yaw = AngleClamp180( yaw );
return yaw;
}
GetYawToEnemy()
{
pos = undefined;
if ( isValidEnemy( self.enemy ) )
{
pos = self.enemy.origin;
}
else
{
forward = AnglesToForward(self.angles);
forward = vector_scale (forward, 150);
pos = self.origin + forward;
}
yaw = self.angles[1] - GetYaw(pos);
yaw = AngleClamp180( yaw );
return yaw;
}
GetYaw(org)
{
angles = VectorToAngles(org-self.origin);
return angles[1];
}
GetYaw2d(org)
{
angles = VectorToAngles((org[0], org[1], 0)-(self.origin[0], self.origin[1], 0));
return angles[1];
}
AbsYawToEnemy()
{
assert( isValidEnemy( self.enemy ) );
yaw = self.angles[1] - GetYaw(self.enemy.origin);
yaw = AngleClamp180( yaw );
if (yaw < 0)
{
yaw = -1 * yaw;
}
return yaw;
}
AbsYawToEnemy2d()
{
assert( isValidEnemy( self.enemy ) );
yaw = self.angles[1] - GetYaw2d(self.enemy.origin);
yaw = AngleClamp180( yaw );
if (yaw < 0)
{
yaw = -1 * yaw;
}
return yaw;
}
AbsYawToOrigin(org)
{
yaw = self.angles[1] - GetYaw(org);
yaw = AngleClamp180( yaw );
if (yaw < 0)
{
yaw = -1 * yaw;
}
return yaw;
}
AbsYawToAngles(angles)
{
yaw = self.angles[1] - angles;
yaw = AngleClamp180( yaw );
if (yaw < 0)
{
yaw = -1 * yaw;
}
return yaw;
}
GetYawFromOrigin(org, start)
{
angles = VectorToAngles(org-start);
return angles[1];
}
GetYawToTag(tag, org)
{
yaw = self GetTagAngles( tag )[1] - GetYawFromOrigin(org, self GetTagOrigin(tag));
yaw = AngleClamp180( yaw );
return yaw;
}
GetYawToOrigin(org)
{
yaw = self.angles[1] - GetYaw(org);
yaw = AngleClamp180( yaw );
return yaw;
}
GetEyeYawToOrigin(org)
{
yaw = self GetTagAngles("TAG_EYE")[1] - GetYaw(org);
yaw = AngleClamp180( yaw );
return yaw;
}
GetCoverNodeYawToOrigin(org)
{
yaw = self.coverNode.angles[1] + self.animarray["angle_step_out"][self.a.cornerMode] - GetYaw(org);
yaw = AngleClamp180( yaw );
return yaw;
}
isStanceAllowedWrapper( stance )
{
if ( IsDefined( self.coverNode ) )
{
return self.coverNode doesNodeAllowStance( stance );
}
return self IsStanceAllowed( stance );
}
choosePose(preferredPose)
{
if ( !IsDefined( preferredPose ) )
{
preferredPose = self.a.pose;
}
if ( EnemiesWithinStandingRange() )
{
preferredPose = "stand";
}
switch (preferredPose)
{
case "stand":
if (self isStanceAllowedWrapper("stand"))
{
resultPose = "stand";
}
else if (self isStanceAllowedWrapper("crouch"))
{
resultPose = "crouch";
}
else
{
println ("No stance allowed! Remaining standing.");
resultPose = "stand";
}
break;
case "crouch":
if (self isStanceAllowedWrapper("crouch"))
{
resultPose = "crouch";
}
else if (self isStanceAllowedWrapper("stand"))
{
resultPose = "stand";
}
else
{
println ("No stance allowed! Remaining crouched.");
resultPose = "crouch";
}
break;
default:
println ("utility::choosePose, called in "+self.a.script+" script: Unhandled anim_pose "+self.a.pose+" - using stand.");
resultPose = "stand";
break;
}
return resultPose;
}
okToMelee(person)
{
assert( IsDefined( person ) );
if (IsDefined(self.a.personImMeleeing))
{
ImNotMeleeing(self.a.personImMeleeing);
assert(!IsDefined(self.a.personImMeleeing));
}
if (IsDefined(person.a.personMeleeingMe))
{
oldAttacker = person.a.personMeleeingMe;
if ( IsDefined(oldAttacker.a.personImMeleeing) && oldAttacker.a.personImMeleeing == person )
{
return false;
}
println("okToMelee - Shouldn't get to here");
person.a.personMeleeingMe = undefined;
assert(!IsDefined(self.a.personImMeleeing));
assert(!IsDefined(person.a.personMeleeingMe));
return true;
}
assert(!IsDefined(self.a.personImMeleeing));
assert(!IsDefined(person.a.personMeleeingMe));
return true;
}
IAmMeleeing(person)
{
assert(IsDefined(person));
assert(!IsDefined(person.a.personMeleeingMe));
assert(!IsDefined(self.a.personImMeleeing));
person.a.personMeleeingMe = self;
self.a.personImMeleeing = person;
}
ImNotMeleeing(person)
{
if ( (IsDefined(person)) && (IsDefined(self.a.personImMeleeing)) && (self.a.personImMeleeing==person) )
{
assert(IsDefined(person.a.personMeleeingMe));
assert(person.a.personMeleeingMe == self);
}
if (!IsDefined(person))
{
self.a.personImMeleeing = undefined;
}
else if ( (IsDefined(person.a.personMeleeingMe)) && (person.a.personMeleeingMe==self) )
{
person.a.personMeleeingMe = undefined;
assert(self.a.personImMeleeing==person);
self.a.personImMeleeing = undefined;
}
assert( !IsDefined(person) || !IsDefined(self.a.personImMeleeing) || (self.a.personImMeleeing!=person) );
assert( !IsDefined(person) || !IsDefined(person.a.personMeleeingMe) || (person.a.personMeleeingMe!=self) );
}
GetClaimedNode()
{
myNode = self.node;
if ( IsDefined(myNode) && (self nearNode(myNode) || (IsDefined( self.coverNode ) && myNode == self.coverNode)) )
{
return myNode;
}
return undefined;
}
GetNodeType()
{
myNode = GetClaimedNode();
if (IsDefined(myNode))
{
return myNode.type;
}
return "none";
}
GetNodeDirection()
{
myNode = GetClaimedNode();
if (IsDefined(myNode))
{
return myNode.angles[1];
}
return self.desiredAngle;
}
GetNodeForward()
{
myNode = GetClaimedNode();
if (IsDefined(myNode))
{
return AnglesToForward ( myNode.angles );
}
return AnglesToForward( self.angles );
}
GetNodeOrigin()
{
myNode = GetClaimedNode();
if (IsDefined(myNode))
{
return myNode.origin;
}
return self.origin;
}
safemod(a,b)
{
result = int(a) % b;
result += b;
return result % b;
}
AngleClamp( angle )
{
angleFrac = angle / 360.0;
angle = (angleFrac - floor( angleFrac )) * 360.0;
return angle;
}
QuadrantAnimWeights( yaw )
{
forwardWeight = (90 - abs(yaw)) / 90;
leftWeight = (90 - AbsAngleClamp180(abs(yaw-90))) / 90;
result["front"] = 0;
result["right"] = 0;
result["back"] = 0;
result["left"] = 0;
if ( IsDefined( self.alwaysRunForward ) )
{
assert( self.alwaysRunForward );
result["front"] = 1;
return result;
}
useLeans = GetDvarInt( #"ai_useLeanRunAnimations");
if (forwardWeight > 0)
{
result["front"] = forwardWeight;
if (leftWeight > 0)
{
result["left"] = leftWeight;
}
else
{
result["right"] = -1 * leftWeight;
}
}
else if( useLeans )
{
result["back"] = -1 * forwardWeight;
if (leftWeight > 0)
{
result["left"] = leftWeight;
}
else
{
result["right"] = -1 * leftWeight;
}
}
else
{
backWeight = -1 * forwardWeight;
if ( leftWeight > backWeight )
{
result["left"] = 1;
}
else if ( leftWeight < forwardWeight )
{
result["right"] = 1;
}
else
{
result["back"] = 1;
}
}
return result;
}
getQuadrant(angle)
{
angle = AngleClamp(angle);
if (angle<45 || angle>315)
{
quadrant = "front";
}
else if (angle<135)
{
quadrant = "left";
}
else if (angle<225)
{
quadrant = "back";
}
else
{
quadrant = "right";
}
return quadrant;
}
IsInSet(input, set)
{
for (i = set.size - 1; i >= 0; i--)
{
if (input == set[i])
{
return true;
}
}
return false;
}
playAnim(animation)
{
if (IsDefined(animation))
{
println ("NOW PLAYING: ",animation);
self SetFlaggedAnimKnobAllRestart("playAnim", animation, %root, 1, .2, 1);
timeToWait = getanimlength(animation);
timeToWait = ( 3 * timeToWait ) + 1;
self thread NotifyAfterTime("time is up", "time is up", timeToWait);
self waittill ("time is up");
self notify("enddrawstring");
}
}
NotifyAfterTime(notifyString, killmestring, time)
{
self endon("death");
self endon(killmestring);
wait time;
self notify (notifyString);
}
drawString(stringtodraw)
{
self endon("killanimscript");
self endon("enddrawstring");
for (;;)
{
wait .05;
Print3d ((self GetDebugEye()) + (0,0,8), stringtodraw, (1, 1, 1), 1, 0.2);
}
}
drawStringTime(msg, org, color, timer)
{
maxtime = timer*20;
for (i=0;i<maxtime;i++)
{
Print3d (org, msg, color, 1, 1);
wait .05;
}
}
showLastEnemySightPos(string)
{
self notify ("got known enemy2");
self endon ("got known enemy2");
self endon ("death");
if ( !isValidEnemy( self.enemy ) )
{
return;
}
if (self.enemy.team == "allies")
{
color = (0.4, 0.7, 1);
}
else
{
color = (1, 0.7, 0.4);
}
while (1)
{
wait (0.05);
if (!IsDefined (self.lastEnemySightPos))
{
continue;
}
Print3d (self.lastEnemySightPos, string, color, 1, 2.15);
}
}
tryTurret (targetname)
{
turret = getent (targetname, "targetname");
if (!IsDefined (turret))
{
return false;
}
if ((turret.classname != "misc_mg42") && (turret.classname != "misc_turret"))
{
return false;
}
if ( !self IsInGoal(self.covernode.origin))
{
return false;
}
canuse = self useturret(turret);
if ( canuse )
{
turret setmode("auto_ai");
self thread maps\_mgturret::mg42_firing(turret);
turret notify ("startfiring");
return true;
}
else
{
return false;
}
}
debugTimeout()
{
wait(5);
self notify ("timeout");
}
debugPosInternal( org, string, size )
{
self endon ("death");
self notify ("stop debug " + org);
self endon ("stop debug " + org);
ent = SpawnStruct();
ent thread debugTimeout();
ent endon ("timeout");
if (self.enemy.team == "allies")
{
color = (0.4, 0.7, 1);
}
else
{
color = (1, 0.7, 0.4);
}
while (1)
{
wait (0.05);
Print3d (org, string, color, 1, size);
}
}
debugPos( org, string )
{
thread debugPosInternal( org, string, 2.15 );
}
debugPosSize( org, string, size )
{
thread debugPosInternal( org, string, size );
}
showDebugProc(fromPoint, toPoint, color, printTime)
{
self endon ("death");
timer = printTime*20;
for (i=0;i<timer;i+=1)
{
wait (0.05);
line (fromPoint, toPoint, color);
}
}
showDebugLine( fromPoint, toPoint, color, printTime )
{
self thread showDebugProc( fromPoint, toPoint +( 0, 0, -5 ), color, printTime );
}
setEnv(env)
{
anim.idleAnimTransition [ "stand" ][ "in" ] = %casual_stand_idle_trans_in;
anim.idleAnimArray [ "stand" ][ 0 ][ 0 ] = %casual_stand_idle;
anim.idleAnimArray [ "stand" ][ 0 ][ 1 ] = %casual_stand_idle_twitch;
anim.idleAnimArray [ "stand" ][ 0 ][ 2 ] = %casual_stand_idle_twitchB;
anim.idleAnimWeights [ "stand" ][ 0 ][ 0 ] = 2;
anim.idleAnimWeights [ "stand" ][ 0 ][ 1 ] = 1;
anim.idleAnimWeights [ "stand" ][ 0 ][ 2 ] = 1;
anim.idleAnimArray [ "stand" ][ 1 ][ 0 ] = %casual_stand_v2_idle;
anim.idleAnimArray [ "stand" ][ 1 ][ 1 ] = %casual_stand_v2_twitch_radio;
anim.idleAnimArray [ "stand" ][ 1 ][ 2 ] = %casual_stand_v2_twitch_shift;
anim.idleAnimArray [ "stand" ][ 1 ][ 3 ] = %casual_stand_v2_twitch_talk;
anim.idleAnimWeights [ "stand" ][ 1 ][ 0 ] = 10;
anim.idleAnimWeights [ "stand" ][ 1 ][ 1 ] = 4;
anim.idleAnimWeights [ "stand" ][ 1 ][ 2 ] = 7;
anim.idleAnimWeights [ "stand" ][ 1 ][ 3 ] = 4;
anim.idleAnimArray [ "stand_cqb" ][ 0 ][ 0 ] = %cqb_stand_idle;
anim.idleAnimArray [ "stand_cqb" ][ 0 ][ 1 ] = %cqb_stand_twitch;
anim.idleAnimWeights [ "stand_cqb" ][ 0 ][ 0 ] = 2;
anim.idleAnimWeights [ "stand_cqb" ][ 0 ][ 1 ] = 1;
anim.idleAnimTransition [ "crouch" ][ "in" ] = %casual_crouch_idle_in;
anim.idleAnimArray [ "crouch" ][ 0 ][ 0 ] = %casual_crouch_idle;
anim.idleAnimArray [ "crouch" ][ 0 ][ 1 ] = %casual_crouch_twitch;
anim.idleAnimArray [ "crouch" ][ 0 ][ 2 ] = %casual_crouch_point;
anim.idleAnimWeights [ "crouch" ][ 0 ][ 0 ] = 6;
anim.idleAnimWeights [ "crouch" ][ 0 ][ 1 ] = 3;
anim.idleAnimWeights [ "crouch" ][ 0 ][ 2 ] = 1;
anim.idleAnimArray [ "stand_banzai" ][ 0 ][ 0 ] = %cqb_stand_idle;
anim.idleAnimArray [ "stand_banzai" ][ 0 ][ 1 ] = %cqb_stand_twitch;
anim.idleAnimWeights [ "stand_banzai" ][ 0 ][ 0 ] = 2;
anim.idleAnimWeights [ "stand_banzai" ][ 0 ][ 1 ] = 1;
anim.idleAnimTransition [ "stand_hmg" ][ "in" ] = %ai_mg_shoulder_run2stand;
anim.idleAnimArray [ "stand_hmg" ][ 0 ][ 0 ] = %ai_mg_shoulder_stand_idle;
anim.idleAnimWeights [ "stand_hmg" ][ 0 ][ 0 ] = 1;
anim.idleAnimTransition [ "crouch_hmg" ][ "in" ] = %ai_mg_shoulder_run2crouch;
anim.idleAnimArray [ "crouch_hmg" ][ 0 ][ 0 ] = %ai_mg_shoulder_crouch_idle;
anim.idleAnimWeights [ "crouch_hmg" ][ 0 ][ 0 ] = 1;
anim.idleAnimArray [ "stand_flame" ][ 0 ][ 0 ] = %ai_flamethrower_stand_idle_casual_v1;
anim.idleAnimArray [ "stand_flame" ][ 0 ][ 1 ] = %ai_flamethrower_stand_twitch;
anim.idleAnimWeights [ "stand_flame" ][ 0 ][ 0 ] = 3;
anim.idleAnimWeights [ "stand_flame" ][ 0 ][ 1 ] = 1;
anim.idleAnimArray [ "crouch_flame" ][ 0 ][ 0 ] = %ai_flamethrower_crouch_idle_a;
anim.idleAnimArray [ "crouch_flame" ][ 0 ][ 1 ] = %ai_flamethrower_crouch_idle_b;
anim.idleAnimArray [ "crouch_flame" ][ 0 ][ 2 ] = %ai_flamethrower_crouch_twitch;
anim.idleAnimWeights [ "crouch_flame" ][ 0 ][ 0 ] = 3;
anim.idleAnimWeights [ "crouch_flame" ][ 0 ][ 1 ] = 3;
anim.idleAnimWeights [ "crouch_flame" ][ 0 ][ 2 ] = 1;
if (env == "cold")
{
array_thread(GetAIArray(),::PersonalColdBreath);
array_thread(getspawnerarray(),::PersonalColdBreathSpawner);
}
}
PersonalColdBreath()
{
tag = "TAG_EYE";
self endon ("death");
self notify ("stop personal effect");
self endon ("stop personal effect");
for (;;)
{
if (self.a.movement != "run")
{
playfxOnTag ( level._effect["cold_breath"], self, tag );
wait (2.5 + RandomFloat(3));
}
else
{
wait (0.5);
}
}
}
PersonalColdBreathSpawner()
{
self endon ("death");
self notify ("stop personal effect");
self endon ("stop personal effect");
for (;;)
{
self waittill ("spawned", Spawn);
if (maps\_utility::spawn_failed(Spawn))
{
continue;
}
Spawn thread PersonalColdBreath();
}
}
getNodeOffset(node)
{
if ( IsDefined( node.offset ) )
{
return node.offset;
}
cover_left_crouch_offset = (-26, .4, 36);
cover_left_stand_offset = (-32, 7, 63);
cover_right_crouch_offset = (43.5, 11, 36);
cover_right_stand_offset = (36, 8.3, 63);
cover_crouch_offset = (3.5, -12.5, 45);
cover_stand_offset = (-3.7, -22, 63);
cornernode = false;
nodeOffset = (0,0,0);
right = AnglesToRight(node.angles);
forward = AnglesToForward(node.angles);
switch(node.type)
{
case "Cover Left":
case "Cover Left Wide":
if ( node isNodeDontStand() && !node isNodeDontCrouch() )
{
nodeOffset = calculateNodeOffset( right, forward, cover_left_crouch_offset );
}
else
{
nodeOffset = calculateNodeOffset( right, forward, cover_left_stand_offset );
}
break;
case "Cover Right":
case "Cover Right Wide":
if ( node isNodeDontStand() && !node isNodeDontCrouch() )
{
nodeOffset = calculateNodeOffset( right, forward, cover_right_crouch_offset );
}
else
{
nodeOffset = calculateNodeOffset( right, forward, cover_right_stand_offset );
}
break;
case "Cover Stand":
case "Conceal Stand":
case "Turret":
nodeOffset = calculateNodeOffset( right, forward, cover_stand_offset );
break;
case "Cover Crouch":
case "Cover Crouch Window":
case "Conceal Crouch":
nodeOffset = calculateNodeOffset( right, forward, cover_crouch_offset );
break;
}
node.offset = nodeOffset;
return node.offset;
}
calculateNodeOffset( right, forward, baseoffset )
{
return vector_scale( right, baseoffset[0] ) + vector_scale( forward, baseoffset[1] ) + (0, 0, baseoffset[2]);
}
checkPitchVisibility( fromPoint, toPoint, atNode )
{
pitch = AngleClamp180( VectorToAngles( toPoint - fromPoint )[0] );
if ( abs( pitch ) > 45 )
{
if ( IsDefined( atNode ) && atNode.type != "Cover Crouch" && atNode.type != "Conceal Crouch" )
{
return false;
}
if ( pitch > 45 || pitch < anim.coverCrouchLeanPitch - 45 )
{
return false;
}
}
return true;
}
showLines(start, end, end2)
{
for (;;)
{
line(start, end, (1,0,0), 1);
wait (0.05);
line(start, end2, (0,0,1), 1);
wait (0.05);
}
}
anim_array(animArray, animWeights)
{
total_anims = animArray.size;
idleanim = RandomInt(total_anims);
assert (total_anims);
assert (animArray.size == animWeights.size);
if (total_anims == 1)
{
return animArray[0];
}
weights = 0;
total_weight = 0;
for (i = 0; i < total_anims; i++)
{
total_weight += animWeights[i];
}
anim_play = RandomFloat(total_weight);
current_weight = 0;
for (i = 0; i < total_anims; i++)
{
current_weight += animWeights[i];
if (anim_play >= current_weight)
{
continue;
}
idleanim = i;
break;
}
return animArray[idleanim];
}
notForcedCover()
{
return ((self.a.forced_cover == "none") || (self.a.forced_cover == "Show"));
}
forcedCover(msg)
{
return IsDefined(self.a.forced_cover) && (self.a.forced_cover == msg);
}
print3dtime(timer, org, msg, color, alpha, scale)
{
newtime = timer / 0.05;
for (i=0;i<newtime;i++)
{
Print3d (org, msg, color, alpha, scale);
wait (0.05);
}
}
print3drise (org, msg, color, alpha, scale)
{
newtime = 5 / 0.05;
up = 0;
org = org + randomvector(30);
for (i=0;i<newtime;i++)
{
up+=0.5;
Print3d (org + (0,0,up), msg, color, alpha, scale);
wait (0.05);
}
}
crossproduct (vec1, vec2)
{
return (vec1[0]*vec2[1] - vec1[1]*vec2[0] > 0);
}
scriptChange()
{
self.a.current_script = "none";
self notify (anim.scriptChange);
}
delayedScriptChange()
{
wait (0.05);
scriptChange();
}
getGrenadeModel()
{
return getWeaponModel(self.grenadeweapon);
}
sawEnemyMove(timer)
{
if (!IsDefined(timer))
{
timer = 500;
}
return (GetTime() - self.personalSightTime < timer);
}
canThrowGrenade()
{
if (!self.grenadeAmmo)
{
return false;
}
if (self.script_forceGrenade)
{
return true;
}
return (IsPlayer(self.enemy));
}
random_weight (array)
{
idleanim = RandomInt (array.size);
if (array.size > 1)
{
anim_weight = 0;
for (i=0;i<array.size;i++)
{
anim_weight += array[i];
}
anim_play = RandomFloat (anim_weight);
anim_weight = 0;
for (i=0;i<array.size;i++)
{
anim_weight += array[i];
if (anim_play < anim_weight)
{
idleanim = i;
break;
}
}
}
return idleanim;
}
removeableHat()
{
if (!IsDefined (self.hatmodel))
{
return false;
}
if (IsDefined(anim.noHatClassname[self.classname]))
{
return false;
}
return (!IsDefined(anim.noHat[self.model]));
}
metalHat()
{
if (!IsDefined (self.hatmodel))
{
return false;
}
return (IsDefined(anim.metalHat[self.model]));
}
fatGuy()
{
return (IsDefined(anim.fatGuy[self.model]));
}
setFootstepEffect(name, fx)
{
assertEx(IsDefined(name), "Need to define the footstep surface type.");
assertEx(IsDefined(fx), "Need to define the mud footstep effect.");
if (!IsDefined(anim.optionalStepEffects))
{
anim.optionalStepEffects = [];
}
anim.optionalStepEffects[anim.optionalStepEffects.size] = name;
level._effect["step_" + name] = fx;
anim.optionalStepEffectFunction = animscripts\zombie_shared::playFootStepEffect;
}
persistentDebugLine(start, end)
{
self endon ("death");
level notify ("newdebugline");
level endon ("newdebugline");
for (;;)
{
line (start,end, (0.3,1,0), 1);
wait (0.05);
}
}
isNodeDontStand()
{
return (self.spawnflags & 4) == 4;
}
isNodeDontCrouch()
{
return (self.spawnflags & 8) == 8;
}
doesNodeAllowStance( stance )
{
if ( stance == "stand" )
{
return !self isNodeDontStand();
}
else
{
Assert( stance == "crouch" );
return !self isNodeDontCrouch();
}
}
animArray( animname )
{
assert( IsDefined(self.a.array) );
return self.a.array[animname];
}
animArrayAnyExist( animname )
{
assert( IsDefined( self.a.array ) );
return self.a.array[animname].size > 0;
}
animArrayPickRandom( animname )
{
assert( IsDefined( self.a.array ) );
assert( self.a.array[animname].size > 0 );
if ( self.a.array[animname].size > 1 )
{
index = RandomInt( self.a.array[animname].size );
}
else
{
index = 0;
}
return self.a.array[animname][index];
}
getAnimEndPos( theanim )
{
moveDelta = getMoveDelta( theanim, 0, 1 );
return self localToWorldCoords( moveDelta );
}
isValidEnemy( enemy )
{
if ( !IsDefined( enemy ) )
{
return false;
}
return true;
}
damageLocationIsAny( a, b, c, d, e, f, g, h, i, j, k, ovr )
{
if ( !IsDefined( a ) ) return false; if ( self.damageLocation == a ) return true;
if ( !IsDefined( b ) ) return false; if ( self.damageLocation == b ) return true;
if ( !IsDefined( c ) ) return false; if ( self.damageLocation == c ) return true;
if ( !IsDefined( d ) ) return false; if ( self.damageLocation == d ) return true;
if ( !IsDefined( e ) ) return false; if ( self.damageLocation == e ) return true;
if ( !IsDefined( f ) ) return false; if ( self.damageLocation == f ) return true;
if ( !IsDefined( g ) ) return false; if ( self.damageLocation == g ) return true;
if( !IsDefined( h ) ) return false; if( self.damageLocation == h ) return true;
if( !IsDefined( i ) ) return false; if( self.damageLocation == i ) return true;
if( !IsDefined( j ) ) return false; if( self.damageLocation == j ) return true;
if( !IsDefined( k ) ) return false; if( self.damageLocation == k ) return true;
assert(!IsDefined(ovr));
return false;
}
ragdollDeath( moveAnim )
{
self endon ( "killanimscript" );
lastOrg = self.origin;
moveVec = (0,0,0);
for ( ;; )
{
wait ( 0.05 );
force = distance( self.origin, lastOrg );
lastOrg = self.origin;
if ( self.health == 1 )
{
self.a.nodeath = true;
self startRagdoll();
self ClearAnim( moveAnim, 0.1 );
wait ( 0.05 );
physicsExplosionSphere( lastOrg, 600, 0, force * 0.1 );
self notify ( "killanimscript" );
return;
}
}
}
isCQBWalking()
{
return IsDefined( self.cqbwalking ) && self.cqbwalking;
}
squared( value )
{
return value * value;
}
randomizeIdleSet()
{
self.a.idleSet = RandomInt( 2 );
}
getRandomIntFromSeed( intSeed, intMax )
{
assert( intMax > 0 );
index = intSeed % anim.randomIntTableSize;
return anim.randomIntTable[ index ] % intMax;
}
is_banzai()
{
return IsDefined( self.banzai ) && self.banzai;
}
is_heavy_machine_gun()
{
return IsDefined( self.heavy_machine_gunner ) && self.heavy_machine_gunner;
}
is_zombie()
{
if (IsDefined(self.is_zombie) && self.is_zombie)
{
return true;
}
return false;
}
is_civilian()
{
if (IsDefined(self.is_civilian) && self.is_civilian)
{
return true;
}
return false;
}
is_zombie_gibbed()
{
return ( self is_zombie() && self.gibbed );
}
set_zombie_gibbed()
{
if ( self is_zombie() )
{
self.gibbed = true;
}
}
is_skeleton(skeleton)
{
if ((skeleton == "base") && IsSubStr(get_skeleton(), "scaled"))
{
return true;
}
return (get_skeleton() == skeleton);
}
get_skeleton()
{
if (IsDefined(self.skeleton))
{
return self.skeleton;
}
else
{
return "base";
}
}
debug_anim_print( text )
{
}
debug_turn_print( text, line )
{
}