19 Sep 2007

This commit is contained in:
g-cont 2007-09-19 00:00:00 +04:00 committed by Alibek Omarov
parent d002f418e7
commit e0a3de04fd
37 changed files with 491 additions and 890 deletions

View File

@ -33,15 +33,13 @@ SV_ClipToLinks SV_ClipMoveToEntities
SV_FreeEdict не передается указатель OK SV_FreeEdict не передается указатель OK
наладить think system OK наладить think system OK
наладить VM_bprint и VM_dprint OK наладить VM_bprint и VM_dprint OK
îđăŕíčçîâŕňü ďĺđĺäŕ÷ó progs.sv â priv.sv->s организовать передачу progs.sv в priv.sv->s OK
ďîëíŕ˙ îňëŕäęŕ ôčçčęč! настроить связи между progs и state OK
íŕńňđîčňü ńâ˙çč ěĺćäó progs č state переписать CM_LoadModel OK
игрок застревает в полу после команды reconnect OK
отладка физики
} }
SV_CreateBaseLine progs->state
SV_BuildClientFrame progs->state
SV_PrepWorldFrame state<-progs
//================================================== //==================================================
// то, что уже готово // то, что уже готово
//================================================== //==================================================

View File

@ -658,13 +658,13 @@ scriptsystem_api_t Sc_GetAPI( void )
sc.Load = FS_LoadScript; sc.Load = FS_LoadScript;
sc.Include = FS_AddScript; sc.Include = FS_AddScript;
sc.GetToken = SC_GetToken; sc.GetToken = SC_GetToken;
sc.Token = SC_Token;
sc.TryToken = SC_TryToken; sc.TryToken = SC_TryToken;
sc.FreeToken = SC_FreeToken; sc.FreeToken = SC_FreeToken;
sc.SkipToken = SC_SkipToken; sc.SkipToken = SC_SkipToken;
sc.MatchToken = SC_MatchToken; sc.MatchToken = SC_MatchToken;
sc.ParseToken = SC_ParseToken; sc.ParseToken = SC_ParseToken;
sc.ParseWord = SC_ParseWord; sc.ParseWord = SC_ParseWord;
sc.Token = token;
return sc; return sc;
} }

View File

@ -23,7 +23,7 @@ if errorlevel 1 set BUILD_ERROR=1
%MSDEV% render/render.dsp %CONFIG%"render - Win32 Debug" %build_target% %MSDEV% render/render.dsp %CONFIG%"render - Win32 Debug" %build_target%
if errorlevel 1 set BUILD_ERROR=1 if errorlevel 1 set BUILD_ERROR=1
vprogs\qcclib.exe qcclib.exe -src vprogs
if errorlevel 1 set BUILD_ERROR=1 if errorlevel 1 set BUILD_ERROR=1
if "%BUILD_ERROR%"=="" goto build_ok if "%BUILD_ERROR%"=="" goto build_ok
@ -50,10 +50,10 @@ if exist engine\engine.plg del /f /q engine\engine.plg
if exist launch\launch.plg del /f /q launch\launch.plg if exist launch\launch.plg del /f /q launch\launch.plg
if exist common\common.plg del /f /q common\common.plg if exist common\common.plg del /f /q common\common.plg
if exist render\render.plg del /f /q render\render.plg if exist render\render.plg del /f /q render\render.plg
if exist vprogs\server.dat move vprogs\server.dat D:\Xash3D\xash\server.dat if exist server.dat move server.dat D:\Xash3D\xash\server.dat
echo Build succeeded! echo Build succeeded!
echo Please wait. Xash is now loading echo Please wait. Xash is now loading
cd D:\Xash3D\ cd D:\Xash3D\
xash.exe +map qctest -log xash.exe +map base1 -log
:done :done

View File

@ -278,9 +278,8 @@ void CL_ParseDelta (entity_state_t *from, entity_state_t *to, int number, int bi
if (bits & U_SEQUENCE) to->sequence = MSG_ReadByte (&net_message); if (bits & U_SEQUENCE) to->sequence = MSG_ReadByte (&net_message);
if (bits & U_SOLID) to->solid = MSG_ReadShort (&net_message); if (bits & U_SOLID) to->solid = MSG_ReadShort (&net_message);
if (bits & U_ALPHA) to->alpha = MSG_ReadFloat (&net_message); if (bits & U_ALPHA) to->alpha = MSG_ReadFloat (&net_message);
if (bits & U_SOUND) to->sound = MSG_ReadByte (&net_message);
if (bits & U_EVENT) to->event = MSG_ReadByte (&net_message); if (bits & U_EVENT) to->event = MSG_ReadByte (&net_message);
if (bits & U_SOUNDIDX) to->soundindex = MSG_ReadByte (&net_message);
else to->event = 0; else to->event = 0;
if (bits & U_BODY) to->body = MSG_ReadByte (&net_message); if (bits & U_BODY) to->body = MSG_ReadByte (&net_message);

View File

@ -498,7 +498,7 @@ void V_RenderView( float stereo_separation )
cl.refdef.width = scr_vrect.width; cl.refdef.width = scr_vrect.width;
cl.refdef.height = scr_vrect.height; cl.refdef.height = scr_vrect.height;
cl.refdef.fov_y = CalcFov (cl.refdef.fov_x, cl.refdef.width, cl.refdef.height); cl.refdef.fov_y = CalcFov (cl.refdef.fov_x, cl.refdef.width, cl.refdef.height);
cl.refdef.time = cl.time; // render use realtime now cl.refdef.time = cls.realtime; // render use realtime now
cl.refdef.areabits = cl.frame.areabits; cl.refdef.areabits = cl.frame.areabits;

View File

@ -313,13 +313,13 @@ enum clc_ops_e
#define U_RENDERFX16 (1<<18) // 8 + 16 = 32 #define U_RENDERFX16 (1<<18) // 8 + 16 = 32
#define U_EFFECTS16 (1<<19) // 8 + 16 = 32 #define U_EFFECTS16 (1<<19) // 8 + 16 = 32
#define U_WEAPONMODEL (1<<20) // weapons, flags, etc #define U_WEAPONMODEL (1<<20) // weapons, flags, etc
#define U_BODY (1<<21) #define U_SOUNDIDX (1<<21)
#define U_SEQUENCE (1<<22) // animation sequence #define U_SEQUENCE (1<<22) // animation sequence
#define U_MOREBITS3 (1<<23) // read one additional byte #define U_MOREBITS3 (1<<23) // read one additional byte
// fourth byte // fourth byte
#define U_OLDORIGIN (1<<24) // FIXME: get rid of this #define U_OLDORIGIN (1<<24) // FIXME: get rid of this
#define U_SOUND (1<<25) #define U_BODY (1<<25)
#define U_SOLID (1<<26) #define U_SOLID (1<<26)
#define U_ALPHA (1<<27) // alpha value #define U_ALPHA (1<<27) // alpha value
#define U_EVENT (1<<28) // remove this #define U_EVENT (1<<28) // remove this
@ -544,7 +544,7 @@ CMODEL
cmodel_t *CM_LoadMap (char *name, bool clientload, unsigned *checksum); cmodel_t *CM_LoadMap (char *name, bool clientload, unsigned *checksum);
cmodel_t *CM_InlineModel (char *name); // *1, *2, etc cmodel_t *CM_InlineModel (char *name); // *1, *2, etc
cmodel_t *CM_LoadModel (char *name); cmodel_t *CM_LoadModel( int modelindex );
extern byte portalopen[MAX_MAP_AREAPORTALS]; extern byte portalopen[MAX_MAP_AREAPORTALS];

View File

@ -540,6 +540,7 @@ cmodel_t *CM_LoadMap (char *name, bool clientload, unsigned *checksum)
numnodes = 0; numnodes = 0;
numleafs = 0; numleafs = 0;
numcmodels = 0; numcmodels = 0;
numsmodels = 0;
numvisibility = 0; numvisibility = 0;
numentitychars = 0; numentitychars = 0;
map_entitystring[0] = 0; map_entitystring[0] = 0;
@ -1704,10 +1705,10 @@ STUDIO SHARED CMODELS
=============================================================================== ===============================================================================
*/ */
#define NUM_HULL_ROUNDS 22
#define HULL_PRECISION 4 #define HULL_PRECISION 4
word hull_table[NUM_HULL_ROUNDS] = { 0, 4, 8, 16, 18, 24, 28, 30, 32, 40, 48, 54, 56, 60, 64, 72, 80, 112, 120, 128, 140, 176 }; word hull_table[] = { 0, 4, 8, 16, 18, 24, 28, 30, 32, 40, 48, 54, 56, 60, 64, 72, 80, 112, 120, 128, 140, 176 };
#define NUM_HULL_ROUNDS (sizeof(hull_table) / sizeof(word))
void CM_LookUpHullSize(vec3_t size, bool down) void CM_LookUpHullSize(vec3_t size, bool down)
{ {
@ -1738,11 +1739,8 @@ void CM_LookUpHullSize(vec3_t size, bool down)
cmodel_t *CM_StudioModel (char *name, byte *buffer) cmodel_t *CM_StudioModel (char *name, byte *buffer)
{ {
int i = numcmodels; // studiomodels starting after bmodels
int max_models = numcmodels + numsmodels;
cmodel_t *out; cmodel_t *out;
studiohdr_t *phdr; studiohdr_t *phdr;
char modname[64]; // probaly this is not better way...
phdr = (studiohdr_t *)buffer; phdr = (studiohdr_t *)buffer;
@ -1752,23 +1750,10 @@ cmodel_t *CM_StudioModel (char *name, byte *buffer)
return NULL; return NULL;
} }
memset( modname, 0, sizeof(modname)); out = &map_cmodels[numcmodels + numsmodels];
FS_FileBase( name, modname );
for(i = 0; i < max_models; i++ )
{
out = map_cmodels + i;
//probably is sprite model
if(!out->extradata) continue;
if(!stricmp(modname, out->name))
return out;
}
out = &map_cmodels[max_models];
out->extradata = buffer; out->extradata = buffer;
out->numframes = 0;//reset sprite info out->numframes = 0;//reset sprite info
strncpy(out->name, modname, sizeof(out->name)); strncpy(out->name, name, sizeof(out->name));
if(SV_StudioExtractBbox( phdr, 0, out->mins, out->maxs )) if(SV_StudioExtractBbox( phdr, 0, out->mins, out->maxs ))
{ {
@ -1782,18 +1767,15 @@ cmodel_t *CM_StudioModel (char *name, byte *buffer)
VectorSet(out->mins, -32, -32, -32 ); VectorSet(out->mins, -32, -32, -32 );
VectorSet(out->maxs, 32, 32, 32 ); VectorSet(out->maxs, 32, 32, 32 );
} }
Msg("CM_StudioModel: %s mins[%g %g %g] maxs[%g %g %g] new loaded\n", out->name, out->mins[0], out->mins[1],out->mins[2],out->maxs[0],out->maxs[1],out->maxs[2]);
numsmodels++; numsmodels++;
return out; return out;
} }
cmodel_t *CM_SpriteModel (char *name, byte *buffer) cmodel_t *CM_SpriteModel (char *name, byte *buffer)
{ {
int i = numcmodels;
int max_models = numcmodels + numsmodels;
cmodel_t *out; cmodel_t *out;
dsprite_t *phdr; dsprite_t *phdr;
char modname[64]; //probaly this is not better way...
phdr = (dsprite_t *)buffer; phdr = (dsprite_t *)buffer;
@ -1803,22 +1785,9 @@ cmodel_t *CM_SpriteModel (char *name, byte *buffer)
return NULL; return NULL;
} }
memset( modname, 0, sizeof(modname)); out = &map_cmodels[numcmodels + numsmodels];
FS_FileBase( name, modname );
for(i = 0; i < max_models; i++ )
{
out = map_cmodels + i;
//probably is studio model
if(!out->numframes) continue;
if(!stricmp(modname, out->name))
return out;
}
out = &map_cmodels[max_models];
out->numframes = phdr->numframes; out->numframes = phdr->numframes;
strncpy(out->name, modname, sizeof(out->name)); strncpy(out->name, name, sizeof(out->name));
out->mins[0] = out->mins[1] = -phdr->width / 2; out->mins[0] = out->mins[1] = -phdr->width / 2;
out->maxs[0] = out->maxs[1] = phdr->width / 2; out->maxs[0] = out->maxs[1] = phdr->width / 2;
@ -1829,29 +1798,36 @@ cmodel_t *CM_SpriteModel (char *name, byte *buffer)
return out; return out;
} }
cmodel_t *CM_LoadModel (char *name) cmodel_t *CM_LoadModel ( int modelindex )
{ {
char name[MAX_QPATH];
byte *buffer; byte *buffer;
cmodel_t *mod = NULL; cmodel_t *mod = NULL;
int i = numcmodels;
int max_models = numcmodels + numsmodels;
if (!name[0]) // check for preloading
{ strncpy(name, sv.configstrings[CS_MODELS + modelindex], MAX_QPATH );
MsgWarn("CM_LoadModel: NULL name, ignored\n"); if(name[0] == '*') return CM_InlineModel( name ); //skip bmodels
return NULL;
for(i = 0; i < max_models; i++ )
{
mod = map_cmodels + i;
if(!stricmp(name, mod->name))
return mod;
} }
if(name[0] == '*') return CM_InlineModel (name); // new model
if(!FS_FileExists( name ))
{
MsgWarn("CM_LoadModel: %s not found\n", name );
return NULL;
}
if(numcmodels + numsmodels > MAX_MAP_MODELS) if(numcmodels + numsmodels > MAX_MAP_MODELS)
{ {
MsgWarn("CM_LoadModel: MAX_MAP_MODELS limit exceeded\n" ); MsgWarn("CM_LoadModel: MAX_MAP_MODELS limit exceeded\n" );
return NULL; return NULL;
} }
if(!FS_FileExists( name ))
{
MsgWarn("CM_LoadModel: %s not found\n", name );
return NULL;
}
buffer = FS_LoadFile (name, NULL ); buffer = FS_LoadFile (name, NULL );
// call the apropriate loader // call the apropriate loader

View File

@ -218,7 +218,7 @@ void _MSG_WriteDeltaEntity (entity_state_t *from, entity_state_t *to, sizebuf_t
if ( to->weaponmodel != from->weaponmodel ) bits |= U_WEAPONMODEL; if ( to->weaponmodel != from->weaponmodel ) bits |= U_WEAPONMODEL;
if ( to->body != from->body ) bits |= U_BODY; if ( to->body != from->body ) bits |= U_BODY;
if ( to->sequence != from->sequence ) bits |= U_SEQUENCE; if ( to->sequence != from->sequence ) bits |= U_SEQUENCE;
if ( to->sound != from->sound ) bits |= U_SOUND; if ( to->soundindex != from->soundindex ) bits |= U_SOUNDIDX;
if (newentity || (to->renderfx & RF_BEAM)) bits |= U_OLDORIGIN; if (newentity || (to->renderfx & RF_BEAM)) bits |= U_OLDORIGIN;
if( to->alpha != from->alpha ) bits |= U_ALPHA; if( to->alpha != from->alpha ) bits |= U_ALPHA;
@ -291,8 +291,8 @@ void _MSG_WriteDeltaEntity (entity_state_t *from, entity_state_t *to, sizebuf_t
if (bits & U_SEQUENCE) _MSG_WriteByte (msg, to->sequence, filename, fileline); if (bits & U_SEQUENCE) _MSG_WriteByte (msg, to->sequence, filename, fileline);
if (bits & U_SOLID) _MSG_WriteShort (msg, to->solid, filename, fileline); if (bits & U_SOLID) _MSG_WriteShort (msg, to->solid, filename, fileline);
if (bits & U_ALPHA) _MSG_WriteFloat (msg, to->alpha, filename, fileline); if (bits & U_ALPHA) _MSG_WriteFloat (msg, to->alpha, filename, fileline);
if (bits & U_SOUND) _MSG_WriteByte (msg, to->sound, filename, fileline);
if (bits & U_EVENT) _MSG_WriteByte (msg, to->event, filename, fileline); if (bits & U_EVENT) _MSG_WriteByte (msg, to->event, filename, fileline);
if (bits & U_SOUNDIDX) _MSG_WriteByte (msg, to->soundindex, filename, fileline);
if (bits & U_BODY) _MSG_WriteByte (msg, to->body, filename, fileline); if (bits & U_BODY) _MSG_WriteByte (msg, to->body, filename, fileline);
} }

View File

@ -1795,11 +1795,11 @@ void VM_tokenize (void)
size_t tokenlen; size_t tokenlen;
if (num_tokens >= (int)(sizeof(tokens)/sizeof(tokens[0]))) if (num_tokens >= (int)(sizeof(tokens)/sizeof(tokens[0])))
break; break;
tokenlen = strlen(COM_Token()) + 1; tokenlen = strlen(COM_Token) + 1;
if (pos + tokenlen > sizeof(tokenbuf)) if (pos + tokenlen > sizeof(tokenbuf))
break; break;
tokens[num_tokens++] = tokenbuf + pos; tokens[num_tokens++] = tokenbuf + pos;
Mem_Copy(tokenbuf + pos, COM_Token(), tokenlen); Mem_Copy(tokenbuf + pos, COM_Token, tokenlen);
pos += tokenlen; pos += tokenlen;
} }
@ -1961,7 +1961,7 @@ void VM_parseentitydata(void)
data = PRVM_G_STRING(OFS_PARM1); data = PRVM_G_STRING(OFS_PARM1);
// parse the opening brace // parse the opening brace
if (!COM_Parse(&data) || COM_Token()[0] != '{' ) if (!COM_Parse(&data) || COM_Token[0] != '{' )
PRVM_ERROR ("VM_parseentitydata: %s: Couldn't parse entity data:\n%s", PRVM_NAME, data ); PRVM_ERROR ("VM_parseentitydata: %s: Couldn't parse entity data:\n%s", PRVM_NAME, data );
PRVM_ED_ParseEdict (data, ent); PRVM_ED_ParseEdict (data, ent);

View File

@ -872,16 +872,16 @@ void PRVM_ED_ParseGlobals (const char *data)
// parse key // parse key
if (!COM_Parse(&data)) if (!COM_Parse(&data))
PRVM_ERROR ("PRVM_ED_ParseGlobals: EOF without closing brace"); PRVM_ERROR ("PRVM_ED_ParseGlobals: EOF without closing brace");
if (COM_Token()[0] == '}') if (COM_Token[0] == '}')
break; break;
strncpy (keyname, COM_Token(), sizeof(keyname)); strncpy (keyname, COM_Token, sizeof(keyname));
// parse value // parse value
if (!COM_Parse(&data)) if (!COM_Parse(&data))
PRVM_ERROR ("PRVM_ED_ParseGlobals: EOF without closing brace"); PRVM_ERROR ("PRVM_ED_ParseGlobals: EOF without closing brace");
if (COM_Token()[0] == '}') if (COM_Token[0] == '}')
PRVM_ERROR ("PRVM_ED_ParseGlobals: closing brace without data"); PRVM_ERROR ("PRVM_ED_ParseGlobals: closing brace without data");
key = PRVM_ED_FindGlobal (keyname); key = PRVM_ED_FindGlobal (keyname);
@ -891,7 +891,7 @@ void PRVM_ED_ParseGlobals (const char *data)
continue; continue;
} }
if (!PRVM_ED_ParseEpair(NULL, key, COM_Token())) if (!PRVM_ED_ParseEpair(NULL, key, COM_Token))
PRVM_ERROR ("PRVM_ED_ParseGlobals: parse error"); PRVM_ERROR ("PRVM_ED_ParseGlobals: parse error");
} }
} }
@ -1048,7 +1048,7 @@ Used for initial level load and for savegames.
const char *PRVM_ED_ParseEdict (const char *data, edict_t *ent) const char *PRVM_ED_ParseEdict (const char *data, edict_t *ent)
{ {
ddef_t *key; ddef_t *key;
bool init, newline; bool init, newline, anglehack;
char keyname[256]; char keyname[256];
size_t n; size_t n;
@ -1061,11 +1061,20 @@ const char *PRVM_ED_ParseEdict (const char *data, edict_t *ent)
if (!COM_Parse(&data)) if (!COM_Parse(&data))
PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace"); PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace");
newline = (COM_Token()[0] == '}') ? true : false; newline = (COM_Token[0] == '}') ? true : false;
if(!newline) MsgDev(D_LOAD, "Key: \"%s\"", COM_Token()); if(!newline) MsgDev(D_LOAD, "Key: \"%s\"", COM_Token);
else break; else break;
strncpy (keyname, COM_Token(), sizeof(keyname)); // anglehack is to allow QuakeEd to write single scalar angles
// and allow them to be turned into vectors. (FIXME...)
if (!strcmp(COM_Token, "angle"))
{
strncpy (COM_Token, "angles", MAX_QPATH);
anglehack = true;
}
else anglehack = false;
strncpy (keyname, COM_Token, sizeof(keyname));
// another hack to fix keynames with trailing spaces // another hack to fix keynames with trailing spaces
n = strlen(keyname); n = strlen(keyname);
@ -1078,9 +1087,9 @@ const char *PRVM_ED_ParseEdict (const char *data, edict_t *ent)
// parse value // parse value
if (!COM_Parse(&data)) if (!COM_Parse(&data))
PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace"); PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace");
MsgDev(D_LOAD, " \"%s\"\n", COM_Token()); MsgDev(D_LOAD, " \"%s\"\n", COM_Token);
if (COM_Token()[0] == '}') if (COM_Token[0] == '}')
PRVM_ERROR ("PRVM_ED_ParseEdict: closing brace without data"); PRVM_ERROR ("PRVM_ED_ParseEdict: closing brace without data");
init = true; init = true;
@ -1100,7 +1109,15 @@ const char *PRVM_ED_ParseEdict (const char *data, edict_t *ent)
continue; continue;
} }
if (!PRVM_ED_ParseEpair(ent, key, COM_Token())) if (anglehack)
{
char temp[32];
strncpy (temp, COM_Token, sizeof(temp));
sprintf (COM_Token, "0 %s 0", temp);
}
if (!PRVM_ED_ParseEpair(ent, key, COM_Token))
PRVM_ERROR ("PRVM_ED_ParseEdict: parse error"); PRVM_ERROR ("PRVM_ED_ParseEdict: parse error");
} }
@ -1142,8 +1159,8 @@ void PRVM_ED_LoadFromFile (const char *data)
{ {
// parse the opening brace // parse the opening brace
if (!COM_Parse(&data)) break; if (!COM_Parse(&data)) break;
if (COM_Token()[0] != '{') if (COM_Token[0] != '{')
PRVM_ERROR ("PRVM_ED_LoadFromFile: %s: found %s when expecting {", PRVM_NAME, COM_Token()); PRVM_ERROR ("PRVM_ED_LoadFromFile: %s: found %s when expecting {", PRVM_NAME, COM_Token);
// CHANGED: this is not conform to PR_LoadFromFile // CHANGED: this is not conform to PR_LoadFromFile
if(prog->loadintoworld) if(prog->loadintoworld)

View File

@ -74,6 +74,8 @@ typedef struct entvars_s
// physics description // physics description
vec3_t origin; vec3_t origin;
vec3_t angles; vec3_t angles;
vec3_t old_origin;
vec3_t old_angles;
vec3_t velocity; vec3_t velocity;
vec3_t avelocity; vec3_t avelocity;
vec3_t post_origin; vec3_t post_origin;
@ -146,7 +148,7 @@ typedef struct entvars_s
float idealpitch; float idealpitch;
string_t netname; string_t netname;
int enemy; int enemy;
float colormap; float alpha;
float team; float team;
float max_health; float max_health;
float teleport_time; float teleport_time;
@ -166,7 +168,7 @@ typedef struct entvars_s
string_t noise; string_t noise;
string_t noise1; string_t noise1;
string_t noise2; string_t noise2;
string_t noise3; string_t sound;
float jumpup; float jumpup;
float jumpdn; float jumpdn;
int movetarget; int movetarget;
@ -179,6 +181,6 @@ typedef struct entvars_s
} entvars_t; } entvars_t;
#define PROG_CRC_SERVER 42175 #define PROG_CRC_SERVER 5039
#endif//PROGDEFS_H #endif//PROGDEFS_H

View File

@ -277,6 +277,7 @@ void SV_Status_f (void);
void SV_WriteFrameToClient (client_t *client, sizebuf_t *msg); void SV_WriteFrameToClient (client_t *client, sizebuf_t *msg);
void SV_RecordDemoMessage (void); void SV_RecordDemoMessage (void);
void SV_BuildClientFrame (client_t *client); void SV_BuildClientFrame (client_t *client);
void SV_UpdateEntityState( edict_t *ent);
void SV_FatPVS ( vec3_t org ); void SV_FatPVS ( vec3_t org );
void SV_Error (char *error, ...); void SV_Error (char *error, ...);

View File

@ -69,6 +69,9 @@ struct sv_edict_s
int num_clusters; // if -1, use headnode instead int num_clusters; // if -1, use headnode instead
int clusternums[MAX_ENT_CLUSTERS]; int clusternums[MAX_ENT_CLUSTERS];
int areanum, areanum2; int areanum, areanum2;
int serialnumber; // unical entity #id
int solid; // see entity_state_t for details
int event; // apply sv.events too
// baselines // baselines
entity_state_t s; entity_state_t s;

View File

@ -24,6 +24,37 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/* /*
============================================================================= =============================================================================
Copy PRVM values into entity state
=============================================================================
*/
void SV_UpdateEntityState( edict_t *ent)
{
// copy progs values to state
ent->priv.sv->s.number = ent->priv.sv->serialnumber;
ent->priv.sv->s.solid = ent->priv.sv->solid;
ent->priv.sv->s.event = ent->priv.sv->event;
VectorCopy (ent->progs.sv->origin, ent->priv.sv->s.origin);
VectorCopy (ent->progs.sv->angles, ent->priv.sv->s.angles);
VectorCopy (ent->progs.sv->old_origin, ent->priv.sv->s.old_origin);
ent->priv.sv->s.modelindex = (int)ent->progs.sv->modelindex;
ent->priv.sv->s.weaponmodel = SV_ModelIndex(PRVM_GetString(ent->progs.sv->weaponmodel));
ent->priv.sv->s.skin = (short)ent->progs.sv->skin; // studio model skin
ent->priv.sv->s.body = (byte)ent->progs.sv->body; // studio model submodel
ent->priv.sv->s.frame = (short)ent->progs.sv->frame; // any model current frame
ent->priv.sv->s.sequence = (byte)ent->progs.sv->sequence; // studio model sequence
ent->priv.sv->s.effects = (uint)ent->progs.sv->effects; // shared client and render flags
ent->priv.sv->s.renderfx = (int)ent->progs.sv->renderfx; // renderer flags
ent->priv.sv->s.alpha = ent->progs.sv->alpha; // alpha value
ent->priv.sv->s.soundindex = SV_SoundIndex(PRVM_GetString(ent->progs.sv->sound));
}
/*
=============================================================================
Encode a client frame onto the network channel Encode a client frame onto the network channel
============================================================================= =============================================================================
@ -490,7 +521,7 @@ void SV_BuildClientFrame (client_t *client)
ent = PRVM_EDICT_NUM(e); ent = PRVM_EDICT_NUM(e);
// ignore ents without visible models unless they have an effect // ignore ents without visible models unless they have an effect
if (!ent->priv.sv->s.modelindex && !ent->priv.sv->s.effects && !ent->priv.sv->s.sound && !ent->priv.sv->s.event) if (!ent->progs.sv->modelindex && !ent->progs.sv->effects && !ent->progs.sv->sound && !ent->priv.sv->event)
continue; continue;
// ignore if not touching a PV leaf // ignore if not touching a PV leaf
@ -506,7 +537,7 @@ void SV_BuildClientFrame (client_t *client)
} }
// beams just check one point for PHS // beams just check one point for PHS
if (ent->priv.sv->s.renderfx & RF_BEAM) if ((int)ent->progs.sv->renderfx & RF_BEAM)
{ {
l = ent->priv.sv->clusternums[0]; l = ent->priv.sv->clusternums[0];
if ( !(clientphs[l >> 3] & (1 << (l&7) )) ) if ( !(clientphs[l >> 3] & (1 << (l&7) )) )
@ -516,7 +547,7 @@ void SV_BuildClientFrame (client_t *client)
{ {
// FIXME: if an ent has a model and a sound, but isn't // FIXME: if an ent has a model and a sound, but isn't
// in the PVS, only the PHS, clear the model // in the PVS, only the PHS, clear the model
if (ent->priv.sv->s.sound) if (ent->progs.sv->sound)
{ {
bitvector = fatpvs; //clientphs; bitvector = fatpvs; //clientphs;
} }
@ -541,13 +572,13 @@ void SV_BuildClientFrame (client_t *client)
continue; // not visible continue; // not visible
} }
if (!ent->priv.sv->s.modelindex) if (!ent->progs.sv->modelindex)
{ {
// don't send sounds if they will be attenuated away // don't send sounds if they will be attenuated away
vec3_t delta; vec3_t delta;
float len; float len;
VectorSubtract (org, ent->priv.sv->s.origin, delta); VectorSubtract (org, ent->progs.sv->origin, delta);
len = VectorLength (delta); len = VectorLength (delta);
if (len > 400) continue; if (len > 400) continue;
} }
@ -556,17 +587,13 @@ void SV_BuildClientFrame (client_t *client)
// add it to the circular client_entities array // add it to the circular client_entities array
state = &svs.client_entities[svs.next_client_entities % svs.num_client_entities]; state = &svs.client_entities[svs.next_client_entities % svs.num_client_entities];
if (ent->priv.sv->s.number != e) if (ent->priv.sv->serialnumber != e)
{ {
MsgWarn ("SV_BuildClientFrame: invalid ent->priv.sv->s.number %d\n", ent->priv.sv->s.number ); MsgWarn ("SV_BuildClientFrame: invalid ent->priv.sv->serialnumber %d\n", ent->priv.sv->serialnumber );
ent->priv.sv->s.number = e; // ptr to current entity such as entnumber ent->priv.sv->serialnumber = e; // ptr to current entity such as entnumber
} }
// copy progs values to state SV_UpdateEntityState( ent );
//ent->priv.sv->s.modelindex = ent->progs.sv->modelindex;
//ent->priv.sv->s.frame = ent->progs.sv->frame;
//for (i = 0; i < 3; i++) ent->priv.sv->s.origin[i] = ent->progs.sv->origin[i];
*state = ent->priv.sv->s; *state = ent->priv.sv->s;
// don't mark players missiles as solid // don't mark players missiles as solid
@ -612,8 +639,8 @@ void SV_RecordDemoMessage (void)
while (e < prog->num_edicts) while (e < prog->num_edicts)
{ {
// ignore ents without visible models unless they have an effect // ignore ents without visible models unless they have an effect
if (!ent->priv.sv->free && ent->priv.sv->s.number && if (!ent->priv.sv->free && ent->priv.sv->serialnumber &&
(ent->priv.sv->s.modelindex || ent->priv.sv->s.effects || ent->priv.sv->s.sound || ent->priv.sv->s.event)) (ent->priv.sv->s.modelindex || ent->progs.sv->effects || ent->progs.sv->sound || ent->priv.sv->event))
MSG_WriteDeltaEntity (&nostate, &ent->priv.sv->s, &buf, false, true); MSG_WriteDeltaEntity (&nostate, &ent->priv.sv->s, &buf, false, true);
e++; e++;

View File

@ -66,7 +66,7 @@ void PF_setorigin (void)
return; return;
} }
org = PRVM_G_VECTOR(OFS_PARM1); org = PRVM_G_VECTOR(OFS_PARM1);
VectorCopy (org, e->priv.sv->s.origin); VectorCopy (org, e->progs.sv->origin);
SV_LinkEdict (e); SV_LinkEdict (e);
} }
@ -162,12 +162,12 @@ void SV_SetModel (edict_t *ent, const char *name)
i = SV_ModelIndex( name ); i = SV_ModelIndex( name );
ent->progs.sv->model = PRVM_SetEngineString(sv.configstrings[CS_MODELS+i]); ent->progs.sv->model = PRVM_SetEngineString(sv.configstrings[CS_MODELS+i]);
ent->progs.sv->modelindex = ent->priv.sv->s.modelindex = i; ent->progs.sv->modelindex = ent->progs.sv->modelindex = i;
VectorCopy (ent->progs.sv->origin, ent->priv.sv->s.origin); VectorCopy (ent->progs.sv->origin, ent->progs.sv->origin);
VectorCopy (ent->progs.sv->angles, ent->priv.sv->s.angles); VectorCopy (ent->progs.sv->angles, ent->progs.sv->angles);
mod = CM_LoadModel(sv.configstrings[CS_MODELS+i]); mod = CM_LoadModel( i );
if(mod) SetMinMaxSize( ent, mod->mins, mod->maxs, false ); if( mod )SetMinMaxSize( ent, mod->mins, mod->maxs, false );
} }
/* /*
@ -754,11 +754,10 @@ float(float yaw, float dist) walkmove
*/ */
void PF_walkmove (void) void PF_walkmove (void)
{ {
edict_t *ent; edict_t *ent;
float yaw, dist; float yaw, dist;
vec3_t move;
mfunction_t *oldf; mfunction_t *oldf;
int oldself; int oldpev;
// assume failure if it returns early // assume failure if it returns early
PRVM_G_FLOAT(OFS_RETURN) = 0; PRVM_G_FLOAT(OFS_RETURN) = 0;
@ -781,21 +780,15 @@ void PF_walkmove (void)
if (!((int)ent->progs.sv->aiflags & (AI_ONGROUND|AI_FLY|AI_SWIM))) if (!((int)ent->progs.sv->aiflags & (AI_ONGROUND|AI_FLY|AI_SWIM)))
return; return;
yaw = yaw * M_PI * 2 / 360;
move[0] = cos(yaw)*dist;
move[1] = sin(yaw)*dist;
move[2] = 0;
// save program state, because SV_movestep may call other progs // save program state, because SV_movestep may call other progs
oldf = prog->xfunction; oldf = prog->xfunction;
oldself = prog->globals.server->pev; oldpev = prog->globals.server->pev;
PRVM_G_FLOAT(OFS_RETURN) = 0;//SV_movestep(ent, move, true); PRVM_G_FLOAT(OFS_RETURN) = SV_WalkMove(ent, yaw, dist);
// restore program state // restore program state
prog->xfunction = oldf; prog->xfunction = oldf;
prog->globals.server->pev = oldself; prog->globals.server->pev = oldpev;
} }
/* /*

View File

@ -33,98 +33,100 @@ prvm_fieldvars_t reqfields[] =
{2, 2, "modelindex"}, {2, 2, "modelindex"},
{3, 3, "origin"}, {3, 3, "origin"},
{6, 3, "angles"}, {6, 3, "angles"},
{9, 3, "velocity"}, {9, 3, "old_origin"},
{12, 3, "avelocity"}, {12, 3, "old_angles"},
{15, 3, "post_origin"}, {15, 3, "velocity"},
{18, 3, "post_angles"}, {18, 3, "avelocity"},
{21, 3, "post_velocity"}, {21, 3, "post_origin"},
{24, 3, "post_avelocity"}, {24, 3, "post_angles"},
{27, 3, "origin_offset"}, {27, 3, "post_velocity"},
{30, 3, "angles_offset"}, {30, 3, "post_avelocity"},
{33, 2, "ltime"}, {33, 3, "origin_offset"},
{34, 2, "bouncetype"}, {36, 3, "angles_offset"},
{35, 2, "movetype"}, {39, 2, "ltime"},
{36, 2, "solid"}, {40, 2, "bouncetype"},
{37, 3, "absmin"}, {41, 2, "movetype"},
{40, 3, "absmax"}, {42, 2, "solid"},
{43, 3, "mins"}, {43, 3, "absmin"},
{46, 3, "maxs"}, {46, 3, "absmax"},
{49, 3, "size"}, {49, 3, "mins"},
{52, 4, "chain"}, {52, 3, "maxs"},
{53, 1, "model"}, {55, 3, "size"},
{54, 2, "frame"}, {58, 4, "chain"},
{55, 2, "sequence"}, {59, 1, "model"},
{56, 2, "renderfx"}, {60, 2, "frame"},
{57, 2, "effects"}, {61, 2, "sequence"},
{58, 2, "skin"}, {62, 2, "renderfx"},
{59, 2, "body"}, {63, 2, "effects"},
{60, 1, "weaponmodel"}, {64, 2, "skin"},
{61, 2, "weaponframe"}, {65, 2, "body"},
{62, 6, "use"}, {66, 1, "weaponmodel"},
{63, 6, "touch"}, {67, 2, "weaponframe"},
{64, 6, "think"}, {68, 6, "use"},
{65, 6, "blocked"}, {69, 6, "touch"},
{66, 6, "activate"}, {70, 6, "think"},
{67, 6, "walk"}, {71, 6, "blocked"},
{68, 6, "jump"}, {72, 6, "activate"},
{69, 6, "duck"}, {73, 6, "walk"},
{70, 2, "flags"}, {74, 6, "jump"},
{71, 2, "aiflags"}, {75, 6, "duck"},
{72, 2, "spawnflags"}, {76, 2, "flags"},
{73, 4, "groundentity"}, {77, 2, "aiflags"},
{74, 2, "nextthink"}, {78, 2, "spawnflags"},
{75, 2, "takedamage"}, {79, 4, "groundentity"},
{76, 2, "health"}, {80, 2, "nextthink"},
{77, 2, "frags"}, {81, 2, "takedamage"},
{78, 2, "weapon"}, {82, 2, "health"},
{79, 2, "items"}, {83, 2, "frags"},
{80, 1, "target"}, {84, 2, "weapon"},
{81, 1, "parent"}, {85, 2, "items"},
{82, 1, "targetname"}, {86, 1, "target"},
{83, 4, "aiment"}, {87, 1, "parent"},
{84, 4, "goalentity"}, {88, 1, "targetname"},
{85, 3, "punchangle"}, {89, 4, "aiment"},
{88, 2, "deadflag"}, {90, 4, "goalentity"},
{89, 3, "view_ofs"}, {91, 3, "punchangle"},
{92, 2, "button0"}, {94, 2, "deadflag"},
{93, 2, "button1"}, {95, 3, "view_ofs"},
{94, 2, "button2"}, {98, 2, "button0"},
{95, 2, "impulse"}, {99, 2, "button1"},
{96, 2, "fixangle"}, {100, 2, "button2"},
{97, 3, "v_angle"}, {101, 2, "impulse"},
{100, 2, "idealpitch"}, {102, 2, "fixangle"},
{101, 1, "netname"}, {103, 3, "v_angle"},
{102, 4, "enemy"}, {106, 2, "idealpitch"},
{103, 2, "colormap"}, {107, 1, "netname"},
{104, 2, "team"}, {108, 4, "enemy"},
{105, 2, "max_health"}, {109, 2, "colormap"},
{106, 2, "teleport_time"}, {110, 2, "team"},
{107, 2, "armortype"}, {111, 2, "max_health"},
{108, 2, "armorvalue"}, {112, 2, "teleport_time"},
{109, 2, "waterlevel"}, {113, 2, "armortype"},
{110, 2, "watertype"}, {114, 2, "armorvalue"},
{111, 2, "ideal_yaw"}, {115, 2, "waterlevel"},
{112, 2, "yaw_speed"}, {116, 2, "watertype"},
{113, 2, "dmg_take"}, {117, 2, "ideal_yaw"},
{114, 2, "dmg_save"}, {118, 2, "yaw_speed"},
{115, 4, "dmg_inflictor"}, {119, 2, "dmg_take"},
{116, 4, "owner"}, {120, 2, "dmg_save"},
{117, 3, "movedir"}, {121, 4, "dmg_inflictor"},
{120, 1, "message"}, {122, 4, "owner"},
{121, 2, "sounds"}, {123, 3, "movedir"},
{122, 1, "noise"}, {126, 1, "message"},
{123, 1, "noise1"}, {127, 2, "sounds"},
{124, 1, "noise2"}, {128, 1, "noise"},
{125, 1, "noise3"}, {129, 1, "noise1"},
{126, 2, "jumpup"}, {130, 1, "noise2"},
{127, 2, "jumpdn"}, {131, 1, "noise3"},
{128, 4, "movetarget"}, {132, 2, "jumpup"},
{129, 2, "mass"}, {133, 2, "jumpdn"},
{130, 2, "density"}, {134, 4, "movetarget"},
{131, 2, "gravity"}, {135, 2, "mass"},
{132, 2, "dmg"}, {136, 2, "density"},
{133, 2, "dmgtime"}, {137, 2, "gravity"},
{134, 2, "speed"} {138, 2, "dmg"},
{139, 2, "dmgtime"},
{140, 2, "speed"}
}; };
/* /*
@ -200,14 +202,16 @@ void SV_CreateBaseline (void)
{ {
svent = PRVM_EDICT_NUM(entnum); svent = PRVM_EDICT_NUM(entnum);
if (svent->priv.sv->free) continue; if (svent->priv.sv->free) continue;
if (!svent->priv.sv->s.modelindex && !svent->priv.sv->s.sound && !svent->priv.sv->s.effects) if (!svent->progs.sv->modelindex && !svent->progs.sv->sound && !svent->progs.sv->effects)
continue; continue;
svent->priv.sv->s.number = entnum; svent->priv.sv->serialnumber = entnum;
// //
// take current state as baseline // take current state as baseline
// //
VectorCopy (svent->priv.sv->s.origin, svent->priv.sv->s.old_origin); VectorCopy (svent->progs.sv->origin, svent->progs.sv->old_origin);
SV_UpdateEntityState( svent );
sv.baselines[entnum] = svent->priv.sv->s; sv.baselines[entnum] = svent->priv.sv->s;
} }
} }
@ -436,7 +440,7 @@ void SV_InitGame (void)
for (i = 0; i < maxclients->value; i++) for (i = 0; i < maxclients->value; i++)
{ {
ent = PRVM_EDICT_NUM(i + 1); ent = PRVM_EDICT_NUM(i + 1);
ent->priv.sv->s.number = i + 1; ent->priv.sv->serialnumber = i + 1;
svs.clients[i].edict = ent; svs.clients[i].edict = ent;
memset (&svs.clients[i].lastcmd, 0, sizeof(svs.clients[i].lastcmd)); memset (&svs.clients[i].lastcmd, 0, sizeof(svs.clients[i].lastcmd));
} }

View File

@ -706,7 +706,7 @@ void SV_PrepWorldFrame (void)
{ {
ent = PRVM_EDICT_NUM(i); ent = PRVM_EDICT_NUM(i);
// events only last for a single message // events only last for a single message
ent->priv.sv->s.event = 0; ent->priv.sv->event = 0;
} }
} }
@ -727,7 +727,7 @@ void SV_RunGameFrame (void)
// compression can get confused when a client // compression can get confused when a client
// has the "current" frame // has the "current" frame
sv.framenum++; sv.framenum++;
sv.frametime = 0.001f; sv.frametime = 0.001f;//1000 fps
sv.time = sv.framenum * sv.frametime; sv.time = sv.framenum * sv.frametime;
// don't run if paused // don't run if paused

View File

@ -43,8 +43,8 @@ bool SV_CheckBottom (edict_t *ent)
int x, y; int x, y;
float mid, bottom; float mid, bottom;
VectorAdd (ent->priv.sv->s.origin, ent->progs.sv->mins, mins); VectorAdd (ent->progs.sv->origin, ent->progs.sv->mins, mins);
VectorAdd (ent->priv.sv->s.origin, ent->progs.sv->maxs, maxs); VectorAdd (ent->progs.sv->origin, ent->progs.sv->maxs, maxs);
// if all of the points under the corners are solid world, don't bother // if all of the points under the corners are solid world, don't bother
// with the tougher checks // with the tougher checks
@ -121,19 +121,19 @@ void SV_DropToFloor (edict_t *ent)
ent->progs.sv->movetype = MOVETYPE_TOSS; ent->progs.sv->movetype = MOVETYPE_TOSS;
VectorSet(v, 0, 0, -128); VectorSet(v, 0, 0, -128);
VectorAdd (ent->priv.sv->s.origin, v, dest); VectorAdd (ent->progs.sv->origin, v, dest);
tr = SV_Trace (ent->priv.sv->s.origin, ent->progs.sv->mins, ent->progs.sv->maxs, dest, ent, MASK_SOLID); tr = SV_Trace (ent->progs.sv->origin, ent->progs.sv->mins, ent->progs.sv->maxs, dest, ent, MASK_SOLID);
if (tr.startsolid) if (tr.startsolid)
{ {
Msg("SV_DropToFloor: %s startsolid at %s\n", PRVM_G_STRING(ent->progs.sv->classname), ent->priv.sv->s.origin[0], ent->priv.sv->s.origin[1], ent->priv.sv->s.origin[2]); Msg("SV_DropToFloor: %s startsolid at %g %g %g\n", PRVM_GetString(ent->progs.sv->classname), ent->progs.sv->origin[0], ent->progs.sv->origin[1], ent->progs.sv->origin[2]);
SV_FreeEdict (ent); SV_FreeEdict (ent);
return; return;
} }
tr.endpos[2] += 1; tr.endpos[2] += 1;
ent->progs.sv->mins[2] -= 1; ent->progs.sv->mins[2] -= 1;
ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(tr.ent); ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(tr.ent);
VectorCopy (tr.endpos, ent->priv.sv->s.origin); VectorCopy (tr.endpos, ent->progs.sv->origin);
SV_LinkEdict (ent); SV_LinkEdict (ent);
} }
@ -151,11 +151,11 @@ void SV_CheckGround (edict_t *ent)
} }
// if the hull point one-quarter unit down is solid the entity is on ground // if the hull point one-quarter unit down is solid the entity is on ground
point[0] = ent->priv.sv->s.origin[0]; point[0] = ent->progs.sv->origin[0];
point[1] = ent->priv.sv->s.origin[1]; point[1] = ent->progs.sv->origin[1];
point[2] = ent->priv.sv->s.origin[2] - 0.25; point[2] = ent->progs.sv->origin[2] - 0.25;
trace = SV_Trace (ent->priv.sv->s.origin, ent->progs.sv->mins, ent->progs.sv->maxs, point, ent, MASK_MONSTERSOLID); trace = SV_Trace (ent->progs.sv->origin, ent->progs.sv->mins, ent->progs.sv->maxs, point, ent, MASK_MONSTERSOLID);
// check steepness // check steepness
if ( trace.plane.normal[2] < 0.7 && !trace.startsolid) if ( trace.plane.normal[2] < 0.7 && !trace.startsolid)
@ -173,7 +173,7 @@ void SV_CheckGround (edict_t *ent)
ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(trace.ent); ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(trace.ent);
if (!trace.startsolid && !trace.allsolid) if (!trace.startsolid && !trace.allsolid)
{ {
VectorCopy (trace.endpos, ent->priv.sv->s.origin); VectorCopy (trace.endpos, ent->progs.sv->origin);
ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(trace.ent); ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(trace.ent);
ent->progs.sv->velocity[2] = trace.ent->progs.sv->velocity[2]; ent->progs.sv->velocity[2] = trace.ent->progs.sv->velocity[2];
} }
@ -216,7 +216,7 @@ void SV_FallingDamage (edict_t *ent)
if (delta < 15) if (delta < 15)
{ {
ent->priv.sv->s.event = EV_FOOTSTEP; ent->priv.sv->event = EV_FOOTSTEP;
return; return;
} }
@ -230,7 +230,7 @@ void SV_FallingDamage (edict_t *ent)
if (damage < 1) damage = 1; if (damage < 1) damage = 1;
VectorSet (dir, 0, 0, 1); VectorSet (dir, 0, 0, 1);
T_Damage (ent, prog->edicts, prog->edicts, dir, ent->priv.sv->s.origin, vec3_origin, damage, 0, 0, DMG_FALL); T_Damage (ent, prog->edicts, prog->edicts, dir, ent->progs.sv->origin, vec3_origin, damage, 0, 0, DMG_FALL);
} }
} }
@ -266,10 +266,10 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
edict_t *target; edict_t *target;
// try the move // try the move
VectorCopy (ent->priv.sv->s.origin, oldorg); VectorCopy (ent->progs.sv->origin, oldorg);
VectorAdd (ent->priv.sv->s.origin, move, neworg); VectorAdd (ent->progs.sv->origin, move, neworg);
AngleVectors(ent->priv.sv->s.angles,forward,NULL,up); AngleVectors(ent->progs.sv->angles,forward, NULL, up);
if(ent->progs.sv->enemy) if(ent->progs.sv->enemy)
target = PRVM_PROG_TO_EDICT(ent->progs.sv->enemy); target = PRVM_PROG_TO_EDICT(ent->progs.sv->enemy);
else if(ent->progs.sv->movetarget) else if(ent->progs.sv->movetarget)
@ -283,12 +283,12 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
// try one move with vertical motion, then one without // try one move with vertical motion, then one without
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
VectorAdd (ent->priv.sv->s.origin, move, neworg); VectorAdd (ent->progs.sv->origin, move, neworg);
if (i == 0 && ent->progs.sv->enemy) if (i == 0 && ent->progs.sv->enemy)
{ {
if (!ent->progs.sv->goalentity) if (!ent->progs.sv->goalentity)
ent->progs.sv->goalentity = ent->progs.sv->enemy; ent->progs.sv->goalentity = ent->progs.sv->enemy;
dz = ent->priv.sv->s.origin[2] - PRVM_PROG_TO_EDICT(ent->progs.sv->goalentity)->priv.sv->s.origin[2]; dz = ent->progs.sv->origin[2] - PRVM_PROG_TO_EDICT(ent->progs.sv->goalentity)->progs.sv->origin[2];
if (PRVM_PROG_TO_EDICT(ent->progs.sv->goalentity)->priv.sv->client) if (PRVM_PROG_TO_EDICT(ent->progs.sv->goalentity)->priv.sv->client)
{ {
if (dz > 40) neworg[2] -= 8; if (dz > 40) neworg[2] -= 8;
@ -303,7 +303,7 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
else neworg[2] += dz; else neworg[2] += dz;
} }
} }
trace = SV_Trace (ent->priv.sv->s.origin, ent->progs.sv->mins, ent->progs.sv->maxs, neworg, ent, MASK_MONSTERSOLID); trace = SV_Trace (ent->progs.sv->origin, ent->progs.sv->mins, ent->progs.sv->maxs, neworg, ent, MASK_MONSTERSOLID);
// fly monsters don't enter water voluntarily // fly monsters don't enter water voluntarily
if ((int)ent->progs.sv->aiflags & AI_FLY) if ((int)ent->progs.sv->aiflags & AI_FLY)
@ -335,7 +335,7 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
if (trace.fraction == 1) if (trace.fraction == 1)
{ {
VectorCopy (trace.endpos, ent->priv.sv->s.origin); VectorCopy (trace.endpos, ent->progs.sv->origin);
if (relink) if (relink)
{ {
SV_LinkEdict(ent); SV_LinkEdict(ent);
@ -376,9 +376,9 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
{ {
// Never jump unless it places monster closer to his goal // Never jump unless it places monster closer to his goal
vec3_t dir; vec3_t dir;
VectorSubtract(target->priv.sv->s.origin, oldorg, dir); VectorSubtract(target->progs.sv->origin, oldorg, dir);
d1 = VectorLength(dir); d1 = VectorLength(dir);
VectorSubtract(target->priv.sv->s.origin, trace.endpos, dir); VectorSubtract(target->progs.sv->origin, trace.endpos, dir);
d2 = VectorLength(dir); d2 = VectorLength(dir);
if(d2 < d1) if(d2 < d1)
canjump = true; canjump = true;
@ -404,12 +404,12 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
trace_t tr; trace_t tr;
vec3_t p2; vec3_t p2;
VectorMA(ent->priv.sv->s.origin,1024,forward,p2); VectorMA(ent->progs.sv->origin,1024,forward,p2);
tr = SV_Trace(ent->priv.sv->s.origin,ent->progs.sv->mins,ent->progs.sv->maxs,p2,ent,MASK_MONSTERSOLID); tr = SV_Trace(ent->progs.sv->origin,ent->progs.sv->mins,ent->progs.sv->maxs,p2,ent,MASK_MONSTERSOLID);
if(DotProduct(tr.plane.normal,forward) < -0.95) if(DotProduct(tr.plane.normal,forward) < -0.95)
{ {
jump = 1; jump = 1;
jumpheight = trace.endpos[2] - ent->priv.sv->s.origin[2]; jumpheight = trace.endpos[2] - ent->progs.sv->origin[2];
} }
else return false; else return false;
} }
@ -474,23 +474,23 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
{ {
e = PRVM_EDICT_NUM(i); e = PRVM_EDICT_NUM(i);
if(e->priv.sv->free) continue; if(e->priv.sv->free) continue;
if(!PRVM_G_STRING(e->progs.sv->classname)) continue; if(!PRVM_GetString(e->progs.sv->classname)) continue;
if(strcmp(PRVM_G_STRING(e->progs.sv->classname), "env_laser")) continue; if(strcmp(PRVM_GetString(e->progs.sv->classname), "env_laser")) continue;
if(!PF_inpvs(ent->priv.sv->s.origin,e->priv.sv->s.origin)) if(!PF_inpvs(ent->progs.sv->origin,e->progs.sv->origin))
continue; continue;
// Check to see if monster is ALREADY in the path of this laser. // Check to see if monster is ALREADY in the path of this laser.
// If so, allow the move so he can get out. // If so, allow the move so he can get out.
VectorMA(e->priv.sv->s.origin, 2048, e->progs.sv->movedir, laser_end); VectorMA(e->progs.sv->origin, 2048, e->progs.sv->movedir, laser_end);
laser_trace = SV_Trace(e->priv.sv->s.origin,NULL,NULL,laser_end,NULL,CONTENTS_SOLID|CONTENTS_MONSTER); laser_trace = SV_Trace(e->progs.sv->origin,NULL,NULL,laser_end,NULL,CONTENTS_SOLID|CONTENTS_MONSTER);
if(laser_trace.ent == ent) if(laser_trace.ent == ent)
continue; continue;
VectorCopy(laser_trace.endpos,laser_end); VectorCopy(laser_trace.endpos,laser_end);
laser_mins[0] = min(e->priv.sv->s.origin[0],laser_end[0]); laser_mins[0] = min(e->progs.sv->origin[0],laser_end[0]);
laser_mins[1] = min(e->priv.sv->s.origin[1],laser_end[1]); laser_mins[1] = min(e->progs.sv->origin[1],laser_end[1]);
laser_mins[2] = min(e->priv.sv->s.origin[2],laser_end[2]); laser_mins[2] = min(e->progs.sv->origin[2],laser_end[2]);
laser_maxs[0] = max(e->priv.sv->s.origin[0],laser_end[0]); laser_maxs[0] = max(e->progs.sv->origin[0],laser_end[0]);
laser_maxs[1] = max(e->priv.sv->s.origin[1],laser_end[1]); laser_maxs[1] = max(e->progs.sv->origin[1],laser_end[1]);
laser_maxs[2] = max(e->priv.sv->s.origin[2],laser_end[2]); laser_maxs[2] = max(e->progs.sv->origin[2],laser_end[2]);
monster_mins[0] = min(oldorg[0],trace.endpos[0]) + ent->progs.sv->mins[0]; monster_mins[0] = min(oldorg[0],trace.endpos[0]) + ent->progs.sv->mins[0];
monster_mins[1] = min(oldorg[1],trace.endpos[1]) + ent->progs.sv->mins[1]; monster_mins[1] = min(oldorg[1],trace.endpos[1]) + ent->progs.sv->mins[1];
monster_mins[2] = min(oldorg[2],trace.endpos[2]) + ent->progs.sv->mins[2]; monster_mins[2] = min(oldorg[2],trace.endpos[2]) + ent->progs.sv->mins[2];
@ -517,8 +517,8 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
while(delta < dist+15.875) while(delta < dist+15.875)
{ {
if(delta > dist) delta = dist; if(delta > dist) delta = dist;
VectorMA(e->priv.sv->s.origin, -delta,dir,laser_start); VectorMA(e->progs.sv->origin, -delta,dir,laser_start);
VectorMA(e->priv.sv->s.old_origin,-delta,dir,laser_end); VectorMA(e->progs.sv->old_origin,-delta,dir,laser_end);
laser_trace = SV_Trace(laser_start,NULL,NULL,laser_end,prog->edicts,CONTENTS_SOLID|CONTENTS_MONSTER); laser_trace = SV_Trace(laser_start,NULL,NULL,laser_end,prog->edicts,CONTENTS_SOLID|CONTENTS_MONSTER);
if(laser_trace.ent == ent) if(laser_trace.ent == ent)
return false; return false;
@ -543,7 +543,7 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
// if monster had the ground pulled out, go ahead and fall // if monster had the ground pulled out, go ahead and fall
if ((int)ent->progs.sv->aiflags & AI_PARTIALONGROUND ) if ((int)ent->progs.sv->aiflags & AI_PARTIALONGROUND )
{ {
VectorAdd (ent->priv.sv->s.origin, move, ent->priv.sv->s.origin); VectorAdd (ent->progs.sv->origin, move, ent->progs.sv->origin);
if (relink) if (relink)
{ {
SV_LinkEdict(ent); SV_LinkEdict(ent);
@ -556,20 +556,20 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
} }
// check point traces down for dangling corners // check point traces down for dangling corners
VectorCopy (trace.endpos, ent->priv.sv->s.origin); VectorCopy (trace.endpos, ent->progs.sv->origin);
if(!jump) if(!jump)
{ {
bool skip = false; bool skip = false;
// if monster CAN jump down, and a position just a bit forward would be // if monster CAN jump down, and a position just a bit forward would be
// a good jump-down spot, allow (briefly) !M_CheckBottom // a good jump-down spot, allow (briefly) !M_CheckBottom
if (canjump && target && (target->priv.sv->s.origin[2] < ent->priv.sv->s.origin[2]) && (ent->progs.sv->jumpdn > 0)) if (canjump && target && (target->progs.sv->origin[2] < ent->progs.sv->origin[2]) && (ent->progs.sv->jumpdn > 0))
{ {
vec3_t p1, p2; vec3_t p1, p2;
trace_t tr; trace_t tr;
VectorMA(oldorg,48,forward,p1); VectorMA(oldorg,48,forward,p1);
tr = SV_Trace(ent->priv.sv->s.origin, ent->progs.sv->mins, ent->progs.sv->maxs, p1, ent, MASK_MONSTERSOLID); tr = SV_Trace(ent->progs.sv->origin, ent->progs.sv->mins, ent->progs.sv->maxs, p1, ent, MASK_MONSTERSOLID);
if(tr.fraction == 1) if(tr.fraction == 1)
{ {
p2[0] = p1[0]; p2[0] = p1[0];
@ -580,7 +580,7 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
{ {
if(!tr.ent || (!tr.ent->priv.sv->client && !((int)tr.ent->progs.sv->flags & FL_MONSTER) && !((int)tr.ent->progs.sv->flags & FL_DEADMONSTER))) if(!tr.ent || (!tr.ent->priv.sv->client && !((int)tr.ent->progs.sv->flags & FL_MONSTER) && !((int)tr.ent->progs.sv->flags & FL_DEADMONSTER)))
{ {
VectorSubtract(target->priv.sv->s.origin, tr.endpos, dir); VectorSubtract(target->progs.sv->origin, tr.endpos, dir);
d2 = VectorLength(dir); d2 = VectorLength(dir);
if(d2 < d1) if(d2 < d1)
skip = true; skip = true;
@ -603,7 +603,7 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
} }
return true; return true;
} }
VectorCopy (oldorg, ent->priv.sv->s.origin); VectorCopy (oldorg, ent->progs.sv->origin);
return false; return false;
} }
} }
@ -627,8 +627,8 @@ bool SV_MoveStep (edict_t *ent, vec3_t move, bool relink)
else else
{ {
ent->progs.sv->velocity[2] = max(ent->progs.sv->velocity[2],100); ent->progs.sv->velocity[2] = max(ent->progs.sv->velocity[2],100);
if(oldorg[2] - ent->priv.sv->s.origin[2] > 48) if(oldorg[2] - ent->progs.sv->origin[2] > 48)
ent->priv.sv->s.origin[2] = oldorg[2] + ent->progs.sv->velocity[2]*0.1f; ent->progs.sv->origin[2] = oldorg[2] + ent->progs.sv->velocity[2]*0.1f;
} }
if(relink) if(relink)
{ {
@ -653,7 +653,7 @@ bool SV_WalkMove (edict_t *ent, float yaw, float dist)
{ {
vec3_t move; vec3_t move;
if (!ent->progs.sv->groundentity && !((int)ent->progs.sv->aiflags & (AI_FLY|AI_SWIM))) if (!((int)ent->progs.sv->aiflags & (AI_ONGROUND|AI_FLY|AI_SWIM)))
return false; return false;
yaw = yaw * M_PI*2 / 360; yaw = yaw * M_PI*2 / 360;
@ -682,12 +682,12 @@ edict_t *SV_TestEntityPosition (edict_t *ent)
if(ent->progs.sv->solid == SOLID_BSP) if(ent->progs.sv->solid == SOLID_BSP)
{ {
vec3_t org, mins, maxs; vec3_t org, mins, maxs;
VectorAdd(ent->priv.sv->s.origin, ent->progs.sv->origin_offset, org); VectorAdd(ent->progs.sv->origin, ent->progs.sv->origin_offset, org);
VectorSubtract(ent->progs.sv->mins, ent->progs.sv->origin_offset, mins); VectorSubtract(ent->progs.sv->mins, ent->progs.sv->origin_offset, mins);
VectorSubtract(ent->progs.sv->maxs, ent->progs.sv->origin_offset, maxs); VectorSubtract(ent->progs.sv->maxs, ent->progs.sv->origin_offset, maxs);
trace = SV_Trace (org, mins, maxs, org, ent, mask); trace = SV_Trace (org, mins, maxs, org, ent, mask);
} }
else trace = SV_Trace (ent->priv.sv->s.origin, ent->progs.sv->mins, ent->progs.sv->maxs, ent->priv.sv->s.origin, ent, mask); else trace = SV_Trace (ent->progs.sv->origin, ent->progs.sv->mins, ent->progs.sv->maxs, ent->progs.sv->origin, ent, mask);
if (trace.startsolid) if (trace.startsolid)
{ {
@ -760,7 +760,6 @@ void SV_Impact (edict_t *e1, trace_t *trace)
PRVM_PUSH_GLOBALS; PRVM_PUSH_GLOBALS;
prog->globals.server->time = sv.time; prog->globals.server->time = sv.time;
Msg("touch %d and %d\n", e2->priv.sv->s.number, e1->priv.sv->s.number );
if (!e1->priv.sv->free && !e2->priv.sv->free && e1->progs.sv->touch && e1->progs.sv->solid != SOLID_NOT) if (!e1->priv.sv->free && !e2->priv.sv->free && e1->progs.sv->touch && e1->progs.sv->solid != SOLID_NOT)
{ {
prog->globals.server->pev = PRVM_EDICT_TO_PROG(e1); prog->globals.server->pev = PRVM_EDICT_TO_PROG(e1);
@ -869,9 +868,9 @@ retry:
ent->progs.sv->groundentity = 0; ent->progs.sv->groundentity = 0;
for (bumpcount = 0; bumpcount < numbumps; bumpcount++) for (bumpcount = 0; bumpcount < numbumps; bumpcount++)
{ {
for (i = 0; i < 3; i++) end[i] = ent->priv.sv->s.origin[i] + time_left * ent->progs.sv->velocity[i]; for (i = 0; i < 3; i++) end[i] = ent->progs.sv->origin[i] + time_left * ent->progs.sv->velocity[i];
trace = SV_Trace (ent->priv.sv->s.origin, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask); trace = SV_Trace (ent->progs.sv->origin, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask);
if (trace.allsolid) if (trace.allsolid)
{ {
@ -883,7 +882,7 @@ retry:
if (trace.fraction > 0) if (trace.fraction > 0)
{ {
// actually covered some distance // actually covered some distance
VectorCopy (trace.endpos, ent->priv.sv->s.origin); VectorCopy (trace.endpos, ent->progs.sv->origin);
VectorCopy (ent->progs.sv->velocity, original_velocity); VectorCopy (ent->progs.sv->velocity, original_velocity);
numplanes = 0; numplanes = 0;
} }
@ -906,7 +905,7 @@ retry:
trace = SV_Trace (above, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask); trace = SV_Trace (above, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask);
VectorCopy (trace.endpos,end); VectorCopy (trace.endpos,end);
end[2] += 1; end[2] += 1;
VectorSubtract (end,ent->priv.sv->s.origin,ent->progs.sv->velocity); VectorSubtract (end,ent->progs.sv->origin,ent->progs.sv->velocity);
VectorScale (ent->progs.sv->velocity,1.0/time_left,ent->progs.sv->velocity); VectorScale (ent->progs.sv->velocity,1.0/time_left,ent->progs.sv->velocity);
num_retries++; num_retries++;
goto retry; goto retry;
@ -921,11 +920,11 @@ retry:
if(ent->progs.sv->mass > hit->progs.sv->mass) if(ent->progs.sv->mass > hit->progs.sv->mass)
{ {
VectorMA (hit->priv.sv->s.origin,time_left,ent->progs.sv->velocity,player_dest); VectorMA (hit->progs.sv->origin,time_left,ent->progs.sv->velocity,player_dest);
ptrace = SV_Trace(hit->priv.sv->s.origin,hit->progs.sv->mins,hit->progs.sv->maxs,player_dest,hit,hit->priv.sv->clipmask); ptrace = SV_Trace(hit->progs.sv->origin,hit->progs.sv->mins,hit->progs.sv->maxs,player_dest,hit,hit->priv.sv->clipmask);
if(ptrace.fraction == 1.0) if(ptrace.fraction == 1.0)
{ {
VectorCopy(player_dest,hit->priv.sv->s.origin); VectorCopy(player_dest,hit->progs.sv->origin);
SV_LinkEdict(hit); SV_LinkEdict(hit);
goto retry; goto retry;
} }
@ -1054,7 +1053,7 @@ retry:
time_left = time; time_left = time;
VectorAdd(ent->priv.sv->s.origin,ent->progs.sv->origin_offset,origin); VectorAdd(ent->progs.sv->origin,ent->progs.sv->origin_offset,origin);
VectorCopy(ent->progs.sv->size,maxs); VectorCopy(ent->progs.sv->size,maxs);
VectorScale(maxs,0.5,maxs); VectorScale(maxs,0.5,maxs);
VectorNegate(maxs,mins); VectorNegate(maxs,mins);
@ -1078,7 +1077,7 @@ retry:
{ {
// actually covered some distance // actually covered some distance
VectorCopy (trace.endpos, origin); VectorCopy (trace.endpos, origin);
VectorSubtract (origin, ent->progs.sv->origin_offset, ent->priv.sv->s.origin); VectorSubtract (origin, ent->progs.sv->origin_offset, ent->progs.sv->origin);
VectorCopy (ent->progs.sv->velocity, original_velocity); VectorCopy (ent->progs.sv->velocity, original_velocity);
numplanes = 0; numplanes = 0;
} }
@ -1115,11 +1114,11 @@ retry:
if(ent->progs.sv->mass > hit->progs.sv->mass) if(ent->progs.sv->mass > hit->progs.sv->mass)
{ {
VectorMA (hit->priv.sv->s.origin,time_left,ent->progs.sv->velocity,player_dest); VectorMA (hit->progs.sv->origin,time_left,ent->progs.sv->velocity,player_dest);
ptrace = SV_Trace(hit->priv.sv->s.origin,hit->progs.sv->mins,hit->progs.sv->maxs,player_dest,hit,hit->priv.sv->clipmask); ptrace = SV_Trace(hit->progs.sv->origin,hit->progs.sv->mins,hit->progs.sv->maxs,player_dest,hit,hit->priv.sv->clipmask);
if(ptrace.fraction == 1.0) if(ptrace.fraction == 1.0)
{ {
VectorCopy(player_dest,hit->priv.sv->s.origin); VectorCopy(player_dest,hit->progs.sv->origin);
SV_LinkEdict(hit); SV_LinkEdict(hit);
goto retry; goto retry;
} }
@ -1273,7 +1272,7 @@ trace_t SV_PushEntity (edict_t *ent, vec3_t push)
int mask; int mask;
int num_retries=0; int num_retries=0;
VectorCopy (ent->priv.sv->s.origin, start); VectorCopy (ent->progs.sv->origin, start);
VectorAdd (start, push, end); VectorAdd (start, push, end);
if (ent->priv.sv->clipmask) if (ent->priv.sv->clipmask)
@ -1284,7 +1283,7 @@ trace_t SV_PushEntity (edict_t *ent, vec3_t push)
retry: retry:
trace = SV_Trace (start, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask); trace = SV_Trace (start, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask);
VectorCopy (trace.endpos, ent->priv.sv->s.origin); VectorCopy (trace.endpos, ent->progs.sv->origin);
SV_LinkEdict (ent); SV_LinkEdict (ent);
if (trace.fraction != 1.0) if (trace.fraction != 1.0)
@ -1295,7 +1294,7 @@ retry:
if (trace.ent->priv.sv->free && !ent->priv.sv->free) if (trace.ent->priv.sv->free && !ent->priv.sv->free)
{ {
// move the pusher back and try again // move the pusher back and try again
VectorCopy (start, ent->priv.sv->s.origin); VectorCopy (start, ent->progs.sv->origin);
SV_LinkEdict (ent); SV_LinkEdict (ent);
goto retry; goto retry;
} }
@ -1311,7 +1310,7 @@ retry:
above[2] += 32; above[2] += 32;
trace = SV_Trace (above, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask); trace = SV_Trace (above, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask);
VectorCopy (trace.endpos, end); VectorCopy (trace.endpos, end);
VectorCopy (start, ent->priv.sv->s.origin); VectorCopy (start, ent->progs.sv->origin);
SV_LinkEdict(ent); SV_LinkEdict(ent);
num_retries++; num_retries++;
goto retry; goto retry;
@ -1321,8 +1320,8 @@ retry:
{ {
// If blocker can be damaged, destroy it. Otherwise destroy blockee. // If blocker can be damaged, destroy it. Otherwise destroy blockee.
if(trace.ent->progs.sv->takedamage == DAMAGE_YES) if(trace.ent->progs.sv->takedamage == DAMAGE_YES)
T_Damage(trace.ent, ent, ent, vec3_origin, trace.ent->priv.sv->s.origin, vec3_origin, 100000, 1, 0, DMG_CRUSH); T_Damage(trace.ent, ent, ent, vec3_origin, trace.ent->progs.sv->origin, vec3_origin, 100000, 1, 0, DMG_CRUSH);
else T_Damage(ent, trace.ent, trace.ent, vec3_origin, ent->priv.sv->s.origin, vec3_origin, 100000, 1, 0, DMG_CRUSH); else T_Damage(ent, trace.ent, trace.ent, vec3_origin, ent->progs.sv->origin, vec3_origin, 100000, 1, 0, DMG_CRUSH);
} }
} }
@ -1352,13 +1351,13 @@ void MoveRiders_r(edict_t *platform, edict_t *ignore, vec3_t move, vec3_t amove,
{ {
if((rider->progs.sv->groundentity == PRVM_EDICT_TO_PROG(platform)) && (rider != ignore)) if((rider->progs.sv->groundentity == PRVM_EDICT_TO_PROG(platform)) && (rider != ignore))
{ {
VectorAdd(rider->priv.sv->s.origin, move, rider->priv.sv->s.origin); VectorAdd(rider->progs.sv->origin, move, rider->progs.sv->origin);
if (turn && (amove[YAW] != 0.)) if (turn && (amove[YAW] != 0.))
{ {
if(!rider->priv.sv->client) rider->priv.sv->s.angles[YAW] += amove[YAW]; if(!rider->priv.sv->client) rider->progs.sv->angles[YAW] += amove[YAW];
else else
{ {
rider->priv.sv->s.angles[YAW] += amove[YAW]; rider->progs.sv->angles[YAW] += amove[YAW];
rider->priv.sv->client->ps.pmove.delta_angles[YAW] += ANGLE2SHORT(amove[YAW]); rider->priv.sv->client->ps.pmove.delta_angles[YAW] += ANGLE2SHORT(amove[YAW]);
rider->priv.sv->client->ps.pmove.pm_type = PM_FREEZE; rider->priv.sv->client->ps.pmove.pm_type = PM_FREEZE;
rider->priv.sv->client->ps.pmove.pm_flags |= PMF_NO_PREDICTION; rider->priv.sv->client->ps.pmove.pm_flags |= PMF_NO_PREDICTION;
@ -1370,10 +1369,10 @@ void MoveRiders_r(edict_t *platform, edict_t *ignore, vec3_t move, vec3_t amove,
{ {
// Move is blocked. Since this is for riders, not pushees, // Move is blocked. Since this is for riders, not pushees,
// it should be ok to just back the move for this rider off // it should be ok to just back the move for this rider off
VectorSubtract(rider->priv.sv->s.origin,move,rider->priv.sv->s.origin); VectorSubtract(rider->progs.sv->origin,move,rider->progs.sv->origin);
if(turn && (amove[YAW] != 0.)) if(turn && (amove[YAW] != 0.))
{ {
rider->priv.sv->s.angles[YAW] -= amove[YAW]; rider->progs.sv->angles[YAW] -= amove[YAW];
if(rider->priv.sv->client) if(rider->priv.sv->client)
{ {
rider->priv.sv->client->ps.pmove.delta_angles[YAW] -= ANGLE2SHORT(amove[YAW]); rider->priv.sv->client->ps.pmove.delta_angles[YAW] -= ANGLE2SHORT(amove[YAW]);
@ -1433,14 +1432,14 @@ void RealBoundingBox(edict_t *ent, vec3_t mins, vec3_t maxs)
} }
} }
AngleVectors(ent->priv.sv->s.angles, forward, left, up); AngleVectors(ent->progs.sv->angles, forward, left, up);
for(i = 0; i < 8; i++) for(i = 0; i < 8; i++)
{ {
VectorScale(forward, p[i][0], f1); VectorScale(forward, p[i][0], f1);
VectorScale(left, -p[i][1], l1); VectorScale(left, -p[i][1], l1);
VectorScale(up, p[i][2], u1); VectorScale(up, p[i][2], u1);
VectorAdd(ent->priv.sv->s.origin, f1, p[i]); VectorAdd(ent->progs.sv->origin, f1, p[i]);
VectorAdd(p[i], l1, p[i]); VectorAdd(p[i], l1, p[i]);
VectorAdd(p[i], u1, p[i]); VectorAdd(p[i], u1, p[i]);
} }
@ -1504,14 +1503,14 @@ bool SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
// save the pusher's original position // save the pusher's original position
pushed_p->ent = pusher; pushed_p->ent = pusher;
VectorCopy (pusher->priv.sv->s.origin, pushed_p->origin); VectorCopy (pusher->progs.sv->origin, pushed_p->origin);
VectorCopy (pusher->priv.sv->s.angles, pushed_p->angles); VectorCopy (pusher->progs.sv->angles, pushed_p->angles);
if (pusher->priv.sv->client) pushed_p->deltayaw = pusher->priv.sv->client->ps.pmove.delta_angles[YAW]; if (pusher->priv.sv->client) pushed_p->deltayaw = pusher->priv.sv->client->ps.pmove.delta_angles[YAW];
pushed_p++; pushed_p++;
// move the pusher to it's final position // move the pusher to it's final position
VectorAdd (pusher->priv.sv->s.origin, move, pusher->priv.sv->s.origin); VectorAdd (pusher->progs.sv->origin, move, pusher->progs.sv->origin);
VectorAdd (pusher->priv.sv->s.angles, amove, pusher->priv.sv->s.angles); VectorAdd (pusher->progs.sv->angles, amove, pusher->progs.sv->angles);
SV_LinkEdict (pusher); SV_LinkEdict (pusher);
// Lazarus: Standard Q2 takes a horrible shortcut // Lazarus: Standard Q2 takes a horrible shortcut
@ -1562,29 +1561,29 @@ bool SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
if (((int)pusher->progs.sv->flags & FL_TRACKTRAIN) && pusher->progs.sv->owner && (((int)check->progs.sv->flags & FL_MONSTER) || check->priv.sv->client) && (check->progs.sv->groundentity != PRVM_EDICT_TO_PROG(pusher))) if (((int)pusher->progs.sv->flags & FL_TRACKTRAIN) && pusher->progs.sv->owner && (((int)check->progs.sv->flags & FL_MONSTER) || check->priv.sv->client) && (check->progs.sv->groundentity != PRVM_EDICT_TO_PROG(pusher)))
{ {
vec3_t dir; vec3_t dir;
VectorSubtract(check->priv.sv->s.origin,pusher->priv.sv->s.origin,dir); VectorSubtract(check->progs.sv->origin,pusher->progs.sv->origin,dir);
dir[2] += 16; dir[2] += 16;
VectorNormalize(dir); VectorNormalize(dir);
T_Damage (check, pusher, pusher, dir, check->priv.sv->s.origin, vec3_origin, pusher->progs.sv->dmg, 1, 0, DMG_CRUSH); T_Damage (check, pusher, pusher, dir, check->progs.sv->origin, vec3_origin, pusher->progs.sv->dmg, 1, 0, DMG_CRUSH);
} }
if ((pusher->progs.sv->movetype == MOVETYPE_PUSH) || (check->progs.sv->groundentity == PRVM_EDICT_TO_PROG(pusher))) if ((pusher->progs.sv->movetype == MOVETYPE_PUSH) || (check->progs.sv->groundentity == PRVM_EDICT_TO_PROG(pusher)))
{ {
// move this entity // move this entity
pushed_p->ent = check; pushed_p->ent = check;
VectorCopy (check->priv.sv->s.origin, pushed_p->origin); VectorCopy (check->progs.sv->origin, pushed_p->origin);
VectorCopy (check->priv.sv->s.angles, pushed_p->angles); VectorCopy (check->progs.sv->angles, pushed_p->angles);
pushed_p++; pushed_p++;
// try moving the contacted entity // try moving the contacted entity
VectorAdd (check->priv.sv->s.origin, move, check->priv.sv->s.origin); VectorAdd (check->progs.sv->origin, move, check->progs.sv->origin);
// Lazarus: if turn_rider is set, do it. We don't do this by default // Lazarus: if turn_rider is set, do it. We don't do this by default
// 'cause it can be a fairly drastic change in gameplay // 'cause it can be a fairly drastic change in gameplay
if (turn && (check->progs.sv->groundentity == PRVM_EDICT_TO_PROG(pusher))) if (turn && (check->progs.sv->groundentity == PRVM_EDICT_TO_PROG(pusher)))
{ {
if(!check->priv.sv->client) if(!check->priv.sv->client)
{ {
check->priv.sv->s.angles[YAW] += amove[YAW]; check->progs.sv->angles[YAW] += amove[YAW];
} }
else else
{ {
@ -1608,7 +1607,7 @@ bool SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
float delta_yaw; float delta_yaw;
float pitch = amove[PITCH]; float pitch = amove[PITCH];
delta_yaw = check->priv.sv->s.angles[YAW] - pusher->priv.sv->s.angles[YAW]; delta_yaw = check->progs.sv->angles[YAW] - pusher->progs.sv->angles[YAW];
delta_yaw *= M_PI / 180.; delta_yaw *= M_PI / 180.;
pitch *= cos(delta_yaw); pitch *= cos(delta_yaw);
check->priv.sv->client->ps.pmove.delta_angles[PITCH] += ANGLE2SHORT(pitch); check->priv.sv->client->ps.pmove.delta_angles[PITCH] += ANGLE2SHORT(pitch);
@ -1626,20 +1625,20 @@ bool SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
if((amove[PITCH] != 0) || (amove[YAW] != 0) || (amove[ROLL] != 0)) if((amove[PITCH] != 0) || (amove[YAW] != 0) || (amove[ROLL] != 0))
{ {
// figure movement due to the pusher's amove // figure movement due to the pusher's amove
VectorAdd(check->priv.sv->s.origin,check->progs.sv->origin_offset,org_check); VectorAdd(check->progs.sv->origin,check->progs.sv->origin_offset,org_check);
VectorSubtract (org_check, pusher->priv.sv->s.origin, org); VectorSubtract (org_check, pusher->progs.sv->origin, org);
org2[0] = DotProduct (org, forward); org2[0] = DotProduct (org, forward);
org2[1] = -DotProduct (org, right); org2[1] = -DotProduct (org, right);
org2[2] = DotProduct (org, up); org2[2] = DotProduct (org, up);
VectorSubtract (org2, org, move2); VectorSubtract (org2, org, move2);
VectorAdd (check->priv.sv->s.origin, move2, check->priv.sv->s.origin); VectorAdd (check->progs.sv->origin, move2, check->progs.sv->origin);
if((amove[PITCH] != 0) || (amove[ROLL] != 0)) if((amove[PITCH] != 0) || (amove[ROLL] != 0))
{ {
VectorCopy(check->priv.sv->s.origin,org); VectorCopy(check->progs.sv->origin,org);
org[2] += 2*check->progs.sv->mins[2]; org[2] += 2*check->progs.sv->mins[2];
tr = SV_Trace(check->priv.sv->s.origin,vec3_origin,vec3_origin,org,check,MASK_SOLID); tr = SV_Trace(check->progs.sv->origin,vec3_origin,vec3_origin,org,check,MASK_SOLID);
if(!tr.startsolid && tr.fraction < 1) if(!tr.startsolid && tr.fraction < 1)
check->priv.sv->s.origin[2] = tr.endpos[2] - check->progs.sv->mins[2] + fabs(tr.plane.normal[0])*check->progs.sv->size[0]/2 + fabs(tr.plane.normal[1])*check->progs.sv->size[1]/2; check->progs.sv->origin[2] = tr.endpos[2] - check->progs.sv->mins[2] + fabs(tr.plane.normal[0])*check->progs.sv->size[0]/2 + fabs(tr.plane.normal[1])*check->progs.sv->size[1]/2;
// Lazarus: func_tracktrain is a special case. Since we KNOW (if the map was // Lazarus: func_tracktrain is a special case. Since we KNOW (if the map was
// constructed properly) that "post_origin" is a safe position, we // constructed properly) that "post_origin" is a safe position, we
@ -1649,22 +1648,22 @@ bool SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
{ {
vec3_t f,l,u; vec3_t f,l,u;
AngleVectors(pusher->priv.sv->s.angles, f, l, u); AngleVectors(pusher->progs.sv->angles, f, l, u);
VectorScale(f,pusher->progs.sv->post_origin[0],f); VectorScale(f,pusher->progs.sv->post_origin[0],f);
VectorScale(l,-pusher->progs.sv->post_origin[1],l); VectorScale(l,-pusher->progs.sv->post_origin[1],l);
VectorAdd(pusher->priv.sv->s.origin,f,org); VectorAdd(pusher->progs.sv->origin,f,org);
VectorAdd(org,l,org); VectorAdd(org,l,org);
org[2] += pusher->progs.sv->post_origin[2] + 1; org[2] += pusher->progs.sv->post_origin[2] + 1;
org[2] += 16 * ( fabs(u[0]) + fabs(u[1]) ); org[2] += 16 * ( fabs(u[0]) + fabs(u[1]) );
tr = SV_Trace(org,check->progs.sv->mins,check->progs.sv->maxs,check->priv.sv->s.origin,check,MASK_SOLID); tr = SV_Trace(org,check->progs.sv->mins,check->progs.sv->maxs,check->progs.sv->origin,check,MASK_SOLID);
if(!tr.startsolid) if(!tr.startsolid)
{ {
VectorCopy(tr.endpos,check->priv.sv->s.origin); VectorCopy(tr.endpos,check->progs.sv->origin);
VectorCopy(check->priv.sv->s.origin,org); VectorCopy(check->progs.sv->origin,org);
org[2] -= 128; org[2] -= 128;
tr = SV_Trace(check->priv.sv->s.origin,check->progs.sv->mins,check->progs.sv->maxs,org,check,MASK_SOLID); tr = SV_Trace(check->progs.sv->origin,check->progs.sv->mins,check->progs.sv->maxs,org,check,MASK_SOLID);
if(tr.fraction > 0) if(tr.fraction > 0)
VectorCopy(tr.endpos,check->priv.sv->s.origin); VectorCopy(tr.endpos,check->progs.sv->origin);
} }
} }
} }
@ -1682,22 +1681,22 @@ bool SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
// gonna be stuck. // gonna be stuck.
vec3_t f,l,u; vec3_t f,l,u;
AngleVectors(pusher->priv.sv->s.angles, f, l, u); AngleVectors(pusher->progs.sv->angles, f, l, u);
VectorScale(f,pusher->progs.sv->post_origin[0],f); VectorScale(f,pusher->progs.sv->post_origin[0],f);
VectorScale(l,-pusher->progs.sv->post_origin[1],l); VectorScale(l,-pusher->progs.sv->post_origin[1],l);
VectorAdd(pusher->priv.sv->s.origin,f,org); VectorAdd(pusher->progs.sv->origin,f,org);
VectorAdd(org,l,org); VectorAdd(org,l,org);
org[2] += pusher->progs.sv->post_origin[2] + 1; org[2] += pusher->progs.sv->post_origin[2] + 1;
org[2] += 16 * ( fabs(u[0]) + fabs(u[1]) ); org[2] += 16 * ( fabs(u[0]) + fabs(u[1]) );
tr = SV_Trace(org,check->progs.sv->mins,check->progs.sv->maxs,check->priv.sv->s.origin,check,MASK_SOLID); tr = SV_Trace(org,check->progs.sv->mins,check->progs.sv->maxs,check->progs.sv->origin,check,MASK_SOLID);
if(!tr.startsolid) if(!tr.startsolid)
{ {
VectorCopy(tr.endpos,check->priv.sv->s.origin); VectorCopy(tr.endpos,check->progs.sv->origin);
VectorCopy(check->priv.sv->s.origin,org); VectorCopy(check->progs.sv->origin,org);
org[2] -= 128; org[2] -= 128;
tr = SV_Trace(check->priv.sv->s.origin,check->progs.sv->mins,check->progs.sv->maxs,org,check,MASK_SOLID); tr = SV_Trace(check->progs.sv->origin,check->progs.sv->mins,check->progs.sv->maxs,org,check,MASK_SOLID);
if(tr.fraction > 0) if(tr.fraction > 0)
VectorCopy(tr.endpos,check->priv.sv->s.origin); VectorCopy(tr.endpos,check->progs.sv->origin);
block = SV_TestEntityPosition (check); block = SV_TestEntityPosition (check);
} }
} }
@ -1713,12 +1712,12 @@ bool SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
// if it is ok to leave in the old position, do it // if it is ok to leave in the old position, do it
// this is only relevent for riding entities, not pushed // this is only relevent for riding entities, not pushed
VectorSubtract (check->priv.sv->s.origin, move, check->priv.sv->s.origin); VectorSubtract (check->progs.sv->origin, move, check->progs.sv->origin);
VectorSubtract (check->priv.sv->s.origin, move2, check->priv.sv->s.origin); VectorSubtract (check->progs.sv->origin, move2, check->progs.sv->origin);
if(turn) if(turn)
{ {
// Argh! - angle // Argh! - angle
check->priv.sv->s.angles[YAW] -= amove[YAW]; check->progs.sv->angles[YAW] -= amove[YAW];
if(check->priv.sv->client) if(check->priv.sv->client)
{ {
check->priv.sv->client->ps.pmove.delta_angles[YAW] -= ANGLE2SHORT(amove[YAW]); check->priv.sv->client->ps.pmove.delta_angles[YAW] -= ANGLE2SHORT(amove[YAW]);
@ -1742,8 +1741,8 @@ bool SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
// twice, it goes back to the original position // twice, it goes back to the original position
for (p=pushed_p-1 ; p>=pushed ; p--) for (p=pushed_p-1 ; p>=pushed ; p--)
{ {
VectorCopy (p->origin, p->ent->priv.sv->s.origin); VectorCopy (p->origin, p->ent->progs.sv->origin);
VectorCopy (p->angles, p->ent->priv.sv->s.angles); VectorCopy (p->angles, p->ent->progs.sv->angles);
if (p->ent->priv.sv->client) if (p->ent->priv.sv->client)
{ {
p->ent->priv.sv->client->ps.pmove.delta_angles[YAW] = p->deltayaw; p->ent->priv.sv->client->ps.pmove.delta_angles[YAW] = p->deltayaw;
@ -1820,8 +1819,8 @@ void SV_Physics_Noclip (edict_t *ent)
// regular thinking // regular thinking
if (!SV_RunThink (ent)) return; if (!SV_RunThink (ent)) return;
VectorMA (ent->priv.sv->s.angles, 0.1f, ent->progs.sv->avelocity, ent->priv.sv->s.angles); VectorMA (ent->progs.sv->angles, 0.1f, ent->progs.sv->avelocity, ent->progs.sv->angles);
VectorMA (ent->priv.sv->s.origin, 0.1f, ent->progs.sv->velocity, ent->priv.sv->s.origin); VectorMA (ent->progs.sv->origin, 0.1f, ent->progs.sv->velocity, ent->progs.sv->origin);
SV_LinkEdict(ent); SV_LinkEdict(ent);
} }
@ -1869,7 +1868,7 @@ void SV_Physics_Toss (edict_t *ent)
trace_t tr; trace_t tr;
edict_t *ground = PRVM_PROG_TO_EDICT(ent->progs.sv->groundentity); edict_t *ground = PRVM_PROG_TO_EDICT(ent->progs.sv->groundentity);
VectorCopy(ent->priv.sv->s.origin,point); VectorCopy(ent->progs.sv->origin,point);
point[2] += 1; point[2] += 1;
VectorCopy(point,end); VectorCopy(point,end);
end[2] -= 256; end[2] -= 256;
@ -1900,7 +1899,7 @@ void SV_Physics_Toss (edict_t *ent)
if ( ent->progs.sv->groundentity ) if ( ent->progs.sv->groundentity )
return; return;
VectorCopy (ent->priv.sv->s.origin, old_origin); VectorCopy (ent->progs.sv->origin, old_origin);
SV_CheckVelocity (ent); SV_CheckVelocity (ent);
@ -1909,7 +1908,7 @@ void SV_Physics_Toss (edict_t *ent)
SV_AddGravity (ent); SV_AddGravity (ent);
// move angles // move angles
VectorMA (ent->priv.sv->s.angles, 0.1f, ent->progs.sv->avelocity, ent->priv.sv->s.angles); VectorMA (ent->progs.sv->angles, 0.1f, ent->progs.sv->avelocity, ent->progs.sv->angles);
// move origin // move origin
VectorScale (ent->progs.sv->velocity, 0.1f, move); VectorScale (ent->progs.sv->velocity, 0.1f, move);
@ -1941,7 +1940,7 @@ void SV_Physics_Toss (edict_t *ent)
// check for water transition // check for water transition
wasinwater = ((int)ent->progs.sv->watertype & MASK_WATER); wasinwater = ((int)ent->progs.sv->watertype & MASK_WATER);
ent->progs.sv->watertype = SV_PointContents (ent->priv.sv->s.origin); ent->progs.sv->watertype = SV_PointContents (ent->progs.sv->origin);
isinwater = (int)ent->progs.sv->watertype & MASK_WATER; isinwater = (int)ent->progs.sv->watertype & MASK_WATER;
if (isinwater) ent->progs.sv->waterlevel = 1; if (isinwater) ent->progs.sv->waterlevel = 1;
@ -1950,7 +1949,7 @@ void SV_Physics_Toss (edict_t *ent)
if (!wasinwater && isinwater) if (!wasinwater && isinwater)
SV_StartSound(old_origin, prog->edicts, CHAN_AUTO, SV_SoundIndex("misc/h2ohit1.wav"), 1, 1, 0); SV_StartSound(old_origin, prog->edicts, CHAN_AUTO, SV_SoundIndex("misc/h2ohit1.wav"), 1, 1, 0);
else if (wasinwater && !isinwater) else if (wasinwater && !isinwater)
SV_StartSound(ent->priv.sv->s.origin, prog->edicts, CHAN_AUTO, SV_SoundIndex("misc/h2ohit1.wav"), 1, 1, 0); SV_StartSound(ent->progs.sv->origin, prog->edicts, CHAN_AUTO, SV_SoundIndex("misc/h2ohit1.wav"), 1, 1, 0);
} }
/* /*
@ -1983,7 +1982,7 @@ void SV_AddRotationalFriction (edict_t *ent)
int n; int n;
float adjustment; float adjustment;
VectorMA (ent->priv.sv->s.angles, 0.1f, ent->progs.sv->avelocity, ent->priv.sv->s.angles); VectorMA (ent->progs.sv->angles, 0.1f, ent->progs.sv->avelocity, ent->progs.sv->angles);
adjustment = 0.1f * sv_stopspeed * sv_friction; adjustment = 0.1f * sv_stopspeed * sv_friction;
for (n = 0; n < 3; n++) for (n = 0; n < 3; n++)
@ -2028,9 +2027,9 @@ float RiderMass(edict_t *platform)
// func_pushables don't really have a groundentity, even // func_pushables don't really have a groundentity, even
// though they may be sitting on another swimming // though they may be sitting on another swimming
// func_pushable, which is what we need to know. // func_pushable, which is what we need to know.
VectorCopy(rider->priv.sv->s.origin,point); VectorCopy(rider->progs.sv->origin,point);
point[2] -= 0.25; point[2] -= 0.25;
trace = SV_Trace (rider->priv.sv->s.origin, rider->progs.sv->mins, rider->progs.sv->maxs, point, rider, MASK_MONSTERSOLID); trace = SV_Trace (rider->progs.sv->origin, rider->progs.sv->mins, rider->progs.sv->maxs, point, rider, MASK_MONSTERSOLID);
if ( trace.plane.normal[2] < 0.7 && !trace.startsolid) if ( trace.plane.normal[2] < 0.7 && !trace.startsolid)
continue; continue;
if (!trace.startsolid && !trace.allsolid) if (!trace.startsolid && !trace.allsolid)
@ -2066,7 +2065,7 @@ void SV_Physics_Step (edict_t *ent)
oldwaterlevel = ent->progs.sv->waterlevel; oldwaterlevel = ent->progs.sv->waterlevel;
VectorCopy(ent->priv.sv->s.origin, old_origin); VectorCopy(ent->progs.sv->origin, old_origin);
// Lazarus: If density hasn't been calculated yet, do so now // Lazarus: If density hasn't been calculated yet, do so now
if (ent->progs.sv->mass > 0 && ent->progs.sv->density == 0.) if (ent->progs.sv->mass > 0 && ent->progs.sv->density == 0.)
@ -2252,7 +2251,7 @@ void SV_Physics_Step (edict_t *ent)
{ {
trace_t tr; trace_t tr;
VectorCopy(ent->priv.sv->s.origin,point); VectorCopy(ent->progs.sv->origin,point);
point[2] += 1; point[2] += 1;
VectorCopy(point,end); VectorCopy(point,end);
end[2] -= 256; end[2] -= 256;
@ -2315,7 +2314,7 @@ void SV_Physics_Step (edict_t *ent)
block = SV_PushableMove (ent, 0.1f, mask); block = SV_PushableMove (ent, 0.1f, mask);
if(block && !(block & 8) && onconveyor) if(block && !(block & 8) && onconveyor)
{ {
T_Damage(ent, prog->edicts, prog->edicts, vec3_origin, ent->priv.sv->s.origin, vec3_origin, 100000, 1, 0, DMG_CRUSH); T_Damage(ent, prog->edicts, prog->edicts, vec3_origin, ent->progs.sv->origin, vec3_origin, 100000, 1, 0, DMG_CRUSH);
if(ent->priv.sv->free) return; if(ent->priv.sv->free) return;
} }
} }
@ -2324,7 +2323,7 @@ void SV_Physics_Step (edict_t *ent)
block = SV_FlyMove (ent, 0.1f, mask); block = SV_FlyMove (ent, 0.1f, mask);
if(block && !(block & 8) && onconveyor) if(block && !(block & 8) && onconveyor)
{ {
T_Damage (ent, prog->edicts, prog->edicts, vec3_origin, ent->priv.sv->s.origin, vec3_origin, 100000, 1, 0, DMG_CRUSH); T_Damage (ent, prog->edicts, prog->edicts, vec3_origin, ent->progs.sv->origin, vec3_origin, 100000, 1, 0, DMG_CRUSH);
if(ent->priv.sv->free) return; if(ent->priv.sv->free) return;
} }
} }
@ -2342,16 +2341,16 @@ void SV_Physics_Step (edict_t *ent)
{ {
trace_t tr; trace_t tr;
if(ent->progs.sv->bouncetype == 2) VectorMA(old_origin,0.1f,ent->progs.sv->velocity,ent->priv.sv->s.origin); if(ent->progs.sv->bouncetype == 2) VectorMA(old_origin,0.1f,ent->progs.sv->velocity,ent->progs.sv->origin);
VectorSubtract(ent->priv.sv->s.origin,old_origin,move); VectorSubtract(ent->progs.sv->origin,old_origin,move);
for(i = 1, e = PRVM_EDICT_NUM(i); i < prog->num_edicts; i++, e = PRVM_EDICT_NUM(i)) for(i = 1, e = PRVM_EDICT_NUM(i); i < prog->num_edicts; i++, e = PRVM_EDICT_NUM(i))
{ {
if(e==ent) continue; if(e==ent) continue;
if(e->progs.sv->groundentity == PRVM_EDICT_TO_PROG(ent)) if(e->progs.sv->groundentity == PRVM_EDICT_TO_PROG(ent))
{ {
VectorAdd(e->priv.sv->s.origin,move,end); VectorAdd(e->progs.sv->origin,move,end);
tr = SV_Trace(e->priv.sv->s.origin, e->progs.sv->mins, e->progs.sv->maxs, end, ent, MASK_SOLID); tr = SV_Trace(e->progs.sv->origin, e->progs.sv->mins, e->progs.sv->maxs, end, ent, MASK_SOLID);
VectorCopy(tr.endpos,e->priv.sv->s.origin); VectorCopy(tr.endpos,e->progs.sv->origin);
SV_LinkEdict(e); SV_LinkEdict(e);
} }
} }
@ -2405,13 +2404,13 @@ trace_t SV_DebrisEntity (edict_t *ent, vec3_t push)
int damage; int damage;
int mask; int mask;
VectorCopy (ent->priv.sv->s.origin, start); VectorCopy (ent->progs.sv->origin, start);
VectorAdd (start, push, end); VectorAdd (start, push, end);
if(ent->priv.sv->clipmask) mask = ent->priv.sv->clipmask; if(ent->priv.sv->clipmask) mask = ent->priv.sv->clipmask;
else mask = MASK_SHOT; else mask = MASK_SHOT;
trace = SV_Trace (start, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask); trace = SV_Trace (start, ent->progs.sv->mins, ent->progs.sv->maxs, end, ent, mask);
VectorCopy (trace.endpos, ent->priv.sv->s.origin); VectorCopy (trace.endpos, ent->progs.sv->origin);
SV_LinkEdict (ent); SV_LinkEdict (ent);
if (trace.fraction != 1.0) if (trace.fraction != 1.0)
@ -2443,7 +2442,7 @@ trace_t SV_DebrisEntity (edict_t *ent, vec3_t push)
if(speed1 > 100) if(speed1 > 100)
{ {
damage = (int)(ent->progs.sv->mass * speed1 / 5000.); damage = (int)(ent->progs.sv->mass * speed1 / 5000.);
if(damage) T_Damage(trace.ent, prog->edicts, prog->edicts, v1, trace.ent->priv.sv->s.origin, vec3_origin, damage, 0, 0, DMG_CRUSH); if(damage) T_Damage(trace.ent, prog->edicts, prog->edicts, v1, trace.ent->progs.sv->origin, vec3_origin, damage, 0, 0, DMG_CRUSH);
} }
PRVM_PUSH_GLOBALS; PRVM_PUSH_GLOBALS;
@ -2504,12 +2503,12 @@ void SV_Physics_Debris (edict_t *ent)
if ( ent->progs.sv->groundentity ) if ( ent->progs.sv->groundentity )
return; return;
VectorCopy (ent->priv.sv->s.origin, old_origin); VectorCopy (ent->progs.sv->origin, old_origin);
SV_CheckVelocity (ent); SV_CheckVelocity (ent);
SV_AddGravity (ent); SV_AddGravity (ent);
// move angles // move angles
VectorMA (ent->priv.sv->s.angles, 0.1f, ent->progs.sv->avelocity, ent->priv.sv->s.angles); VectorMA (ent->progs.sv->angles, 0.1f, ent->progs.sv->avelocity, ent->progs.sv->angles);
// move origin // move origin
VectorScale (ent->progs.sv->velocity, 0.1f, move); VectorScale (ent->progs.sv->velocity, 0.1f, move);
@ -2535,14 +2534,14 @@ void SV_Physics_Debris (edict_t *ent)
// check for water transition // check for water transition
wasinwater = ((int)ent->progs.sv->watertype & MASK_WATER); wasinwater = ((int)ent->progs.sv->watertype & MASK_WATER);
ent->progs.sv->watertype = SV_PointContents (ent->priv.sv->s.origin); ent->progs.sv->watertype = SV_PointContents (ent->progs.sv->origin);
isinwater = (int)ent->progs.sv->watertype & MASK_WATER; isinwater = (int)ent->progs.sv->watertype & MASK_WATER;
if (isinwater) ent->progs.sv->waterlevel = 1; if (isinwater) ent->progs.sv->waterlevel = 1;
else ent->progs.sv->waterlevel = 0; else ent->progs.sv->waterlevel = 0;
if (!wasinwater && isinwater) SV_StartSound (old_origin, prog->edicts, CHAN_AUTO, SV_SoundIndex("misc/h2ohit1.wav"), 1, 1, 0); if (!wasinwater && isinwater) SV_StartSound (old_origin, prog->edicts, CHAN_AUTO, SV_SoundIndex("misc/h2ohit1.wav"), 1, 1, 0);
else if (wasinwater && !isinwater) SV_StartSound (ent->priv.sv->s.origin, prog->edicts, CHAN_AUTO, SV_SoundIndex("misc/h2ohit1.wav"), 1, 1, 0); else if (wasinwater && !isinwater) SV_StartSound (ent->progs.sv->origin, prog->edicts, CHAN_AUTO, SV_SoundIndex("misc/h2ohit1.wav"), 1, 1, 0);
} }
@ -2575,7 +2574,7 @@ void SV_Physics_Conveyor(edict_t *ent)
if(player->progs.sv->groundentity != PRVM_EDICT_TO_PROG(ent)) continue; if(player->progs.sv->groundentity != PRVM_EDICT_TO_PROG(ent)) continue;
// Look below player; make sure he's on a conveyor // Look below player; make sure he's on a conveyor
VectorCopy(player->priv.sv->s.origin,point); VectorCopy(player->progs.sv->origin,point);
point[2] += 1; point[2] += 1;
VectorCopy(point,end); VectorCopy(point,end);
end[2] -= 256; end[2] -= 256;
@ -2594,9 +2593,9 @@ void SV_Physics_Conveyor(edict_t *ent)
} }
move[2] = v[2] * 0.1f; move[2] = v[2] * 0.1f;
} }
VectorAdd(player->priv.sv->s.origin,move,end); VectorAdd(player->progs.sv->origin,move,end);
tr = SV_Trace(player->priv.sv->s.origin,player->progs.sv->mins,player->progs.sv->maxs,end,player,player->priv.sv->clipmask); tr = SV_Trace(player->progs.sv->origin,player->progs.sv->mins,player->progs.sv->maxs,end,player,player->priv.sv->clipmask);
VectorCopy(tr.endpos,player->priv.sv->s.origin); VectorCopy(tr.endpos,player->progs.sv->origin);
SV_LinkEdict(player); SV_LinkEdict(player);
} }
} }

View File

@ -227,7 +227,7 @@ void _MSG_Send (msgtype_t to, vec3_t origin, edict_t *ent, const char *filename,
{ {
area2 = CM_LeafArea (leafnum); area2 = CM_LeafArea (leafnum);
cluster = CM_LeafCluster (leafnum); cluster = CM_LeafCluster (leafnum);
leafnum = CM_PointLeafnum (client->edict->priv.sv->s.origin); leafnum = CM_PointLeafnum (client->edict->progs.sv->origin);
if (!CM_AreasConnected (area1, area2)) continue; if (!CM_AreasConnected (area1, area2)) continue;
if ( mask && (!(mask[cluster>>3] & (1<<(cluster&7))))) continue; if ( mask && (!(mask[cluster>>3] & (1<<(cluster&7))))) continue;
} }
@ -330,12 +330,12 @@ void SV_StartSound (vec3_t origin, edict_t *entity, int channel, int soundindex,
{ {
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
origin_v[i] = entity->priv.sv->s.origin[i]+0.5*(entity->progs.sv->mins[i]+entity->progs.sv->maxs[i]); origin_v[i] = entity->progs.sv->origin[i]+0.5*(entity->progs.sv->mins[i]+entity->progs.sv->maxs[i]);
} }
} }
else else
{ {
VectorCopy (entity->priv.sv->s.origin, origin_v); VectorCopy (entity->progs.sv->origin, origin_v);
} }
} }
@ -499,8 +499,7 @@ void SV_SendClientMessages (void)
// read the next demo message if needed // read the next demo message if needed
if (sv.state == ss_demo && sv.demofile) if (sv.state == ss_demo && sv.demofile)
{ {
if (sv_paused->value) if (sv_paused->value) msglen = 0;
msglen = 0;
else else
{ {
// get the next message // get the next message
@ -525,7 +524,7 @@ void SV_SendClientMessages (void)
} }
// send a message to each connected client // send a message to each connected client
for (i=0, c = svs.clients ; i<maxclients->value; i++, c++) for (i = 0, c = svs.clients; i < maxclients->value; i++, c++)
{ {
if (!c->state) continue; if (!c->state) continue;
// if the reliable message overflowed, // if the reliable message overflowed,
@ -538,17 +537,12 @@ void SV_SendClientMessages (void)
SV_DropClient (c); SV_DropClient (c);
} }
if (sv.state == ss_cinematic if (sv.state == ss_cinematic || sv.state == ss_demo || sv.state == ss_pic)
|| sv.state == ss_demo
|| sv.state == ss_pic
)
Netchan_Transmit (&c->netchan, msglen, msgbuf); Netchan_Transmit (&c->netchan, msglen, msgbuf);
else if (c->state == cs_spawned) else if (c->state == cs_spawned)
{ {
// don't overrun bandwidth // don't overrun bandwidth
if (SV_RateDrop (c)) if (SV_RateDrop (c)) continue;
continue;
SV_SendClientDatagram (c); SV_SendClientDatagram (c);
} }
else else

View File

@ -11,36 +11,6 @@ trace_t PM_trace (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end)
return SV_Trace (start, mins, maxs, end, pm_passent, MASK_DEADSOLID); return SV_Trace (start, mins, maxs, end, pm_passent, MASK_DEADSOLID);
} }
/*
=============
ED_NewString
=============
*/
char *ED_NewString (const char *string)
{
char *newb, *new_p;
int i, l;
l = strlen(string) + 1;
newb = (char *)Z_Malloc(l);
new_p = newb;
for (i = 0; i < l; i++)
{
if (string[i] == '\\' && i < l-1)
{
i++;
if (string[i] == 'n')
*new_p++ = '\n';
else *new_p++ = '\\';
}
else *new_p++ = string[i];
}
return newb;
}
/* /*
=========== ===========
PutClientInServer PutClientInServer
@ -80,18 +50,17 @@ void SV_PutClientInServer (edict_t *ent)
client->ps.gunindex = SV_ModelIndex("models/weapons/v_eagle.mdl"); client->ps.gunindex = SV_ModelIndex("models/weapons/v_eagle.mdl");
// clear entity state values // clear entity state values
ent->priv.sv->s.effects = 0; ent->progs.sv->effects = 0;
ent->priv.sv->s.modelindex = MAX_MODELS - 1; // will use the skin specified model ent->progs.sv->modelindex = MAX_MODELS - 1; // will use the skin specified model
ent->priv.sv->s.weaponmodel = MAX_MODELS - 1; // custom gun model ent->progs.sv->weaponmodel = MAX_MODELS - 1; // custom gun model
// sknum is player num and weapon number // sknum is player num and weapon number
// weapon number will be added in changeweapon // weapon number will be added in changeweapon
ent->priv.sv->s.skin = PRVM_NUM_FOR_EDICT(ent) - 1; ent->progs.sv->skin = PRVM_NUM_FOR_EDICT(ent) - 1;
ent->priv.sv->s.frame = 0; ent->progs.sv->frame = 0;
VectorCopy (ent->progs.sv->origin, ent->priv.sv->s.origin); ent->progs.sv->origin[2] += 1; // make sure off ground
ent->priv.sv->s.origin[2] += 1; // make sure off ground VectorCopy (ent->progs.sv->origin, ent->progs.sv->old_origin);
VectorCopy (ent->priv.sv->s.origin, ent->priv.sv->s.old_origin);
// set the delta angle // set the delta angle
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
@ -99,9 +68,9 @@ void SV_PutClientInServer (edict_t *ent)
client->ps.pmove.delta_angles[i] = ANGLE2SHORT(ent->progs.sv->angles[i]); client->ps.pmove.delta_angles[i] = ANGLE2SHORT(ent->progs.sv->angles[i]);
} }
ent->priv.sv->s.angles[PITCH] = ent->priv.sv->s.angles[ROLL] = 0; ent->progs.sv->angles[PITCH] = ent->progs.sv->angles[ROLL] = 0;
ent->priv.sv->s.angles[YAW] = ent->progs.sv->angles[YAW]; ent->progs.sv->angles[YAW] = ent->progs.sv->angles[YAW];
VectorCopy(ent->priv.sv->s.angles, client->ps.viewangles); VectorCopy(ent->progs.sv->angles, client->ps.viewangles);
VectorCopy (client->ps.viewangles, client->v_angle); VectorCopy (client->ps.viewangles, client->v_angle);
SV_LinkEdict(ent); SV_LinkEdict(ent);
@ -154,8 +123,7 @@ void SV_SpawnEntities (char *mapname, char *entities, char *spawnpoint)
void SV_InitEdict (edict_t *e) void SV_InitEdict (edict_t *e)
{ {
e->priv.sv->s.number = PRVM_NUM_FOR_EDICT(e); e->priv.sv->serialnumber = PRVM_NUM_FOR_EDICT(e);
e->priv.sv->s.renderfx |= RF_IR_VISIBLE; //evil stuff...
} }
@ -168,10 +136,6 @@ Marks the edict as free
*/ */
void SV_FreeEdict (edict_t *ed) void SV_FreeEdict (edict_t *ed)
{ {
// don't free players!
if (PRVM_NUM_FOR_EDICT(ed) <= maxclients->value)
return;
ed->priv.sv->freetime = sv.time; ed->priv.sv->freetime = sv.time;
ed->priv.sv->free = true; ed->priv.sv->free = true;
@ -377,7 +341,7 @@ void ClientEndServerFrame (edict_t *ent)
// //
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
current_client->ps.pmove.origin[i] = ent->priv.sv->s.origin[i]*8.0; current_client->ps.pmove.origin[i] = ent->progs.sv->origin[i]*8.0;
current_client->ps.pmove.velocity[i] = ent->progs.sv->velocity[i]*8.0; current_client->ps.pmove.velocity[i] = ent->progs.sv->velocity[i]*8.0;
} }
@ -387,12 +351,12 @@ void ClientEndServerFrame (edict_t *ent)
// set model angles from view angles so other things in // set model angles from view angles so other things in
// the world can tell which direction you are looking // the world can tell which direction you are looking
// //
if (ent->priv.sv->client->v_angle[PITCH] > 180) ent->priv.sv->s.angles[PITCH] = (-360 + ent->priv.sv->client->v_angle[PITCH])/3; if (ent->priv.sv->client->v_angle[PITCH] > 180) ent->progs.sv->angles[PITCH] = (-360 + ent->priv.sv->client->v_angle[PITCH])/3;
else ent->priv.sv->s.angles[PITCH] = ent->priv.sv->client->v_angle[PITCH]/3; else ent->progs.sv->angles[PITCH] = ent->priv.sv->client->v_angle[PITCH]/3;
ent->priv.sv->s.angles[YAW] = ent->priv.sv->client->v_angle[YAW]; ent->progs.sv->angles[YAW] = ent->priv.sv->client->v_angle[YAW];
ent->priv.sv->s.angles[ROLL] = 0; ent->progs.sv->angles[ROLL] = 0;
ent->priv.sv->s.angles[ROLL] = SV_CalcRoll (ent->priv.sv->s.angles, ent->progs.sv->velocity)*4; ent->progs.sv->angles[ROLL] = SV_CalcRoll (ent->progs.sv->angles, ent->progs.sv->velocity)*4;
// //
// calculate speed and cycle to be used for // calculate speed and cycle to be used for
@ -475,7 +439,7 @@ void SV_RunFrame( void )
ent = PRVM_EDICT_NUM(i); ent = PRVM_EDICT_NUM(i);
if (ent->priv.sv->free) continue; if (ent->priv.sv->free) continue;
VectorCopy (ent->priv.sv->s.origin, ent->priv.sv->s.old_origin); VectorCopy (ent->progs.sv->origin, ent->progs.sv->old_origin);
// don't apply phys on clients // don't apply phys on clients
if (i > 0 && i <= maxclients->value) continue; if (i > 0 && i <= maxclients->value) continue;
@ -593,12 +557,12 @@ void ClientThink (edict_t *ent, usercmd_t *ucmd)
prog->globals.server->pev = PRVM_EDICT_TO_PROG(ent); prog->globals.server->pev = PRVM_EDICT_TO_PROG(ent);
PRVM_ExecuteProgram (prog->globals.server->PlayerPreThink, "QC function PlayerPreThink is missing"); PRVM_ExecuteProgram (prog->globals.server->PlayerPreThink, "QC function PlayerPreThink is missing");
VectorCopy(ent->priv.sv->s.origin, oldorigin); VectorCopy(ent->progs.sv->origin, oldorigin);
VectorCopy(ent->progs.sv->velocity, oldvelocity); VectorCopy(ent->progs.sv->velocity, oldvelocity);
ent->priv.sv->client->ps.pmove.pm_flags &= ~PMF_NO_PREDICTION; ent->priv.sv->client->ps.pmove.pm_flags &= ~PMF_NO_PREDICTION;
VectorCopy(ent->priv.sv->s.origin, view); VectorCopy(ent->progs.sv->origin, view);
pm_passent = ent; pm_passent = ent;
@ -606,7 +570,6 @@ void ClientThink (edict_t *ent, usercmd_t *ucmd)
memset (&pm, 0, sizeof(pm)); memset (&pm, 0, sizeof(pm));
if (ent->progs.sv->movetype == MOVETYPE_NOCLIP) client->ps.pmove.pm_type = PM_SPECTATOR; if (ent->progs.sv->movetype == MOVETYPE_NOCLIP) client->ps.pmove.pm_type = PM_SPECTATOR;
else if (ent->priv.sv->s.modelindex != MAX_MODELS - 1) client->ps.pmove.pm_type = PM_GIB;
else client->ps.pmove.pm_type = PM_NORMAL; else client->ps.pmove.pm_type = PM_NORMAL;
client->ps.pmove.gravity = sv_gravity->value; client->ps.pmove.gravity = sv_gravity->value;
@ -614,7 +577,7 @@ void ClientThink (edict_t *ent, usercmd_t *ucmd)
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
pm.s.origin[i] = ent->priv.sv->s.origin[i]*8; pm.s.origin[i] = ent->progs.sv->origin[i]*8;
pm.s.velocity[i] = ent->progs.sv->velocity[i]*8; pm.s.velocity[i] = ent->progs.sv->velocity[i]*8;
} }
@ -635,7 +598,7 @@ void ClientThink (edict_t *ent, usercmd_t *ucmd)
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
ent->priv.sv->s.origin[i] = pm.s.origin[i]*0.125; ent->progs.sv->origin[i] = pm.s.origin[i]*0.125;
ent->progs.sv->velocity[i] = pm.s.velocity[i]*0.125; ent->progs.sv->velocity[i] = pm.s.velocity[i]*0.125;
} }
VectorCopy (pm.mins, ent->progs.sv->mins); VectorCopy (pm.mins, ent->progs.sv->mins);
@ -656,12 +619,12 @@ void ClientThink (edict_t *ent, usercmd_t *ucmd)
break; break;
} }
if (j != i) continue; // duplicated if (j != i) continue; // duplicated
if (!ent->progs.sv->touch) continue; if (!other->progs.sv->touch) continue;
prog->globals.server->pev = PRVM_EDICT_TO_PROG(other); prog->globals.server->pev = PRVM_EDICT_TO_PROG(other);
prog->globals.server->other = PRVM_EDICT_TO_PROG(ent); prog->globals.server->other = PRVM_EDICT_TO_PROG(ent);
prog->globals.server->time = sv.time; prog->globals.server->time = sv.time;
PRVM_ExecuteProgram (ent->progs.sv->touch, "QC function pev->touch is missing"); PRVM_ExecuteProgram (other->progs.sv->touch, "QC function pev->touch is missing");
} }
PRVM_POP_GLOBALS; PRVM_POP_GLOBALS;
@ -691,10 +654,10 @@ void SV_ClientDisconnect (edict_t *ent)
MSG_Begin( svc_muzzleflash ); MSG_Begin( svc_muzzleflash );
MSG_WriteShort( &sv.multicast, PRVM_NUM_FOR_EDICT(ent)); MSG_WriteShort( &sv.multicast, PRVM_NUM_FOR_EDICT(ent));
MSG_WriteByte( &sv.multicast, MZ_LOGOUT ); MSG_WriteByte( &sv.multicast, MZ_LOGOUT );
MSG_Send(MSG_PVS, ent->priv.sv->s.origin, NULL); MSG_Send(MSG_PVS, ent->progs.sv->origin, NULL);
SV_UnlinkEdict(ent); SV_UnlinkEdict(ent);
ent->priv.sv->s.modelindex = 0; ent->progs.sv->modelindex = 0;
ent->progs.sv->solid = SOLID_NOT; ent->progs.sv->solid = SOLID_NOT;
ent->priv.sv->free = true; ent->priv.sv->free = true;
ent->progs.sv->classname = PRVM_SetEngineString("disconnected"); ent->progs.sv->classname = PRVM_SetEngineString("disconnected");

View File

@ -21,6 +21,11 @@ int SV_StudioExtractBbox( studiohdr_t *phdr, int sequence, float *mins, float *m
byte *SV_GetModelPtr(edict_t *ent) byte *SV_GetModelPtr(edict_t *ent)
{ {
if(!ent) return NULL; cmodel_t *cmod;
return NULL;
if(!ent || !ent->progs.sv->modelindex) return NULL;
cmod = CM_LoadModel( ent->progs.sv->modelindex );
if(!cmod || !cmod->extradata) return NULL;
return cmod->extradata;
} }

View File

@ -97,8 +97,8 @@ void SV_New_f (void)
if (sv.state == ss_game) if (sv.state == ss_game)
{ {
// set up the entity for the client // set up the entity for the client
ent = PRVM_EDICT_NUM(playernum+1); ent = PRVM_EDICT_NUM(playernum + 1);
ent->priv.sv->s.number = playernum+1; ent->priv.sv->serialnumber = playernum + 1;
sv_client->edict = ent; sv_client->edict = ent;
memset (&sv_client->lastcmd, 0, sizeof(sv_client->lastcmd)); memset (&sv_client->lastcmd, 0, sizeof(sv_client->lastcmd));
@ -196,7 +196,7 @@ void SV_Baselines_f (void)
while ( sv_client->netchan.message.cursize < MAX_MSGLEN/2 && start < MAX_EDICTS) while ( sv_client->netchan.message.cursize < MAX_MSGLEN/2 && start < MAX_EDICTS)
{ {
base = &sv.baselines[start]; base = &sv.baselines[start];
if (base->modelindex || base->sound || base->effects) if (base->modelindex || base->soundindex || base->effects)
{ {
MSG_WriteByte (&sv_client->netchan.message, svc_spawnbaseline); MSG_WriteByte (&sv_client->netchan.message, svc_spawnbaseline);
MSG_WriteDeltaEntity (&nullstate, base, &sv_client->netchan.message, true, true); MSG_WriteDeltaEntity (&nullstate, base, &sv_client->netchan.message, true, true);

View File

@ -189,16 +189,16 @@ void SV_LinkEdict (edict_t *ent)
k = (ent->progs.sv->maxs[2]+32)/8; k = (ent->progs.sv->maxs[2]+32)/8;
if (k<1) k = 1; if (k<1) k = 1;
if (k>63) k = 63; if (k>63) k = 63;
ent->priv.sv->s.solid = (k<<10) | (j<<5) | i; ent->priv.sv->solid = (k<<10) | (j<<5) | i;
} }
else if (ent->progs.sv->solid == SOLID_BSP) else if (ent->progs.sv->solid == SOLID_BSP)
{ {
ent->priv.sv->s.solid = 31; // a solid_bbox will never create this value ent->priv.sv->solid = 31; // a solid_bbox will never create this value
} }
else ent->priv.sv->s.solid = 0; else ent->priv.sv->solid = 0;
// set the abs box // set the abs box
if (ent->progs.sv->solid == SOLID_BSP && !VectorIsNull(ent->priv.sv->s.angles)) if (ent->progs.sv->solid == SOLID_BSP && !VectorIsNull(ent->progs.sv->angles))
{ {
// expand for rotation // expand for rotation
float max = 0, v; float max = 0, v;
@ -213,14 +213,14 @@ void SV_LinkEdict (edict_t *ent)
} }
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
{ {
ent->progs.sv->absmin[i] = ent->priv.sv->s.origin[i] - max; ent->progs.sv->absmin[i] = ent->progs.sv->origin[i] - max;
ent->progs.sv->absmax[i] = ent->priv.sv->s.origin[i] + max; ent->progs.sv->absmax[i] = ent->progs.sv->origin[i] + max;
} }
} }
else else
{ // normal { // normal
VectorAdd (ent->priv.sv->s.origin, ent->progs.sv->mins, ent->progs.sv->absmin); VectorAdd (ent->progs.sv->origin, ent->progs.sv->mins, ent->progs.sv->absmin);
VectorAdd (ent->priv.sv->s.origin, ent->progs.sv->maxs, ent->progs.sv->absmax); VectorAdd (ent->progs.sv->origin, ent->progs.sv->maxs, ent->progs.sv->absmax);
} }
// because movement is clipped an epsilon away from an actual edge, // because movement is clipped an epsilon away from an actual edge,
@ -291,7 +291,7 @@ void SV_LinkEdict (edict_t *ent)
// if first time, make sure old_origin is valid // if first time, make sure old_origin is valid
if (!ent->priv.sv->linkcount) if (!ent->priv.sv->linkcount)
{ {
VectorCopy (ent->priv.sv->s.origin, ent->priv.sv->s.old_origin); VectorCopy (ent->progs.sv->origin, ent->progs.sv->old_origin);
} }
ent->priv.sv->linkcount++; ent->priv.sv->linkcount++;
@ -409,9 +409,9 @@ int SV_PointContents (vec3_t p)
// might intersect, so do an exact clip // might intersect, so do an exact clip
headnode = SV_HullForEntity (hit); headnode = SV_HullForEntity (hit);
angles = hit->priv.sv->s.angles; angles = hit->progs.sv->angles;
if (hit->progs.sv->solid != SOLID_BSP) angles = vec3_origin; // boxes don't rotate if (hit->progs.sv->solid != SOLID_BSP) angles = vec3_origin; // boxes don't rotate
c2 = CM_TransformedPointContents (p, headnode, hit->priv.sv->s.origin, hit->priv.sv->s.angles); c2 = CM_TransformedPointContents (p, headnode, hit->progs.sv->origin, hit->progs.sv->angles);
contents |= c2; contents |= c2;
} }
return contents; return contents;
@ -451,7 +451,7 @@ int SV_HullForEntity (edict_t *ent)
if (ent->progs.sv->solid == SOLID_BSP) if (ent->progs.sv->solid == SOLID_BSP)
{ {
// explicit hulls in the BSP model // explicit hulls in the BSP model
model = sv.models[ ent->priv.sv->s.modelindex ]; model = sv.models[ (int)ent->progs.sv->modelindex ];
if (!model) if (!model)
{ {
@ -502,16 +502,16 @@ void SV_ClipMoveToEntities ( moveclip_t *clip )
// might intersect, so do an exact clip // might intersect, so do an exact clip
headnode = SV_HullForEntity (touch); headnode = SV_HullForEntity (touch);
angles = touch->priv.sv->s.angles; angles = touch->progs.sv->angles;
if (touch->progs.sv->solid != SOLID_BSP) angles = vec3_origin; // boxes don't rotate if (touch->progs.sv->solid != SOLID_BSP) angles = vec3_origin; // boxes don't rotate
if ((int)touch->progs.sv->flags & FL_MONSTER) if ((int)touch->progs.sv->flags & FL_MONSTER)
{ {
trace = CM_TransformedBoxTrace (clip->start, clip->end, clip->mins2, clip->maxs2, headnode, clip->contentmask, touch->priv.sv->s.origin, angles); trace = CM_TransformedBoxTrace (clip->start, clip->end, clip->mins2, clip->maxs2, headnode, clip->contentmask, touch->progs.sv->origin, angles);
} }
else else
{ {
trace = CM_TransformedBoxTrace (clip->start, clip->end, clip->mins, clip->maxs, headnode, clip->contentmask, touch->priv.sv->s.origin, angles); trace = CM_TransformedBoxTrace (clip->start, clip->end, clip->mins, clip->maxs, headnode, clip->contentmask, touch->progs.sv->origin, angles);
} }
if (trace.allsolid || trace.startsolid || trace.fraction < clip->trace.fraction) if (trace.allsolid || trace.startsolid || trace.fraction < clip->trace.fraction)
{ {

View File

@ -839,7 +839,7 @@ void S_AddLoopSounds (void)
{ {
num = (cl.frame.parse_entities + i)&(MAX_PARSE_ENTITIES-1); num = (cl.frame.parse_entities + i)&(MAX_PARSE_ENTITIES-1);
ent = &cl_parse_entities[num]; ent = &cl_parse_entities[num];
sounds[i] = ent->sound; sounds[i] = ent->soundindex;
} }
for (i=0 ; i<cl.frame.num_entities ; i++) for (i=0 ; i<cl.frame.num_entities ; i++)

View File

@ -751,28 +751,28 @@ typedef enum
// need to render in some way // need to render in some way
typedef struct entity_state_s typedef struct entity_state_s
{ {
int number; // edict index int number; // edict index
vec3_t origin; vec3_t origin;
vec3_t angles; vec3_t angles;
vec3_t old_origin; // for lerping animation vec3_t old_origin; // for lerping animation
int modelindex; int modelindex;
int soundindex;
int weaponmodel; int weaponmodel;
short skin; // skin for studiomodels short skin; // skin for studiomodels
short frame; // % playback position in animation sequences (0..512) short frame; // % playback position in animation sequences (0..512)
byte body; // sub-model selection for studiomodels byte body; // sub-model selection for studiomodels
byte sequence; // animation sequence (0 - 255) byte sequence; // animation sequence (0 - 255)
uint effects; // PGM - we're filling it, so it needs to be unsigned uint effects; // PGM - we're filling it, so it needs to be unsigned
int renderfx; int renderfx;
int solid; // for client side prediction, 8*(bits 0-4) is x/y radius int solid; // for client side prediction, 8*(bits 0-4) is x/y radius
// 8*(bits 5-9) is z down distance, 8(bits10-15) is z up // 8*(bits 5-9) is z down distance, 8(bits10-15) is z up
// gi.linkentity sets this properly // gi.linkentity sets this properly
int sound; // for looping sounds, to guarantee shutoff int event; // impulse events -- muzzle flashes, footsteps, etc
int event; // impulse events -- muzzle flashes, footsteps, etc // events only go out for a single frame, they
// events only go out for a single frame, they // are automatically cleared each frame
// are automatically cleared each frame float alpha; // alpha value
float alpha; // alpha value
} entity_state_t; } entity_state_t;
//============================================== //==============================================

View File

@ -466,13 +466,13 @@ typedef struct scriptsystem_api_s
bool (*Load)( const char *name, char *buf, int size );// load script into stack from file or bufer bool (*Load)( const char *name, char *buf, int size );// load script into stack from file or bufer
bool (*Include)( const char *name, char *buf, int size ); // include script from file or buffer bool (*Include)( const char *name, char *buf, int size ); // include script from file or buffer
char *(*GetToken)( bool newline ); // get next token on a line or newline char *(*GetToken)( bool newline ); // get next token on a line or newline
char *(*Token)( void ); // just return current token
bool (*TryToken)( void ); // return 1 if have token on a line bool (*TryToken)( void ); // return 1 if have token on a line
void (*FreeToken)( void ); // free current token to may get it again void (*FreeToken)( void ); // free current token to may get it again
void (*SkipToken)( void ); // skip current token and jump into newline void (*SkipToken)( void ); // skip current token and jump into newline
bool (*MatchToken)( const char *match ); // compare current token with user keyword bool (*MatchToken)( const char *match ); // compare current token with user keyword
char *(*ParseToken)(const char **data ); // parse token from char buffer char *(*ParseToken)(const char **data ); // parse token from char buffer
char *(*ParseWord)( const char **data ); // parse word from char buffer char *(*ParseWord)( const char **data ); // parse word from char buffer
char *Token; // contains current token
} scriptsystem_api_t; } scriptsystem_api_t;

View File

@ -24,7 +24,7 @@ if errorlevel 1 set BUILD_ERROR=1
%MSDEV% render/render.dsp %CONFIG%"render - Win32 Release" %build_target% %MSDEV% render/render.dsp %CONFIG%"render - Win32 Release" %build_target%
if errorlevel 1 set BUILD_ERROR=1 if errorlevel 1 set BUILD_ERROR=1
vprogs\qcclib.exe qcclib.exe -src vprogs -O3
if errorlevel 1 set BUILD_ERROR=1 if errorlevel 1 set BUILD_ERROR=1
if "%BUILD_ERROR%"=="" goto build_ok if "%BUILD_ERROR%"=="" goto build_ok
@ -51,7 +51,7 @@ if exist engine\engine.plg del /f /q engine\engine.plg
if exist launch\launch.plg del /f /q launch\launch.plg if exist launch\launch.plg del /f /q launch\launch.plg
if exist common\common.plg del /f /q common\common.plg if exist common\common.plg del /f /q common\common.plg
if exist render\render.plg del /f /q render\render.plg if exist render\render.plg del /f /q render\render.plg
if exist vprogs\server.dat move vprogs\server.dat D:\Xash3D\xash\server.dat if exist server.dat move server.dat D:\Xash3D\xash\server.dat
echo Build succeeded! echo Build succeeded!
echo Please wait. Xash is now loading echo Please wait. Xash is now loading

View File

@ -1115,7 +1115,7 @@ void R_DrawWorld (void)
// auto cycle the world frame for texture animation // auto cycle the world frame for texture animation
memset (&ent, 0, sizeof(ent)); memset (&ent, 0, sizeof(ent));
ent.frame = (int)(r_newrefdef.time * 0.01); ent.frame = (int)(r_newrefdef.time * 0.1);
currententity = &ent; currententity = &ent;
gl_state.currenttextures[0] = gl_state.currenttextures[1] = -1; gl_state.currenttextures[0] = gl_state.currenttextures[1] = -1;

View File

@ -208,11 +208,11 @@ Does a water warp on the pre-fragmented glpoly_t chain
*/ */
void EmitWaterPolys (msurface_t *fa) void EmitWaterPolys (msurface_t *fa)
{ {
glpoly_t *p, *bp; glpoly_t *p, *bp;
float *v; float *v;
int i; int i;
float s, t, os, ot; float scroll, s, t, os, ot;
float scroll; float rdt = r_newrefdef.time * 1.4f;
if (fa->texinfo->flags & SURF_FLOWING) if (fa->texinfo->flags & SURF_FLOWING)
scroll = -64 * ( (r_newrefdef.time * 0.5) - (int)(r_newrefdef.time * 0.5)); scroll = -64 * ( (r_newrefdef.time * 0.5) - (int)(r_newrefdef.time * 0.5));
@ -228,11 +228,11 @@ void EmitWaterPolys (msurface_t *fa)
os = v[3]; os = v[3];
ot = v[4]; ot = v[4];
s = os + r_turbsin[(int)((ot * 0.125 + r_newrefdef.time) * TURBSCALE) & 255]; s = os + r_turbsin[(int)((ot * 0.125 + rdt) * TURBSCALE) & 255];
s += scroll; s += scroll;
s *= (1.0/64); s *= (1.0/64);
t = ot + r_turbsin[(int)((os * 0.125 + r_newrefdef.time) * TURBSCALE) & 255]; t = ot + r_turbsin[(int)((os * 0.125 + rdt) * TURBSCALE) & 255];
t *= (1.0/64); t *= (1.0/64);
qglTexCoord2f (s, t); qglTexCoord2f (s, t);

View File

@ -1,76 +0,0 @@
=======================================================================
Xash3D QuakeC Compiler started at Sep18 2007 [11:53:52]
=======================================================================
Sys_LoadLibrary: Loading launch.dll [5] - ok
Sys_LoadLibrary: Loading common.dll [2] - ok
CPU: AuthenticAMD [1 core]. Frequency: 1.8 Ghz
CPU Features: MMX 3DNow SSE SSE2 RDTSC CMOV FCMOV
Current search path:
./
--------------------Configuration: server - Vm16 Debug--------------------
Compiling...
defs.c
main.c
damage.c
player.c
client.c
dummys.c
ents/internal.c
ents/lights.c
ents/ambient.c
ents/ccam.c
ents/triggers/triggers.c
ents/triggers/trigger_generic.c
ents/triggers/trigger_once.c
ents/triggers/trigger_sequence.c
ents/triggers/trigger_message.c
ents/triggers/trigger_counter.c
ents/triggers/trigger_setviewpoint.c
ents/triggers/trigger_teleport.c
ents/triggers/trigger_hurt.c
ents/triggers/trigger_push.c
ents/triggers/trigger_changelevel.c
ents/triggers/trigger_setskill.c
ents/triggers/trigger_secret.c
ents/funcs/funcs.c
ents/funcs/func_mover.c
ents/funcs/func_door.c
ents/funcs/func_button.c
ents/funcs/func_path_corner.c
ents/funcs/func_train.c
ents/items/items.c
impulses.c
writing progdefs.h
Progs should run on any Quake executor
main.c(103) : warning C2: 'skyaxis' : unreferenced local variable
client.c(75) : warning C2: 'who' : unreferenced local variable
client.c(76) : warning C2: 'fragnum' : unreferenced local variable
dummys.c(130) : warning C2: 'f' : unreferenced local variable
dummys.c(130) : warning C2: 'g' : unreferenced local variable
ents/triggers/trigger_setviewpoint.c(26) : warning C2: 'oldpev' : unreferenced local variable
ents/triggers/trigger_setviewpoint.c(26) : warning C2: 'oldtrig' : unreferenced local variable
18820 strofs (of 1000000)
2849 numstatements (of 524288)
266 numfunctions (of 16384)
898 numglobaldefs (of 32768)
235 numfielddefs (210 unique) (of 2048)
909 numpr_globals (of 65536)
Writing server.dat
64076 TOTAL SIZE
17 unique precache_sounds
5 unique precache_models
optres_shortenifnots 30
optres_overlaptemps 1308
optres_nonvec_parms 462
optres_assignments 59
optres_unreferenced 94
optres_dupconstdefs 84
‘ª®¯¨à®¢ ­® ä ©«®¢: 1.
server.dat - 0 error(s), 7 warning(s)
Sys_FreeLibrary: Unloading common.dll
Sys_FreeLibrary: Unloading launch.dll
=======================================================================
Xash3D QuakeC Compiler stopped at Sep18 2007 [11:53:52]
=======================================================================

View File

@ -80,6 +80,8 @@ void end_sys_globals; // flag for structure dumping
// physics description // physics description
.vector origin; .vector origin;
.vector angles; .vector angles;
.vector old_origin;
.vector old_angles;
.vector velocity; .vector velocity;
.vector avelocity; .vector avelocity;
.vector post_origin; .vector post_origin;
@ -152,7 +154,7 @@ void end_sys_globals; // flag for structure dumping
.float idealpitch; .float idealpitch;
.string netname; .string netname;
.entity enemy; .entity enemy;
.float colormap; .float alpha;
.float team; .float team;
.float max_health; .float max_health;
.float teleport_time; .float teleport_time;
@ -172,7 +174,7 @@ void end_sys_globals; // flag for structure dumping
.string noise; .string noise;
.string noise1; .string noise1;
.string noise2; .string noise2;
.string noise3; .string noise3; //a looped sound case
.float jumpup; .float jumpup;
.float jumpdn; .float jumpdn;
.entity movetarget; .entity movetarget;

View File

@ -90,6 +90,20 @@ void() item_artifact_envirosuit = {remove(pev);};
void() item_artifact_invisibility = {remove(pev);}; void() item_artifact_invisibility = {remove(pev);};
void() item_artifact_super_damage = {remove(pev);}; void() item_artifact_super_damage = {remove(pev);};
void barrel_touch( void )
{
float ratio;
vector v;
// only players can move barrel
if (!(other->flags & FL_CLIENT))
return;
ratio = (float)other->mass / (float)pev->mass;
v = pev->origin - other->origin;
walkmove(vectoyaw(v), 20 * ratio * frametime);
}
void barrel_spawn(string netname1, string model1, string deathmessage, float damage) void barrel_spawn(string netname1, string model1, string deathmessage, float damage)
{ {
local float oldz; local float oldz;
@ -102,13 +116,14 @@ void barrel_spawn(string netname1, string model1, string deathmessage, float dam
pev->owner = pev; pev->owner = pev;
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_STEP;
setmodel (pev, model1); setmodel (pev, model1);
pev->health = 20; pev->health = 20;
pev->th_die = SUB_Null; pev->th_die = SUB_Null;
pev->takedamage = DAMAGE_AIM; pev->takedamage = DAMAGE_AIM;
pev->think = SUB_Null; pev->think = SUB_Null;
pev->nextthink = -1; pev->nextthink = -1;
pev->touch = barrel_touch;
pev->flags = 0; pev->flags = 0;
pev->origin_z = pev->origin_z + 2; pev->origin_z = pev->origin_z + 2;

View File

@ -170,7 +170,7 @@ void() func_mover_touch =
{ {
pev->triggerer = other; pev->triggerer = other;
pev->touched = TRUE; //stop touching me! pev->touched = TRUE; //stop touching me!
pev->think = func_mover_fire; //set me next think pev->think = func_mover_fire; //set me next think
pev->nextthink = pev->ltime + pev->delay; //set it so it happens in 0.1 secs from now. pev->nextthink = pev->ltime + pev->delay; //set it so it happens in 0.1 secs from now.
} }
@ -208,9 +208,10 @@ void() func_mover =
pev->blocked = func_mover_blocked; pev->blocked = func_mover_blocked;
pev->use = func_mover_use; pev->use = func_mover_use;
pev->touch = func_mover_touch;
pev->th_die = func_mover_die; pev->th_die = func_mover_die;
if(!pev->targetname) pev->touch = func_mover_touch;
//func_mover; DEFAULTS; //func_mover; DEFAULTS;
if (!pev->speed) if (!pev->speed)
pev->speed = 100; pev->speed = 100;
@ -237,8 +238,5 @@ void() func_mover =
} }
else else
pev->state = STATE_CLOSED; pev->state = STATE_CLOSED;
pev->think = func_mover_use;
pev->nextthink = pev->ltime + 1.0;
}; };

View File

@ -88,3 +88,6 @@ void() func_place_model =
pev->movetype = MOVETYPE_NONE; pev->movetype = MOVETYPE_NONE;
}; };
void func_areaportal( void )
{
}

View File

@ -1,321 +0,0 @@
/* File generated by FTEQCC, relevent for engine modding only, the generated crc must be the same as your engine expects. */
typedef struct globalvars_s
{ int pad;
int ofs_return[3];
int ofs_parm0[3];
int ofs_parm1[3];
int ofs_parm2[3];
int ofs_parm3[3];
int ofs_parm4[3];
int ofs_parm5[3];
int ofs_parm6[3];
int ofs_parm7[3];
int pev;
int other;
int world;
float time;
float frametime;
string_t mapname;
string_t startspot;
vec3_t spotoffset;
float deathmatch;
float coop;
float teamplay;
float serverflags;
float total_secrets;
float total_monsters;
float found_secrets;
float killed_monsters;
vec3_t v_forward;
vec3_t v_right;
vec3_t v_up;
float trace_allsolid;
float trace_startsolid;
float trace_fraction;
vec3_t trace_endpos;
vec3_t trace_plane_normal;
float trace_plane_dist;
float trace_hitgroup;
float trace_contents;
int trace_ent;
float trace_flags;
func_t main;
func_t StartFrame;
func_t EndFrame;
func_t PlayerPreThink;
func_t PlayerPostThink;
func_t ClientKill;
func_t ClientConnect;
func_t PutClientInServer;
func_t ClientDisconnect;
func_t SetNewParms;
func_t SetChangeParms;
} globalvars_t;
typedef struct entvars_s
{
string_t classname;
string_t globalname;
float modelindex;
vec3_t origin;
vec3_t angles;
vec3_t velocity;
vec3_t avelocity;
vec3_t post_origin;
vec3_t post_angles;
vec3_t post_velocity;
vec3_t post_avelocity;
vec3_t origin_offset;
vec3_t angles_offset;
float ltime;
float bouncetype;
float movetype;
float solid;
vec3_t absmin;
vec3_t absmax;
vec3_t mins;
vec3_t maxs;
vec3_t size;
int chain;
string_t model;
float frame;
float sequence;
float renderfx;
float effects;
float skin;
float body;
string_t weaponmodel;
float weaponframe;
func_t use;
func_t touch;
func_t think;
func_t blocked;
func_t activate;
func_t walk;
func_t jump;
func_t duck;
float flags;
float aiflags;
float spawnflags;
int groundentity;
float nextthink;
float takedamage;
float health;
float frags;
float weapon;
float items;
string_t target;
string_t parent;
string_t targetname;
int aiment;
int goalentity;
vec3_t punchangle;
float deadflag;
vec3_t view_ofs;
float button0;
float button1;
float button2;
float impulse;
float fixangle;
vec3_t v_angle;
float idealpitch;
string_t netname;
int enemy;
float colormap;
float team;
float max_health;
float teleport_time;
float armortype;
float armorvalue;
float waterlevel;
float watertype;
float ideal_yaw;
float yaw_speed;
float dmg_take;
float dmg_save;
int dmg_inflictor;
int owner;
vec3_t movedir;
string_t message;
float sounds;
string_t noise;
string_t noise1;
string_t noise2;
string_t noise3;
float jumpup;
float jumpdn;
int movetarget;
float mass;
float density;
float gravity;
float dmg;
float dmgtime;
float speed;
} entvars_t;
//with this the crc isn't needed for fields.
struct fieldvars_s
{
int ofs;
int type;
char *name;
} fieldvars[] = {
{0, 1, "classname"},
{1, 1, "globalname"},
{2, 2, "modelindex"},
{3, 3, "origin"},
{3, 2, "origin_x"},
{4, 2, "origin_y"},
{5, 2, "origin_z"},
{6, 3, "angles"},
{6, 2, "angles_x"},
{7, 2, "angles_y"},
{8, 2, "angles_z"},
{9, 3, "velocity"},
{9, 2, "velocity_x"},
{10, 2, "velocity_y"},
{11, 2, "velocity_z"},
{12, 3, "avelocity"},
{12, 2, "avelocity_x"},
{13, 2, "avelocity_y"},
{14, 2, "avelocity_z"},
{15, 3, "post_origin"},
{15, 2, "post_origin_x"},
{16, 2, "post_origin_y"},
{17, 2, "post_origin_z"},
{18, 3, "post_angles"},
{18, 2, "post_angles_x"},
{19, 2, "post_angles_y"},
{20, 2, "post_angles_z"},
{21, 3, "post_velocity"},
{21, 2, "post_velocity_x"},
{22, 2, "post_velocity_y"},
{23, 2, "post_velocity_z"},
{24, 3, "post_avelocity"},
{24, 2, "post_avelocity_x"},
{25, 2, "post_avelocity_y"},
{26, 2, "post_avelocity_z"},
{27, 3, "origin_offset"},
{27, 2, "origin_offset_x"},
{28, 2, "origin_offset_y"},
{29, 2, "origin_offset_z"},
{30, 3, "angles_offset"},
{30, 2, "angles_offset_x"},
{31, 2, "angles_offset_y"},
{32, 2, "angles_offset_z"},
{33, 2, "ltime"},
{34, 2, "bouncetype"},
{35, 2, "movetype"},
{36, 2, "solid"},
{37, 3, "absmin"},
{37, 2, "absmin_x"},
{38, 2, "absmin_y"},
{39, 2, "absmin_z"},
{40, 3, "absmax"},
{40, 2, "absmax_x"},
{41, 2, "absmax_y"},
{42, 2, "absmax_z"},
{43, 3, "mins"},
{43, 2, "mins_x"},
{44, 2, "mins_y"},
{45, 2, "mins_z"},
{46, 3, "maxs"},
{46, 2, "maxs_x"},
{47, 2, "maxs_y"},
{48, 2, "maxs_z"},
{49, 3, "size"},
{49, 2, "size_x"},
{50, 2, "size_y"},
{51, 2, "size_z"},
{52, 4, "chain"},
{53, 1, "model"},
{54, 2, "frame"},
{55, 2, "sequence"},
{56, 2, "renderfx"},
{57, 2, "effects"},
{58, 2, "skin"},
{59, 2, "body"},
{60, 1, "weaponmodel"},
{61, 2, "weaponframe"},
{62, 6, "use"},
{63, 6, "touch"},
{64, 6, "think"},
{65, 6, "blocked"},
{66, 6, "activate"},
{67, 6, "walk"},
{68, 6, "jump"},
{69, 6, "duck"},
{70, 2, "flags"},
{71, 2, "aiflags"},
{72, 2, "spawnflags"},
{73, 4, "groundentity"},
{74, 2, "nextthink"},
{75, 2, "takedamage"},
{76, 2, "health"},
{77, 2, "frags"},
{78, 2, "weapon"},
{79, 2, "items"},
{80, 1, "target"},
{81, 1, "parent"},
{82, 1, "targetname"},
{83, 4, "aiment"},
{84, 4, "goalentity"},
{85, 3, "punchangle"},
{85, 2, "punchangle_x"},
{86, 2, "punchangle_y"},
{87, 2, "punchangle_z"},
{88, 2, "deadflag"},
{89, 3, "view_ofs"},
{89, 2, "view_ofs_x"},
{90, 2, "view_ofs_y"},
{91, 2, "view_ofs_z"},
{92, 2, "button0"},
{93, 2, "button1"},
{94, 2, "button2"},
{95, 2, "impulse"},
{96, 2, "fixangle"},
{97, 3, "v_angle"},
{97, 2, "v_angle_x"},
{98, 2, "v_angle_y"},
{99, 2, "v_angle_z"},
{100, 2, "idealpitch"},
{101, 1, "netname"},
{102, 4, "enemy"},
{103, 2, "colormap"},
{104, 2, "team"},
{105, 2, "max_health"},
{106, 2, "teleport_time"},
{107, 2, "armortype"},
{108, 2, "armorvalue"},
{109, 2, "waterlevel"},
{110, 2, "watertype"},
{111, 2, "ideal_yaw"},
{112, 2, "yaw_speed"},
{113, 2, "dmg_take"},
{114, 2, "dmg_save"},
{115, 4, "dmg_inflictor"},
{116, 4, "owner"},
{117, 3, "movedir"},
{117, 2, "movedir_x"},
{118, 2, "movedir_y"},
{119, 2, "movedir_z"},
{120, 1, "message"},
{121, 2, "sounds"},
{122, 1, "noise"},
{123, 1, "noise1"},
{124, 1, "noise2"},
{125, 1, "noise3"},
{126, 2, "jumpup"},
{127, 2, "jumpdn"},
{128, 4, "movetarget"},
{129, 2, "mass"},
{130, 2, "density"},
{131, 2, "gravity"},
{132, 2, "dmg"},
{133, 2, "dmgtime"},
{134, 2, "speed"}
};
#define PROGHEADER_CRC 42175

Binary file not shown.

View File

@ -1 +0,0 @@
qcclib -log -dev 4 -progdefs -debug