mirror of
https://git.code.sf.net/p/quake/newtree
synced 2024-11-24 13:01:58 +00:00
Patched for QSG Standard 2 (Extend Protocol).
Unfinished, renderer effects are only half implimented at this point.
This commit is contained in:
parent
f6ec000127
commit
089a0a35d0
16 changed files with 273 additions and 64 deletions
|
@ -11,7 +11,7 @@ AM_INIT_AUTOMAKE(quakeforge, 0.1.99pre2)
|
||||||
dnl Define the proper name and extra version numbers for package
|
dnl Define the proper name and extra version numbers for package
|
||||||
PROGRAM=QuakeForge
|
PROGRAM=QuakeForge
|
||||||
QW_VERSION=2.40
|
QW_VERSION=2.40
|
||||||
QSG_VERSION=1.0
|
QSG_VERSION=2.0
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(PROGRAM, "$PROGRAM")
|
AC_DEFINE_UNQUOTED(PROGRAM, "$PROGRAM")
|
||||||
AC_DEFINE_UNQUOTED(QW_VERSION, "$QW_VERSION")
|
AC_DEFINE_UNQUOTED(QW_VERSION, "$QW_VERSION")
|
||||||
|
|
|
@ -75,59 +75,37 @@
|
||||||
#define svc_nop 1
|
#define svc_nop 1
|
||||||
#define svc_disconnect 2
|
#define svc_disconnect 2
|
||||||
#define svc_updatestat 3 // [byte] [byte]
|
#define svc_updatestat 3 // [byte] [byte]
|
||||||
//define svc_version 4 // [long] server version
|
|
||||||
#define svc_setview 5 // [short] entity number
|
#define svc_setview 5 // [short] entity number
|
||||||
#define svc_sound 6 // <see code>
|
#define svc_sound 6 // <see code>
|
||||||
//define svc_time 7 // [float] server time
|
|
||||||
#define svc_print 8 // [byte] id [string] null terminated string
|
#define svc_print 8 // [byte] id [string] null terminated string
|
||||||
#define svc_stufftext 9 // [string] stuffed into client's console buffer
|
#define svc_stufftext 9 // [string] stuffed into client's console buffer
|
||||||
// the string should be \n terminated
|
// the string should be \n terminated
|
||||||
#define svc_setangle 10 // [angle3] set the view angle to this absolute value
|
#define svc_setangle 10 // [angle3] set the view angle to this absolute value
|
||||||
|
#define svc_serverdata 11 // [long] protocol ...
|
||||||
#define svc_serverdata 11 // [long] protocol ...
|
|
||||||
#define svc_lightstyle 12 // [byte] [string]
|
#define svc_lightstyle 12 // [byte] [string]
|
||||||
//define svc_updatename 13 // [byte] [string]
|
|
||||||
#define svc_updatefrags 14 // [byte] [short]
|
#define svc_updatefrags 14 // [byte] [short]
|
||||||
//define svc_clientdata 15 // <shortbits + data>
|
|
||||||
#define svc_stopsound 16 // <see code>
|
#define svc_stopsound 16 // <see code>
|
||||||
//define svc_updatecolors 17 // [byte] [byte] [byte]
|
#define svc_damage 19
|
||||||
//define svc_particle 18 // [vec3] <variable>
|
|
||||||
#define svc_damage 19
|
|
||||||
|
|
||||||
#define svc_spawnstatic 20
|
#define svc_spawnstatic 20
|
||||||
// svc_spawnbinary 21
|
|
||||||
#define svc_spawnbaseline 22
|
#define svc_spawnbaseline 22
|
||||||
|
|
||||||
#define svc_temp_entity 23 // variable
|
#define svc_temp_entity 23 // variable
|
||||||
#define svc_setpause 24 // [byte] on / off
|
#define svc_setpause 24 // [byte] on / off
|
||||||
// svc_signonnum 25 // [byte] used for the signon sequence
|
|
||||||
|
|
||||||
#define svc_centerprint 26 // [string] to put in center of the screen
|
#define svc_centerprint 26 // [string] to put in center of the screen
|
||||||
|
|
||||||
#define svc_killedmonster 27
|
#define svc_killedmonster 27
|
||||||
#define svc_foundsecret 28
|
#define svc_foundsecret 28
|
||||||
|
|
||||||
#define svc_spawnstaticsound 29 // [coord3] [byte] samp [byte] vol [byte] aten
|
#define svc_spawnstaticsound 29 // [coord3] [byte] samp [byte] vol [byte] aten
|
||||||
|
|
||||||
#define svc_intermission 30 // [vec3_t] origin [vec3_t] angle
|
#define svc_intermission 30 // [vec3_t] origin [vec3_t] angle
|
||||||
#define svc_finale 31 // [string] text
|
#define svc_finale 31 // [string] text
|
||||||
|
#define svc_cdtrack 32 // [byte] track
|
||||||
#define svc_cdtrack 32 // [byte] track
|
|
||||||
#define svc_sellscreen 33
|
#define svc_sellscreen 33
|
||||||
|
|
||||||
#define svc_smallkick 34 // set client punchangle to 2
|
#define svc_smallkick 34 // set client punchangle to 2
|
||||||
#define svc_bigkick 35 // set client punchangle to 4
|
#define svc_bigkick 35 // set client punchangle to 4
|
||||||
|
|
||||||
#define svc_updateping 36 // [byte] [short]
|
#define svc_updateping 36 // [byte] [short]
|
||||||
#define svc_updateentertime 37 // [byte] [float]
|
#define svc_updateentertime 37 // [byte] [float]
|
||||||
|
|
||||||
#define svc_updatestatlong 38 // [byte] [long]
|
#define svc_updatestatlong 38 // [byte] [long]
|
||||||
|
|
||||||
#define svc_muzzleflash 39 // [short] entity
|
#define svc_muzzleflash 39 // [short] entity
|
||||||
|
|
||||||
#define svc_updateuserinfo 40 // [byte] slot [long] uid
|
#define svc_updateuserinfo 40 // [byte] slot [long] uid
|
||||||
// [string] userinfo
|
// [string] userinfo
|
||||||
|
|
||||||
#define svc_download 41 // [short] size [size bytes]
|
#define svc_download 41 // [short] size [size bytes]
|
||||||
#define svc_playerinfo 42 // variable
|
#define svc_playerinfo 42 // variable
|
||||||
#define svc_nails 43 // [byte] num [48 bits] xyzpy 12 12 12 4 8
|
#define svc_nails 43 // [byte] num [48 bits] xyzpy 12 12 12 4 8
|
||||||
|
@ -211,6 +189,30 @@
|
||||||
#define U_EFFECTS (1<<5)
|
#define U_EFFECTS (1<<5)
|
||||||
#define U_SOLID (1<<6) // the entity should be solid for prediction
|
#define U_SOLID (1<<6) // the entity should be solid for prediction
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// QSG Protocol Extensions (Version 2)
|
||||||
|
// Network definitions for the engine, as defined in protocol.h
|
||||||
|
|
||||||
|
#define U_EXTEND1 (1<<7)
|
||||||
|
|
||||||
|
#define U_ALPHA (1<<17) // 1 byte, 0.0-1.0 = 0-255 (Unsent if 1)
|
||||||
|
#define U_SCALE (1<<18) // 1 byte, scale / 16 positive, (Unsent if 1)
|
||||||
|
#define U_EFFECTS2 (1<<19) // 1 byte, .effects & 0xFF00
|
||||||
|
#define U_GLOWSIZE (1<<20) // 1 byte, float/8.0, signed. Unsent if 1
|
||||||
|
#define U_GLOWCOLOR (1<<21) // 1 byte, palette index, default, 254.
|
||||||
|
#define U_COLORMOD (1<<22) // 1 byte, rrrgggbb. Model tinting
|
||||||
|
#define U_EXTEND2 (1<<23) // Another byte to follow
|
||||||
|
|
||||||
|
#define U_GLOWTRAIL (1<<24) // Leave U_GLOW* trail
|
||||||
|
#define U_VIEWMODEL (1<<25) // Attach model to view (relative). Owner only
|
||||||
|
#define U_FRAME2 (1<<26) // 1 byte .frame & 0xFF00 (second byte)
|
||||||
|
#define U_UNUSED27 (1<<27) // future expansion
|
||||||
|
#define U_UNUSED28 (1<<28) // future expansion
|
||||||
|
#define U_UNUSED29 (1<<29) // future expansion
|
||||||
|
#define U_UNUSED30 (1<<30) // future expansion
|
||||||
|
#define U_EXTEND3 (1<<31) // another byte to follow, future expansion
|
||||||
|
|
||||||
|
|
||||||
//==============================================
|
//==============================================
|
||||||
|
|
||||||
// a sound with no channel is a local only sound
|
// a sound with no channel is a local only sound
|
||||||
|
@ -274,6 +276,10 @@ typedef struct
|
||||||
int colormap;
|
int colormap;
|
||||||
int skinnum;
|
int skinnum;
|
||||||
int effects;
|
int effects;
|
||||||
|
|
||||||
|
byte glowsize;
|
||||||
|
byte glowcolor;
|
||||||
|
byte colormod;
|
||||||
} entity_state_t;
|
} entity_state_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -51,31 +51,37 @@ typedef struct efrag_s
|
||||||
|
|
||||||
typedef struct entity_s
|
typedef struct entity_s
|
||||||
{
|
{
|
||||||
int keynum; // for matching entities in different frames
|
int keynum; // for matching entities in different frames
|
||||||
vec3_t origin;
|
vec3_t origin;
|
||||||
vec3_t angles;
|
vec3_t angles;
|
||||||
struct model_s *model; // NULL = no model
|
struct model_s *model; // NULL = no model
|
||||||
int frame;
|
int frame;
|
||||||
byte *colormap;
|
byte *colormap;
|
||||||
int skinnum; // for Alias models
|
int skinnum; // for Alias models
|
||||||
|
|
||||||
struct player_info_s *scoreboard; // identify player
|
struct player_info_s *scoreboard; // identify player
|
||||||
|
|
||||||
float syncbase;
|
float syncbase;
|
||||||
|
|
||||||
struct efrag_s *efrag; // linked list of efrags (FIXME)
|
struct efrag_s *efrag; // linked list of efrags (FIXME)
|
||||||
int visframe; // last frame this entity was
|
int visframe; // last frame this entity was
|
||||||
// found in an active leaf
|
// found in an active leaf
|
||||||
// only used for static objects
|
// only used for static objects
|
||||||
|
|
||||||
int dlightframe; // dynamic lighting
|
int dlightframe; // dynamic lighting
|
||||||
int dlightbits;
|
int dlightbits;
|
||||||
|
|
||||||
|
float colormod[3]; // color tint for model
|
||||||
|
float alpha; // opacity (alpha) of the model
|
||||||
|
float glowsize; // how big the glow is
|
||||||
|
byte glowcolor; // color of glow and particle trail (paletted)
|
||||||
|
byte glowtrail; // leaves a trail of particles
|
||||||
|
|
||||||
// FIXME: could turn these into a union
|
// FIXME: could turn these into a union
|
||||||
int trivial_accept;
|
int trivial_accept;
|
||||||
struct mnode_s *topnode; // for bmodels, first world node
|
struct mnode_s *topnode; // for bmodels, first world node
|
||||||
// that splits bmodel, or NULL if
|
// that splits bmodel, or NULL if
|
||||||
// not split
|
// not split
|
||||||
} entity_t;
|
} entity_t;
|
||||||
|
|
||||||
// !!! if this is changed, it must be changed in asm_draw.h too !!!
|
// !!! if this is changed, it must be changed in asm_draw.h too !!!
|
||||||
|
|
|
@ -214,6 +214,7 @@ typedef struct client_s
|
||||||
netchan_t netchan;
|
netchan_t netchan;
|
||||||
int msecs, msec_cheating;
|
int msecs, msec_cheating;
|
||||||
double last_check;
|
double last_check;
|
||||||
|
int stdver;
|
||||||
} client_t;
|
} client_t;
|
||||||
|
|
||||||
// a client can leave the server in one of four ways:
|
// a client can leave the server in one of four ways:
|
||||||
|
|
|
@ -243,9 +243,6 @@
|
||||||
/* Define if you have the m library (-lm). */
|
/* Define if you have the m library (-lm). */
|
||||||
#undef HAVE_LIBM
|
#undef HAVE_LIBM
|
||||||
|
|
||||||
/* Define if you want the QSG standards */
|
|
||||||
#define QSG_VERSION "1.0"
|
|
||||||
|
|
||||||
/* Posix, needed for limits.h and Unix stuffs to work right */
|
/* Posix, needed for limits.h and Unix stuffs to work right */
|
||||||
#define _POSIX_
|
#define _POSIX_
|
||||||
|
|
||||||
|
|
|
@ -243,10 +243,6 @@
|
||||||
/* Define if you have the m library (-lm). */
|
/* Define if you have the m library (-lm). */
|
||||||
#undef HAVE_LIBM
|
#undef HAVE_LIBM
|
||||||
|
|
||||||
|
|
||||||
/* Define if you want the QSG standards */
|
|
||||||
#define QSG_VERSION "1.0"
|
|
||||||
|
|
||||||
/* Posix, needed for limits.h and Unix stuffs to work right */
|
/* Posix, needed for limits.h and Unix stuffs to work right */
|
||||||
#define _POSIX_
|
#define _POSIX_
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,6 @@
|
||||||
#define PROGRAM "QuakeForge"
|
#define PROGRAM "QuakeForge"
|
||||||
#define VERSION "0.1.99pre2"
|
#define VERSION "0.1.99pre2"
|
||||||
#define QW_VERSION "2.40"
|
#define QW_VERSION "2.40"
|
||||||
#define QSG_VERSION "1.0"
|
#define QSG_VERSION "2.0"
|
||||||
|
|
||||||
#endif // _VERSION_H
|
#endif // _VERSION_H
|
||||||
|
|
|
@ -209,6 +209,14 @@ void CL_ParseDelta (entity_state_t *from, entity_state_t *to, int bits)
|
||||||
if (bits&(1<<i))
|
if (bits&(1<<i))
|
||||||
bitcounts[i]++;
|
bitcounts[i]++;
|
||||||
|
|
||||||
|
if (bits & U_EXTEND1)
|
||||||
|
{
|
||||||
|
bits |= MSG_ReadByte() << 16;
|
||||||
|
if (bits & U_EXTEND2)
|
||||||
|
bits |= MSG_ReadByte() << 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
to->flags = bits;
|
to->flags = bits;
|
||||||
|
|
||||||
if (bits & U_MODEL)
|
if (bits & U_MODEL)
|
||||||
|
@ -244,6 +252,15 @@ void CL_ParseDelta (entity_state_t *from, entity_state_t *to, int bits)
|
||||||
if (bits & U_ANGLE3)
|
if (bits & U_ANGLE3)
|
||||||
to->angles[2] = MSG_ReadAngle();
|
to->angles[2] = MSG_ReadAngle();
|
||||||
|
|
||||||
|
if (bits & U_GLOWSIZE)
|
||||||
|
to->glowsize = MSG_ReadByte();
|
||||||
|
|
||||||
|
if (bits & U_GLOWCOLOR)
|
||||||
|
to->glowcolor = MSG_ReadByte();
|
||||||
|
|
||||||
|
if (bits & U_GLOWCOLOR)
|
||||||
|
to->colormod = MSG_ReadByte();
|
||||||
|
|
||||||
if (bits & U_SOLID)
|
if (bits & U_SOLID)
|
||||||
{
|
{
|
||||||
// FIXME
|
// FIXME
|
||||||
|
@ -499,7 +516,19 @@ void CL_LinkPacketEntities (void)
|
||||||
ent->scoreboard = NULL;
|
ent->scoreboard = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set skin
|
// Ender: Extend (Colormod) [QSG - Begin]
|
||||||
|
// N.B: All messy code below is the sole fault of LordHavoc and
|
||||||
|
// his futile attempts to save bandwidth. :)
|
||||||
|
//
|
||||||
|
ent->glowsize = s1->glowsize < 128 ? s1->glowsize * 8.0 : (s1->glowsize - 256) * 8.0;
|
||||||
|
ent->glowcolor = s1->glowcolor;
|
||||||
|
ent->colormod[0] = (float) ((s1->colormod >> 5) & 7) * (1.0 / 7.0);
|
||||||
|
ent->colormod[1] = (float) ((s1->colormod >> 2) & 7) * (1.0 / 7.0);
|
||||||
|
ent->colormod[2] = (float) (s1->colormod & 3) * (1.0 / 3.0);
|
||||||
|
//
|
||||||
|
// Ender: Extend (Colormod) [QSG - End]
|
||||||
|
|
||||||
|
// set skin
|
||||||
ent->skinnum = s1->skinnum;
|
ent->skinnum = s1->skinnum;
|
||||||
|
|
||||||
// set frame
|
// set frame
|
||||||
|
|
|
@ -1143,6 +1143,7 @@ void CL_Init (void)
|
||||||
// sprintf (st, "%s-%04d", QW_VERSION, build_number());
|
// sprintf (st, "%s-%04d", QW_VERSION, build_number());
|
||||||
sprintf (st, "%s", QW_VERSION);
|
sprintf (st, "%s", QW_VERSION);
|
||||||
Info_SetValueForStarKey (cls.userinfo, "*ver", st, MAX_INFO_STRING);
|
Info_SetValueForStarKey (cls.userinfo, "*ver", st, MAX_INFO_STRING);
|
||||||
|
Info_SetValueForStarKey (cls.userinfo, "stdver", QSG_VERSION, MAX_INFO_STRING);
|
||||||
|
|
||||||
CL_InitInput ();
|
CL_InitInput ();
|
||||||
CL_InitTEnts ();
|
CL_InitTEnts ();
|
||||||
|
|
|
@ -89,6 +89,8 @@ mleaf_t *r_viewleaf, *r_oldviewleaf;
|
||||||
int d_lightstylevalue[256]; // 8.8 fraction of base light value
|
int d_lightstylevalue[256]; // 8.8 fraction of base light value
|
||||||
|
|
||||||
|
|
||||||
|
vec3_t shadecolor; // Ender (Extend) Colormod
|
||||||
|
|
||||||
void R_MarkLeaves (void);
|
void R_MarkLeaves (void);
|
||||||
|
|
||||||
cvar_t *r_norefresh;
|
cvar_t *r_norefresh;
|
||||||
|
@ -390,7 +392,12 @@ void GL_DrawAliasFrame (aliashdr_t *paliashdr, int posenum)
|
||||||
|
|
||||||
// normals and vertexes come from the frame list
|
// normals and vertexes come from the frame list
|
||||||
l = shadedots[verts->lightnormalindex] * shadelight;
|
l = shadedots[verts->lightnormalindex] * shadelight;
|
||||||
glColor3f (l, l, l);
|
// Ender: Test (Colormod)
|
||||||
|
// if (shadecolor[0] || shadecolor[1] || shadecolor[2]) {
|
||||||
|
// glColor3f(shadecolor[0] * l, shadecolor[1] * l, shadecolor[2] * l);
|
||||||
|
// } else {
|
||||||
|
glColor3f (l, l, l);
|
||||||
|
// }
|
||||||
glVertex3f (verts->v[0], verts->v[1], verts->v[2]);
|
glVertex3f (verts->v[0], verts->v[1], verts->v[2]);
|
||||||
verts++;
|
verts++;
|
||||||
} while (--count);
|
} while (--count);
|
||||||
|
@ -494,7 +501,6 @@ void R_SetupAliasFrame (int frame, aliashdr_t *paliashdr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
R_DrawAliasModel
|
R_DrawAliasModel
|
||||||
|
@ -531,6 +537,11 @@ void R_DrawAliasModel (entity_t *e)
|
||||||
|
|
||||||
ambientlight = shadelight = R_LightPoint (currententity->origin);
|
ambientlight = shadelight = R_LightPoint (currententity->origin);
|
||||||
|
|
||||||
|
// Ender (Extend)
|
||||||
|
shadecolor[0] = currententity->colormod[0];
|
||||||
|
shadecolor[1] = currententity->colormod[1];
|
||||||
|
shadecolor[2] = currententity->colormod[2];
|
||||||
|
|
||||||
// allways give the gun some light
|
// allways give the gun some light
|
||||||
if (e == &cl.viewent && ambientlight < 24)
|
if (e == &cl.viewent && ambientlight < 24)
|
||||||
ambientlight = shadelight = 24;
|
ambientlight = shadelight = 24;
|
||||||
|
|
|
@ -63,7 +63,7 @@ int skytexturenum;
|
||||||
#define GL_RGBA4 0
|
#define GL_RGBA4 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern vec3_t shadecolor; // Ender (Extend) Colormod
|
||||||
int lightmap_bytes; // 1 or 4
|
int lightmap_bytes; // 1 or 4
|
||||||
|
|
||||||
int lightmap_textures;
|
int lightmap_textures;
|
||||||
|
@ -707,7 +707,7 @@ void R_DrawWaterSurfaces (void)
|
||||||
glColor4f (0.5, 0.5, 0.5, r_wateralpha->value);
|
glColor4f (0.5, 0.5, 0.5, r_wateralpha->value);
|
||||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
} else
|
} else
|
||||||
glColor3f (0.5, 0.5, 0.5);
|
glColor3f (0.5, 0.5, 0.5);
|
||||||
|
|
||||||
if (!gl_texsort->value) {
|
if (!gl_texsort->value) {
|
||||||
if (!waterchain)
|
if (!waterchain)
|
||||||
|
@ -837,7 +837,14 @@ void R_DrawBrushModel (entity_t *e)
|
||||||
if (R_CullBox (mins, maxs))
|
if (R_CullBox (mins, maxs))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glColor3f (1.0, 1.0, 1.0);
|
// Ender: Extend (Alpha) [QSG - Begin]
|
||||||
|
// glEnable(GL_BLEND);
|
||||||
|
// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
|
||||||
|
// Note: glColor4f and gl_texsort->value = 1 for alpha! :)
|
||||||
|
glColor3f (1, 1, 1);
|
||||||
|
// Ender: Extend (Alpha) [QSG - End]
|
||||||
|
|
||||||
memset (lightmap_polys, 0, sizeof(lightmap_polys));
|
memset (lightmap_polys, 0, sizeof(lightmap_polys));
|
||||||
|
|
||||||
VectorSubtract (r_refdef.vieworg, e->origin, modelorg);
|
VectorSubtract (r_refdef.vieworg, e->origin, modelorg);
|
||||||
|
|
|
@ -24,7 +24,7 @@ COM_sources=\
|
||||||
sys_win.obj
|
sys_win.obj
|
||||||
|
|
||||||
SV_sources=\
|
SV_sources=\
|
||||||
pr_cmds.obj pr_edict.obj pr_exec.obj \
|
pr_cmds.obj pr_edict.obj pr_exec.obj pr_offs.obj\
|
||||||
sv_init.obj sv_main.obj sv_misc.obj sv_model.obj sv_nchan.obj sv_ents.obj \
|
sv_init.obj sv_main.obj sv_misc.obj sv_model.obj sv_nchan.obj sv_ents.obj \
|
||||||
sv_send.obj sv_move.obj sv_phys.obj sv_user.obj sv_ccmds.obj \
|
sv_send.obj sv_move.obj sv_phys.obj sv_user.obj sv_ccmds.obj \
|
||||||
world.obj sv_cvar.obj model.obj \
|
world.obj sv_cvar.obj model.obj \
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void SV_Error (char *error, ...);
|
void SV_Error (char *error, ...);
|
||||||
|
void FindEdictFieldOffsets();
|
||||||
|
|
||||||
dprograms_t *progs;
|
dprograms_t *progs;
|
||||||
dfunction_t *pr_functions;
|
dfunction_t *pr_functions;
|
||||||
|
@ -1087,6 +1088,8 @@ void PR_LoadProgs (void)
|
||||||
SpectatorThink = (func_t)(f - pr_functions);
|
SpectatorThink = (func_t)(f - pr_functions);
|
||||||
if ((f = ED_FindFunction ("SpectatorDisconnect")) != NULL)
|
if ((f = ED_FindFunction ("SpectatorDisconnect")) != NULL)
|
||||||
SpectatorDisconnect = (func_t)(f - pr_functions);
|
SpectatorDisconnect = (func_t)(f - pr_functions);
|
||||||
|
|
||||||
|
FindEdictFieldOffsets();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
73
source/pr_offs.c
Normal file
73
source/pr_offs.c
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
pr_offs.c
|
||||||
|
|
||||||
|
Quick QuakeC offset access
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
#include "pr_comp.h"
|
||||||
|
#include "progs.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "server.h"
|
||||||
|
#include "world.h"
|
||||||
|
#include "msg.h"
|
||||||
|
#include "cmd.h"
|
||||||
|
#include "commdef.h"
|
||||||
|
#include "info.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
int eval_alpha, eval_fullbright, eval_colormod, eval_glowsize, eval_glowcolor;
|
||||||
|
|
||||||
|
int FindFieldOffset(char *field)
|
||||||
|
{
|
||||||
|
ddef_t *d;
|
||||||
|
d = ED_FindField(field);
|
||||||
|
if (!d)
|
||||||
|
return 0;
|
||||||
|
return d->ofs*4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
eval_t *GETEDICTFIELDVALUE(edict_t *ed, int fieldoffset)
|
||||||
|
{
|
||||||
|
if (!fieldoffset)
|
||||||
|
return NULL;
|
||||||
|
return (eval_t*)((char*)&ed->v + fieldoffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FindEdictFieldOffsets()
|
||||||
|
{
|
||||||
|
eval_alpha = FindFieldOffset("alpha");
|
||||||
|
eval_fullbright = FindFieldOffset("fullbright");
|
||||||
|
eval_colormod = FindFieldOffset("colormod");
|
||||||
|
eval_glowsize = FindFieldOffset("glow_size");
|
||||||
|
eval_glowcolor = FindFieldOffset("glow_color");
|
||||||
|
};
|
|
@ -41,6 +41,12 @@
|
||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
#include "pmove.h"
|
#include "pmove.h"
|
||||||
|
|
||||||
|
// Ender Extends (QSG - Begin)
|
||||||
|
// HACK HACK HACK
|
||||||
|
extern int eval_alpha, eval_fullbright, eval_colormod, eval_glowsize, eval_glowcolor;
|
||||||
|
// Ender Extends (QSG - End)
|
||||||
|
eval_t *GETEDICTFIELDVALUE(edict_t *ed, int fieldoffset);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=============================================================================
|
=============================================================================
|
||||||
|
|
||||||
|
@ -173,7 +179,7 @@ Writes part of a packetentities message.
|
||||||
Can delta from either a baseline or a previous packet_entity
|
Can delta from either a baseline or a previous packet_entity
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qboolean force)
|
void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qboolean force, int stdver)
|
||||||
{
|
{
|
||||||
int bits;
|
int bits;
|
||||||
int i;
|
int i;
|
||||||
|
@ -213,6 +219,19 @@ void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qb
|
||||||
if ( to->modelindex != from->modelindex )
|
if ( to->modelindex != from->modelindex )
|
||||||
bits |= U_MODEL;
|
bits |= U_MODEL;
|
||||||
|
|
||||||
|
// Ender (QSG - Begin)
|
||||||
|
if (stdver > 1) {
|
||||||
|
if (to->glowsize != from->glowsize) bits |= U_GLOWSIZE;
|
||||||
|
if (to->glowcolor != from->glowcolor) bits |= U_GLOWCOLOR;
|
||||||
|
if (to->colormod != from->colormod) bits |= U_COLORMOD;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bits >= 16777216)
|
||||||
|
bits |= U_EXTEND2;
|
||||||
|
|
||||||
|
if (bits >= 65536)
|
||||||
|
bits |= U_EXTEND1;
|
||||||
|
// Ender (QSG - End)
|
||||||
if (bits & 511)
|
if (bits & 511)
|
||||||
bits |= U_MOREBITS;
|
bits |= U_MOREBITS;
|
||||||
|
|
||||||
|
@ -236,6 +255,14 @@ void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qb
|
||||||
|
|
||||||
if (bits & U_MOREBITS)
|
if (bits & U_MOREBITS)
|
||||||
MSG_WriteByte (msg, bits&255);
|
MSG_WriteByte (msg, bits&255);
|
||||||
|
|
||||||
|
// Ender (QSG - Begin)
|
||||||
|
if (bits & U_EXTEND1)
|
||||||
|
MSG_WriteByte (msg, bits>>16);
|
||||||
|
if (bits & U_EXTEND2)
|
||||||
|
MSG_WriteByte (msg, bits>>24);
|
||||||
|
// Ender (QSG - End)
|
||||||
|
|
||||||
if (bits & U_MODEL)
|
if (bits & U_MODEL)
|
||||||
MSG_WriteByte (msg, to->modelindex);
|
MSG_WriteByte (msg, to->modelindex);
|
||||||
if (bits & U_FRAME)
|
if (bits & U_FRAME)
|
||||||
|
@ -258,6 +285,15 @@ void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qb
|
||||||
MSG_WriteCoord (msg, to->origin[2]);
|
MSG_WriteCoord (msg, to->origin[2]);
|
||||||
if (bits & U_ANGLE3)
|
if (bits & U_ANGLE3)
|
||||||
MSG_WriteAngle(msg, to->angles[2]);
|
MSG_WriteAngle(msg, to->angles[2]);
|
||||||
|
|
||||||
|
// Ender (QSG - Begin)
|
||||||
|
if (bits & U_GLOWSIZE)
|
||||||
|
MSG_WriteByte(msg, to->glowsize);
|
||||||
|
if (bits & U_GLOWCOLOR)
|
||||||
|
MSG_WriteByte(msg, to->glowcolor);
|
||||||
|
if (bits & U_COLORMOD)
|
||||||
|
MSG_WriteByte(msg, to->colormod);
|
||||||
|
// Ender (QSG - End)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -307,7 +343,7 @@ void SV_EmitPacketEntities (client_t *client, packet_entities_t *to, sizebuf_t *
|
||||||
if (newnum == oldnum)
|
if (newnum == oldnum)
|
||||||
{ // delta update from old position
|
{ // delta update from old position
|
||||||
//Con_Printf ("delta %i\n", newnum);
|
//Con_Printf ("delta %i\n", newnum);
|
||||||
SV_WriteDelta (&from->entities[oldindex], &to->entities[newindex], msg, false);
|
SV_WriteDelta (&from->entities[oldindex], &to->entities[newindex], msg, false, client->stdver);
|
||||||
oldindex++;
|
oldindex++;
|
||||||
newindex++;
|
newindex++;
|
||||||
continue;
|
continue;
|
||||||
|
@ -317,7 +353,7 @@ void SV_EmitPacketEntities (client_t *client, packet_entities_t *to, sizebuf_t *
|
||||||
{ // this is a new entity, send it from the baseline
|
{ // this is a new entity, send it from the baseline
|
||||||
ent = EDICT_NUM(newnum);
|
ent = EDICT_NUM(newnum);
|
||||||
//Con_Printf ("baseline %i\n", newnum);
|
//Con_Printf ("baseline %i\n", newnum);
|
||||||
SV_WriteDelta (&ent->baseline, &to->entities[newindex], msg, true);
|
SV_WriteDelta (&ent->baseline, &to->entities[newindex], msg, true, client->stdver);
|
||||||
newindex++;
|
newindex++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -526,7 +562,49 @@ void SV_WriteEntitiesToClient (client_t *client, sizebuf_t *msg)
|
||||||
state->colormap = ent->v.colormap;
|
state->colormap = ent->v.colormap;
|
||||||
state->skinnum = ent->v.skin;
|
state->skinnum = ent->v.skin;
|
||||||
state->effects = ent->v.effects;
|
state->effects = ent->v.effects;
|
||||||
}
|
|
||||||
|
// Ender: EXTEND (QSG - Begin)
|
||||||
|
{
|
||||||
|
eval_t *val;
|
||||||
|
state->glowsize = 0;
|
||||||
|
state->glowcolor = 254;
|
||||||
|
state->colormod = 255;
|
||||||
|
|
||||||
|
if (val = GETEDICTFIELDVALUE(ent, eval_glowsize)) {
|
||||||
|
state->glowsize = (int) val->_float >> 3;
|
||||||
|
if (state->glowsize > 127)
|
||||||
|
state->glowsize = 127;
|
||||||
|
if (state->glowsize < -128)
|
||||||
|
state->glowsize = -128;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val = GETEDICTFIELDVALUE(ent, eval_glowcolor)) {
|
||||||
|
if (val->_float != 0)
|
||||||
|
state->glowcolor = (int) val->_float;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val = GETEDICTFIELDVALUE(ent, eval_colormod)) {
|
||||||
|
if (val->vector[0] != 0 || val->vector[1] != 0 || val->vector[2] != 0) {
|
||||||
|
int modred, modgreen, modblue;
|
||||||
|
|
||||||
|
modred = val->vector[0] * 8.0;
|
||||||
|
if (modred < 0) modred = 0;
|
||||||
|
if (modred > 7) modred = 7;
|
||||||
|
|
||||||
|
modgreen = val->vector[1] * 8.0;
|
||||||
|
if (modgreen < 0) modgreen = 0;
|
||||||
|
if (modgreen > 7) modgreen = 7;
|
||||||
|
|
||||||
|
modblue = val->vector[2] * 4.0;
|
||||||
|
if (modblue < 0) modblue = 0;
|
||||||
|
if (modblue > 3) modblue = 3;
|
||||||
|
|
||||||
|
state->colormod = (modred << 5) | (modgreen << 2) | modblue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Ender: EXTEND (QSG - End)
|
||||||
|
}
|
||||||
|
|
||||||
// encode the packet entities as a delta from the
|
// encode the packet entities as a delta from the
|
||||||
// last packetentities acknowledged by the client
|
// last packetentities acknowledged by the client
|
||||||
|
|
|
@ -1622,6 +1622,7 @@ void SV_ExtractFromUserinfo (client_t *cl)
|
||||||
cl->messagelevel = atoi(val);
|
cl->messagelevel = atoi(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cl->stdver = atoi(Info_ValueForKey (cl->userinfo, "stdver"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue