mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-20 15:07:51 -05:00
1357 lines
21 KiB
Plaintext
1357 lines
21 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: maps\mp\animscripts\zm_utility.gsc
|
|
* Game: Call of Duty: Black Ops 2
|
|
* Platform: PC
|
|
* Function Count: 86
|
|
* Decompile Time: 8 ms
|
|
* Timestamp: 10/28/2023 12:11:32 AM
|
|
*******************************************************************/
|
|
|
|
#include maps/mp/_utility;
|
|
#include maps/mp/animscripts/shared;
|
|
#include maps/mp/animscripts/utility;
|
|
#include maps/mp/animscripts/zm_shared;
|
|
|
|
//Function Number: 1
|
|
append_missing_legs_suffix(animstate)
|
|
{
|
|
if(IsDefined(self.has_legs) && !self.has_legs && self hasanimstatefromasd(animstate + "_crawl"))
|
|
{
|
|
return animstate + "_crawl";
|
|
}
|
|
}
|
|
|
|
//Function Number: 2
|
|
initanimtree(animscript)
|
|
{
|
|
if(animscript != "pain" && animscript != "death")
|
|
{
|
|
self.a.special = "none";
|
|
}
|
|
|
|
/#
|
|
assert(IsDefined(animscript),"Animscript not specified in initAnimTree");
|
|
#/
|
|
self.a.script = animscript;
|
|
}
|
|
|
|
//Function Number: 3
|
|
updateanimpose()
|
|
{
|
|
/#
|
|
assert(self.a.movement == "stop" || self.a.movement == "walk" || self.a.movement == "run","UpdateAnimPose " + self.a.pose + " " + self.a.movement);
|
|
#/
|
|
self.desired_anim_pose = undefined;
|
|
}
|
|
|
|
//Function Number: 4
|
|
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 = 0;
|
|
}
|
|
|
|
self.isholdinggrenade = undefined;
|
|
self.covernode = undefined;
|
|
self.changingcoverpos = 0;
|
|
self.a.scriptstarttime = GetTime();
|
|
self.a.atconcealmentnode = 0;
|
|
if(IsDefined(self.node) && self.node.type == "Conceal Crouch" || self.node.type == "Conceal Stand")
|
|
{
|
|
self.a.atconcealmentnode = 1;
|
|
}
|
|
|
|
initanimtree(animscript);
|
|
updateanimpose();
|
|
}
|
|
|
|
//Function Number: 5
|
|
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;
|
|
}
|
|
|
|
//Function Number: 6
|
|
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 = VectorScale(forward);
|
|
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;
|
|
}
|
|
|
|
//Function Number: 7
|
|
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 = VectorScale(forward);
|
|
pos = self.origin + forward;
|
|
}
|
|
|
|
yaw = self.covernode.angles[1] + self.animarray["angle_step_out"][self.a.cornermode] - getyaw(pos);
|
|
yaw = AngleClamp180(yaw);
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 8
|
|
getyawtospot(spot)
|
|
{
|
|
pos = spot;
|
|
yaw = self.angles[1] - getyaw(pos);
|
|
yaw = AngleClamp180(yaw);
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 9
|
|
getyawtoenemy()
|
|
{
|
|
pos = undefined;
|
|
if(isvalidenemy(self.enemy))
|
|
{
|
|
pos = self.enemy.origin;
|
|
}
|
|
else
|
|
{
|
|
forward = AnglesToForward(self.angles);
|
|
forward = VectorScale(forward);
|
|
pos = self.origin + forward;
|
|
}
|
|
|
|
yaw = self.angles[1] - getyaw(pos);
|
|
yaw = AngleClamp180(yaw);
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 10
|
|
getyaw(org)
|
|
{
|
|
angles = VectorToAngles(org - self.origin);
|
|
return angles[1];
|
|
}
|
|
|
|
//Function Number: 11
|
|
getyaw2d(org)
|
|
{
|
|
angles = VectorToAngles((org[0],org[1],0) - (self.origin[0],self.origin[1],0));
|
|
return angles[1];
|
|
}
|
|
|
|
//Function Number: 12
|
|
absyawtoenemy()
|
|
{
|
|
/#
|
|
assert(isvalidenemy(self.enemy));
|
|
#/
|
|
yaw = self.angles[1] - getyaw(self.enemy.origin);
|
|
yaw = AngleClamp180(yaw);
|
|
if(yaw < 0)
|
|
{
|
|
yaw = -1 * yaw;
|
|
}
|
|
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 13
|
|
absyawtoenemy2d()
|
|
{
|
|
/#
|
|
assert(isvalidenemy(self.enemy));
|
|
#/
|
|
yaw = self.angles[1] - getyaw2d(self.enemy.origin);
|
|
yaw = AngleClamp180(yaw);
|
|
if(yaw < 0)
|
|
{
|
|
yaw = -1 * yaw;
|
|
}
|
|
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 14
|
|
absyawtoorigin(org)
|
|
{
|
|
yaw = self.angles[1] - getyaw(org);
|
|
yaw = AngleClamp180(yaw);
|
|
if(yaw < 0)
|
|
{
|
|
yaw = -1 * yaw;
|
|
}
|
|
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 15
|
|
absyawtoangles(angles)
|
|
{
|
|
yaw = self.angles[1] - angles;
|
|
yaw = AngleClamp180(yaw);
|
|
if(yaw < 0)
|
|
{
|
|
yaw = -1 * yaw;
|
|
}
|
|
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 16
|
|
getyawfromorigin(org,start)
|
|
{
|
|
angles = VectorToAngles(org - start);
|
|
return angles[1];
|
|
}
|
|
|
|
//Function Number: 17
|
|
getyawtotag(tag,org)
|
|
{
|
|
yaw = self gettagangles(tag)[1] - getyawfromorigin(org,self gettagorigin(tag));
|
|
yaw = AngleClamp180(yaw);
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 18
|
|
getyawtoorigin(org)
|
|
{
|
|
yaw = self.angles[1] - getyaw(org);
|
|
yaw = AngleClamp180(yaw);
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 19
|
|
geteyeyawtoorigin(org)
|
|
{
|
|
yaw = self gettagangles("TAG_EYE")[1] - getyaw(org);
|
|
yaw = AngleClamp180(yaw);
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 20
|
|
getcovernodeyawtoorigin(org)
|
|
{
|
|
yaw = self.covernode.angles[1] + self.animarray["angle_step_out"][self.a.cornermode] - getyaw(org);
|
|
yaw = AngleClamp180(yaw);
|
|
return yaw;
|
|
}
|
|
|
|
//Function Number: 21
|
|
isstanceallowedwrapper(stance)
|
|
{
|
|
if(IsDefined(self.covernode))
|
|
{
|
|
return self.covernode doesnodeallowstance(stance);
|
|
}
|
|
|
|
return self isstanceallowed(stance);
|
|
}
|
|
|
|
//Function Number: 22
|
|
getclaimednode()
|
|
{
|
|
mynode = self.node;
|
|
if(IsDefined(mynode) && self nearnode(mynode) || IsDefined(self.covernode) && mynode == self.covernode)
|
|
{
|
|
return mynode;
|
|
}
|
|
}
|
|
|
|
//Function Number: 23
|
|
getnodetype()
|
|
{
|
|
mynode = getclaimednode();
|
|
if(IsDefined(mynode))
|
|
{
|
|
return mynode.type;
|
|
}
|
|
|
|
return "none";
|
|
}
|
|
|
|
//Function Number: 24
|
|
getnodedirection()
|
|
{
|
|
mynode = getclaimednode();
|
|
if(IsDefined(mynode))
|
|
{
|
|
return mynode.angles[1];
|
|
}
|
|
|
|
return self.desiredangle;
|
|
}
|
|
|
|
//Function Number: 25
|
|
getnodeforward()
|
|
{
|
|
mynode = getclaimednode();
|
|
if(IsDefined(mynode))
|
|
{
|
|
return AnglesToForward(mynode.angles);
|
|
}
|
|
|
|
return AnglesToForward(self.angles);
|
|
}
|
|
|
|
//Function Number: 26
|
|
getnodeorigin()
|
|
{
|
|
mynode = getclaimednode();
|
|
if(IsDefined(mynode))
|
|
{
|
|
return mynode.origin;
|
|
}
|
|
|
|
return self.origin;
|
|
}
|
|
|
|
//Function Number: 27
|
|
safemod(a,b)
|
|
{
|
|
result = int(a) % b;
|
|
result = result + b;
|
|
return result % b;
|
|
}
|
|
|
|
//Function Number: 28
|
|
angleclamp(angle)
|
|
{
|
|
anglefrac = angle / 360;
|
|
angle = anglefrac - floor(anglefrac) * 360;
|
|
return angle;
|
|
}
|
|
|
|
//Function Number: 29
|
|
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(#"24833BA3");
|
|
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;
|
|
}
|
|
|
|
//Function Number: 30
|
|
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;
|
|
}
|
|
|
|
//Function Number: 31
|
|
isinset(input,set)
|
|
{
|
|
for(i = set.size - 1;i >= 0;i--)
|
|
{
|
|
if(input == set[i])
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 32
|
|
notifyaftertime(notifystring,killmestring,time)
|
|
{
|
|
self endon("death");
|
|
self endon(killmestring);
|
|
wait(time);
|
|
self notify(notifystring);
|
|
}
|
|
|
|
//Function Number: 33
|
|
drawstringtime(msg,org,color,timer)
|
|
{
|
|
/#
|
|
maxtime = timer * 20;
|
|
for(i = 0;i < maxtime;i++)
|
|
{
|
|
print3d(org,msg,color,1,1);
|
|
wait(0.05);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 34
|
|
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);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 35
|
|
debugtimeout()
|
|
{
|
|
wait(5);
|
|
self notify("timeout");
|
|
}
|
|
|
|
//Function Number: 36
|
|
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);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 37
|
|
debugpos(org,string)
|
|
{
|
|
thread debugposinternal(org,string,2.15);
|
|
}
|
|
|
|
//Function Number: 38
|
|
debugpossize(org,string,size)
|
|
{
|
|
thread debugposinternal(org,string,size);
|
|
}
|
|
|
|
//Function Number: 39
|
|
showdebugproc(frompoint,topoint,color,printtime)
|
|
{
|
|
/#
|
|
self endon("death");
|
|
timer = printtime * 20;
|
|
for(i = 0;i < timer;i = i + 1)
|
|
{
|
|
wait(0.05);
|
|
line(frompoint,topoint,color);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 40
|
|
showdebugline(frompoint,topoint,color,printtime)
|
|
{
|
|
self thread showdebugproc(frompoint,5 + VectorScale((0,0,-1)),topoint,color);
|
|
}
|
|
|
|
//Function Number: 41
|
|
getnodeoffset(node)
|
|
{
|
|
if(IsDefined(node.offset))
|
|
{
|
|
return node.offset;
|
|
}
|
|
|
|
cover_left_crouch_offset = (-26,0.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 = 0;
|
|
nodeoffset = (0,0,0);
|
|
right = AnglesToRight(node.angles);
|
|
forward = AnglesToForward(node.angles);
|
|
switch(node.type)
|
|
{
|
|
case "Cover Left":
|
|
case "Cover Left Wide":
|
|
nodeoffset = calculatenodeoffset(right,forward,cover_left_crouch_offset);
|
|
continue;
|
|
nodeoffset = calculatenodeoffset(right,forward,cover_left_stand_offset);
|
|
break;
|
|
node isnodedontstand() && !node isnodedontcrouch()
|
|
break;
|
|
|
|
case "Cover Right":
|
|
case "Cover Right Wide":
|
|
nodeoffset = calculatenodeoffset(right,forward,cover_right_crouch_offset);
|
|
continue;
|
|
nodeoffset = calculatenodeoffset(right,forward,cover_right_stand_offset);
|
|
break;
|
|
node isnodedontstand() && !node isnodedontcrouch()
|
|
break;
|
|
|
|
case "Conceal Stand":
|
|
case "Cover Stand":
|
|
case "Turret":
|
|
nodeoffset = calculatenodeoffset(right,forward,cover_stand_offset);
|
|
break;
|
|
|
|
case "Conceal Crouch":
|
|
case "Cover Crouch":
|
|
case "Cover Crouch Window":
|
|
nodeoffset = calculatenodeoffset(right,forward,cover_crouch_offset);
|
|
break;
|
|
}
|
|
|
|
node.offset = nodeoffset;
|
|
return node.offset;
|
|
}
|
|
|
|
//Function Number: 42
|
|
calculatenodeoffset(right,forward,baseoffset)
|
|
{
|
|
return baseoffset[1] + VectorScale(forward) + (0,0,baseoffset[2]);
|
|
}
|
|
|
|
//Function Number: 43
|
|
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 0;
|
|
}
|
|
|
|
if(pitch > 45 || pitch < anim.covercrouchleanpitch - 45)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 44
|
|
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);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 45
|
|
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 = total_weight + animweights[i];
|
|
}
|
|
|
|
anim_play = randomfloat(total_weight);
|
|
current_weight = 0;
|
|
for(i = 0;i < total_anims;i++)
|
|
{
|
|
current_weight = current_weight + animweights[i];
|
|
if(anim_play >= current_weight)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
idleanim = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return animarray[idleanim];
|
|
}
|
|
|
|
//Function Number: 46
|
|
notforcedcover()
|
|
{
|
|
return self.a.forced_cover == "none" || self.a.forced_cover == "Show";
|
|
}
|
|
|
|
//Function Number: 47
|
|
forcedcover(msg)
|
|
{
|
|
return IsDefined(self.a.forced_cover) && self.a.forced_cover == msg;
|
|
}
|
|
|
|
//Function Number: 48
|
|
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);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 49
|
|
print3drise(org,msg,color,alpha,scale)
|
|
{
|
|
/#
|
|
newtime = 100;
|
|
up = 0;
|
|
org = org;
|
|
for(i = 0;i < newtime;i++)
|
|
{
|
|
up = up + 0.5;
|
|
print3d(org + (0,0,up),msg,color,alpha,scale);
|
|
wait(0.05);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 50
|
|
crossproduct(vec1,vec2)
|
|
{
|
|
return vec1[0] * vec2[1] - vec1[1] * vec2[0] > 0;
|
|
}
|
|
|
|
//Function Number: 51
|
|
scriptchange()
|
|
{
|
|
self.a.current_script = "none";
|
|
self notify(anim.scriptchange);
|
|
}
|
|
|
|
//Function Number: 52
|
|
delayedscriptchange()
|
|
{
|
|
wait(0.05);
|
|
scriptchange();
|
|
}
|
|
|
|
//Function Number: 53
|
|
getgrenademodel()
|
|
{
|
|
return getweaponmodel(self.grenadeweapon);
|
|
}
|
|
|
|
//Function Number: 54
|
|
sawenemymove(timer)
|
|
{
|
|
if(!(IsDefined(timer)))
|
|
{
|
|
timer = 500;
|
|
}
|
|
|
|
return GetTime() - self.personalsighttime < timer;
|
|
}
|
|
|
|
//Function Number: 55
|
|
canthrowgrenade()
|
|
{
|
|
if(!(self.grenadeammo))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.script_forcegrenade)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return isplayer(self.enemy);
|
|
}
|
|
|
|
//Function Number: 56
|
|
random_weight(array)
|
|
{
|
|
idleanim = randomint(array.size);
|
|
if(array.size > 1)
|
|
{
|
|
anim_weight = 0;
|
|
for(i = 0;i < array.size;i++)
|
|
{
|
|
anim_weight = anim_weight + array[i];
|
|
}
|
|
|
|
anim_play = randomfloat(anim_weight);
|
|
anim_weight = 0;
|
|
for(i = 0;i < array.size;i++)
|
|
{
|
|
anim_weight = anim_weight + array[i];
|
|
if(anim_play < anim_weight)
|
|
{
|
|
idleanim = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return idleanim;
|
|
}
|
|
|
|
//Function Number: 57
|
|
setfootstepeffect(name,fx)
|
|
{
|
|
/#
|
|
assert(IsDefined(name),"Need to define the footstep surface type.");
|
|
#/
|
|
/#
|
|
assert(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 = maps/mp/animscripts/zm_shared::playfootstepeffect;
|
|
}
|
|
|
|
//Function Number: 58
|
|
persistentdebugline(start,end)
|
|
{
|
|
/#
|
|
self endon("death");
|
|
level notify("newdebugline");
|
|
level endon("newdebugline");
|
|
for(;;)
|
|
{
|
|
line(start,end,(0.3,1,0),1);
|
|
wait(0.05);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 59
|
|
isnodedontstand()
|
|
{
|
|
return self.spawnflags & 4 == 4;
|
|
}
|
|
|
|
//Function Number: 60
|
|
isnodedontcrouch()
|
|
{
|
|
return self.spawnflags & 8 == 8;
|
|
}
|
|
|
|
//Function Number: 61
|
|
doesnodeallowstance(stance)
|
|
{
|
|
if(stance == "stand")
|
|
{
|
|
return !self isnodedontstand();
|
|
}
|
|
else
|
|
{
|
|
/#
|
|
assert(stance == "crouch");
|
|
#/
|
|
return !self isnodedontcrouch();
|
|
}
|
|
}
|
|
|
|
//Function Number: 62
|
|
animarray(animname)
|
|
{
|
|
/#
|
|
assert(IsDefined(self.a.array));
|
|
#/
|
|
/#
|
|
if(!(IsDefined(self.a.array[animname])))
|
|
{
|
|
dumpanimarray();
|
|
/#
|
|
assert(IsDefined(self.a.array[animname]),"self.a.array[ \" + animname + "\" ] is undefined");
|
|
}
|
|
#/
|
|
#/
|
|
return self.a.array[animname];
|
|
}
|
|
|
|
//Function Number: 63
|
|
animarrayanyexist(animname)
|
|
{
|
|
/#
|
|
assert(IsDefined(self.a.array));
|
|
#/
|
|
/#
|
|
if(!(IsDefined(self.a.array[animname])))
|
|
{
|
|
dumpanimarray();
|
|
/#
|
|
assert(IsDefined(self.a.array[animname]),"self.a.array[ \" + animname + "\" ] is undefined");
|
|
}
|
|
#/
|
|
#/
|
|
return self.a.array[animname].size > 0;
|
|
}
|
|
|
|
//Function Number: 64
|
|
animarraypickrandom(animname)
|
|
{
|
|
/#
|
|
assert(IsDefined(self.a.array));
|
|
#/
|
|
/#
|
|
if(!(IsDefined(self.a.array[animname])))
|
|
{
|
|
dumpanimarray();
|
|
/#
|
|
assert(IsDefined(self.a.array[animname]),"self.a.array[ \" + animname + "\" ] is undefined");
|
|
}
|
|
#/
|
|
#/
|
|
/#
|
|
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];
|
|
}
|
|
|
|
//Function Number: 65
|
|
dumpanimarray()
|
|
{
|
|
/#
|
|
println("self.a.array:");
|
|
keys = getarraykeys(self.a.array);
|
|
for(i = 0;i < keys.size;i++)
|
|
{
|
|
if(isarray(self.a.array[keys[i]]))
|
|
{
|
|
println(" array[ \" + keys[i] + "\" ] = {array of size " + self.a.array[keys[i]].size + "}");
|
|
}
|
|
else
|
|
{
|
|
println(" array[ \" + keys[i] + "\" ] = ",self.a.array[keys[i]]);
|
|
}
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 66
|
|
getanimendpos(theanim)
|
|
{
|
|
movedelta = getmovedelta(theanim,0,1);
|
|
return self localtoworldcoords(movedelta);
|
|
}
|
|
|
|
//Function Number: 67
|
|
isvalidenemy(enemy)
|
|
{
|
|
if(!(IsDefined(enemy)))
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//Function Number: 68
|
|
damagelocationisany(a,b,c,d,e,f,g,h,i,j,k,ovr)
|
|
{
|
|
if(!(IsDefined(a)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == a)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(b)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == b)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(c)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == c)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(d)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == d)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(e)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == e)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(f)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == f)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(g)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == g)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(h)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == h)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(i)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == i)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(j)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == j)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(!(IsDefined(k)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self.damagelocation == k)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
/#
|
|
assert(!IsDefined(ovr));
|
|
#/
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 69
|
|
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 = 1;
|
|
self startragdoll();
|
|
wait(0.05);
|
|
physicsexplosionsphere(lastorg,600,0,force * 0.1);
|
|
self notify("killanimscript");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 70
|
|
iscqbwalking()
|
|
{
|
|
return IsDefined(self.cqbwalking) && self.cqbwalking;
|
|
}
|
|
|
|
//Function Number: 71
|
|
squared(value)
|
|
{
|
|
return value * value;
|
|
}
|
|
|
|
//Function Number: 72
|
|
randomizeidleset()
|
|
{
|
|
self.a.idleset = randomint(2);
|
|
}
|
|
|
|
//Function Number: 73
|
|
getrandomintfromseed(intseed,intmax)
|
|
{
|
|
/#
|
|
assert(intmax > 0);
|
|
#/
|
|
index = intseed % anim.randominttablesize;
|
|
return anim.randominttable[index] % intmax;
|
|
}
|
|
|
|
//Function Number: 74
|
|
is_banzai()
|
|
{
|
|
return IsDefined(self.banzai) && self.banzai;
|
|
}
|
|
|
|
//Function Number: 75
|
|
is_heavy_machine_gun()
|
|
{
|
|
return IsDefined(self.heavy_machine_gunner) && self.heavy_machine_gunner;
|
|
}
|
|
|
|
//Function Number: 76
|
|
is_zombie()
|
|
{
|
|
if(IsDefined(self.is_zombie) && self.is_zombie)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
//Function Number: 77
|
|
is_civilian()
|
|
{
|
|
if(IsDefined(self.is_civilian) && self.is_civilian)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
//Function Number: 78
|
|
is_zombie_gibbed()
|
|
{
|
|
return self is_zombie() && self.gibbed;
|
|
}
|
|
|
|
//Function Number: 79
|
|
set_zombie_gibbed()
|
|
{
|
|
if(self is_zombie())
|
|
{
|
|
self.gibbed = 1;
|
|
}
|
|
}
|
|
|
|
//Function Number: 80
|
|
is_skeleton(skeleton)
|
|
{
|
|
if(skeleton == "base" && issubstr(get_skeleton(),"scaled"))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return get_skeleton() == skeleton;
|
|
}
|
|
|
|
//Function Number: 81
|
|
get_skeleton()
|
|
{
|
|
if(IsDefined(self.skeleton))
|
|
{
|
|
return self.skeleton;
|
|
}
|
|
else
|
|
{
|
|
return "base";
|
|
}
|
|
}
|
|
|
|
//Function Number: 82
|
|
debug_anim_print(text)
|
|
{
|
|
/#
|
|
if(IsDefined(level.dog_debug_anims) && level.dog_debug_anims)
|
|
{
|
|
println(text + " " + GetTime());
|
|
}
|
|
|
|
if(IsDefined(level.dog_debug_anims_ent) && level.dog_debug_anims_ent == self getentnum())
|
|
{
|
|
println(text + " " + GetTime());
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 83
|
|
debug_turn_print(text,line)
|
|
{
|
|
/#
|
|
if(IsDefined(level.dog_debug_turns) && level.dog_debug_turns == self getentnum())
|
|
{
|
|
duration = 200;
|
|
currentyawcolor = (1,1,1);
|
|
lookaheadyawcolor = (1,0,0);
|
|
desiredyawcolor = (1,1,0);
|
|
currentyaw = AngleClamp180(self.angles[1]);
|
|
desiredyaw = AngleClamp180(self.desiredangle);
|
|
lookaheaddir = self.lookaheaddir;
|
|
lookaheadangles = VectorToAngles(lookaheaddir);
|
|
lookaheadyaw = AngleClamp180(lookaheadangles[1]);
|
|
println(text + " " + GetTime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 84
|
|
play_sound_on_tag_endon_death(alias,tag)
|
|
{
|
|
maps/mp/_utility::play_sound_on_tag(alias,tag);
|
|
}
|
|
|
|
//Function Number: 85
|
|
play_sound_in_space(alias,origin,master)
|
|
{
|
|
org = spawn("script_origin",(0,0,1));
|
|
if(!(IsDefined(origin)))
|
|
{
|
|
origin = self.origin;
|
|
}
|
|
|
|
org.origin = origin;
|
|
if(IsDefined(master) && master)
|
|
{
|
|
org playsoundasmaster(alias);
|
|
}
|
|
else
|
|
{
|
|
org playsound(alias);
|
|
}
|
|
|
|
if(IsDefined(org))
|
|
{
|
|
org delete();
|
|
}
|
|
}
|
|
|
|
//Function Number: 86
|
|
wait_network_frame()
|
|
{
|
|
if(numremoteclients())
|
|
{
|
|
snapshot_ids = getsnapshotindexarray();
|
|
for(acked = undefined;!(IsDefined(acked));acked = snapshotacknowledged(snapshot_ids))
|
|
{
|
|
level waittill("snapacknowledged");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wait(0.1);
|
|
}
|
|
} |