A few things... f_ruleset stuff, 64bit qvm compatability, added cvars so you can put the built in http server on a custom port, added #warnings to annoy molgrum.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2659 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2007-09-17 20:35:39 +00:00
parent 13eeec99a2
commit 9af1ba84cc
38 changed files with 898 additions and 1185 deletions

View file

@ -75,6 +75,8 @@ endif
CLIENT_DIR=$(BASE_DIR)/client CLIENT_DIR=$(BASE_DIR)/client
GL_DIR=$(BASE_DIR)/gl GL_DIR=$(BASE_DIR)/gl
SW_DIR=$(BASE_DIR)/sw SW_DIR=$(BASE_DIR)/sw
D3D7_DIR=$(BASE_DIR)/d3d
D3D9_DIR=$(BASE_DIR)/d3d9
SERVER_DIR=$(BASE_DIR)/server SERVER_DIR=$(BASE_DIR)/server
COMMON_DIR=$(BASE_DIR)/common COMMON_DIR=$(BASE_DIR)/common
HTTP_DIR=$(BASE_DIR)/http HTTP_DIR=$(BASE_DIR)/http
@ -111,10 +113,12 @@ ifeq ($(FTE_TARGET),bsd)
endif endif
BASELDFLAGS ?= -lm -ldl -lpthread BASELDFLAGS ?= -lm -ldl -lpthread
IMAGELDFLAGS=-lpng -ljpeg
#BASELDFLAGS=-lm -lz #BASELDFLAGS=-lm -lz
GLXLDFLAGS=-L/usr/X11R6/lib -lX11 -lXext -lpng -ljpeg GLXLDFLAGS=-L/usr/X11R6/lib -lX11 -lXext $(IMAGELDFLAGS)
GLSLDFLAGS=-L/usr/X11R6/lib -lMesaGL -lglide -lvga GLSLDFLAGS=-L/usr/X11R6/lib -lMesaGL -lglide -lvga
XLDFLAGS=-L/usr/X11R6/lib -lX11 -lXext -lpng -ljpeg XLDFLAGS=-L/usr/X11R6/lib -lX11 -lXext $(IMAGELDFLAGS)
SLDFLAGS=-lvga SLDFLAGS=-lvga
ifeq ($(USEASM),true) ifeq ($(USEASM),true)
@ -145,7 +149,7 @@ else
BASE_ASM_CFLAGS = -DNOASM BASE_ASM_CFLAGS = -DNOASM
endif endif
BASE_CFLAGS=$(BASE_ASM_CFLAGS) -Wall -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp -I$(CLIENT_DIR) -I$(SERVER_DIR) -I$(COMMON_DIR) -I$(SW_DIR) -I$(GL_DIR) -I$(PROGS_DIR) -I$(LIBS_DIR) -I$(LIBS_DIR)/dxsdk7/include -I$(LIBS_DIR)/sdl/include -I$(LIBS_DIR)/sdl/include/SDL -D_vsnprintf=vsnprintf -D_snprintf=snprintf BASE_CFLAGS=$(BASE_ASM_CFLAGS) -Wall -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp -I$(CLIENT_DIR) -I$(SERVER_DIR) -I$(COMMON_DIR) -I$(SW_DIR) -I$(GL_DIR) -I$(D3D9_DIR) -I$(D3D7_DIR) -I$(PROGS_DIR) -I$(LIBS_DIR) -I$(LIBS_DIR)/dxsdk7/include -I$(LIBS_DIR)/sdl/include -I$(LIBS_DIR)/sdl/include/SDL -D_vsnprintf=vsnprintf -D_snprintf=snprintf
CLIENT_ONLY_CFLAGS=-DCLIENTONLY CLIENT_ONLY_CFLAGS=-DCLIENTONLY
SERVER_ONLY_CFLAGS=-DSERVERONLY SERVER_ONLY_CFLAGS=-DSERVERONLY
JOINT_CFLAGS= JOINT_CFLAGS=
@ -153,6 +157,7 @@ DEBUG_CFLAGS=-ggdb -g
RELEASE_CFLAGS=-O6 -fno-strict-aliasing -ffast-math -funroll-loops -fexpensive-optimizations $(CPUOPTIMIZATIONS) RELEASE_CFLAGS=-O6 -fno-strict-aliasing -ffast-math -funroll-loops -fexpensive-optimizations $(CPUOPTIMIZATIONS)
GLCFLAGS=-DGLQUAKE GLCFLAGS=-DGLQUAKE
SWCFLAGS=-DSWQUAKE SWCFLAGS=-DSWQUAKE
D3DCFLAGS=-DD3DQUAKE
CLIENT_OBJS = $(CLIENT_ASM_OBJS) \ CLIENT_OBJS = $(CLIENT_ASM_OBJS) \
textedit.o \ textedit.o \
@ -264,6 +269,18 @@ GLQUAKE_OBJS = \
gl_vidcommon.o \ gl_vidcommon.o \
gl_hlmdl.o gl_hlmdl.o
D3DQUAKE_OBJS = \
d3d_draw.o \
d3d_mesh.o \
d3d_rmain.o \
d3d_rsurf.o \
vid_d3d.o \
d3d9_draw.o \
d3d9_mesh.o \
d3d9_rmain.o \
d3d9_rsurf.o \
vid_d3d9.o
MP3_OBJS = \ MP3_OBJS = \
fixed.o \ fixed.o \
bit.o \ bit.o \
@ -369,7 +386,7 @@ GLCL_EXE_NAME=../fteqwcl_sdl.gl$(BITS)
ifdef windir ifdef windir
GL_LDFLAGS=$(GLLDFLAGS) -lmingw32 -lwsock32 `sdl-config --libs` GL_LDFLAGS=$(GLLDFLAGS) -lmingw32 -lwsock32 `sdl-config --libs`
else else
GL_LDFLAGS=$(GLLDFLAGS) -lpng -ljpeg `sdl-config --libs` GL_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) `sdl-config --libs`
endif endif
GL_CFLAGS=$(GLCFLAGS) `sdl-config --cflags` GL_CFLAGS=$(GLCFLAGS) `sdl-config --cflags`
GLB_DIR=gl_sdl$(BITS) GLB_DIR=gl_sdl$(BITS)
@ -382,7 +399,7 @@ ifdef windir
SW_LDFLAGS=$(SWLDFLAGS) -lmingw32 -lwsock32 -lSDLmain -lSDL SW_LDFLAGS=$(SWLDFLAGS) -lmingw32 -lwsock32 -lSDLmain -lSDL
else else
#pthread is needed because of SDL. #pthread is needed because of SDL.
SW_LDFLAGS=$(SWLDFLAGS) `sdl-config --libs` -lpng -ljpeg SW_LDFLAGS=$(SWLDFLAGS) `sdl-config --libs` $(IMAGELDFLAGS)
endif endif
SW_CFLAGS=$(SWCFLAGS) `sdl-config --cflags` SW_CFLAGS=$(SWCFLAGS) `sdl-config --cflags`
SWB_DIR=sw_sdl$(BITS) SWB_DIR=sw_sdl$(BITS)
@ -446,6 +463,14 @@ endif
MB_DIR=m_mgw MB_DIR=m_mgw
MCL_DIR=mcl_mgw MCL_DIR=mcl_mgw
D3DCL_OBJS=$(D3DQUAKE_OBJS) snd_win.o snd_directx.o cd_win.o in_win.o sys_win.o
D3D_EXE_NAME=../fted3dqw.exe
D3DCL_EXE_NAME=../fted3dclqw.exe
D3D_LDFLAGS= -ldxguid -lwsock32 -lwinmm -lgdi32 -lole32
D3D_CFLAGS=$(D3DCFLAGS) $(W32_CFLAGS) -DMINIMAL
D3DB_DIR=d3d_mgw
D3DCL_DIR=d3dcl_mgw
MINGL_EXE_NAME=../fteminglqw.exe MINGL_EXE_NAME=../fteminglqw.exe
MINGL_DIR=mingl_mgw MINGL_DIR=mingl_mgw
endif endif
@ -547,7 +572,7 @@ ifeq ($(FTE_TARGET),morphos)
GLCL_OBJS=$(GL_OBJS) $(GLQUAKE_OBJS) gl_vidmorphos.o in_morphos.o snd_morphos.o cd_null.o sys_morphos.o GLCL_OBJS=$(GL_OBJS) $(GLQUAKE_OBJS) gl_vidmorphos.o in_morphos.o snd_morphos.o cd_null.o sys_morphos.o
GL_EXE_NAME=../fteqw.gl GL_EXE_NAME=../fteqw.gl
GLCL_EXE_NAME=../fteqwcl.gl GLCL_EXE_NAME=../fteqwcl.gl
GL_LDFLAGS=$(GLLDFLAGS) -ldl -lsyscall -lpng -ljpeg -lz GL_LDFLAGS=$(GLLDFLAGS) -ldl -lsyscall $(IMAGELDFLAGS) -lz
GL_CFLAGS=$(GLCFLAGS) -noixemul GL_CFLAGS=$(GLCFLAGS) -noixemul
GLB_DIR=gl_morphos GLB_DIR=gl_morphos
GLCL_DIR=glcl_morphos GLCL_DIR=glcl_morphos
@ -649,7 +674,7 @@ ifneq ($(OUT_DIR),)
endif endif
VPATH = $(BASE_DIR) : $(CLIENT_DIR) : $(GL_DIR) : $(COMMON_DIR) : $(SW_DIR) : $(SERVER_DIR) : $(HTTP_DIR) : $(BASE_DIR)/irc : $(BASE_DIR)/email : $(QUX_DIR) : $(PROGS_DIR) : $(SNDCODEC_DIR) VPATH = $(BASE_DIR) : $(CLIENT_DIR) : $(GL_DIR) : $(COMMON_DIR) : $(SW_DIR) : $(SERVER_DIR) : $(HTTP_DIR) : $(BASE_DIR)/irc : $(BASE_DIR)/email : $(QUX_DIR) : $(PROGS_DIR) : $(SNDCODEC_DIR) : $(D3D7_DIR) : $(D3D9_DIR)
#$(OUT_DIR)/%.d: %.c #$(OUT_DIR)/%.d: %.c
# @set -e; rm -f $@; \ # @set -e; rm -f $@; \
@ -718,6 +743,19 @@ sv-dbg:
d3dcl-tmp:
$(MAKE) $(TYPE) OUT_DIR="$(OUT_DIR)" EXE_NAME="$(D3DCL_EXE_NAME)" WCFLAGS="$(D3D_CFLAGS)" LDFLAGS="$(D3D_LDFLAGS) $(LDFLAGS)" SOBJS="$(D3DCL_OBJS)"
d3d-tmp:
$(MAKE) $(TYPE) OUT_DIR="$(OUT_DIR)" EXE_NAME="$(D3D_EXE_NAME)" WCFLAGS="$(D3D_CFLAGS)" LDFLAGS="$(D3D_LDFLAGS) $(LDFLAGS)" SOBJS="$(D3DCL_OBJS)"
d3dcl-rel:
$(MAKE) d3dcl-tmp TYPE=_cl-rel OUT_DIR="$(RELEASE_DIR)/$(D3DCL_DIR)"
d3dcl-dbg:
$(MAKE) d3dcl-tmp TYPE=_cl-dbg OUT_DIR="$(DEBUG_DIR)/$(D3DCL_DIR)"
d3d-rel:
$(MAKE) d3d-tmp TYPE=_clsv-rel OUT_DIR="$(RELEASE_DIR)/$(D3DB_DIR)"
d3d-dbg:
$(MAKE) d3d-tmp TYPE=_clsv-dbg OUT_DIR="$(DEBUG_DIR)/$(D3DB_DIR)"
glcl-tmp: glcl-tmp:
@ -805,6 +843,7 @@ help:
@-echo "gl" @-echo "gl"
@-echo "sw" @-echo "sw"
@-echo "m" @-echo "m"
@-echo "d3d (for windows builds)"
@-echo "mcl (currently broken)" @-echo "mcl (currently broken)"
@-echo "glcl (currently broken)" @-echo "glcl (currently broken)"
@-echo "swcl (currently broken)" @-echo "swcl (currently broken)"

View file

@ -500,7 +500,6 @@ void Cam_Track(int pnum, usercmd_t *cmd)
// move there locally immediately // move there locally immediately
VectorCopy(player->origin, self->origin); VectorCopy(player->origin, self->origin);
} }
Con_Printf("self->weaponframe = %i\n", self->weaponframe);
self->weaponframe = player->weaponframe; self->weaponframe = player->weaponframe;
return; return;

View file

@ -27,8 +27,18 @@ void GLDraw_ShaderImage (int x, int y, int w, int h, float s1, float t1, float s
#define CGTAGNUM 5423 #define CGTAGNUM 5423
#define VM_FROMHANDLE(a) ((void*)a) #define VM_TOSTRCACHE(a) VMQ3_StringToHandle(VM_POINTER(a))
#define VM_TOHANDLE(a) ((int)a) #define VM_FROMSTRCACHE(a) VMQ3_StringFromHandle(a)
char *VMQ3_StringFromHandle(int handle);
int VMQ3_StringToHandle(char *str);
extern model_t mod_known[];
#define VM_FROMMHANDLE(a) (a?mod_known+a-1:NULL)
#define VM_TOMHANDLE(a) (a?a-mod_known+1:0)
extern shader_t r_shaders[];
#define VM_FROMSHANDLE(a) (a?r_shaders+a-1:NULL)
#define VM_TOSHANDLE(a) (a?a-r_shaders+1:0)
typedef enum { typedef enum {
CG_PRINT, CG_PRINT,
@ -139,8 +149,6 @@ typedef enum {
} cgameImport_t; } cgameImport_t;
#define VM_FROMHANDLE(a) ((void*)a)
#define VM_TOHANDLE(a) ((int)a)
/* /*
================================================================== ==================================================================
@ -426,7 +434,7 @@ int VM_LerpTag(void *out, model_t *model, int f1, int f2, float l2, char *tagnam
#define VALIDATEPOINTER(o,l) if ((int)o + l >= mask || VM_POINTER(o) < offset) Host_EndGame("Call to cgame trap %i passes invalid pointer\n", fn); //out of bounds. #define VALIDATEPOINTER(o,l) if ((int)o + l >= mask || VM_POINTER(o) < offset) Host_EndGame("Call to cgame trap %i passes invalid pointer\n", fn); //out of bounds.
static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg) static int CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const int *arg)
{ {
int ret=0; int ret=0;
@ -463,35 +471,10 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
case CG_CVAR_REGISTER: case CG_CVAR_REGISTER:
if (arg[0]) if (arg[0])
VALIDATEPOINTER(arg[0], sizeof(vmcvar_t)); VALIDATEPOINTER(arg[0], sizeof(vmcvar_t));
{ return VMQ3_Cvar_Register(VM_POINTER(arg[0]), VM_POINTER(arg[1]), VM_POINTER(arg[2]), VM_LONG(arg[3]));
vmcvar_t *vmc;
cvar_t *var;
vmc = VM_POINTER(arg[0]);
var = Cvar_Get(VM_POINTER(arg[1]), VM_POINTER(arg[2]), VM_LONG(arg[3])&(CVAR_ARCHIVE|CVAR_USERINFO|CVAR_SERVERINFO), "UI cvar");
if (!vmc)
break;
vmc->handle = (char *)var - (char *)offset;
vmc->integer = var->value;
vmc->value = var->value;
vmc->modificationCount = var->modified;
Q_strncpyz(vmc->string, var->string, sizeof(vmc->string));
}
break;
case CG_CVAR_UPDATE: case CG_CVAR_UPDATE:
VALIDATEPOINTER(arg[0], sizeof(vmcvar_t)); VALIDATEPOINTER(arg[0], sizeof(vmcvar_t));
{ return VMQ3_Cvar_Update(VM_POINTER(arg[0]));
cvar_t *var;
vmcvar_t *vmc;
vmc = VM_POINTER(arg[0]);
var = (cvar_t *)((int)vmc->handle + (char *)offset);
vmc->integer = var->value;
vmc->value = var->value;
vmc->modificationCount = var->modified;
Q_strncpyz(vmc->string, var->string, sizeof(vmc->string));
}
break;
case CG_CVAR_SET: case CG_CVAR_SET:
{ {
@ -562,7 +545,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
case CG_CM_POINTCONTENTS: //int trap_CM_PointContents( const vec3_t p, clipHandle_t model ); case CG_CM_POINTCONTENTS: //int trap_CM_PointContents( const vec3_t p, clipHandle_t model );
{ {
unsigned int pc; unsigned int pc;
model_t *mod = VM_FROMHANDLE(arg[1]); model_t *mod = VM_FROMMHANDLE(arg[1]);
if (!mod) if (!mod)
mod = cl.worldmodel; mod = cl.worldmodel;
if (mod) if (mod)
@ -577,7 +560,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
{ {
unsigned int pc; unsigned int pc;
float *p = VM_POINTER(arg[0]); float *p = VM_POINTER(arg[0]);
model_t *mod = VM_FROMHANDLE(arg[1]); model_t *mod = VM_FROMMHANDLE(arg[1]);
float *origin = VM_POINTER(arg[2]); float *origin = VM_POINTER(arg[2]);
float *angles = VM_POINTER(arg[3]); float *angles = VM_POINTER(arg[3]);
@ -624,7 +607,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
float *end = VM_POINTER(arg[2]); float *end = VM_POINTER(arg[2]);
float *mins = VM_POINTER(arg[3]); float *mins = VM_POINTER(arg[3]);
float *maxs = VM_POINTER(arg[4]); float *maxs = VM_POINTER(arg[4]);
model_t *mod = VM_FROMHANDLE(arg[5]); model_t *mod = VM_FROMMHANDLE(arg[5]);
int brushmask = VM_LONG(arg[6]); int brushmask = VM_LONG(arg[6]);
float *origin = VM_POINTER(arg[7]); float *origin = VM_POINTER(arg[7]);
float *angles = VM_POINTER(arg[8]); float *angles = VM_POINTER(arg[8]);
@ -668,7 +651,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
float *end = VM_POINTER(arg[2]); float *end = VM_POINTER(arg[2]);
float *mins = VM_POINTER(arg[3]); float *mins = VM_POINTER(arg[3]);
float *maxs = VM_POINTER(arg[4]); float *maxs = VM_POINTER(arg[4]);
model_t *mod = VM_FROMHANDLE(arg[5]); model_t *mod = VM_FROMMHANDLE(arg[5]);
int brushmask = VM_LONG(arg[6]); int brushmask = VM_LONG(arg[6]);
if (!mod) if (!mod)
mod = cl.worldmodel; mod = cl.worldmodel;
@ -703,8 +686,9 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
case CG_CM_LOADMAP: case CG_CM_LOADMAP:
{ {
int i; int i;
strcpy(cl.model_name[1], VM_POINTER(arg[0])); char *mapname = VM_POINTER(arg[0]);
cl.worldmodel = cl.model_precache[1] = Mod_ForName(VM_POINTER(arg[0]), false); strcpy(cl.model_name[1], mapname);
cl.worldmodel = cl.model_precache[1] = Mod_ForName(mapname, false);
if (cl.worldmodel->needload) if (cl.worldmodel->needload)
Host_EndGame("Couldn't load map"); Host_EndGame("Couldn't load map");
@ -718,21 +702,21 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
break; break;
case CG_CM_INLINEMODEL: case CG_CM_INLINEMODEL:
VM_LONG(ret) = VM_TOHANDLE(cl.model_precache[VM_LONG(arg[0])+1]); VM_LONG(ret) = VM_TOMHANDLE(cl.model_precache[VM_LONG(arg[0])+1]);
break; break;
case CG_CM_NUMINLINEMODELS: case CG_CM_NUMINLINEMODELS:
VM_LONG(ret) = cl.worldmodel?cl.worldmodel->numsubmodels:0; VM_LONG(ret) = cl.worldmodel?cl.worldmodel->numsubmodels:0;
break; break;
case CG_CM_TEMPBOXMODEL: case CG_CM_TEMPBOXMODEL:
VM_LONG(ret) = VM_TOHANDLE(CM_TempBoxModel(VM_POINTER(arg[0]), VM_POINTER(arg[1]))); VM_LONG(ret) = VM_TOMHANDLE(CM_TempBoxModel(VM_POINTER(arg[0]), VM_POINTER(arg[1])));
break; break;
case CG_R_MODELBOUNDS: case CG_R_MODELBOUNDS:
VALIDATEPOINTER(arg[1], sizeof(vec3_t)); VALIDATEPOINTER(arg[1], sizeof(vec3_t));
VALIDATEPOINTER(arg[2], sizeof(vec3_t)); VALIDATEPOINTER(arg[2], sizeof(vec3_t));
{ {
model_t *mod = VM_FROMHANDLE(arg[0]); model_t *mod = VM_FROMMHANDLE(arg[0]);
if (mod) if (mod)
{ {
VectorCopy(mod->mins, ((float*)VM_POINTER(arg[1]))); VectorCopy(mod->mins, ((float*)VM_POINTER(arg[1])));
@ -747,35 +731,29 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
mod = Mod_ForName(VM_POINTER(arg[0]), false); mod = Mod_ForName(VM_POINTER(arg[0]), false);
if (mod->needload || mod->type == mod_dummy) if (mod->needload || mod->type == mod_dummy)
return 0; return 0;
VM_LONG(ret) = VM_TOHANDLE(mod); VM_LONG(ret) = VM_TOMHANDLE(mod);
} }
break; break;
case CG_R_REGISTERSKIN: case CG_R_REGISTERSKIN:
{ VM_LONG(ret) = VM_TOSTRCACHE(arg[0]);
char *buf;
char *skinname = VM_POINTER(arg[0]);
buf = Z_TagMalloc(strlen(skinname)+1, CGTAGNUM);
strcpy(buf, skinname);
VM_LONG(ret) = VM_TOHANDLE(buf); //precache skin - engine ignores these anyway... (for now)
}
break; break;
case CG_R_REGISTERSHADER: case CG_R_REGISTERSHADER:
if (!*(char*)VM_POINTER(arg[0])) if (!*(char*)VM_POINTER(arg[0]))
VM_LONG(ret) = 0; VM_LONG(ret) = 0;
else if (qrenderer == QR_OPENGL) else if (qrenderer == QR_OPENGL)
VM_LONG(ret) = VM_TOHANDLE(R_RegisterPic(VM_POINTER(arg[0]))); VM_LONG(ret) = VM_TOSHANDLE(R_RegisterPic(VM_POINTER(arg[0])));
else //FIXME: 64bit else
VM_LONG(ret) = VM_TOHANDLE(Draw_SafeCachePic(VM_POINTER(arg[0]))); // VM_LONG(ret) = VM_TOHANDLE(Draw_SafeCachePic(VM_POINTER(arg[0])));
break; break;
case CG_R_REGISTERSHADERNOMIP: case CG_R_REGISTERSHADERNOMIP:
if (!*(char*)VM_POINTER(arg[0])) if (!*(char*)VM_POINTER(arg[0]))
VM_LONG(ret) = 0; VM_LONG(ret) = 0;
else if (qrenderer == QR_OPENGL) else if (qrenderer == QR_OPENGL)
VM_LONG(ret) = VM_TOHANDLE(R_RegisterPic(VM_POINTER(arg[0]))); VM_LONG(ret) = VM_TOSHANDLE(R_RegisterPic(VM_POINTER(arg[0])));
else //FIXME: 64bit else
VM_LONG(ret) = VM_TOHANDLE(Draw_SafeCachePic(VM_POINTER(arg[0]))); // VM_LONG(ret) = VM_TOHANDLE(Draw_SafeCachePic(VM_POINTER(arg[0])));
break; break;
case CG_R_CLEARSCENE: //clear scene case CG_R_CLEARSCENE: //clear scene
@ -813,22 +791,22 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
case CG_R_DRAWSTRETCHPIC: case CG_R_DRAWSTRETCHPIC:
if (qrenderer == QR_OPENGL) if (qrenderer == QR_OPENGL)
GLDraw_ShaderImage(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]), VM_FLOAT(arg[2]), VM_FLOAT(arg[3]), VM_FLOAT(arg[4]), VM_FLOAT(arg[5]), VM_FLOAT(arg[6]), VM_FLOAT(arg[7]), (void *)VM_LONG(arg[8])); GLDraw_ShaderImage(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]), VM_FLOAT(arg[2]), VM_FLOAT(arg[3]), VM_FLOAT(arg[4]), VM_FLOAT(arg[5]), VM_FLOAT(arg[6]), VM_FLOAT(arg[7]), VM_FROMSHANDLE(arg[8]));
else // else
Draw_Image(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]), VM_FLOAT(arg[2]), VM_FLOAT(arg[3]), VM_FLOAT(arg[4]), VM_FLOAT(arg[5]), VM_FLOAT(arg[6]), VM_FLOAT(arg[7]), (mpic_t *)VM_LONG(arg[8])); // Draw_Image(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]), VM_FLOAT(arg[2]), VM_FLOAT(arg[3]), VM_FLOAT(arg[4]), VM_FLOAT(arg[5]), VM_FLOAT(arg[6]), VM_FLOAT(arg[7]), (mpic_t *)VM_LONG(arg[8]));
break; break;
case CG_R_LERPTAG: //Lerp tag... case CG_R_LERPTAG: //Lerp tag...
VALIDATEPOINTER(arg[0], sizeof(float)*12); VALIDATEPOINTER(arg[0], sizeof(float)*12);
VM_LONG(ret) = VM_LerpTag(VM_POINTER(arg[0]), (model_t*)VM_LONG(arg[1]), VM_LONG(arg[2]), VM_LONG(arg[3]), VM_FLOAT(arg[4]), VM_POINTER(arg[5])); VM_LONG(ret) = VM_LerpTag(VM_POINTER(arg[0]), VM_FROMMHANDLE(arg[1]), VM_LONG(arg[2]), VM_LONG(arg[3]), VM_FLOAT(arg[4]), VM_POINTER(arg[5]));
break; break;
case CG_S_REGISTERSOUND: case CG_S_REGISTERSOUND:
{ {
sfx_t *sfx; sfx_t *sfx;
sfx = S_PrecacheSound(va("../%s", VM_POINTER(arg[0]))); sfx = S_PrecacheSound(VM_POINTER(arg[0]));
if (sfx) if (sfx)
VM_LONG(ret) = VM_TOHANDLE(sfx); VM_LONG(ret) = VM_TOSTRCACHE(arg[0]);
else else
VM_LONG(ret) = -1; VM_LONG(ret) = -1;
} }
@ -836,11 +814,11 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long
case CG_S_STARTLOCALSOUND: case CG_S_STARTLOCALSOUND:
if (VM_LONG(arg[0]) != -1 && arg[0]) if (VM_LONG(arg[0]) != -1 && arg[0])
S_LocalSound(((sfx_t*)VM_FROMHANDLE(arg[0]))->name ); S_LocalSound(VM_FROMSTRCACHE(arg[0]));
break; break;
case CG_S_STARTSOUND:// ( vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx ) case CG_S_STARTSOUND:// ( vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx )
S_StartSound(VM_LONG(arg[1]), VM_LONG(arg[2]), (sfx_t*)VM_LONG(arg[3]), VM_POINTER(arg[0]), 1, 1); S_StartSound(VM_LONG(arg[1]), VM_LONG(arg[2]), S_PrecacheSound(VM_FROMSTRCACHE(arg[3])), VM_POINTER(arg[0]), 1, 1);
break; break;
case CG_S_ADDLOOPINGSOUND: case CG_S_ADDLOOPINGSOUND:
@ -906,11 +884,14 @@ vec3_t listener_up;
VALIDATEPOINTER(arg[0], 11332); VALIDATEPOINTER(arg[0], 11332);
//do any needed work //do any needed work
memset(VM_POINTER(arg[0]), 0, 11304); unsigned char *glconfig = VM_POINTER(arg[0]);
*(int *)VM_POINTER(arg[0]+11304) = vid.width; { //FIXME: Clean this shit up
*(int *)VM_POINTER(arg[0]+11308) = vid.height; memset(glconfig, 0, 11304);
*(float *)VM_POINTER(arg[0]+11312) = (float)vid.width/vid.height; *(int *)(glconfig+11304) = vid.width;
memset(VM_POINTER(arg[0]+11316), 0, 11332-11316); *(int *)(glconfig+11308) = vid.height;
*(float *)(glconfig+11312) = (float)vid.width/vid.height;
memset((glconfig+11316), 0, 11332-11316);
}
break; break;
case CG_GETGAMESTATE: case CG_GETGAMESTATE:
@ -991,15 +972,26 @@ vec3_t listener_up;
// standard Q3 // standard Q3
case CG_MEMSET: case CG_MEMSET:
VALIDATEPOINTER(arg[0], arg[2]); VALIDATEPOINTER(arg[0], arg[2]);
memset(VM_POINTER(arg[0]), arg[1], arg[2]); {
void *dst = VM_POINTER(arg[0]);
memset(dst, arg[1], arg[2]);
}
break; break;
case CG_MEMCPY: case CG_MEMCPY:
VALIDATEPOINTER(arg[0], arg[2]); VALIDATEPOINTER(arg[0], arg[2]);
memcpy(VM_POINTER(arg[0]), VM_POINTER(arg[1]), arg[2]); {
void *dst = VM_POINTER(arg[0]);
void *src = VM_POINTER(arg[1]);
memcpy(dst, src, arg[2]);
}
break; break;
case CG_STRNCPY: case CG_STRNCPY:
VALIDATEPOINTER(arg[0], arg[2]); VALIDATEPOINTER(arg[0], arg[2]);
strncpy(VM_POINTER(arg[0]), VM_POINTER(arg[1]), arg[2]); {
void *dst = VM_POINTER(arg[0]);
void *src = VM_POINTER(arg[1]);
strncpy(dst, src, arg[2]);
}
break; break;
case CG_SIN: case CG_SIN:
VM_FLOAT(ret)=(float)sin(VM_FLOAT(arg[0])); VM_FLOAT(ret)=(float)sin(VM_FLOAT(arg[0]));
@ -1034,7 +1026,7 @@ vec3_t listener_up;
return ret; return ret;
} }
#ifdef _DEBUG #ifdef _DEBUG
static long CG_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, const long *arg) static int CG_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, const int *arg)
{ //this is so we can use edit and continue properly (vc doesn't like function pointers for edit+continue) { //this is so we can use edit and continue properly (vc doesn't like function pointers for edit+continue)
return CG_SystemCallsEx(offset, mask, fn, arg); return CG_SystemCallsEx(offset, mask, fn, arg);
} }
@ -1045,7 +1037,7 @@ static long CG_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, con
//but dlls call it without saying what sort of vm it comes from, so I've got to have them as specifics //but dlls call it without saying what sort of vm it comes from, so I've got to have them as specifics
static int EXPORT_FN CG_SystemCalls(int arg, ...) static int EXPORT_FN CG_SystemCalls(int arg, ...)
{ {
long args[10]; int args[10];
va_list argptr; va_list argptr;
va_start(argptr, arg); va_start(argptr, arg);

View file

@ -1183,6 +1183,8 @@ void CL_Disconnect (void)
cl.servercount = 0; cl.servercount = 0;
cls.findtrack = false; cls.findtrack = false;
Validation_DelatchRulesets();
#ifdef TCPCONNECT #ifdef TCPCONNECT
if (cls.sockettcp != INVALID_SOCKET) if (cls.sockettcp != INVALID_SOCKET)
{ {
@ -2170,6 +2172,7 @@ void CL_ConnectionlessPacket (void)
if (!strcmp(com_token, "ccept")) if (!strcmp(com_token, "ccept"))
{ {
Con_Printf ("accept\n"); Con_Printf ("accept\n");
Validation_Apply_Ruleset();
Netchan_Setup(NS_CLIENT, &cls.netchan, net_from, cls.qport); Netchan_Setup(NS_CLIENT, &cls.netchan, net_from, cls.qport);
Con_DPrintf ("CL_EstablishConnection: connected to %s\n", cls.servername); Con_DPrintf ("CL_EstablishConnection: connected to %s\n", cls.servername);
@ -2226,6 +2229,8 @@ client_connect: //fixme: make function
current_loading_size = 0; current_loading_size = 0;
loading_stage = 2; loading_stage = 2;
Validation_Apply_Ruleset();
return; return;
} }
// remote command from gui front end // remote command from gui front end
@ -2342,6 +2347,8 @@ void CLNQ_ConnectionlessPacket(void)
} }
} }
Validation_Apply_Ruleset();
Netchan_Setup (NS_CLIENT, &cls.netchan, net_from, cls.qport); Netchan_Setup (NS_CLIENT, &cls.netchan, net_from, cls.qport);
cls.netchan.isnqprotocol = true; cls.netchan.isnqprotocol = true;
cls.netchan.compress = 0; cls.netchan.compress = 0;

View file

@ -3469,38 +3469,14 @@ char *CL_ParseChat(char *text, player_info_t **player)
{ {
if (!cls.demoplayback) if (!cls.demoplayback)
Sys_ServerActivity(); //chat always flashes the screen.. Sys_ServerActivity(); //chat always flashes the screen..
/*
//check f_ stuff
if (!strncmp(s, "f_", 2))
{
static float versionresponsetime;
static float modifiedresponsetime;
static float skinsresponsetime;
static float serverresponsetime;
if (!strncmp(s, "f_version", 9) && versionresponsetime < Sys_DoubleTime()) //respond to it. //check f_ stuff
if (*player && !strncmp(s, "f_", 2))
{ {
ValidationPrintVersion(text); Validation_Auto_Response(*player - cl.players, s);
versionresponsetime = Sys_DoubleTime() + 5;
}
else if (!strncmp(s, "f_server", 8) && serverresponsetime < Sys_DoubleTime()) //respond to it.
{
Validation_Server();
serverresponsetime = Sys_DoubleTime() + 5;
}
else if (!strncmp(s, "f_modified", 10) && modifiedresponsetime < Sys_DoubleTime()) //respond to it.
{
Validation_FilesModified();
modifiedresponsetime = Sys_DoubleTime() + 5;
}
else if (!strncmp(s, "f_skins", 7) && skinsresponsetime < Sys_DoubleTime()) //respond to it.
{
Validation_Skins();
skinsresponsetime = Sys_DoubleTime() + 5;
}
return s; return s;
} }
*/
Validation_CheckIfResponse(text); Validation_CheckIfResponse(text);
#ifdef PLUGINS #ifdef PLUGINS

View file

@ -11,7 +11,7 @@ static plugin_t *protocolclientplugin;
int VARGS Plug_Menu_Control(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Menu_Control(void *offset, unsigned int mask, const int *arg)
{ {
if (qrenderer <= 0) if (qrenderer <= 0)
return 0; return 0;
@ -45,7 +45,7 @@ int VARGS Plug_Menu_Control(void *offset, unsigned int mask, const long *arg)
} }
} }
int VARGS Plug_Key_GetKeyCode(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Key_GetKeyCode(void *offset, unsigned int mask, const int *arg)
{ {
int modifier; int modifier;
return Key_StringToKeynum(VM_POINTER(arg[0]), &modifier); return Key_StringToKeynum(VM_POINTER(arg[0]), &modifier);
@ -54,7 +54,7 @@ int VARGS Plug_Key_GetKeyCode(void *offset, unsigned int mask, const long *arg)
int VARGS Plug_SCR_CenterPrint(void *offset, unsigned int mask, const long *arg) int VARGS Plug_SCR_CenterPrint(void *offset, unsigned int mask, const int *arg)
{ {
if (qrenderer <= 0) if (qrenderer <= 0)
return 0; return 0;
@ -62,7 +62,7 @@ int VARGS Plug_SCR_CenterPrint(void *offset, unsigned int mask, const long *arg)
SCR_CenterPrint(0, VM_POINTER(arg[0])); SCR_CenterPrint(0, VM_POINTER(arg[0]));
return 0; return 0;
} }
int VARGS Plug_Media_ShowFrameRGBA_32(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Media_ShowFrameRGBA_32(void *offset, unsigned int mask, const int *arg)
{ {
void *src = VM_POINTER(arg[0]); void *src = VM_POINTER(arg[0]);
int srcwidth = VM_LONG(arg[1]); int srcwidth = VM_LONG(arg[1]);
@ -92,7 +92,7 @@ typedef struct {
int pluginimagearraylen; int pluginimagearraylen;
pluginimagearray_t *pluginimagearray; pluginimagearray_t *pluginimagearray;
int VARGS Plug_Draw_LoadImage(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Draw_LoadImage(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
qboolean fromwad = arg[1]; qboolean fromwad = arg[1];
@ -179,7 +179,7 @@ void Plug_FreePlugImages(plugin_t *plug)
} }
//int Draw_Image (float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t image) //int Draw_Image (float x, float y, float w, float h, float s1, float t1, float s2, float t2, qhandle_t image)
int VARGS Plug_Draw_Image(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Draw_Image(void *offset, unsigned int mask, const int *arg)
{ {
mpic_t *pic; mpic_t *pic;
int i; int i;
@ -210,7 +210,7 @@ int VARGS Plug_Draw_Image(void *offset, unsigned int mask, const long *arg)
return 1; return 1;
} }
//x1,y1,x2,y2 //x1,y1,x2,y2
int VARGS Plug_Draw_Line(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Draw_Line(void *offset, unsigned int mask, const int *arg)
{ {
switch(qrenderer) //FIXME: I don't want qrenderer seen outside the refresh switch(qrenderer) //FIXME: I don't want qrenderer seen outside the refresh
{ {
@ -229,7 +229,7 @@ int VARGS Plug_Draw_Line(void *offset, unsigned int mask, const long *arg)
} }
return 1; return 1;
} }
int VARGS Plug_Draw_Character(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Draw_Character(void *offset, unsigned int mask, const int *arg)
{ {
if (qrenderer <= 0) if (qrenderer <= 0)
return 0; return 0;
@ -237,7 +237,7 @@ int VARGS Plug_Draw_Character(void *offset, unsigned int mask, const long *arg)
return 0; return 0;
} }
void (D3D_Draw_Fill_Colours) (int x, int y, int w, int h); void (D3D_Draw_Fill_Colours) (int x, int y, int w, int h);
int VARGS Plug_Draw_Fill(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Draw_Fill(void *offset, unsigned int mask, const int *arg)
{ {
float x, y, width, height; float x, y, width, height;
if (qrenderer <= 0) if (qrenderer <= 0)
@ -268,7 +268,7 @@ int VARGS Plug_Draw_Fill(void *offset, unsigned int mask, const long *arg)
} }
return 0; return 0;
} }
int VARGS Plug_Draw_ColourP(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Draw_ColourP(void *offset, unsigned int mask, const int *arg)
{ {
qbyte *pal = host_basepal + VM_LONG(arg[0])*3; qbyte *pal = host_basepal + VM_LONG(arg[0])*3;
@ -282,7 +282,7 @@ int VARGS Plug_Draw_ColourP(void *offset, unsigned int mask, const long *arg)
} }
return 0; return 0;
} }
int VARGS Plug_Draw_Colour3f(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Draw_Colour3f(void *offset, unsigned int mask, const int *arg)
{ {
if (Draw_ImageColours) if (Draw_ImageColours)
{ {
@ -291,7 +291,7 @@ int VARGS Plug_Draw_Colour3f(void *offset, unsigned int mask, const long *arg)
} }
return 0; return 0;
} }
int VARGS Plug_Draw_Colour4f(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Draw_Colour4f(void *offset, unsigned int mask, const int *arg)
{ {
if (Draw_ImageColours) if (Draw_ImageColours)
{ {
@ -309,7 +309,7 @@ int VARGS Plug_Draw_Colour4f(void *offset, unsigned int mask, const long *arg)
int VARGS Plug_LocalSound(void *offset, unsigned int mask, const long *arg) int VARGS Plug_LocalSound(void *offset, unsigned int mask, const int *arg)
{ {
if (qrenderer <= 0) if (qrenderer <= 0)
return false; return false;
@ -320,7 +320,7 @@ int VARGS Plug_LocalSound(void *offset, unsigned int mask, const long *arg)
int VARGS Plug_CL_GetStats(void *offset, unsigned int mask, const long *arg) int VARGS Plug_CL_GetStats(void *offset, unsigned int mask, const int *arg)
{ {
int i; int i;
int pnum = VM_LONG(arg[0]); int pnum = VM_LONG(arg[0]);
@ -361,7 +361,7 @@ typedef struct {
char team[8]; char team[8];
} vmplugclientinfo_t; } vmplugclientinfo_t;
int VARGS Plug_GetPlayerInfo(void *offset, unsigned int mask, const long *arg) int VARGS Plug_GetPlayerInfo(void *offset, unsigned int mask, const int *arg)
{ {
int i, pt; int i, pt;
vmplugclientinfo_t *out; vmplugclientinfo_t *out;
@ -401,12 +401,12 @@ int VARGS Plug_GetPlayerInfo(void *offset, unsigned int mask, const long *arg)
return pt == i; return pt == i;
} }
int VARGS Plug_LocalPlayerNumber(void *offset, unsigned int mask, const long *arg) int VARGS Plug_LocalPlayerNumber(void *offset, unsigned int mask, const int *arg)
{ {
return cl.playernum[0]; return cl.playernum[0];
} }
int VARGS Plug_GetServerInfo(void *offset, unsigned int mask, const long *arg) int VARGS Plug_GetServerInfo(void *offset, unsigned int mask, const int *arg)
{ {
char *outptr = VM_POINTER(arg[0]); char *outptr = VM_POINTER(arg[0]);
int outlen = VM_LONG(arg[1]); int outlen = VM_LONG(arg[1]);
@ -419,7 +419,7 @@ int VARGS Plug_GetServerInfo(void *offset, unsigned int mask, const long *arg)
return true; return true;
} }
int VARGS Plug_SetUserInfo(void *offset, unsigned int mask, const long *arg) int VARGS Plug_SetUserInfo(void *offset, unsigned int mask, const int *arg)
{ {
char *key = VM_POINTER(arg[0]); char *key = VM_POINTER(arg[0]);
char *value = VM_POINTER(arg[1]); char *value = VM_POINTER(arg[1]);
@ -429,7 +429,7 @@ int VARGS Plug_SetUserInfo(void *offset, unsigned int mask, const long *arg)
return true; return true;
} }
int VARGS Plug_Con_SubPrint(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Con_SubPrint(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
char *text = VM_POINTER(arg[1]); char *text = VM_POINTER(arg[1]);
@ -455,7 +455,7 @@ int VARGS Plug_Con_SubPrint(void *offset, unsigned int mask, const long *arg)
return 1; return 1;
} }
int VARGS Plug_Con_RenameSub(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Con_RenameSub(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
console_t *con; console_t *con;
@ -469,7 +469,7 @@ int VARGS Plug_Con_RenameSub(void *offset, unsigned int mask, const long *arg)
return 1; return 1;
} }
int VARGS Plug_Con_IsActive(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Con_IsActive(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
console_t *con; console_t *con;
@ -481,7 +481,7 @@ int VARGS Plug_Con_IsActive(void *offset, unsigned int mask, const long *arg)
return Con_IsActive(con); return Con_IsActive(con);
} }
int VARGS Plug_Con_SetActive(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Con_SetActive(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
console_t *con; console_t *con;
@ -494,7 +494,7 @@ int VARGS Plug_Con_SetActive(void *offset, unsigned int mask, const long *arg)
Con_SetActive(con); Con_SetActive(con);
return true; return true;
} }
int VARGS Plug_Con_Destroy(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Con_Destroy(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
console_t *con; console_t *con;
@ -507,7 +507,7 @@ int VARGS Plug_Con_Destroy(void *offset, unsigned int mask, const long *arg)
Con_Destroy(con); Con_Destroy(con);
return true; return true;
} }
int VARGS Plug_Con_NameForNum(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Con_NameForNum(void *offset, unsigned int mask, const int *arg)
{ {
char num = VM_LONG(arg[0]); char num = VM_LONG(arg[0]);
char *buffer = VM_POINTER(arg[1]); char *buffer = VM_POINTER(arg[1]);

View file

@ -298,15 +298,20 @@ netadr_t ui_pings[MAX_PINGREQUESTS];
#define UITAGNUM 2452 #define UITAGNUM 2452
extern model_t mod_known[];
#define VM_FROMMHANDLE(a) (a?mod_known+a-1:NULL)
#define VM_TOMHANDLE(a) (a?a-mod_known+1:0)
extern shader_t r_shaders[];
#define VM_FROMSHANDLE(a) (a?r_shaders+a-1:NULL)
#define VM_TOSHANDLE(a) (a?a-r_shaders+1:0)
typedef struct q3refEntity_s { typedef struct q3refEntity_s {
refEntityType_t reType; refEntityType_t reType;
int renderfx; int renderfx;
struct model_s *hModel; // opaque type outside refresh int hModel; // opaque type outside refresh
// most recent data // most recent data
vec3_t lightingOrigin; // so multi-part models can be lit identically (RF_LIGHTING_ORIGIN) vec3_t lightingOrigin; // so multi-part models can be lit identically (RF_LIGHTING_ORIGIN)
@ -324,8 +329,7 @@ typedef struct q3refEntity_s {
// texturing // texturing
int skinNum; // inline skin index int skinNum; // inline skin index
//int customSkin; // NULL for default skin int customSkin; // NULL for default skin
char *customSkin; //the function that references this wants a char* not an int
int customShader; // use one image for the entire thing int customShader; // use one image for the entire thing
// misc // misc
@ -346,13 +350,50 @@ typedef struct q3refEntity_s {
#define Q3RF_THIRD_PERSON 2 // don't draw through eyes, only mirrors (player bodies, chat sprites) #define Q3RF_THIRD_PERSON 2 // don't draw through eyes, only mirrors (player bodies, chat sprites)
#define Q3RF_FIRST_PERSON 4 // only draw through eyes (view weapon, damage blood blob) #define Q3RF_FIRST_PERSON 4 // only draw through eyes (view weapon, damage blood blob)
#define Q3RF_DEPTHHACK 8 // for view weapon Z crunching #define Q3RF_DEPTHHACK 8 // for view weapon Z crunching
#define MAX_VMQ3_CACHED_STRINGS 1024
char *stringcache[1024];
char *VMQ3_StringFromHandle(int handle)
{
if (!handle)
return "";
handle--;
if ((unsigned) handle >= MAX_VMQ3_CACHED_STRINGS)
return "";
return stringcache[handle];
}
int VMQ3_StringToHandle(char *str)
{
int i;
for (i = 0; i < MAX_VMQ3_CACHED_STRINGS; i++)
{
if (!stringcache[i])
break;
if (!strcmp(str, stringcache[i]))
return i+1;
}
if (i == MAX_VMQ3_CACHED_STRINGS)
{
Con_Printf("Q3VM out of string handle space\n");
return 0;
}
stringcache[i] = Z_Malloc(strlen(str)+1);
strcpy(stringcache[i], str);
return i+1;
}
#define VM_TOSTRCACHE(a) VMQ3_StringToHandle(VM_POINTER(a))
#define VM_FROMSTRCACHE(a) VMQ3_StringFromHandle(a)
void VQ3_AddEntity(const q3refEntity_t *q3) void VQ3_AddEntity(const q3refEntity_t *q3)
{ {
entity_t ent; entity_t ent;
if (!cl_visedicts) if (!cl_visedicts)
cl_visedicts = cl_visedicts_list[0]; cl_visedicts = cl_visedicts_list[0];
memset(&ent, 0, sizeof(ent)); memset(&ent, 0, sizeof(ent));
ent.model = q3->hModel; ent.model = VM_FROMMHANDLE(q3->hModel);
ent.frame = q3->frame; ent.frame = q3->frame;
ent.oldframe = q3->oldframe; ent.oldframe = q3->oldframe;
memcpy(ent.axis, q3->axis, sizeof(q3->axis)); memcpy(ent.axis, q3->axis, sizeof(q3->axis));
@ -362,14 +403,14 @@ void VQ3_AddEntity(const q3refEntity_t *q3)
ent.rotation = q3->rotation; ent.rotation = q3->rotation;
if (q3->customSkin) if (q3->customSkin)
ent.skinnum = Mod_SkinForName(ent.model, q3->customSkin); ent.skinnum = Mod_SkinForName(ent.model, VM_FROMSTRCACHE(q3->customSkin));
ent.shaderRGBAf[0] = q3->shaderRGBA[0]/255.0f; ent.shaderRGBAf[0] = q3->shaderRGBA[0]/255.0f;
ent.shaderRGBAf[1] = q3->shaderRGBA[1]/255.0f; ent.shaderRGBAf[1] = q3->shaderRGBA[1]/255.0f;
ent.shaderRGBAf[2] = q3->shaderRGBA[2]/255.0f; ent.shaderRGBAf[2] = q3->shaderRGBA[2]/255.0f;
ent.shaderRGBAf[3] = q3->shaderRGBA[3]/255.0f; ent.shaderRGBAf[3] = q3->shaderRGBA[3]/255.0f;
#ifdef Q3SHADERS #ifdef Q3SHADERS
ent.forcedshader = (void*)q3->customShader; ent.forcedshader = VM_FROMSHANDLE(q3->customShader);
ent.shaderTime = q3->shaderTime; ent.shaderTime = q3->shaderTime;
#endif #endif
if (q3->renderfx & Q3RF_FIRST_PERSON) if (q3->renderfx & Q3RF_FIRST_PERSON)
@ -557,21 +598,19 @@ void UI_RegisterFont(char *fontName, int pointSize, fontInfo_t *font)
Q_strncpyz(font->name, name, sizeof(font->name)); Q_strncpyz(font->name, name, sizeof(font->name));
for (i = GLYPH_START; i < GLYPH_END; i++) for (i = GLYPH_START; i < GLYPH_END; i++)
{ {
font->glyphs[i].glyph = (int)R_RegisterPic(font->glyphs[i].shaderName); font->glyphs[i].glyph = VM_TOSHANDLE(R_RegisterPic(font->glyphs[i].shaderName));
} }
} }
} }
#define VM_FROMHANDLE(a) ((void*)a)
#define VM_TOHANDLE(a) ((int)a)
#define VALIDATEPOINTER(o,l) if ((int)o + l >= mask || VM_POINTER(o) < offset) SV_Error("Call to ui trap %i passes invalid pointer\n", fn); //out of bounds. #define VALIDATEPOINTER(o,l) if ((int)o + l >= mask || VM_POINTER(o) < offset) SV_Error("Call to ui trap %i passes invalid pointer\n", fn); //out of bounds.
#ifndef _DEBUG #ifndef _DEBUG
static static
#endif #endif
long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg) int UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const int *arg)
{ {
int ret=0; int ret=0;
@ -728,7 +767,7 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
case UI_R_REGISTERMODEL: //precache model case UI_R_REGISTERMODEL: //precache model
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
VM_LONG(ret) = VM_TOHANDLE(Mod_ForName(name, false)); VM_LONG(ret) = VM_TOMHANDLE(Mod_ForName(name, false));
} }
break; break;
case UI_R_MODELBOUNDS: case UI_R_MODELBOUNDS:
@ -736,7 +775,7 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
VALIDATEPOINTER(arg[1], sizeof(vec3_t)); VALIDATEPOINTER(arg[1], sizeof(vec3_t));
VALIDATEPOINTER(arg[2], sizeof(vec3_t)); VALIDATEPOINTER(arg[2], sizeof(vec3_t));
{ {
model_t *mod = VM_FROMHANDLE(arg[0]); model_t *mod = VM_FROMMHANDLE(arg[0]);
if (mod) if (mod)
{ {
VectorCopy(mod->mins, ((float*)VM_POINTER(arg[1]))); VectorCopy(mod->mins, ((float*)VM_POINTER(arg[1])));
@ -754,10 +793,7 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
case UI_R_REGISTERSKIN: case UI_R_REGISTERSKIN:
{ {
char *buf; char *buf;
char *skinname = VM_POINTER(arg[0]); VM_LONG(ret) = VM_TOSTRCACHE(arg[0]);
buf = Z_TagMalloc(strlen(skinname)+1, UITAGNUM);
strcpy(buf, skinname);
VM_LONG(ret) = (int)buf; //precache skin - engine ignores these anyway... (for now)
} }
break; break;
@ -768,9 +804,9 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
if (!*(char*)VM_POINTER(arg[0])) if (!*(char*)VM_POINTER(arg[0]))
VM_LONG(ret) = 0; VM_LONG(ret) = 0;
else if (qrenderer == QR_OPENGL) else if (qrenderer == QR_OPENGL)
VM_LONG(ret) = (long)R_RegisterPic(VM_POINTER(arg[0])); VM_LONG(ret) = VM_TOSHANDLE(R_RegisterPic(VM_POINTER(arg[0])));
else //FIXME: 64bit else
VM_LONG(ret) = (long)Draw_SafeCachePic(VM_POINTER(arg[0])); // VM_LONG(ret) = (long)Draw_SafeCachePic(VM_POINTER(arg[0]));
break; break;
case UI_R_CLEARSCENE: //clear scene case UI_R_CLEARSCENE: //clear scene
@ -801,16 +837,16 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
// qglEnable(GL_BLEND); // qglEnable(GL_BLEND);
// GL_TexEnv(GL_MODULATE); // GL_TexEnv(GL_MODULATE);
if (qrenderer == QR_OPENGL) if (qrenderer == QR_OPENGL)
GLDraw_ShaderImage(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]), VM_FLOAT(arg[2]), VM_FLOAT(arg[3]), VM_FLOAT(arg[4]), VM_FLOAT(arg[5]), VM_FLOAT(arg[6]), VM_FLOAT(arg[7]), (void *)VM_LONG(arg[8])); GLDraw_ShaderImage(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]), VM_FLOAT(arg[2]), VM_FLOAT(arg[3]), VM_FLOAT(arg[4]), VM_FLOAT(arg[5]), VM_FLOAT(arg[6]), VM_FLOAT(arg[7]), VM_FROMSHANDLE(arg[8]));
else // else
Draw_Image(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]), VM_FLOAT(arg[2]), VM_FLOAT(arg[3]), VM_FLOAT(arg[4]), VM_FLOAT(arg[5]), VM_FLOAT(arg[6]), VM_FLOAT(arg[7]), (mpic_t *)VM_LONG(arg[8])); // Draw_Image(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]), VM_FLOAT(arg[2]), VM_FLOAT(arg[3]), VM_FLOAT(arg[4]), VM_FLOAT(arg[5]), VM_FLOAT(arg[6]), VM_FLOAT(arg[7]), (mpic_t *)VM_LONG(arg[8]));
break; break;
case UI_CM_LERPTAG: //Lerp tag... case UI_CM_LERPTAG: //Lerp tag...
// tag, model, startFrame, endFrame, frac, tagName // tag, model, startFrame, endFrame, frac, tagName
if ((int)arg[0] + sizeof(float)*12 >= mask || VM_POINTER(arg[0]) < offset) if ((int)arg[0] + sizeof(float)*12 >= mask || VM_POINTER(arg[0]) < offset)
break; //out of bounds. break; //out of bounds.
VM_LerpTag(VM_POINTER(arg[0]), (model_t*)VM_LONG(arg[1]), VM_LONG(arg[2]), VM_LONG(arg[3]), VM_FLOAT(arg[4]), VM_POINTER(arg[5])); VM_LerpTag(VM_POINTER(arg[0]), VM_FROMMHANDLE(arg[1]), VM_LONG(arg[2]), VM_LONG(arg[3]), VM_FLOAT(arg[4]), VM_POINTER(arg[5]));
break; break;
case UI_S_REGISTERSOUND: case UI_S_REGISTERSOUND:
@ -818,14 +854,14 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
sfx_t *sfx; sfx_t *sfx;
sfx = S_PrecacheSound(va("../%s", VM_POINTER(arg[0]))); sfx = S_PrecacheSound(va("../%s", VM_POINTER(arg[0])));
if (sfx) if (sfx)
VM_LONG(ret) = sfx->name - (char *)offset; VM_LONG(ret) = VM_TOSTRCACHE(arg[0]); //return handle is the parameter they just gave
else else
VM_LONG(ret) = -1; VM_LONG(ret) = -1;
} }
break; break;
case UI_S_STARTLOCALSOUND: case UI_S_STARTLOCALSOUND:
if (VM_LONG(arg[0]) != -1 && arg[0]) if (VM_LONG(arg[0]) != -1 && arg[0])
S_LocalSound(VM_LONG(arg[0])+(char *)offset); S_LocalSound(VM_FROMSTRCACHE(arg[0])); //now we can fix up the sound name
break; break;
case UI_KEY_GETOVERSTRIKEMODE: case UI_KEY_GETOVERSTRIKEMODE:
@ -979,37 +1015,14 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
break; break;
case UI_CVAR_REGISTER: case UI_CVAR_REGISTER:
if ((int)arg[0] + sizeof(vmcvar_t) >= mask || VM_POINTER(arg[0]) < offset) if (VM_OOB(arg[0], sizeof(vmcvar_t)))
break; //out of bounds. break; //out of bounds.
{ return VMQ3_Cvar_Register(VM_POINTER(arg[0]), VM_POINTER(arg[1]), VM_POINTER(arg[2]), VM_LONG(arg[3]));
vmcvar_t *vmc;
cvar_t *var;
vmc = VM_POINTER(arg[0]);
var = Cvar_Get(VM_POINTER(arg[1]), VM_POINTER(arg[2]), 0/*VM_LONG(arg[3])*/, "UI cvar");
if (!vmc)
break;
vmc->handle = (char *)var - (char *)offset;
vmc->integer = var->value;
vmc->value = var->value;
vmc->modificationCount = var->modified;
Q_strncpyz(vmc->string, var->string, sizeof(vmc->string));
}
case UI_CVAR_UPDATE: case UI_CVAR_UPDATE:
if ((int)arg[0] + sizeof(vmcvar_t) >= mask || VM_POINTER(arg[0]) < offset) if (VM_OOB(arg[0], sizeof(vmcvar_t)))
break; //out of bounds. break; //out of bounds.
{ return VMQ3_Cvar_Update(VM_POINTER(arg[0]));
cvar_t *var;
vmcvar_t *vmc;
vmc = VM_POINTER(arg[0]);
var = (cvar_t *)((int)vmc->handle + (char *)offset);
vmc->integer = var->value;
vmc->value = var->value;
vmc->modificationCount = var->modified;
Q_strncpyz(vmc->string, var->string, sizeof(vmc->string));
}
break;
case UI_MEMORY_REMAINING: case UI_MEMORY_REMAINING:
VM_LONG(ret) = Hunk_LowMemAvailable(); VM_LONG(ret) = Hunk_LowMemAvailable();
@ -1112,14 +1125,13 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
case UI_CEIL: case UI_CEIL:
VM_FLOAT(ret)=(float)ceil(VM_FLOAT(arg[0])); VM_FLOAT(ret)=(float)ceil(VM_FLOAT(arg[0]));
break; break;
/*
case UI_CACHE_PIC: case UI_CACHE_PIC:
if (!Draw_SafeCachePic) if (!Draw_SafeCachePic)
VM_LONG(ret) = 0; VM_LONG(ret) = 0;
else else
{ {
/*VM_LONG(ret) = (long)*/Draw_SafeCachePic(VM_POINTER(arg[0])); VM_LONG(ret) = 0;//FIXME: 64bit (long)R_RegisterPic(VM_POINTER(arg[0]));
VM_LONG(ret) = (long)R_RegisterPic(VM_POINTER(arg[0]));
} }
break; break;
case UI_PICFROMWAD: case UI_PICFROMWAD:
@ -1127,8 +1139,7 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
VM_LONG(ret) = 0; VM_LONG(ret) = 0;
else else
{ {
/*VM_LONG(ret) = (long)*/Draw_SafePicFromWad(VM_POINTER(arg[0])); VM_LONG(ret) = 0;//FIXME: 64bit (long)R_RegisterPic(VM_POINTER(arg[0]));
VM_LONG(ret) = (long)R_RegisterPic(VM_POINTER(arg[0]));
} }
break; break;
case UI_GETPLAYERINFO: case UI_GETPLAYERINFO:
@ -1225,7 +1236,7 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
return strlen(str); return strlen(str);
} }
*/
case UI_PC_ADD_GLOBAL_DEFINE: case UI_PC_ADD_GLOBAL_DEFINE:
Con_Printf("UI_PC_ADD_GLOBAL_DEFINE not supported\n"); Con_Printf("UI_PC_ADD_GLOBAL_DEFINE not supported\n");
@ -1264,7 +1275,7 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
} }
#ifdef _DEBUG #ifdef _DEBUG
static long UI_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, const long *arg) static int UI_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, const int *arg)
{ //this is so we can use edit and continue properly (vc doesn't like function pointers for edit+continue) { //this is so we can use edit and continue properly (vc doesn't like function pointers for edit+continue)
return UI_SystemCallsEx(offset, mask, fn, arg); return UI_SystemCallsEx(offset, mask, fn, arg);
} }
@ -1275,7 +1286,7 @@ static long UI_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, con
//but dlls call it without saying what sort of vm it comes from, so I've got to have them as specifics //but dlls call it without saying what sort of vm it comes from, so I've got to have them as specifics
static int EXPORT_FN UI_SystemCalls(int arg, ...) static int EXPORT_FN UI_SystemCalls(int arg, ...)
{ {
long args[9]; int args[9];
va_list argptr; va_list argptr;
va_start(argptr, arg); va_start(argptr, arg);
@ -1295,26 +1306,35 @@ static int EXPORT_FN UI_SystemCalls(int arg, ...)
qboolean UI_DrawStatusBar(int scores) qboolean UI_DrawStatusBar(int scores)
{ {
return false;
/*
if (!uivm) if (!uivm)
return false; return false;
return VM_Call(uivm, UI_DRAWSTATUSBAR, scores); return VM_Call(uivm, UI_DRAWSTATUSBAR, scores);
*/
} }
qboolean UI_DrawFinale(void) qboolean UI_DrawFinale(void)
{ {
return false;
/*
if (!uivm) if (!uivm)
return false; return false;
return VM_Call(uivm, UI_FINALE); return VM_Call(uivm, UI_FINALE);
*/
} }
qboolean UI_DrawIntermission(void) qboolean UI_DrawIntermission(void)
{ {
return false;
/*
if (!uivm) if (!uivm)
return false; return false;
return VM_Call(uivm, UI_INTERMISSION); return VM_Call(uivm, UI_INTERMISSION);
*/
} }
void UI_DrawMenu(void) void UI_DrawMenu(void)
@ -1330,25 +1350,31 @@ void UI_DrawMenu(void)
qboolean UI_CenterPrint(char *text, qboolean finale) qboolean UI_CenterPrint(char *text, qboolean finale)
{ {
scr_centerstring = text; scr_centerstring = text;
return false;
/*
if (!uivm) if (!uivm)
return false; return false;
return VM_Call(uivm, UI_STRINGCHANGED, SID_CENTERPRINTTEXT); return VM_Call(uivm, UI_STRINGCHANGED, SID_CENTERPRINTTEXT);
*/
} }
qboolean UI_Q2LayoutChanged(void) qboolean UI_Q2LayoutChanged(void)
{ {
return false;
/*
if (!uivm) if (!uivm)
return false; return false;
return VM_Call(uivm, UI_STRINGCHANGED, SID_CENTERPRINTTEXT); return VM_Call(uivm, UI_STRINGCHANGED, SID_CENTERPRINTTEXT);
*/
} }
void UI_StringChanged(int num) void UI_StringChanged(int num)
{ {
if (uivm) /* if (uivm)
VM_Call(uivm, UI_STRINGCHANGED, num); VM_Call(uivm, UI_STRINGCHANGED, num);
*/
} }
void UI_Reset(void) void UI_Reset(void)
@ -1467,15 +1493,11 @@ void UI_Start (void)
if (qrenderer != QR_OPENGL && qrenderer != QR_DIRECT3D) if (qrenderer != QR_OPENGL && qrenderer != QR_DIRECT3D)
return; return;
uivm = VM_Create(NULL, "vm/qwui", UI_SystemCalls, UI_SystemCallsEx);
if (!uivm) //broken currently, I believe.
uivm = VM_Create(NULL, "vm/ui", UI_SystemCalls, UI_SystemCallsEx); uivm = VM_Create(NULL, "vm/ui", UI_SystemCalls, UI_SystemCallsEx);
if (uivm) if (uivm)
{ {
apiversion = VM_Call(uivm, UI_GETAPIVERSION, UI_API_VERSION); apiversion = VM_Call(uivm, UI_GETAPIVERSION, 6);
if (apiversion == UI_API_VERSION) if (apiversion != 4 && apiversion != 6) //make sure we can run the thing
keycatcher = 0;
else if (apiversion != 4 && apiversion != 6) //make sure we can run the thing
{ {
Con_Printf("User-Interface VM uses incompatable API version (%i)\n", apiversion); Con_Printf("User-Interface VM uses incompatable API version (%i)\n", apiversion);
VM_Destroy(uivm); VM_Destroy(uivm);

View file

@ -999,13 +999,10 @@ void Skin_FlushPlayers(void);
//valid.c //valid.c
void Validation_FlushFileList(void); void Validation_FlushFileList(void);
void ValidationPrintVersion(char *f_query_string);
void Validation_Server(void);
void Validation_FilesModified (void);
void Validation_Skins(void);
void Validation_CheckIfResponse(char *text); void Validation_CheckIfResponse(char *text);
void InitValidation(void); void InitValidation(void);
void Validation_IncludeFile(char *filename, char *file, int filelen); void Validation_IncludeFile(char *filename, char *file, int filelen);
void Validation_Auto_Response(int playernum, char *s);
extern qboolean f_modified_particles; extern qboolean f_modified_particles;
extern qboolean care_f_modified; extern qboolean care_f_modified;

View file

@ -442,6 +442,7 @@ qboolean CLQ3_SystemInfoChanged(char *str)
char *pc, *pn; char *pc, *pn;
char *rc, *rn; char *rc, *rn;
Con_Printf("Server's sv_pure: \"%s\"\n", Info_ValueForKey(str, "sv_pure"));
usingpure = atoi(Info_ValueForKey(str, "sv_pure")); usingpure = atoi(Info_ValueForKey(str, "sv_pure"));
usingcheats = atoi(Info_ValueForKey(str, "sv_cheats")); usingcheats = atoi(Info_ValueForKey(str, "sv_cheats"));
Cvar_ForceCheatVars(usingpure||usingcheats, usingcheats); Cvar_ForceCheatVars(usingpure||usingcheats, usingcheats);

View file

@ -247,14 +247,6 @@ typedef struct {
extern ClientConnectionState_t ccs; extern ClientConnectionState_t ccs;
typedef struct {
int handle;
int modificationCount;
float value;
int integer;
char string[256];
} vmcvar_t;
typedef enum { typedef enum {
svcq3_bad, svcq3_bad,
svcq3_nop, svcq3_nop,

File diff suppressed because it is too large Load diff

View file

@ -154,13 +154,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#undef QTERM //not supported - FIXME: move to native plugin #undef QTERM //not supported - FIXME: move to native plugin
#endif #endif
#ifdef __amd64__
//I'm slowly getting these working in 64bit
#undef Q3CLIENT
#undef Q3SERVER
#undef PLUGINS
#endif
#if (defined(Q2CLIENT) || defined(Q2SERVER)) #if (defined(Q2CLIENT) || defined(Q2SERVER))
#ifndef Q2BSPS #ifndef Q2BSPS
#error "Q2 game support without Q2BSP support. doesn't make sense" #error "Q2 game support without Q2BSP support. doesn't make sense"

View file

@ -2,7 +2,7 @@
#if defined(D3DQUAKE) || defined(RGLQUAKE) || defined(SERVERONLY) #if defined(D3DQUAKE) || defined(RGLQUAKE) || defined(SERVERONLY)
#ifdef D3DQUAKE #ifdef D3DQUAKE
#include "d3dquake.h" //#include "d3dquake.h"
#endif #endif
#ifdef RGLQUAKE #ifdef RGLQUAKE
#include "glquake.h" #include "glquake.h"
@ -2597,8 +2597,8 @@ qboolean Mod_LoadQ3Model(model_t *mod, void *buffer)
md3tag_t *src; md3tag_t *src;
md3tag_t *dst; md3tag_t *dst;
src = (md3tag_t *)(((unsigned int)header)+LittleLong(header->ofsTags)); src = (md3tag_t *)((char*)header+LittleLong(header->ofsTags));
dst = (md3tag_t *)(((unsigned int)root)+root->ofstags); dst = (md3tag_t *)((char*)root+root->ofstags);
for(i=0;i<LittleLong(header->numTags)*LittleLong(header->numFrames);i++) for(i=0;i<LittleLong(header->numTags)*LittleLong(header->numFrames);i++)
{ {
memcpy(dst->name, src->name, sizeof(dst->name)); memcpy(dst->name, src->name, sizeof(dst->name));

View file

@ -160,6 +160,8 @@ char *Cvar_FlagToName(int flag)
return "rendercallback"; return "rendercallback";
case CVAR_NOUNSAFEEXPAND: case CVAR_NOUNSAFEEXPAND:
return "nounsafeexpand"; return "nounsafeexpand";
case CVAR_RULESETLATCH:
return "rulesetlatch";
} }
return NULL; return NULL;
@ -604,7 +606,7 @@ Cvar_Set
============ ============
*/ */
cvar_t *Cvar_SetCore (cvar_t *var, const char *value, qboolean force) cvar_t *Cvar_SetCore (cvar_t *var, const char *value, qboolean force)
{ { //fixme: force should probably be a latch bitmask
char *latch=NULL; char *latch=NULL;
if (!var) if (!var)
@ -722,6 +724,47 @@ cvar_t *Cvar_SetCore (cvar_t *var, const char *value, qboolean force)
return var; return var;
} }
qboolean Cvar_ApplyLatchFlag(cvar_t *var, char *value, int flag)
{
qboolean result = true;
char *latch;
var->flags &= ~flag;
latch = var->latched_string;
var->latched_string = NULL;
if (!latch)
{
#ifndef _MSC_VER
#warning this means the callback will never be called
#endif
latch = var->string;
var->string = NULL;
}
#ifndef _MSC_VER
#warning set or forceset?
#endif
Cvar_Set(var, value);
if (var->latched_string)
{ //something else latched it
Z_Free(var->latched_string);
var->latched_string = NULL;
result = false;
}
else
var->flags |= flag;
if (latch)
{
if (!strcmp(var->string, latch))
Z_Free(latch); //don't allow a latch to be the same as the current value
else
var->latched_string = latch;
}
return result;
}
void Cvar_ForceCheatVars(qboolean semicheats, qboolean absolutecheats) void Cvar_ForceCheatVars(qboolean semicheats, qboolean absolutecheats)
{ //this either unlatches if the cheat type is allowed, or enforces a default for full cheats and blank for semicheats. { //this either unlatches if the cheat type is allowed, or enforces a default for full cheats and blank for semicheats.
//this is clientside only. //this is clientside only.
@ -741,6 +784,9 @@ void Cvar_ForceCheatVars(qboolean semicheats, qboolean absolutecheats)
var->latched_string = NULL; var->latched_string = NULL;
if (!latch) if (!latch)
{ {
#ifndef _MSC_VER
#warning this means the callback will never be called
#endif
latch = var->string; latch = var->string;
var->string = NULL; var->string = NULL;
} }
@ -777,8 +823,8 @@ void Cvar_ApplyLatches(int latchflag)
int mask = ~0; int mask = ~0;
int of; int of;
if (latchflag == CVAR_SERVEROVERRIDE) //these ones are cleared if (latchflag == CVAR_SERVEROVERRIDE || latchflag == CVAR_RULESETLATCH) //these ones are cleared
mask = ~CVAR_SERVEROVERRIDE; mask = ~latchflag;
for (grp=cvar_groups ; grp ; grp=grp->next) for (grp=cvar_groups ; grp ; grp=grp->next)
for (var=grp->cvars ; var ; var=var->next) for (var=grp->cvars ; var ; var=var->next)

View file

@ -1417,11 +1417,13 @@ void COM_Path_f (void)
if (com_purepaths) if (com_purepaths)
{ {
Con_Printf ("Pure paths:\n");
for (s=com_purepaths ; s ; s=s->nextpure) for (s=com_purepaths ; s ; s=s->nextpure)
{ {
s->funcs->PrintPath(s->handle); s->funcs->PrintPath(s->handle);
} }
Con_Printf ("----------\n"); Con_Printf ("----------\n");
Con_Printf ("Impure paths:\n");
} }
@ -1605,7 +1607,7 @@ void FS_FlushFSHash(void)
while(bucket) while(bucket)
{ {
next = bucket->next; next = bucket->next;
if (bucket->keystring == (char*)(bucket+1)) if (bucket->key.string == (char*)(bucket+1))
Z_Free(bucket); Z_Free(bucket);
bucket = next; bucket = next;
} }
@ -2856,10 +2858,14 @@ void FS_ForceToPure(char *str, char *crcs, int seed)
if (!str) if (!str)
{ //pure isn't in use. { //pure isn't in use.
if (com_purepaths)
Con_Printf("Pure FS deactivated\n");
com_purepaths = NULL; com_purepaths = NULL;
FS_FlushFSHash(); FS_FlushFSHash();
return; return;
} }
if (!com_purepaths)
Con_Printf("Pure FS activated\n");
for (sp = com_searchpaths; sp; sp = sp->next) for (sp = com_searchpaths; sp; sp = sp->next)
{ {

View file

@ -103,7 +103,7 @@ cvar_t plug_loaddefault = SCVAR("plug_loaddefault", "1");
#endif #endif
//custom plugin builtins. //custom plugin builtins.
typedef int (VARGS *Plug_Builtin_t)(void *offset, unsigned int mask, const long *arg); typedef int (VARGS *Plug_Builtin_t)(void *offset, unsigned int mask, const int *arg);
void Plug_RegisterBuiltin(char *name, Plug_Builtin_t bi, int flags); void Plug_RegisterBuiltin(char *name, Plug_Builtin_t bi, int flags);
#define PLUG_BIF_DLLONLY 1 #define PLUG_BIF_DLLONLY 1
#define PLUG_BIF_QVMONLY 2 #define PLUG_BIF_QVMONLY 2
@ -214,7 +214,7 @@ static void Plug_RegisterBuiltinIndex(char *name, Plug_Builtin_t bi, int flags,
} }
*/ */
int VARGS Plug_FindBuiltin(void *offset, unsigned int mask, const long *args) int VARGS Plug_FindBuiltin(void *offset, unsigned int mask, const int *args)
{ {
int i; int i;
for (i = 0; i < numplugbuiltins; i++) for (i = 0; i < numplugbuiltins; i++)
@ -231,7 +231,7 @@ int VARGS Plug_FindBuiltin(void *offset, unsigned int mask, const long *args)
return 0; return 0;
} }
long Plug_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg) int Plug_SystemCallsEx(void *offset, unsigned int mask, int fn, const int *arg)
{ {
fn = fn+1; fn = fn+1;
@ -243,7 +243,7 @@ long Plug_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg
} }
#ifdef _DEBUG #ifdef _DEBUG
static long Plug_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, const long *arg) static int Plug_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, const int *arg)
{ //this is so we can use edit and continue properly (vc doesn't like function pointers for edit+continue) { //this is so we can use edit and continue properly (vc doesn't like function pointers for edit+continue)
return Plug_SystemCallsEx(offset, mask, fn, arg); return Plug_SystemCallsEx(offset, mask, fn, arg);
} }
@ -254,7 +254,7 @@ static long Plug_SystemCallsExWrapper(void *offset, unsigned int mask, int fn, c
//but dlls call it without saying what sort of vm it comes from, so I've got to have them as specifics //but dlls call it without saying what sort of vm it comes from, so I've got to have them as specifics
static int EXPORT_FN Plug_SystemCalls(int arg, ...) static int EXPORT_FN Plug_SystemCalls(int arg, ...)
{ {
long args[9]; int args[9];
va_list argptr; va_list argptr;
va_start(argptr, arg); va_start(argptr, arg);
@ -282,7 +282,7 @@ static int EXPORT_FN Plug_SystemCalls(int arg, ...)
plugin_t *Plug_Load(char *file) plugin_t *Plug_Load(char *file)
{ {
plugin_t *newplug; plugin_t *newplug;
long argarray; int argarray;
for (newplug = plugs; newplug; newplug = newplug->next) for (newplug = plugs; newplug; newplug = newplug->next)
{ {
@ -336,23 +336,23 @@ int Plug_Emumerated (char *name, int size, void *param)
return true; return true;
} }
int VARGS Plug_Con_Print(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Con_Print(void *offset, unsigned int mask, const int *arg)
{ {
// if (qrenderer <= 0) // if (qrenderer <= 0)
// return false; // return false;
Con_Printf("%s", (char*)VM_POINTER(arg[0])); Con_Printf("%s", (char*)VM_POINTER(arg[0]));
return 0; return 0;
} }
int VARGS Plug_Sys_Error(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Sys_Error(void *offset, unsigned int mask, const int *arg)
{ {
Sys_Error("%s", (char*)offset+arg[0]); Sys_Error("%s", (char*)offset+arg[0]);
return 0; return 0;
} }
int VARGS Plug_Sys_Milliseconds(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Sys_Milliseconds(void *offset, unsigned int mask, const int *arg)
{ {
return Sys_DoubleTime()*1000; return Sys_DoubleTime()*1000;
} }
int VARGS Plug_ExportToEngine(void *offset, unsigned int mask, const long *arg) int VARGS Plug_ExportToEngine(void *offset, unsigned int mask, const int *arg)
{ {
char *name = (char*)VM_POINTER(arg[0]); char *name = (char*)VM_POINTER(arg[0]);
if (!strcmp(name, "Tick")) if (!strcmp(name, "Tick"))
@ -387,7 +387,7 @@ int VARGS Plug_ExportToEngine(void *offset, unsigned int mask, const long *arg)
} }
//retrieve a plugin's name //retrieve a plugin's name
int VARGS Plug_GetPluginName(void *offset, unsigned int mask, const long *arg) int VARGS Plug_GetPluginName(void *offset, unsigned int mask, const int *arg)
{ {
int plugnum = VM_LONG(arg[0]); int plugnum = VM_LONG(arg[0]);
plugin_t *plug; plugin_t *plug;
@ -414,7 +414,7 @@ int VARGS Plug_GetPluginName(void *offset, unsigned int mask, const long *arg)
} }
typedef void (*funcptr_t) (); typedef void (*funcptr_t) ();
int VARGS Plug_ExportNative(void *offset, unsigned int mask, const long *arg) int VARGS Plug_ExportNative(void *offset, unsigned int mask, const int *arg)
{ {
funcptr_t func; funcptr_t func;
char *name = (char*)VM_POINTER(arg[0]); char *name = (char*)VM_POINTER(arg[0]);
@ -470,7 +470,7 @@ typedef struct {
int plugincvararraylen; int plugincvararraylen;
plugincvararray_t *plugincvararray; plugincvararray_t *plugincvararray;
//qhandle_t Cvar_Register (char *name, char *defaultval, int flags, char *grouphint); //qhandle_t Cvar_Register (char *name, char *defaultval, int flags, char *grouphint);
int VARGS Plug_Cvar_Register(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cvar_Register(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
char *defaultvalue = VM_POINTER(arg[1]); char *defaultvalue = VM_POINTER(arg[1]);
@ -491,14 +491,15 @@ int VARGS Plug_Cvar_Register(void *offset, unsigned int mask, const long *arg)
} }
} }
plugincvararray = BZ_Realloc(plugincvararray, (plugincvararraylen+1)*sizeof(plugincvararray_t)); i = plugincvararraylen;
plugincvararray[plugincvararraylen].plugin = currentplug;
plugincvararray[plugincvararraylen].var = var;
plugincvararraylen++; plugincvararraylen++;
return plugincvararraylen-1; plugincvararray = BZ_Realloc(plugincvararray, (plugincvararraylen)*sizeof(plugincvararray_t));
plugincvararray[i].plugin = currentplug;
plugincvararray[i].var = var;
return i;
} }
//int Cvar_Update, (qhandle_t handle, int modificationcount, char *stringv, float *floatv)); //stringv is 256 chars long, don't expect this function to do anything if modification count is unchanged. //int Cvar_Update, (qhandle_t handle, int modificationcount, char *stringv, float *floatv)); //stringv is 256 chars long, don't expect this function to do anything if modification count is unchanged.
int VARGS Plug_Cvar_Update(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cvar_Update(void *offset, unsigned int mask, const int *arg)
{ {
int handle; int handle;
int modcount; int modcount;
@ -528,7 +529,7 @@ int VARGS Plug_Cvar_Update(void *offset, unsigned int mask, const long *arg)
} }
//void Cmd_Args(char *buffer, int buffersize) //void Cmd_Args(char *buffer, int buffersize)
int VARGS Plug_Cmd_Args(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cmd_Args(void *offset, unsigned int mask, const int *arg)
{ {
char *buffer = (char*)VM_POINTER(arg[0]); char *buffer = (char*)VM_POINTER(arg[0]);
char *args; char *args;
@ -539,7 +540,7 @@ int VARGS Plug_Cmd_Args(void *offset, unsigned int mask, const long *arg)
return 1; return 1;
} }
//void Cmd_Argv(int num, char *buffer, int buffersize) //void Cmd_Argv(int num, char *buffer, int buffersize)
int VARGS Plug_Cmd_Argv(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cmd_Argv(void *offset, unsigned int mask, const int *arg)
{ {
char *buffer = (char*)VM_POINTER(arg[1]); char *buffer = (char*)VM_POINTER(arg[1]);
char *args; char *args;
@ -550,13 +551,13 @@ int VARGS Plug_Cmd_Argv(void *offset, unsigned int mask, const long *arg)
return 1; return 1;
} }
//int Cmd_Argc(void) //int Cmd_Argc(void)
int VARGS Plug_Cmd_Argc(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cmd_Argc(void *offset, unsigned int mask, const int *arg)
{ {
return Cmd_Argc(); return Cmd_Argc();
} }
//void Cvar_SetString (char *name, char *value); //void Cvar_SetString (char *name, char *value);
int VARGS Plug_Cvar_SetString(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cvar_SetString(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]), char *name = VM_POINTER(arg[0]),
*value = VM_POINTER(arg[1]); *value = VM_POINTER(arg[1]);
@ -571,7 +572,7 @@ int VARGS Plug_Cvar_SetString(void *offset, unsigned int mask, const long *arg)
} }
//void Cvar_SetFloat (char *name, float value); //void Cvar_SetFloat (char *name, float value);
int VARGS Plug_Cvar_SetFloat(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cvar_SetFloat(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
float value = VM_FLOAT(arg[1]); float value = VM_FLOAT(arg[1]);
@ -586,7 +587,7 @@ int VARGS Plug_Cvar_SetFloat(void *offset, unsigned int mask, const long *arg)
} }
//void Cvar_GetFloat (char *name); //void Cvar_GetFloat (char *name);
int VARGS Plug_Cvar_GetFloat(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cvar_GetFloat(void *offset, unsigned int mask, const int *arg)
{ {
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
int ret; int ret;
@ -601,7 +602,7 @@ int VARGS Plug_Cvar_GetFloat(void *offset, unsigned int mask, const long *arg)
} }
//qboolean Cvar_GetString (char *name, char *retstring, int sizeofretstring); //qboolean Cvar_GetString (char *name, char *retstring, int sizeofretstring);
int VARGS Plug_Cvar_GetString(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cvar_GetString(void *offset, unsigned int mask, const int *arg)
{ {
char *name, *ret; char *name, *ret;
int retsize; int retsize;
@ -626,7 +627,7 @@ int VARGS Plug_Cvar_GetString(void *offset, unsigned int mask, const long *arg)
} }
//void Cmd_AddText (char *text, qboolean insert); //abort the entire engine. //void Cmd_AddText (char *text, qboolean insert); //abort the entire engine.
int VARGS Plug_Cmd_AddText(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cmd_AddText(void *offset, unsigned int mask, const int *arg)
{ {
if (VM_LONG(arg[1])) if (VM_LONG(arg[1]))
Cbuf_InsertText(VM_POINTER(arg[0]), RESTRICT_LOCAL, false); Cbuf_InsertText(VM_POINTER(arg[0]), RESTRICT_LOCAL, false);
@ -665,7 +666,7 @@ void Plug_Command_f(void)
currentplug = oldplug; currentplug = oldplug;
} }
int VARGS Plug_Cmd_AddCommand(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Cmd_AddCommand(void *offset, unsigned int mask, const int *arg)
{ {
int i; int i;
char *name = VM_POINTER(arg[0]); char *name = VM_POINTER(arg[0]);
@ -756,7 +757,7 @@ int Plug_NewStreamHandle(plugstream_e type)
//EBUILTIN(int, NET_TCPListen, (char *ip, int port, int maxcount)); //EBUILTIN(int, NET_TCPListen, (char *ip, int port, int maxcount));
//returns a new socket with listen enabled. //returns a new socket with listen enabled.
int VARGS Plug_Net_TCPListen(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Net_TCPListen(void *offset, unsigned int mask, const int *arg)
{ {
int handle; int handle;
int sock; int sock;
@ -815,7 +816,7 @@ int VARGS Plug_Net_TCPListen(void *offset, unsigned int mask, const long *arg)
return handle; return handle;
} }
int VARGS Plug_Net_Accept(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Net_Accept(void *offset, unsigned int mask, const int *arg)
{ {
int handle = VM_LONG(arg[0]); int handle = VM_LONG(arg[0]);
struct sockaddr_in address; struct sockaddr_in address;
@ -854,7 +855,7 @@ int VARGS Plug_Net_Accept(void *offset, unsigned int mask, const long *arg)
return handle; return handle;
} }
//EBUILTIN(int, NET_TCPConnect, (char *ip, int port)); //EBUILTIN(int, NET_TCPConnect, (char *ip, int port));
int VARGS Plug_Net_TCPConnect(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Net_TCPConnect(void *offset, unsigned int mask, const int *arg)
{ {
char *localip = VM_POINTER(arg[0]); char *localip = VM_POINTER(arg[0]);
unsigned short localport = VM_LONG(arg[1]); unsigned short localport = VM_LONG(arg[1]);
@ -910,7 +911,7 @@ int VARGS Plug_Net_TCPConnect(void *offset, unsigned int mask, const long *arg)
#ifdef GNUTLS #ifdef GNUTLS
int VARGS Plug_Net_SetTLSClient(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Net_SetTLSClient(void *offset, unsigned int mask, const int *arg)
{ {
static gnutls_anon_client_credentials anoncred; static gnutls_anon_client_credentials anoncred;
static gnutls_certificate_credentials xcred; static gnutls_certificate_credentials xcred;
@ -1006,7 +1007,7 @@ int VARGS Plug_Net_SetTLSClient(void *offset, unsigned int mask, const long *arg
} }
#endif #endif
int VARGS Plug_FS_Open(void *offset, unsigned int mask, const long *arg) int VARGS Plug_FS_Open(void *offset, unsigned int mask, const int *arg)
{ {
//modes: //modes:
//1: read //1: read
@ -1061,7 +1062,7 @@ int VARGS Plug_FS_Open(void *offset, unsigned int mask, const long *arg)
return -2; return -2;
} }
int VARGS Plug_memset(void *offset, unsigned int mask, const long *arg) int VARGS Plug_memset(void *offset, unsigned int mask, const int *arg)
{ {
if (VM_OOB(arg[0], arg[2])) if (VM_OOB(arg[0], arg[2]))
return false; return false;
@ -1069,7 +1070,7 @@ int VARGS Plug_memset(void *offset, unsigned int mask, const long *arg)
memset(VM_POINTER(arg[0]), VM_LONG(arg[1]), VM_LONG(arg[2])); memset(VM_POINTER(arg[0]), VM_LONG(arg[1]), VM_LONG(arg[2]));
return arg[0]; return arg[0];
} }
int VARGS Plug_memcpy(void *offset, unsigned int mask, const long *arg) int VARGS Plug_memcpy(void *offset, unsigned int mask, const int *arg)
{ {
if (VM_OOB(arg[0], arg[2])) if (VM_OOB(arg[0], arg[2]))
return false; return false;
@ -1079,7 +1080,7 @@ int VARGS Plug_memcpy(void *offset, unsigned int mask, const long *arg)
memcpy(VM_POINTER(arg[0]), VM_POINTER(arg[1]), VM_LONG(arg[2])); memcpy(VM_POINTER(arg[0]), VM_POINTER(arg[1]), VM_LONG(arg[2]));
return arg[0]; return arg[0];
} }
int VARGS Plug_memmove(void *offset, unsigned int mask, const long *arg) int VARGS Plug_memmove(void *offset, unsigned int mask, const int *arg)
{ {
if (VM_OOB(arg[0], arg[2])) if (VM_OOB(arg[0], arg[2]))
return false; return false;
@ -1090,32 +1091,32 @@ int VARGS Plug_memmove(void *offset, unsigned int mask, const long *arg)
return arg[0]; return arg[0];
} }
int VARGS Plug_sqrt(void *offset, unsigned int mask, const long *arg) int VARGS Plug_sqrt(void *offset, unsigned int mask, const int *arg)
{ {
int ret; int ret;
VM_FLOAT(ret) = sqrt(VM_FLOAT(arg[0])); VM_FLOAT(ret) = sqrt(VM_FLOAT(arg[0]));
return ret; return ret;
} }
int VARGS Plug_sin(void *offset, unsigned int mask, const long *arg) int VARGS Plug_sin(void *offset, unsigned int mask, const int *arg)
{ {
int ret; int ret;
VM_FLOAT(ret) = sin(VM_FLOAT(arg[0])); VM_FLOAT(ret) = sin(VM_FLOAT(arg[0]));
return ret; return ret;
} }
int VARGS Plug_cos(void *offset, unsigned int mask, const long *arg) int VARGS Plug_cos(void *offset, unsigned int mask, const int *arg)
{ {
int ret; int ret;
VM_FLOAT(ret) = cos(VM_FLOAT(arg[0])); VM_FLOAT(ret) = cos(VM_FLOAT(arg[0]));
return ret; return ret;
} }
int VARGS Plug_atan2(void *offset, unsigned int mask, const long *arg) int VARGS Plug_atan2(void *offset, unsigned int mask, const int *arg)
{ {
int ret; int ret;
VM_FLOAT(ret) = atan2(VM_FLOAT(arg[0]), VM_FLOAT(arg[1])); VM_FLOAT(ret) = atan2(VM_FLOAT(arg[0]), VM_FLOAT(arg[1]));
return ret; return ret;
} }
int VARGS Plug_Net_Recv(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Net_Recv(void *offset, unsigned int mask, const int *arg)
{ {
int read; int read;
int handle = VM_LONG(arg[0]); int handle = VM_LONG(arg[0]);
@ -1172,7 +1173,7 @@ int VARGS Plug_Net_Recv(void *offset, unsigned int mask, const long *arg)
return -2; return -2;
} }
} }
int VARGS Plug_Net_Send(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Net_Send(void *offset, unsigned int mask, const int *arg)
{ {
int written; int written;
int handle = VM_LONG(arg[0]); int handle = VM_LONG(arg[0]);
@ -1228,7 +1229,7 @@ int VARGS Plug_Net_Send(void *offset, unsigned int mask, const long *arg)
return -2; return -2;
} }
} }
int VARGS Plug_Net_SendTo(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Net_SendTo(void *offset, unsigned int mask, const int *arg)
{ {
int written; int written;
int handle = VM_LONG(arg[0]); int handle = VM_LONG(arg[0]);
@ -1296,7 +1297,7 @@ void Plug_Net_Close_Internal(int handle)
pluginstreamarray[handle].plugin = NULL; pluginstreamarray[handle].plugin = NULL;
} }
int VARGS Plug_Net_Close(void *offset, unsigned int mask, const long *arg) int VARGS Plug_Net_Close(void *offset, unsigned int mask, const int *arg)
{ {
int handle = VM_LONG(arg[0]); int handle = VM_LONG(arg[0]);
if (handle < 0 || handle >= pluginstreamarraylen || pluginstreamarray[handle].plugin != currentplug) if (handle < 0 || handle >= pluginstreamarraylen || pluginstreamarray[handle].plugin != currentplug)
@ -1328,7 +1329,7 @@ void Plug_Load_f(void)
} }
} }
/* /*
static long Test_SysCalls_Ex(void *offset, unsigned int mask, int fn, const long *arg) static int Test_SysCalls_Ex(void *offset, unsigned int mask, int fn, const int *arg)
{ {
switch(fn) switch(fn)
{ {

View file

@ -308,8 +308,56 @@ int VM_GetFileList(char *path, char *ext, char *output, int buffersize)
#include "clq3defs.h" //okay, urr, this is bad for dedicated servers. urhum. Maybe they're not looking? It's only typedefs and one extern. #include "clq3defs.h" //okay, urr, this is bad for dedicated servers. urhum. Maybe they're not looking? It's only typedefs and one extern.
#define MAX_VMQ3_CVARS 256 //can be blindly increased
cvar_t *q3cvlist[MAX_VMQ3_CVARS];
int VMQ3_Cvar_Register(vmcvar_t *v, char *name, char *defval, int flags)
{
int i;
cvar_t *c = Cvar_Get(name, defval, 0, "Q3VM cvars");
if (!c) //command name, etc
return 0;
for (i = 0; i < MAX_VMQ3_CVARS; i++)
{
if (!q3cvlist[i])
q3cvlist[i] = c;
if (q3cvlist[i] == c)
{
if (v)
{
v->handle = i+1;
VMQ3_Cvar_Update(v);
}
return i+1;
}
}
Con_Printf("Ran out of VMQ3 cvar handles\n");
return 0;
}
int VMQ3_Cvar_Update(vmcvar_t *v)
{
cvar_t *c;
int i;
i = v->handle;
if (!i)
return 0; //not initialised
i--;
if ((unsigned)i >= MAX_VMQ3_CVARS)
return 0; //a hack attempt
c = q3cvlist[i];
if (!c)
return 0; //that slot isn't active yet
v->integer = c->value;
v->value = c->value;
v->modificationCount = c->modified;
Q_strncpyz(v->string, c->string, sizeof(v->string));
return 1;
}
/* /*

View file

@ -93,7 +93,6 @@ typedef struct {
char messageString[MAX_STRING_CHARS]; char messageString[MAX_STRING_CHARS];
} uiClientState_t; } uiClientState_t;
#define UI_API_VERSION 5000
typedef enum { typedef enum {
UI_GETAPIVERSION = 0, // system reserved UI_GETAPIVERSION = 0, // system reserved
@ -128,12 +127,15 @@ typedef enum {
// overlayed over whatever the cgame has drawn. // overlayed over whatever the cgame has drawn.
// a GetClientState syscall will be made to get the current strings // a GetClientState syscall will be made to get the current strings
/*
UI_DRAWSTATUSBAR = 500, UI_DRAWSTATUSBAR = 500,
UI_MOUSE_POS, UI_MOUSE_POS,
UI_INTERMISSION, UI_INTERMISSION,
UI_FINALE, UI_FINALE,
UI_STRINGCHANGED, //parma is the string id UI_STRINGCHANGED, //parma is the string id
UI_NEWSERVER //indicates that all the strings have changed. UI_NEWSERVER //indicates that all the strings have changed.
*/
} uiExport_t; } uiExport_t;
typedef enum { typedef enum {
@ -236,12 +238,12 @@ typedef enum {
UI_SQRT, UI_SQRT,
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,
UI_GETSTAT = 503, UI_GETSTAT = 503,
UI_GETVIDINFO = 504, UI_GETVIDINFO = 504,
UI_GET_STRING = 510, UI_GET_STRING = 510,
*/
} uiImport_t; } uiImport_t;

View file

@ -94,4 +94,14 @@ qboolean CG_Command(void);
qboolean CG_KeyPress(int key, int down); qboolean CG_KeyPress(int key, int down);
#endif #endif
typedef struct {
int handle;
int modificationCount;
float value;
int integer;
char string[256];
} vmcvar_t;
int VMQ3_Cvar_Register(vmcvar_t *v, char *name, char *defval, int flags);
int VMQ3_Cvar_Update(vmcvar_t *v);
#endif #endif

View file

@ -1,3 +1,10 @@
#ifndef __D3DQUAKE_H__
#define __D3DQUAKE_H__
#ifdef __GNUC__
#define _inline static inline
#endif
#include "ddraw.h" #include "ddraw.h"
#include "d3d.h" #include "d3d.h"
#include "d3dx.h" #include "d3dx.h"
@ -71,3 +78,6 @@ extern lightmapinfo_t **lightmap;
extern void *d3dexplosiontexture; extern void *d3dexplosiontexture;
extern void *d3dballtexture; extern void *d3dballtexture;
#endif

View file

@ -1,5 +1,6 @@
#include "quakedef.h" #include "quakedef.h"
#ifdef D3DQUAKE #ifdef D3DQUAKE
#include "winquake.h"
#include "d3dquake.h" #include "d3dquake.h"

View file

@ -1,5 +1,6 @@
#include "quakedef.h" #include "quakedef.h"
#ifdef D3DQUAKE #ifdef D3DQUAKE
#include "winquake.h"
#include "d3d9quake.h" #include "d3d9quake.h"
#define MAX_WIDTH 512 #define MAX_WIDTH 512

View file

@ -1,5 +1,6 @@
#include "quakedef.h" #include "quakedef.h"
#ifdef D3DQUAKE #ifdef D3DQUAKE
#include "winquake.h"
#include "d3d9quake.h" #include "d3d9quake.h"
mleaf_t *r_viewleaf, *r_oldviewleaf; mleaf_t *r_viewleaf, *r_oldviewleaf;

View file

@ -1,5 +1,6 @@
#include "quakedef.h" #include "quakedef.h"
#ifdef D3DQUAKE #ifdef D3DQUAKE
#include "winquake.h"
#include "d3d9quake.h" #include "d3d9quake.h"
int numlightmaps; int numlightmaps;

View file

@ -1,5 +1,6 @@
#include "quakedef.h" #include "quakedef.h"
#ifdef D3DQUAKE #ifdef D3DQUAKE
#include "winquake.h"
#include "d3d9quake.h" #include "d3d9quake.h"
//#include "d3d9.h" //#include "d3d9.h"
@ -526,7 +527,7 @@ void resetD3D9(void)
} }
#if WINVER < 0x500 #if (WINVER < 0x500) && !defined(__GNUC__)
typedef struct tagMONITORINFO typedef struct tagMONITORINFO
{ {
DWORD cbSize; DWORD cbSize;

View file

@ -147,13 +147,13 @@ cvar_t r_shownormals = SCVAR("r_shownormals", "1");
float Q_rsqrt( float number ) float Q_rsqrt( float number )
{ {
long i; int i;
float x2, y; float x2, y;
const float threehalfs = 1.5F; const float threehalfs = 1.5F;
x2 = number * 0.5F; x2 = number * 0.5F;
y = number; y = number;
i = * ( long * ) &y; // evil floating point bit level hacking i = * ( int * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck? i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i; y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration

View file

@ -363,6 +363,8 @@ mpic_t *GLDraw_SafePicFromWad (char *name)
mpic_t *GLDraw_SafeCachePic (char *path) mpic_t *GLDraw_SafeCachePic (char *path)
{ {
//this is EVIL! WRITE IT!
int height = 0; int height = 0;
qbyte *data; qbyte *data;
glcachepic_t *pic; glcachepic_t *pic;

View file

@ -378,6 +378,7 @@ iwboolean FTP_ClientConnThink (FTPclientconn_t *con) //true to kill con
if (temp != INVALID_SOCKET) if (temp != INVALID_SOCKET)
{ {
int _true = true;
ioctlsocket(temp, FIONBIO, &_true); ioctlsocket(temp, FIONBIO, &_true);
con->stage = 6; con->stage = 6;
if (con->type == ftp_getting) if (con->type == ftp_getting)

View file

@ -45,12 +45,11 @@ typedef struct FTPclient_s{
FTPclient_t *FTPclient; FTPclient_t *FTPclient;
qboolean FTP_ServerInit(void) qboolean FTP_ServerInit(int port)
{ {
struct sockaddr_in address; struct sockaddr_in address;
unsigned long _true = true; unsigned long _true = true;
int i; int i;
int port = 21;
if ((ftpserversocket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) if ((ftpserversocket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{ {
@ -752,7 +751,7 @@ unsigned int WINAPI BlockingClient(FTPclient_t *cl)
} }
#endif #endif
iwboolean FTP_ServerRun(iwboolean ftpserverwanted) iwboolean FTP_ServerRun(iwboolean ftpserverwanted, int port)
{ {
FTPclient_t *cl, *prevcl; FTPclient_t *cl, *prevcl;
struct sockaddr_in from; struct sockaddr_in from;
@ -763,7 +762,7 @@ unsigned long _true = true;
if (!ftpserverinitied) if (!ftpserverinitied)
{ {
if (ftpserverwanted) if (ftpserverwanted)
return FTP_ServerInit(); return FTP_ServerInit(port);
return false; return false;
} }
else if (!ftpserverwanted) else if (!ftpserverwanted)

View file

@ -16,12 +16,11 @@ typedef enum {HTTP_WAITINGFORREQUEST,HTTP_SENDING} http_mode_t;
qboolean HTTP_ServerInit(void) qboolean HTTP_ServerInit(int port)
{ {
struct sockaddr_in address; struct sockaddr_in address;
unsigned long _true = true; unsigned long _true = true;
int i; int i;
int port = 80;
if ((httpserversocket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) if ((httpserversocket = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{ {
@ -332,10 +331,15 @@ cont:
} }
else if (!stricmp(mode, "GET") || !stricmp(mode, "HEAD") || !stricmp(mode, "POST")) else if (!stricmp(mode, "GET") || !stricmp(mode, "HEAD") || !stricmp(mode, "POST"))
{ {
if (*resource != '/')
resource[1] = 0; //I'm lazy, they need to comply
Con_Printf("Download request for \"%s\"\n", resource+1);
if (!strnicmp(mode, "P", 1)) //when stuff is posted, data is provided. Give an error message if we couldn't do anything with that data. if (!strnicmp(mode, "P", 1)) //when stuff is posted, data is provided. Give an error message if we couldn't do anything with that data.
cl->file = IWebGenerateFile(resource+1, content, contentlen); cl->file = IWebGenerateFile(resource+1, content, contentlen);
else if (!SV_AllowDownload(resource+1))
cl->file = NULL;
else else
cl->file = FS_OpenVFS(resource, "rb", FS_GAME); cl->file = FS_OpenVFS(resource+1, "rb", FS_GAME);
if (!cl->file) if (!cl->file)
{ {
if (HTTPmarkup >= 3) if (HTTPmarkup >= 3)
@ -477,7 +481,7 @@ notimplemented:
} }
} }
qboolean HTTP_ServerPoll(qboolean httpserverwanted) //loop while true qboolean HTTP_ServerPoll(qboolean httpserverwanted, int portnum) //loop while true
{ {
struct sockaddr_in from; struct sockaddr_in from;
int fromlen; int fromlen;
@ -489,7 +493,7 @@ qboolean HTTP_ServerPoll(qboolean httpserverwanted) //loop while true
if (!httpserverinitied) if (!httpserverinitied)
{ {
if (httpserverwanted) if (httpserverwanted)
return HTTP_ServerInit(); return HTTP_ServerInit(portnum);
return false; return false;
} }
else if (!httpserverwanted) else if (!httpserverwanted)
@ -523,7 +527,14 @@ qboolean HTTP_ServerPoll(qboolean httpserverwanted) //loop while true
return false; return false;
} }
ioctlsocket(clientsock, FIONBIO, &_true); if (ioctlsocket (clientsock, FIONBIO, &_true) == -1)
{
Con_Printf ("HTTP_ServerInit: ioctl FIONBIO: %s\n", strerror(qerrno));
closesocket(clientsock);
return false;
}
Con_Printf("New connection\n");
cl = IWebMalloc(sizeof(HTTP_active_connections_t)); cl = IWebMalloc(sizeof(HTTP_active_connections_t));

View file

@ -120,8 +120,8 @@ char *Q_strcpyline(char *out, char *in, int maxlen);
iwboolean FTP_StringToAdr (const char *s, qbyte ip[4], qbyte port[2]); iwboolean FTP_StringToAdr (const char *s, qbyte ip[4], qbyte port[2]);
//server tick/control functions //server tick/control functions
iwboolean FTP_ServerRun(iwboolean ftpserverwanted); iwboolean FTP_ServerRun(iwboolean ftpserverwanted, int port);
qboolean HTTP_ServerPoll(qboolean httpserverwanted); qboolean HTTP_ServerPoll(qboolean httpserverwanted, int port);
void HTTP_CL_Think(void); void HTTP_CL_Think(void);
qboolean HTTP_CL_Get(char *url, char *localfile, void (*NotifyFunction)(char *localfile, qboolean sucess)); qboolean HTTP_CL_Get(char *url, char *localfile, void (*NotifyFunction)(char *localfile, qboolean sucess));

View file

@ -311,7 +311,9 @@ IWEBFILE *IWebFOpenRead(char *name) //fread(name, "rb");
#ifndef CLIENTONLY #ifndef CLIENTONLY
cvar_t ftpserver = SCVAR("sv_ftp", "0"); cvar_t ftpserver = SCVAR("sv_ftp", "0");
cvar_t ftpserver_port = SCVAR("sv_ftp_port", "21");
cvar_t httpserver = SCVAR("sv_http", "0"); cvar_t httpserver = SCVAR("sv_http", "0");
cvar_t httpserver_port = SCVAR("sv_http_port", "80");
cvar_t sv_readlevel = SCVAR("sv_readlevel", "0"); //default to allow anyone cvar_t sv_readlevel = SCVAR("sv_readlevel", "0"); //default to allow anyone
cvar_t sv_writelevel = SCVAR("sv_writelevel", "35"); //allowed to write to uploads/uname cvar_t sv_writelevel = SCVAR("sv_writelevel", "35"); //allowed to write to uploads/uname
cvar_t sv_fulllevel = SCVAR("sv_fulllevel", "51"); //allowed to write anywhere, replace any file... cvar_t sv_fulllevel = SCVAR("sv_fulllevel", "51"); //allowed to write anywhere, replace any file...
@ -364,7 +366,17 @@ void IWebInit(void)
Cvar_Register(&sv_readlevel, "Internet Server Access"); Cvar_Register(&sv_readlevel, "Internet Server Access");
Cvar_Register(&ftpserver, "Internet Server Access"); Cvar_Register(&ftpserver, "Internet Server Access");
Cvar_Register(&ftpserver_port, "Internet Server Access");
Cvar_Register(&httpserver, "Internet Server Access"); Cvar_Register(&httpserver, "Internet Server Access");
Cvar_Register(&httpserver_port, "Internet Server Access");
//don't allow these to be changed easily
//this basically blocks these from rcon / stuffcmd
ftpserver.restriction = RESTRICT_MAX;
httpserver.restriction = RESTRICT_MAX;
sv_fulllevel.restriction = RESTRICT_MAX;
sv_writelevel.restriction = RESTRICT_MAX;
sv_readlevel.restriction = RESTRICT_MAX;
#endif #endif
} }
void IWebRun(void) void IWebRun(void)
@ -372,8 +384,8 @@ void IWebRun(void)
#ifdef WEBSERVER #ifdef WEBSERVER
extern qboolean httpserverfailed, ftpserverfailed; extern qboolean httpserverfailed, ftpserverfailed;
FTP_ServerRun(ftpserver.value!= 0); FTP_ServerRun(ftpserver.value!= 0, ftpserver_port.value);
HTTP_ServerPoll(httpserver.value!=0); HTTP_ServerPoll(httpserver.value!=0, httpserver_port.value);
if (ftpserverfailed) if (ftpserverfailed)
{ {
Con_Printf("FTP Server failed to load, setting %s to 0\n", ftpserver.name); Con_Printf("FTP Server failed to load, setting %s to 0\n", ftpserver.name);

View file

@ -321,7 +321,7 @@ typedef struct {
IWebFile_t IWebFiles[] = { IWebFile_t IWebFiles[] = {
{"allplayers.html", IWeb_GenerateRankingsFile}, {"allplayers.html", IWeb_GenerateRankingsFile},
{"index.html", IWeb_GenerateIndexFile}, {"index.html", IWeb_GenerateIndexFile},
{"admin.html", IWeb_GenerateAdminFile} //code is too flawed for this {"admin.html", IWeb_GenerateAdminFile}
}; };
typedef struct { typedef struct {
@ -409,6 +409,7 @@ vfsfile_t *IWebGenerateFile(char *name, char *content, int contentlength)
int fnum; int fnum;
char *parms; char *parms;
int len; int len;
IWeb_FileGen_t *fbuf;
if (!sv.state) if (!sv.state)
return NULL; return NULL;
@ -434,7 +435,7 @@ vfsfile_t *IWebGenerateFile(char *name, char *content, int contentlength)
{ {
if (IWebFiles[fnum].buffer) if (IWebFiles[fnum].buffer)
{ {
if (IWebFiles[fnum].lastgenerationtime+10 < Sys_DoubleTime() || contentlength||*parms) //10 sec lifetime if (IWebFiles[fnum].lastgenerationtime < Sys_DoubleTime())
{ {
IWebFiles[fnum].buffer->references--; //remove our reference and check free IWebFiles[fnum].buffer->references--; //remove our reference and check free
if (IWebFiles[fnum].buffer->references<=0) if (IWebFiles[fnum].buffer->references<=0)
@ -452,7 +453,8 @@ vfsfile_t *IWebGenerateFile(char *name, char *content, int contentlength)
IWebFiles[fnum].buffer = IWeb_GenerationBuffer; IWebFiles[fnum].buffer = IWeb_GenerationBuffer;
//so it can't be sent once and freed instantly. //so it can't be sent once and freed instantly.
IWebFiles[fnum].lastgenerationtime = Sys_DoubleTime(); if (contentlength)
IWebFiles[fnum].lastgenerationtime = Sys_DoubleTime()+10;
} }
IWebFiles[fnum].buffer->references++; IWebFiles[fnum].buffer->references++;
IWeb_GenerationBuffer = NULL; IWeb_GenerationBuffer = NULL;

View file

@ -212,7 +212,7 @@ DECLARE_INTERFACE_(IDirect3D, IUnknown)
STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH,LPD3DFINDDEVICERESULT) PURE; STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH,LPD3DFINDDEVICERESULT) PURE;
}; };
typedef struct IDirect3D *LPDIRECT3D; //*sigh*... typedef struct IDirect3D *LPDIRECT3D;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3D_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3D_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -256,7 +256,7 @@ DECLARE_INTERFACE_(IDirect3D2, IUnknown)
STDMETHOD(CreateDevice)(THIS_ REFCLSID,LPDIRECTDRAWSURFACE,LPDIRECT3DDEVICE2*) PURE; STDMETHOD(CreateDevice)(THIS_ REFCLSID,LPDIRECTDRAWSURFACE,LPDIRECT3DDEVICE2*) PURE;
}; };
typedef struct IDirect3D2 *LPDIRECT3D2; //typedef struct IDirect3D2 *LPDIRECT3D2;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3D2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3D2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -304,7 +304,7 @@ DECLARE_INTERFACE_(IDirect3D3, IUnknown)
STDMETHOD(EvictManagedTextures)(THIS) PURE; STDMETHOD(EvictManagedTextures)(THIS) PURE;
}; };
typedef struct IDirect3D3 *LPDIRECT3D3; //this could take a while typedef struct IDirect3D3 *LPDIRECT3D3;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3D3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3D3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -354,7 +354,7 @@ DECLARE_INTERFACE_(IDirect3D7, IUnknown)
STDMETHOD(EvictManagedTextures)(THIS) PURE; STDMETHOD(EvictManagedTextures)(THIS) PURE;
}; };
typedef struct IDirect3D7 *LPDIRECT3D7; //gcc is kinda fussy typedef struct IDirect3D7 *LPDIRECT3D7;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3D7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3D7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -411,7 +411,7 @@ DECLARE_INTERFACE_(IDirect3DDevice, IUnknown)
STDMETHOD(GetDirect3D)(THIS_ LPDIRECT3D*) PURE; STDMETHOD(GetDirect3D)(THIS_ LPDIRECT3D*) PURE;
}; };
typedef struct IDirect3DDevice *LPDIRECT3DDEVICE; //getting bored already typedef struct IDirect3DDevice *LPDIRECT3DDEVICE;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -505,7 +505,7 @@ DECLARE_INTERFACE_(IDirect3DDevice2, IUnknown)
STDMETHOD(GetClipStatus)(THIS_ LPD3DCLIPSTATUS) PURE; STDMETHOD(GetClipStatus)(THIS_ LPD3DCLIPSTATUS) PURE;
}; };
typedef struct IDirect3DDevice2 *LPDIRECT3DDEVICE2; //typedef struct IDirect3DDevice2 *LPDIRECT3DDEVICE2;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DDevice2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DDevice2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -631,7 +631,7 @@ DECLARE_INTERFACE_(IDirect3DDevice3, IUnknown)
STDMETHOD(ValidateDevice)(THIS_ LPDWORD) PURE; STDMETHOD(ValidateDevice)(THIS_ LPDWORD) PURE;
}; };
typedef struct IDirect3DDevice3 *LPDIRECT3DDEVICE3; //dum de dum typedef struct IDirect3DDevice3 *LPDIRECT3DDEVICE3;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DDevice3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DDevice3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -782,7 +782,7 @@ DECLARE_INTERFACE_(IDirect3DDevice7, IUnknown)
STDMETHOD(GetInfo)(THIS_ DWORD,LPVOID,DWORD) PURE; STDMETHOD(GetInfo)(THIS_ DWORD,LPVOID,DWORD) PURE;
}; };
typedef struct IDirect3DDevice7 *LPDIRECT3DDEVICE7; //they are at least consistant typedef struct IDirect3DDevice7 *LPDIRECT3DDEVICE7;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DDevice7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DDevice7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -910,7 +910,7 @@ DECLARE_INTERFACE_(IDirect3DExecuteBuffer, IUnknown)
STDMETHOD(Optimize)(THIS_ DWORD) PURE; STDMETHOD(Optimize)(THIS_ DWORD) PURE;
}; };
typedef struct IDirect3DExecuteBuffer *LPDIRECT3DEXECUTEBUFFER; //did anyone ever like this object anyway? typedef struct IDirect3DExecuteBuffer *LPDIRECT3DEXECUTEBUFFER;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DExecuteBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DExecuteBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -955,7 +955,7 @@ DECLARE_INTERFACE_(IDirect3DLight, IUnknown)
STDMETHOD(GetLight)(THIS_ LPD3DLIGHT) PURE; STDMETHOD(GetLight)(THIS_ LPD3DLIGHT) PURE;
}; };
typedef struct IDirect3DLight *LPDIRECT3DLIGHT; //slow typedef struct IDirect3DLight *LPDIRECT3DLIGHT;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DLight_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DLight_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -995,7 +995,7 @@ DECLARE_INTERFACE_(IDirect3DMaterial, IUnknown)
STDMETHOD(Unreserve)(THIS) PURE; STDMETHOD(Unreserve)(THIS) PURE;
}; };
typedef struct IDirect3DMaterial *LPDIRECT3DMATERIAL; //so many of these! typedef struct IDirect3DMaterial *LPDIRECT3DMATERIAL;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DMaterial_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DMaterial_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1036,7 +1036,7 @@ DECLARE_INTERFACE_(IDirect3DMaterial2, IUnknown)
STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE2,LPD3DMATERIALHANDLE) PURE; STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE2,LPD3DMATERIALHANDLE) PURE;
}; };
typedef struct IDirect3DMaterial2 *LPDIRECT3DMATERIAL2; //and other errors to fix after these, lucky me! typedef struct IDirect3DMaterial2 *LPDIRECT3DMATERIAL2;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DMaterial2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DMaterial2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1072,7 +1072,7 @@ DECLARE_INTERFACE_(IDirect3DMaterial3, IUnknown)
STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE3,LPD3DMATERIALHANDLE) PURE; STDMETHOD(GetHandle)(THIS_ LPDIRECT3DDEVICE3,LPD3DMATERIALHANDLE) PURE;
}; };
typedef struct IDirect3DMaterial3 *LPDIRECT3DMATERIAL3; //this is getting dull typedef struct IDirect3DMaterial3 *LPDIRECT3DMATERIAL3;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DMaterial3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DMaterial3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1112,7 +1112,7 @@ DECLARE_INTERFACE_(IDirect3DTexture, IUnknown)
STDMETHOD(Unload)(THIS) PURE; STDMETHOD(Unload)(THIS) PURE;
}; };
typedef struct IDirect3DTexture *LPDIRECT3DTEXTURE; //monkey typedef struct IDirect3DTexture *LPDIRECT3DTEXTURE;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DTexture_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DTexture_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1151,7 +1151,7 @@ DECLARE_INTERFACE_(IDirect3DTexture2, IUnknown)
STDMETHOD(Load)(THIS_ LPDIRECT3DTEXTURE2) PURE; STDMETHOD(Load)(THIS_ LPDIRECT3DTEXTURE2) PURE;
}; };
typedef struct IDirect3DTexture2 *LPDIRECT3DTEXTURE2; //*snore* typedef struct IDirect3DTexture2 *LPDIRECT3DTEXTURE2;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DTexture2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DTexture2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1199,7 +1199,7 @@ DECLARE_INTERFACE_(IDirect3DViewport, IUnknown)
STDMETHOD(NextLight)(THIS_ LPDIRECT3DLIGHT,LPDIRECT3DLIGHT*,DWORD) PURE; STDMETHOD(NextLight)(THIS_ LPDIRECT3DLIGHT,LPDIRECT3DLIGHT*,DWORD) PURE;
}; };
typedef struct IDirect3DViewport *LPDIRECT3DVIEWPORT; //*yawn* typedef struct IDirect3DViewport *LPDIRECT3DVIEWPORT;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DViewport_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DViewport_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1266,7 +1266,7 @@ DECLARE_INTERFACE_(IDirect3DViewport2, IDirect3DViewport)
STDMETHOD(SetViewport2)(THIS_ LPD3DVIEWPORT2) PURE; STDMETHOD(SetViewport2)(THIS_ LPD3DVIEWPORT2) PURE;
}; };
typedef struct IDirect3DViewport2 *LPDIRECT3DVIEWPORT2; //they could have coded this right in the first place, you know typedef struct IDirect3DViewport2 *LPDIRECT3DVIEWPORT2;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DViewport2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DViewport2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1342,7 +1342,7 @@ DECLARE_INTERFACE_(IDirect3DViewport3, IDirect3DViewport2)
STDMETHOD(Clear2)(THIS_ DWORD,LPD3DRECT,DWORD,D3DCOLOR,D3DVALUE,DWORD) PURE; STDMETHOD(Clear2)(THIS_ DWORD,LPD3DRECT,DWORD,D3DCOLOR,D3DVALUE,DWORD) PURE;
}; };
typedef struct IDirect3DViewport3 *LPDIRECT3DVIEWPORT3; //not too many of these left to go typedef struct IDirect3DViewport3 *LPDIRECT3DVIEWPORT3;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DViewport3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DViewport3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1410,7 +1410,7 @@ DECLARE_INTERFACE_(IDirect3DVertexBuffer, IUnknown)
STDMETHOD(Optimize)(THIS_ LPDIRECT3DDEVICE3,DWORD) PURE; STDMETHOD(Optimize)(THIS_ LPDIRECT3DDEVICE3,DWORD) PURE;
}; };
typedef struct IDirect3DVertexBuffer *LPDIRECT3DVERTEXBUFFER; //nearly there typedef struct IDirect3DVertexBuffer *LPDIRECT3DVERTEXBUFFER;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DVertexBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DVertexBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
@ -1453,7 +1453,7 @@ DECLARE_INTERFACE_(IDirect3DVertexBuffer7, IUnknown)
STDMETHOD(ProcessVerticesStrided)(THIS_ DWORD,DWORD,DWORD,LPD3DDRAWPRIMITIVESTRIDEDDATA,DWORD,LPDIRECT3DDEVICE7,DWORD) PURE; STDMETHOD(ProcessVerticesStrided)(THIS_ DWORD,DWORD,DWORD,LPD3DDRAWPRIMITIVESTRIDEDDATA,DWORD,LPDIRECT3DDEVICE7,DWORD) PURE;
}; };
typedef struct IDirect3DVertexBuffer7 *LPDIRECT3DVERTEXBUFFER7; //well that was painful typedef struct IDirect3DVertexBuffer7 *LPDIRECT3DVERTEXBUFFER7;
#if !defined(__cplusplus) || defined(CINTERFACE) #if !defined(__cplusplus) || defined(CINTERFACE)
#define IDirect3DVertexBuffer7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirect3DVertexBuffer7_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)

View file

@ -45,7 +45,7 @@ void *Hash_Get(hashtable_t *table, char *name)
while(buck) while(buck)
{ {
if (!STRCMP(name, buck->keystring)) if (!STRCMP(name, buck->key.string))
return buck->data; return buck->data;
buck = buck->next; buck = buck->next;
@ -61,7 +61,7 @@ void *Hash_GetInsensative(hashtable_t *table, char *name)
while(buck) while(buck)
{ {
if (!stricmp(name, buck->keystring)) if (!stricmp(name, buck->key.string))
return buck->data; return buck->data;
buck = buck->next; buck = buck->next;
@ -77,7 +77,7 @@ void *Hash_GetKey(hashtable_t *table, int key)
while(buck) while(buck)
{ {
if ((int)buck->keystring == key) if (buck->key.value == key)
return buck->data; return buck->data;
buck = buck->next; buck = buck->next;
@ -93,7 +93,7 @@ void *Hash_GetNext(hashtable_t *table, char *name, void *old)
while(buck) while(buck)
{ {
if (!STRCMP(name, buck->keystring)) if (!STRCMP(name, buck->key.string))
{ {
if (buck->data == old) //found the old one if (buck->data == old) //found the old one
break; break;
@ -107,7 +107,7 @@ void *Hash_GetNext(hashtable_t *table, char *name, void *old)
buck = buck->next;//don't return old buck = buck->next;//don't return old
while(buck) while(buck)
{ {
if (!STRCMP(name, buck->keystring)) if (!STRCMP(name, buck->key.string))
return buck->data; return buck->data;
buck = buck->next; buck = buck->next;
@ -123,7 +123,7 @@ void *Hash_GetNextInsensative(hashtable_t *table, char *name, void *old)
while(buck) while(buck)
{ {
if (!STRCMP(name, buck->keystring)) if (!STRCMP(name, buck->key.string))
{ {
if (buck->data == old) //found the old one if (buck->data == old) //found the old one
break; break;
@ -137,7 +137,7 @@ void *Hash_GetNextInsensative(hashtable_t *table, char *name, void *old)
buck = buck->next;//don't return old buck = buck->next;//don't return old
while(buck) while(buck)
{ {
if (!STRCMP(name, buck->keystring)) if (!STRCMP(name, buck->key.string))
return buck->data; return buck->data;
buck = buck->next; buck = buck->next;
@ -151,7 +151,7 @@ void *Hash_Add(hashtable_t *table, char *name, void *data, bucket_t *buck)
int bucknum = Hash_Key(name, table->numbuckets); int bucknum = Hash_Key(name, table->numbuckets);
buck->data = data; buck->data = data;
buck->keystring = name; buck->key.string = name;
buck->next = table->bucket[bucknum]; buck->next = table->bucket[bucknum];
table->bucket[bucknum] = buck; table->bucket[bucknum] = buck;
@ -162,7 +162,7 @@ void *Hash_AddInsensative(hashtable_t *table, char *name, void *data, bucket_t *
int bucknum = Hash_KeyInsensative(name, table->numbuckets); int bucknum = Hash_KeyInsensative(name, table->numbuckets);
buck->data = data; buck->data = data;
buck->keystring = name; buck->key.string = name;
buck->next = table->bucket[bucknum]; buck->next = table->bucket[bucknum];
table->bucket[bucknum] = buck; table->bucket[bucknum] = buck;
@ -173,7 +173,7 @@ void *Hash_AddKey(hashtable_t *table, int key, void *data, bucket_t *buck)
int bucknum = key%table->numbuckets; int bucknum = key%table->numbuckets;
buck->data = data; buck->data = data;
buck->keystring = (char*)key; buck->key.value = key;
buck->next = table->bucket[bucknum]; buck->next = table->bucket[bucknum];
table->bucket[bucknum] = buck; table->bucket[bucknum] = buck;
@ -187,7 +187,7 @@ void Hash_Remove(hashtable_t *table, char *name)
buck = table->bucket[bucknum]; buck = table->bucket[bucknum];
if (!STRCMP(name, buck->keystring)) if (!STRCMP(name, buck->key.string))
{ {
table->bucket[bucknum] = buck->next; table->bucket[bucknum] = buck->next;
return; return;
@ -196,7 +196,7 @@ void Hash_Remove(hashtable_t *table, char *name)
while(buck->next) while(buck->next)
{ {
if (!STRCMP(name, buck->next->keystring)) if (!STRCMP(name, buck->next->key.string))
{ {
buck->next = buck->next->next; buck->next = buck->next->next;
return; return;
@ -215,7 +215,7 @@ void Hash_RemoveData(hashtable_t *table, char *name, void *data)
buck = table->bucket[bucknum]; buck = table->bucket[bucknum];
if (buck->data == data) if (buck->data == data)
if (!STRCMP(name, buck->keystring)) if (!STRCMP(name, buck->key.string))
{ {
table->bucket[bucknum] = buck->next; table->bucket[bucknum] = buck->next;
return; return;
@ -225,7 +225,7 @@ void Hash_RemoveData(hashtable_t *table, char *name, void *data)
while(buck->next) while(buck->next)
{ {
if (buck->next->data == data) if (buck->next->data == data)
if (!STRCMP(name, buck->next->keystring)) if (!STRCMP(name, buck->next->key.string))
{ {
buck->next = buck->next->next; buck->next = buck->next->next;
return; return;
@ -244,7 +244,7 @@ void Hash_RemoveKey(hashtable_t *table, int key)
buck = table->bucket[bucknum]; buck = table->bucket[bucknum];
if ((int)buck->keystring == key) if (buck->key.value == key)
{ {
table->bucket[bucknum] = buck->next; table->bucket[bucknum] = buck->next;
return; return;
@ -253,7 +253,7 @@ void Hash_RemoveKey(hashtable_t *table, int key)
while(buck->next) while(buck->next)
{ {
if ((int)buck->next->keystring == key) if (buck->next->key.value == key)
{ {
buck->next = buck->next->next; buck->next = buck->next->next;
return; return;

View file

@ -7,7 +7,10 @@
#define STRCMP(s1,s2) (((*s1)!=(*s2)) || strcmp(s1+1,s2+1)) //saves about 2-6 out of 120 - expansion of idea from fastqcc #define STRCMP(s1,s2) (((*s1)!=(*s2)) || strcmp(s1+1,s2+1)) //saves about 2-6 out of 120 - expansion of idea from fastqcc
typedef struct bucket_s { typedef struct bucket_s {
void *data; void *data;
char *keystring; union {
char *string;
int value;
} key;
struct bucket_s *next; struct bucket_s *next;
} bucket_t; } bucket_t;
typedef struct hashtable_s { typedef struct hashtable_s {

View file

@ -447,6 +447,7 @@ void PR_Deinit(void)
#define PREREL_PROGHEADER_CRC 26940 //prerelease #define PREREL_PROGHEADER_CRC 26940 //prerelease
#define H2_PROGHEADER_CRC 38488 //basic hexen2 #define H2_PROGHEADER_CRC 38488 //basic hexen2
#define H2MP_PROGHEADER_CRC 26905 //hexen2 mission pack uses slightly different defs... *sigh*... #define H2MP_PROGHEADER_CRC 26905 //hexen2 mission pack uses slightly different defs... *sigh*...
#define H2DEMO_PROGHEADER_CRC 14046 //I'm guessing this is from the original release or something
void PR_LoadGlabalStruct(void) void PR_LoadGlabalStruct(void)
{ {
@ -664,6 +665,8 @@ progsnum_t AddProgs(char *name)
num = PR_LoadProgs (svprogfuncs, name, H2_PROGHEADER_CRC, NULL, 0); num = PR_LoadProgs (svprogfuncs, name, H2_PROGHEADER_CRC, NULL, 0);
if (num == -1) //don't commit if bad. if (num == -1) //don't commit if bad.
num = PR_LoadProgs (svprogfuncs, name, H2MP_PROGHEADER_CRC, NULL, 0); num = PR_LoadProgs (svprogfuncs, name, H2MP_PROGHEADER_CRC, NULL, 0);
if (num == -1)
num = PR_LoadProgs (svprogfuncs, name, H2DEMO_PROGHEADER_CRC, NULL, 0);
if (num == -1) //don't commit if bad. if (num == -1) //don't commit if bad.
{ {
progstype = PROG_PREREL; progstype = PROG_PREREL;
@ -1388,9 +1391,9 @@ qboolean PR_GameCodePacket(char *s)
G_INT(OFS_PARM0) = (int)NET_AdrToString (net_from); G_INT(OFS_PARM0) = PR_SetString(svprogfuncs, NET_AdrToString (net_from));
G_INT(OFS_PARM1) = (int)PR_SetString(svprogfuncs, s); G_INT(OFS_PARM1) = PR_SetString(svprogfuncs, s);
PR_ExecuteProgram (svprogfuncs, SV_ParseConnectionlessPacket); PR_ExecuteProgram (svprogfuncs, SV_ParseConnectionlessPacket);
return G_FLOAT(OFS_RETURN); return G_FLOAT(OFS_RETURN);
} }
@ -2006,7 +2009,7 @@ void PF_setmodel_Internal (progfuncs_t *prinst, edict_t *e, char *m)
// if it is an inline model, get the size information for it // if it is an inline model, get the size information for it
if (m[0] == '*' || (*m&&progstype == PROG_H2)) if (m[0] == '*' || (*m&&progstype == PROG_H2))
{ {
mod = Mod_ForName (m, true); mod = Mod_ForName (m, false);
if (mod) if (mod)
{ {
VectorCopy (mod->mins, e->v->mins); VectorCopy (mod->mins, e->v->mins);
@ -3758,7 +3761,7 @@ void PF_precache_model_Internal (progfuncs_t *prinst, char *s)
if (s[0] <= ' ') if (s[0] <= ' ')
{ {
PR_BIError (prinst, "Bad string"); Con_Printf ("precache_model: empty string\n");
return; return;
} }

View file

@ -8,7 +8,7 @@
float RadiusFromBounds (vec3_t mins, vec3_t maxs); float RadiusFromBounds (vec3_t mins, vec3_t maxs);
#define USEBOTLIB //#define USEBOTLIB
#ifdef USEBOTLIB #ifdef USEBOTLIB
@ -19,7 +19,7 @@ float RadiusFromBounds (vec3_t mins, vec3_t maxs);
#else #else
#define QDECL #define QDECL
#endif #endif
#define fileHandle_t char* #define fileHandle_t int
#define fsMode_t int #define fsMode_t int
#define pc_token_t void #define pc_token_t void
#include "botlib.h" #include "botlib.h"
@ -219,7 +219,7 @@ void QDECL Com_sprintf( char *dest, int size, const char *fmt, ...)
#include "clq3defs.h" #include "clq3defs.h"
#include "q3g_public.h" #include "q3g_public.h"
vm_t *q3gamevm; static vm_t *q3gamevm;
#define fs_key 0 #define fs_key 0
@ -874,7 +874,7 @@ void SVQ3_Adjust_Area_Portal_State(q3sharedEntity_t *ge, qboolean open)
} }
#define VALIDATEPOINTER(o,l) if ((int)o + l >= mask || VM_POINTER(o) < offset) SV_Error("Call to game trap %i passes invalid pointer\n", fn); //out of bounds. #define VALIDATEPOINTER(o,l) if ((int)o + l >= mask || VM_POINTER(o) < offset) SV_Error("Call to game trap %i passes invalid pointer\n", fn); //out of bounds.
long Q3G_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg) int Q3G_SystemCallsEx(void *offset, unsigned int mask, int fn, const int *arg)
{ {
int ret = 0; int ret = 0;
switch(fn) switch(fn)
@ -891,37 +891,10 @@ long Q3G_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
case G_CVAR_REGISTER:// ( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags ); case G_CVAR_REGISTER:// ( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags );
if (arg[0]) if (arg[0])
VALIDATEPOINTER(arg[0], sizeof(vmcvar_t)); VALIDATEPOINTER(arg[0], sizeof(vmcvar_t));
{ return VMQ3_Cvar_Register(VM_POINTER(arg[0]), VM_POINTER(arg[1]), VM_POINTER(arg[2]), VM_LONG(arg[3]));
vmcvar_t *vmc;
cvar_t *var;
vmc = VM_POINTER(arg[0]);
var = Cvar_Get(VM_POINTER(arg[1]), VM_POINTER(arg[2]), 0/*VM_LONG(arg[3])*/, "Q3-Game-Code created");
if (!vmc) //qvm doesn't need to retreive it
break;
vmc->handle = (char *)var - (char *)offset;
vmc->integer = var->value;
vmc->value = var->value;
vmc->modificationCount = var->modified;
Q_strncpyz(vmc->string, var->string, sizeof(vmc->string));
}
break;
case G_CVAR_UPDATE:// ( vmCvar_t *vmCvar ); case G_CVAR_UPDATE:// ( vmCvar_t *vmCvar );
VALIDATEPOINTER(arg[0], sizeof(vmcvar_t)); VALIDATEPOINTER(arg[0], sizeof(vmcvar_t));
{ return VMQ3_Cvar_Update(VM_POINTER(arg[0]));
cvar_t *var;
vmcvar_t *vmc;
vmc = VM_POINTER(arg[0]);
var = (cvar_t *)((int)vmc->handle + (char *)offset);
if (!var || !vmc->handle)
return false;
vmc->integer = var->value;
vmc->value = var->value;
vmc->modificationCount = var->modified;
Q_strncpyz(vmc->string, var->string, sizeof(vmc->string));
}
break;
case G_CVAR_SET:// ( const char *var_name, const char *value ); case G_CVAR_SET:// ( const char *var_name, const char *value );
{ {
@ -1061,6 +1034,8 @@ long Q3G_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
case G_GET_USERINFO://int num, char *buffer, int bufferSize 20 case G_GET_USERINFO://int num, char *buffer, int bufferSize 20
if (VM_OOB(arg[1], arg[2])) if (VM_OOB(arg[1], arg[2]))
return 0; return 0;
if ((unsigned)VM_LONG(arg[0]) >= sv.allocated_client_slots)
return 0;
Q_strncpyz(VM_POINTER(arg[1]), svs.clients[VM_LONG(arg[0])].userinfo, VM_LONG(arg[2])); Q_strncpyz(VM_POINTER(arg[1]), svs.clients[VM_LONG(arg[0])].userinfo, VM_LONG(arg[2]));
break; break;
@ -1087,7 +1062,7 @@ long Q3G_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
case G_ENTITIES_IN_BOX: // ( const vec3_t mins, const vec3_t maxs, gentity_t **list, int maxcount ); 32 case G_ENTITIES_IN_BOX: // ( const vec3_t mins, const vec3_t maxs, gentity_t **list, int maxcount ); 32
// 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
VALIDATEPOINTER(arg[2], sizeof(int*)*VM_LONG(arg[3])); VALIDATEPOINTER(arg[2], sizeof(int)*VM_LONG(arg[3]));
return SVQ3_EntitiesInBox(VM_POINTER(arg[0]), VM_POINTER(arg[1]), VM_POINTER(arg[2]), VM_LONG(arg[3])); return SVQ3_EntitiesInBox(VM_POINTER(arg[0]), VM_POINTER(arg[1]), VM_POINTER(arg[2]), VM_LONG(arg[3]));
case G_ADJUST_AREA_PORTAL_STATE: case G_ADJUST_AREA_PORTAL_STATE:
@ -1122,15 +1097,26 @@ long Q3G_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
// standard Q3 // standard Q3
case G_MEMSET: case G_MEMSET:
VALIDATEPOINTER(arg[0], arg[2]); VALIDATEPOINTER(arg[0], arg[2]);
memset(VM_POINTER(arg[0]), arg[1], arg[2]); {
void *dst = VM_POINTER(arg[0]);
memset(dst, arg[1], arg[2]);
}
break; break;
case G_MEMCPY: case G_MEMCPY:
VALIDATEPOINTER(arg[0], arg[2]); VALIDATEPOINTER(arg[0], arg[2]);
memmove(VM_POINTER(arg[0]), VM_POINTER(arg[1]), arg[2]); {
void *dst = VM_POINTER(arg[0]);
void *src = VM_POINTER(arg[1]);
memmove(dst, src, arg[2]);
}
break; break;
case G_STRNCPY: case G_STRNCPY:
VALIDATEPOINTER(arg[0], arg[2]); VALIDATEPOINTER(arg[0], arg[2]);
Q_strncpyS(VM_POINTER(arg[0]), VM_POINTER(arg[1]), arg[2]); {
void *dst = VM_POINTER(arg[0]);
void *src = VM_POINTER(arg[1]);
Q_strncpyS(src, dst, arg[2]);
}
break; break;
case G_SIN: case G_SIN:
VM_FLOAT(ret)=(float)sin(VM_FLOAT(arg[0])); VM_FLOAT(ret)=(float)sin(VM_FLOAT(arg[0]));
@ -1592,7 +1578,7 @@ long Q3G_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg)
int EXPORT_FN Q3G_SystemCalls(int arg, ...) int EXPORT_FN Q3G_SystemCalls(int arg, ...)
{ {
long args[13]; int args[13];
va_list argptr; va_list argptr;
va_start(argptr, arg); va_start(argptr, arg);
@ -1849,6 +1835,7 @@ qboolean SVQ3_InitGame(void)
char *str; char *str;
char sysinfo[8192]; char sysinfo[8192];
extern cvar_t progs; extern cvar_t progs;
cvar_t *sv_pure;
if (sv.worldmodel->type == mod_heightmap) if (sv.worldmodel->type == mod_heightmap)
{ {
@ -1900,13 +1887,14 @@ qboolean SVQ3_InitGame(void)
str = FS_GetPackNames(buffer, sizeof(buffer), true); str = FS_GetPackNames(buffer, sizeof(buffer), true);
Info_SetValueForKey(sysinfo, "sv_referencedPakNames", str, MAX_SERVERINFO_STRING); Info_SetValueForKey(sysinfo, "sv_referencedPakNames", str, MAX_SERVERINFO_STRING);
Info_SetValueForKey(sysinfo, "sv_pure", "1", MAX_SERVERINFO_STRING); sv_pure = Cvar_Get("sv_pure", "1", 0, "Q3 compatability");
Info_SetValueForKey(sysinfo, "sv_pure", sv_pure->string, MAX_SERVERINFO_STRING);
SVQ3_SetConfigString(1, sysinfo); SVQ3_SetConfigString(1, sysinfo);
mapentspointer = sv.worldmodel->entities; mapentspointer = sv.worldmodel->entities;
VM_Call(q3gamevm, GAME_INIT, 0, rand(), false); VM_Call(q3gamevm, GAME_INIT, 0, (int)rand(), false);
CM_InitBoxHull(); CM_InitBoxHull();
@ -1937,17 +1925,17 @@ void SVQ3_RunFrame(void)
void SVQ3_ClientCommand(client_t *cl) void SVQ3_ClientCommand(client_t *cl)
{ {
VM_Call(q3gamevm, GAME_CLIENT_COMMAND, cl-svs.clients); VM_Call(q3gamevm, GAME_CLIENT_COMMAND, (int)(cl-svs.clients));
} }
void SVQ3_ClientBegin(client_t *cl) void SVQ3_ClientBegin(client_t *cl)
{ {
VM_Call(q3gamevm, GAME_CLIENT_BEGIN, cl-svs.clients); VM_Call(q3gamevm, GAME_CLIENT_BEGIN, (int)(cl-svs.clients));
} }
void SVQ3_ClientThink(client_t *cl) void SVQ3_ClientThink(client_t *cl)
{ {
VM_Call(q3gamevm, GAME_CLIENT_THINK, cl-svs.clients); VM_Call(q3gamevm, GAME_CLIENT_THINK, (int)(cl-svs.clients));
} }
qboolean SVQ3_Command(void) qboolean SVQ3_Command(void)
@ -2303,7 +2291,8 @@ void SVQ3_BuildClientSnapshot( client_t *client )
bitvector = sv.worldmodel->funcs.LeafPVS(sv.worldmodel, sv.worldmodel->funcs.LeafnumForPoint(sv.worldmodel, org), NULL); bitvector = sv.worldmodel->funcs.LeafPVS(sv.worldmodel, sv.worldmodel->funcs.LeafnumForPoint(sv.worldmodel, org), NULL);
clientarea = CM_LeafArea(sv.worldmodel, clientarea); clientarea = CM_LeafArea(sv.worldmodel, clientarea);
/* /*
if( client->areanum != clientarea ) { if (client->areanum != clientarea)
{
Com_Printf( "%s entered area %i\n", client->name, clientarea); Com_Printf( "%s entered area %i\n", client->name, clientarea);
client->areanum = clientarea; client->areanum = clientarea;
} }
@ -2409,7 +2398,7 @@ void SVQ3_BuildClientSnapshot( client_t *client )
void SVQ3_SendGameState(client_t *client) void SVQ3_SendGameState(client_t *client)
{ {
sizebuf_t msg; sizebuf_t msg;
char buffer[MAX_OVERALLMSGLEN]; unsigned char buffer[MAX_OVERALLMSGLEN];
int i; int i;
int j; int j;
char *configString; char *configString;
@ -2712,7 +2701,7 @@ void SVQ3_UpdateUserinfo_f(client_t *cl)
SV_ExtractFromUserinfo (cl); SV_ExtractFromUserinfo (cl);
VM_Call(q3gamevm, GAME_CLIENT_USERINFO_CHANGED, cl-svs.clients); VM_Call(q3gamevm, GAME_CLIENT_USERINFO_CHANGED, (int)(cl-svs.clients));
} }
void SVQ3_Drop_f(client_t *cl) void SVQ3_Drop_f(client_t *cl)
@ -2850,7 +2839,6 @@ void SVQ3_ParseClientMessage(client_t *client)
{ {
Con_Printf("corrupted packet from %s\n", client->name); Con_Printf("corrupted packet from %s\n", client->name);
client->drop = true; client->drop = true;
// SV_DropClient(client);
return; return;
} }
@ -2865,7 +2853,6 @@ void SVQ3_ParseClientMessage(client_t *client)
default: default:
Con_Printf("corrupted packet from %s\n", client->name); Con_Printf("corrupted packet from %s\n", client->name);
client->drop = true; client->drop = true;
// SV_DropClient(client);
return; return;
case clcq3_nop: case clcq3_nop:
break; break;
@ -2937,7 +2924,7 @@ void SVQ3_DirectConnect(void) //Actually connect the client, use up a slot, and
Huff_DecryptPacket(&net_message, 12); Huff_DecryptPacket(&net_message, 12);
Cmd_TokenizeString(net_message.data+4, false, false); Cmd_TokenizeString((char*)net_message.data+4, false, false);
userinfo = Cmd_Argv(1); userinfo = Cmd_Argv(1);
qport = atoi(Info_ValueForKey(userinfo, "qport")); qport = atoi(Info_ValueForKey(userinfo, "qport"));
challenge = atoi(Info_ValueForKey(userinfo, "challenge")); challenge = atoi(Info_ValueForKey(userinfo, "challenge"));
@ -2980,7 +2967,7 @@ void SVQ3_DirectConnect(void) //Actually connect the client, use up a slot, and
reason = NET_AdrToString(net_from); reason = NET_AdrToString(net_from);
Info_SetValueForStarKey(cl->userinfo, "ip", reason, sizeof(cl->userinfo)); Info_SetValueForStarKey(cl->userinfo, "ip", reason, sizeof(cl->userinfo));
ret = VM_Call(q3gamevm, GAME_CLIENT_CONNECT, cl-svs.clients, false, false); ret = VM_Call(q3gamevm, GAME_CLIENT_CONNECT, (int)(cl-svs.clients), false, false);
if (!ret) if (!ret)
reason = NULL; reason = NULL;
else else
@ -3039,7 +3026,7 @@ int SVQ3_AddBot(void)
void SVQ3_DropClient(client_t *cl) void SVQ3_DropClient(client_t *cl)
{ {
if (q3gamevm) if (q3gamevm)
VM_Call(q3gamevm, GAME_CLIENT_DISCONNECT, cl-svs.clients); VM_Call(q3gamevm, GAME_CLIENT_DISCONNECT, (int)(cl-svs.clients));
} }
#endif #endif