1
0
Fork 0
forked from fte/fteqw

movevars and pmove are obsolete. Bit of a code cleanup.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3213 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2009-06-07 15:46:12 +00:00
parent 691f57ee80
commit 54f6c830de
12 changed files with 172 additions and 96 deletions

View file

@ -26,12 +26,12 @@ float(string name) iscachedpic = #316; // (EXT_CSQC)
string(string name, float trywad) precache_pic = #317; // (EXT_CSQC)
vector(string picname) draw_getimagesize = #318; // (EXT_CSQC)
void(string name) freepic = #319; // (EXT_CSQC)
float(vector position, float character, vector scale, vector rgb, float alpha, ...) drawcharacter = #320; // (EXT_CSQC, [EXT_CSQC_???])
float(vector position, string text, vector scale, vector rgb, float alpha, ...) drawstring = #321; // (EXT_CSQC, [EXT_CSQC_???])
float(vector position, string pic, vector size, vector rgb, float alpha, ...) drawpic = #322; // (EXT_CSQC, [EXT_CSQC_???])
float(vector position, vector size, vector rgb, float alpha, ...) drawfill = #323; // (EXT_CSQC, [EXT_CSQC_???])
void(float x, float y, float width, float height) drawsetcliparea = #324; // (EXT_CSQC_???)
void(void) drawresetcliparea = #325; // (EXT_CSQC_???)
void(vector position, float character, vector scale, vector rgb, float alpha, ...) drawcharacter = #320; // (EXT_CSQC, [EXT_CSQC_???])
void(vector position, string text, vector scale, vector rgb, float alpha, ...) drawrawstring = #321; // (EXT_CSQC, [EXT_CSQC_???])
void(vector position, string pic, vector size, vector rgb, float alpha, ...) drawpic = #322; // (EXT_CSQC, [EXT_CSQC_???])
void(vector position, vector size, vector rgb, float alpha, ...) drawfill = #323; // (EXT_CSQC, [EXT_CSQC_???])
void(vector position, string text, vector scale, float alpha, ...) drawstring = #326; // (EXT_CSQC_1)
float(float stnum) getstatf = #330; // (EXT_CSQC)
float(float stnum) getstati = #331; // (EXT_CSQC)
@ -42,6 +42,7 @@ string(float mdlindex) modelnameforindex = #334; // (EXT_CSQC)
float(string effectname) particleeffectforname = #335; // (EXT_CSQC)
#ifdef WORKINDP
//DP got the arguments the wrong way around...
void(entity ent, float effectnum, vector start, vector end) trailparticles_dp = #336; // (EXT_CSQC),
void(float effectnum, entity ent, vector start, vector end) trailparticles =
{
@ -81,4 +82,16 @@ float() readlong = #363; // (EXT_CSQC)
float() readcoord = #364; // (EXT_CSQC)
float() readangle = #365; // (EXT_CSQC)
string() readstring = #366; // (EXT_CSQC)
string() readfloat = #367; // (EXT_CSQC)
string() readfloat = #367; // (EXT_CSQC)
void(string model, void(float isnew) updatefunc, float flags) deltalisten = #371;
//void(float flags, float simtime) readserverentitystate = #369;
#define RSES_NOLERP 1 //only really for use on predicted player entities
#define RSES_AUTOROTATE 0
#define RSES_NOROTATE 2
#define RSES_AUTOTRAILS 0
#define RSES_NOTRAILS 4
#define RSES_AUTOLIGHTS 0
#define RSES_NOLIGHTS 8
void(string evname, string argdesc, ...) sendevent = #359;

View file

@ -1,18 +1,9 @@
void(string model, void(float isnew) updatefunc, float flags) deltalisten = #371;
void(float flags, float simtime) readserverentitystate = #369;
#define RSES_NOLERP 1 //only really for use on predicted player entities
#define RSES_AUTOROTATE 0
#define RSES_NOROTATE 2
#define RSES_AUTOTRAILS 0
#define RSES_NOTRAILS 4
#define RSES_AUTOLIGHTS 0
#define RSES_NOLIGHTS 8
#ifdef WORKINDP
#define show_scoreboard sb_showscores
#endif
float show_scoreboard;
string dbgstr;
//check engine extensions, and give suitable warning
void() checkengineversion =
@ -38,6 +29,14 @@ float(float f1, float f2) testfunc2 =
return f1+f2;
}
float testarray[2];
float(float p1, float p2) a = {return p1+p2+5;};
float() b = {return 86;};
float(float p1) c = {return p1+566;};
float() d = {return 7773;};
#pragma TARGET ID
void() checkcompilerversion =
{
local entity testent;
@ -53,6 +52,8 @@ void() checkcompilerversion =
testarray[0] = 5;
testarray[1] = 6;
if (testfunc (a(b(), c(d()))) != 86+5+7773+566)
print("compiler failed on a(b(), c(d()))\n");
if (testfunc(5)+testfunc(6) != 11)
print("compiler failed on f()+f()\n");
if (testfunc2(5, testfunc(6)) != 11)
@ -63,6 +64,9 @@ void() checkcompilerversion =
print("compiler failed on a[0]+a[1]\n");
};
#ifdef FTEDEPENDANT
# pragma TARGET FTE
#endif
void(float isnew) RefreshPlayer;
@ -141,6 +145,9 @@ float(string str) CSQC_ConsoleCommand =
args = tokenize(str);
switch(argv(0))
{
case "test":
sendevent("testevent", "fsev", 64, "hello world", player_local, '73 72 71');
break;
case "tetris":
Menu_Tetris();
break;
@ -181,6 +188,18 @@ float(string str) CSQC_ConsoleCommand =
return true;
};
void(string msg, float type) CSQC_Parse_Print =
{
print("parse_print(", ftos(type), "): ");
print(msg);
cprint(msg);
if (dbgstr)
strunzone(dbgstr);
dbgstr = strzone(msg);
};
void() CSQC_Ent_Remove = //the ent disappeared on the server.
{
if (self.removefunc)
@ -334,7 +353,12 @@ void(float width, float height, float do2d) CSQC_UpdateView =
setviewprop(VF_MIN, '0 0 0');
setviewprop(VF_SIZE_X, width);
setviewprop(VF_SIZE_Y, height);
#if 0
setviewprop(VF_MIN_X, width/2);
setviewprop(VF_MIN_Y, height/2);
setviewprop(VF_SIZE_X, width/2);
setviewprop(VF_SIZE_Y, height/2);
#endif
addentities(MASK_NORMAL|MASK_ENGINE);
if (player_local)
@ -357,7 +381,15 @@ void(float width, float height, float do2d) CSQC_UpdateView =
}
renderscene();
#if 0
clearscene();
setviewprop(VF_MIN_X, 0);
setviewprop(VF_MIN_Y, 0);
setviewprop(VF_SIZE_X, width/2);
setviewprop(VF_SIZE_Y, height/2);
addentities(MASK_NORMAL|MASK_ENGINE);
renderscene();
#endif
if (do2d)
{
if (hudtype)
@ -365,5 +397,11 @@ void(float width, float height, float do2d) CSQC_UpdateView =
Menu_Think();
}
if (dbgstr)
{
drawrawstring('16 64 0', dbgstr, '16 16 16', '1 1 1', 0.5);
drawstring('16 80 0', dbgstr, '16 16 16', 0.5);
}
};

View file

@ -23,7 +23,7 @@ string anumber[10] = {
"anum_8",
"anum_9"
};
void Hud_Init(void)
void() Hud_Init
{
float i;
precache_pic("sbar", true);
@ -37,7 +37,7 @@ void Hud_Init(void)
vector screensize;
float items, items2;
void Hud_DrawLargeValue(vector pos, float value, float threshhold)
void(vector pos, float value, float threshhold) Hud_DrawLargeValue =
{
float c;
float len;
@ -77,7 +77,7 @@ void Hud_DrawLargeValue(vector pos, float value, float threshhold)
}
};
void Hud_DrawAmmoCount(float type, vector pos, float drawback)
void(float type, vector pos, float drawback) Hud_DrawAmmoCount =
{
string s;
float value;
@ -110,11 +110,11 @@ string weaponnames[7] = {
"inv_srlaunch",
"inv_lightng"
};
void Hud_DrawWeapon(float num, vector pos)
void(float num, vector pos) Hud_DrawWeapon
{
drawpic(pos, weaponnames[num], '24 16 0', '1 1 1', 1, 0);
};
void Hud_DrawWeaponWide(float num, vector pos) //for LG
void(float num, vector pos) Hud_DrawWeaponWide //for LG
{
drawpic(pos, weaponnames[num], '48 16 0', '1 1 1', 1, 0);
};
@ -131,7 +131,7 @@ string(float f, float chars, string lead) FormatFloat
return s;
};
void() Hud_CoopScores_SBar =
void(vector pos) Hud_CoopScores_SBar =
{
string s;
float secs;
@ -141,57 +141,53 @@ void() Hud_CoopScores_SBar =
drawpic(sbar, "scorebar", '320 24 0', '1 1 1', 0.333, 0);
s = strcat("Monsters:", FormatFloat(getstati(STAT_KILLEDMONSTERS), 3, " "), "/", FormatFloat(getstati(STAT_TOTALMONSTERS), 3, " "));
drawstring(sbar + '8 4', s, '8 8 8', '1 1 1', 1, 0);
drawstring(sbar + '8 4', s, '8 8 8', 1, 0);
s = strcat("Secrets :", FormatFloat(getstati(STAT_FOUNDSECRETS), 3, " "), "/", FormatFloat(getstati(STAT_TOTALSECRETS), 3, " "));
drawstring(sbar + '8 12', s, '8 8 8', '1 1 1', 1, 0);
drawstring(sbar + '8 12', s, '8 8 8', 1, 0);
mins = floor(time/60);
secs = floor(time - mins*60);
s = strcat("Time :", FormatFloat(mins, 3, " "), ":", FormatFloat(secs, 2, "0"));
drawstring(sbar + '184 4', s, '8 8 8', '1 1 1', 1, 0);
drawstring(sbar + '184 4', s, '8 8 8', 1, 0);
drawstring(sbar + '232 12' - strlen(levelname)*'4 0', levelname, '8 8 8', '1 1 1', 1, 0);
drawstring(sbar + '232 12' - strlen(levelname)*'4 0', levelname, '8 8 8', 1, 0);
};
void Hud_DrawSBar(void)
void Hud_DrawSBar(vector pos)
{
vector sbar;
sbar = screensize_y * ' 0 1 0' - '0 24 0';
drawpic(sbar, "sbar", '320 24 0', '1 1 1', 0.333, 0);
drawpic(pos, "sbar", '320 24 0', '1 1 1', 0.333, 0);
if (items & IT_INVULNERABILITY)
{
drawpic(sbar, "disc", '24 24 0', '1 1 1', 1, 0);
Hud_DrawLargeValue(sbar+'24 0 0', 999, 25);
drawpic(pos, "disc", '24 24 0', '1 1 1', 1, 0);
Hud_DrawLargeValue(pos+'24 0 0', 999, 25);
}
else
{
Hud_DrawLargeValue(sbar+'24 0 0', getstati(STAT_ARMOR), 25);
Hud_DrawLargeValue(pos+'24 0 0', getstati(STAT_ARMOR), 25);
if (items & IT_ARMOR3)
drawpic(sbar, "sb_armor3", '24 24 0', '1 1 1', 1, 0);
drawpic(pos, "sb_armor3", '24 24 0', '1 1 1', 1, 0);
else if (items & IT_ARMOR2)
drawpic(sbar, "sb_armor2", '24 24 0', '1 1 1', 1, 0);
drawpic(pos, "sb_armor2", '24 24 0', '1 1 1', 1, 0);
else if (items & IT_ARMOR1)
drawpic(sbar, "sb_armor1", '24 24 0', '1 1 1', 1, 0);
drawpic(pos, "sb_armor1", '24 24 0', '1 1 1', 1, 0);
}
Hud_DrawLargeValue(sbar+'136 0 0', getstati(STAT_HEALTH), 25);
Hud_DrawLargeValue(pos+'136 0 0', getstati(STAT_HEALTH), 25);
if (items & IT_SHELLS)
drawpic(sbar+'224 0 0', "sb_shells", '24 24 0', '1 1 1', 1, 0);
drawpic(pos+'224 0 0', "sb_shells", '24 24 0', '1 1 1', 1, 0);
else if (items & IT_NAILS)
drawpic(sbar+'224 0 0', "sb_nails", '24 24 0', '1 1 1', 1, 0);
drawpic(pos+'224 0 0', "sb_nails", '24 24 0', '1 1 1', 1, 0);
else if (items & IT_ROCKETS)
drawpic(sbar+'224 0 0', "sb_rocket", '24 24 0', '1 1 1', 1, 0);
drawpic(pos+'224 0 0', "sb_rocket", '24 24 0', '1 1 1', 1, 0);
else if (items & IT_CELLS)
drawpic(sbar+'224 0 0', "sb_cells", '24 24 0', '1 1 1', 1, 0);
Hud_DrawLargeValue(sbar+'248 0 0', getstati(STAT_AMMO), 10);
drawpic(pos+'224 0 0', "sb_cells", '24 24 0', '1 1 1', 1, 0);
Hud_DrawLargeValue(pos+'248 0 0', getstati(STAT_AMMO), 10);
};
void Hud_DrawIBar(void)
void Hud_DrawIBar(vector pos)
{
vector pos;
pos= screensize_y * ' 0 1 0' - '0 48 0';
drawpic(pos, "ibar", '320 24 0', '1 1 1', 0.333, 0);
if (items & IT_SHOTGUN)
@ -209,10 +205,10 @@ void Hud_DrawIBar(void)
if (items & IT_LIGHTNING)
Hud_DrawWeaponWide(6, pos+'144 8 0');
Hud_DrawAmmoCount(0, pos + '6 0 0', false);
Hud_DrawAmmoCount(1, pos + '54 0 0', false);
Hud_DrawAmmoCount(2, pos + '102 0 0', false);
Hud_DrawAmmoCount(3, pos + '150 0 0', false);
Hud_DrawAmmoCount(0, pos + '10 0 0', false);
Hud_DrawAmmoCount(1, pos + '58 0 0', false);
Hud_DrawAmmoCount(2, pos + '106 0 0', false);
Hud_DrawAmmoCount(3, pos + '154 0 0', false);
if (items & IT_KEY1)
drawpic(pos+'192 8 0', "sb_key1", '16 16 0', '1 1 1', 1, 0);
@ -343,26 +339,27 @@ void Hud_DrawQ3Head(vector topleft, vector sz, string skinname, vector ang)
hud3ditem.skin = 0;
}
void Hud_Q3(void)
void Hud_Q3(vector pos)
{
vector sbar;
sbar = screensize_y * ' 0 1 0' - '0 24 0';
Hud_Draw3dItem(pos+'224 0', '24 24', "models/powerups/ammo/rocketam.md3", '70 0 0', '0 90 0' + ('0 1 0'*20)*sin(time));
Hud_Draw3dItem(pos+'0 0', '24 24', "models/powerups/armor/armor_red.md3", '80 0 -10', '0 1 0'*360*(time/6));
Hud_DrawQ3Head(pos+'112 0', '24 24', cvar_string("cg_forceskin"), '0 180 0'+'0 20 0'*sin(time));
Hud_Draw3dItem(sbar+'224 0', '24 24', "models/powerups/ammo/rocketam.md3", '70 0 0', '0 90 0' + ('0 1 0'*20)*sin(time));
Hud_Draw3dItem(sbar+'0 0', '24 24', "models/powerups/armor/armor_red.md3", '80 0 -10', '0 1 0'*360*(time/6));
Hud_DrawQ3Head(sbar+'112 0', '24 24', cvar_string("cg_forceskin"), '0 180 0'+'0 20 0'*sin(time));
Hud_DrawQ3Number(sbar+'24 0 0', getstati(STAT_ARMOR), '1 1 1');
Hud_DrawQ3Number(sbar+'136 0 0', getstati(STAT_HEALTH), '1 1 1');
Hud_DrawQ3Number(sbar+'248 0 0', getstati(STAT_AMMO), '1 1 1');
Hud_DrawQ3Number(pos+'24 0 0', getstati(STAT_ARMOR), '1 1 1');
Hud_DrawQ3Number(pos+'136 0 0', getstati(STAT_HEALTH), '1 1 1');
Hud_DrawQ3Number(pos+'248 0 0', getstati(STAT_AMMO), '1 1 1');
}
nonstatic void Hud_Draw(float hudtype, float scoreboard, float width, float height)
{
vector pos;
screensize_x = width;
screensize_y = height;
screensize_z = 0;
pos_x = (screensize_x-320)/2;
pos_y = screensize_y;
items = getstatbits(STAT_ITEMS, 0, 23);
items2 = getstatbits(STAT_ITEMS, 23, 9);
@ -376,12 +373,12 @@ nonstatic void Hud_Draw(float hudtype, float scoreboard, float width, float heig
{
if (scoreboard)
{
Hud_CoopScores_SBar();
Hud_CoopScores_SBar(pos - '0 24 0');
}
else
{
Hud_DrawSBar();
Hud_DrawSBar(pos - '0 24 0');
}
Hud_DrawIBar();
Hud_DrawIBar(pos - '0 48 0');
}
};

View file

@ -181,7 +181,7 @@ nonstatic void(entity ent) Pred_UpdateLocalMovement =
Pred_RunMovement(ent, clientcommandframe);
if (ent.origin_z > pmove_step_oldz+8 && ent.origin_z < pmove_step_oldz+24 && pmove_vel_z == 0)
if (ent.origin_z > pmove_step_oldz+8 && ent.origin_z < pmove_step_oldz+24 && ent.velocity_z == 0)
{
//evaluate out the remaining old step
if (pmove_steptime - time > 0)

View file

@ -15,7 +15,9 @@
#define CSQC 1
#endif
#pragma noref 1
#ifdef FTEQCC
#pragma noref 1 //remove warnings about unreferenced variables.
#endif
/*
==============================================================================
@ -32,6 +34,7 @@ entity self;
entity other;
entity world;
float time;
float cltime;
float frametime;
float player_localentnum; //the entnum
@ -51,6 +54,9 @@ float intermission; //non-zero if the server sent an svc_intermission.
// global variables set by built in functions
//
vector v_forward, v_up, v_right; // set by makevectors()
#ifndef WORKINDP
vector view_angles;
#endif
// set by traceline / tracebox
float trace_allsolid;
@ -69,19 +75,22 @@ void() CSQC_Shutdown;
float(float f, float t, float n) CSQC_InputEvent;
void(float width, float height, float do2d) CSQC_UpdateView;
float(string s) CSQC_ConsoleCommand;
#endif
//these fields are read and set by the default player physics
vector pmove_org;
vector pmove_vel;
vector pmove_mins;
vector pmove_maxs;
#endif
//retrieved from the current movement commands (read by player physics)
float input_timelength;
vector input_angles;
vector input_movevalues; //forwards, right, up.
float input_buttons; //attack, use, jump (default physics only uses jump)
float input_impulse;
#ifdef WORKINDP
float movevar_gravity;
float movevar_stopspeed;
float movevar_maxspeed;
@ -92,6 +101,7 @@ float movevar_wateraccelerate;
float movevar_friction;
float movevar_waterfriction;
float movevar_entgravity; //the local player's gravity field. Is a multiple (1 is the normal value)
#endif
//================================================
void end_sys_globals; // flag for structure dumping
@ -123,6 +133,9 @@ void end_sys_globals; // flag for structure dumping
.vector velocity;
.vector angles;
.vector avelocity;
#ifndef WORKINDP
.float pmove_flags;
#endif
.string classname; // spawn function
@ -132,20 +145,22 @@ void end_sys_globals; // flag for structure dumping
.string model;
.float frame;
#ifndef WORKINDP
.float frame1time; //for automatic framegroups.
.float frame2;
.float frame2time;
.float lerpfrac; //the ammount of frame2 to use.
#endif
.float skin;
#ifdef WORKINDP
.float effects;
#endif
.vector mins, maxs; // bounding box extents reletive to origin
.vector size; // maxs - mins
.void() touch;
#ifdef WORKINDP
.void() use;
#endif
.void() think;
.void() blocked; // for doors or plats, called when can't push other
@ -157,7 +172,7 @@ void end_sys_globals; // flag for structure dumping
.string netname;
#endif
.entity enemy;
.entity enemy;
.float flags;
@ -169,24 +184,23 @@ void end_sys_globals; // flag for structure dumping
void end_sys_fields; // flag for structure dumping
//================================================
#ifdef WORKINDP
.float frame2;
.float renderflags;
.float lerpfrac;
#ifdef FTEQCC
#pragma noref 0
#endif
#ifdef WORKINDP
.float frame2;
.float frame1time;
.float frame2time;
.float renderflags;
.float lerpfrac;
vector view_angles;
#endif
//optional extras
.float alpha;
.float scale;
.float forceshader; //an fte extension, to force a q3 shader upon a model
.float fatness; //an fte feature, to expand alias models along thier normals.
float pmove_jump_held;
float pmove_waterjumptime;
.float frame1time; //for automatic framegroups.
.float frame2time;
#pragma noref 0

View file

@ -1 +1,2 @@
#define CSQC
#define CSQC
//#pragma compress 1

View file

@ -0,0 +1,2 @@
#pragma sourcefile csprogs.src
#pragma sourcefile ssqc.src

View file

@ -440,7 +440,7 @@ stagger back a bit
*/
void(float dist) ai_pain =
{
self.Version++; //if nothing else happened, we animated.
self.SendFlags = FULLSEND; //if nothing else happened, we animated.
ai_back (dist);
/*
@ -462,7 +462,7 @@ stagger back a bit
*/
void(float dist) ai_painforward =
{
self.Version++; //if nothing else happened, we animated.
self.SendFlags = FULLSEND; //if nothing else happened, we animated.
walkmove (self.ideal_yaw, dist);
};
@ -476,7 +476,7 @@ The monster is walking it's beat
*/
void(float dist) ai_walk =
{
self.Version++; //if nothing else happened, we animated.
self.SendFlags = FULLSEND; //if nothing else happened, we animated.
movedist = dist;
@ -502,7 +502,7 @@ The monster is staying in one place for a while, with slight angle turns
*/
void() ai_stand =
{
self.Version++; //if nothing else happened, we animated.
self.SendFlags = FULLSEND; //if nothing else happened, we animated.
if (FindTarget ())
return;
@ -681,7 +681,7 @@ The monster has an enemy it is trying to kill
*/
void(float dist) ai_run =
{
self.Version++; //if nothing else happened, we animated.
self.SendFlags = FULLSEND; //if nothing else happened, we animated.
movedist = dist;
// see if the enemy is dead

View file

@ -546,7 +546,7 @@ void() PutClientInServer =
if (serverusingcsqc)
{
self.SendEntity = SendPlayer;
self.Version = self.Version+1;
self.SendFlags = FULLSEND;
}
DecodeLevelParms ();
@ -960,7 +960,7 @@ void() PlayerPreThink =
if (self.view_ofs == '0 0 0')
return; // intermission or finale
self.Version++;
self.SendFlags = FULLSEND;
makevectors (self.v_angle); // is this still used

View file

@ -503,5 +503,6 @@ float(entity targ, entity inflictor) CanDamage;
float serverusingcsqc;
.float(entity to) SendEntity;
.float Version;
.float SendFlags;
#define FULLSEND 0xffffff
float MSG_ENTITY = 5;

View file

@ -515,7 +515,7 @@ float(entity ent) WriteGibs =
void(float type) ThrowCSQCGibs =
{
self.cnt = type;
self.Version = self.Version+1;
self.SendFlags = FULLSEND;
self.SendEntity = WriteGibs;
if (type != GIB_PLAYER)
{ //schedule removal after a second.

View file

@ -370,7 +370,17 @@ void() BecomeExplosion =
self.dimension_seen = 2;
dimension_send = 2;
#if 1
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
#else
te_explosion(self.origin);
#endif
sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
self.dimension_seen = 3;
dimension_send = 3;
@ -382,7 +392,7 @@ void() BecomeExplosion =
self.source = self.origin;
self.SendEntity = SendExplosion;
self.starttime = time;
self.Version+=1;
self.SendFlags = FULLSEND;
};
void() T_MissileTouch =
@ -458,7 +468,7 @@ void() W_FireRocket =
missile.source = missile.origin;
missile.SendEntity = SendRocket;
missile.starttime = time;
missile.Version+=1;
missile.SendFlags = FULLSEND;
};
/*
@ -680,7 +690,7 @@ void(vector org, vector dir) launch_spike =
newmis.velocity = dir * 1000;
newmis.SendEntity = SendNail;
newmis.Version++;
newmis.SendFlags = FULLSEND;
newmis.source = newmis.origin;
newmis.starttime = time;
};