removed separate trigger/solid links.

some q3 fixes.
q2 will autosave on map changes, like q2 normally does.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3839 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2011-06-29 18:39:11 +00:00
parent a18e83d843
commit 61e4aa96b3
54 changed files with 1346 additions and 1000 deletions

View File

@ -60,36 +60,6 @@ int autocam[MAX_SPLITS];
int selfcam=1;
void vectoangles(vec3_t vec, vec3_t ang)
{
float forward;
float yaw, pitch;
if (vec[1] == 0 && vec[0] == 0)
{
yaw = 0;
if (vec[2] > 0)
pitch = 90;
else
pitch = 270;
}
else
{
yaw = /*(int)*/ (atan2(vec[1], vec[0]) * 180 / M_PI);
if (yaw < 0)
yaw += 360;
forward = sqrt (vec[0]*vec[0] + vec[1]*vec[1]);
pitch = /*(int)*/ (atan2(vec[2], forward) * 180 / M_PI);
if (pitch < 0)
pitch += 360;
}
ang[0] = pitch;
ang[1] = yaw;
ang[2] = 0;
}
static float vlen(vec3_t v)
{
return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);

View File

@ -32,6 +32,8 @@ extern int mod_numknown;
#define VM_FROMSHANDLE(a) (a?r_shaders+a-1:NULL)
#define VM_TOSHANDLE(a) (a?a-r_shaders+1:0)
extern model_t box_model;
typedef enum {
CG_PRINT,
CG_ERROR,
@ -560,9 +562,12 @@ static qintptr_t CG_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
case CG_CM_POINTCONTENTS: //int trap_CM_PointContents( const vec3_t p, clipHandle_t model );
{
unsigned int pc;
model_t *mod = VM_FROMMHANDLE(arg[1]);
if (!mod)
mod = cl.worldmodel;
unsigned int modhandle = VM_LONG(arg[1]);
model_t *mod;
if (modhandle >= MAX_MODELS)
mod = &box_model;
else
mod = cl.model_precache[modhandle+1];
if (mod)
pc = cl.worldmodel->funcs.NativeContents(mod, 0, 0, NULL, VM_POINTER(arg[0]), vec3_origin, vec3_origin);
else
@ -575,12 +580,14 @@ static qintptr_t CG_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
{
unsigned int pc;
float *p = VM_POINTER(arg[0]);
model_t *mod = VM_FROMMHANDLE(arg[1]);
unsigned int modhandle = VM_LONG(arg[1]);
float *origin = VM_POINTER(arg[2]);
float *angles = VM_POINTER(arg[3]);
if (!mod)
mod = cl.worldmodel;
model_t *mod;
if (modhandle >= MAX_MODELS)
mod = &box_model;
else
mod = cl.model_precache[modhandle+1];
if (mod)
{
@ -618,12 +625,16 @@ static qintptr_t CG_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
float *end = VM_POINTER(arg[2]);
float *mins = VM_POINTER(arg[3]);
float *maxs = VM_POINTER(arg[4]);
model_t *mod = VM_FROMMHANDLE(arg[5]);
int brushmask = VM_LONG(arg[6]);
unsigned int modhandle = VM_LONG(arg[5]);
int brushmask = VM_LONG(arg[6]);
float *origin = VM_POINTER(arg[7]);
float *angles = VM_POINTER(arg[8]);
if (!mod)
mod = cl.worldmodel;
model_t *mod;
if (modhandle >= MAX_MODELS)
mod = &box_model;
else
mod = cl.model_precache[modhandle+1];
if (!mins)
mins = vec3_origin;
if (!maxs)
@ -673,24 +684,19 @@ static qintptr_t CG_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
float *end = VM_POINTER(arg[2]);
float *mins = VM_POINTER(arg[3]);
float *maxs = VM_POINTER(arg[4]);
model_t *mod = VM_FROMMHANDLE(arg[5]);
unsigned int modhandle = VM_LONG(arg[5]);
int brushmask = VM_LONG(arg[6]);
if (!mod)
mod = cl.worldmodel;
model_t *mod;
if (modhandle >= MAX_MODELS)
mod = &box_model;
else
mod = cl.model_precache[modhandle+1];
if (!mins)
mins = vec3_origin;
if (!maxs)
maxs = vec3_origin;
if (mod)
{
mod->funcs.NativeTrace(mod, 0, 0, NULL, start, end, mins, maxs, brushmask, &tr);
}
else
{
memset(&tr, 0, sizeof(tr));
tr.allsolid = tr.startsolid = true;
tr.contents = 1;
}
mod->funcs.NativeTrace(mod, 0, 0, NULL, start, end, mins, maxs, brushmask, &tr);
results->allsolid = tr.allsolid;
results->contents = tr.contents;
results->fraction = tr.fraction;
@ -724,14 +730,17 @@ static qintptr_t CG_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
break;
case CG_CM_INLINEMODEL:
VM_LONG(ret) = VM_TOMHANDLE(cl.model_precache[VM_LONG(arg[0])+1]);
if ((unsigned int)VM_LONG(arg[0]) > (cl.worldmodel?cl.worldmodel->numsubmodels:0))
Host_EndGame("cgame asked for invalid model number\n");
VM_LONG(ret) = VM_LONG(arg[0]);
break;
case CG_CM_NUMINLINEMODELS:
VM_LONG(ret) = cl.worldmodel?cl.worldmodel->numsubmodels:0;
break;
case CG_CM_TEMPBOXMODEL:
VM_LONG(ret) = VM_TOMHANDLE(CM_TempBoxModel(VM_POINTER(arg[0]), VM_POINTER(arg[1])));
CM_TempBoxModel(VM_POINTER(arg[0]), VM_POINTER(arg[1]));
VM_LONG(ret) = MAX_MODELS;
break;
case CG_R_MODELBOUNDS:

View File

@ -167,7 +167,7 @@ int demo_preparsedemo(unsigned char *buffer, int bytes)
switch(buffer[1]&dem_mask)
{
case dem_cmd:
ofs = -(sizeof(q1usercmd_t));
ofs = -(int)(sizeof(q1usercmd_t));
ofs = 0;
break;
case dem_set:

View File

@ -1356,7 +1356,7 @@ entity_t *V_AddEntity(entity_t *in)
return ent;
}
/*
void VQ2_AddLerpEntity(entity_t *in) //a convienience function
{
entity_t *ent;
@ -1384,7 +1384,7 @@ void VQ2_AddLerpEntity(entity_t *in) //a convienience function
VectorInverse(ent->axis[1]);
ent->angles[0]*=-1;
}
*/
int V_AddLight (int entsource, vec3_t org, float quant, float r, float g, float b)
{
return CL_NewDlightRGB (entsource, org, quant, -0.1, r, g, b) - cl_dlights;

View File

@ -7,15 +7,6 @@
int keycatcher;
#define MAX_TOKENLENGTH 1024
typedef struct pc_token_s
{
int type;
int subtype;
int intvalue;
float floatvalue;
char string[MAX_TOKENLENGTH];
} pc_token_t;
#define TT_STRING 1 // string
#define TT_LITERAL 2 // literal
#define TT_NUMBER 3 // number
@ -599,23 +590,11 @@ void VQ3_RenderView(const q3refdef_t *ref)
}
memcpy(cl.q2frame.areabits, ref->areamask, sizeof(cl.q2frame.areabits));
#ifdef GLQUAKE
if (qrenderer == QR_OPENGL)
{
qglDisable(GL_ALPHA_TEST);
qglDisable(GL_BLEND);
}
#endif
R_RenderView();
#ifdef GLQUAKE
if (qrenderer == QR_OPENGL)
{
GL_Set2D ();
qglBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GL_TexEnv(GL_MODULATE);
qglDisable(GL_ALPHA_TEST);
qglEnable(GL_BLEND);
}
#endif

View File

@ -2,15 +2,6 @@
#include "glquake.h"
#ifdef HLCLIENT
//make shared
#ifndef QDECL
#ifdef _MSC_VER
#define QDECL _cdecl
#else
#define QDECL
#endif
#endif
struct hlcvar_s *QDECL GHL_CVarGetPointer(char *varname);

View File

@ -1094,7 +1094,7 @@ void Cam_TrackPlayer(int pnum, char *cmdname, char *plrarg);
void Cam_Lock(int pnum, int playernum);
void CL_InitCam(void);
void vectoangles(vec3_t vec, vec3_t ang);
void QDECL vectoangles(vec3_t vec, vec3_t ang);
//
//zqtp.c

View File

@ -504,164 +504,6 @@ FRAME PARSING
=========================================================================
*/
#if 0
typedef struct
{
int modelindex;
int num; // entity number
int effects;
vec3_t origin;
vec3_t oldorigin;
vec3_t angles;
qboolean present;
} projectile_t;
#define MAX_PROJECTILES 64
projectile_t cl_projectiles[MAX_PROJECTILES];
void CLQ2_ClearProjectiles (void)
{
int i;
for (i = 0; i < MAX_PROJECTILES; i++) {
// if (cl_projectiles[i].present)
// Com_DPrintf("PROJ: %d CLEARED\n", cl_projectiles[i].num);
cl_projectiles[i].present = false;
}
}
/*
=====================
CL_ParseProjectiles
Flechettes are passed as efficient temporary entities
=====================
*/
void CLQ2_ParseProjectiles (void)
{
int i, c, j;
byte bits[8];
byte b;
projectile_t pr;
int lastempty = -1;
qboolean old = false;
c = MSG_ReadByte (&net_message);
for (i=0 ; i<c ; i++)
{
bits[0] = MSG_ReadByte (&net_message);
bits[1] = MSG_ReadByte (&net_message);
bits[2] = MSG_ReadByte (&net_message);
bits[3] = MSG_ReadByte (&net_message);
bits[4] = MSG_ReadByte (&net_message);
pr.origin[0] = ( ( bits[0] + ((bits[1]&15)<<8) ) <<1) - 4096;
pr.origin[1] = ( ( (bits[1]>>4) + (bits[2]<<4) ) <<1) - 4096;
pr.origin[2] = ( ( bits[3] + ((bits[4]&15)<<8) ) <<1) - 4096;
VectorCopy(pr.origin, pr.oldorigin);
if (bits[4] & 64)
pr.effects = EF_BLASTER;
else
pr.effects = 0;
if (bits[4] & 128) {
old = true;
bits[0] = MSG_ReadByte (&net_message);
bits[1] = MSG_ReadByte (&net_message);
bits[2] = MSG_ReadByte (&net_message);
bits[3] = MSG_ReadByte (&net_message);
bits[4] = MSG_ReadByte (&net_message);
pr.oldorigin[0] = ( ( bits[0] + ((bits[1]&15)<<8) ) <<1) - 4096;
pr.oldorigin[1] = ( ( (bits[1]>>4) + (bits[2]<<4) ) <<1) - 4096;
pr.oldorigin[2] = ( ( bits[3] + ((bits[4]&15)<<8) ) <<1) - 4096;
}
bits[0] = MSG_ReadByte (&net_message);
bits[1] = MSG_ReadByte (&net_message);
bits[2] = MSG_ReadByte (&net_message);
pr.angles[0] = 360*bits[0]/256;
pr.angles[1] = 360*bits[1]/256;
pr.modelindex = bits[2];
b = MSG_ReadByte (&net_message);
pr.num = (b & 0x7f);
if (b & 128) // extra entity number byte
pr.num |= (MSG_ReadByte (&net_message) << 7);
pr.present = true;
// find if this projectile already exists from previous frame
for (j = 0; j < MAX_PROJECTILES; j++) {
if (cl_projectiles[j].modelindex) {
if (cl_projectiles[j].num == pr.num) {
// already present, set up oldorigin for interpolation
if (!old)
VectorCopy(cl_projectiles[j].origin, pr.oldorigin);
cl_projectiles[j] = pr;
break;
}
} else
lastempty = j;
}
// not present previous frame, add it
if (j == MAX_PROJECTILES) {
if (lastempty != -1) {
cl_projectiles[lastempty] = pr;
}
}
}
}
/*
=============
CL_LinkProjectiles
=============
*/
void CLQ2_AddProjectiles (void)
{
int i, j;
projectile_t *pr;
entity_t ent;
memset (&ent, 0, sizeof(ent));
for (i=0, pr=cl_projectiles ; i < MAX_PROJECTILES ; i++, pr++)
{
// grab an entity to fill in
if (pr->modelindex < 1)
continue;
if (!pr->present) {
pr->modelindex = 0;
continue; // not present this frame (it was in the previous frame)
}
ent.model = cl.model_draw[pr->modelindex];
// interpolate origin
for (j=0 ; j<3 ; j++)
{
ent.origin[j] = ent.oldorigin[j] = pr->oldorigin[j] + cl.lerpfrac *
(pr->origin[j] - pr->oldorigin[j]);
}
if (pr->effects & EF_BLASTER)
{
if (P_ParticleTrail(pr->oldorigin, ent.origin, rt_blastertrail, NULL))
P_ParticleTrailIndex(pr->oldorigin, ent.origin, 0xe0, 1, NULL);
}
V_AddLight (pr->origin, 200, 0.2, 0.2, 0);
VectorCopy (pr->angles, ent.angles);
VQ2_AddLerpEntity (&ent);
}
}
#endif
/*
=================
CL_ParseEntityBits
@ -1333,6 +1175,7 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
// q2clientinfo_t *ci;
player_info_t *player;
unsigned int effects, renderfx;
float back, fwds;
// bonus items rotate at a fixed rate
autorotate = anglemod(cl.time*100);
@ -1589,8 +1432,17 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
}
//pmm
/*lerp the ent now*/
fwds = ent.framestate.g[FS_REG].lerpfrac;
back = 1 - ent.framestate.g[FS_REG].lerpfrac;
for (i = 0; i < 3; i++)
{
ent.origin[i] = ent.origin[i]*fwds + ent.oldorigin[i]*back;
}
ent.framestate.g[FS_REG].lerpfrac = back;
// add to refresh list
VQ2_AddLerpEntity (&ent);
V_AddEntity (&ent);
// color shells generate a seperate entity for the main model
@ -1640,7 +1492,7 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
ent.shaderRGBAf[1] = (!!(renderfx & Q2RF_SHELL_GREEN));
ent.shaderRGBAf[2] = (!!(renderfx & Q2RF_SHELL_BLUE));
ent.forcedshader = R_RegisterCustom("q2/shell", Shader_DefaultSkinShell, NULL);
VQ2_AddLerpEntity (&ent);
V_AddEntity (&ent);
}
ent.forcedshader = NULL;
@ -1694,7 +1546,7 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
}
*/ // pmm
VQ2_AddLerpEntity (&ent);
V_AddEntity (&ent);
//PGM - make sure these get reset.
ent.flags = 0;
@ -1704,12 +1556,12 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
if (s1->modelindex3)
{
ent.model = cl.model_precache[s1->modelindex3];
VQ2_AddLerpEntity (&ent);
V_AddEntity (&ent);
}
if (s1->modelindex4)
{
ent.model = cl.model_precache[s1->modelindex4];
VQ2_AddLerpEntity (&ent);
V_AddEntity (&ent);
}
if ( effects & Q2EF_POWERSCREEN )
@ -1719,7 +1571,7 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
ent.frame = 0;
ent.flags |= (Q2RF_TRANSLUCENT | Q2RF_SHELL_GREEN);
ent.alpha = 0.30;
VQ2_AddLerpEntity (&ent);
V_AddLerpEntity (&ent);
*/ }
// add automatic particle trails

View File

@ -518,6 +518,7 @@ void CLQ3_ParseGameState(void)
int c;
int index;
char *configString;
cvar_t *cl_paused;
//
// wipe the client_state_t struct
@ -607,6 +608,10 @@ void CLQ3_ParseGameState(void)
// load cgame, etc
// CL_ChangeLevel();
cl_paused = Cvar_FindVar("cl_paused");
if (cl_paused && cl_paused->ival)
Cvar_ForceSet(cl_paused, "0");
}
#define TEXTCMD_BACKUP 64
@ -716,7 +721,7 @@ qboolean CLQ3_Netchan_Process(void)
msg_readcount = readcount;
// calculate bitmask
bitmask = sequence ^ cls.challenge;
bitmask = (sequence ^ cls.challenge) & 0xff;
string = ccs.clientCommands[lastClientCommandNum & TEXTCMD_MASK];
#ifndef Q3_NOENCRYPT
@ -767,7 +772,7 @@ void CL_Netchan_Transmit( int length, const qbyte *data )
lastServerCommandNum = MSG_ReadLong();
// calculate bitmask
bitmask = lastSequence ^ serverid ^ cls.challenge;
bitmask = (lastSequence ^ serverid ^ cls.challenge) & 0xff;
string = ccs.serverCommands[lastServerCommandNum & TEXTCMD_MASK];
#ifndef Q3_NOENCRYPT

View File

@ -2258,7 +2258,8 @@ void Media_RecordFilm_f (void)
BITMAPINFOHEADER bitmap_info_header;
AVISTREAMINFO stream_header;
FILE *f;
char filename[256];
char aviname[256];
char nativepath[256];
if (strlen(fourcc) == 4)
recordavi_codec_fourcc = mmioFOURCC(*(fourcc+0), *(fourcc+1), *(fourcc+2), *(fourcc+3));
@ -2271,23 +2272,24 @@ void Media_RecordFilm_f (void)
AVIFileInit();
}
snprintf(filename, sizeof(filename) - 5, "%s%s", com_quakedir, Cmd_Argv(1));
COM_StripExtension(filename, filename, sizeof(filename));
COM_DefaultExtension (filename, ".avi", sizeof(filename));
/*convert to foo.avi*/
COM_StripExtension(Cmd_Argv(1), aviname, sizeof(aviname));
COM_DefaultExtension (aviname, ".avi", sizeof(aviname));
/*find the system location of that*/
FS_NativePath(aviname, FS_ROOT, nativepath, sizeof(nativepath));
//wipe it.
f = fopen(filename, "rb");
f = fopen(nativepath, "rb");
if (f)
{
fclose(f);
unlink(filename);
unlink(nativepath);
}
hr = AVIFileOpen(&recordavi_file, filename, OF_WRITE | OF_CREATE, NULL);
hr = AVIFileOpen(&recordavi_file, nativepath, OF_WRITE | OF_CREATE, NULL);
if (FAILED(hr))
{
Con_Printf("Failed to open\n");
Con_Printf("Failed to open %s\n", nativepath);
return;
}
@ -2312,7 +2314,7 @@ void Media_RecordFilm_f (void)
hr = AVIFileCreateStream(recordavi_file, &recordavi_uncompressed_video_stream, &stream_header);
if (FAILED(hr))
{
Con_Printf("Couldn't initialise the stream\n");
Con_Printf("Couldn't initialise the stream, check codec\n");
Media_StopRecordFilm_f();
return;
}

View File

@ -1783,7 +1783,7 @@ qboolean M_Vid_GetMode(int num, int *w, int *h)
v++;
num--;
}
if (v)
if (*v)
{
const char *c = *v;
const char *s = strchr(c, 'x');

View File

@ -150,9 +150,9 @@ void M_Menu_SinglePlayer_f (void)
MC_AddCenterPicture(menu, 4, 24, "pics/m_banner_game");
menu->selecteditem = (menuoption_t*)
MC_AddConsoleCommand (menu, 64, 40, "Easy", "skill 0;deathmatch 0; coop 0;newgame\n");
MC_AddConsoleCommand (menu, 64, 48, "Medium", "skill 1;deathmatch 0; coop 0;newgame\n");
MC_AddConsoleCommand (menu, 64, 56, "Hard", "skill 2;deathmatch 0; coop 0;newgame\n");
MC_AddConsoleCommand (menu, 64, 40, "Easy", "closemenu; skill 0;deathmatch 0; coop 0;newgame\n");
MC_AddConsoleCommand (menu, 64, 48, "Medium", "closemenu; skill 1;deathmatch 0; coop 0;newgame\n");
MC_AddConsoleCommand (menu, 64, 56, "Hard", "closemenu; skill 2;deathmatch 0; coop 0;newgame\n");
MC_AddConsoleCommand (menu, 64, 72, "Load Game", "menu_load\n");
MC_AddConsoleCommand (menu, 64, 80, "Save Game", "menu_save\n");

View File

@ -66,7 +66,7 @@ typedef struct cparticle_s
pt_grav,
pt_slowgrav
} type;
unsigned char color;
unsigned int rgb;
struct cparticle_s *next;
} cparticle_t;
@ -76,10 +76,11 @@ typedef struct cparticle_s
static int r_numparticles;
static cparticle_t *particles, *active_particles, *free_particles;
extern qbyte default_quakepal[]; /*for ramps more than anything else*/
static int ramp1[8] = {0x6f, 0x6d, 0x6b, 0x69, 0x67, 0x65, 0x63, 0x61};
static int ramp2[8] = {0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x68, 0x66};
static int ramp3[8] = {0x6d, 0x6b, 6, 5, 4, 3};
#define qpal(q) ((default_quakepal[(q)*3+0]<<0) | (default_quakepal[(q)*3+1]<<8) | (default_quakepal[(q)*3+2]<<16))
#define BUFFERVERTS 2048*3
@ -350,7 +351,7 @@ static void PClassic_DrawParticles(void)
scale = 1 + dist * r_partscale;
usecolours.i = palette[(int)p->color];
usecolours.i = p->rgb;
if (p->type == pt_fire)
usecolours.b[3] = 255 * (6 - p->ramp) / 6;
else
@ -381,7 +382,7 @@ static void PClassic_DrawParticles(void)
if (p->ramp >= 6)
p->die = -1;
else
p->color = ramp3[(int) p->ramp];
p->rgb = qpal(ramp3[(int) p->ramp]);
p->vel[2] += grav;
break;
case pt_explode:
@ -389,7 +390,7 @@ static void PClassic_DrawParticles(void)
if (p->ramp >=8)
p->die = -1;
else
p->color = ramp1[(int) p->ramp];
p->rgb = qpal(ramp1[(int) p->ramp]);
for (i = 0; i < 3; i++)
p->vel[i] += p->vel[i] * dvel;
p->vel[2] -= grav*10;
@ -399,7 +400,7 @@ static void PClassic_DrawParticles(void)
if (p->ramp >=8)
p->die = -1;
else
p->color = ramp2[(int) p->ramp];
p->rgb = qpal(ramp2[(int) p->ramp]);
for (i = 0; i < 3; i++)
p->vel[i] -= p->vel[i] * frametime;
p->vel[2] -= grav*10;
@ -447,7 +448,7 @@ static void Classic_ParticleExplosion (vec3_t org)
active_particles = p;
p->die = cl.time + 5;
p->color = ramp1[0];
p->rgb = d_8to24rgbtable[ramp1[0]];
p->ramp = rand() & 3;
if (i & 1)
{
@ -489,7 +490,7 @@ static void Classic_BlobExplosion (vec3_t org)
if (i & 1)
{
p->type = pt_blob;
p->color = 66 + rand() % 6;
p->rgb = d_8to24rgbtable[66 + rand() % 6];
for (j = 0; j < 3; j++)
{
p->org[j] = org[j] + ((rand() % 32) - 16);
@ -499,7 +500,7 @@ static void Classic_BlobExplosion (vec3_t org)
else
{
p->type = pt_blob2;
p->color = 150 + rand() % 6;
p->rgb = d_8to24rgbtable[150 + rand() % 6];
for (j = 0; j < 3; j++)
{
p->org[j] = org[j] + ((rand() % 32) - 16);
@ -529,7 +530,7 @@ static void Classic_RunParticleEffect (vec3_t org, vec3_t dir, int color, int co
active_particles = p;
p->die = cl.time + 0.1 * (rand() % 5);
p->color = (color & ~7) + (rand() & 7);
p->rgb = d_8to24rgbtable[(color & ~7) + (rand() & 7)];
p->type = pt_grav;
for (j = 0; j < 3; j++)
{
@ -560,7 +561,7 @@ static void Classic_LavaSplash (vec3_t org)
active_particles = p;
p->die = cl.time + 2 + (rand() & 31) * 0.02;
p->color = 224 + (rand() & 7);
p->rgb = d_8to24rgbtable[224 + (rand() & 7)];
p->type = pt_grav;
dir[0] = j * 8 + (rand() & 7);
@ -600,7 +601,7 @@ static void Classic_TeleportSplash (vec3_t org)
active_particles = p;
p->die = cl.time + 0.2 + (rand() & 7) * 0.02;
p->color = 7 + (rand() & 7);
p->rgb = d_8to24rgbtable[7 + (rand() & 7)];
p->type = pt_grav;
dir[0] = j * 8;
@ -671,20 +672,20 @@ static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, ef
{
case GRENADE_TRAIL:
p->ramp = (rand() & 3) + 2;
p->color = ramp3[(int) p->ramp];
p->rgb = d_8to24rgbtable[ramp3[(int) p->ramp]];
p->type = pt_fire;
for (j = 0; j < 3; j++)
p->org[j] = point[j] + ((rand() % 6) - 3);
break;
case BLOOD_TRAIL:
p->type = pt_slowgrav;
p->color = 67 + (rand() & 3);
p->rgb = d_8to24rgbtable[67 + (rand() & 3)];
for (j = 0; j < 3; j++)
p->org[j] = point[j] + ((rand() % 6) - 3);
break;
case BIG_BLOOD_TRAIL:
p->type = pt_slowgrav;
p->color = 67 + (rand() & 3);
p->rgb = d_8to24rgbtable[67 + (rand() & 3)];
for (j = 0; j < 3; j++)
p->org[j] = point[j] + ((rand() % 6) - 3);
break;
@ -693,9 +694,9 @@ static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, ef
p->die = cl.time + 0.5;
p->type = pt_static;
if (type == TRACER1_TRAIL)
p->color = 52 + ((tracercount & 4) << 1);
p->rgb = d_8to24rgbtable[52 + ((tracercount & 4) << 1)];
else
p->color = 230 + ((tracercount & 4) << 1);
p->rgb = d_8to24rgbtable[230 + ((tracercount & 4) << 1)];
tracercount++;
@ -712,7 +713,7 @@ static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, ef
}
break;
case VOOR_TRAIL:
p->color = 9 * 16 + 8 + (rand() & 3);
p->rgb = d_8to24rgbtable[9 * 16 + 8 + (rand() & 3)];
p->type = pt_static;
p->die = cl.time + 0.3;
for (j = 0; j < 3; j++)
@ -720,7 +721,7 @@ static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, ef
break;
case ALT_ROCKET_TRAIL:
p->ramp = (rand() & 3);
p->color = ramp3[(int) p->ramp];
p->rgb = d_8to24rgbtable[ramp3[(int) p->ramp]];
p->type = pt_fire;
for (j = 0; j < 3; j++)
p->org[j] = point[j] + ((rand() % 6) - 3);
@ -728,7 +729,7 @@ static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, ef
case ROCKET_TRAIL:
default:
p->ramp = (rand() & 3);
p->color = ramp3[(int) p->ramp];
p->rgb = d_8to24rgbtable[ramp3[(int) p->ramp]];
p->type = pt_fire;
for (j = 0; j < 3; j++)
p->org[j] = point[j] + ((rand() % 6) - 3);

View File

@ -1897,7 +1897,10 @@ static void P_LoadParticleSet(char *name, qboolean first)
fallback->ShutdownParticles();
fallback = &pe_classic;
if (fallback)
{
fallback->InitParticles();
fallback->ClearParticles();
}
return;
}

View File

@ -839,7 +839,7 @@ void R_SetRenderer(rendererinfo_t *ri)
SCR_UpdateScreen = ri->SCR_UpdateScreen;
}
static qbyte default_quakepal[768] =
qbyte default_quakepal[768] =
{
0,0,0,15,15,15,31,31,31,47,47,47,63,63,63,75,75,75,91,91,91,107,107,107,123,123,123,139,139,139,155,155,155,171,171,171,187,187,187,203,203,203,219,219,219,235,235,235,15,11,7,23,15,11,31,23,11,39,27,15,47,35,19,55,43,23,63,47,23,75,55,27,83,59,27,91,67,31,99,75,31,107,83,31,115,87,31,123,95,35,131,103,35,143,111,35,11,11,15,19,19,27,27,27,39,39,39,51,47,47,63,55,55,75,63,63,87,71,71,103,79,79,115,91,91,127,99,99,
139,107,107,151,115,115,163,123,123,175,131,131,187,139,139,203,0,0,0,7,7,0,11,11,0,19,19,0,27,27,0,35,35,0,43,43,7,47,47,7,55,55,7,63,63,7,71,71,7,75,75,11,83,83,11,91,91,11,99,99,11,107,107,15,7,0,0,15,0,0,23,0,0,31,0,0,39,0,0,47,0,0,55,0,0,63,0,0,71,0,0,79,0,0,87,0,0,95,0,0,103,0,0,111,0,0,119,0,0,127,0,0,19,19,0,27,27,0,35,35,0,47,43,0,55,47,0,67,

View File

@ -2373,7 +2373,7 @@ void Sbar_Draw (void)
Sbar_ExecuteLayoutString(cl.q2statusbar);
if (*cl.q2layout)
{
if (cl.q2frame.playerstate.stats[Q2STAT_LAYOUTS])
if (cl.q2frame.playerstate.stats[Q2STAT_LAYOUTS] & 1)
Sbar_ExecuteLayoutString(cl.q2layout);
}
return;

View File

@ -481,7 +481,8 @@ void *Sys_GetGameAPI(void *parms)
char name[MAX_OSPATH];
char curpath[MAX_OSPATH];
char *searchpath;
const char *gamename = "gamei386.so";
const char *agamename = "gamei386.so";
const char *ggamename = "game.so";
char *result;
void *ret;

View File

@ -799,7 +799,7 @@ void pscript_property_curserver_sets(struct context *ctx, const char *val)
}
Q_strncpyz(cls.servername, val, sizeof(cls.servername));
CL_BeginServerConnect();
CL_BeginServerConnect(0);
}
void pscript_property_stream_sets(struct context *ctx, const char *val)

View File

@ -1335,7 +1335,6 @@ void V_RenderPlayerViews(int plnum)
{
extern vec3_t desired_position[MAX_SPLITS];
vec3_t dir;
extern void vectoangles(vec3_t vec, vec3_t ang);
r_refdef.vrect.y -= r_refdef.vrect.height;
vid.recalc_refdef=true;

View File

@ -92,6 +92,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//#define DYNAMIC_LIBPNG
//#define DYNAMIC_LIBJPEG
#if defined(_MSC_VER) //too lazy to fix up the makefile
//#define BOTLIB_STATIC
#endif
#define AVAIL_FREETYPE
#ifdef _WIN32
//needs testing on other platforms

View File

@ -177,6 +177,11 @@ typedef struct
short children[2]; // negative numbers are contents
} dclipnode_t;
typedef struct
{
int planenum;
short children[2]; // negative numbers are contents
} mclipnode_t;
typedef struct texinfo_s
{

View File

@ -188,7 +188,7 @@ void InsertLinkAfter (link_t *l, link_t *after)
============================================================================
*/
void Q_strncpyz(char *d, const char *s, int n)
void QDECL Q_strncpyz(char *d, const char *s, int n)
{
int i;
n--;
@ -339,7 +339,9 @@ int Q_strncmp (char *s1, char *s2, int count)
return -1;
}
int Q_strncasecmp (char *s1, char *s2, int n)
#endif
int Q_strncasecmp (const char *s1, const char *s2, int n)
{
int c1, c2;
@ -369,12 +371,35 @@ int Q_strncasecmp (char *s1, char *s2, int n)
return -1;
}
int Q_strcasecmp (char *s1, char *s2)
int Q_strcasecmp (const char *s1, const char *s2)
{
return Q_strncasecmp (s1, s2, 99999);
}
int QDECL Q_stricmp (const char *s1, const char *s2)
{
return Q_strncasecmp (s1, s2, 99999);
}
#endif
int QDECL Q_vsnprintf(char *buffer, int size, const char *format, va_list argptr)
{
return vsnprintf(buffer, size, format, argptr);
}
int VARGS Com_sprintf(char *buffer, int size, const char *format, ...) LIKEPRINTF(3)
{
int ret;
va_list argptr;
va_start (argptr, format);
ret = vsnprintf (buffer, size, format, argptr);
va_end (argptr);
return ret;
}
void QDECL Com_Error( int level, const char *error, ... )
{
Sys_Error("%s", error);
}
char *Q_strlwr(char *s)
{
@ -1488,6 +1513,7 @@ void MSGQ2_ReadDeltaUsercmd (usercmd_t *from, usercmd_t *move)
// read buttons
if (bits & Q2CM_BUTTONS)
move->buttons = MSG_ReadByte ();
move->buttons_compat = move->buttons & 0xff;
if (bits & Q2CM_IMPULSE)
move->impulse = MSG_ReadByte ();

View File

@ -19,6 +19,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// comndef.h -- general definitions
#include <stdio.h>
//make shared
#ifndef QDECL
#ifdef _MSC_VER
#define QDECL _cdecl
#else
#define QDECL
#endif
#endif
typedef unsigned char qbyte;
// KJB Undefined true and false defined in SciTech's DEBUG.H header
@ -208,7 +219,7 @@ void VARGS Q_snprintfz (char *dest, size_t size, char *fmt, ...) LIKEPRINTF(3);
#if 0
#define Q_strncpyz(d, s, n) Q_strncpyN(d, s, (n)-1)
#else
void Q_strncpyz(char*d, const char*s, int n);
void QDECL Q_strncpyz(char*d, const char*s, int n);
#define Q_strncatz(dest, src, sizeofdest) \
do { \
strncat(dest, src, sizeofdest - strlen(dest) - 1); \
@ -221,18 +232,10 @@ void Q_strncpyz(char*d, const char*s, int n);
#define strncpy Q_strncpy
#endif*/
#ifdef _WIN32
#define Q_strcasecmp(s1, s2) _stricmp((s1), (s2))
#define Q_strncasecmp(s1, s2, n) _strnicmp((s1), (s2), (n))
#else
#define Q_strcasecmp(s1, s2) strcasecmp((s1), (s2))
#define Q_strncasecmp(s1, s2, n) strncasecmp((s1), (s2), (n))
#endif
/*replacement functions which do not care for locale in text formatting ('C' locale)*/
int Q_strncasecmp (const char *s1, const char *s2, int n);
int Q_strcasecmp (const char *s1, const char *s2);
int Q_atoi (const char *str);
float Q_atof (const char *str);
@ -458,3 +461,17 @@ void Log_String (logtype_t lognum, char *s);
void Con_Log (char *s);
void Log_Logfile_f (void);
void Log_Init(void);
/*used by and for botlib and q3 gamecode*/
#define MAX_TOKENLENGTH 1024
typedef struct pc_token_s
{
int type;
int subtype;
int intvalue;
float floatvalue;
char string[MAX_TOKENLENGTH];
} pc_token_t;
#define fileHandle_t int
#define fsMode_t int

View File

@ -73,7 +73,7 @@ void QCRC_Init(unsigned short *crcvalue)
void QCRC_ProcessByte(unsigned short *crcvalue, qbyte data)
{
*crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data];
*crcvalue = ((*crcvalue << 8)&0xffff) ^ crctable[(*crcvalue >> 8) ^ data];
}
unsigned short QCRC_Value(unsigned short crcvalue)
@ -87,7 +87,7 @@ unsigned short QCRC_Block (qbyte *start, int count)
QCRC_Init (&crc);
while (count--)
crc = (crc << 8) ^ crctable[(crc >> 8) ^ *start++];
crc = ((crc << 8) & 0xffff) ^ crctable[(crc >> 8) ^ *start++];
return crc;
}

View File

@ -1632,10 +1632,16 @@ void COM_Gamedir (const char *dir)
#endif
}
/*stuff that makes dp-only mods work a bit better*/
#define DPCOMPAT "set _cl_playermodel \"\"\n set dpcompat_set 1\n set dpcompat_trailparticles 1\nset dpcompat_corruptglobals 1\nset vid_pixelheight 1\n"
#define NEXCFG DPCOMPAT "set r_particlesdesc effectinfo\nset sv_maxairspeed \"400\"\nset sv_jumpvelocity 270\nset sv_mintic \"0.01\"\ncl_nolerp 0\nset r_particlesdesc effectinfo\n"
/*nexuiz/xonotic has a few quirks...*/
#define NEXCFG DPCOMPAT "set r_particlesdesc effectinfo\nset sv_maxairspeed \"400\"\nset sv_jumpvelocity 270\nset sv_mintic \"0.01\"\ncl_nolerp 0\n"
/*some modern non-compat settings*/
#define DMFCFG "set com_parseutf8 1\npm_airstep 1\n"
/*set some stuff so our regular qw client appears more like hexen2*/
#define HEX2CFG "set r_particlesdesc \"spikeset tsshaft h2part\"\nset sv_maxspeed 640\nset watervis 1\nset r_wateralpha 0.5\nset sv_pupglow 1\nset cl_model_bobbing 1\n"
/*Q3's ui doesn't like empty model/headmodel/handicap cvars, even if the gamecode copes*/
#define Q3CFG "seta model sarge\nseta headmodel sarge\nseta handicap 100\n"
typedef struct {
const char *protocolname; //sent to the master server when this is the current gamemode.
@ -1666,7 +1672,7 @@ const gamemode_info_t gamemode_info[] = {
"portals/pak3.pak"}, HEX2CFG,{"data1", "portals", "fteh2"}, "Hexen II MP"},
{"FTE-Hexen2", "hexen2", "-hexen2", {"data1/pak0.pak"}, HEX2CFG,{"data1", "fteh2"}, "Hexen II"},
{"FTE-Quake2", "q2", "-q2", {"baseq2/pak0.pak"}, NULL, {"baseq2", "fteq2"}, "Quake II"},
{"FTE-Quake3", "q3", "-q3", {"baseq3/pak0.pk3"}, NULL, {"baseq3", "fteq3"}, "Quake III Arena"},
{"FTE-Quake3", "q3", "-q3", {"baseq3/pak0.pk3"}, Q3CFG, {"baseq3", "fteq3"}, "Quake III Arena"},
{"FTE-Quake4", "q4", "-q4", {"q4base/pak00.pk4"}, NULL, {"q4base", "fteq4"}, "Quake 4"},
{"FTE-EnemyTerritory", "et", "-et", {"etmain/pak0.pk3"}, NULL, {"etmain", "fteet"}, "Wolfenstein - Enemy Territory"},

View File

@ -2357,14 +2357,9 @@ mfog_t *CM_FogForOrigin(vec3_t org)
//Convert a patch in to a list of glpolys
#define MAX_ARRAY_VERTS 2048
#define MAX_ARRAY_VERTS 65535
index_t tempIndexesArray[MAX_ARRAY_VERTS*3];
vecV_t tempxyz_array[MAX_ARRAY_VERTS]; //structure is used only at load.
vec3_t tempnormals_array[MAX_ARRAY_VERTS]; //so what harm is there in doing this?
vec2_t tempst_array[MAX_ARRAY_VERTS];
vec2_t templmst_array[MAX_ARRAY_VERTS];
byte_vec4_t tempcolors_array[MAX_ARRAY_VERTS];
index_t tempIndexesArray[MAX_ARRAY_VERTS*6];
//mesh_t *GL_CreateMeshForPatch ( model_t *mod, q3dface_t *surf )
mesh_t *GL_CreateMeshForPatch (model_t *mod, int patchwidth, int patchheight, int numverts, int firstvert)
@ -2633,6 +2628,8 @@ qboolean CModQ3_LoadRFaces (lump_t *l)
Vector4Copy(mesh->colors4b_array[0], mesh->colors4b_array[2]);
Vector4Copy(mesh->colors4b_array[0], mesh->colors4b_array[3]);
}
if (out->mesh->numindexes == 0)
Con_Printf("foo\n");
}
Mod_NormaliseTextureVectors(map_normals_array, map_svector_array, map_tvector_array, numvertexes);

View File

@ -368,7 +368,7 @@ void VectorAngles(float *forward, float *up, float *result) //up may be NULL
result[2] = roll;
}
void AngleVectors (const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up)
void QDECL AngleVectors (const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up)
{
float angle;
float sr, sp, sy, cr, cp, cy;
@ -403,6 +403,36 @@ void AngleVectors (const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up)
}
}
void QDECL vectoangles(vec3_t vec, vec3_t ang)
{
float forward;
float yaw, pitch;
if (vec[1] == 0 && vec[0] == 0)
{
yaw = 0;
if (vec[2] > 0)
pitch = 90;
else
pitch = 270;
}
else
{
yaw = /*(int)*/ (atan2(vec[1], vec[0]) * 180 / M_PI);
if (yaw < 0)
yaw += 360;
forward = sqrt (vec[0]*vec[0] + vec[1]*vec[1]);
pitch = /*(int)*/ (atan2(vec[2], forward) * 180 / M_PI);
if (pitch < 0)
pitch += 360;
}
ang[0] = pitch;
ang[1] = yaw;
ang[2] = 0;
}
int VectorCompare (const vec3_t v1, const vec3_t v2)
{
int i;
@ -485,7 +515,7 @@ float Q_rsqrt(float number)
return y;
}
float VectorNormalize (vec3_t v)
float QDECL VectorNormalize (vec3_t v)
{
float length, ilength;
@ -1637,7 +1667,7 @@ void Matrix3_Multiply (vec3_t *in1, vec3_t *in2, vec3_t *out)
out[2][2] = in1[2][0]*in2[0][2] + in1[2][1]*in2[1][2] + in1[2][2]*in2[2][2];
}
vec_t VectorNormalize2 (const vec3_t v, vec3_t out)
vec_t QDECL VectorNormalize2 (const vec3_t v, vec3_t out)
{
float length, ilength;

View File

@ -115,7 +115,7 @@ void _VectorCopy (vec3_t in, vec3_t out);
void _VectorSubtract (vec3_t veca, vec3_t vecb, vec3_t out);
void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs);
float anglemod (float a);
void AngleVectors (const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up);
void QDECL AngleVectors (const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up);
void VectorAngles (float *forward, float *up, float *angles); //up may be NULL
void VARGS BOPS_Error (void);
int VARGS BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct mplane_s *plane);
@ -173,8 +173,8 @@ void RotateLightVector(const vec3_t *axis, const vec3_t origin, const vec3_t li
int VectorCompare (const vec3_t v1, const vec3_t v2);
void VectorInverse (vec3_t v);
void _VectorMA (const vec3_t veca, const float scale, const vec3_t vecb, vec3_t vecc);
float VectorNormalize (vec3_t v); // returns vector length
vec_t VectorNormalize2 (const vec3_t v, vec3_t out);
float QDECL VectorNormalize (vec3_t v); // returns vector length
vec_t QDECL VectorNormalize2 (const vec3_t v, vec3_t out);
void VectorNormalizeFast(vec3_t v);
void VectorTransform (const vec3_t in1, const matrix3x4 in2, vec3_t out);
void VectorVectors (const vec3_t forward, vec3_t right, vec3_t up);

View File

@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
static qboolean PM_TransformedHullCheck (model_t *model, vec3_t start, vec3_t end, trace_t *trace, vec3_t origin, vec3_t angles);
int Q1BSP_HullPointContents(hull_t *hull, vec3_t p);
static hull_t box_hull;
static dclipnode_t box_clipnodes[6];
static mclipnode_t box_clipnodes[6];
static mplane_t box_planes[6];
extern vec3_t player_mins;

View File

@ -798,14 +798,15 @@ typedef struct usercmd_s
{
//the first members of this structure MUST match the q2 version
qbyte msec;
qbyte buttons;
qbyte buttons_compat;
short angles[3];
short forwardmove, sidemove, upmove;
qbyte impulse;
qbyte lightlevel;
//freestyle
qbyte weapon;
int buttons;
int weapon;
int servertime;
float fservertime;
float fclienttime;

View File

@ -11,7 +11,7 @@ Physics functions (common)
void Q1BSP_CheckHullNodes(hull_t *hull)
{
int num, c;
dclipnode_t *node;
mclipnode_t *node;
for (num = hull->firstclipnode; num < hull->lastclipnode; num++)
{
node = hull->clipnodes + num;
@ -32,7 +32,7 @@ SV_HullPointContents
static int Q1_HullPointContents (hull_t *hull, int num, vec3_t p)
{
float d;
dclipnode_t *node;
mclipnode_t *node;
mplane_t *plane;
while (num >= 0)
@ -205,7 +205,7 @@ qboolean Q1BSP_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f,
#else
qboolean Q1BSP_RecursiveHullCheck (hull_t *hull, int num, float p1f, float p2f, vec3_t p1, vec3_t p2, trace_t *trace)
{
dclipnode_t *node;
mclipnode_t *node;
mplane_t *plane;
float t1, t2;
float frac;
@ -1007,7 +1007,9 @@ int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent1, vec3_t tangen
sh_shadowframe++;
if (cl.worldmodel->fromgame == fg_quake)
if (!cl.worldmodel)
return 0;
else if (cl.worldmodel->fromgame == fg_quake)
Q1BSP_ClipDecalToNodes(&dec, cl.worldmodel->nodes);
#ifdef Q3BSPS
else if (cl.worldmodel->fromgame == fg_quake3)

View File

@ -1642,7 +1642,8 @@ void MSG_Q3_ReadDeltaPlayerstate( const q3playerState_t *from, q3playerState_t *
////////////////////////////////////////////////////////////
//user commands
int kbitmask[32] = {
int kbitmask[] = {
0,
0x00000001, 0x00000003, 0x00000007, 0x0000000F,
0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
@ -1656,7 +1657,7 @@ int kbitmask[32] = {
static int MSG_ReadDeltaKey(int key, int from, int bits)
{
if (MSG_ReadBits(1))
return MSG_ReadBits(bits)^ (key & kbitmask[bits]);
return MSG_ReadBits(bits) ^ (key & kbitmask[bits]);
else
return from;
}
@ -1666,7 +1667,14 @@ void MSG_Q3_ReadDeltaUsercmd(int key, const usercmd_t *from, usercmd_t *to)
to->servertime = MSG_ReadBits(8) + from->servertime;
else
to->servertime = MSG_ReadBits(32);
to->msec = to->servertime - from->servertime;
if ((unsigned int)(to->servertime - from->servertime) > 255)
{
Con_DPrintf("msecs clamped\n");
to->msec = 255;
}
else
to->msec = to->servertime - from->servertime;
if (!MSG_ReadBits(1))
{

View File

@ -99,8 +99,7 @@ typedef struct areanode_s
int axis; // -1 = leaf node
float dist;
struct areanode_s *children[2];
link_t trigger_edicts;
link_t solid_edicts;
link_t edicts;
} areanode_t;
#define AREA_DEPTH 4

View File

@ -2142,7 +2142,7 @@ void Memory_Init (void *buf, int size)
#if ZONEDEBUG>0 || HUNKDEBUG>0 || TEMPDEBUG>0||CACHEDEBUG>0
srand(time(0));
sentinalkey = rand();
sentinalkey = rand() & 0xff;
#endif
Cache_Init ();

View File

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="botlib"
ProjectGUID="{0018E098-B12A-4E4D-9B22-6772DA287080}"
RootNamespace="botlib"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../libs/speex,..\client,../libs/freetype2/include,../common,../server,../gl,../sw,../qclib,../libs,../libs/dxsdk7/include"
PreprocessorDefinitions="BOTLIB"
MinimalRebuild="true"
BasicRuntimeChecks="3"
SmallerTypeCheck="true"
RuntimeLibrary="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
FavorSizeOrSpeed="0"
OmitFramePointers="true"
PreprocessorDefinitions="BOTLIB"
RuntimeLibrary="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\botlib\be_aas_bspq3.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_cluster.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_debug.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_entity.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_file.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_main.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_move.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_optimize.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_reach.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_route.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_routealt.c"
>
</File>
<File
RelativePath="..\botlib\be_aas_sample.c"
>
</File>
<File
RelativePath="..\botlib\be_ai_char.c"
>
</File>
<File
RelativePath="..\botlib\be_ai_chat.c"
>
</File>
<File
RelativePath="..\botlib\be_ai_gen.c"
>
</File>
<File
RelativePath="..\botlib\be_ai_goal.c"
>
</File>
<File
RelativePath="..\botlib\be_ai_move.c"
>
</File>
<File
RelativePath="..\botlib\be_ai_weap.c"
>
</File>
<File
RelativePath="..\botlib\be_ai_weight.c"
>
</File>
<File
RelativePath="..\botlib\be_ea.c"
>
</File>
<File
RelativePath="..\botlib\be_interface.c"
>
</File>
<File
RelativePath="..\botlib\l_crc.c"
>
</File>
<File
RelativePath="..\botlib\l_libvar.c"
>
</File>
<File
RelativePath="..\botlib\l_log.c"
>
</File>
<File
RelativePath="..\botlib\l_memory.c"
>
</File>
<File
RelativePath="..\botlib\l_precomp.c"
>
</File>
<File
RelativePath="..\botlib\l_script.c"
>
</File>
<File
RelativePath="..\botlib\l_struct.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\botlib\aasfile.h"
>
</File>
<File
RelativePath="..\botlib\be_aas.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_bsp.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_cluster.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_debug.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_def.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_entity.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_file.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_funcs.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_main.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_move.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_optimize.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_reach.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_route.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_routealt.h"
>
</File>
<File
RelativePath="..\botlib\be_aas_sample.h"
>
</File>
<File
RelativePath="..\botlib\be_ai_char.h"
>
</File>
<File
RelativePath="..\botlib\be_ai_chat.h"
>
</File>
<File
RelativePath="..\botlib\be_ai_gen.h"
>
</File>
<File
RelativePath="..\botlib\be_ai_goal.h"
>
</File>
<File
RelativePath="..\botlib\be_ai_move.h"
>
</File>
<File
RelativePath="..\botlib\be_ai_weap.h"
>
</File>
<File
RelativePath="..\botlib\be_ai_weight.h"
>
</File>
<File
RelativePath="..\botlib\be_ea.h"
>
</File>
<File
RelativePath="..\botlib\be_interface.h"
>
</File>
<File
RelativePath="..\botlib\botlib.h"
>
</File>
<File
RelativePath="..\botlib\l_crc.h"
>
</File>
<File
RelativePath="..\botlib\l_libvar.h"
>
</File>
<File
RelativePath="..\botlib\l_log.h"
>
</File>
<File
RelativePath="..\botlib\l_memory.h"
>
</File>
<File
RelativePath="..\botlib\l_precomp.h"
>
</File>
<File
RelativePath="..\botlib\l_script.h"
>
</File>
<File
RelativePath="..\botlib\l_struct.h"
>
</File>
<File
RelativePath="..\botlib\l_utils.h"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,10 +1,16 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftequake", "ftequake.vcproj", "{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1364}"
ProjectSection(ProjectDependencies) = postProject
{0018E098-B12A-4E4D-9B22-6772DA287080} = {0018E098-B12A-4E4D-9B22-6772DA287080}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftequake_SDL", "ftequake_SDL.vcproj", "{F384725A-62D4-4063-9941-6D8D2D6C2A47}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "npfte", "npfte.vcproj", "{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}"
ProjectSection(ProjectDependencies) = postProject
{0018E098-B12A-4E4D-9B22-6772DA287080} = {0018E098-B12A-4E4D-9B22-6772DA287080}
EndProjectSection
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "FTEQuake", "..\setup\setup.vdproj", "{E0EE8B50-3A75-42A9-B80A-787675979B0C}"
EndProject
@ -13,6 +19,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtvprox", "..\..\fteqtv\qtv
{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365} = {88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "botlib", "botlib.vcproj", "{0018E098-B12A-4E4D-9B22-6772DA287080}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
D3DDebug|Win32 = D3DDebug|Win32
@ -130,7 +138,6 @@ Global
{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.GLDebug|x64.ActiveCfg = GLDebug|x64
{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.GLDebug|x64.Build.0 = GLDebug|x64
{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.GLRelease|Win32.ActiveCfg = GLRelease|Win32
{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.GLRelease|Win32.Build.0 = GLRelease|Win32
{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.GLRelease|x64.ActiveCfg = GLRelease|x64
{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.GLRelease|x64.Build.0 = GLRelease|x64
{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.MDebug|Win32.ActiveCfg = GLRelease|x64
@ -215,6 +222,40 @@ Global
{1A353DA0-F351-4C0D-A21D-E2B460600B20}.Release|Win32.ActiveCfg = Release|Win32
{1A353DA0-F351-4C0D-A21D-E2B460600B20}.Release|Win32.Build.0 = Release|Win32
{1A353DA0-F351-4C0D-A21D-E2B460600B20}.Release|x64.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.D3DDebug|Win32.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.D3DDebug|Win32.Build.0 = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.D3DDebug|x64.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.D3DRelease|Win32.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.D3DRelease|Win32.Build.0 = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.D3DRelease|x64.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Debug Dedicated Server|Win32.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Debug Dedicated Server|Win32.Build.0 = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Debug Dedicated Server|x64.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Debug|Win32.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Debug|Win32.Build.0 = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Debug|x64.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.GLDebug|Win32.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.GLDebug|Win32.Build.0 = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.GLDebug|x64.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.GLRelease|Win32.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.GLRelease|Win32.Build.0 = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.GLRelease|x64.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MDebug|Win32.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MDebug|Win32.Build.0 = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MDebug|x64.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MinGLDebug|Win32.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MinGLDebug|x64.ActiveCfg = Debug|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MinGLRelease|Win32.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MinGLRelease|x64.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MRelease|Win32.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MRelease|Win32.Build.0 = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.MRelease|x64.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Release Dedicated Server|Win32.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Release Dedicated Server|Win32.Build.0 = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Release Dedicated Server|x64.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Release|Win32.ActiveCfg = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Release|Win32.Build.0 = Release|Win32
{0018E098-B12A-4E4D-9B22-6772DA287080}.Release|x64.ActiveCfg = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

File diff suppressed because it is too large Load Diff

View File

@ -929,7 +929,7 @@ struct font_s *Font_LoadFont(int height, char *fontfilename)
f->chars[i].bmh = PLANEWIDTH/16;
f->chars[i].bmw = PLANEWIDTH/16;
f->chars[i].bmx = (i&15)*(PLANEWIDTH/16);
f->chars[i].bmy = (i/16)*(PLANEWIDTH/16);
f->chars[i].bmy = ((i/16)*(PLANEWIDTH/16)) & 0xff;
f->chars[i].left = 0;
f->chars[i].top = 0;
f->chars[i].nextchar = 0; //these chars are not linked in

View File

@ -2306,7 +2306,8 @@ Mod_LoadClipnodes
*/
qboolean RMod_LoadClipnodes (lump_t *l)
{
dclipnode_t *in, *out;
dclipnode_t *in;
mclipnode_t *out;
int i, count;
hull_t *hull;
@ -2527,7 +2528,7 @@ Deplicate the drawing hull structure as a clipping hull
void RMod_MakeHull0 (void)
{
mnode_t *in, *child;
dclipnode_t *out;
mclipnode_t *out;
int i, j, count;
hull_t *hull;

View File

@ -446,7 +446,7 @@ typedef struct
// !!! if this is changed, it must be changed in asm_i386.h too !!!
typedef struct hull_s
{
dclipnode_t *clipnodes;
mclipnode_t *clipnodes;
mplane_t *planes;
int firstclipnode;
int lastclipnode;
@ -859,7 +859,7 @@ typedef struct model_s
int *surfedges;
int numclipnodes;
dclipnode_t *clipnodes;
mclipnode_t *clipnodes;
int nummarksurfaces;
msurface_t **marksurfaces;

View File

@ -238,7 +238,7 @@ void GLR_RenderDlights (void)
l = cl_dlights+rtlights_first;
for (i=rtlights_first; i<rtlights_max; i++, l++)
{
if (!l->radius)// || !(l->flags & LFLAG_ALLOW_FLASH))
if (!l->radius || !(l->flags & LFLAG_ALLOW_FLASH))
continue;
//dlights emitting from the local player are not visible as flashblends

View File

@ -1122,7 +1122,7 @@ struct sbuiltin_s
"}\n"
"#endif\n"
},
{QR_OPENGL, 110, "defaultsky",
/* {QR_OPENGL, 110, "defaultsky",
"#ifdef VERTEX_SHADER\n"
"varying vec3 pos;\n"
@ -1156,10 +1156,10 @@ struct sbuiltin_s
" vec4 clouds = texture2D(s_t1, tccoord);\n"
" gl_FragColor.rgb = (solid.rgb*(1.0-clouds.a)) + (clouds.a*clouds.rgb);\n"
// " gl_FragColor.rgb = solid.rgb;/*gl_FragColor.g = clouds.r;*/gl_FragColor.b = clouds.a;\n"
"}\n"
"#endif\n"
},
*/
/*draws a model. there's lots of extra stuff for light shading calcs and upper/lower textures*/
{QR_OPENGL/*ES*/, 100, "defaultskin",
"!!permu FULLBRIGHT\n"

View File

@ -459,7 +459,6 @@ static void R_DrawSkyMesh(batch_t *batch, mesh_t *m, shader_t *shader)
{
static entity_t skyent;
batch_t b;
//float time = cl.gametime+realtime-cl.gametimemark; //warning: unused variable time
float skydist = gl_skyboxdist.value;
if (skydist<1)

View File

@ -2497,7 +2497,7 @@ static void QCBUILTIN PF_particle (progfuncs_t *prinst, globalvars_t *pr_globals
v = -128;
MSG_WriteChar (&sv.nqmulticast, v);
}
MSG_WriteByte (&sv.nqmulticast, count*20);
MSG_WriteByte (&sv.nqmulticast, count);
MSG_WriteByte (&sv.nqmulticast, color);
#endif
//for qw users (and not fte)
@ -2743,6 +2743,9 @@ void PF_ambientsound_Internal (float *pos, char *samp, float vol, float attenuat
SV_FlushSignon();
if (soundnum > 255)
return;
// add an svc_spawnambient command to the level signon packet
MSG_WriteByte (&sv.signon,svc_spawnstaticsound);

View File

@ -293,8 +293,6 @@ typedef struct
int APIversion;
} gameData32_t;
typedef int fileHandle_t;
typedef enum {
FS_READ_BIN,
FS_READ_TXT,
@ -302,7 +300,7 @@ typedef enum {
FS_WRITE_TXT,
FS_APPEND_BIN,
FS_APPEND_TXT
} fsMode_t;
} q1qvmfsMode_t;
typedef enum {
FS_SEEK_CUR,
@ -940,8 +938,28 @@ static qintptr_t syscallhandle (void *offset, quintptr_t mask, qintptr_t fn, con
//ret = filesize or -1
// Con_Printf("G_FSOpenFile: %s (mode %i)\n", VM_POINTER(arg[0]), arg[2]);
return VM_fopen(VM_POINTER(arg[0]), VM_POINTER(arg[1]), arg[2]/2, VMFSID_Q1QVM);
{
int mode;
switch((q1qvmfsMode_t)arg[2])
{
default:
return -1;
case FS_READ_BIN:
case FS_READ_TXT:
mode = VM_FS_READ;
break;
case FS_WRITE_BIN:
case FS_WRITE_TXT:
mode = VM_FS_WRITE;
break;
case FS_APPEND_BIN:
case FS_APPEND_TXT:
mode = VM_FS_APPEND;
break;
}
return VM_fopen(VM_POINTER(arg[0]), VM_POINTER(arg[1]), mode, VMFSID_Q1QVM);
}
break;
case G_FS_CloseFile:
VM_fclose(arg[0], VMFSID_Q1QVM);

View File

@ -563,7 +563,7 @@ qboolean SV_LoadLevelCache(char *savename, char *level, char *startspot, qboolea
return false;
}
if (!FS_NativePath(name, FS_GAMEONLY, syspath, sizeof(syspath)))
if (!FS_NativePath(name, FS_GAME, syspath, sizeof(syspath)))
return false;
ge->ReadLevel(syspath);
@ -895,7 +895,7 @@ void SV_SaveLevelCache(char *savedir, qboolean dontharmgame)
#define FTESAVEGAME_VERSION 25000
void SV_Savegame_f (void)
void SV_Savegame (char *savename)
{
extern cvar_t nomonsters;
extern cvar_t gamecfg;
@ -919,7 +919,6 @@ void SV_Savegame_f (void)
char comment[SAVEGAME_COMMENT_LENGTH+1];
vfsfile_t *f;
int len;
char *savename;
levelcache_t *cache;
char str[MAX_LOCALINFO_STRING+1];
char *savefilename;
@ -930,8 +929,7 @@ void SV_Savegame_f (void)
return;
}
savename = Cmd_Argv(1);
/*catch invalid names*/
if (!*savename || strstr(savename, ".."))
savename = "quicksav";
@ -1017,6 +1015,11 @@ void SV_Savegame_f (void)
FS_FlushFSHash();
}
void SV_Savegame_f (void)
{
SV_Savegame(Cmd_Argv(1));
}
void SV_Loadgame_f (void)
{
levelcache_t *cache;

View File

@ -936,6 +936,7 @@ void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qb
void SV_SaveSpawnparms (qboolean);
void SV_SaveLevelCache(char *savename, qboolean dontharmgame);
void SV_Savegame (char *savename);
qboolean SV_LoadLevelCache(char *savename, char *level, char *startspot, qboolean ignoreplayers);
void SV_Physics_Client (edict_t *ent, int num);

View File

@ -424,6 +424,16 @@ SV_Map_f
handle a
map <mapname>
command from the console or progs.
quirks:
a leading '*' means new unit, meaning all old state is flushed regardless of startspot
a '+' means 'set nextmap cvar to the following value and otherwise ignore, for q2 compat. only applies if there's also a '.' and the specified bsp doesn't exist, for q1 compat.
just a '.' is taken to mean 'restart'. parms are not changed from their current values, startspot is also unchanged.
'map' will change map, for most games. note that NQ kicks everyone (NQ expects you to use changelevel for that).
'changelevel' will not flush the level cache, for h2 compat (won't save current level state in such a situation, as nq would prefer not)
'gamemap' will save the game to 'save0' after loading, for q2 compat
'spmap' is for q3 and sets 'gametype' to '2', otherwise identical to 'map'. all other map commands will reset it to '0' if its '2' at the time.
======================
*/
void SV_Map_f (void)
@ -437,6 +447,7 @@ void SV_Map_f (void)
qboolean cinematic = false;
qboolean waschangelevel = false;
qboolean wasspmap = false;
qboolean wasgamemap = false;
int i;
char *startspot;
@ -463,6 +474,7 @@ void SV_Map_f (void)
waschangelevel = !strcmp(Cmd_Argv(0), "changelevel");
wasspmap = !strcmp(Cmd_Argv(0), "spmap");
wasgamemap = !strcmp(Cmd_Argv(0), "gamemap");
if (strcmp(level, ".")) //restart current
{
@ -660,6 +672,11 @@ void SV_Map_f (void)
else
Cvar_Set(nsv, "");
}
if (wasgamemap)
{
SV_Savegame("s0");
}
}
void SV_KillServer_f(void)

View File

@ -211,12 +211,12 @@ void SV_EmitNailUpdate (sizebuf_t *msg, qboolean recorder)
p = (int)(16*ent->v->angles[0]/360)&15;
yaw = (int)(256*ent->v->angles[1]/360)&255;
bits[0] = x;
bits[1] = (x>>8) | (y<<4);
bits[2] = (y>>4);
bits[3] = z;
bits[4] = (z>>8) | (p<<4);
bits[5] = yaw;
bits[0] = x & 0xff;
bits[1] = ((x>>8) | (y<<4)) & 0xff;
bits[2] = (y>>4) & 0xff;
bits[3] = z & 0xff;
bits[4] = ((z>>8) | (p<<4)) & 0xff;
bits[5] = yaw & 0xff;
for (i=0 ; i<6 ; i++)
MSG_WriteByte (msg, bits[i]);

View File

@ -2184,7 +2184,7 @@ qboolean SV_Physics (void)
SV_RunEntity (ent);
SV_RunNewmis ();
if (ent->solidtype != ent->v->solid && !ent->isfree)
if (((!ent->solidtype) != (!(qbyte)ent->v->solid)) && !ent->isfree)
{
Con_DPrintf("Entity \"%s\" improperly changed solid type\n", PR_GetString(svprogfuncs, ent->v->classname));
World_LinkEdict (&sv.world, (wedict_t*)ent, true); // a change of solidity should always relink the edict. someone messed up.

View File

@ -945,7 +945,7 @@ void SV_Soundlist_f (void)
MSG_WriteByte (&host_client->netchan.message, 0);
// next msg
MSG_WriteByte (&host_client->netchan.message, n);
MSG_WriteByte (&host_client->netchan.message, n & 0xff);
}
/*
@ -1079,7 +1079,7 @@ void SV_Modellist_f (void)
MSG_WriteByte (&host_client->netchan.message, 0);
// next msg
MSG_WriteByte (&host_client->netchan.message, n);
MSG_WriteByte (&host_client->netchan.message, n & 0xff);
}
/*
@ -1706,6 +1706,8 @@ void SV_Begin_f (void)
if (host_client->istobeloaded)
sendangles = true;
if (host_client->protocol == SCP_QUAKE2)
sendangles = false;
for (split = host_client; split; split = split->controlled)
@ -5026,7 +5028,7 @@ void AddLinksToPmove ( edict_t *player, areanode_t *node )
pl = EDICT_TO_PROG(svprogfuncs, player);
// touch linked edicts
for (l = node->solid_edicts.next ; l != &node->solid_edicts ; l = next)
for (l = node->edicts.next ; l != &node->edicts ; l = next)
{
next = l->next;
check = (edict_t*)EDICT_FROM_AREA(l);
@ -5076,7 +5078,7 @@ void AddLinksToPmove ( edict_t *player, areanode_t *node )
}
}
if (player->v->mins[2] != 24) //crouching/dead
for (l = node->trigger_edicts.next ; l != &node->trigger_edicts ; l = next)
for (l = node->edicts.next ; l != &node->edicts ; l = next)
{
next = l->next;
check = (edict_t*)EDICT_FROM_AREA(l);

View File

@ -1227,7 +1227,8 @@ Mod_LoadClipnodes
*/
qboolean Mod_LoadClipnodes (lump_t *l)
{
dclipnode_t *in, *out;
dclipnode_t *in;
mclipnode_t *out;
int i, count;
hull_t *hull;
@ -1346,7 +1347,7 @@ Deplicate the drawing hull structure as a clipping hull
void Mod_MakeHull0 (void)
{
mnode_t *in, *child;
dclipnode_t *out;
mclipnode_t *out;
int i, j, count;
hull_t *hull;

View File

@ -8,17 +8,10 @@ float RadiusFromBounds (vec3_t mins, vec3_t maxs);
#define USEBOTLIB
//#define BOTLIB_STATIC
#ifdef USEBOTLIB
#ifdef _WIN32
#define QDECL __cdecl
#else
#define QDECL
#endif
#define fileHandle_t int
#define fsMode_t int
#define pc_token_t void
@ -342,7 +335,7 @@ static void Q3G_LinkEntity(q3sharedEntity_t *ent)
break; // crosses the node
}
// link it in
InsertLinkBefore((link_t *)&sent->area, &node->solid_edicts);
InsertLinkBefore((link_t *)&sent->area, &node->edicts);
}
static int SVQ3_EntitiesInBoxNode(areanode_t *node, vec3_t mins, vec3_t maxs, int *list, int maxcount)
@ -354,7 +347,7 @@ static int SVQ3_EntitiesInBoxNode(areanode_t *node, vec3_t mins, vec3_t maxs, in
int linkcount = 0;
//work out who they are first.
for (l = node->solid_edicts.next ; l != &node->solid_edicts ; l = next)
for (l = node->edicts.next ; l != &node->edicts ; l = next)
{
if (maxcount == linkcount)
return linkcount;
@ -388,6 +381,7 @@ static int SVQ3_EntitiesInBox(vec3_t mins, vec3_t maxs, int *list, int maxcount)
return SVQ3_EntitiesInBoxNode(sv.world.areanodes, mins, maxs, list, maxcount);
}
#define ENTITYNUM_NONE (MAX_GENTITIES-1)
#define ENTITYNUM_WORLD (MAX_GENTITIES-2)
static void SVQ3_Trace(q3trace_t *result, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int entnum, int contentmask)
{
@ -408,7 +402,7 @@ static void SVQ3_Trace(q3trace_t *result, vec3_t start, vec3_t mins, vec3_t maxs
result->allsolid = tr.allsolid;
result->contents = tr.contents;
VectorCopy(tr.endpos, result->endpos);
result->entityNum = ENTITYNUM_WORLD;
result->entityNum = (tr.fraction==1.0)?ENTITYNUM_NONE:ENTITYNUM_WORLD;
result->fraction = tr.fraction;
result->plane = tr.plane;
result->startsolid = tr.startsolid;
@ -436,7 +430,7 @@ static void SVQ3_Trace(q3trace_t *result, vec3_t start, vec3_t mins, vec3_t maxs
else if ( entnum != ENTITYNUM_WORLD )
{
ourowner = GENTITY_FOR_NUM(entnum)->r.ownerNum;
if (ourowner == ENTITYNUM_WORLD)
if (ourowner == ENTITYNUM_NONE)
ourowner = -1;
}
else
@ -2715,7 +2709,7 @@ static qboolean SVQ3_Netchan_Process(client_t *client)
net_message.packing = SZ_RAWBYTES;
// calculate bitmask
bitmask = serverid ^ lastSequence ^ client->challenge;
bitmask = (serverid ^ lastSequence ^ client->challenge) & 0xff;
string = client->server_commands[lastServerCommandNum & TEXTCMD_MASK];
#ifndef Q3_NOENCRYPT
@ -2748,7 +2742,7 @@ void SVQ3_Netchan_Transmit(client_t *client, int length, qbyte *data)
char *string;
// calculate bitmask
bitmask = client->netchan.outgoing_sequence ^ client->challenge;
bitmask = (client->netchan.outgoing_sequence ^ client->challenge) & 0xff;
string = client->last_client_command;
#ifndef Q3_NOENCRYPT
@ -3210,6 +3204,7 @@ int SVQ3_AddBot(void)
cl->challenge = 0;
cl->userid = (cl - svs.clients)+1;
cl->state = cs_spawned;
memset(&cl->netchan.remote_address, 0, sizeof(cl->netchan.remote_address));
return cl - svs.clients;
}

View File

@ -58,7 +58,7 @@ HULL BOXES
static hull_t box_hull;
static dclipnode_t box_clipnodes[6];
static mclipnode_t box_clipnodes[6];
static mplane_t box_planes[6];
/*
@ -141,8 +141,7 @@ static areanode_t *World_CreateAreaNode (world_t *w, int depth, vec3_t mins, vec
anode = &w->areanodes[w->numareanodes];
w->numareanodes++;
ClearLink (&anode->trigger_edicts);
ClearLink (&anode->solid_edicts);
ClearLink (&anode->edicts);
if (depth == AREA_DEPTH)
{
@ -225,7 +224,7 @@ void World_TouchLinks (world_t *w, wedict_t *ent, areanode_t *node)
int linkcount = 0, ln;
//work out who they are first.
for (l = node->trigger_edicts.next ; l != &node->trigger_edicts ; l = next)
for (l = node->edicts.next ; l != &node->edicts ; l = next)
{
if (linkcount == MAX_NODELINKS)
break;
@ -495,10 +494,7 @@ void World_LinkEdict (world_t *w, wedict_t *ent, qboolean touch_triggers)
// link it in
if (ent->v->solid == SOLID_TRIGGER || ent->v->solid == SOLID_LADDER)
InsertLinkBefore (&ent->area, &node->trigger_edicts);
else
InsertLinkBefore (&ent->area, &node->solid_edicts);
InsertLinkBefore (&ent->area, &node->edicts);
// if touch_triggers, touch all entities at this node and decend for more
if (touch_triggers)
@ -685,11 +681,7 @@ void VARGS WorldQ2_LinkEdict(world_t *w, q2edict_t *ent)
}
// link it in
if (ent->solid == Q2SOLID_TRIGGER)
InsertLinkBefore (&ent->area, &node->trigger_edicts);
else
InsertLinkBefore (&ent->area, &node->solid_edicts);
InsertLinkBefore (&ent->area, &node->edicts);
}
void WorldQ2_Q1BSP_LinkEdict(world_t *w, q2edict_t *ent)
@ -862,11 +854,8 @@ void WorldQ2_Q1BSP_LinkEdict(world_t *w, q2edict_t *ent)
break; // crosses the node
}
// link it in
if (ent->solid == Q2SOLID_TRIGGER)
InsertLinkBefore (&ent->area, &node->trigger_edicts);
else
InsertLinkBefore (&ent->area, &node->solid_edicts);
// link it in
InsertLinkBefore (&ent->area, &node->edicts);
}
#endif
@ -1127,6 +1116,7 @@ q2edict_t **area_q2list;
int area_count, area_maxcount;
int area_type;
#define AREA_SOLID 1
#define AREA_TRIGGER 2
static void World_AreaEdicts_r (areanode_t *node)
{
link_t *l, *next, *start;
@ -1136,10 +1126,7 @@ static void World_AreaEdicts_r (areanode_t *node)
count = 0;
// touch linked edicts
if (area_type == AREA_SOLID)
start = &node->solid_edicts;
else
start = &node->trigger_edicts;
start = &node->edicts;
for (l=start->next ; l != start ; l = next)
{
@ -1148,6 +1135,11 @@ static void World_AreaEdicts_r (areanode_t *node)
if (check->v->solid == SOLID_NOT)
continue; // deactivated
/*q2 still has solid/trigger lists, emulate that here*/
if ((check->v->solid == SOLID_TRIGGER) != (area_type == AREA_TRIGGER))
continue;
if (check->v->absmin[0] > area_maxs[0]
|| check->v->absmin[1] > area_maxs[1]
|| check->v->absmin[2] > area_maxs[2]
@ -1206,10 +1198,7 @@ static void WorldQ2_AreaEdicts_r (areanode_t *node)
count = 0;
// touch linked edicts
if (area_type == AREA_SOLID)
start = &node->solid_edicts;
else
start = &node->trigger_edicts;
start = &node->edicts;
for (l=start->next ; l != start ; l = next)
{
@ -1228,6 +1217,11 @@ static void WorldQ2_AreaEdicts_r (areanode_t *node)
if (check->solid == Q2SOLID_NOT)
continue; // deactivated
/*q2 still has solid/trigger lists, emulate that here*/
if ((check->solid == Q2SOLID_TRIGGER) != (area_type == AREA_TRIGGER))
continue;
if (check->absmin[0] > area_maxs[0]
|| check->absmin[1] > area_maxs[1]
|| check->absmin[2] > area_maxs[2]
@ -1470,73 +1464,8 @@ static void World_ClipToLinks (world_t *w, areanode_t *node, moveclip_t *clip)
wedict_t *touch;
trace_t trace;
if (clip->type & MOVE_TRIGGERS)
{
for (l = node->trigger_edicts.next ; l != &node->trigger_edicts ; l = next)
{
next = l->next;
touch = EDICT_FROM_AREA(l);
if (!((int)touch->v->flags & FL_FINDABLE_NONSOLID))
continue;
if (touch->v->solid != SOLID_TRIGGER)
continue;
if (touch == clip->passedict)
continue;
if (clip->type & MOVE_NOMONSTERS && touch->v->solid != SOLID_BSP)
continue;
if (clip->passedict)
{
/* These can never happen, touch is a SOLID_TRIGGER
// don't clip corpse against character
if (clip->passedict->v->solid == SOLID_CORPSE && (touch->v->solid == SOLID_SLIDEBOX || touch->v->solid == SOLID_CORPSE))
continue;
// don't clip character against corpse
if (clip->passedict->v->solid == SOLID_SLIDEBOX && touch->v->solid == SOLID_CORPSE)
continue;
*/
if (!((int)clip->passedict->xv->dimension_hit & (int)touch->xv->dimension_solid))
continue;
}
if (clip->boxmins[0] > touch->v->absmax[0]
|| clip->boxmins[1] > touch->v->absmax[1]
|| clip->boxmins[2] > touch->v->absmax[2]
|| clip->boxmaxs[0] < touch->v->absmin[0]
|| clip->boxmaxs[1] < touch->v->absmin[1]
|| clip->boxmaxs[2] < touch->v->absmin[2] )
continue;
if (clip->passedict && clip->passedict->v->size[0] && !touch->v->size[0])
continue; // points never interact
// might intersect, so do an exact clip
if (clip->trace.allsolid)
return;
if (clip->passedict)
{
if ((wedict_t*)PROG_TO_EDICT(w->progs, touch->v->owner) == clip->passedict)
continue; // don't clip against own missiles
if ((wedict_t*)PROG_TO_EDICT(w->progs, clip->passedict->v->owner) == touch)
continue; // don't clip against owner
}
if ((int)touch->v->flags & FL_MONSTER)
trace = World_ClipMoveToEntity (w, touch, touch->v->origin, clip->start, clip->mins2, clip->maxs2, clip->end, clip->hullnum, clip->type & MOVE_HITMODEL);
else
trace = World_ClipMoveToEntity (w, touch, touch->v->origin, clip->start, clip->mins, clip->maxs, clip->end, clip->hullnum, clip->type & MOVE_HITMODEL);
if (trace.allsolid || trace.startsolid ||
trace.fraction < clip->trace.fraction)
{
trace.ent = touch;
clip->trace = trace;
}
}
}
// touch linked edicts
for (l = node->solid_edicts.next ; l != &node->solid_edicts ; l = next)
for (l = node->edicts.next ; l != &node->edicts ; l = next)
{
next = l->next;
touch = EDICT_FROM_AREA(l);
@ -1544,10 +1473,14 @@ static void World_ClipToLinks (world_t *w, areanode_t *node, moveclip_t *clip)
continue;
if (touch == clip->passedict)
continue;
/*if its a trigger, we only clip against it if the flags are aligned*/
if (touch->v->solid == SOLID_TRIGGER || touch->v->solid == SOLID_LADDER)
{
Con_Printf ("Trigger (%s) in clipping list\n", PR_GetString(w->progs, touch->v->classname));
continue;
if (!(clip->type & MOVE_TRIGGERS))
continue;
if (!((int)touch->v->flags & FL_FINDABLE_NONSOLID))
continue;
}
if (clip->type & MOVE_LAGGED)
@ -1627,7 +1560,7 @@ static void WorldQ2_ClipToLinks (world_t *w, areanode_t *node, moveclip_t *clip)
trace_t trace;
// touch linked edicts
for (l = node->solid_edicts.next ; l != &node->solid_edicts ; l = next)
for (l = node->edicts.next ; l != &node->edicts ; l = next)
{
next = l->next;
touch = Q2EDICT_FROM_AREA(l);