Files
IL-GSC/BO2/PC/ZM/maps/mp/animscripts/zm_utility.gsc
2023-10-28 00:17:17 -04:00

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);
}
}