q3 fixes and misilaneous minor changes.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1298 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
a6bee2bc12
commit
347311db8c
47 changed files with 2015 additions and 477 deletions
|
@ -336,7 +336,7 @@ qboolean CGQ3_GetUserCmd(int cmdNumber, q3usercmd_t *ucmd)
|
||||||
|
|
||||||
static vm_t *cgvm;
|
static vm_t *cgvm;
|
||||||
|
|
||||||
static int keycatcher;
|
extern int keycatcher;
|
||||||
|
|
||||||
qboolean CG_GetServerCommand(int cmdnum)
|
qboolean CG_GetServerCommand(int cmdnum)
|
||||||
{
|
{
|
||||||
|
@ -344,7 +344,7 @@ qboolean CG_GetServerCommand(int cmdnum)
|
||||||
// get the gamestate from the client system, which will have the
|
// get the gamestate from the client system, which will have the
|
||||||
// new configstring already integrated
|
// new configstring already integrated
|
||||||
|
|
||||||
char *str = ccs.serverCommands[cmdnum % TEXTCMD_MASK];
|
char *str = ccs.serverCommands[cmdnum & TEXTCMD_MASK];
|
||||||
|
|
||||||
Con_DPrintf("Dispaching %s\n", str);
|
Con_DPrintf("Dispaching %s\n", str);
|
||||||
Cmd_TokenizeString(str, false, false);
|
Cmd_TokenizeString(str, false, false);
|
||||||
|
@ -355,6 +355,71 @@ qboolean CG_GetServerCommand(int cmdnum)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int firstPoint;
|
||||||
|
int numPoints;
|
||||||
|
} markFragment_t;
|
||||||
|
int CG_MarkFragments( int numPoints, const vec3_t *points, const vec3_t projection,
|
||||||
|
int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t *fragmentBuffer )
|
||||||
|
{
|
||||||
|
#if 1 //FIXME: make work
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
vec3_t center;
|
||||||
|
vec3_t axis[3];
|
||||||
|
vec3_t p[4];
|
||||||
|
int i;
|
||||||
|
float radius;
|
||||||
|
|
||||||
|
if (numPoints != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
q3 gamecode includes something like this
|
||||||
|
|
||||||
|
originalPoints[0][i] = origin[i] - radius * axis[1][i] - radius * axis[2][i];
|
||||||
|
originalPoints[1][i] = origin[i] + radius * axis[1][i] - radius * axis[2][i];
|
||||||
|
originalPoints[2][i] = origin[i] + radius * axis[1][i] + radius * axis[2][i];
|
||||||
|
originalPoints[3][i] = origin[i] - radius * axis[1][i] + radius * axis[2][i];
|
||||||
|
|
||||||
|
We want that origional axis and the origin
|
||||||
|
axis[0] is given in the 'projection' parameter.
|
||||||
|
|
||||||
|
Yes, reversing this stuff means that we'll have no support for triangles.
|
||||||
|
*/
|
||||||
|
|
||||||
|
VectorClear(center);
|
||||||
|
VectorAdd(center, points[0], center);
|
||||||
|
VectorAdd(center, points[1], center);
|
||||||
|
VectorAdd(center, points[2], center);
|
||||||
|
VectorAdd(center, points[3], center);
|
||||||
|
|
||||||
|
VectorSubtract(points[0], center, p[0]);
|
||||||
|
VectorSubtract(points[1], center, p[1]);
|
||||||
|
VectorSubtract(points[2], center, p[2]);
|
||||||
|
VectorSubtract(points[3], center, p[3]);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
axis[1][i] = (p[2][i]+p[1][i])/2;
|
||||||
|
axis[2][i] = (p[2][i]+p[3][i])/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
radius = VectorNormalize(axis[1]);
|
||||||
|
VectorNormalize(axis[2]);
|
||||||
|
VectorNormalize(projection);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Q1BSP_ClipDecal(center, axis[0], axis[1], axis[2], radius, pointBuffer, maxPoints);
|
||||||
|
fragmentBuffer->firstPoint = 0;
|
||||||
|
fragmentBuffer->numPoints = 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void GLDraw_Image(float x, float y, float w, float h, float s1, float t1, float s2, float t2, qpic_t *pic);
|
void GLDraw_Image(float x, float y, float w, float h, float s1, float t1, float s2, float t2, qpic_t *pic);
|
||||||
int VM_LerpTag(void *out, model_t *model, int f1, int f2, float l2, char *tagname);
|
int VM_LerpTag(void *out, model_t *model, int f1, int f2, float l2, char *tagname);
|
||||||
|
@ -464,7 +529,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
|
||||||
Cbuf_AddText(VM_POINTER(arg[0]), RESTRICT_SERVER);
|
Cbuf_AddText(VM_POINTER(arg[0]), RESTRICT_SERVER);
|
||||||
break;
|
break;
|
||||||
case CG_ADDCOMMAND:
|
case CG_ADDCOMMAND:
|
||||||
Cmd_AddRemCommand(VM_POINTER(arg[0]), CG_Command_f);
|
Cmd_AddRemCommand(VM_POINTER(arg[0]), NULL);
|
||||||
break;
|
break;
|
||||||
case CG_SENDCLIENTCOMMAND:
|
case CG_SENDCLIENTCOMMAND:
|
||||||
Con_DPrintf("CG_SENDCLIENTCOMMAND: %s", VM_POINTER(arg[0]));
|
Con_DPrintf("CG_SENDCLIENTCOMMAND: %s", VM_POINTER(arg[0]));
|
||||||
|
@ -472,8 +537,11 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CG_UPDATESCREEN: //force a buffer swap cos loading won't refresh it soon.
|
case CG_UPDATESCREEN: //force a buffer swap cos loading won't refresh it soon.
|
||||||
GL_EndRendering();
|
SCR_BeginLoadingPlaque();
|
||||||
GL_DoSwap();
|
SCR_UpdateScreen();
|
||||||
|
SCR_EndLoadingPlaque();
|
||||||
|
// GL_EndRendering();
|
||||||
|
// GL_DoSwap();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CG_FS_FOPENFILE: //fopen
|
case CG_FS_FOPENFILE: //fopen
|
||||||
|
@ -499,10 +567,10 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
|
||||||
if (!mod)
|
if (!mod)
|
||||||
mod = cl.worldmodel;
|
mod = cl.worldmodel;
|
||||||
if (mod)
|
if (mod)
|
||||||
pc = mod->funcs.PointContents(mod, VM_POINTER(arg[0]));
|
pc = CM_PointContents(mod, VM_POINTER(arg[0]));
|
||||||
else
|
else
|
||||||
pc = FTECONTENTS_SOLID;
|
pc = 1;//FTECONTENTS_SOLID;
|
||||||
VM_LONG(ret) = Contents_To_Q3(pc);
|
VM_LONG(ret) = pc;//Contents_To_Q3(pc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -537,11 +605,11 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mod)
|
if (mod)
|
||||||
pc = mod->funcs.PointContents(mod, p_l);
|
pc = CM_PointContents(mod, p_l);
|
||||||
else
|
else
|
||||||
pc = FTECONTENTS_SOLID;
|
pc = 1;//FTECONTENTS_SOLID;
|
||||||
}
|
}
|
||||||
VM_LONG(ret) = Contents_To_Q3(pc);
|
VM_LONG(ret) = pc;//Contents_To_Q3(pc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -705,6 +773,18 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
|
||||||
|
|
||||||
case CG_R_CLEARSCENE: //clear scene
|
case CG_R_CLEARSCENE: //clear scene
|
||||||
cl_numvisedicts=0;
|
cl_numvisedicts=0;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < MAX_DLIGHTS; i++)
|
||||||
|
{
|
||||||
|
if (cl_dlights[i].isstatic)
|
||||||
|
continue;
|
||||||
|
cl_dlights[i].radius = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CG_R_ADDPOLYTOSCENE:
|
||||||
|
// ...
|
||||||
break;
|
break;
|
||||||
case CG_R_ADDREFENTITYTOSCENE: //add ent to scene
|
case CG_R_ADDREFENTITYTOSCENE: //add ent to scene
|
||||||
VQ3_AddEntity(VM_POINTER(arg[0]));
|
VQ3_AddEntity(VM_POINTER(arg[0]));
|
||||||
|
@ -717,6 +797,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CG_R_RENDERSCENE: //render scene
|
case CG_R_RENDERSCENE: //render scene
|
||||||
|
GLR_PushDlights();
|
||||||
VQ3_RenderView(VM_POINTER(arg[0]));
|
VQ3_RenderView(VM_POINTER(arg[0]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -817,6 +898,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CG_CM_MARKFRAGMENTS:
|
case CG_CM_MARKFRAGMENTS:
|
||||||
|
VM_LONG(ret) = CG_MarkFragments( VM_LONG(arg[0]), VM_POINTER(arg[1]), VM_POINTER(arg[2]), VM_LONG(arg[3]), VM_POINTER(arg[4]), VM_LONG(arg[5]), VM_POINTER(arg[6]) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CG_GETCURRENTSNAPSHOTNUMBER:
|
case CG_GETCURRENTSNAPSHOTNUMBER:
|
||||||
|
@ -925,7 +1007,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
|
||||||
UI_RegisterFont(VM_POINTER(arg[0]), VM_LONG(arg[1]), VM_POINTER(arg[2]));
|
UI_RegisterFont(VM_POINTER(arg[0]), VM_LONG(arg[1]), VM_POINTER(arg[2]));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Con_Printf("Q3CG: Bad system trap: %d\n", fn);
|
Host_EndGame("Q3CG: Bad system trap: %d\n", fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1020,14 +1102,17 @@ void CG_Start (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
Z_FreeTags(CGTAGNUM);
|
Z_FreeTags(CGTAGNUM);
|
||||||
|
SCR_BeginLoadingPlaque();
|
||||||
|
|
||||||
cgvm = VM_Create(NULL, "vm/cgame", CG_SystemCalls, CG_SystemCallsEx);
|
cgvm = VM_Create(NULL, "vm/cgame", CG_SystemCalls, CG_SystemCallsEx);
|
||||||
if (cgvm)
|
if (cgvm)
|
||||||
{ //hu... cgame doesn't appear to have a query version call!
|
{ //hu... cgame doesn't appear to have a query version call!
|
||||||
VM_Call(cgvm, CG_INIT, ccs.serverMessageNum, ccs.lastServerCommandNum, cl.playernum[0]);
|
VM_Call(cgvm, CG_INIT, ccs.serverMessageNum, ccs.lastServerCommandNum, cl.playernum[0]);
|
||||||
|
SCR_EndLoadingPlaque();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SCR_EndLoadingPlaque();
|
||||||
Host_EndGame("Failed to initialise cgame module\n");
|
Host_EndGame("Failed to initialise cgame module\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1557,7 +1557,7 @@ void CL_LinkPacketEntities (void)
|
||||||
model = cl.model_precache[s1->modelindex];
|
model = cl.model_precache[s1->modelindex];
|
||||||
if (!model)
|
if (!model)
|
||||||
{
|
{
|
||||||
Con_DPrintf("Bad modelindex\n");
|
Con_DPrintf("Bad modelindex (%i)\n", s1->modelindex);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1165,7 +1165,7 @@ void SCR_DrawLoading (void)
|
||||||
|
|
||||||
void SCR_BeginLoadingPlaque (void)
|
void SCR_BeginLoadingPlaque (void)
|
||||||
{
|
{
|
||||||
if (cls.state != ca_active)
|
if (cls.state != ca_active && cls.protocol != CP_QUAKE3)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!scr_initialized)
|
if (!scr_initialized)
|
||||||
|
|
|
@ -344,7 +344,7 @@ void CL_AddBeam (int tent, int ent, vec3_t start, vec3_t end) //fixme: use TE_ n
|
||||||
switch(tent)
|
switch(tent)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (ent < 0 && ent >= -MAX_CLIENTS) //a zquake concept. ent between -1 and -maxplayers is to be taken to be a railtrail from a particular player instead of a beam.
|
if (ent < 0 && ent >= -512) //a zquake concept. ent between -1 and -maxplayers is to be taken to be a railtrail from a particular player instead of a beam.
|
||||||
{
|
{
|
||||||
CLQ2_RailTrail(start, end);
|
CLQ2_RailTrail(start, end);
|
||||||
return;
|
return;
|
||||||
|
@ -401,7 +401,7 @@ void CL_AddBeam (int tent, int ent, vec3_t start, vec3_t end) //fixme: use TE_ n
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cl_beam_trace.value && etype >= 0 && cls.state == ca_active)
|
if (cl_beam_trace.value && etype >= 0 && cls.state == ca_active && P_TypeIsLoaded(etype))
|
||||||
{
|
{
|
||||||
VectorSubtract(end, start, normal);
|
VectorSubtract(end, start, normal);
|
||||||
VectorNormalize(normal);
|
VectorNormalize(normal);
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#include "ui_public.h"
|
#include "ui_public.h"
|
||||||
#include "cl_master.h"
|
#include "cl_master.h"
|
||||||
|
|
||||||
|
int keycatcher;
|
||||||
|
|
||||||
#ifdef VM_UI
|
#ifdef VM_UI
|
||||||
#include "clq3defs.h"
|
#include "clq3defs.h"
|
||||||
|
|
||||||
|
@ -202,8 +204,6 @@ static char *scr_centerstring;
|
||||||
|
|
||||||
static int ox, oy;
|
static int ox, oy;
|
||||||
|
|
||||||
static int keycatcher;
|
|
||||||
|
|
||||||
void GLDraw_Image(float x, float y, float w, float h, float s1, float t1, float s2, float t2, qpic_t *pic);
|
void GLDraw_Image(float x, float y, float w, float h, float s1, float t1, float s2, float t2, qpic_t *pic);
|
||||||
void SWDraw_Image (float xp, float yp, float wp, float hp, float s1, float t1, float s2, float t2, qpic_t *pic);
|
void SWDraw_Image (float xp, float yp, float wp, float hp, float s1, float t1, float s2, float t2, qpic_t *pic);
|
||||||
char *Get_Q2ConfigString(int i);
|
char *Get_Q2ConfigString(int i);
|
||||||
|
@ -454,6 +454,30 @@ int VMEnumMods(char *match, int size, void *args)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int VMQ3_GetFileList(char *path, char *ext, char *output, int buffersize)
|
||||||
|
{
|
||||||
|
vmsearch_t vms;
|
||||||
|
vms.initialbuffer = vms.buffer = output;
|
||||||
|
vms.skip = strlen(path)+1;
|
||||||
|
vms.bufferleft = buffersize;
|
||||||
|
vms.found=0;
|
||||||
|
if (*(char *)path == '$')
|
||||||
|
{
|
||||||
|
extern char com_basedir[];
|
||||||
|
vms.skip=0;
|
||||||
|
Sys_EnumerateFiles(com_basedir, "*", VMEnumMods, &vms);
|
||||||
|
}
|
||||||
|
else if (*(char *)ext == '.' || *(char *)ext == '/')
|
||||||
|
COM_EnumerateFiles(va("%s/*%s", path, ext), VMEnum, &vms);
|
||||||
|
else
|
||||||
|
COM_EnumerateFiles(va("%s/*.%s", path, ext), VMEnum, &vms);
|
||||||
|
return vms.found;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct q3refEntity_s {
|
typedef struct q3refEntity_s {
|
||||||
refEntityType_t reType;
|
refEntityType_t reType;
|
||||||
int renderfx;
|
int renderfx;
|
||||||
|
@ -731,7 +755,7 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
|
||||||
//make sure that any called functions are also range checked.
|
//make sure that any called functions are also range checked.
|
||||||
//like reading from files copies names into alternate buffers, allowing stack screwups.
|
//like reading from files copies names into alternate buffers, allowing stack screwups.
|
||||||
|
|
||||||
switch((ui_builtinnum_t)fn)
|
switch((uiImport_t)fn)
|
||||||
{
|
{
|
||||||
case UI_ERROR:
|
case UI_ERROR:
|
||||||
Con_Printf("%s", VM_POINTER(arg[0]));
|
Con_Printf("%s", VM_POINTER(arg[0]));
|
||||||
|
@ -744,6 +768,19 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
|
||||||
VM_LONG(ret) = Sys_Milliseconds();
|
VM_LONG(ret) = Sys_Milliseconds();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case UI_ARGC:
|
||||||
|
VM_LONG(ret) = Cmd_Argc();
|
||||||
|
break;
|
||||||
|
case UI_ARGV:
|
||||||
|
// VALIDATEPOINTER(arg[1], arg[2]);
|
||||||
|
Q_strncpyz(VM_POINTER(arg[1]), Cmd_Argv(VM_LONG(arg[0])), VM_LONG(arg[2]));
|
||||||
|
break;
|
||||||
|
/* case UI_ARGS:
|
||||||
|
VALIDATEPOINTER(arg[0], arg[1]);
|
||||||
|
Q_strncpyz(VM_POINTER(arg[0]), Cmd_Args(), VM_LONG(arg[1]));
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
|
||||||
case UI_CVAR_SET:
|
case UI_CVAR_SET:
|
||||||
{
|
{
|
||||||
cvar_t *var;
|
cvar_t *var;
|
||||||
|
@ -849,25 +886,7 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
|
||||||
case UI_FS_GETFILELIST: //fs listing
|
case UI_FS_GETFILELIST: //fs listing
|
||||||
if ((int)arg[2] + arg[3] >= mask || VM_POINTER(arg[2]) < offset)
|
if ((int)arg[2] + arg[3] >= mask || VM_POINTER(arg[2]) < offset)
|
||||||
break; //out of bounds.
|
break; //out of bounds.
|
||||||
{
|
return VMQ3_GetFileList(VM_POINTER(arg[0]), VM_POINTER(arg[1]), VM_POINTER(arg[2]), VM_LONG(arg[3]));
|
||||||
vmsearch_t vms;
|
|
||||||
vms.initialbuffer = vms.buffer = VM_POINTER(arg[2]);
|
|
||||||
vms.skip = strlen(VM_POINTER(arg[0]))+1;
|
|
||||||
vms.bufferleft = arg[3];
|
|
||||||
vms.found=0;
|
|
||||||
if (*(char *)VM_POINTER(arg[0]) == '$')
|
|
||||||
{
|
|
||||||
extern char com_basedir[];
|
|
||||||
vms.skip=0;
|
|
||||||
Sys_EnumerateFiles(com_basedir, "*", VMEnumMods, &vms);
|
|
||||||
}
|
|
||||||
else if (*(char *)VM_POINTER(arg[1]) == '.' || *(char *)VM_POINTER(arg[1]) == '/')
|
|
||||||
COM_EnumerateFiles(va("%s/*%s", VM_POINTER(arg[0]), VM_POINTER(arg[1])), VMEnum, &vms);
|
|
||||||
else
|
|
||||||
COM_EnumerateFiles(va("%s/*.%s", VM_POINTER(arg[0]), VM_POINTER(arg[1])), VMEnum, &vms);
|
|
||||||
VM_LONG(ret) = vms.found;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UI_R_REGISTERMODEL: //precache model
|
case UI_R_REGISTERMODEL: //precache model
|
||||||
{
|
{
|
||||||
|
@ -951,6 +970,9 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
|
||||||
S_LocalSound(VM_LONG(arg[0])+(char *)offset);
|
S_LocalSound(VM_LONG(arg[0])+(char *)offset);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case UI_KEY_GETOVERSTRIKEMODE:
|
||||||
|
return true;
|
||||||
|
|
||||||
case UI_KEY_KEYNUMTOSTRINGBUF:
|
case UI_KEY_KEYNUMTOSTRINGBUF:
|
||||||
if (VM_LONG(arg[0]) < 0 || VM_LONG(arg[0]) > 255 || (int)arg[1] + VM_LONG(arg[2]) >= mask || VM_POINTER(arg[1]) < offset || VM_LONG(arg[2]) < 1)
|
if (VM_LONG(arg[0]) < 0 || VM_LONG(arg[0]) > 255 || (int)arg[1] + VM_LONG(arg[2]) >= mask || VM_POINTER(arg[1]) < offset || VM_LONG(arg[2]) < 1)
|
||||||
break; //out of bounds.
|
break; //out of bounds.
|
||||||
|
@ -1529,8 +1551,8 @@ void UI_MousePosition(int xpos, int ypos)
|
||||||
ypos = vid.height;
|
ypos = vid.height;
|
||||||
ox=0;oy=0;
|
ox=0;oy=0;
|
||||||
//force a cap
|
//force a cap
|
||||||
VM_Call(uivm, UI_MOUSE_DELTA, -32767, -32767);
|
VM_Call(uivm, UI_MOUSE_EVENT, -32767, -32767);
|
||||||
VM_Call(uivm, UI_MOUSE_DELTA, (xpos-ox)*640/vid.width, (ypos-oy)*480/vid.height);
|
VM_Call(uivm, UI_MOUSE_EVENT, (xpos-ox)*640/vid.width, (ypos-oy)*480/vid.height);
|
||||||
ox = xpos;
|
ox = xpos;
|
||||||
oy = ypos;
|
oy = ypos;
|
||||||
|
|
||||||
|
@ -1573,7 +1595,7 @@ void UI_Start (void)
|
||||||
}
|
}
|
||||||
VM_Call(uivm, UI_INIT);
|
VM_Call(uivm, UI_INIT);
|
||||||
|
|
||||||
VM_Call(uivm, UI_MOUSE_DELTA, -32767, -32767);
|
VM_Call(uivm, UI_MOUSE_EVENT, -32767, -32767);
|
||||||
ox = 0;
|
ox = 0;
|
||||||
oy = 0;
|
oy = 0;
|
||||||
|
|
||||||
|
@ -1595,6 +1617,13 @@ void UI_Restart_f(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qboolean UI_Command(void)
|
||||||
|
{
|
||||||
|
if (uivm)
|
||||||
|
return VM_Call(uivm, UI_CONSOLE_COMMAND);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void UI_Init (void)
|
void UI_Init (void)
|
||||||
{
|
{
|
||||||
Cmd_AddRemCommand("ui_restart", UI_Restart_f);
|
Cmd_AddRemCommand("ui_restart", UI_Restart_f);
|
||||||
|
|
|
@ -261,7 +261,7 @@ void CLQ3_ParseSnapshot(void)
|
||||||
snap.serverMessageNum = ccs.serverMessageNum;
|
snap.serverMessageNum = ccs.serverMessageNum;
|
||||||
snap.serverCommandNum = ccs.lastServerCommandNum;
|
snap.serverCommandNum = ccs.lastServerCommandNum;
|
||||||
snap.serverTime = MSG_ReadLong();
|
snap.serverTime = MSG_ReadLong();
|
||||||
snap.localTime = Sys_DoubleTime()*1000;
|
snap.localTime = Sys_Milliseconds();
|
||||||
|
|
||||||
// If the frame is delta compressed from data that we
|
// If the frame is delta compressed from data that we
|
||||||
// no longer have available, we must suck up the rest of
|
// no longer have available, we must suck up the rest of
|
||||||
|
@ -862,6 +862,7 @@ void CLQ3_SendCmd(usercmd_t *cmd)
|
||||||
frame_t *frame, *oldframe;
|
frame_t *frame, *oldframe;
|
||||||
int cmdcount, key;
|
int cmdcount, key;
|
||||||
usercmd_t *to, *from;
|
usercmd_t *to, *from;
|
||||||
|
extern int keycatcher;
|
||||||
|
|
||||||
if (cls.resendinfo)
|
if (cls.resendinfo)
|
||||||
{
|
{
|
||||||
|
@ -869,7 +870,7 @@ void CLQ3_SendCmd(usercmd_t *cmd)
|
||||||
CLQ3_SendClientCommand("userinfo \"%s\"", cls.userinfo);
|
CLQ3_SendClientCommand("userinfo \"%s\"", cls.userinfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
ccs.serverTime = ccs.snap.serverTime + (Sys_Milliseconds()-ccs.snap.localTime);
|
cl.gametime = ccs.serverTime = ccs.snap.serverTime + (Sys_Milliseconds()-ccs.snap.localTime);
|
||||||
|
|
||||||
//reuse the q1 array
|
//reuse the q1 array
|
||||||
cmd->servertime = ccs.serverTime;
|
cmd->servertime = ccs.serverTime;
|
||||||
|
@ -879,6 +880,14 @@ void CLQ3_SendCmd(usercmd_t *cmd)
|
||||||
cmd->sidemove *= 127/400.0f;
|
cmd->sidemove *= 127/400.0f;
|
||||||
cmd->upmove *= 127/400.0f;
|
cmd->upmove *= 127/400.0f;
|
||||||
|
|
||||||
|
if (cmd->buttons & 2) //jump
|
||||||
|
{
|
||||||
|
cmd->upmove = 100;
|
||||||
|
cmd->buttons &= ~2;
|
||||||
|
}
|
||||||
|
if (key_dest != key_game || (keycatcher&3))
|
||||||
|
cmd->buttons |= 2; //add in the 'at console' button
|
||||||
|
|
||||||
cl.frames[ccs.currentUserCmdNumber&CMD_MASK].cmd[0] = *cmd;
|
cl.frames[ccs.currentUserCmdNumber&CMD_MASK].cmd[0] = *cmd;
|
||||||
ccs.currentUserCmdNumber++;
|
ccs.currentUserCmdNumber++;
|
||||||
|
|
||||||
|
|
|
@ -148,6 +148,7 @@ typedef struct q3entityState_s {
|
||||||
int torsoAnim; // mask off ANIM_TOGGLEBIT
|
int torsoAnim; // mask off ANIM_TOGGLEBIT
|
||||||
|
|
||||||
int generic1;
|
int generic1;
|
||||||
|
|
||||||
} q3entityState_t;
|
} q3entityState_t;
|
||||||
|
|
||||||
#define MAX_MAP_AREA_BYTES 32
|
#define MAX_MAP_AREA_BYTES 32
|
||||||
|
|
|
@ -182,7 +182,7 @@ void ConcatPackageLists(package_t *l2)
|
||||||
static void dlnotification(char *localfile, qboolean sucess)
|
static void dlnotification(char *localfile, qboolean sucess)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
FS_FlushFSHash();
|
||||||
COM_FOpenFile(localfile, &f);
|
COM_FOpenFile(localfile, &f);
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
|
@ -315,7 +315,8 @@ qboolean M_Download_Key (struct menucustom_s *c, struct menu_s *m, int key)
|
||||||
{
|
{
|
||||||
if ((p->flags&DPF_WANTTOINSTALL) && !(p->flags&DPF_HAVEAVERSION))
|
if ((p->flags&DPF_WANTTOINSTALL) && !(p->flags&DPF_HAVEAVERSION))
|
||||||
{ //if we want it and don't have it:
|
{ //if we want it and don't have it:
|
||||||
if (HTTP_CL_Get(p->src, va("../%s", p->dest), NULL))
|
COM_CreatePath(va("%s/%s", com_gamedir, p->dest));
|
||||||
|
if (HTTP_CL_Get(p->src, p->dest, NULL))
|
||||||
p->flags|=DPF_HAVEAVERSION; //FIXME: This is error prone.
|
p->flags|=DPF_HAVEAVERSION; //FIXME: This is error prone.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1293,7 +1293,16 @@ void MP_Shutdown (void)
|
||||||
func_t temp;
|
func_t temp;
|
||||||
if (!menuprogs)
|
if (!menuprogs)
|
||||||
return;
|
return;
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
char *buffer;
|
||||||
|
int size = 1024*1024*8;
|
||||||
|
buffer = Z_Malloc(size);
|
||||||
|
menuprogs->save_ents(menuprogs, buffer, &size, 1);
|
||||||
|
COM_WriteFile("menucore.txt", buffer, size);
|
||||||
|
Z_Free(buffer);
|
||||||
|
}
|
||||||
|
*/
|
||||||
temp = mp_shutdown_function;
|
temp = mp_shutdown_function;
|
||||||
mp_shutdown_function = 0;
|
mp_shutdown_function = 0;
|
||||||
if (temp && !inmenuprogs)
|
if (temp && !inmenuprogs)
|
||||||
|
|
|
@ -154,6 +154,25 @@ typedef struct {
|
||||||
float rotation;
|
float rotation;
|
||||||
} ramp_t;
|
} ramp_t;
|
||||||
|
|
||||||
|
#define APPLYBLEND(bm) \
|
||||||
|
switch (bm) \
|
||||||
|
{ \
|
||||||
|
case BM_ADD: \
|
||||||
|
qglBlendFunc(GL_SRC_ALPHA, GL_ONE); \
|
||||||
|
break; \
|
||||||
|
case BM_SUBTRACT: \
|
||||||
|
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR); \
|
||||||
|
break; \
|
||||||
|
case BM_BLENDCOLOUR: \
|
||||||
|
qglBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR); \
|
||||||
|
break; \
|
||||||
|
case BM_BLEND: \
|
||||||
|
default: \
|
||||||
|
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); \
|
||||||
|
break; \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct part_type_s {
|
typedef struct part_type_s {
|
||||||
char name[MAX_QPATH];
|
char name[MAX_QPATH];
|
||||||
char texname[MAX_QPATH];
|
char texname[MAX_QPATH];
|
||||||
|
@ -309,6 +328,18 @@ int P_DescriptionIsLoaded(char *name)
|
||||||
return i+1;
|
return i+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qboolean P_TypeIsLoaded(int effect)
|
||||||
|
{
|
||||||
|
int i = effect;
|
||||||
|
part_type_t *ptype;
|
||||||
|
if (i < 0)
|
||||||
|
return false;
|
||||||
|
ptype = &part_type[i];
|
||||||
|
if (!ptype->loaded)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void P_SetModified(void) //called when the particle system changes (from console).
|
static void P_SetModified(void) //called when the particle system changes (from console).
|
||||||
{
|
{
|
||||||
if (Cmd_FromGamecode())
|
if (Cmd_FromGamecode())
|
||||||
|
@ -649,9 +680,10 @@ void P_ParticleEffect_f(void)
|
||||||
ptype->blendmode = BM_ADD;
|
ptype->blendmode = BM_ADD;
|
||||||
else if (!strcmp(value, "subtract"))
|
else if (!strcmp(value, "subtract"))
|
||||||
ptype->blendmode = BM_SUBTRACT;
|
ptype->blendmode = BM_SUBTRACT;
|
||||||
|
else if (!strcmp(value, "blendcolour") || !strcmp(value, "blendcolor"))
|
||||||
|
ptype->blendmode = BM_BLENDCOLOUR;
|
||||||
else
|
else
|
||||||
ptype->blendmode = BM_MERGE;
|
ptype->blendmode = BM_BLEND;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (!strcmp(var, "spawnmode"))
|
else if (!strcmp(var, "spawnmode"))
|
||||||
{
|
{
|
||||||
|
@ -1932,10 +1964,8 @@ int P_RunParticleEffectState (vec3_t org, vec3_t dir, float count, int typenum,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dir = bestdir;
|
dir = bestdir;
|
||||||
dir[0]*=-1;
|
|
||||||
dir[1]*=-1;
|
|
||||||
dir[2]*=-1;
|
|
||||||
}
|
}
|
||||||
|
VectorInverse(dir);
|
||||||
|
|
||||||
VectorNormalize(vec);
|
VectorNormalize(vec);
|
||||||
CrossProduct(dir, vec, tangent);
|
CrossProduct(dir, vec, tangent);
|
||||||
|
@ -3089,12 +3119,7 @@ void GL_DrawTexturedParticle(particle_t *p, part_type_t *type)
|
||||||
qglEnd();
|
qglEnd();
|
||||||
qglEnable(GL_TEXTURE_2D);
|
qglEnable(GL_TEXTURE_2D);
|
||||||
GL_Bind(type->texturenum);
|
GL_Bind(type->texturenum);
|
||||||
if (type->blendmode == BM_ADD) //addative
|
APPLYBLEND(type->blendmode);
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
// else if (type->blendmode == BM_SUBTRACT) //subtractive
|
|
||||||
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
else
|
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
qglShadeModel(GL_FLAT);
|
qglShadeModel(GL_FLAT);
|
||||||
qglBegin(GL_QUADS);
|
qglBegin(GL_QUADS);
|
||||||
}
|
}
|
||||||
|
@ -3199,12 +3224,7 @@ void GL_DrawTrifanParticle(particle_t *p, part_type_t *type)
|
||||||
{
|
{
|
||||||
lasttype = type;
|
lasttype = type;
|
||||||
qglDisable(GL_TEXTURE_2D);
|
qglDisable(GL_TEXTURE_2D);
|
||||||
if (type->blendmode == BM_ADD) //addative
|
APPLYBLEND(type->blendmode);
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
// else if (type->blendmode == BM_SUBTRACT) //subtractive
|
|
||||||
// qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
else
|
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
qglShadeModel(GL_SMOOTH);
|
qglShadeModel(GL_SMOOTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3248,12 +3268,7 @@ void GL_DrawLineSparkParticle(particle_t *p, part_type_t *type)
|
||||||
qglEnd();
|
qglEnd();
|
||||||
qglDisable(GL_TEXTURE_2D);
|
qglDisable(GL_TEXTURE_2D);
|
||||||
GL_Bind(type->texturenum);
|
GL_Bind(type->texturenum);
|
||||||
if (type->blendmode == BM_ADD) //addative
|
APPLYBLEND(type->blendmode);
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
// else if (type->blendmode == BM_SUBTRACT) //subtractive
|
|
||||||
// qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
else
|
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
qglShadeModel(GL_SMOOTH);
|
qglShadeModel(GL_SMOOTH);
|
||||||
qglBegin(GL_LINES);
|
qglBegin(GL_LINES);
|
||||||
}
|
}
|
||||||
|
@ -3280,12 +3295,7 @@ void GL_DrawTexturedSparkParticle(particle_t *p, part_type_t *type)
|
||||||
qglEnd();
|
qglEnd();
|
||||||
qglEnable(GL_TEXTURE_2D);
|
qglEnable(GL_TEXTURE_2D);
|
||||||
GL_Bind(type->texturenum);
|
GL_Bind(type->texturenum);
|
||||||
if (type->blendmode == BM_ADD) //addative
|
APPLYBLEND(type->blendmode);
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
// else if (type->blendmode == BM_SUBTRACT) //subtractive
|
|
||||||
// qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
else
|
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
qglShadeModel(GL_SMOOTH);
|
qglShadeModel(GL_SMOOTH);
|
||||||
qglBegin(GL_QUADS);
|
qglBegin(GL_QUADS);
|
||||||
}
|
}
|
||||||
|
@ -3329,12 +3339,7 @@ void GL_DrawSketchSparkParticle(particle_t *p, part_type_t *type)
|
||||||
qglEnd();
|
qglEnd();
|
||||||
qglDisable(GL_TEXTURE_2D);
|
qglDisable(GL_TEXTURE_2D);
|
||||||
GL_Bind(type->texturenum);
|
GL_Bind(type->texturenum);
|
||||||
if (type->blendmode == BM_ADD) //addative
|
APPLYBLEND(type->blendmode);
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
// else if (type->blendmode == BM_SUBTRACT) //subtractive
|
|
||||||
// qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
else
|
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
qglShadeModel(GL_SMOOTH);
|
qglShadeModel(GL_SMOOTH);
|
||||||
qglBegin(GL_LINES);
|
qglBegin(GL_LINES);
|
||||||
}
|
}
|
||||||
|
@ -3380,12 +3385,7 @@ void GL_DrawParticleBeam_Textured(beamseg_t *b, part_type_t *type)
|
||||||
qglEnd();
|
qglEnd();
|
||||||
qglEnable(GL_TEXTURE_2D);
|
qglEnable(GL_TEXTURE_2D);
|
||||||
GL_Bind(type->texturenum);
|
GL_Bind(type->texturenum);
|
||||||
if (type->blendmode == BM_ADD) //addative
|
APPLYBLEND(type->blendmode);
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
// else if (type->blendmode == BM_SUBTRACT) //subtractive
|
|
||||||
// qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
else
|
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
qglShadeModel(GL_SMOOTH);
|
qglShadeModel(GL_SMOOTH);
|
||||||
qglBegin(GL_QUADS);
|
qglBegin(GL_QUADS);
|
||||||
}
|
}
|
||||||
|
@ -3454,12 +3454,7 @@ void GL_DrawParticleBeam_Untextured(beamseg_t *b, part_type_t *type)
|
||||||
qglEnd();
|
qglEnd();
|
||||||
qglDisable(GL_TEXTURE_2D);
|
qglDisable(GL_TEXTURE_2D);
|
||||||
GL_Bind(type->texturenum);
|
GL_Bind(type->texturenum);
|
||||||
if (type->blendmode == BM_ADD) //addative
|
APPLYBLEND(type->blendmode);
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
// else if (type->blendmode == BM_SUBTRACT) //subtractive
|
|
||||||
// qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
else
|
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
qglShadeModel(GL_SMOOTH);
|
qglShadeModel(GL_SMOOTH);
|
||||||
qglBegin(GL_QUADS);
|
qglBegin(GL_QUADS);
|
||||||
}
|
}
|
||||||
|
@ -3545,13 +3540,12 @@ void GL_DrawClippedDecal(clippeddecal_t *d, part_type_t *type)
|
||||||
qglEnd();
|
qglEnd();
|
||||||
qglEnable(GL_TEXTURE_2D);
|
qglEnable(GL_TEXTURE_2D);
|
||||||
GL_Bind(type->texturenum);
|
GL_Bind(type->texturenum);
|
||||||
if (type->blendmode == BM_ADD) //addative
|
APPLYBLEND(type->blendmode);
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
// else if (type->blendmode == BM_SUBTRACT) //subtractive
|
|
||||||
// qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
else
|
|
||||||
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
qglShadeModel(GL_SMOOTH);
|
qglShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
|
// qglDisable(GL_TEXTURE_2D);
|
||||||
|
// qglBegin(GL_LINE_LOOP);
|
||||||
|
|
||||||
qglBegin(GL_TRIANGLES);
|
qglBegin(GL_TRIANGLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -957,6 +957,14 @@ HWND hwnd_dialog;
|
||||||
qboolean isDedicated = false;
|
qboolean isDedicated = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
void Signal_Error_Handler(int i)
|
||||||
|
{
|
||||||
|
int *basepointer;
|
||||||
|
__asm {mov basepointer,ebp};
|
||||||
|
Sys_Error("Receieved signal, offset was 0x%8x", basepointer[73]);
|
||||||
|
}
|
||||||
|
|
||||||
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||||||
{
|
{
|
||||||
// MSG msg;
|
// MSG msg;
|
||||||
|
@ -971,6 +979,10 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
|
||||||
if (hPrevInstance)
|
if (hPrevInstance)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
signal (SIGFPE, Signal_Error_Handler);
|
||||||
|
signal (SIGILL, Signal_Error_Handler);
|
||||||
|
signal (SIGSEGV, Signal_Error_Handler);
|
||||||
|
|
||||||
global_hInstance = hInstance;
|
global_hInstance = hInstance;
|
||||||
global_nCmdShow = nCmdShow;
|
global_nCmdShow = nCmdShow;
|
||||||
|
|
||||||
|
|
|
@ -39,10 +39,10 @@ cvar_t allow_f_skins = {"allow_f_skins", "1"};
|
||||||
cvar_t auth_validateclients = {"auth_validateclients", "1"};
|
cvar_t auth_validateclients = {"auth_validateclients", "1"};
|
||||||
|
|
||||||
|
|
||||||
void CRC_AddBlock (unsigned short *crcvalue, qbyte *start, int count)
|
void QCRC_AddBlock (unsigned short *crcvalue, qbyte *start, int count)
|
||||||
{
|
{
|
||||||
while (count--)
|
while (count--)
|
||||||
CRC_ProcessByte(crcvalue, *start++);
|
QCRC_ProcessByte(crcvalue, *start++);
|
||||||
}
|
}
|
||||||
unsigned short SCRC_GetQueryStateCrc(char *f_query_string)
|
unsigned short SCRC_GetQueryStateCrc(char *f_query_string)
|
||||||
{
|
{
|
||||||
|
@ -50,41 +50,41 @@ unsigned short SCRC_GetQueryStateCrc(char *f_query_string)
|
||||||
int i;
|
int i;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
|
|
||||||
CRC_Init(&crc);
|
QCRC_Init(&crc);
|
||||||
|
|
||||||
// add query
|
// add query
|
||||||
CRC_AddBlock(&crc, f_query_string, strlen(f_query_string));
|
QCRC_AddBlock(&crc, f_query_string, strlen(f_query_string));
|
||||||
|
|
||||||
// add snapshot of serverinfo
|
// add snapshot of serverinfo
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "deathmatch");
|
tmp = Info_ValueForKey(cl.serverinfo, "deathmatch");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "teamplay");
|
tmp = Info_ValueForKey(cl.serverinfo, "teamplay");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "hostname");
|
tmp = Info_ValueForKey(cl.serverinfo, "hostname");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "*progs");
|
tmp = Info_ValueForKey(cl.serverinfo, "*progs");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "map");
|
tmp = Info_ValueForKey(cl.serverinfo, "map");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "spawn");
|
tmp = Info_ValueForKey(cl.serverinfo, "spawn");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "watervis");
|
tmp = Info_ValueForKey(cl.serverinfo, "watervis");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "fraglimit");
|
tmp = Info_ValueForKey(cl.serverinfo, "fraglimit");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "*gamedir");
|
tmp = Info_ValueForKey(cl.serverinfo, "*gamedir");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.serverinfo, "timelimit");
|
tmp = Info_ValueForKey(cl.serverinfo, "timelimit");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
|
|
||||||
// add snapshot of userinfo for every connected client
|
// add snapshot of userinfo for every connected client
|
||||||
for (i=0; i < MAX_CLIENTS; i++)
|
for (i=0; i < MAX_CLIENTS; i++)
|
||||||
if (cl.players[i].name[0])
|
if (cl.players[i].name[0])
|
||||||
{
|
{
|
||||||
tmp = Info_ValueForKey(cl.players[i].userinfo, "name");
|
tmp = Info_ValueForKey(cl.players[i].userinfo, "name");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
tmp = Info_ValueForKey(cl.players[i].userinfo, "team");
|
tmp = Info_ValueForKey(cl.players[i].userinfo, "team");
|
||||||
CRC_AddBlock(&crc, tmp, strlen(tmp));
|
QCRC_AddBlock(&crc, tmp, strlen(tmp));
|
||||||
}
|
}
|
||||||
|
|
||||||
// done
|
// done
|
||||||
|
|
|
@ -1645,7 +1645,21 @@ void Cmd_ExecuteString (char *text, int level)
|
||||||
if ((cmd->restriction?cmd->restriction:rcon_level.value) > level)
|
if ((cmd->restriction?cmd->restriction:rcon_level.value) > level)
|
||||||
Con_TPrintf(TL_WASRESTIRCTED, cmd_argv[0]);
|
Con_TPrintf(TL_WASRESTIRCTED, cmd_argv[0]);
|
||||||
else if (!cmd->function)
|
else if (!cmd->function)
|
||||||
|
{
|
||||||
|
#ifdef VM_CG
|
||||||
|
if (CG_Command())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
#ifdef Q3SERVER
|
||||||
|
if (SVQ3_Command())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
#ifdef VM_UI
|
||||||
|
if (UI_Command())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
Cmd_ForwardToServer ();
|
Cmd_ForwardToServer ();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
cmd->function ();
|
cmd->function ();
|
||||||
return;
|
return;
|
||||||
|
@ -1737,8 +1751,16 @@ void Cmd_ExecuteString (char *text, int level)
|
||||||
if (CG_Command())
|
if (CG_Command())
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef Q3SERVER
|
||||||
|
if (SVQ3_Command())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
#ifdef VM_UI
|
||||||
|
if (UI_Command())
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
#ifdef Q2CLIENT
|
#ifdef Q2CLIENT
|
||||||
if (cls.protocol == CP_QUAKE2)
|
if (cls.protocol == CP_QUAKE2 || cls.protocol == CP_QUAKE3)
|
||||||
{ //q2 servers convert unknown commands to text.
|
{ //q2 servers convert unknown commands to text.
|
||||||
Cmd_ForwardToServer();
|
Cmd_ForwardToServer();
|
||||||
return;
|
return;
|
||||||
|
@ -2235,6 +2257,20 @@ skipblock:
|
||||||
If_Token_Clear(ts);
|
If_Token_Clear(ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Cmd_Vstr_f( void )
|
||||||
|
{
|
||||||
|
char *v;
|
||||||
|
|
||||||
|
if (Cmd_Argc () != 2)
|
||||||
|
{
|
||||||
|
Con_Printf ("vstr <variablename> : execute a variable command\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = Cvar_VariableString(Cmd_Argv(1));
|
||||||
|
Cbuf_InsertText(va("%s\n", v), Cmd_ExecLevel);
|
||||||
|
}
|
||||||
|
|
||||||
void Cmd_set_f(void)
|
void Cmd_set_f(void)
|
||||||
{
|
{
|
||||||
cvar_t *var;
|
cvar_t *var;
|
||||||
|
@ -2717,6 +2753,7 @@ void Cmd_Init (void)
|
||||||
|
|
||||||
Cmd_AddCommand ("set", Cmd_set_f);
|
Cmd_AddCommand ("set", Cmd_set_f);
|
||||||
Cmd_AddCommand ("seta", Cmd_set_f);
|
Cmd_AddCommand ("seta", Cmd_set_f);
|
||||||
|
Cmd_AddCommand ("vstr", Cmd_Vstr_f);
|
||||||
Cmd_AddCommand ("inc", Cvar_Inc_f);
|
Cmd_AddCommand ("inc", Cvar_Inc_f);
|
||||||
//FIXME: Add seta some time.
|
//FIXME: Add seta some time.
|
||||||
Cmd_AddCommand ("if", Cmd_if_f);
|
Cmd_AddCommand ("if", Cmd_if_f);
|
||||||
|
|
|
@ -2792,7 +2792,7 @@ qbyte COM_BlockSequenceCRCByte (qbyte *base, int length, int sequence)
|
||||||
|
|
||||||
length += 4;
|
length += 4;
|
||||||
|
|
||||||
crc = CRC_Block(chkb, length);
|
crc = QCRC_Block(chkb, length);
|
||||||
|
|
||||||
crc &= 0xff;
|
crc &= 0xff;
|
||||||
|
|
||||||
|
@ -2900,7 +2900,7 @@ qbyte Q2COM_BlockSequenceCRCByte (qbyte *base, int length, int sequence)
|
||||||
|
|
||||||
length += 4;
|
length += 4;
|
||||||
|
|
||||||
crc = CRC_Block(chkb, length);
|
crc = QCRC_Block(chkb, length);
|
||||||
|
|
||||||
for (x=0, n=0; n<length; n++)
|
for (x=0, n=0; n<length; n++)
|
||||||
x += chkb[n];
|
x += chkb[n];
|
||||||
|
|
|
@ -26,8 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
// and the initial and final xor values shown below... in other words, the
|
// and the initial and final xor values shown below... in other words, the
|
||||||
// CCITT standard CRC used by XMODEM
|
// CCITT standard CRC used by XMODEM
|
||||||
|
|
||||||
#define CRC_INIT_VALUE 0xffff
|
#define QCRC_INIT_VALUE 0xffff
|
||||||
#define CRC_XOR_VALUE 0x0000
|
#define QCRC_XOR_VALUE 0x0000
|
||||||
|
|
||||||
static unsigned short crctable[256] =
|
static unsigned short crctable[256] =
|
||||||
{
|
{
|
||||||
|
@ -65,26 +65,26 @@ static unsigned short crctable[256] =
|
||||||
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
|
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
|
||||||
};
|
};
|
||||||
|
|
||||||
void CRC_Init(unsigned short *crcvalue)
|
void QCRC_Init(unsigned short *crcvalue)
|
||||||
{
|
{
|
||||||
*crcvalue = CRC_INIT_VALUE;
|
*crcvalue = QCRC_INIT_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CRC_ProcessByte(unsigned short *crcvalue, qbyte data)
|
void QCRC_ProcessByte(unsigned short *crcvalue, qbyte data)
|
||||||
{
|
{
|
||||||
*crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data];
|
*crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data];
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short CRC_Value(unsigned short crcvalue)
|
unsigned short QCRC_Value(unsigned short crcvalue)
|
||||||
{
|
{
|
||||||
return crcvalue ^ CRC_XOR_VALUE;
|
return crcvalue ^ QCRC_XOR_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short CRC_Block (qbyte *start, int count)
|
unsigned short QCRC_Block (qbyte *start, int count)
|
||||||
{
|
{
|
||||||
unsigned short crc;
|
unsigned short crc;
|
||||||
|
|
||||||
CRC_Init (&crc);
|
QCRC_Init (&crc);
|
||||||
while (count--)
|
while (count--)
|
||||||
crc = (crc << 8) ^ crctable[(crc >> 8) ^ *start++];
|
crc = (crc << 8) ^ crctable[(crc >> 8) ^ *start++];
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
/* crc.h */
|
/* crc.h */
|
||||||
|
|
||||||
void CRC_Init(unsigned short *crcvalue);
|
void QCRC_Init(unsigned short *crcvalue);
|
||||||
void CRC_ProcessByte(unsigned short *crcvalue, qbyte data);
|
void QCRC_ProcessByte(unsigned short *crcvalue, qbyte data);
|
||||||
unsigned short CRC_Value(unsigned short crcvalue);
|
unsigned short QCRC_Value(unsigned short crcvalue);
|
||||||
unsigned short CRC_Block (qbyte *start, int count);
|
unsigned short QCRC_Block (qbyte *start, int count);
|
||||||
|
|
|
@ -363,10 +363,10 @@ void *FSPAK_LoadPackFile (char *packfile)
|
||||||
// fread (&info, 1, header.dirlen, packhandle);
|
// fread (&info, 1, header.dirlen, packhandle);
|
||||||
|
|
||||||
// crc the directory to check for modifications
|
// crc the directory to check for modifications
|
||||||
// crc = CRC_Block((qbyte *)info, header.dirlen);
|
// crc = QCRC_Block((qbyte *)info, header.dirlen);
|
||||||
|
|
||||||
|
|
||||||
// CRC_Init (&crc);
|
// QCRC_Init (&crc);
|
||||||
|
|
||||||
pack = (pack_t*)Z_Malloc (sizeof (pack_t));
|
pack = (pack_t*)Z_Malloc (sizeof (pack_t));
|
||||||
// parse the directory
|
// parse the directory
|
||||||
|
|
|
@ -3294,7 +3294,24 @@ void Q2BSP_MarkLights (dlight_t *light, int bit, mnode_t *node)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (node->contents != -1)
|
if (node->contents != -1)
|
||||||
|
{
|
||||||
|
mleaf_t *leaf = (mleaf_t *)node;
|
||||||
|
msurface_t **mark;
|
||||||
|
|
||||||
|
i = leaf->nummarksurfaces;
|
||||||
|
mark = leaf->firstmarksurface;
|
||||||
|
while(i--!=0)
|
||||||
|
{
|
||||||
|
surf = *mark++;
|
||||||
|
if (surf->dlightframe != r_dlightframecount)
|
||||||
|
{
|
||||||
|
surf->dlightbits = 0;
|
||||||
|
surf->dlightframe = r_dlightframecount;
|
||||||
|
}
|
||||||
|
surf->dlightbits |= bit;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
splitplane = node->plane;
|
splitplane = node->plane;
|
||||||
dist = DotProduct (light->origin, splitplane->normal) - splitplane->dist;
|
dist = DotProduct (light->origin, splitplane->normal) - splitplane->dist;
|
||||||
|
@ -3769,6 +3786,7 @@ q2cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
loadmodel->checksum = loadmodel->checksum2 = *checksum;
|
||||||
|
|
||||||
|
|
||||||
loadmodel->numsubmodels = CM_NumInlineModels(loadmodel);
|
loadmodel->numsubmodels = CM_NumInlineModels(loadmodel);
|
||||||
|
@ -3925,6 +3943,7 @@ void CM_InitBoxHull (void)
|
||||||
#endif
|
#endif
|
||||||
box_model.funcs.LeafPVS = CM_LeafnumPVS;
|
box_model.funcs.LeafPVS = CM_LeafnumPVS;
|
||||||
box_model.funcs.LeafnumForPoint = CM_PointLeafnum;
|
box_model.funcs.LeafnumForPoint = CM_PointLeafnum;
|
||||||
|
box_model.funcs.Trace = CM_Trace;
|
||||||
|
|
||||||
box_model.hulls[0].available = true;
|
box_model.hulls[0].available = true;
|
||||||
Q2BSP_SetHullFuncs(&box_model.hulls[0]);
|
Q2BSP_SetHullFuncs(&box_model.hulls[0]);
|
||||||
|
|
|
@ -181,6 +181,6 @@ void P_EmitSkyEffectTris(struct model_s *mod, struct msurface_s *fa);
|
||||||
// trailstate functions
|
// trailstate functions
|
||||||
void P_DelinkTrailstate(trailstate_t **tsk);
|
void P_DelinkTrailstate(trailstate_t **tsk);
|
||||||
|
|
||||||
typedef enum { BM_MERGE, BM_ADD, BM_SUBTRACT } blendmode_t;
|
typedef enum { BM_BLEND, BM_BLENDCOLOUR, BM_ADD, BM_SUBTRACT } blendmode_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -333,11 +333,12 @@ typedef struct {
|
||||||
vec3_t center;
|
vec3_t center;
|
||||||
|
|
||||||
vec3_t normal;
|
vec3_t normal;
|
||||||
vec3_t tangent1;
|
// vec3_t tangent1;
|
||||||
vec3_t tangent2;
|
// vec3_t tangent2;
|
||||||
|
|
||||||
vec3_t planenorm[6];
|
vec3_t planenorm[6];
|
||||||
float planedist[6];
|
float planedist[6];
|
||||||
|
int numplanes;
|
||||||
|
|
||||||
vec_t radius;
|
vec_t radius;
|
||||||
int numtris;
|
int numtris;
|
||||||
|
@ -527,11 +528,12 @@ int Fragment_ClipPolyToPlane(float *inverts, float *outverts, int incount, float
|
||||||
|
|
||||||
float *lastvalid = NULL; //the reason these arn't just an index is because it'd need to be a special case for the first vert.
|
float *lastvalid = NULL; //the reason these arn't just an index is because it'd need to be a special case for the first vert.
|
||||||
float lastvaliddot = 0;
|
float lastvaliddot = 0;
|
||||||
|
#define FRAG_EPSILON 0.5
|
||||||
|
|
||||||
for (i = 0; i < incount; i++)
|
for (i = 0; i < incount; i++)
|
||||||
{
|
{
|
||||||
dotv[i] = DotProduct((inverts+i*3), plane) - planedist;
|
dotv[i] = DotProduct((inverts+i*3), plane) - planedist;
|
||||||
if (dotv[i]<-DIST_EPSILON)
|
if (dotv[i]<-FRAG_EPSILON)
|
||||||
clippedcount++;
|
clippedcount++;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -543,14 +545,25 @@ int Fragment_ClipPolyToPlane(float *inverts, float *outverts, int incount, float
|
||||||
if (clippedcount == incount)
|
if (clippedcount == incount)
|
||||||
return 0; //all were clipped
|
return 0; //all were clipped
|
||||||
if (clippedcount == 0)
|
if (clippedcount == 0)
|
||||||
{
|
{ //none were clipped
|
||||||
memcpy(outverts, inverts, sizeof(float)*3*incount);
|
memcpy(outverts, inverts, sizeof(float)*3*incount);
|
||||||
return incount;
|
return incount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//FIXME:
|
||||||
|
/*
|
||||||
|
|
||||||
|
We should end up with a nicly clipped quad.
|
||||||
|
If a vertex is on the other side of the place, we remove it, and add two in it's place, on the lines between the verts not chopped.
|
||||||
|
we work out the last remaining vert in the above loop
|
||||||
|
the loop below loops through all verts, if it's to be removed, it does a nested loop to find the next vert that is not going to be removed
|
||||||
|
it then adds two new verts on the right two lines.
|
||||||
|
Due to using four clipplanes, this should result in a perfect quad. It doesn't.
|
||||||
|
|
||||||
|
*/
|
||||||
for (i = 0; i < incount; )
|
for (i = 0; i < incount; )
|
||||||
{
|
{
|
||||||
if (dotv[i] < -DIST_EPSILON) //clipped
|
if (dotv[i] < -FRAG_EPSILON) //clipped
|
||||||
{
|
{
|
||||||
//work out where the line impacts the plane
|
//work out where the line impacts the plane
|
||||||
lastvaliddot = (dotv[i]) / (dotv[i]-lastvaliddot);
|
lastvaliddot = (dotv[i]) / (dotv[i]-lastvaliddot);
|
||||||
|
@ -559,20 +572,25 @@ int Fragment_ClipPolyToPlane(float *inverts, float *outverts, int incount, float
|
||||||
if (outcount+1 >= MAXFRAGMENTVERTS) //bum
|
if (outcount+1 >= MAXFRAGMENTVERTS) //bum
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
//generate a vertex where the line crosses the plane
|
||||||
outverts[outcount*3 + 0] = impact[0];
|
outverts[outcount*3 + 0] = impact[0];
|
||||||
outverts[outcount*3 + 1] = impact[1];
|
outverts[outcount*3 + 1] = impact[1];
|
||||||
outverts[outcount*3 + 2] = impact[2];
|
outverts[outcount*3 + 2] = impact[2];
|
||||||
outcount++;
|
outcount++;
|
||||||
|
|
||||||
i3 = (i+1);
|
i3 = (i+1);
|
||||||
while (dotv[i3%incount] < -DIST_EPSILON) //clipped
|
while (dotv[i3%incount] < -FRAG_EPSILON) //clipped
|
||||||
i3++;
|
i3++;
|
||||||
|
|
||||||
|
//take away any verticies on the other side of the plane
|
||||||
|
|
||||||
i = (i3-1)%incount;
|
i = (i3-1)%incount;
|
||||||
i2=i3%incount;
|
i2=i3%incount;
|
||||||
|
|
||||||
lastvaliddot = (dotv[i]) / (dotv[i]-dotv[i2]);
|
lastvaliddot = (dotv[i]) / (dotv[i]-dotv[i2]);
|
||||||
VectorInterpolate((inverts+i*3), lastvaliddot, (inverts+i2*3), impact);
|
VectorInterpolate((inverts+i*3), lastvaliddot, (inverts+i2*3), impact);
|
||||||
|
|
||||||
|
//generate a vertex where the line crosses back onto our plane
|
||||||
outverts[outcount*3 + 0] = impact[0];
|
outverts[outcount*3 + 0] = impact[0];
|
||||||
outverts[outcount*3 + 1] = impact[1];
|
outverts[outcount*3 + 1] = impact[1];
|
||||||
outverts[outcount*3 + 2] = impact[2];
|
outverts[outcount*3 + 2] = impact[2];
|
||||||
|
@ -608,7 +626,9 @@ void Fragment_ClipTriangle(fragmentdecal_t *dec, float *a, float *b, float *c)
|
||||||
int p;
|
int p;
|
||||||
float verts[MAXFRAGMENTVERTS*3];
|
float verts[MAXFRAGMENTVERTS*3];
|
||||||
float verts2[MAXFRAGMENTVERTS*3];
|
float verts2[MAXFRAGMENTVERTS*3];
|
||||||
|
float *cverts;
|
||||||
int numverts;
|
int numverts;
|
||||||
|
int flip;
|
||||||
|
|
||||||
|
|
||||||
if (dec->numtris == MAXFRAGMENTTRIS)
|
if (dec->numtris == MAXFRAGMENTTRIS)
|
||||||
|
@ -620,17 +640,24 @@ void Fragment_ClipTriangle(fragmentdecal_t *dec, float *a, float *b, float *c)
|
||||||
numverts = 3;
|
numverts = 3;
|
||||||
|
|
||||||
//clip the triangle to the 6 planes.
|
//clip the triangle to the 6 planes.
|
||||||
for (p = 0; p < 6; p+=2)
|
flip = 0;
|
||||||
|
for (p = 0; p < dec->numplanes; p++)
|
||||||
{
|
{
|
||||||
numverts = Fragment_ClipPolyToPlane(verts, verts2, numverts, dec->planenorm[p], dec->planedist[p]);
|
flip^=1;
|
||||||
if (numverts < 3) //totally clipped.
|
if (flip)
|
||||||
return;
|
numverts = Fragment_ClipPolyToPlane(verts, verts2, numverts, dec->planenorm[p], dec->planedist[p]);
|
||||||
|
else
|
||||||
|
numverts = Fragment_ClipPolyToPlane(verts2, verts, numverts, dec->planenorm[p], dec->planedist[p]);
|
||||||
|
|
||||||
numverts = Fragment_ClipPolyToPlane(verts2, verts, numverts, dec->planenorm[p+1], dec->planedist[p+1]);
|
|
||||||
if (numverts < 3) //totally clipped.
|
if (numverts < 3) //totally clipped.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flip)
|
||||||
|
cverts = verts2;
|
||||||
|
else
|
||||||
|
cverts = verts;
|
||||||
|
|
||||||
//decompose the resultant polygon into triangles.
|
//decompose the resultant polygon into triangles.
|
||||||
|
|
||||||
while(numverts>2)
|
while(numverts>2)
|
||||||
|
@ -640,9 +667,9 @@ void Fragment_ClipTriangle(fragmentdecal_t *dec, float *a, float *b, float *c)
|
||||||
|
|
||||||
numverts--;
|
numverts--;
|
||||||
|
|
||||||
VectorCopy((verts+3*0), decalfragmentverts[dec->numtris*3+0]);
|
VectorCopy((cverts+3*0), decalfragmentverts[dec->numtris*3+0]);
|
||||||
VectorCopy((verts+3*(numverts-1)), decalfragmentverts[dec->numtris*3+1]);
|
VectorCopy((cverts+3*(numverts-1)), decalfragmentverts[dec->numtris*3+1]);
|
||||||
VectorCopy((verts+3*numverts), decalfragmentverts[dec->numtris*3+2]);
|
VectorCopy((cverts+3*numverts), decalfragmentverts[dec->numtris*3+2]);
|
||||||
dec->numtris++;
|
dec->numtris++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -650,7 +677,7 @@ void Fragment_ClipTriangle(fragmentdecal_t *dec, float *a, float *b, float *c)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//this could be inlined, but I'm lazy.
|
//this could be inlined, but I'm lazy.
|
||||||
void Q1BSP_FragmentToMesh (fragmentdecal_t *dec, mesh_t *mesh)
|
void Fragment_Mesh (fragmentdecal_t *dec, mesh_t *mesh)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -707,33 +734,32 @@ void Q1BSP_ClipDecalToNodes (fragmentdecal_t *dec, mnode_t *node)
|
||||||
if (DotProduct(surf->plane->normal, dec->normal) > -0.5)
|
if (DotProduct(surf->plane->normal, dec->normal) > -0.5)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Q1BSP_FragmentToMesh(dec, surf->mesh);
|
Fragment_Mesh(dec, surf->mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
Q1BSP_ClipDecalToNodes (dec, node->children[0]);
|
Q1BSP_ClipDecalToNodes (dec, node->children[0]);
|
||||||
Q1BSP_ClipDecalToNodes (dec, node->children[1]);
|
Q1BSP_ClipDecalToNodes (dec, node->children[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, vec3_t tangent2, float size, float **out)
|
int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent1, vec3_t tangent2, float size, float **out)
|
||||||
{ //quad marks a full, independant quad
|
{ //quad marks a full, independant quad
|
||||||
int p;
|
int p;
|
||||||
fragmentdecal_t dec;
|
fragmentdecal_t dec;
|
||||||
|
|
||||||
VectorCopy(center, dec.center);
|
VectorCopy(center, dec.center);
|
||||||
VectorCopy(normal, dec.normal);
|
VectorCopy(normal, dec.normal);
|
||||||
VectorCopy(tangent, dec.tangent1);
|
|
||||||
VectorCopy(tangent2, dec.tangent2);
|
|
||||||
dec.radius = size/2;
|
dec.radius = size/2;
|
||||||
dec.numtris = 0;
|
dec.numtris = 0;
|
||||||
|
|
||||||
VectorCopy(dec.tangent1, dec.planenorm[0]);
|
VectorCopy(tangent1, dec.planenorm[0]);
|
||||||
VectorNegate(dec.tangent1, dec.planenorm[1]);
|
VectorNegate(tangent1, dec.planenorm[1]);
|
||||||
VectorCopy(dec.tangent2, dec.planenorm[2]);
|
VectorCopy(tangent2, dec.planenorm[2]);
|
||||||
VectorNegate(dec.tangent2, dec.planenorm[3]);
|
VectorNegate(tangent2, dec.planenorm[3]);
|
||||||
VectorCopy(dec.normal, dec.planenorm[4]);
|
VectorCopy(dec.normal, dec.planenorm[4]);
|
||||||
VectorNegate(dec.normal, dec.planenorm[5]);
|
VectorNegate(dec.normal, dec.planenorm[5]);
|
||||||
for (p = 0; p < 6; p++)
|
for (p = 0; p < 6; p++)
|
||||||
dec.planedist[p] = -(dec.radius - DotProduct(dec.center, dec.planenorm[p]));
|
dec.planedist[p] = -(dec.radius - DotProduct(dec.center, dec.planenorm[p]));
|
||||||
|
dec.numplanes = 6;
|
||||||
|
|
||||||
Q1BSP_ClipDecalToNodes(&dec, cl.worldmodel->nodes);
|
Q1BSP_ClipDecalToNodes(&dec, cl.worldmodel->nodes);
|
||||||
|
|
||||||
|
|
|
@ -240,7 +240,7 @@ qboolean Netchan_ProcessQ3 (netchan_t *chan)
|
||||||
|
|
||||||
if (chan->drop_count > 0)// && (net_showdrop->integer || net_showpackets->integer))
|
if (chan->drop_count > 0)// && (net_showdrop->integer || net_showpackets->integer))
|
||||||
{
|
{
|
||||||
Con_Printf("%s:Dropped %i packets at %i\n", NET_AdrToString(chan->remote_address), chan->drop_count, sequence);
|
Con_DPrintf("%s:Dropped %i packets at %i\n", NET_AdrToString(chan->remote_address), chan->drop_count, sequence);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fragment)
|
if (!fragment)
|
||||||
|
@ -467,7 +467,7 @@ int StringKey( const char *string, int length )
|
||||||
key += string[i] * (119 + i);
|
key += string[i] * (119 + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (((key >> 10) ^ key) >> 10) ^ key;
|
return (key ^ (key >> 10) ^ (key >> 20));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1281,10 +1281,21 @@ void MSG_Q3_ReadDeltaPlayerstate( const q3playerState_t *from, q3playerState_t *
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
//user commands
|
//user commands
|
||||||
|
|
||||||
|
int kbitmask[32] = {
|
||||||
|
0x00000001, 0x00000003, 0x00000007, 0x0000000F,
|
||||||
|
0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
|
||||||
|
0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
|
||||||
|
0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
|
||||||
|
0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF,
|
||||||
|
0x001FFFFf, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,
|
||||||
|
0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF,
|
||||||
|
0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF,
|
||||||
|
};
|
||||||
|
|
||||||
static int MSG_ReadDeltaKey(int key, int from, int bits)
|
static int MSG_ReadDeltaKey(int key, int from, int bits)
|
||||||
{
|
{
|
||||||
if (MSG_ReadBits(1))
|
if (MSG_ReadBits(1))
|
||||||
return MSG_ReadBits(bits)^key;
|
return MSG_ReadBits(bits)^ (key & kbitmask[bits]);
|
||||||
else
|
else
|
||||||
return from;
|
return from;
|
||||||
}
|
}
|
||||||
|
@ -1296,7 +1307,16 @@ void MSG_Q3_ReadDeltaUsercmd(int key, const usercmd_t *from, usercmd_t *to)
|
||||||
to->servertime = MSG_ReadBits(32);
|
to->servertime = MSG_ReadBits(32);
|
||||||
|
|
||||||
if (!MSG_ReadBits(1))
|
if (!MSG_ReadBits(1))
|
||||||
memcpy((qbyte *)to+4, (qbyte *)from+4, sizeof(usercmd_t)-4);
|
{
|
||||||
|
to->angles[0] = from->angles[0];
|
||||||
|
to->angles[1] = from->angles[1];
|
||||||
|
to->angles[2] = from->angles[2];
|
||||||
|
to->forwardmove = from->forwardmove;
|
||||||
|
to->sidemove = from->sidemove;
|
||||||
|
to->upmove = from->upmove;
|
||||||
|
to->buttons = from->buttons;
|
||||||
|
to->weapon = from->weapon;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
key ^= to->servertime;
|
key ^= to->servertime;
|
||||||
|
|
|
@ -1,3 +1,26 @@
|
||||||
|
/*
|
||||||
|
===========================================================================
|
||||||
|
Copyright (C) 1999-2005 Id Software, Inc.
|
||||||
|
|
||||||
|
This file is part of Quake III Arena source code.
|
||||||
|
|
||||||
|
Quake III Arena source code 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.
|
||||||
|
|
||||||
|
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
===========================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
//these structures are shared with the exe.
|
//these structures are shared with the exe.
|
||||||
|
|
||||||
#define UIMAX_SCOREBOARDNAME 16
|
#define UIMAX_SCOREBOARDNAME 16
|
||||||
|
@ -49,24 +72,61 @@ typedef enum {
|
||||||
//q2's config strings come here.
|
//q2's config strings come here.
|
||||||
} stringid_e;
|
} stringid_e;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
Q3CA_UNINITIALIZED,
|
||||||
|
Q3CA_DISCONNECTED, // not talking to a server
|
||||||
|
Q3CA_AUTHORIZING, // not used any more, was checking cd key
|
||||||
|
Q3CA_CONNECTING, // sending request packets to the server
|
||||||
|
Q3CA_CHALLENGING, // sending challenge packets to the server
|
||||||
|
Q3CA_CONNECTED, // netchan_t established, getting gamestate
|
||||||
|
Q3CA_LOADING, // only during cgame initialization, never during main loop
|
||||||
|
Q3CA_PRIMED, // got gamestate, waiting for first frame
|
||||||
|
Q3CA_ACTIVE, // game views should be displayed
|
||||||
|
Q3CA_CINEMATIC // playing a cinematic or a static pic, not connected to a server
|
||||||
|
} q3connstate_t;
|
||||||
|
typedef struct {
|
||||||
|
q3connstate_t connState;
|
||||||
|
int connectPacketCount;
|
||||||
|
int clientNum;
|
||||||
|
char servername[MAX_STRING_CHARS];
|
||||||
|
char updateInfoString[MAX_STRING_CHARS];
|
||||||
|
char messageString[MAX_STRING_CHARS];
|
||||||
|
} uiClientState_t;
|
||||||
|
|
||||||
#define UI_API_VERSION 5000
|
#define UI_API_VERSION 5000
|
||||||
typedef enum {
|
typedef enum {
|
||||||
UI_GETAPIVERSION = 0,
|
UI_GETAPIVERSION = 0, // system reserved
|
||||||
UI_INIT = 1,
|
|
||||||
UI_SHUTDOWN = 2,
|
UI_INIT,
|
||||||
UI_KEY_EVENT = 3,
|
// void UI_Init( void );
|
||||||
UI_MOUSE_DELTA = 4,
|
|
||||||
UI_REFRESH = 5,
|
UI_SHUTDOWN,
|
||||||
UI_IS_FULLSCREEN = 6,
|
// void UI_Shutdown( void );
|
||||||
UI_SET_ACTIVE_MENU = 7,
|
|
||||||
UI_CONSOLE_COMMAND = 8,
|
UI_KEY_EVENT,
|
||||||
UI_DRAW_CONNECT_SCREEN = 9,
|
// void UI_KeyEvent( int key );
|
||||||
UI_HASUNIQUECDKEY = 10,
|
|
||||||
//return value expected
|
UI_MOUSE_EVENT,
|
||||||
//0 means don't take input
|
// void UI_MouseEvent( int dx, int dy );
|
||||||
//1 means engine should skip map/scrback update,
|
|
||||||
//2 means fade the screen or draw console back. (expected to be most used)
|
UI_REFRESH,
|
||||||
//3 means don't fade the screen
|
// void UI_Refresh( int time );
|
||||||
|
|
||||||
|
UI_IS_FULLSCREEN,
|
||||||
|
// qboolean UI_IsFullscreen( void );
|
||||||
|
|
||||||
|
UI_SET_ACTIVE_MENU,
|
||||||
|
// void UI_SetActiveMenu( uiMenuCommand_t menu );
|
||||||
|
|
||||||
|
UI_CONSOLE_COMMAND,
|
||||||
|
// qboolean UI_ConsoleCommand( int realTime );
|
||||||
|
|
||||||
|
UI_DRAW_CONNECT_SCREEN,
|
||||||
|
// void UI_DrawConnectScreen( qboolean overlay );
|
||||||
|
UI_HASUNIQUECDKEY,
|
||||||
|
// if !overlay, the background will be drawn, otherwise it will be
|
||||||
|
// overlayed over whatever the cgame has drawn.
|
||||||
|
// a GetClientState syscall will be made to get the current strings
|
||||||
|
|
||||||
UI_DRAWSTATUSBAR = 500,
|
UI_DRAWSTATUSBAR = 500,
|
||||||
UI_MOUSE_POS,
|
UI_MOUSE_POS,
|
||||||
|
@ -77,95 +137,95 @@ typedef enum {
|
||||||
} uiExport_t;
|
} uiExport_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
UI_ERROR = 0,
|
UI_ERROR,
|
||||||
UI_PRINT = 1,
|
UI_PRINT,
|
||||||
UI_MILLISECONDS = 2,
|
UI_MILLISECONDS,
|
||||||
UI_CVAR_SET = 3,
|
UI_CVAR_SET,
|
||||||
UI_CVAR_VARIABLEVALUE = 4,
|
UI_CVAR_VARIABLEVALUE,
|
||||||
UI_CVAR_VARIABLESTRINGBUFFER = 5,
|
UI_CVAR_VARIABLESTRINGBUFFER,
|
||||||
UI_CVAR_SETVALUE = 6,
|
UI_CVAR_SETVALUE,
|
||||||
UI_CVAR_RESET = 7,
|
UI_CVAR_RESET,
|
||||||
UI_CVAR_CREATE = 8,
|
UI_CVAR_CREATE,
|
||||||
UI_CVAR_INFOSTRINGBUFFER = 9,
|
UI_CVAR_INFOSTRINGBUFFER,
|
||||||
UI_ARGC = 10,
|
UI_ARGC,
|
||||||
UI_ARGV = 11,
|
UI_ARGV,
|
||||||
UI_CMD_EXECUTETEXT = 12,
|
UI_CMD_EXECUTETEXT,
|
||||||
UI_FS_FOPENFILE = 13,
|
UI_FS_FOPENFILE,
|
||||||
UI_FS_READ = 14,
|
UI_FS_READ,
|
||||||
UI_FS_WRITE = 15,
|
UI_FS_WRITE,
|
||||||
UI_FS_FCLOSEFILE = 16,
|
UI_FS_FCLOSEFILE,
|
||||||
UI_FS_GETFILELIST = 17,
|
UI_FS_GETFILELIST,
|
||||||
UI_R_REGISTERMODEL = 18,
|
UI_R_REGISTERMODEL,
|
||||||
UI_R_REGISTERSKIN = 19,
|
UI_R_REGISTERSKIN,
|
||||||
UI_R_REGISTERSHADERNOMIP = 20,
|
UI_R_REGISTERSHADERNOMIP,
|
||||||
UI_R_CLEARSCENE = 21,
|
UI_R_CLEARSCENE,
|
||||||
UI_R_ADDREFENTITYTOSCENE = 22,
|
UI_R_ADDREFENTITYTOSCENE,
|
||||||
UI_R_ADDPOLYTOSCENE = 23,
|
UI_R_ADDPOLYTOSCENE,
|
||||||
UI_R_ADDLIGHTTOSCENE = 24,
|
UI_R_ADDLIGHTTOSCENE,
|
||||||
UI_R_RENDERSCENE = 25,
|
UI_R_RENDERSCENE,
|
||||||
UI_R_SETCOLOR = 26,
|
UI_R_SETCOLOR,
|
||||||
UI_R_DRAWSTRETCHPIC = 27,
|
UI_R_DRAWSTRETCHPIC,
|
||||||
UI_UPDATESCREEN = 28,
|
UI_UPDATESCREEN,
|
||||||
UI_CM_LERPTAG = 29,
|
UI_CM_LERPTAG,
|
||||||
UI_CM_LOADMODEL = 30,
|
UI_CM_LOADMODEL,
|
||||||
UI_S_REGISTERSOUND = 31,
|
UI_S_REGISTERSOUND,
|
||||||
UI_S_STARTLOCALSOUND = 32,
|
UI_S_STARTLOCALSOUND,
|
||||||
UI_KEY_KEYNUMTOSTRINGBUF = 33,
|
UI_KEY_KEYNUMTOSTRINGBUF,
|
||||||
UI_KEY_GETBINDINGBUF = 34,
|
UI_KEY_GETBINDINGBUF,
|
||||||
UI_KEY_SETBINDING = 35,
|
UI_KEY_SETBINDING,
|
||||||
UI_KEY_ISDOWN = 36,
|
UI_KEY_ISDOWN,
|
||||||
UI_KEY_GETOVERSTRIKEMODE = 37,
|
UI_KEY_GETOVERSTRIKEMODE,
|
||||||
UI_KEY_SETOVERSTRIKEMODE = 38,
|
UI_KEY_SETOVERSTRIKEMODE,
|
||||||
UI_KEY_CLEARSTATES = 39,
|
UI_KEY_CLEARSTATES,
|
||||||
UI_KEY_GETCATCHER = 40,
|
UI_KEY_GETCATCHER,
|
||||||
UI_KEY_SETCATCHER = 41,
|
UI_KEY_SETCATCHER,
|
||||||
UI_GETCLIPBOARDDATA = 42,
|
UI_GETCLIPBOARDDATA,
|
||||||
UI_GETGLCONFIG = 43,
|
UI_GETGLCONFIG,
|
||||||
UI_GETCLIENTSTATE = 44,
|
UI_GETCLIENTSTATE,
|
||||||
UI_GETCONFIGSTRING = 45,
|
UI_GETCONFIGSTRING,
|
||||||
UI_LAN_GETPINGQUEUECOUNT = 46,
|
UI_LAN_GETPINGQUEUECOUNT,
|
||||||
UI_LAN_CLEARPING = 47,
|
UI_LAN_CLEARPING,
|
||||||
UI_LAN_GETPING = 48,
|
UI_LAN_GETPING,
|
||||||
UI_LAN_GETPINGINFO = 49,
|
UI_LAN_GETPINGINFO,
|
||||||
UI_CVAR_REGISTER = 50,
|
UI_CVAR_REGISTER,
|
||||||
UI_CVAR_UPDATE = 51,
|
UI_CVAR_UPDATE,
|
||||||
UI_MEMORY_REMAINING = 52,
|
UI_MEMORY_REMAINING,
|
||||||
UI_GET_CDKEY = 53,
|
UI_GET_CDKEY,
|
||||||
UI_SET_CDKEY = 54,
|
UI_SET_CDKEY,
|
||||||
UI_R_REGISTERFONT = 55,
|
UI_R_REGISTERFONT,
|
||||||
UI_R_MODELBOUNDS = 56,
|
UI_R_MODELBOUNDS,
|
||||||
UI_PC_ADD_GLOBAL_DEFINE = 57,
|
UI_PC_ADD_GLOBAL_DEFINE,
|
||||||
UI_PC_LOAD_SOURCE = 58,
|
UI_PC_LOAD_SOURCE,
|
||||||
UI_PC_FREE_SOURCE = 59,
|
UI_PC_FREE_SOURCE,
|
||||||
UI_PC_READ_TOKEN = 60,
|
UI_PC_READ_TOKEN,
|
||||||
UI_PC_SOURCE_FILE_AND_LINE = 61,
|
UI_PC_SOURCE_FILE_AND_LINE,
|
||||||
UI_S_STOPBACKGROUNDTRACK = 62,
|
UI_S_STOPBACKGROUNDTRACK,
|
||||||
UI_S_STARTBACKGROUNDTRACK = 63,
|
UI_S_STARTBACKGROUNDTRACK,
|
||||||
UI_REAL_TIME = 64,
|
UI_REAL_TIME,
|
||||||
UI_LAN_GETSERVERCOUNT = 65,
|
UI_LAN_GETSERVERCOUNT,
|
||||||
UI_LAN_GETSERVERADDRESSSTRING = 66,
|
UI_LAN_GETSERVERADDRESSSTRING,
|
||||||
UI_LAN_GETSERVERINFO = 67,
|
UI_LAN_GETSERVERINFO,
|
||||||
UI_LAN_MARKSERVERVISIBLE = 68,
|
UI_LAN_MARKSERVERVISIBLE,
|
||||||
UI_LAN_UPDATEVISIBLEPINGS = 69,
|
UI_LAN_UPDATEVISIBLEPINGS,
|
||||||
UI_LAN_RESETPINGS = 70,
|
UI_LAN_RESETPINGS,
|
||||||
UI_LAN_LOADCACHEDSERVERS = 71,
|
UI_LAN_LOADCACHEDSERVERS,
|
||||||
UI_LAN_SAVECACHEDSERVERS = 72,
|
UI_LAN_SAVECACHEDSERVERS,
|
||||||
UI_LAN_ADDSERVER = 73,
|
UI_LAN_ADDSERVER,
|
||||||
UI_LAN_REMOVESERVER = 74,
|
UI_LAN_REMOVESERVER,
|
||||||
UI_CIN_PLAYCINEMATIC = 75,
|
UI_CIN_PLAYCINEMATIC,
|
||||||
UI_CIN_STOPCINEMATIC = 76,
|
UI_CIN_STOPCINEMATIC,
|
||||||
UI_CIN_RUNCINEMATIC = 77,
|
UI_CIN_RUNCINEMATIC,
|
||||||
UI_CIN_DRAWCINEMATIC = 78,
|
UI_CIN_DRAWCINEMATIC,
|
||||||
UI_CIN_SETEXTENTS = 79,
|
UI_CIN_SETEXTENTS,
|
||||||
UI_R_REMAP_SHADER = 80,
|
UI_R_REMAP_SHADER,
|
||||||
UI_VERIFY_CDKEY = 81,
|
UI_VERIFY_CDKEY,
|
||||||
UI_LAN_SERVERSTATUS = 82,
|
UI_LAN_SERVERSTATUS,
|
||||||
UI_LAN_GETSERVERPING = 83,
|
UI_LAN_GETSERVERPING,
|
||||||
UI_LAN_SERVERISVISIBLE = 84,
|
UI_LAN_SERVERISVISIBLE,
|
||||||
UI_LAN_COMPARESERVERS = 85,
|
UI_LAN_COMPARESERVERS,
|
||||||
// 1.32
|
// 1.32
|
||||||
UI_FS_SEEK = 86,
|
UI_FS_SEEK,
|
||||||
UI_SET_PBCLSTATUS = 87,
|
UI_SET_PBCLSTATUS,
|
||||||
|
|
||||||
UI_MEMSET = 100,
|
UI_MEMSET = 100,
|
||||||
UI_MEMCPY,
|
UI_MEMCPY,
|
||||||
|
@ -177,7 +237,6 @@ typedef enum {
|
||||||
UI_FLOOR,
|
UI_FLOOR,
|
||||||
UI_CEIL,
|
UI_CEIL,
|
||||||
|
|
||||||
|
|
||||||
UI_CACHE_PIC = 500,
|
UI_CACHE_PIC = 500,
|
||||||
UI_PICFROMWAD = 501,
|
UI_PICFROMWAD = 501,
|
||||||
UI_GETPLAYERINFO = 502,
|
UI_GETPLAYERINFO = 502,
|
||||||
|
@ -185,4 +244,4 @@ typedef enum {
|
||||||
UI_GETVIDINFO = 504,
|
UI_GETVIDINFO = 504,
|
||||||
UI_GET_STRING = 510,
|
UI_GET_STRING = 510,
|
||||||
|
|
||||||
} ui_builtinnum_t;
|
} uiImport_t;
|
||||||
|
|
|
@ -151,6 +151,13 @@ int Z_Allocated(void)
|
||||||
return used;
|
return used;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Z_MemSize(void *c)
|
||||||
|
{
|
||||||
|
zone_t *nz;
|
||||||
|
nz = ((zone_t *)((char*)c-ZONEDEBUG))-1;
|
||||||
|
return nz->size;
|
||||||
|
}
|
||||||
|
|
||||||
void VARGS Z_Free (void *c)
|
void VARGS Z_Free (void *c)
|
||||||
{
|
{
|
||||||
zone_t *nz;
|
zone_t *nz;
|
||||||
|
|
|
@ -2197,7 +2197,7 @@ void R_DrawMeshBumpmap(mesh_t *mesh, galiastexnum_t *skin, vec3_t lightdir)
|
||||||
//so we use a cubemap, which has the added advantage of normalizing the light dir for us.
|
//so we use a cubemap, which has the added advantage of normalizing the light dir for us.
|
||||||
|
|
||||||
//the bumpmap we use is tangent-space (so I'm told)
|
//the bumpmap we use is tangent-space (so I'm told)
|
||||||
qglDepthFunc(GL_LEQUAL);
|
qglDepthFunc(gldepthfunc);
|
||||||
qglDepthMask(0);
|
qglDepthMask(0);
|
||||||
if (gldepthmin == 0.5)
|
if (gldepthmin == 0.5)
|
||||||
qglCullFace ( GL_BACK );
|
qglCullFace ( GL_BACK );
|
||||||
|
|
|
@ -274,6 +274,42 @@ unsigned int r_numtris;
|
||||||
unsigned int r_numflushes;
|
unsigned int r_numflushes;
|
||||||
int r_backendStart;
|
int r_backendStart;
|
||||||
|
|
||||||
|
int r_dlighttexture;
|
||||||
|
|
||||||
|
void R_InitDynamicLightTexture (void)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
int dx2, dy, d;
|
||||||
|
qbyte data[64*64*4];
|
||||||
|
|
||||||
|
//
|
||||||
|
// dynamic light texture
|
||||||
|
//
|
||||||
|
|
||||||
|
for (x = 0; x < 64; x++)
|
||||||
|
{
|
||||||
|
dx2 = x - 32;
|
||||||
|
dx2 = dx2 * dx2 + 8;
|
||||||
|
|
||||||
|
for (y = 0; y < 64; y++)
|
||||||
|
{
|
||||||
|
dy = y - 32;
|
||||||
|
d = (int)(65536.0f * ((1.0f / (dx2 + dy * dy + 32.0f)) - 0.0005) + 0.5f);
|
||||||
|
if ( d < 50 ) d = 0; else if ( d > 255 ) d = 255;
|
||||||
|
|
||||||
|
data[(y*64 + x) * 4 + 0] = d;
|
||||||
|
data[(y*64 + x) * 4 + 1] = d;
|
||||||
|
data[(y*64 + x) * 4 + 2] = d;
|
||||||
|
data[(y*64 + x) * 4 + 3] = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r_dlighttexture = GL_LoadTexture32("", 64, 64, (unsigned int*)data, true, false);
|
||||||
|
|
||||||
|
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||||
|
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
|
}
|
||||||
|
|
||||||
void R_ResetTexState (void)
|
void R_ResetTexState (void)
|
||||||
{
|
{
|
||||||
coordsArray = inCoordsArray;
|
coordsArray = inCoordsArray;
|
||||||
|
@ -494,6 +530,8 @@ void R_BackendInit (void)
|
||||||
r_sawtoothtable[i] = t;
|
r_sawtoothtable[i] = t;
|
||||||
r_inversesawtoothtable[i] = 1.0 - t;
|
r_inversesawtoothtable[i] = 1.0 - t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
R_InitDynamicLightTexture();
|
||||||
}
|
}
|
||||||
|
|
||||||
qboolean varrayactive;
|
qboolean varrayactive;
|
||||||
|
@ -2211,6 +2249,118 @@ void R_DrawNormals (void)
|
||||||
qglEnable( GL_TEXTURE_2D );
|
qglEnable( GL_TEXTURE_2D );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
R_AddDynamicLights
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void R_AddDynamicLights ( meshbuffer_t *mb )
|
||||||
|
{
|
||||||
|
dlight_t *light;
|
||||||
|
int i, j, lnum;
|
||||||
|
vec3_t point, tvec, dlorigin;
|
||||||
|
vec3_t vright, vup;
|
||||||
|
vec3_t dir1, dir2, normal, right, up, oldnormal;
|
||||||
|
float *v[3], dist, scale;
|
||||||
|
index_t *oldIndexesArray, index[3];
|
||||||
|
int dlightNumIndexes, oldNumIndexes;
|
||||||
|
|
||||||
|
oldNumIndexes = numIndexes;
|
||||||
|
oldIndexesArray = indexesArray;
|
||||||
|
VectorClear ( oldnormal );
|
||||||
|
|
||||||
|
GL_Bind ( r_dlighttexture );
|
||||||
|
|
||||||
|
qglDepthFunc ( GL_EQUAL );
|
||||||
|
qglBlendFunc ( GL_DST_COLOR, GL_ONE );
|
||||||
|
GL_TexEnv(GL_MODULATE);
|
||||||
|
|
||||||
|
light = cl_dlights;
|
||||||
|
for ( lnum = 0; lnum < 32; lnum++, light++ )
|
||||||
|
{
|
||||||
|
if ( !(mb->dlightbits & (1<<lnum) ) )
|
||||||
|
continue; // not lit by this light
|
||||||
|
if (!light->radius)
|
||||||
|
continue; //urm
|
||||||
|
|
||||||
|
VectorSubtract ( light->origin, currententity->origin, dlorigin );
|
||||||
|
if ( !Matrix3_Compare (currententity->axis, axisDefault) )
|
||||||
|
{
|
||||||
|
VectorCopy ( dlorigin, point );
|
||||||
|
Matrix3_Multiply_Vec3 ( currententity->axis, point, dlorigin );
|
||||||
|
}
|
||||||
|
|
||||||
|
qglColor4f (light->color[0]*2, light->color[1]*2, light->color[2]*2,
|
||||||
|
1);//light->color[3]);
|
||||||
|
|
||||||
|
R_ResetTexState ();
|
||||||
|
dlightNumIndexes = 0;
|
||||||
|
|
||||||
|
for ( i = 0; i < oldNumIndexes; i += 3 )
|
||||||
|
{
|
||||||
|
index[0] = oldIndexesArray[i+0];
|
||||||
|
index[1] = oldIndexesArray[i+1];
|
||||||
|
index[2] = oldIndexesArray[i+2];
|
||||||
|
|
||||||
|
v[0] = (float *)(vertexArray + index[0]);
|
||||||
|
v[1] = (float *)(vertexArray + index[1]);
|
||||||
|
v[2] = (float *)(vertexArray + index[2]);
|
||||||
|
|
||||||
|
// calculate two mostly perpendicular edge directions
|
||||||
|
VectorSubtract ( v[0], v[1], dir1 );
|
||||||
|
VectorSubtract ( v[2], v[1], dir2 );
|
||||||
|
|
||||||
|
// we have two edge directions, we can calculate a third vector from
|
||||||
|
// them, which is the direction of the surface normal
|
||||||
|
CrossProduct ( dir1, dir2, normal );
|
||||||
|
VectorNormalize ( normal );
|
||||||
|
|
||||||
|
VectorSubtract ( v[0], dlorigin, tvec );
|
||||||
|
dist = DotProduct ( tvec, normal );
|
||||||
|
if ( dist < 0 )
|
||||||
|
dist = -dist;
|
||||||
|
if ( dist >= light->radius ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
VectorMA ( dlorigin, -dist, normal, point );
|
||||||
|
scale = 1 / (light->radius - dist);
|
||||||
|
|
||||||
|
if ( !VectorCompare (normal, oldnormal) ) {
|
||||||
|
MakeNormalVectors ( normal, right, up );
|
||||||
|
VectorCopy ( normal, oldnormal );
|
||||||
|
}
|
||||||
|
|
||||||
|
VectorScale ( right, scale, vright );
|
||||||
|
VectorScale ( up, scale, vup );
|
||||||
|
|
||||||
|
for ( j = 0; j < 3; j++ )
|
||||||
|
{
|
||||||
|
// Get our texture coordinates
|
||||||
|
// Project the light image onto the face
|
||||||
|
VectorSubtract( v[j], point, tvec );
|
||||||
|
|
||||||
|
coordsArray[index[j]][0] = DotProduct( tvec, vright ) + 0.5f;
|
||||||
|
coordsArray[index[j]][1] = DotProduct( tvec, vup ) + 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
tempIndexesArray[dlightNumIndexes++] = index[0];
|
||||||
|
tempIndexesArray[dlightNumIndexes++] = index[1];
|
||||||
|
tempIndexesArray[dlightNumIndexes++] = index[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( dlightNumIndexes ) {
|
||||||
|
R_PushIndexes ( tempIndexesArray, NULL, NULL, dlightNumIndexes, MF_NONBATCHED );
|
||||||
|
R_FlushArrays ();
|
||||||
|
dlightNumIndexes = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
numIndexes = oldNumIndexes;
|
||||||
|
indexesArray = oldIndexesArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
R_FinishMeshBuffer
|
R_FinishMeshBuffer
|
||||||
|
@ -2236,12 +2386,13 @@ void R_FinishMeshBuffer ( meshbuffer_t *mb )
|
||||||
qglDisable ( GL_ALPHA_TEST );
|
qglDisable ( GL_ALPHA_TEST );
|
||||||
qglDepthMask ( GL_FALSE );
|
qglDepthMask ( GL_FALSE );
|
||||||
|
|
||||||
//FIZME
|
if (dlight && (currententity->model->type == mod_brush && currententity->model->fromgame == fg_quake3)) //HACK: the extra check is because we play with the lightmaps in q1/q2
|
||||||
// if ( dlight ) {
|
{
|
||||||
// R_AddDynamicLights ( mb );
|
R_AddDynamicLights ( mb );
|
||||||
// }
|
}
|
||||||
|
|
||||||
if ( fogged ) {
|
if (fogged)
|
||||||
|
{
|
||||||
R_RenderFogOnMesh ( shader, mb->fog );
|
R_RenderFogOnMesh ( shader, mb->fog );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -742,7 +742,7 @@ TRACE(("dbg: GLDraw_ReInit: Allocating upload buffers\n"));
|
||||||
// add ocrana leds
|
// add ocrana leds
|
||||||
if (con_ocranaleds.value)
|
if (con_ocranaleds.value)
|
||||||
{
|
{
|
||||||
if (con_ocranaleds.value != 2 || CRC_Block(draw_chars, 128*128) == 798)
|
if (con_ocranaleds.value != 2 || QCRC_Block(draw_chars, 128*128) == 798)
|
||||||
AddOcranaLEDsIndexed (draw_chars, 128, 128);
|
AddOcranaLEDsIndexed (draw_chars, 128, 128);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1088,12 +1088,12 @@ void GLDraw_Init (void)
|
||||||
|
|
||||||
memset(scrap_allocated, 0, sizeof(scrap_allocated));
|
memset(scrap_allocated, 0, sizeof(scrap_allocated));
|
||||||
|
|
||||||
R_BackendInit();
|
|
||||||
|
|
||||||
Cmd_AddRemCommand ("gl_texturemode", &GLDraw_TextureMode_f);
|
Cmd_AddRemCommand ("gl_texturemode", &GLDraw_TextureMode_f);
|
||||||
|
|
||||||
GLDraw_ReInit();
|
GLDraw_ReInit();
|
||||||
|
|
||||||
|
R_BackendInit();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
draw_mesh.numindexes = 6;
|
draw_mesh.numindexes = 6;
|
||||||
|
@ -1554,11 +1554,16 @@ void GLDraw_ShaderImage (int x, int y, int w, int h, float s1, float t1, float s
|
||||||
*/
|
*/
|
||||||
draw_mesh.colors_array = draw_mesh_colors;
|
draw_mesh.colors_array = draw_mesh_colors;
|
||||||
|
|
||||||
R_PushMesh(&draw_mesh, mb.shader->features | MF_COLORS | MF_NONBATCHED);
|
__try
|
||||||
R_RenderMeshBuffer ( &mb, false );
|
{
|
||||||
draw_mesh.colors_array = NULL;
|
R_PushMesh(&draw_mesh, mb.shader->features | MF_COLORS | MF_NONBATCHED);
|
||||||
|
R_RenderMeshBuffer ( &mb, false );
|
||||||
qglEnable(GL_BLEND);
|
draw_mesh.colors_array = NULL;
|
||||||
|
qglEnable(GL_BLEND);
|
||||||
|
} __except(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -102,9 +102,9 @@ void Mod_LoadHLModel (model_t *mod, void *buffer)
|
||||||
int len;
|
int len;
|
||||||
char st[40];
|
char st[40];
|
||||||
|
|
||||||
CRC_Init(&crc);
|
QCRC_Init(&crc);
|
||||||
for (len = com_filesize, p = buffer; len; len--, p++)
|
for (len = com_filesize, p = buffer; len; len--, p++)
|
||||||
CRC_ProcessByte(&crc, *p);
|
QCRC_ProcessByte(&crc, *p);
|
||||||
|
|
||||||
sprintf(st, "%d", (int) crc);
|
sprintf(st, "%d", (int) crc);
|
||||||
Info_SetValueForKey (cls.userinfo,
|
Info_SetValueForKey (cls.userinfo,
|
||||||
|
|
|
@ -574,6 +574,9 @@ couldntload:
|
||||||
case (('O'<<24)+('M'<<16)+('Y'<<8)+'Z'):
|
case (('O'<<24)+('M'<<16)+('Y'<<8)+'Z'):
|
||||||
GLMod_LoadZymoticModel(mod, buf);
|
GLMod_LoadZymoticModel(mod, buf);
|
||||||
break;
|
break;
|
||||||
|
case (('K'<<24)+('R'<<16)+('A'<<8)+'D'):
|
||||||
|
GLMod_LoadDarkPlacesModel(mod, buf);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
//check for text based headers
|
//check for text based headers
|
||||||
|
@ -1213,9 +1216,9 @@ void GLMod_LoadLighting (lump_t *l)
|
||||||
loadmodel->engineflags &= ~MDLF_RGBLIGHTING;
|
loadmodel->engineflags &= ~MDLF_RGBLIGHTING;
|
||||||
|
|
||||||
//lit file light intensity is made to match the world's light intensity.
|
//lit file light intensity is made to match the world's light intensity.
|
||||||
if (cls.allow_lightmapgamma)
|
// if (cls.allow_lightmapgamma)
|
||||||
BuildLightMapGammaTable(0.6, 2);
|
// BuildLightMapGammaTable(0.6, 2);
|
||||||
else
|
// else
|
||||||
BuildLightMapGammaTable(1, 1);
|
BuildLightMapGammaTable(1, 1);
|
||||||
|
|
||||||
loadmodel->lightdata = NULL;
|
loadmodel->lightdata = NULL;
|
||||||
|
|
|
@ -1414,6 +1414,7 @@ static void PPL_BaseTextureChain(msurface_t *first)
|
||||||
msurface_t *s;
|
msurface_t *s;
|
||||||
int vi=-1;
|
int vi=-1;
|
||||||
int redraw = false;
|
int redraw = false;
|
||||||
|
int dlb;
|
||||||
|
|
||||||
glRect_t *theRect;
|
glRect_t *theRect;
|
||||||
if (first->texinfo->texture->shader->flags & SHADER_FLARE )
|
if (first->texinfo->texture->shader->flags & SHADER_FLARE )
|
||||||
|
@ -1427,7 +1428,10 @@ static void PPL_BaseTextureChain(msurface_t *first)
|
||||||
mb.mesh = NULL;
|
mb.mesh = NULL;
|
||||||
mb.fog = NULL;
|
mb.fog = NULL;
|
||||||
mb.infokey = -2;
|
mb.infokey = -2;
|
||||||
mb.dlightbits = 0;
|
if (first->dlightframe == r_framecount)
|
||||||
|
mb.dlightbits = first->dlightbits;
|
||||||
|
else
|
||||||
|
mb.dlightbits = 0;
|
||||||
|
|
||||||
GL_DisableMultitexture();
|
GL_DisableMultitexture();
|
||||||
|
|
||||||
|
@ -1480,7 +1484,11 @@ static void PPL_BaseTextureChain(msurface_t *first)
|
||||||
|
|
||||||
if (s->mesh)
|
if (s->mesh)
|
||||||
{
|
{
|
||||||
redraw = mb.fog != s->fog || mb.infokey != vi|| mb.shader->flags&SHADER_DEFORMV_BULGE || R_MeshWillExceed(s->mesh);
|
if (s->dlightframe == r_framecount)
|
||||||
|
dlb = s->dlightbits;
|
||||||
|
else
|
||||||
|
dlb = 0;
|
||||||
|
redraw = mb.dlightbits != dlb || mb.fog != s->fog || mb.infokey != vi|| mb.shader->flags&SHADER_DEFORMV_BULGE || R_MeshWillExceed(s->mesh);
|
||||||
|
|
||||||
if (redraw)
|
if (redraw)
|
||||||
{
|
{
|
||||||
|
@ -1492,6 +1500,7 @@ static void PPL_BaseTextureChain(msurface_t *first)
|
||||||
mb.infokey = vi;
|
mb.infokey = vi;
|
||||||
mb.mesh = s->mesh;
|
mb.mesh = s->mesh;
|
||||||
mb.fog = s->fog;
|
mb.fog = s->fog;
|
||||||
|
mb.dlightbits = dlb;
|
||||||
R_PushMesh(s->mesh, mb.shader->features);
|
R_PushMesh(s->mesh, mb.shader->features);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4385,7 +4394,7 @@ qboolean PPL_AddLight(dlight_t *dl)
|
||||||
qglDisable(GL_TEXTURE_2D);
|
qglDisable(GL_TEXTURE_2D);
|
||||||
qglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
qglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||||
qglEnable(GL_SCISSOR_TEST);
|
qglEnable(GL_SCISSOR_TEST);
|
||||||
// if (!((int)r_shadows.value & 4))
|
if (!((int)r_shadows.value & 4))
|
||||||
{
|
{
|
||||||
qglDisable(GL_BLEND);
|
qglDisable(GL_BLEND);
|
||||||
qglColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
|
qglColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
|
||||||
|
|
|
@ -377,7 +377,7 @@ void GLR_PushDlights (void)
|
||||||
r_dlightframecount = r_framecount + 1; // because the count hasn't
|
r_dlightframecount = r_framecount + 1; // because the count hasn't
|
||||||
// advanced yet for this frame
|
// advanced yet for this frame
|
||||||
|
|
||||||
if (!r_dynamic.value)
|
if (!r_dynamic.value || !cl.worldmodel)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// if (!cl.worldmodel->nodes)
|
// if (!cl.worldmodel->nodes)
|
||||||
|
|
|
@ -914,7 +914,7 @@ void GLR_DrawEntitiesOnList (void)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
if (cls.allow_anyparticles || currententity->visframe) //allowed or static
|
if (cl.lerpents && (cls.allow_anyparticles || currententity->visframe)) //allowed or static
|
||||||
{
|
{
|
||||||
if (gl_part_flame.value)
|
if (gl_part_flame.value)
|
||||||
{
|
{
|
||||||
|
@ -2051,7 +2051,7 @@ Thus the final mirror matrix for any given plane p*<nx,ny,nz>+k=0 is:
|
||||||
gldepthmin = 0.5;
|
gldepthmin = 0.5;
|
||||||
gldepthmax = 1;
|
gldepthmax = 1;
|
||||||
qglDepthRange (gldepthmin, gldepthmax);
|
qglDepthRange (gldepthmin, gldepthmax);
|
||||||
qglDepthFunc (GL_LEQUAL);
|
qglDepthFunc (gldepthfunc);
|
||||||
|
|
||||||
R_RenderScene ();
|
R_RenderScene ();
|
||||||
|
|
||||||
|
@ -2061,7 +2061,7 @@ Thus the final mirror matrix for any given plane p*<nx,ny,nz>+k=0 is:
|
||||||
gldepthmin = 0;
|
gldepthmin = 0;
|
||||||
gldepthmax = 0.5;
|
gldepthmax = 0.5;
|
||||||
qglDepthRange (gldepthmin, gldepthmax);
|
qglDepthRange (gldepthmin, gldepthmax);
|
||||||
qglDepthFunc (GL_LEQUAL);
|
qglDepthFunc (gldepthfunc);
|
||||||
|
|
||||||
|
|
||||||
memcpy(r_refdef.viewangles, oldangles, sizeof(vec3_t));
|
memcpy(r_refdef.viewangles, oldangles, sizeof(vec3_t));
|
||||||
|
|
|
@ -263,6 +263,7 @@ void GLSCR_UpdateScreen (void)
|
||||||
SCR_SetUpToDrawConsole ();
|
SCR_SetUpToDrawConsole ();
|
||||||
|
|
||||||
nohud = false;
|
nohud = false;
|
||||||
|
|
||||||
#ifdef VM_CG
|
#ifdef VM_CG
|
||||||
if (CG_Refresh())
|
if (CG_Refresh())
|
||||||
nohud = true;
|
nohud = true;
|
||||||
|
|
|
@ -62,11 +62,9 @@ vec_t CastRay (vec3_t p1, vec3_t p2)
|
||||||
{
|
{
|
||||||
trace_t trace;
|
trace_t trace;
|
||||||
vec3_t move;
|
vec3_t move;
|
||||||
hull_t *hull;
|
|
||||||
|
|
||||||
hull = &lightmodel->hulls[0];
|
lightmodel->funcs.Trace (lightmodel, 0, 0, p1, p2, vec3_origin, vec3_origin, &trace);
|
||||||
memset (&trace, 0, sizeof(trace));
|
if (trace.fraction < 1)
|
||||||
if (!lightmodel->funcs.Trace (lightmodel, 0, 0, p1, p2, vec3_origin, vec3_origin, &trace))
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
VectorSubtract(p1, p2, move);
|
VectorSubtract(p1, p2, move);
|
||||||
|
|
|
@ -507,9 +507,9 @@ qboolean HTTP_CL_Get(char *url, char *localfile, void (*NotifyFunction)(char *lo
|
||||||
con->NotifyFunction = NotifyFunction;
|
con->NotifyFunction = NotifyFunction;
|
||||||
strcpy(con->filename, localfile);
|
strcpy(con->filename, localfile);
|
||||||
|
|
||||||
/* slash = strchr(con->filename, '?');
|
slash = strchr(con->filename, '?');
|
||||||
if (slash)
|
if (slash)
|
||||||
*slash = '\0';*/
|
*slash = '_';
|
||||||
|
|
||||||
httpcl = con;
|
httpcl = con;
|
||||||
|
|
||||||
|
|
|
@ -444,7 +444,7 @@ IWEBFILE *IWebFOpenWrite(char *name, int append) //fopen(name, append?"ab":"wb"
|
||||||
sprintf(name2, "%s%s", com_gamedir, name);
|
sprintf(name2, "%s%s", com_gamedir, name);
|
||||||
else
|
else
|
||||||
sprintf(name2, "%s/%s", com_gamedir, name);
|
sprintf(name2, "%s/%s", com_gamedir, name);
|
||||||
// COM_CreatePath(name2);
|
COM_CreatePath(name2);
|
||||||
f = fopen(name2, append?"ab":"wb");
|
f = fopen(name2, append?"ab":"wb");
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,6 +57,11 @@ pbool PreCompile(void)
|
||||||
qccClearHunk();
|
qccClearHunk();
|
||||||
strcpy(qcc_gamedir, "");
|
strcpy(qcc_gamedir, "");
|
||||||
qcchunk = malloc(qcchunksize=128*1024*1024);
|
qcchunk = malloc(qcchunksize=128*1024*1024);
|
||||||
|
while(!qcchunk && qcchunksize > 8*1024*1024)
|
||||||
|
{
|
||||||
|
qcchunksize /= 2;
|
||||||
|
qcchunk = malloc(qcchunksize);
|
||||||
|
}
|
||||||
qccalloced=0;
|
qccalloced=0;
|
||||||
|
|
||||||
return !!qcchunk;
|
return !!qcchunk;
|
||||||
|
|
|
@ -311,7 +311,6 @@ typedef struct QCC_type_s
|
||||||
unsigned int ofs; //inside a structure.
|
unsigned int ofs; //inside a structure.
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
} QCC_type_t;
|
} QCC_type_t;
|
||||||
int typecmp(QCC_type_t *a, QCC_type_t *b);
|
int typecmp(QCC_type_t *a, QCC_type_t *b);
|
||||||
|
|
||||||
|
|
|
@ -3026,6 +3026,12 @@ QCC_def_t *QCC_MemberInParentClass(char *name, QCC_type_t *clas)
|
||||||
//FIXME: virtual methods will not work properly. Need to trace down to see if a parent already defined it
|
//FIXME: virtual methods will not work properly. Need to trace down to see if a parent already defined it
|
||||||
void QCC_PR_EmitFieldsForMembers(QCC_type_t *clas)
|
void QCC_PR_EmitFieldsForMembers(QCC_type_t *clas)
|
||||||
{
|
{
|
||||||
|
//we created fields for each class when we defined the actual classes.
|
||||||
|
//we need to go through each member and match it to the offset of it's parent class, if overloaded, or create a new field if not..
|
||||||
|
|
||||||
|
//basictypefield is cleared before we do this
|
||||||
|
//we emit the parent's fields first (every time), thus ensuring that we don't reuse parent fields on a child class.
|
||||||
|
|
||||||
char membername[2048];
|
char membername[2048];
|
||||||
int p, np, a;
|
int p, np, a;
|
||||||
unsigned int o;
|
unsigned int o;
|
||||||
|
@ -3058,6 +3064,7 @@ void QCC_PR_EmitFieldsForMembers(QCC_type_t *clas)
|
||||||
ft = QCC_PR_NewType(basictypenames[mt->type], ev_field);
|
ft = QCC_PR_NewType(basictypenames[mt->type], ev_field);
|
||||||
ft->aux_type = QCC_PR_NewType(basictypenames[mt->type], mt->type);
|
ft->aux_type = QCC_PR_NewType(basictypenames[mt->type], mt->type);
|
||||||
ft->aux_type->aux_type = type_void;
|
ft->aux_type->aux_type = type_void;
|
||||||
|
ft->size = ft->aux_type->size;
|
||||||
ft = QCC_PR_FindType(ft);
|
ft = QCC_PR_FindType(ft);
|
||||||
sprintf(membername, "__f_%s_%i", ft->name, ++basictypefield[mt->type]);
|
sprintf(membername, "__f_%s_%i", ft->name, ++basictypefield[mt->type]);
|
||||||
f = QCC_PR_GetDef(ft, membername, NULL, true, 1);
|
f = QCC_PR_GetDef(ft, membername, NULL, true, 1);
|
||||||
|
@ -3143,13 +3150,13 @@ void QCC_PR_EmitClassFromFunction(QCC_def_t *scope, char *tname)
|
||||||
df->s_name = 0;
|
df->s_name = 0;
|
||||||
df->first_statement = numstatements;
|
df->first_statement = numstatements;
|
||||||
df->parm_size[0] = 1;
|
df->parm_size[0] = 1;
|
||||||
df->numparms = 1;
|
df->numparms = 0;
|
||||||
df->parm_start = numpr_globals;
|
df->parm_start = numpr_globals;
|
||||||
|
|
||||||
G_FUNCTION(scope->ofs) = df - functions;
|
G_FUNCTION(scope->ofs) = df - functions;
|
||||||
|
|
||||||
//locals here...
|
//locals here...
|
||||||
ed = QCC_PR_GetDef(type_entity, "ent", NULL, true, 1);
|
ed = QCC_PR_GetDef(type_entity, "ent", pr_scope, true, 1);
|
||||||
|
|
||||||
virt = QCC_PR_GetDef(type_function, "spawn", NULL, false, 0);
|
virt = QCC_PR_GetDef(type_function, "spawn", NULL, false, 0);
|
||||||
if (!virt)
|
if (!virt)
|
||||||
|
@ -3173,7 +3180,8 @@ void QCC_PR_EmitClassFromFunction(QCC_def_t *scope, char *tname)
|
||||||
QCC_FreeTemp(QCC_PR_Statement(&pr_opcodes[OP_STORE_ENT], oself, self, NULL));
|
QCC_FreeTemp(QCC_PR_Statement(&pr_opcodes[OP_STORE_ENT], oself, self, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
QCC_FreeTemp(QCC_PR_Statement(&pr_opcodes[OP_RETURN], &def_ret, NULL, NULL)); //apparently we do actually have to return something. *sigh*...
|
QCC_FreeTemp(QCC_PR_Statement(&pr_opcodes[OP_RETURN], ed, NULL, NULL)); //apparently we do actually have to return something. *sigh*...
|
||||||
|
QCC_FreeTemp(QCC_PR_Statement(&pr_opcodes[OP_DONE], NULL, NULL, NULL));
|
||||||
|
|
||||||
|
|
||||||
pr_scope = NULL;
|
pr_scope = NULL;
|
||||||
|
@ -4835,9 +4843,11 @@ void QCC_PR_ParseStatement (void)
|
||||||
|
|
||||||
if (QCC_PR_CheckKeyword(keyword_local, "local"))
|
if (QCC_PR_CheckKeyword(keyword_local, "local"))
|
||||||
{
|
{
|
||||||
|
QCC_type_t *functionsclasstype = pr_classtype;
|
||||||
// if (locals_end != numpr_globals) //is this breaking because of locals?
|
// if (locals_end != numpr_globals) //is this breaking because of locals?
|
||||||
// QCC_PR_ParseWarning("local vars after temp vars\n");
|
// QCC_PR_ParseWarning("local vars after temp vars\n");
|
||||||
QCC_PR_ParseDefs (NULL);
|
QCC_PR_ParseDefs (NULL);
|
||||||
|
pr_classtype = functionsclasstype;
|
||||||
locals_end = numpr_globals;
|
locals_end = numpr_globals;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,6 +167,8 @@ void QCC_FindBestInclude(char *newfile, char *currentfile, char *rootpath)
|
||||||
if (!*newfile)
|
if (!*newfile)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
currentfile += strlen(rootpath); //could this be bad?
|
||||||
|
|
||||||
for(stripfrom = currentfile+strlen(currentfile)-1; stripfrom>currentfile; stripfrom--)
|
for(stripfrom = currentfile+strlen(currentfile)-1; stripfrom>currentfile; stripfrom--)
|
||||||
{
|
{
|
||||||
if (*stripfrom == '/' || *stripfrom == '\\')
|
if (*stripfrom == '/' || *stripfrom == '\\')
|
||||||
|
@ -2612,7 +2614,6 @@ char *TypeName(QCC_type_t *type)
|
||||||
}
|
}
|
||||||
else if (type->type == ev_entity && type->parentclass)
|
else if (type->type == ev_entity && type->parentclass)
|
||||||
{
|
{
|
||||||
op++;
|
|
||||||
ret = buffer[op&1];
|
ret = buffer[op&1];
|
||||||
*ret = 0;
|
*ret = 0;
|
||||||
strcat(ret, "class ");
|
strcat(ret, "class ");
|
||||||
|
@ -2995,10 +2996,11 @@ QCC_type_t *QCC_PR_ParseType (int newtype)
|
||||||
sprintf(membername, "%s::"MEMBERFIELDNAME, classname, newparm->name);
|
sprintf(membername, "%s::"MEMBERFIELDNAME, classname, newparm->name);
|
||||||
fieldtype = QCC_PR_NewType(newparm->name, ev_field);
|
fieldtype = QCC_PR_NewType(newparm->name, ev_field);
|
||||||
fieldtype->aux_type = newparm;
|
fieldtype->aux_type = newparm;
|
||||||
|
fieldtype->size = newparm->size;
|
||||||
QCC_PR_GetDef(fieldtype, membername, pr_scope, 2, 1);
|
QCC_PR_GetDef(fieldtype, membername, pr_scope, 2, 1);
|
||||||
|
|
||||||
|
|
||||||
newparm->ofs = newt->size;
|
newparm->ofs = 0;//newt->size;
|
||||||
newt->num_parms++;
|
newt->num_parms++;
|
||||||
|
|
||||||
if (type)
|
if (type)
|
||||||
|
|
|
@ -42,7 +42,7 @@ QCC_type_t *QCC_PR_NewType (char *name, int basictype);
|
||||||
|
|
||||||
jmp_buf decompilestatementfailure;
|
jmp_buf decompilestatementfailure;
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
pbool Decompile(progfuncs_t *progfuncs, char *fname)
|
pbool Decompile(progfuncs_t *progfuncs, char *fname)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -101,7 +101,7 @@ char *VarAtOfs(progfuncs_t *progfuncs, int ofs)
|
||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
if (!*def->s_name || !strcmp(def->s_name, "IMMEDIATE"))
|
if (!def->s_name[progfuncs->stringtable] || !strcmp(progfuncs->stringtable+def->s_name, "IMMEDIATE"))
|
||||||
{
|
{
|
||||||
if (current_progstate->types)
|
if (current_progstate->types)
|
||||||
typen = current_progstate->types[def->type & ~DEF_SHARED].type;
|
typen = current_progstate->types[def->type & ~DEF_SHARED].type;
|
||||||
|
@ -162,7 +162,7 @@ evaluateimmediate:
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return def->s_name;
|
return def->s_name+progfuncs->stringtable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -296,10 +296,10 @@ void WriteStatementProducingOfs(progfuncs_t *progfuncs, progstate_t *progs, int
|
||||||
def = ED_GlobalAtOfs16(progfuncs, ofs);
|
def = ED_GlobalAtOfs16(progfuncs, ofs);
|
||||||
if (def)
|
if (def)
|
||||||
{
|
{
|
||||||
if (!strcmp(def->s_name, "IMMEDIATE"))
|
if (!strcmp(def->s_name+progfuncs->stringtable, "IMMEDIATE"))
|
||||||
writes(file, "%s", VarAtOfs(progfuncs, ofs));
|
writes(file, "%s", VarAtOfs(progfuncs, ofs));
|
||||||
else
|
else
|
||||||
writes(file, "%s", def->s_name);
|
writes(file, "%s", progfuncs->stringtable+def->s_name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
writes(file, "%s", VarAtOfs(progfuncs, ofs));
|
writes(file, "%s", VarAtOfs(progfuncs, ofs));
|
||||||
|
@ -446,12 +446,12 @@ void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int
|
||||||
writes(f, ", ");
|
writes(f, ", ");
|
||||||
st = (void *)0xffff;
|
st = (void *)0xffff;
|
||||||
|
|
||||||
if (!*def->s_name)
|
if (!def->s_name[progfuncs->stringtable])
|
||||||
{
|
{
|
||||||
char mem[64];
|
char mem[64];
|
||||||
sprintf(mem, "_p_%i", def->ofs);
|
sprintf(mem, "_p_%i", def->ofs);
|
||||||
def->s_name = malloc(strlen(mem)+1);
|
def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
|
||||||
strcpy(def->s_name, mem);
|
strcpy(def->s_name+progfuncs->stringtable, mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_progstate->types)
|
if (current_progstate->types)
|
||||||
|
@ -460,19 +460,19 @@ void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int
|
||||||
switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
|
switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
|
||||||
{
|
{
|
||||||
case ev_string:
|
case ev_string:
|
||||||
writes(f, "%s %s", "string", def->s_name);
|
writes(f, "%s %s", "string", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_float:
|
case ev_float:
|
||||||
writes(f, "%s %s", "float", def->s_name);
|
writes(f, "%s %s", "float", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_entity:
|
case ev_entity:
|
||||||
writes(f, "%s %s", "entity", def->s_name);
|
writes(f, "%s %s", "entity", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_vector:
|
case ev_vector:
|
||||||
writes(f, "%s %s", "vector", def->s_name);
|
writes(f, "%s %s", "vector", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
writes(f, "%s %s", "randomtype", def->s_name);
|
writes(f, "%s %s", "randomtype", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -480,23 +480,23 @@ void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int
|
||||||
for (ofs = progs->functions[num].parm_start+progs->functions[num].numparms, i = progs->functions[num].numparms; i < progs->functions[num].locals; i++, ofs+=1)
|
for (ofs = progs->functions[num].parm_start+progs->functions[num].numparms, i = progs->functions[num].numparms; i < progs->functions[num].locals; i++, ofs+=1)
|
||||||
ofsflags[ofs] |= 4;
|
ofsflags[ofs] |= 4;
|
||||||
|
|
||||||
if (!*progs->functions[num].s_name)
|
if (!progfuncs->stringtable[progs->functions[num].s_name])
|
||||||
{
|
{
|
||||||
char mem[64];
|
char mem[64];
|
||||||
if (!functionname)
|
if (!functionname)
|
||||||
{
|
{
|
||||||
sprintf(mem, "_bi_%i", num);
|
sprintf(mem, "_bi_%i", num);
|
||||||
progs->functions[num].s_name = malloc(strlen(mem)+1);
|
progs->functions[num].s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
|
||||||
strcpy(progs->functions[num].s_name, mem);
|
strcpy(progs->functions[num].s_name+progfuncs->stringtable, mem);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
progs->functions[num].s_name = malloc(strlen(functionname)+1);
|
progs->functions[num].s_name = (char*)malloc(strlen(functionname)+1)-progfuncs->stringtable;
|
||||||
strcpy(progs->functions[num].s_name, functionname);
|
strcpy(progs->functions[num].s_name+progfuncs->stringtable, functionname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
writes(f, ") %s", progs->functions[num].s_name);
|
writes(f, ") %s", progfuncs->stringtable+progs->functions[num].s_name);
|
||||||
|
|
||||||
if (stn < 0)
|
if (stn < 0)
|
||||||
{
|
{
|
||||||
|
@ -561,34 +561,34 @@ void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int
|
||||||
writes(f, "\tlocal %s %s;\r\n", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!*def->s_name)
|
if (!progfuncs->stringtable[def->s_name])
|
||||||
{
|
{
|
||||||
char mem[64];
|
char mem[64];
|
||||||
sprintf(mem, "_l_%i", def->ofs);
|
sprintf(mem, "_l_%i", def->ofs);
|
||||||
def->s_name = malloc(strlen(mem)+1);
|
def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
|
||||||
strcpy(def->s_name, mem);
|
strcpy(def->s_name+progfuncs->stringtable, mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
|
switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
|
||||||
{
|
{
|
||||||
case ev_string:
|
case ev_string:
|
||||||
writes(f, "\tlocal %s %s;\r\n", "string", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "string", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_float:
|
case ev_float:
|
||||||
writes(f, "\tlocal %s %s;\r\n", "float", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "float", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_entity:
|
case ev_entity:
|
||||||
writes(f, "\tlocal %s %s;\r\n", "entity", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "entity", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_vector:
|
case ev_vector:
|
||||||
if (v->vector[0] || v->vector[1] || v->vector[2])
|
if (v->vector[0] || v->vector[1] || v->vector[2])
|
||||||
writes(f, "\tlocal vector %s = '%f %f %f';\r\n", def->s_name, v->vector[0], v->vector[1], v->vector[2]);
|
writes(f, "\tlocal vector %s = '%f %f %f';\r\n", progfuncs->stringtable+def->s_name, v->vector[0], v->vector[1], v->vector[2]);
|
||||||
else
|
else
|
||||||
writes(f, "\tlocal %s %s;\r\n", "vector", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "vector", progfuncs->stringtable+def->s_name);
|
||||||
ofs+=2; //skip floats;
|
ofs+=2; //skip floats;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
writes(f, "\tlocal %s %s;\r\n", "randomtype", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "randomtype", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -659,7 +659,7 @@ void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!strcmp(progs->functions[num].s_name, "SUB_Remove"))
|
if (!strcmp(progfuncs->stringtable+progs->functions[num].s_name, "SUB_Remove"))
|
||||||
file = 0;
|
file = 0;
|
||||||
file = f;
|
file = f;
|
||||||
|
|
||||||
|
@ -677,34 +677,34 @@ void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int
|
||||||
writes(f, "\tlocal %s %s;\r\n", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!*def->s_name)
|
if (!def->s_name[progfuncs->stringtable])
|
||||||
{
|
{
|
||||||
char mem[64];
|
char mem[64];
|
||||||
sprintf(mem, "_l_%i", def->ofs);
|
sprintf(mem, "_l_%i", def->ofs);
|
||||||
def->s_name = malloc(strlen(mem)+1);
|
def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
|
||||||
strcpy(def->s_name, mem);
|
strcpy(def->s_name+progfuncs->stringtable, mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
|
switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
|
||||||
{
|
{
|
||||||
case ev_string:
|
case ev_string:
|
||||||
writes(f, "\tlocal %s %s;\r\n", "string", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "string", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_float:
|
case ev_float:
|
||||||
writes(f, "\tlocal %s %s;\r\n", "float", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "float", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_entity:
|
case ev_entity:
|
||||||
writes(f, "\tlocal %s %s;\r\n", "entity", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "entity", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
case ev_vector:
|
case ev_vector:
|
||||||
if (v->vector[0] || v->vector[1] || v->vector[2])
|
if (v->vector[0] || v->vector[1] || v->vector[2])
|
||||||
writes(f, "\tlocal vector %s = '%f %f %f';\r\n", def->s_name, v->vector[0], v->vector[1], v->vector[2]);
|
writes(f, "\tlocal vector %s = '%f %f %f';\r\n", def->s_name, v->vector[0], v->vector[1], v->vector[2]);
|
||||||
else
|
else
|
||||||
writes(f, "\tlocal %s %s;\r\n", "vector", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "vector",progfuncs->stringtable+def->s_name);
|
||||||
ofs+=2; //skip floats;
|
ofs+=2; //skip floats;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
writes(f, "\tlocal %s %s;\r\n", "randomtype", def->s_name);
|
writes(f, "\tlocal %s %s;\r\n", "randomtype", progfuncs->stringtable+def->s_name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -857,7 +857,7 @@ pbool Decompile(progfuncs_t *progfuncs, char *fname)
|
||||||
|
|
||||||
for (i = 1; i < progs.progs->numglobaldefs; i++)
|
for (i = 1; i < progs.progs->numglobaldefs; i++)
|
||||||
{
|
{
|
||||||
if (!strcmp(pr_globaldefs16[i].s_name, "IMMEDIATE"))
|
if (!strcmp(progfuncs->stringtable+pr_globaldefs16[i].s_name, "IMMEDIATE"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (ofsflags[pr_globaldefs16[i].ofs] & 4)
|
if (ofsflags[pr_globaldefs16[i].ofs] & 4)
|
||||||
|
@ -869,7 +869,7 @@ pbool Decompile(progfuncs_t *progfuncs, char *fname)
|
||||||
type = pr_globaldefs16[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL);
|
type = pr_globaldefs16[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL);
|
||||||
v = (eval_t *)&((int *)progs.globals)[pr_globaldefs16[i].ofs];
|
v = (eval_t *)&((int *)progs.globals)[pr_globaldefs16[i].ofs];
|
||||||
|
|
||||||
if (!*pr_globaldefs16[i].s_name)
|
if (!progfuncs->stringtable[pr_globaldefs16[i].s_name])
|
||||||
{
|
{
|
||||||
char mem[64];
|
char mem[64];
|
||||||
if (ofsflags[pr_globaldefs16[i].ofs] & 3)
|
if (ofsflags[pr_globaldefs16[i].ofs] & 3)
|
||||||
|
@ -879,66 +879,71 @@ pbool Decompile(progfuncs_t *progfuncs, char *fname)
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(mem, "_g_%i", pr_globaldefs16[i].ofs);
|
sprintf(mem, "_g_%i", pr_globaldefs16[i].ofs);
|
||||||
pr_globaldefs16[i].s_name = malloc(strlen(mem)+1);
|
pr_globaldefs16[i].s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
|
||||||
strcpy(pr_globaldefs16[i].s_name, mem);
|
strcpy(pr_globaldefs16[i].s_name+progfuncs->stringtable, mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case ev_void:
|
case ev_void:
|
||||||
writes(f, "void %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "void %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
case ev_string:
|
case ev_string:
|
||||||
if (v->string && *(pr_strings+v->_int))
|
if (v->string && *(pr_strings+v->_int))
|
||||||
writes(f, "string %s = \"%s\";\r\n", pr_globaldefs16[i].s_name, pr_strings+v->_int);
|
writes(f, "string %s = \"%s\";\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, pr_strings+v->_int);
|
||||||
else
|
else
|
||||||
writes(f, "string %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "string %s;\r\n", pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
case ev_float:
|
case ev_float:
|
||||||
if (v->_float)
|
if (v->_float)
|
||||||
writes(f, "float %s = %f;\r\n", pr_globaldefs16[i].s_name, v->_float);
|
writes(f, "float %s = %f;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, v->_float);
|
||||||
else
|
else
|
||||||
writes(f, "float %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "float %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
case ev_vector:
|
case ev_vector:
|
||||||
if (v->vector[0] || v->vector[1] || v->vector[2])
|
if (v->vector[0] || v->vector[1] || v->vector[2])
|
||||||
writes(f, "vector %s = '%f %f %f';\r\n", pr_globaldefs16[i].s_name, v->vector[0], v->vector[1], v->vector[2]);
|
writes(f, "vector %s = '%f %f %f';\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, v->vector[0], v->vector[1], v->vector[2]);
|
||||||
else
|
else
|
||||||
writes(f, "vector %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "vector %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
i+=3;//skip the floats
|
i+=3;//skip the floats
|
||||||
break;
|
break;
|
||||||
case ev_entity:
|
case ev_entity:
|
||||||
writes(f, "entity %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "entity %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
case ev_field:
|
case ev_field:
|
||||||
//wierd
|
//wierd
|
||||||
fld++;
|
fld++;
|
||||||
|
if (!v->_int)
|
||||||
|
writes(f, "var ");
|
||||||
switch(pr_fielddefs16[fld].type)
|
switch(pr_fielddefs16[fld].type)
|
||||||
{
|
{
|
||||||
case ev_string:
|
case ev_string:
|
||||||
writes(f, ".string %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, ".string %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_float:
|
case ev_float:
|
||||||
writes(f, ".float %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_vector:
|
case ev_vector:
|
||||||
writes(f, ".float %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_entity:
|
case ev_entity:
|
||||||
writes(f, ".float %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_function:
|
case ev_function:
|
||||||
writes(f, ".void() %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, ".void() %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
writes(f, "field %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "field %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (v->_int)
|
||||||
|
writes(f, "/* %i */", v->_int);
|
||||||
|
writes(f, "\r\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_function:
|
case ev_function:
|
||||||
|
@ -947,17 +952,17 @@ pbool Decompile(progfuncs_t *progfuncs, char *fname)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_pointer:
|
case ev_pointer:
|
||||||
writes(f, "pointer %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "pointer %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
case ev_integer:
|
case ev_integer:
|
||||||
writes(f, "integer %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "integer %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_union:
|
case ev_union:
|
||||||
writes(f, "union %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "union %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
case ev_struct:
|
case ev_struct:
|
||||||
writes(f, "struct %s;\r\n", pr_globaldefs16[i].s_name);
|
writes(f, "struct %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -698,10 +698,11 @@ void PR_Decompile_f(void)
|
||||||
{
|
{
|
||||||
if (!svprogfuncs)
|
if (!svprogfuncs)
|
||||||
{
|
{
|
||||||
Con_Printf("Progs not running, you need to start a server first\n");
|
Q_SetProgsParms(false);
|
||||||
return;
|
PR_Configure(svprogfuncs, -1, MAX_PROGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (Cmd_Argc() == 1)
|
if (Cmd_Argc() == 1)
|
||||||
svprogfuncs->Decompile(svprogfuncs, "qwprogs.dat");
|
svprogfuncs->Decompile(svprogfuncs, "qwprogs.dat");
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,4 +1,24 @@
|
||||||
// Copyright (C) 1999-2000 Id Software, Inc.
|
/*
|
||||||
|
===========================================================================
|
||||||
|
Copyright (C) 1999-2005 Id Software, Inc.
|
||||||
|
|
||||||
|
This file is part of Quake III Arena source code.
|
||||||
|
|
||||||
|
Quake III Arena source code 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.
|
||||||
|
|
||||||
|
Quake III Arena source code 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 Foobar; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
===========================================================================
|
||||||
|
*/
|
||||||
//
|
//
|
||||||
|
|
||||||
// g_public.h -- game module information visible to server
|
// g_public.h -- game module information visible to server
|
||||||
|
@ -10,12 +30,25 @@
|
||||||
// in entityStates (level eType), so the game must explicitly flag
|
// in entityStates (level eType), so the game must explicitly flag
|
||||||
// special server behaviors
|
// special server behaviors
|
||||||
#define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects
|
#define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects
|
||||||
|
|
||||||
|
// TTimo
|
||||||
|
// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=551
|
||||||
|
#define SVF_CLIENTMASK 0x00000002
|
||||||
|
|
||||||
#define SVF_BOT 0x00000008 // set if the entity is a bot
|
#define SVF_BOT 0x00000008 // set if the entity is a bot
|
||||||
#define SVF_BROADCAST 0x00000020 // send to all connected clients
|
#define SVF_BROADCAST 0x00000020 // send to all connected clients
|
||||||
#define SVF_PORTAL 0x00000040 // merge a second pvs at origin2 into snapshots
|
#define SVF_PORTAL 0x00000040 // merge a second pvs at origin2 into snapshots
|
||||||
#define SVF_USE_CURRENT_ORIGIN 0x00000080 // entity->r.currentOrigin instead of entity->s.origin
|
#define SVF_USE_CURRENT_ORIGIN 0x00000080 // entity->r.currentOrigin instead of entity->s.origin
|
||||||
// for link position (missiles and movers)
|
// for link position (missiles and movers)
|
||||||
#define SVF_SINGLECLIENT 0x00000100 // only send to a single client
|
#define SVF_SINGLECLIENT 0x00000100 // only send to a single client (entityShared_t->singleClient)
|
||||||
|
#define SVF_NOSERVERINFO 0x00000200 // don't send CS_SERVERINFO updates to this client
|
||||||
|
// so that it can be updated for ping tools without
|
||||||
|
// lagging clients
|
||||||
|
#define SVF_CAPSULE 0x00000400 // use capsule for collision detection instead of bbox
|
||||||
|
#define SVF_NOTSINGLECLIENT 0x00000800 // send entity to everyone but one client
|
||||||
|
// (entityShared_t->singleClient)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//===============================================================
|
//===============================================================
|
||||||
|
|
||||||
|
@ -27,7 +60,10 @@ typedef struct {
|
||||||
int linkcount;
|
int linkcount;
|
||||||
|
|
||||||
int svFlags; // SVF_NOCLIENT, SVF_BROADCAST, etc
|
int svFlags; // SVF_NOCLIENT, SVF_BROADCAST, etc
|
||||||
int singleClient; // only send to this client when SVF_SINGLECLIENT is set
|
|
||||||
|
// only send to this client when SVF_SINGLECLIENT is set
|
||||||
|
// if SVF_CLIENTMASK is set, use bitmask for clients to send to (maxclients must be <= 32, up to the mod to enforce this)
|
||||||
|
int singleClient;
|
||||||
|
|
||||||
qboolean bmodel; // if false, assume an explicit mins / maxs bounding box
|
qboolean bmodel; // if false, assume an explicit mins / maxs bounding box
|
||||||
// only set by trap_SetBrushModel
|
// only set by trap_SetBrushModel
|
||||||
|
@ -70,122 +106,128 @@ typedef struct {
|
||||||
typedef enum {
|
typedef enum {
|
||||||
//============== general Quake services ==================
|
//============== general Quake services ==================
|
||||||
|
|
||||||
G_PRINT, // ( const char *string ); 0
|
G_PRINT, // ( const char *string );
|
||||||
// print message on the local console
|
// print message on the local console
|
||||||
|
|
||||||
G_ERROR, // ( const char *string ); 1
|
G_ERROR, // ( const char *string );
|
||||||
// abort the game
|
// abort the game
|
||||||
|
|
||||||
G_MILLISECONDS, // ( void ); 2
|
G_MILLISECONDS, // ( void );
|
||||||
// get current time for profiling reasons
|
// get current time for profiling reasons
|
||||||
// this should NOT be used for any game related tasks,
|
// this should NOT be used for any game related tasks,
|
||||||
// because it is not journaled
|
// because it is not journaled
|
||||||
|
|
||||||
// console variable interaction
|
// console variable interaction
|
||||||
G_CVAR_REGISTER, // ( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags ); 3
|
G_CVAR_REGISTER, // ( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags );
|
||||||
G_CVAR_UPDATE, // ( vmCvar_t *vmCvar ); 4
|
G_CVAR_UPDATE, // ( vmCvar_t *vmCvar );
|
||||||
G_CVAR_SET, // ( const char *var_name, const char *value ); 5
|
G_CVAR_SET, // ( const char *var_name, const char *value );
|
||||||
G_CVAR_VARIABLE_INTEGER_VALUE, // ( const char *var_name ); 6
|
G_CVAR_VARIABLE_INTEGER_VALUE, // ( const char *var_name );
|
||||||
|
|
||||||
G_CVAR_VARIABLE_STRING_BUFFER, // ( const char *var_name, char *buffer, int bufsize ); 7
|
G_CVAR_VARIABLE_STRING_BUFFER, // ( const char *var_name, char *buffer, int bufsize );
|
||||||
|
|
||||||
G_ARGC, // ( void ); 8
|
G_ARGC, // ( void );
|
||||||
// ClientCommand and ServerCommand parameter access
|
// ClientCommand and ServerCommand parameter access
|
||||||
|
|
||||||
G_ARGV, // ( int n, char *buffer, int bufferLength ); 9
|
G_ARGV, // ( int n, char *buffer, int bufferLength );
|
||||||
|
|
||||||
G_FS_FOPEN_FILE, // ( const char *qpath, fileHandle_t *file, fsMode_t mode ); 10
|
G_FS_FOPEN_FILE, // ( const char *qpath, fileHandle_t *file, fsMode_t mode );
|
||||||
G_FS_READ, // ( void *buffer, int len, fileHandle_t f ); 11
|
G_FS_READ, // ( void *buffer, int len, fileHandle_t f );
|
||||||
G_FS_WRITE, // ( const void *buffer, int len, fileHandle_t f ); 12
|
G_FS_WRITE, // ( const void *buffer, int len, fileHandle_t f );
|
||||||
G_FS_FCLOSE_FILE, // ( fileHandle_t f ); 13
|
G_FS_FCLOSE_FILE, // ( fileHandle_t f );
|
||||||
|
|
||||||
G_SEND_CONSOLE_COMMAND, // ( const char *text ); 14
|
G_SEND_CONSOLE_COMMAND, // ( const char *text );
|
||||||
// add commands to the console as if they were typed in
|
// add commands to the console as if they were typed in
|
||||||
// for map changing, etc
|
// for map changing, etc
|
||||||
|
|
||||||
|
|
||||||
//=========== server specific functionality =============
|
//=========== server specific functionality =============
|
||||||
|
|
||||||
G_LOCATE_GAME_DATA, // ( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t, 15
|
G_LOCATE_GAME_DATA, // ( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t,
|
||||||
// playerState_t *clients, int sizeofGameClient );
|
// playerState_t *clients, int sizeofGameClient );
|
||||||
// the game needs to let the server system know where and how big the gentities
|
// the game needs to let the server system know where and how big the gentities
|
||||||
// are, so it can look at them directly without going through an interface
|
// are, so it can look at them directly without going through an interface
|
||||||
|
|
||||||
G_DROP_CLIENT, // ( int clientNum, const char *reason ); 16
|
G_DROP_CLIENT, // ( int clientNum, const char *reason );
|
||||||
// kick a client off the server with a message
|
// kick a client off the server with a message
|
||||||
|
|
||||||
G_SEND_SERVER_COMMAND, // ( int clientNum, const char *fmt, ... ); 17
|
G_SEND_SERVER_COMMAND, // ( int clientNum, const char *fmt, ... );
|
||||||
// reliably sends a command string to be interpreted by the given
|
// reliably sends a command string to be interpreted by the given
|
||||||
// client. If clientNum is -1, it will be sent to all clients
|
// client. If clientNum is -1, it will be sent to all clients
|
||||||
|
|
||||||
G_SET_CONFIGSTRING, // ( int num, const char *string ); 18
|
G_SET_CONFIGSTRING, // ( int num, const char *string );
|
||||||
// config strings hold all the index strings, and various other information
|
// config strings hold all the index strings, and various other information
|
||||||
// that is reliably communicated to all clients
|
// that is reliably communicated to all clients
|
||||||
// All of the current configstrings are sent to clients when
|
// All of the current configstrings are sent to clients when
|
||||||
// they connect, and changes are sent to all connected clients.
|
// they connect, and changes are sent to all connected clients.
|
||||||
// All confgstrings are cleared at each level start.
|
// All confgstrings are cleared at each level start.
|
||||||
|
|
||||||
G_GET_CONFIGSTRING, // ( int num, char *buffer, int bufferSize ); 19
|
G_GET_CONFIGSTRING, // ( int num, char *buffer, int bufferSize );
|
||||||
|
|
||||||
G_GET_USERINFO, // ( int num, char *buffer, int bufferSize ); 20
|
G_GET_USERINFO, // ( int num, char *buffer, int bufferSize );
|
||||||
// userinfo strings are maintained by the server system, so they
|
// userinfo strings are maintained by the server system, so they
|
||||||
// are persistant across level loads, while all other game visible
|
// are persistant across level loads, while all other game visible
|
||||||
// data is completely reset
|
// data is completely reset
|
||||||
|
|
||||||
G_SET_USERINFO, // ( int num, const char *buffer ); 21
|
G_SET_USERINFO, // ( int num, const char *buffer );
|
||||||
|
|
||||||
G_GET_SERVERINFO, // ( char *buffer, int bufferSize ); 22
|
G_GET_SERVERINFO, // ( char *buffer, int bufferSize );
|
||||||
// the serverinfo info string has all the cvars visible to server browsers
|
// the serverinfo info string has all the cvars visible to server browsers
|
||||||
|
|
||||||
G_SET_BRUSH_MODEL, // ( gentity_t *ent, const char *name ); 23
|
G_SET_BRUSH_MODEL, // ( gentity_t *ent, const char *name );
|
||||||
// sets mins and maxs based on the brushmodel name
|
// sets mins and maxs based on the brushmodel name
|
||||||
|
|
||||||
G_TRACE, // ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
|
G_TRACE, // ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
|
||||||
// collision detection against all linked entities 24
|
// collision detection against all linked entities
|
||||||
|
|
||||||
G_POINT_CONTENTS, // ( const vec3_t point, int passEntityNum ); 25
|
G_POINT_CONTENTS, // ( const vec3_t point, int passEntityNum );
|
||||||
// point contents against all linked entities
|
// point contents against all linked entities
|
||||||
|
|
||||||
G_IN_PVS, // ( const vec3_t p1, const vec3_t p2 ); 26
|
G_IN_PVS, // ( const vec3_t p1, const vec3_t p2 );
|
||||||
|
|
||||||
G_IN_PVS_IGNORE_PORTALS, // ( const vec3_t p1, const vec3_t p2 ); 27
|
G_IN_PVS_IGNORE_PORTALS, // ( const vec3_t p1, const vec3_t p2 );
|
||||||
|
|
||||||
G_ADJUST_AREA_PORTAL_STATE, // ( gentity_t *ent, qboolean open ); 28
|
G_ADJUST_AREA_PORTAL_STATE, // ( gentity_t *ent, qboolean open );
|
||||||
|
|
||||||
G_AREAS_CONNECTED, // ( int area1, int area2 ); 29
|
G_AREAS_CONNECTED, // ( int area1, int area2 );
|
||||||
|
|
||||||
G_LINKENTITY, // ( gentity_t *ent ); 30
|
G_LINKENTITY, // ( gentity_t *ent );
|
||||||
// an entity will never be sent to a client or used for collision
|
// an entity will never be sent to a client or used for collision
|
||||||
// if it is not passed to linkentity. If the size, position, or
|
// if it is not passed to linkentity. If the size, position, or
|
||||||
// solidity changes, it must be relinked.
|
// solidity changes, it must be relinked.
|
||||||
|
|
||||||
G_UNLINKENTITY, // ( gentity_t *ent ); 31
|
G_UNLINKENTITY, // ( gentity_t *ent );
|
||||||
// call before removing an interactive entity
|
// call before removing an interactive entity
|
||||||
|
|
||||||
G_ENTITIES_IN_BOX, // ( const vec3_t mins, const vec3_t maxs, gentity_t **list, int maxcount ); 32
|
G_ENTITIES_IN_BOX, // ( const vec3_t mins, const vec3_t maxs, gentity_t **list, int maxcount );
|
||||||
// EntitiesInBox will return brush models based on their bounding box,
|
// EntitiesInBox will return brush models based on their bounding box,
|
||||||
// so exact determination must still be done with EntityContact
|
// so exact determination must still be done with EntityContact
|
||||||
|
|
||||||
G_ENTITY_CONTACT, // ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent ); 33
|
G_ENTITY_CONTACT, // ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent );
|
||||||
// perform an exact check against inline brush models of non-square shape
|
// perform an exact check against inline brush models of non-square shape
|
||||||
|
|
||||||
// access for bots to get and free a server client (FIXME?)
|
// access for bots to get and free a server client (FIXME?)
|
||||||
G_BOT_ALLOCATE_CLIENT, // ( void ); 34
|
G_BOT_ALLOCATE_CLIENT, // ( void );
|
||||||
|
|
||||||
G_BOT_FREE_CLIENT, // ( int clientNum ); 35
|
G_BOT_FREE_CLIENT, // ( int clientNum );
|
||||||
|
|
||||||
G_GET_USERCMD, // ( int clientNum, usercmd_t *cmd ) 36
|
G_GET_USERCMD, // ( int clientNum, usercmd_t *cmd )
|
||||||
|
|
||||||
G_GET_ENTITY_TOKEN, // qboolean ( char *buffer, int bufferSize ) 37
|
G_GET_ENTITY_TOKEN, // qboolean ( char *buffer, int bufferSize )
|
||||||
// Retrieves the next string token from the entity spawn text, returning
|
// Retrieves the next string token from the entity spawn text, returning
|
||||||
// false when all tokens have been parsed.
|
// false when all tokens have been parsed.
|
||||||
// This should only be done at GAME_INIT time.
|
// This should only be done at GAME_INIT time.
|
||||||
|
|
||||||
G_FS_GETFILELIST, // 38
|
G_FS_GETFILELIST,
|
||||||
G_DEBUG_POLYGON_CREATE, // 39
|
G_DEBUG_POLYGON_CREATE,
|
||||||
G_DEBUG_POLYGON_DELETE, // 40
|
G_DEBUG_POLYGON_DELETE,
|
||||||
G_REAL_TIME, // 41
|
G_REAL_TIME,
|
||||||
G_SNAPVECTOR, // 42
|
G_SNAPVECTOR,
|
||||||
|
|
||||||
|
G_TRACECAPSULE, // ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask );
|
||||||
|
G_ENTITY_CONTACTCAPSULE, // ( const vec3_t mins, const vec3_t maxs, const gentity_t *ent );
|
||||||
|
|
||||||
|
// 1.32
|
||||||
|
G_FS_SEEK,
|
||||||
|
|
||||||
G_MEMSET = 100,
|
G_MEMSET = 100,
|
||||||
G_MEMCPY,
|
G_MEMCPY,
|
||||||
|
@ -194,11 +236,11 @@ typedef enum {
|
||||||
G_COS,
|
G_COS,
|
||||||
G_ATAN2,
|
G_ATAN2,
|
||||||
G_SQRT,
|
G_SQRT,
|
||||||
|
G_MATRIXMULTIPLY,
|
||||||
|
G_ANGLEVECTORS,
|
||||||
|
G_PERPENDICULARVECTOR,
|
||||||
G_FLOOR,
|
G_FLOOR,
|
||||||
G_CEIL,
|
G_CEIL,
|
||||||
G_TESTPRINTINT,
|
|
||||||
G_TESTPRINTFLOAT,
|
|
||||||
G_ACOS,
|
|
||||||
|
|
||||||
BOTLIB_SETUP = 200, // ( void );
|
BOTLIB_SETUP = 200, // ( void );
|
||||||
BOTLIB_SHUTDOWN, // ( void );
|
BOTLIB_SHUTDOWN, // ( void );
|
||||||
|
@ -398,3 +440,4 @@ typedef enum {
|
||||||
BOTAI_START_FRAME // ( int time );
|
BOTAI_START_FRAME // ( int time );
|
||||||
} gameExport_t;
|
} gameExport_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -436,7 +436,7 @@ unsigned SV_CheckModel(char *mdl)
|
||||||
buf = (qbyte *)COM_LoadStackFile (mdl, stackbuf, sizeof(stackbuf));
|
buf = (qbyte *)COM_LoadStackFile (mdl, stackbuf, sizeof(stackbuf));
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return 0;
|
return 0;
|
||||||
crc = CRC_Block(buf, com_filesize);
|
crc = QCRC_Block(buf, com_filesize);
|
||||||
// for (len = com_filesize; len; len--, buf++)
|
// for (len = com_filesize; len; len--, buf++)
|
||||||
// CRC_ProcessByte(&crc, *buf);
|
// CRC_ProcessByte(&crc, *buf);
|
||||||
|
|
||||||
|
@ -570,6 +570,12 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us
|
||||||
D_FlushCaches();
|
D_FlushCaches();
|
||||||
cl.worldmodel = NULL;
|
cl.worldmodel = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef Q3SERVER
|
||||||
|
if (newgametype == GT_QUAKE3)
|
||||||
|
SVQ3_ShutdownGame(); //botlib kinda mandates this. :(
|
||||||
|
#endif
|
||||||
|
|
||||||
Mod_ClearAll ();
|
Mod_ClearAll ();
|
||||||
Hunk_FreeToLowMark (host_hunklevel);
|
Hunk_FreeToLowMark (host_hunklevel);
|
||||||
|
|
||||||
|
@ -1009,7 +1015,7 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us
|
||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
char crc[12];
|
char crc[12];
|
||||||
sprintf(crc, "%i", CRC_Block(file, com_filesize));
|
sprintf(crc, "%i", QCRC_Block(file, com_filesize));
|
||||||
Info_SetValueForStarKey(svs.info, "*entfile", crc, MAX_SERVERINFO_STRING);
|
Info_SetValueForStarKey(svs.info, "*entfile", crc, MAX_SERVERINFO_STRING);
|
||||||
switch(svs.gametype)
|
switch(svs.gametype)
|
||||||
{
|
{
|
||||||
|
|
|
@ -150,7 +150,7 @@ cvar_t allow_luma = {"allow_luma", "1", NULL, CVAR_SERVERINFO};
|
||||||
cvar_t allow_bump = {"allow_bump", "1", NULL, CVAR_SERVERINFO};
|
cvar_t allow_bump = {"allow_bump", "1", NULL, CVAR_SERVERINFO};
|
||||||
cvar_t allow_skybox = {"allow_skybox", "", NULL, CVAR_SERVERINFO};
|
cvar_t allow_skybox = {"allow_skybox", "", NULL, CVAR_SERVERINFO};
|
||||||
cvar_t sv_allow_splitscreen = {"allow_splitscreen", "",NULL,CVAR_SERVERINFO};
|
cvar_t sv_allow_splitscreen = {"allow_splitscreen", "",NULL,CVAR_SERVERINFO};
|
||||||
cvar_t fbskins = {"fbskins", "0", NULL, CVAR_SERVERINFO}; //to get rid of lame fuhquake fbskins
|
cvar_t fbskins = {"fbskins", "1", NULL, CVAR_SERVERINFO}; //to get rid of lame fuhquake fbskins
|
||||||
cvar_t mirrors = {"mirrors", "" , NULL, CVAR_SERVERINFO};
|
cvar_t mirrors = {"mirrors", "" , NULL, CVAR_SERVERINFO};
|
||||||
|
|
||||||
cvar_t sv_motd[] ={ {"sv_motd1", ""},
|
cvar_t sv_motd[] ={ {"sv_motd1", ""},
|
||||||
|
@ -3520,20 +3520,22 @@ void SV_ExtractFromUserinfo (client_t *cl)
|
||||||
}
|
}
|
||||||
#ifdef NQPROT
|
#ifdef NQPROT
|
||||||
{
|
{
|
||||||
int top = atoi(Info_ValueForKey(cl->userinfo, "topcolor"));
|
int top = atoi(Info_ValueForKey(cl->userinfo, "topcolor"));
|
||||||
int bottom = atoi(Info_ValueForKey(cl->userinfo, "bottomcolor"));
|
int bottom = atoi(Info_ValueForKey(cl->userinfo, "bottomcolor"));
|
||||||
top &= 15;
|
top &= 15;
|
||||||
if (top > 13)
|
if (top > 13)
|
||||||
top = 13;
|
top = 13;
|
||||||
bottom &= 15;
|
bottom &= 15;
|
||||||
if (bottom > 13)
|
if (bottom > 13)
|
||||||
bottom = 13;
|
bottom = 13;
|
||||||
cl->playercolor = top*16 + bottom;
|
cl->playercolor = top*16 + bottom;
|
||||||
if (svs.gametype == GT_PROGS)
|
if (svs.gametype == GT_PROGS)
|
||||||
cl->edict->v->clientcolors = cl->playercolor;
|
{
|
||||||
MSG_WriteByte (&sv.nqreliable_datagram, svc_updatecolors);
|
cl->edict->v->clientcolors = cl->playercolor;
|
||||||
MSG_WriteByte (&sv.nqreliable_datagram, cl-svs.clients);
|
MSG_WriteByte (&sv.nqreliable_datagram, svc_updatecolors);
|
||||||
MSG_WriteByte (&sv.nqreliable_datagram, cl->playercolor);
|
MSG_WriteByte (&sv.nqreliable_datagram, cl-svs.clients);
|
||||||
|
MSG_WriteByte (&sv.nqreliable_datagram, cl->playercolor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -410,7 +410,7 @@ void SWDraw_Init (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
concrc = CRC_Block(draw_chars, 128*128); // get CRC here because it hasn't been replaced
|
concrc = QCRC_Block(draw_chars, 128*128); // get CRC here because it hasn't been replaced
|
||||||
|
|
||||||
if (!draw_chars)
|
if (!draw_chars)
|
||||||
{ //now go for hexen2
|
{ //now go for hexen2
|
||||||
|
|
|
@ -2268,9 +2268,9 @@ void SWMod_LoadAliasModel (model_t *mod, void *buffer)
|
||||||
int len;
|
int len;
|
||||||
char st[40];
|
char st[40];
|
||||||
|
|
||||||
CRC_Init(&crc);
|
QCRC_Init(&crc);
|
||||||
for (len = com_filesize, p = buffer; len; len--, p++)
|
for (len = com_filesize, p = buffer; len; len--, p++)
|
||||||
CRC_ProcessByte(&crc, *p);
|
QCRC_ProcessByte(&crc, *p);
|
||||||
|
|
||||||
sprintf(st, "%d", (int) crc);
|
sprintf(st, "%d", (int) crc);
|
||||||
Info_SetValueForKey (cls.userinfo,
|
Info_SetValueForKey (cls.userinfo,
|
||||||
|
@ -2547,9 +2547,9 @@ void SWMod_LoadAlias2Model (model_t *mod, void *buffer)
|
||||||
int len;
|
int len;
|
||||||
char st[40];
|
char st[40];
|
||||||
|
|
||||||
CRC_Init(&crc);
|
QCRC_Init(&crc);
|
||||||
for (len = com_filesize, p = buffer; len; len--, p++)
|
for (len = com_filesize, p = buffer; len; len--, p++)
|
||||||
CRC_ProcessByte(&crc, *p);
|
QCRC_ProcessByte(&crc, *p);
|
||||||
|
|
||||||
sprintf(st, "%d", (int) crc);
|
sprintf(st, "%d", (int) crc);
|
||||||
Info_SetValueForKey (cls.userinfo,
|
Info_SetValueForKey (cls.userinfo,
|
||||||
|
@ -2940,9 +2940,9 @@ void SWMod_LoadAlias3Model (model_t *mod, void *buffer)
|
||||||
int len;
|
int len;
|
||||||
char st[40];
|
char st[40];
|
||||||
|
|
||||||
CRC_Init(&crc);
|
QCRC_Init(&crc);
|
||||||
for (len = com_filesize, p = buffer; len; len--, p++)
|
for (len = com_filesize, p = buffer; len; len--, p++)
|
||||||
CRC_ProcessByte(&crc, *p);
|
QCRC_ProcessByte(&crc, *p);
|
||||||
|
|
||||||
sprintf(st, "%d", (int) crc);
|
sprintf(st, "%d", (int) crc);
|
||||||
Info_SetValueForKey (cls.userinfo,
|
Info_SetValueForKey (cls.userinfo,
|
||||||
|
|
Loading…
Reference in a new issue