1
0
Fork 0
forked from fte/fteqw

some bugfixes

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@867 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2005-02-06 02:47:36 +00:00
parent d29d5e71e6
commit 95eafd7427
30 changed files with 673 additions and 382 deletions

View file

@ -509,23 +509,21 @@ sw-rel:
sw-dbg: sw-dbg:
$(MAKE) sw-tmp TYPE=_clsv-dbg OUT_DIR="$(DEBUG_DIR)/$(SWB_DIR)" $(MAKE) sw-tmp TYPE=_clsv-dbg OUT_DIR="$(DEBUG_DIR)/$(SWB_DIR)"
mcl-tmp: mcl-tmp:
$(MAKE) $(TYPE) OUT_DIR="$(OUT_DIR)" EXE_NAME="$(MCL_EXE_NAME)" WCFLAGS="$(M_CFLAGS)" LDFLAGS="$(M_LDFLAGS)" SOBJS="$(MCL_OBJS)" $(MAKE) $(TYPE) OUT_DIR="$(OUT_DIR)" EXE_NAME="$(MCL_EXE_NAME)" WCFLAGS="$(M_CFLAGS)" LDFLAGS="$(M_LDFLAGS)" SOBJS="$(MCL_OBJS)"
m-tmp:
$(MAKE) $(TYPE) OUT_DIR="$(OUT_DIR)" EXE_NAME="$(M_EXE_NAME)" WCFLAGS="$(M_CFLAGS)" LDFLAGS="$(M_LDFLAGS)" SOBJS="$(MCL_OBJS)"
mcl-rel: mcl-rel:
$(MAKE) mcl-tmp TYPE=_cl-rel OUT_DIR="$(RELEASE_DIR)/$(MCL_DIR)" $(MAKE) mcl-tmp TYPE=_cl-rel OUT_DIR="$(RELEASE_DIR)/$(MCL_DIR)"
mcl-dbg: mcl-dbg:
$(MAKE) mcl-tmp TYPE=_cl-dbg OUT_DIR="$(DEBUG_DIR)/$(MCL_DIR)" $(MAKE) mcl-tmp TYPE=_cl-dbg OUT_DIR="$(DEBUG_DIR)/$(MCL_DIR)"
m-tmp:
$(MAKE) $(TYPE) OUT_DIR="$(OUT_DIR)" EXE_NAME="$(M_EXE_NAME)" WCFLAGS="$(M_CFLAGS)" LDFLAGS="$(M_LDFLAGS)" SOBJS="$(MCL_OBJS)"
m-rel: m-rel:
$(MAKE) m-tmp TYPE=_clsv-rel OUT_DIR="$(RELEASE_DIR)/$(MCL_DIR)" $(MAKE) m-tmp TYPE=_clsv-rel OUT_DIR="$(RELEASE_DIR)/$(MCL_DIR)"
m-dbg: m-dbg:
$(MAKE) m-tmp TYPE=_clsv-dbg OUT_DIR="$(DEBUG_DIR)/$(MCL_DIR)" $(MAKE) m-tmp TYPE=_clsv-dbg OUT_DIR="$(DEBUG_DIR)/$(MCL_DIR)"
.PHONY: m-tmp mcl-tmp sw-tmp swcl-tmp mingl-tmp glcl-tmp gl-tmp sv-tmp _clsv-dbg _clsv-rel _cl-dbg _cl-rel _out-rel _out-dbg
ifdef windir ifdef windir
debugdir: debugdir:

View file

@ -667,7 +667,6 @@ void CL_Record_f (void)
} }
else else
{ //automagically generate a name { //automagically generate a name
if (cl.spectator) if (cl.spectator)
{ // FIXME: if tracking a player, use his name { // FIXME: if tracking a player, use his name
fname = va ("spec_%s_%s", fname = va ("spec_%s_%s",

View file

@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details. See the GNU General Public License for more details.
@ -72,7 +72,7 @@ qboolean CL_FilterModelindex(int modelindex, int frame)
} }
if (cl_gibfilter.value && ( if (cl_gibfilter.value && (
modelindex == cl_h_playerindex || modelindex == cl_h_playerindex ||
modelindex == cl_gib1index || modelindex == cl_gib1index ||
modelindex == cl_gib2index || modelindex == cl_gib2index ||
modelindex == cl_gib3index)) modelindex == cl_gib3index))
@ -204,28 +204,28 @@ void CL_DecayLights (void)
dl->radius = 0; dl->radius = 0;
continue; continue;
} }
dl->radius -= host_frametime*dl->decay; dl->radius -= host_frametime*dl->decay;
if (dl->radius < 0) if (dl->radius < 0)
dl->radius = 0; dl->radius = 0;
if (dl->channelfade[0]) if (dl->channelfade[0])
{ {
dl->color[0] -= host_frametime*dl->channelfade[0]; dl->color[0] -= host_frametime*dl->channelfade[0];
if (dl->color[0] < 0) if (dl->color[0] < 0)
dl->color[0] = 0; dl->color[0] = 0;
} }
if (dl->channelfade[1]) if (dl->channelfade[1])
{ {
dl->color[1] -= host_frametime*dl->channelfade[1]; dl->color[1] -= host_frametime*dl->channelfade[1];
if (dl->color[1] < 0) if (dl->color[1] < 0)
dl->color[1] = 0; dl->color[1] = 0;
} }
if (dl->channelfade[2]) if (dl->channelfade[2])
{ {
dl->color[2] -= host_frametime*dl->channelfade[2]; dl->color[2] -= host_frametime*dl->channelfade[2];
if (dl->color[2] < 0) if (dl->color[2] < 0)
dl->color[2] = 0; dl->color[2] = 0;
} }
@ -305,19 +305,19 @@ void CL_ParseDelta (entity_state_t *from, entity_state_t *to, int bits, qboolean
if (bits & U_ORIGIN1) if (bits & U_ORIGIN1)
to->origin[0] = MSG_ReadCoord (); to->origin[0] = MSG_ReadCoord ();
if (bits & U_ANGLE1) if (bits & U_ANGLE1)
to->angles[0] = MSG_ReadAngle (); to->angles[0] = MSG_ReadAngle ();
if (bits & U_ORIGIN2) if (bits & U_ORIGIN2)
to->origin[1] = MSG_ReadCoord (); to->origin[1] = MSG_ReadCoord ();
if (bits & U_ANGLE2) if (bits & U_ANGLE2)
to->angles[1] = MSG_ReadAngle (); to->angles[1] = MSG_ReadAngle ();
if (bits & U_ORIGIN3) if (bits & U_ORIGIN3)
to->origin[2] = MSG_ReadCoord (); to->origin[2] = MSG_ReadCoord ();
if (bits & U_ANGLE3) if (bits & U_ANGLE3)
to->angles[2] = MSG_ReadAngle (); to->angles[2] = MSG_ReadAngle ();
@ -541,7 +541,7 @@ void CL_ParsePacketEntities (qboolean delta)
newnum += 512; newnum += 512;
if (excessive & U_ENTITYDBL2) if (excessive & U_ENTITYDBL2)
newnum += 1024; newnum += 1024;
} }
msg_readcount = oldpos;//undo the read... msg_readcount = oldpos;//undo the read...
} }
@ -677,7 +677,7 @@ entity_state_t *CL_FindOldPacketEntity(int num)
// byte = bound(0, s->scale * 16, 255) // byte = bound(0, s->scale * 16, 255)
#define E5_SCALE (1<<10) #define E5_SCALE (1<<10)
// flag // flag
#define E5_ORIGIN32 (1<<11) #define E5_ORIGIN32 (1<<11)
// flag // flag
#define E5_ANGLES16 (1<<12) #define E5_ANGLES16 (1<<12)
// flag // flag
@ -766,9 +766,9 @@ void DP5_ParseDelta(entity_state_t *s)
{ {
if (bits & E5_ANGLES16) if (bits & E5_ANGLES16)
{ {
s->angles[0] = MSG_ReadAngle16(); s->angles[0] = MSG_ReadAngle16();
s->angles[1] = MSG_ReadAngle16(); s->angles[1] = MSG_ReadAngle16();
s->angles[2] = MSG_ReadAngle16(); s->angles[2] = MSG_ReadAngle16();
} }
else else
{ {
@ -848,7 +848,7 @@ void CLNQ_ParseDarkPlaces5Entities(void) //the things I do.. :o(
packet_entities_t *pack, *oldpack; packet_entities_t *pack, *oldpack;
entity_state_t *to, *from; entity_state_t *to, *from;
unsigned short read; unsigned short read;
int oldi; int oldi;
qboolean remove; qboolean remove;
@ -967,7 +967,7 @@ void CLNQ_ParseEntity(unsigned int bits)
{ {
int i; int i;
int num, pnum; int num, pnum;
entity_state_t *state, *from; entity_state_t *state, *from;
entity_state_t *base; entity_state_t *base;
static float lasttime; static float lasttime;
packet_entities_t *pack; packet_entities_t *pack;
@ -990,7 +990,7 @@ void CLNQ_ParseEntity(unsigned int bits)
#define NQU_EFFECTS (1<<13) #define NQU_EFFECTS (1<<13)
#define NQU_LONGENTITY (1<<14) #define NQU_LONGENTITY (1<<14)
// LordHavoc's: protocol extension // LordHavoc's: protocol extension
#define DPU_EXTEND1 (1<<15) #define DPU_EXTEND1 (1<<15)
// LordHavoc: first extend byte // LordHavoc: first extend byte
@ -1018,8 +1018,8 @@ void CLNQ_ParseEntity(unsigned int bits)
{ // first update is the final signon stage { // first update is the final signon stage
cls.signon = 4; cls.signon = 4;
CLNQ_SignonReply (); CLNQ_SignonReply ();
} }
pack = &cl.frames[cls.netchan.incoming_sequence&UPDATE_MASK].packet_entities; pack = &cl.frames[cls.netchan.incoming_sequence&UPDATE_MASK].packet_entities;
if (bits & NQU_MOREBITS) if (bits & NQU_MOREBITS)
@ -1038,7 +1038,7 @@ void CLNQ_ParseEntity(unsigned int bits)
bits |= (i<<24); bits |= (i<<24);
} }
if (bits & NQU_LONGENTITY) if (bits & NQU_LONGENTITY)
num = MSG_ReadShort (); num = MSG_ReadShort ();
else else
num = MSG_ReadByte (); num = MSG_ReadByte ();
@ -1064,7 +1064,7 @@ void CLNQ_ParseEntity(unsigned int bits)
state->number = num; state->number = num;
if (bits & NQU_MODEL) if (bits & NQU_MODEL)
state->modelindex = MSG_ReadByte (); state->modelindex = MSG_ReadByte ();
else else
state->modelindex = base->modelindex; state->modelindex = base->modelindex;
@ -1186,7 +1186,7 @@ entity_state_t *CL_FindPacketEntity(int num)
} }
#endif #endif
void CL_RotateAroundTag(entity_t *ent, int num, int tagent) void CL_RotateAroundTag(entity_t *ent, int num, int tagent, int tagnum)
{ {
entity_state_t *ps; entity_state_t *ps;
float *org=NULL, *ang=NULL; float *org=NULL, *ang=NULL;
@ -1199,6 +1199,11 @@ void CL_RotateAroundTag(entity_t *ent, int num, int tagent)
float *tagorg=NULL; float *tagorg=NULL;
float *tagaxis; float *tagaxis;
// ent->keynum = tagent;
if (cl.lerpents[tagent].tagent)
CL_RotateAroundTag(ent, num, cl.lerpents[tagent].tagent, cl.lerpents[tagent].tagindex);
ps = CL_FindPacketEntity(tagent); ps = CL_FindPacketEntity(tagent);
if (ps) if (ps)
{ {
@ -1210,6 +1215,7 @@ void CL_RotateAroundTag(entity_t *ent, int num, int tagent)
else else
{ {
extern int parsecountmod; extern int parsecountmod;
// Con_Printf("tagent %i\n", tagent);
if (tagent <= MAX_CLIENTS && tagent > 0) if (tagent <= MAX_CLIENTS && tagent > 0)
{ {
if (tagent-1 == cl.playernum[0]) if (tagent-1 == cl.playernum[0])
@ -1233,27 +1239,22 @@ void CL_RotateAroundTag(entity_t *ent, int num, int tagent)
VectorInverse(axis[1]); VectorInverse(axis[1]);
if (Mod_GetTag) if (Mod_GetTag)
Mod_GetTag(cl.model_precache[model], cl.lerpents[tagent].tagindex, frame, &tagorg, &tagaxis); Mod_GetTag(cl.model_precache[model], tagnum, frame, &tagorg, &tagaxis);
else else
tagaxis = NULL; tagaxis = NULL;
if (tagaxis) if (tagaxis)
{ {
Matrix3_Multiply(ent->axis, (void*)tagaxis, temp); // Con_Printf("Found tag %i\n", cl.lerpents[tagent].tagindex);
R_ConcatRotations(ent->axis, (void*)tagaxis, temp);
} }
else //hrm. else //hrm.
{
memcpy(temp, ent->axis, sizeof(temp)); memcpy(temp, ent->axis, sizeof(temp));
Matrix3_Multiply(axis, temp, ent->axis); }
R_ConcatRotations(axis, temp, ent->axis);
} }
if (org) if (org)
VectorAdd(ent->origin, org, ent->origin); VectorAdd(ent->origin, org, ent->origin);
if (tagorg)
VectorAdd(ent->origin, tagorg, ent->origin);
ent->keynum = tagent;
if (cl.lerpents[tagent].tagent)
CL_RotateAroundTag(ent, num, cl.lerpents[tagent].tagent);
} }
/* /*
=============== ===============
@ -1336,7 +1337,7 @@ void CL_LinkPacketEntities (void)
ent->flags = 0; ent->flags = 0;
// set colormap // set colormap
if (s1->colormap && (s1->colormap <= MAX_CLIENTS) if (s1->colormap && (s1->colormap <= MAX_CLIENTS)
&& (gl_nocolors.value == -1 || (ent->model/* && s1->modelindex == cl_playerindex*/))) && (gl_nocolors.value == -1 || (ent->model/* && s1->modelindex == cl_playerindex*/)))
{ {
ent->colormap = cl.players[s1->colormap-1].translations; ent->colormap = cl.players[s1->colormap-1].translations;
@ -1366,7 +1367,7 @@ void CL_LinkPacketEntities (void)
{ {
ent->lerptime = 1-(cl.time-cl.lerpents[s1->number].lerptime)/cl.lerpents[s1->number].lerprate; ent->lerptime = 1-(cl.time-cl.lerpents[s1->number].lerptime)/cl.lerpents[s1->number].lerprate;
} }
if (ent->lerptime<0)ent->lerptime=0; if (ent->lerptime<0)ent->lerptime=0;
if (ent->lerptime>1)ent->lerptime=1; if (ent->lerptime>1)ent->lerptime=1;
@ -1393,7 +1394,7 @@ void CL_LinkPacketEntities (void)
// calculate origin // calculate origin
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
ent->origin[i] = s1->origin[i] + ent->origin[i] = s1->origin[i] +
f * (cl.lerpents[s1->number].origin[i] - s1->origin[i]); f * (cl.lerpents[s1->number].origin[i] - s1->origin[i]);
// rotate binary objects locally // rotate binary objects locally
@ -1430,7 +1431,7 @@ void CL_LinkPacketEntities (void)
if (cl.lerpents[s1->number].tagent) if (cl.lerpents[s1->number].tagent)
{ //ent is attached to a tag, rotate this ent accordingly. { //ent is attached to a tag, rotate this ent accordingly.
CL_RotateAroundTag(ent, s1->number, cl.lerpents[s1->number].tagent); CL_RotateAroundTag(ent, s1->number, cl.lerpents[s1->number].tagent, cl.lerpents[s1->number].tagindex);
} }
// add automatic particle trails // add automatic particle trails
@ -1962,14 +1963,14 @@ void CL_AddFlagModels (entity_t *ent, int team)
f = 14; f = 14;
if (ent->frame >= 29 && ent->frame <= 40) { if (ent->frame >= 29 && ent->frame <= 40) {
if (ent->frame >= 29 && ent->frame <= 34) { //axpain if (ent->frame >= 29 && ent->frame <= 34) { //axpain
if (ent->frame == 29) f = f + 2; if (ent->frame == 29) f = f + 2;
else if (ent->frame == 30) f = f + 8; else if (ent->frame == 30) f = f + 8;
else if (ent->frame == 31) f = f + 12; else if (ent->frame == 31) f = f + 12;
else if (ent->frame == 32) f = f + 11; else if (ent->frame == 32) f = f + 11;
else if (ent->frame == 33) f = f + 10; else if (ent->frame == 33) f = f + 10;
else if (ent->frame == 34) f = f + 4; else if (ent->frame == 34) f = f + 4;
} else if (ent->frame >= 35 && ent->frame <= 40) { // pain } else if (ent->frame >= 35 && ent->frame <= 40) { // pain
if (ent->frame == 35) f = f + 2; if (ent->frame == 35) f = f + 2;
else if (ent->frame == 36) f = f + 10; else if (ent->frame == 36) f = f + 10;
else if (ent->frame == 37) f = f + 10; else if (ent->frame == 37) f = f + 10;
else if (ent->frame == 38) f = f + 8; else if (ent->frame == 38) f = f + 8;
@ -1978,7 +1979,7 @@ void CL_AddFlagModels (entity_t *ent, int team)
} }
} else if (ent->frame >= 103 && ent->frame <= 118) { } else if (ent->frame >= 103 && ent->frame <= 118) {
if (ent->frame >= 103 && ent->frame <= 104) f = f + 6; //nailattack if (ent->frame >= 103 && ent->frame <= 104) f = f + 6; //nailattack
else if (ent->frame >= 105 && ent->frame <= 106) f = f + 6; //light else if (ent->frame >= 105 && ent->frame <= 106) f = f + 6; //light
else if (ent->frame >= 107 && ent->frame <= 112) f = f + 7; //rocketattack else if (ent->frame >= 107 && ent->frame <= 112) f = f + 7; //rocketattack
else if (ent->frame >= 112 && ent->frame <= 118) f = f + 7; //shotattack else if (ent->frame >= 112 && ent->frame <= 118) f = f + 7; //shotattack
} }
@ -2057,7 +2058,7 @@ void CL_LinkPlayers (void)
frame = &cl.frames[cl.parsecount&UPDATE_MASK]; frame = &cl.frames[cl.parsecount&UPDATE_MASK];
for (j=0, info=cl.players, state=frame->playerstate ; j < MAX_CLIENTS for (j=0, info=cl.players, state=frame->playerstate ; j < MAX_CLIENTS
; j++, info++, state++) ; j++, info++, state++)
{ {
if (state->messagenum != cl.parsecount) if (state->messagenum != cl.parsecount)
@ -2096,7 +2097,7 @@ void CL_LinkPlayers (void)
ent->flags = 0; ent->flags = 0;
ent->model = cl.model_precache[state->modelindex]; ent->model = cl.model_precache[state->modelindex];
ent->skinnum = state->skinnum; ent->skinnum = state->skinnum;
ent->frame = state->frame; ent->frame = state->frame;
ent->oldframe = state->oldframe; ent->oldframe = state->oldframe;
@ -2230,7 +2231,7 @@ void CL_SetSolidEntities (void)
if (!cl.model_precache[state->modelindex]) if (!cl.model_precache[state->modelindex])
continue; continue;
if (*cl.model_precache[state->modelindex]->name == '*' || cl.model_precache[state->modelindex]->numsubmodels) if (*cl.model_precache[state->modelindex]->name == '*' || cl.model_precache[state->modelindex]->numsubmodels)
if ( cl.model_precache[state->modelindex]->hulls[1].firstclipnode if ( cl.model_precache[state->modelindex]->hulls[1].firstclipnode
|| cl.model_precache[state->modelindex]->clipbox ) || cl.model_precache[state->modelindex]->clipbox )
{ {
pmove.physents[pmove.numphysent].model = cl.model_precache[state->modelindex]; pmove.physents[pmove.numphysent].model = cl.model_precache[state->modelindex];
@ -2274,7 +2275,7 @@ void CL_SetUpPlayerPrediction(qboolean dopred)
frame = &cl.frames[cl.parsecount&UPDATE_MASK]; frame = &cl.frames[cl.parsecount&UPDATE_MASK];
for (j=0, pplayer = predicted_players, state=frame->playerstate; for (j=0, pplayer = predicted_players, state=frame->playerstate;
j < MAX_CLIENTS; j < MAX_CLIENTS;
j++, pplayer++, state++) j++, pplayer++, state++)
{ {
@ -2336,7 +2337,7 @@ void CL_SetUpPlayerPrediction(qboolean dopred)
{ {
if (!Cam_DrawPlayer(0, j)) if (!Cam_DrawPlayer(0, j))
VectorCopy(pplayer->origin, cl.simorg[0]); VectorCopy(pplayer->origin, cl.simorg[0]);
} }
} }
} }
@ -2458,7 +2459,7 @@ void MVD_Interpolate(void)
VectorCopy(oldself->velocity, self->velocity); VectorCopy(oldself->velocity, self->velocity);
VectorCopy(oldself->viewangles, self->viewangles); VectorCopy(oldself->viewangles, self->viewangles);
cls.netchan.outgoing_sequence = cl.parsecount+1; cls.netchan.outgoing_sequence = cl.parsecount+1;
} }

View file

@ -616,6 +616,9 @@ void CL_UpdatePrydonCursor(float cursor_screen[2], vec3_t cursor_start, vec3_t c
ML_ModelViewMatrix(modelview, cl.viewangles[0], cl.simorg[0]); ML_ModelViewMatrix(modelview, cl.viewangles[0], cl.simorg[0]);
Matrix4_Transform3(modelview, temp, cursor_end); Matrix4_Transform3(modelview, temp, cursor_end);
CL_SetSolidEntities();
//don't bother with players, they don't exist in NQ...
tr = PM_PlayerTrace(cursor_start, cursor_end); tr = PM_PlayerTrace(cursor_start, cursor_end);
VectorCopy(tr.endpos, cursor_impact); VectorCopy(tr.endpos, cursor_impact);
// CL_SelectTraceLine(cursor_start, cursor_end, cursor_impact, entnum); // CL_SelectTraceLine(cursor_start, cursor_end, cursor_impact, entnum);

View file

@ -2820,6 +2820,7 @@ Host_Init
*/ */
void Host_Init (quakeparms_t *parms) void Host_Init (quakeparms_t *parms)
{ {
int i;
int qrc, hrc, def; int qrc, hrc, def;
extern cvar_t vid_renderer; extern cvar_t vid_renderer;
@ -2907,9 +2908,10 @@ void Host_Init (quakeparms_t *parms)
Cbuf_AddText ("+mlook\n", RESTRICT_LOCAL); //fixme: this is bulky, only exec one of these. Cbuf_AddText ("+mlook\n", RESTRICT_LOCAL); //fixme: this is bulky, only exec one of these.
qrc = COM_FDepthFile("quake.rc", true); //who should we imitate?
hrc = COM_FDepthFile("hexen.rc", true); qrc = COM_FDepthFile("quake.rc", true); //q1
def = COM_FDepthFile("default.cfg", true); hrc = COM_FDepthFile("hexen.rc", true); //h2
def = COM_FDepthFile("default.cfg", true); //q2/q3
if (qrc >= def && qrc >= hrc && qrc!=0x7fffffff) if (qrc >= def && qrc >= hrc && qrc!=0x7fffffff)
Cbuf_AddText ("exec quake.rc\n", RESTRICT_LOCAL); Cbuf_AddText ("exec quake.rc\n", RESTRICT_LOCAL);
@ -2935,15 +2937,34 @@ void Host_Init (quakeparms_t *parms)
Cbuf_Execute (); //if the server initialisation causes a problem, give it a place to abort to Cbuf_Execute (); //if the server initialisation causes a problem, give it a place to abort to
#ifndef NOMEDIA //assuming they didn't use any waits in thier config (fools)
if (!cls.demofile && !cls.state && !media_filmtype) //the configs should be fully loaded.
//so convert the backwards compable commandline parameters in cvar sets.
if (COM_CheckParm ("-window") || COM_CheckParm ("-startwindowed"))
Cvar_Set(Cvar_FindVar("vid_fullscreen"), "0");
if (COM_CheckParm ("-fullscreen"))
Cvar_Set(Cvar_FindVar("vid_fullscreen"), "1");
if ((i = COM_CheckParm ("-width"))) //width on it's own also sets height
{ {
if (COM_FDepthFile("video/idlogo.roq", true) > COM_FDepthFile("video/idlog.cin", true)) Cvar_Set(Cvar_FindVar("vid_width"), com_argv[i+1]);
Media_PlayFilm("video/idlog.cin"); Cvar_SetValue(Cvar_FindVar("vid_height"), (atoi(com_argv[i+1])/3)*4);
else
Media_PlayFilm("video/idlogo.roq");
} }
#endif if ((i = COM_CheckParm ("-height")))
Cvar_Set(Cvar_FindVar("vid_height"), com_argv[i+1]);
if ((i = COM_CheckParm ("-conwidth"))) //width on it's own also sets height
{
Cvar_Set(Cvar_FindVar("vid_conwidth"), com_argv[i+1]);
Cvar_SetValue(Cvar_FindVar("vid_conheight"), (atoi(com_argv[i+1])/3)*4);
}
if ((i = COM_CheckParm ("-conheight")))
Cvar_Set(Cvar_FindVar("vid_conheight"), com_argv[i+1]);
if ((i = COM_CheckParm ("-bpp")))
Cvar_Set(Cvar_FindVar("vid_bpp"), com_argv[i+1]);
if (!qrenderer && *vid_renderer.string) if (!qrenderer && *vid_renderer.string)
{ {
Cmd_ExecuteString("vid_restart\n", RESTRICT_LOCAL); Cmd_ExecuteString("vid_restart\n", RESTRICT_LOCAL);
@ -2956,6 +2977,15 @@ void Host_Init (quakeparms_t *parms)
UI_Init(); UI_Init();
#ifndef NOMEDIA
if (!cls.demofile && !cls.state && !media_filmtype)
{
if (COM_FDepthFile("video/idlogo.roq", true) > COM_FDepthFile("video/idlog.cin", true))
Media_PlayFilm("video/idlog.cin");
else
Media_PlayFilm("video/idlogo.roq");
}
#endif
Con_TPrintf (TL_NL); Con_TPrintf (TL_NL);
#ifdef VERSION3PART #ifdef VERSION3PART

View file

@ -791,6 +791,8 @@ void Model_NextDownload (void)
} }
#endif #endif
Hunk_Check();
cls.downloadtype = dl_model; cls.downloadtype = dl_model;
for ( for (
@ -816,6 +818,8 @@ void Model_NextDownload (void)
if (CL_CheckMD2Skins(s)) if (CL_CheckMD2Skins(s))
return; return;
} }
Hunk_Check();
if (cl.playernum[0] == -1) if (cl.playernum[0] == -1)
{ //q2 cinematic - don't load the models. { //q2 cinematic - don't load the models.
@ -827,9 +831,13 @@ void Model_NextDownload (void)
{ {
if (!cl.model_name[i][0]) if (!cl.model_name[i][0])
break; break;
Hunk_Check();
cl.model_precache[i] = NULL; cl.model_precache[i] = NULL;
cl.model_precache[i] = Mod_ForName (cl.model_name[i], false); cl.model_precache[i] = Mod_ForName (cl.model_name[i], false);
Hunk_Check();
if (!cl.model_precache[i] || (i == 1 && (cl.model_precache[i]->type == mod_dummy || cl.model_precache[i]->needload))) if (!cl.model_precache[i] || (i == 1 && (cl.model_precache[i]->type == mod_dummy || cl.model_precache[i]->needload)))
{ {

View file

@ -126,7 +126,8 @@ typedef struct
} q2player_state_t; } q2player_state_t;
#endif #endif
#define MAX_SCOREBOARDNAME 16 #define MAX_SCOREBOARDNAME 64
#define MAX_DISPLAYEDNAME 16
typedef struct player_info_s typedef struct player_info_s
{ {
int userid; int userid;

View file

@ -612,7 +612,7 @@ void CSQC_Init (void)
CSQC_InitFields(); //let the qclib know the field order that the engine needs. CSQC_InitFields(); //let the qclib know the field order that the engine needs.
if (PR_LoadProgs(csqcprogs, "qwprogs.dat", 0, NULL, 0) < 0) //no per-progs builtins. if (PR_LoadProgs(csqcprogs, "csprogs.dat", 0, NULL, 0) < 0) //no per-progs builtins.
{ {
//failed to load or something //failed to load or something
return; return;
@ -637,7 +637,7 @@ void CSQC_Init (void)
qboolean CSQC_DrawView(void) qboolean CSQC_DrawView(void)
{ {
if (!csqc_draw_function) if (!csqc_draw_function || !csqcprogs)
return false; return false;
PR_ExecuteProgram(csqcprogs, csqc_draw_function); PR_ExecuteProgram(csqcprogs, csqc_draw_function);

View file

@ -256,7 +256,6 @@ void R_StoreEfrags (efrag_t **ppefrag)
entity_t *pent; entity_t *pent;
model_t *clmodel; model_t *clmodel;
efrag_t *pefrag; efrag_t *pefrag;
return;
while ((pefrag = *ppefrag) != NULL) while ((pefrag = *ppefrag) != NULL)
{ {

View file

@ -1381,6 +1381,8 @@ qboolean R_ApplyRenderer (rendererstate_t *newr)
COM_FlushTempoaryPacks(); COM_FlushTempoaryPacks();
S_Shutdown();
if (qrenderer == QR_NONE || qrenderer==-1) if (qrenderer == QR_NONE || qrenderer==-1)
{ {
if (newr->renderer == QR_NONE && qrenderer != -1) if (newr->renderer == QR_NONE && qrenderer != -1)
@ -1684,6 +1686,9 @@ TRACE(("dbg: R_ApplyRenderer: efrags\n"));
"OpenGL renderer initialized\n"); "OpenGL renderer initialized\n");
break; break;
} }
if (!isDedicated)
S_Restart_f();
memcpy(&currentrendererstate, newr, sizeof(currentrendererstate)); memcpy(&currentrendererstate, newr, sizeof(currentrendererstate));
return true; return true;
@ -1713,6 +1718,7 @@ TRACE(("dbg: R_RestartRenderer_f\n"));
newr.fullscreen = vid_fullscreen.value; newr.fullscreen = vid_fullscreen.value;
newr.rate = vid_refreshrate.value; newr.rate = vid_refreshrate.value;
Q_strncpyz(newr.glrenderer, gl_driver.string, sizeof(newr.glrenderer)); Q_strncpyz(newr.glrenderer, gl_driver.string, sizeof(newr.glrenderer));
if (!*vid_renderer.string) if (!*vid_renderer.string)
{ {
//gotta do this after main hunk is saved off. //gotta do this after main hunk is saved off.

View file

@ -175,6 +175,75 @@ void Draw_FunString(int x, int y, char *str)
} }
} }
void Draw_FunStringLen(int x, int y, char *str, int len)
{
int ext = COLOR_WHITE<<8;
int extstack[4];
int extstackdepth = 0;
while(*str)
{
if (*str == '^')
{
str++;
if (*str >= '0' && *str <= '7')
{
ext = (*str++-'0')*256 + (ext&~CON_COLOURMASK); //change colour only.
continue;
}
else if (*str == 'a')
{
str++;
ext = (ext & ~CON_2NDCHARSETTEXT) + (CON_2NDCHARSETTEXT - (ext & CON_2NDCHARSETTEXT));
continue;
}
else if (*str == 'b')
{
str++;
ext = (ext & ~CON_BLINKTEXT) + (CON_BLINKTEXT - (ext & CON_BLINKTEXT));
continue;
}
else if (*str == 's') //store on stack (it's great for names)
{
str++;
if (extstackdepth < sizeof(extstack)/sizeof(extstack[0]))
{
extstack[extstackdepth] = ext;
extstackdepth++;
}
}
else if (*str == 'r') //restore from stack (it's great for names)
{
str++;
if (extstackdepth)
{
extstackdepth--;
ext = extstack[extstackdepth];
}
continue;
}
else if (*str == '^')
{
Draw_ColouredCharacter(x, y, '^' + ext);
str++;
}
else
{
Draw_ColouredCharacter(x, y, '^' + ext);
x += 8;
Draw_ColouredCharacter (x, y, (*str++) + ext);
}
x += 8;
continue;
}
Draw_ColouredCharacter (x, y, (*str++) + ext);
x += 8;
if (--len< 0)
break;
}
}
static qboolean largegame = false; static qboolean largegame = false;
@ -1813,7 +1882,7 @@ void Sbar_DeathmatchOverlay (int start)
int total; int total;
int minutes; int minutes;
int p; int p;
char team[5]; char team[64];
int skip = 10; int skip = 10;
if (largegame) if (largegame)
@ -1884,7 +1953,7 @@ void Sbar_DeathmatchOverlay (int start)
if (p < 0 || p > 999) if (p < 0 || p > 999)
p = 999; p = 999;
sprintf (num, "%4i", p); sprintf (num, "%4i", p);
Draw_String ( x, y, num); Draw_FunString ( x, y, num);
// draw pl // draw pl
p = s->pl; p = s->pl;
@ -1947,7 +2016,7 @@ void Sbar_DeathmatchOverlay (int start)
if (cl.teamplay) if (cl.teamplay)
{ {
Q_strncpyz (team, Info_ValueForKey(s->userinfo, "team"), sizeof(team)); Q_strncpyz (team, Info_ValueForKey(s->userinfo, "team"), sizeof(team));
Draw_String (x+152, y, team); Draw_FunStringLen (x+152, y, team, 4);
} }
// draw name // draw name
@ -1958,6 +2027,8 @@ void Sbar_DeathmatchOverlay (int start)
y += skip; y += skip;
} }
Draw_Character(0,0,COLOR_WHITE<<8);
if (y >= vid.height-10) // we ran over the screen size, squish if (y >= vid.height-10) // we ran over the screen size, squish
largegame = true; largegame = true;
@ -2061,6 +2132,8 @@ void Sbar_ChatModeOverlay(void)
y += skip; y += skip;
} }
Draw_Character(0,0,COLOR_WHITE<<8);
if (y >= vid.height-10) // we ran over the screen size, squish if (y >= vid.height-10) // we ran over the screen size, squish
largegame = true; largegame = true;
@ -2082,9 +2155,9 @@ void Sbar_MiniDeathmatchOverlay (void)
int x, y, f; int x, y, f;
char num[12]; char num[12];
player_info_t *s; player_info_t *s;
char team[5]; char team[64];
int numlines; int numlines;
char name[16+1]; char name[64+1];
team_t *tm; team_t *tm;
if (sbar_rect.width < 512 || !sb_lines) if (sbar_rect.width < 512 || !sb_lines)
@ -2144,7 +2217,7 @@ void Sbar_MiniDeathmatchOverlay (void)
f = s->frags; f = s->frags;
sprintf (num, "%3i",f); sprintf (num, "%3i",f);
Draw_Character ( x+8 , y, num[0]); Draw_ColouredCharacter ( x+8 , y, (COLOR_WHITE<<8)|num[0]);
Draw_Character ( x+16, y, num[1]); Draw_Character ( x+16, y, num[1]);
Draw_Character ( x+24, y, num[2]); Draw_Character ( x+24, y, num[2]);
@ -2155,19 +2228,17 @@ void Sbar_MiniDeathmatchOverlay (void)
Draw_Character ( x + 32, y, 17); Draw_Character ( x + 32, y, 17);
} }
// team Q_strncpyz(name, s->name, sizeof(name));
// team and name
if (cl.teamplay) if (cl.teamplay)
{ {
Q_strncpyz (team, Info_ValueForKey(s->userinfo, "team"), sizeof(team)); Q_strncpyz (team, Info_ValueForKey(s->userinfo, "team"), sizeof(team));
Draw_String (x+48, y, team); Draw_FunStringLen (x+48, y, team, 4);
Draw_FunStringLen (x+48+40, y, name, MAX_DISPLAYEDNAME);
} }
// draw name
Q_strncpyz(name, s->name, sizeof(name));
if (cl.teamplay)
Draw_FunString (x+48+40, y, name);
else else
Draw_FunString (x+48, y, name); Draw_FunStringLen (x+48, y, name, MAX_DISPLAYEDNAME);
y += 8; y += 8;
} }
@ -2178,7 +2249,7 @@ void Sbar_MiniDeathmatchOverlay (void)
// draw seperator // draw seperator
x += 208; x += 208;
for (y = sbar_rect.height - sb_lines; y < sbar_rect.height - 6; y += 2) for (y = sbar_rect.height - sb_lines; y < sbar_rect.height - 6; y += 2)
Draw_Character(x, y, 14); Draw_ColouredCharacter(x, y, (COLOR_WHITE<<8)|14);
x += 16; x += 16;
@ -2190,11 +2261,11 @@ void Sbar_MiniDeathmatchOverlay (void)
// draw pings // draw pings
Q_strncpyz (team, tm->team, sizeof(team)); Q_strncpyz (team, tm->team, sizeof(team));
Draw_String (x, y, team); Draw_FunStringLen (x, y, team, 4);
// draw total // draw total
sprintf (num, "%5i", tm->frags); sprintf (num, "%5i", tm->frags);
Draw_String (x + 40, y, num); Draw_FunString(x + 40, y, num);
if (!strncmp(Info_ValueForKey(cl.players[cl.playernum[0]].userinfo, if (!strncmp(Info_ValueForKey(cl.players[cl.playernum[0]].userinfo,
"team"), tm->team, 16)) { "team"), tm->team, 16)) {

View file

@ -34,7 +34,7 @@ void S_Update_(soundcardinfo_t *sc);
void S_StopAllSounds(qboolean clear); void S_StopAllSounds(qboolean clear);
void S_StopAllSoundsC(void); void S_StopAllSoundsC(void);
void S_UpdateCard(soundcardinfo_t *sc, vec3_t origin, vec3_t forward, vec3_t right, vec3_t up); void S_UpdateCard(soundcardinfo_t *sc);
// ======================================================================= // =======================================================================
// Internal sound data & structures // Internal sound data & structures
@ -162,6 +162,8 @@ void S_Startup (void)
if (sound_started) if (sound_started)
S_Shutdown(); S_Shutdown();
snd_blocked = 0;
if (!fakedma) if (!fakedma)
{ {
#if defined(_WIN32) && !defined(NODIRECTX) #if defined(_WIN32) && !defined(NODIRECTX)
@ -1109,13 +1111,18 @@ void S_Update(vec3_t origin, vec3_t forward, vec3_t right, vec3_t up)
{ {
soundcardinfo_t *sc; soundcardinfo_t *sc;
VectorCopy(origin, listener_origin);
VectorCopy(forward, listener_forward);
VectorCopy(right, listener_right);
VectorCopy(up, listener_up);
S_UpdateCapture(); S_UpdateCapture();
for (sc = sndcardinfo; sc; sc = sc->next) for (sc = sndcardinfo; sc; sc = sc->next)
S_UpdateCard(sc, origin, forward, right, up); S_UpdateCard(sc);
} }
void S_UpdateCard(soundcardinfo_t *sc, vec3_t origin, vec3_t forward, vec3_t right, vec3_t up) void S_UpdateCard(soundcardinfo_t *sc)
{ {
int i, j; int i, j;
int total; int total;
@ -1129,11 +1136,6 @@ void S_UpdateCard(soundcardinfo_t *sc, vec3_t origin, vec3_t forward, vec3_t rig
if (!sc->inactive_sound) if (!sc->inactive_sound)
return; return;
} }
VectorCopy(origin, listener_origin);
VectorCopy(forward, listener_forward);
VectorCopy(right, listener_right);
VectorCopy(up, listener_up);
// update general area ambient sound sources // update general area ambient sound sources
S_UpdateAmbientSounds (sc); S_UpdateAmbientSounds (sc);
@ -1253,6 +1255,9 @@ void S_ExtraUpdate (void)
{ {
soundcardinfo_t *sc; soundcardinfo_t *sc;
if (!sound_started)
return;
#ifdef _WIN32 #ifdef _WIN32
IN_Accumulate (); IN_Accumulate ();
#endif #endif
@ -1272,13 +1277,17 @@ void S_Update_(soundcardinfo_t *sc)
{ {
unsigned endtime; unsigned endtime;
int samps; int samps;
if (!sound_started)// || (snd_blocked > 0))
return;
if (sc->selfpainting) if (sc->selfpainting)
return; return;
if ((snd_blocked > 0))
{
if (!sc->inactive_sound)
return;
}
// Updates DMA time // Updates DMA time
GetSoundtime(sc); GetSoundtime(sc);

View file

@ -1143,9 +1143,6 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
Sys_Init (); Sys_Init ();
// because sound is off until we become active
S_BlockSound ();
Sys_Printf ("Host_Init\n"); Sys_Printf ("Host_Init\n");
Host_Init (&parms); Host_Init (&parms);

View file

@ -731,6 +731,64 @@ static char *Macro_demoplayback (void)
} }
return "1"; //unknown. return "1"; //unknown.
} }
static char *Macro_Match_Name (void)
{
int i;
i = TP_CountPlayers();
if (cl.teamplay && i >= 3)
{ // Teamplay
return va ("%s %s vs %s - %s",
TP_PlayerName(),
TP_PlayerTeam(),
TP_EnemyTeam(),
TP_MapName());
}
else
{
if (i == 2)
{ // Duel
return va ("%s vs %s - %s",
TP_PlayerName(),
TP_EnemyName(),
TP_MapName());
}
else if (i > 2)
{ // FFA
return va ("%s ffa - %s",
TP_PlayerName(),
TP_MapName());
}
else
{ // one player
return va ("%s - %s",
TP_PlayerName(),
TP_MapName());
}
}
}
//$matchtype
//duel,2on2,4on4,ffa,etc...
static char *Macro_Match_Type (void)
{
int i;
i = TP_CountPlayers();
if (cl.teamplay && i >= 3)
{
if (i >= 6)
return "4on4";
return "2on2";
}
if (i == 2)
return "duel";
if (i == 1)
return "single";
if (i == 0)
return "empty";
return "ffa";
}
/* /*
$droploc $droploc
Tells location of the dropped flag. Tells location of the dropped flag.
@ -764,9 +822,6 @@ $matchstatus
("disconnected", "standby" or "normal"). This can be ("disconnected", "standby" or "normal"). This can be
used for detecting prewar/prematch on ktpro/oztf servers. used for detecting prewar/prematch on ktpro/oztf servers.
$matchtype
duel,2on2,4on4,ffa,etc...
$mp3info $mp3info
Evaluates to "author - title". Evaluates to "author - title".
Examples: Examples:
@ -775,19 +830,6 @@ then hitting space will say something like
"listening to disturbed - rise". "listening to disturbed - rise".
bind x "if disturbed isin $mp3info then say dde music is cool" bind x "if disturbed isin $mp3info then say dde music is cool"
$need
What you need.
Note: you have to set this with tp_need* variables.
$point
Name of object you are looking at.
$pointatloc
Name of object and location of object you are looking at.
$pointloc
Location of object you are looking at.
$triggermatch $triggermatch
$triggermatch is the last chat message that exec'd a msg_trigger. $triggermatch is the last chat message that exec'd a msg_trigger.
@ -828,14 +870,14 @@ static void TP_InitMacros(void)
Cmd_AddMacro("point", Macro_PointName); Cmd_AddMacro("point", Macro_PointName);
Cmd_AddMacro("pointatloc", Macro_PointNameAtLocation); Cmd_AddMacro("pointatloc", Macro_PointNameAtLocation);
Cmd_AddMacro("pointloc", Macro_PointLocation); Cmd_AddMacro("pointloc", Macro_PointLocation);
Cmd_AddMacro("matchname", Macro_Match_Name);
Cmd_AddMacro("matchtype", Macro_Match_Type);
// Cmd_AddMacro("droploc", Macro_LastDrop); // Cmd_AddMacro("droploc", Macro_LastDrop);
// Cmd_AddMacro("droptime", Macro_LastDropTime); // Cmd_AddMacro("droptime", Macro_LastDropTime);
// Cmd_AddMacro("ledpoint", Macro_Point_LED); // Cmd_AddMacro("ledpoint", Macro_Point_LED);
// Cmd_AddMacro("ledstatus", Macro_MyStatus_LED); // Cmd_AddMacro("ledstatus", Macro_MyStatus_LED);
// Cmd_AddMacro("matchname", Macro_Match_Name);
// Cmd_AddMacro("matchstatus", Macro_Match_Status); // Cmd_AddMacro("matchstatus", Macro_Match_Status);
// Cmd_AddMacro("matchtype", Macro_Match_Type);
// Cmd_AddMacro("mp3info", ); // Cmd_AddMacro("mp3info", );
// Cmd_AddMacro("triggermatch", Macro_LastTrigger_Match); // Cmd_AddMacro("triggermatch", Macro_LastTrigger_Match);
} }

View file

@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details. See the GNU General Public License for more details.
@ -62,13 +62,13 @@ int PM_ClipVelocity (vec3_t in, vec3_t normal, vec3_t out, float overbounce)
float backoff; float backoff;
float change; float change;
int i, blocked; int i, blocked;
blocked = 0; blocked = 0;
if (normal[2] > 0) if (normal[2] > 0)
blocked |= BLOCKED_FLOOR; // floor blocked |= BLOCKED_FLOOR; // floor
if (!normal[2]) if (!normal[2])
blocked |= BLOCKED_STEP; // step blocked |= BLOCKED_STEP; // step
backoff = DotProduct (in, normal) * overbounce; backoff = DotProduct (in, normal) * overbounce;
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
@ -78,7 +78,7 @@ int PM_ClipVelocity (vec3_t in, vec3_t normal, vec3_t out, float overbounce)
if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON) if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON)
out[i] = 0; out[i] = 0;
} }
return blocked; return blocked;
} }
@ -105,14 +105,14 @@ int PM_SlideMove (void)
vec3_t end; vec3_t end;
float time_left; float time_left;
int blocked; int blocked;
numbumps = 4; numbumps = 4;
blocked = 0; blocked = 0;
VectorCopy (pmove.velocity, original_velocity); VectorCopy (pmove.velocity, original_velocity);
VectorCopy (pmove.velocity, primal_velocity); VectorCopy (pmove.velocity, primal_velocity);
numplanes = 0; numplanes = 0;
time_left = frametime; time_left = frametime;
for (bumpcount=0 ; bumpcount<numbumps ; bumpcount++) for (bumpcount=0 ; bumpcount<numbumps ; bumpcount++)
@ -152,7 +152,7 @@ int PM_SlideMove (void)
blocked |= BLOCKED_OTHER; blocked |= BLOCKED_OTHER;
time_left -= time_left * trace.fraction; time_left -= time_left * trace.fraction;
// cliped to another plane // cliped to another plane
if (numplanes >= MAX_CLIP_PLANES) if (numplanes >= MAX_CLIP_PLANES)
{ // this shouldn't really happen { // this shouldn't really happen
@ -178,9 +178,8 @@ int PM_SlideMove (void)
&& Length(pmove.velocity)>200 && pmove.cmd.buttons & 2 && !pmove.jump_held && !pmove.waterjumptime) && Length(pmove.velocity)>200 && pmove.cmd.buttons & 2 && !pmove.jump_held && !pmove.waterjumptime)
{ {
PM_ClipVelocity (original_velocity, planes[i], pmove.velocity, 2); PM_ClipVelocity (original_velocity, planes[i], pmove.velocity, 2);
pmove.velocity[2] += 270; if (pmove.velocity[2] < 270)
if (pmove.velocity[2] < 125) pmove.velocity[2] = 270;
pmove.velocity[2] = 125;
pmove.jump_msec = pmove.cmd.msec; pmove.jump_msec = pmove.cmd.msec;
pmove.jump_held = true; pmove.jump_held = true;
pmove.waterjumptime = 0; pmove.waterjumptime = 0;
@ -196,7 +195,7 @@ int PM_SlideMove (void)
if (j == numplanes) if (j == numplanes)
break; break;
} }
if (i != numplanes) if (i != numplanes)
{ // go along this plane { // go along this plane
} }
@ -302,7 +301,7 @@ usedown:
VectorCopy (downvel, pmove.velocity); VectorCopy (downvel, pmove.velocity);
return; return;
} }
// copy z value from slide move // copy z value from slide move
pmove.velocity[2] = downvel[2]; pmove.velocity[2] = downvel[2];
@ -332,7 +331,7 @@ void PM_Friction (void)
float drop; float drop;
vec3_t start, stop; vec3_t start, stop;
trace_t trace; trace_t trace;
if (pmove.waterjumptime) if (pmove.waterjumptime)
return; return;
@ -408,7 +407,7 @@ void PM_Accelerate (vec3_t wishdir, float wishspeed, float accel)
accelspeed = accel*frametime*wishspeed; accelspeed = accel*frametime*wishspeed;
if (accelspeed > addspeed) if (accelspeed > addspeed)
accelspeed = addspeed; accelspeed = addspeed;
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
pmove.velocity[i] += accelspeed*wishdir[i]; pmove.velocity[i] += accelspeed*wishdir[i];
} }
@ -418,7 +417,7 @@ void PM_AirAccelerate (vec3_t wishdir, float wishspeed, float accel)
int i; int i;
float addspeed, accelspeed, currentspeed, wishspd = wishspeed; float addspeed, accelspeed, currentspeed, wishspd = wishspeed;
float originalspeed, newspeed, speedcap; float originalspeed, newspeed, speedcap;
if (pmove.pm_type == PM_DEAD) if (pmove.pm_type == PM_DEAD)
return; return;
if (pmove.waterjumptime) if (pmove.waterjumptime)
@ -441,7 +440,7 @@ void PM_AirAccelerate (vec3_t wishdir, float wishspeed, float accel)
accelspeed = accel * wishspeed * frametime; accelspeed = accel * wishspeed * frametime;
if (accelspeed > addspeed) if (accelspeed > addspeed)
accelspeed = addspeed; accelspeed = addspeed;
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
pmove.velocity[i] += accelspeed*wishdir[i]; pmove.velocity[i] += accelspeed*wishdir[i];
@ -517,19 +516,19 @@ void PM_FlyMove ()
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
wishvel[i] = forward[i]*pmove.cmd.forwardmove + right[i]*pmove.cmd.sidemove; wishvel[i] = forward[i]*pmove.cmd.forwardmove + right[i]*pmove.cmd.sidemove;
wishvel[2] += pmove.cmd.upmove; wishvel[2] += pmove.cmd.upmove;
VectorCopy (wishvel, wishdir); VectorCopy (wishvel, wishdir);
wishspeed = VectorNormalize(wishdir); wishspeed = VectorNormalize(wishdir);
if (wishspeed > movevars.maxspeed) { if (wishspeed > movevars.maxspeed) {
VectorScale (wishvel, movevars.maxspeed/wishspeed, wishvel); VectorScale (wishvel, movevars.maxspeed/wishspeed, wishvel);
wishspeed = movevars.maxspeed; wishspeed = movevars.maxspeed;
} }
PM_Accelerate (wishdir, wishspeed, movevars.accelerate); PM_Accelerate (wishdir, wishspeed, movevars.accelerate);
PM_StepSlideMove (); PM_StepSlideMove ();
} }
@ -544,7 +543,7 @@ void PM_LadderMove (void)
// //
// user intentions // user intentions
// //
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
wishvel[i] = forward[i]*pmove.cmd.forwardmove + right[i]*pmove.cmd.sidemove + up[i]*pmove.cmd.upmove; wishvel[i] = forward[i]*pmove.cmd.forwardmove + right[i]*pmove.cmd.sidemove + up[i]*pmove.cmd.upmove;
@ -575,7 +574,7 @@ void PM_LadderMove (void)
VectorCopy (trace.endpos, pmove.origin); VectorCopy (trace.endpos, pmove.origin);
return; return;
} }
PM_FlyMove (); PM_FlyMove ();
} }
@ -596,7 +595,7 @@ void PM_AirMove (void)
fmove = pmove.cmd.forwardmove; fmove = pmove.cmd.forwardmove;
smove = pmove.cmd.sidemove; smove = pmove.cmd.sidemove;
forward[2] = 0; forward[2] = 0;
right[2] = 0; right[2] = 0;
VectorNormalize (forward); VectorNormalize (forward);
@ -617,7 +616,7 @@ void PM_AirMove (void)
VectorScale (wishvel, movevars.maxspeed/wishspeed, wishvel); VectorScale (wishvel, movevars.maxspeed/wishspeed, wishvel);
wishspeed = movevars.maxspeed; wishspeed = movevars.maxspeed;
} }
if (pmove.onground) if (pmove.onground)
{ {
if (pmove.velocity[2] > 0 || !movevars.slidefix) if (pmove.velocity[2] > 0 || !movevars.slidefix)
@ -731,7 +730,7 @@ void PM_CategorizePosition (void)
{ {
trace_t t; trace_t t;
vec3_t flatforward, fwd1; vec3_t flatforward, fwd1;
flatforward[0] = forward[0]; flatforward[0] = forward[0];
flatforward[1] = forward[1]; flatforward[1] = forward[1];
flatforward[2] = 0; flatforward[2] = 0;
@ -952,7 +951,7 @@ void PM_SpectatorMove (void)
// accelerate // accelerate
fmove = pmove.cmd.forwardmove; fmove = pmove.cmd.forwardmove;
smove = pmove.cmd.sidemove; smove = pmove.cmd.sidemove;
VectorNormalize (forward); VectorNormalize (forward);
VectorNormalize (right); VectorNormalize (right);
@ -986,9 +985,9 @@ void PM_SpectatorMove (void)
accelspeed = movevars.accelerate*frametime*wishspeed; accelspeed = movevars.accelerate*frametime*wishspeed;
if (accelspeed > addspeed) if (accelspeed > addspeed)
accelspeed = addspeed; accelspeed = addspeed;
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
pmove.velocity[i] += accelspeed*wishdir[i]; pmove.velocity[i] += accelspeed*wishdir[i];
} }
// move // move

View file

@ -593,219 +593,222 @@ static galiastexnum_t *GL_ChooseSkin(galiasinfo_t *inf, char *modelname, entity_
int tc, bc; int tc, bc;
if (e->scoreboard) if (gl_nocolors.value)
{ {
if (!e->scoreboard->skin && !gl_nocolors.value) if (e->scoreboard)
Skin_Find(e->scoreboard);
tc = e->scoreboard->topcolor;
bc = e->scoreboard->bottomcolor;
//colour forcing
if (cl.splitclients<2 && !(cl.fpd & FPD_NO_FORCE_COLOR)) //no colour/skin forcing in splitscreen.
{ {
if (cl.teamplay && !strcmp(e->scoreboard->team, cl.players[cl.playernum[0]].team)) if (!e->scoreboard->skin)
Skin_Find(e->scoreboard);
tc = e->scoreboard->topcolor;
bc = e->scoreboard->bottomcolor;
//colour forcing
if (cl.splitclients<2 && !(cl.fpd & FPD_NO_FORCE_COLOR)) //no colour/skin forcing in splitscreen.
{ {
if (cl_teamtopcolor>=0) if (cl.teamplay && !strcmp(e->scoreboard->team, cl.players[cl.playernum[0]].team))
tc = cl_teamtopcolor; {
if (cl_teambottomcolor>=0) if (cl_teamtopcolor>=0)
bc = cl_teambottomcolor; tc = cl_teamtopcolor;
} if (cl_teambottomcolor>=0)
else bc = cl_teambottomcolor;
{ }
if (cl_enemytopcolor>=0) else
tc = cl_enemytopcolor; {
if (cl_enemybottomcolor>=0) if (cl_enemytopcolor>=0)
bc = cl_enemybottomcolor; tc = cl_enemytopcolor;
if (cl_enemybottomcolor>=0)
bc = cl_enemybottomcolor;
}
} }
} }
}
else
{
tc = 1;
bc = 1;
}
if (!gl_nocolors.value && (tc != 1 || bc != 1 || (e->scoreboard && e->scoreboard->skin)))
{
int inwidth, inheight;
int tinwidth, tinheight;
char *skinname;
qbyte *original;
int cc;
galiascolourmapped_t *cm;
cc = (tc<<4)|bc;
if (!strstr(modelname, "progs/player.mdl"))
skinname = modelname;
else else
{ {
if (e->scoreboard && e->scoreboard->skin && !gl_nocolors.value) tc = 1;
skinname = e->scoreboard->skin->name; bc = 1;
else }
if (tc != 1 || bc != 1 || (e->scoreboard && e->scoreboard->skin))
{
int inwidth, inheight;
int tinwidth, tinheight;
char *skinname;
qbyte *original;
int cc;
galiascolourmapped_t *cm;
cc = (tc<<4)|bc;
if (!strstr(modelname, "progs/player.mdl"))
skinname = modelname; skinname = modelname;
} else
if (!skincolourmapped.numbuckets)
Hash_InitTable(&skincolourmapped, 256, BZ_Malloc(Hash_BytesForBuckets(256)));
for (cm = Hash_Get(&skincolourmapped, skinname); cm; cm = Hash_GetNext(&skincolourmapped, skinname, cm))
{
if (cm->colour == cc && cm->skinnum == e->skinnum)
{ {
return &cm->texnum; if (e->scoreboard && e->scoreboard->skin && !gl_nocolors.value)
skinname = e->scoreboard->skin->name;
else
skinname = modelname;
} }
}
if (!skincolourmapped.numbuckets)
skins = (galiasskin_t*)((char *)inf + inf->ofsskins); Hash_InitTable(&skincolourmapped, 256, BZ_Malloc(Hash_BytesForBuckets(256)));
if (!skins->texnums)
return NULL; for (cm = Hash_Get(&skincolourmapped, skinname); cm; cm = Hash_GetNext(&skincolourmapped, skinname, cm))
if (e->skinnum >= 0 && e->skinnum < inf->numskins)
skins += e->skinnum;
texnums = (galiastexnum_t*)((char *)skins + skins->ofstexnums);
//colourmap isn't present yet.
cm = BZ_Malloc(sizeof(*cm));
Q_strncpyz(cm->name, skinname, sizeof(cm->name));
Hash_Add2(&skincolourmapped, cm->name, cm, &cm->bucket);
cm->colour = cc;
cm->skinnum = e->skinnum;
cm->texnum.fullbright = 0;
cm->texnum.base = 0;
cm->texnum.bump = texnums[cm->skinnum].bump; //can't colour bumpmapping
if (skinname!=modelname && e->scoreboard && e->scoreboard->skin)
{
original = Skin_Cache8(e->scoreboard->skin);
inwidth = e->scoreboard->skin->width;
inheight = e->scoreboard->skin->height;
}
else
{
original = NULL;
inwidth = 0;
}
if (!original)
{
if (skins->ofstexels)
{ {
original = (qbyte *)skins + skins->ofstexels; if (cm->colour == cc && cm->skinnum == e->skinnum)
inwidth = skins->skinwidth; {
inheight = skins->skinheight; return &cm->texnum;
}
}
skins = (galiasskin_t*)((char *)inf + inf->ofsskins);
if (!skins->texnums)
return NULL;
if (e->skinnum >= 0 && e->skinnum < inf->numskins)
skins += e->skinnum;
texnums = (galiastexnum_t*)((char *)skins + skins->ofstexnums);
//colourmap isn't present yet.
cm = BZ_Malloc(sizeof(*cm));
Q_strncpyz(cm->name, skinname, sizeof(cm->name));
Hash_Add2(&skincolourmapped, cm->name, cm, &cm->bucket);
cm->colour = cc;
cm->skinnum = e->skinnum;
cm->texnum.fullbright = 0;
cm->texnum.base = 0;
cm->texnum.bump = texnums[cm->skinnum].bump; //can't colour bumpmapping
if (skinname!=modelname && e->scoreboard && e->scoreboard->skin)
{
original = Skin_Cache8(e->scoreboard->skin);
inwidth = e->scoreboard->skin->width;
inheight = e->scoreboard->skin->height;
} }
else else
{ {
original = NULL; original = NULL;
inwidth = 0; inwidth = 0;
inheight = 0;
} }
} if (!original)
tinwidth = skins->skinwidth;
tinheight = skins->skinheight;
if (original)
{
int i, j;
qbyte translate[256];
unsigned translate32[256];
static unsigned pixels[512*512];
unsigned *out;
unsigned frac, fracstep;
unsigned scaled_width, scaled_height;
qbyte *inrow;
texnums = &cm->texnum;
texnums->base = 0;
texnums->fullbright = 0;
scaled_width = gl_max_size.value < 512 ? gl_max_size.value : 512;
scaled_height = gl_max_size.value < 512 ? gl_max_size.value : 512;
for (i=0 ; i<256 ; i++)
translate[i] = i;
tc<<=4;
bc<<=4;
for (i=0 ; i<16 ; i++)
{ {
if (tc < 128) // the artists made some backwards ranges. sigh. if (skins->ofstexels)
translate[TOP_RANGE+i] = tc+i;
else
translate[TOP_RANGE+i] = tc+15-i;
if (bc < 128)
translate[BOTTOM_RANGE+i] = bc+i;
else
translate[BOTTOM_RANGE+i] = bc+15-i;
}
for (i=0 ; i<256 ; i++)
translate32[i] = d_8to24rgbtable[translate[i]];
out = pixels;
fracstep = tinwidth*0x10000/scaled_width;
for (i=0 ; i<scaled_height ; i++, out += scaled_width)
{
inrow = original + inwidth*(i*tinheight/scaled_height);
frac = fracstep >> 1;
for (j=0 ; j<scaled_width ; j+=4)
{ {
out[j] = translate32[inrow[frac>>16]]; original = (qbyte *)skins + skins->ofstexels;
frac += fracstep; inwidth = skins->skinwidth;
out[j+1] = translate32[inrow[frac>>16]]; inheight = skins->skinheight;
frac += fracstep; }
out[j+2] = translate32[inrow[frac>>16]]; else
frac += fracstep; {
out[j+3] = translate32[inrow[frac>>16]]; original = NULL;
frac += fracstep; inwidth = 0;
inheight = 0;
} }
} }
texnums->base = texture_extension_number++; tinwidth = skins->skinwidth;
GL_Bind(texnums->base); tinheight = skins->skinheight;
qglTexImage2D (GL_TEXTURE_2D, 0, gl_solid_format, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); if (original)
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//now do the fullbrights.
out = pixels;
fracstep = tinwidth*0x10000/scaled_width;
for (i=0 ; i<scaled_height ; i++, out += scaled_width)
{ {
inrow = original + inwidth*(i*tinheight/scaled_height); int i, j;
frac = fracstep >> 1; qbyte translate[256];
for (j=0 ; j<scaled_width ; j+=1) unsigned translate32[256];
static unsigned pixels[512*512];
unsigned *out;
unsigned frac, fracstep;
unsigned scaled_width, scaled_height;
qbyte *inrow;
texnums = &cm->texnum;
texnums->base = 0;
texnums->fullbright = 0;
scaled_width = gl_max_size.value < 512 ? gl_max_size.value : 512;
scaled_height = gl_max_size.value < 512 ? gl_max_size.value : 512;
for (i=0 ; i<256 ; i++)
translate[i] = i;
tc<<=4;
bc<<=4;
for (i=0 ; i<16 ; i++)
{ {
if (inrow[frac>>16] < 255-vid.fullbright) if (tc < 128) // the artists made some backwards ranges. sigh.
((char *) (&out[j]))[3] = 0; //alpha 0 translate[TOP_RANGE+i] = tc+i;
frac += fracstep; else
translate[TOP_RANGE+i] = tc+15-i;
if (bc < 128)
translate[BOTTOM_RANGE+i] = bc+i;
else
translate[BOTTOM_RANGE+i] = bc+15-i;
} }
for (i=0 ; i<256 ; i++)
translate32[i] = d_8to24rgbtable[translate[i]];
out = pixels;
fracstep = tinwidth*0x10000/scaled_width;
for (i=0 ; i<scaled_height ; i++, out += scaled_width)
{
inrow = original + inwidth*(i*tinheight/scaled_height);
frac = fracstep >> 1;
for (j=0 ; j<scaled_width ; j+=4)
{
out[j] = translate32[inrow[frac>>16]];
frac += fracstep;
out[j+1] = translate32[inrow[frac>>16]];
frac += fracstep;
out[j+2] = translate32[inrow[frac>>16]];
frac += fracstep;
out[j+3] = translate32[inrow[frac>>16]];
frac += fracstep;
}
}
texnums->base = texture_extension_number++;
GL_Bind(texnums->base);
qglTexImage2D (GL_TEXTURE_2D, 0, gl_solid_format, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//now do the fullbrights.
out = pixels;
fracstep = tinwidth*0x10000/scaled_width;
for (i=0 ; i<scaled_height ; i++, out += scaled_width)
{
inrow = original + inwidth*(i*tinheight/scaled_height);
frac = fracstep >> 1;
for (j=0 ; j<scaled_width ; j+=1)
{
if (inrow[frac>>16] < 255-vid.fullbright)
((char *) (&out[j]))[3] = 0; //alpha 0
frac += fracstep;
}
}
texnums->fullbright = texture_extension_number++;
GL_Bind(texnums->fullbright);
qglTexImage2D (GL_TEXTURE_2D, 0, gl_alpha_format, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
} }
texnums->fullbright = texture_extension_number++; else
GL_Bind(texnums->fullbright); {
qglTexImage2D (GL_TEXTURE_2D, 0, gl_alpha_format, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); skins = (galiasskin_t*)((char *)inf + inf->ofsskins);
if (e->skinnum >= 0 && e->skinnum < inf->numskins)
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); skins += e->skinnum;
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
if (!skins->texnums)
return NULL;
frame = cl.time*skins->skinspeed;
frame = frame%skins->texnums;
texnums = (galiastexnum_t*)((char *)skins + skins->ofstexnums + frame*sizeof(galiastexnum_t));
memcpy(&cm->texnum, texnums, sizeof(cm->texnum));
}
return &cm->texnum;
} }
else
{
skins = (galiasskin_t*)((char *)inf + inf->ofsskins);
if (e->skinnum >= 0 && e->skinnum < inf->numskins)
skins += e->skinnum;
if (!skins->texnums)
return NULL;
frame = cl.time*skins->skinspeed;
frame = frame%skins->texnums;
texnums = (galiastexnum_t*)((char *)skins + skins->ofstexnums + frame*sizeof(galiastexnum_t));
memcpy(&cm->texnum, texnums, sizeof(cm->texnum));
}
return &cm->texnum;
} }
skins = (galiasskin_t*)((char *)inf + inf->ofsskins); skins = (galiasskin_t*)((char *)inf + inf->ofsskins);

View file

@ -1881,6 +1881,10 @@ R_ModifyColor
*/ */
void R_ModifyColor ( meshbuffer_t *mb, shaderpass_t *pass ) void R_ModifyColor ( meshbuffer_t *mb, shaderpass_t *pass )
{ {
extern qbyte *host_basepal;
extern qboolean gammaworks;
extern qbyte gammatable[256];
int i, b; int i, b;
float *table, c, a; float *table, c, a;
vec3_t t, v; vec3_t t, v;
@ -1952,6 +1956,87 @@ void R_ModifyColor ( meshbuffer_t *mb, shaderpass_t *pass )
case RGB_GEN_EXACT_VERTEX: case RGB_GEN_EXACT_VERTEX:
memcpy ( bArray, vArray, sizeof(byte_vec4_t)*numColors ); memcpy ( bArray, vArray, sizeof(byte_vec4_t)*numColors );
break; break;
case RGB_GEN_TOPCOLOR: //multiply vertex by topcolor (for player models)
{
int rc, gc, bc;
if (currententity->scoreboard)
{
i = currententity->scoreboard->topcolor;
//colour forcing
if (cl.splitclients<2 && !(cl.fpd & FPD_NO_FORCE_COLOR)) //no colour/skin forcing in splitscreen.
{
if (cl.teamplay && !strcmp(currententity->scoreboard->team, cl.players[cl.playernum[0]].team))
{
if (cl_teamtopcolor>=0)
i = cl_teamtopcolor;
}
else
{
if (cl_enemytopcolor>=0)
i = cl_enemytopcolor;
}
}
}
else
i = TOP_RANGE>>4;
rc = host_basepal[i<<4];
gc = host_basepal[i<<4];
bc = host_basepal[i<<4];
if (!gammaworks)
{
rc = gammatable[rc];
gc = gammatable[gc];
bc = gammatable[bc];
}
for ( i = 0; i < numColors; i++, bArray += 4, vArray += 4 ) {
bArray[0] = (vArray[0]*rc)>>8;
bArray[1] = (vArray[1]*gc)>>8;
bArray[2] = (vArray[2]*bc)>>8;
}
break;
}
case RGB_GEN_BOTTOMCOLOR: //multiply vertex by bottomcolor (for player models)
{
int rc, gc, bc;
if (currententity->scoreboard)
{
i = currententity->scoreboard->bottomcolor;
//colour forcing
if (cl.splitclients<2 && !(cl.fpd & FPD_NO_FORCE_COLOR)) //no colour/skin forcing in splitscreen.
{
if (cl.teamplay && !strcmp(currententity->scoreboard->team, cl.players[cl.playernum[0]].team))
{
if (cl_teambottomcolor>=0)
i = cl_teambottomcolor;
}
else
{
if (cl_enemybottomcolor>=0)
i = cl_enemybottomcolor;
}
}
}
else
i = BOTTOM_RANGE>>4;
rc = host_basepal[i<<4];
gc = host_basepal[i<<4];
bc = host_basepal[i<<4];
if (!gammaworks)
{
rc = gammatable[rc];
gc = gammatable[gc];
bc = gammatable[bc];
}
for ( i = 0; i < numColors; i++, bArray += 4, vArray += 4 ) {
bArray[0] = (vArray[0]*rc)>>8;
bArray[1] = (vArray[1]*gc)>>8;
bArray[2] = (vArray[2]*bc)>>8;
}
break;
}
case RGB_GEN_ONE_MINUS_VERTEX: case RGB_GEN_ONE_MINUS_VERTEX:
for ( i = 0; i < numColors; i++, bArray += 4, vArray += 4 ) { for ( i = 0; i < numColors; i++, bArray += 4, vArray += 4 ) {

View file

@ -548,6 +548,7 @@ model_t *GLMod_LoadModel (model_t *mod, qboolean crash)
{ {
Mod_LoadQ2BrushModel (mod, buf); Mod_LoadQ2BrushModel (mod, buf);
mod->needload = false; mod->needload = false;
R_DefaultTrail(mod);
return mod; return mod;
} }
#endif #endif
@ -561,11 +562,14 @@ model_t *GLMod_LoadModel (model_t *mod, qboolean crash)
{ {
char mdlbase[MAX_QPATH]; char mdlbase[MAX_QPATH];
COM_StripExtension(mod->name, mdlbase); COM_StripExtension(mod->name, mdlbase);
#ifdef MD3MODELS
if (!buf) if (!buf)
buf = (unsigned *)COM_LoadStackFile (va("%s.md3", mdlbase), stackbuf, sizeof(stackbuf)); buf = (unsigned *)COM_LoadStackFile (va("%s.md3", mdlbase), stackbuf, sizeof(stackbuf));
#endif
#ifdef MD2MODELS
if (!buf) if (!buf)
buf = (unsigned *)COM_LoadStackFile (va("%s.md2", mdlbase), stackbuf, sizeof(stackbuf)); buf = (unsigned *)COM_LoadStackFile (va("%s.md2", mdlbase), stackbuf, sizeof(stackbuf));
#endif
} }
if (!buf) if (!buf)
{ {
@ -578,6 +582,7 @@ model_t *GLMod_LoadModel (model_t *mod, qboolean crash)
{ {
mod->needload = false; mod->needload = false;
GLMod_LoadDoomSprite(mod); GLMod_LoadDoomSprite(mod);
R_DefaultTrail(mod);
return mod; return mod;
} }
#endif #endif
@ -595,6 +600,7 @@ couldntload:
mod->maxs[1] = 16; mod->maxs[1] = 16;
mod->maxs[2] = 16; mod->maxs[2] = 16;
mod->needload = true; mod->needload = true;
R_DefaultTrail(mod);
return mod; return mod;
return NULL; return NULL;
} }

View file

@ -1808,7 +1808,7 @@ void PPL_BaseBModelTextures(entity_t *e)
void PPL_BaseEntTextures(void) void PPL_BaseEntTextures(void)
{ {
extern model_t *currentmodel; extern model_t *currentmodel;
int i; int i,j;
if (!r_drawentities.value) if (!r_drawentities.value)
return; return;
@ -1818,6 +1818,17 @@ void PPL_BaseEntTextures(void)
{ {
currententity = &cl_visedicts[i]; currententity = &cl_visedicts[i];
j = currententity->keynum;
while(j)
{
if (j == cl.viewentity[r_refdef.currentplayernum]+1)
break;
j = cl.lerpents[j].tagent;
}
if (j)
continue;
if (cl.viewentity[r_refdef.currentplayernum] && currententity->keynum == cl.viewentity[r_refdef.currentplayernum]) if (cl.viewentity[r_refdef.currentplayernum] && currententity->keynum == cl.viewentity[r_refdef.currentplayernum])
continue; continue;
if (!Cam_DrawPlayer(0, currententity->keynum-1)) if (!Cam_DrawPlayer(0, currententity->keynum-1))

View file

@ -144,12 +144,12 @@ void GLSCR_UpdateScreen (void)
//let let the user be too crazy //let let the user be too crazy
if (vid_conwidth.value > 2048) //anything higher is unreadable. if (vid_conwidth.value > 2048) //anything higher is unreadable.
Cvar_Set(&vid_conwidth, "2048"); Cvar_Set(&vid_conwidth, "2048");
if (vid_conwidth.value < 320) //lower would be wrong if (vid_conwidth.value < 240) //lower would be wrong
Cvar_Set(&vid_conwidth, "320"); Cvar_Set(&vid_conwidth, "320");
if (vid_conheight.value > 1536) //anything higher is unreadable. if (vid_conheight.value > 1536) //anything higher is unreadable.
Cvar_Set(&vid_conheight, "1536"); Cvar_Set(&vid_conheight, "1536");
if (vid_conheight.value < 320) //lower would be wrong if (vid_conheight.value < 240) //lower would be wrong
Cvar_Set(&vid_conheight, "320"); Cvar_Set(&vid_conheight, "200");
vid_conwidth.modified = false; vid_conwidth.modified = false;
vid_conheight.modified = false; vid_conheight.modified = false;

View file

@ -651,32 +651,38 @@ static void Shaderpass_RGBGen ( shader_t *shader, shaderpass_t *pass, char **ptr
char *token; char *token;
token = Shader_ParseString ( ptr ); token = Shader_ParseString ( ptr );
if ( !Q_stricmp (token, "identitylighting") ) { if ( !Q_stricmp (token, "identitylighting") )
pass->rgbgen = RGB_GEN_IDENTITY_LIGHTING; pass->rgbgen = RGB_GEN_IDENTITY_LIGHTING;
} else if ( !Q_stricmp (token, "identity") ) { else if ( !Q_stricmp (token, "identity") )
pass->rgbgen = RGB_GEN_IDENTITY; pass->rgbgen = RGB_GEN_IDENTITY;
} else if ( !Q_stricmp (token, "wave") ) { else if ( !Q_stricmp (token, "wave") )
{
pass->rgbgen = RGB_GEN_WAVE; pass->rgbgen = RGB_GEN_WAVE;
Shader_ParseFunc ( ptr, &pass->rgbgen_func ); Shader_ParseFunc ( ptr, &pass->rgbgen_func );
} else if ( !Q_stricmp(token, "entity") ) { }
else if ( !Q_stricmp(token, "entity") )
pass->rgbgen = RGB_GEN_ENTITY; pass->rgbgen = RGB_GEN_ENTITY;
} else if ( !Q_stricmp (token, "oneMinusEntity") ) { else if ( !Q_stricmp (token, "oneMinusEntity") )
pass->rgbgen = RGB_GEN_ONE_MINUS_ENTITY; pass->rgbgen = RGB_GEN_ONE_MINUS_ENTITY;
} else if ( !Q_stricmp (token, "vertex")) { else if ( !Q_stricmp (token, "vertex"))
pass->rgbgen = RGB_GEN_VERTEX; pass->rgbgen = RGB_GEN_VERTEX;
} else if ( !Q_stricmp (token, "oneMinusVertex") ) { else if ( !Q_stricmp (token, "oneMinusVertex") )
pass->rgbgen = RGB_GEN_ONE_MINUS_VERTEX; pass->rgbgen = RGB_GEN_ONE_MINUS_VERTEX;
} else if ( !Q_stricmp (token, "lightingDiffuse") ) { else if ( !Q_stricmp (token, "lightingDiffuse") )
pass->rgbgen = RGB_GEN_LIGHTING_DIFFUSE; pass->rgbgen = RGB_GEN_LIGHTING_DIFFUSE;
} else if ( !Q_stricmp (token, "exactvertex") ) { else if ( !Q_stricmp (token, "exactvertex") )
pass->rgbgen = RGB_GEN_EXACT_VERTEX; pass->rgbgen = RGB_GEN_EXACT_VERTEX;
} else if ( !Q_stricmp (token, "const") || !Q_stricmp (token, "constant") ) { else if ( !Q_stricmp (token, "const") || !Q_stricmp (token, "constant") )
{
pass->rgbgen = RGB_GEN_CONST; pass->rgbgen = RGB_GEN_CONST;
pass->rgbgen_func.type = SHADER_FUNC_CONSTANT; pass->rgbgen_func.type = SHADER_FUNC_CONSTANT;
Shader_ParseVector ( ptr, pass->rgbgen_func.args ); Shader_ParseVector ( ptr, pass->rgbgen_func.args );
} }
else if ( !Q_stricmp (token, "topcolor") )
pass->rgbgen = RGB_GEN_TOPCOLOR;
else if ( !Q_stricmp (token, "bottomcolor") )
pass->rgbgen = RGB_GEN_BOTTOMCOLOR;
} }
static void Shaderpass_AlphaGen ( shader_t *shader, shaderpass_t *pass, char **ptr ) static void Shaderpass_AlphaGen ( shader_t *shader, shaderpass_t *pass, char **ptr )

View file

@ -842,7 +842,8 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
GL_Init(&GLX_GetSymbol); GL_Init(&GLX_GetSymbol);
VID_SetPalette(palette); GLVID_SetPalette(palette);
GLVID_ShiftPalette(palette);
Con_SafePrintf ("Video mode %dx%d initialized.\n", info->width, info->height); Con_SafePrintf ("Video mode %dx%d initialized.\n", info->width, info->height);

View file

@ -138,7 +138,9 @@ typedef struct shaderpass_s {
RGB_GEN_IDENTITY, RGB_GEN_IDENTITY,
RGB_GEN_CONST, RGB_GEN_CONST,
RGB_GEN_UNKNOWN, RGB_GEN_UNKNOWN,
RGB_GEN_LIGHTING_DIFFUSE RGB_GEN_LIGHTING_DIFFUSE,
RGB_GEN_TOPCOLOR,
RGB_GEN_BOTTOMCOLOR
} rgbgen; } rgbgen;
enum { enum {
ALPHA_GEN_ENTITY, ALPHA_GEN_ENTITY,

View file

@ -1000,6 +1000,7 @@ pbool ED_ParseEpair (progfuncs_t *progfuncs, void *base, ddefXX_t *key, char *s,
break; break;
default: default:
Sys_Error("Bad bits in ED_ParseEpair"); Sys_Error("Bad bits in ED_ParseEpair");
d = 0;
} }
switch (type) switch (type)

View file

@ -7669,7 +7669,7 @@ void PF_setattachment(progfuncs_t *prinst, struct globalvars_s *pr_globals)
if (tagentity != sv.edicts && tagname && tagname[0]) if (tagentity != sv.edicts && tagname && tagname[0])
{ {
modelindex = (int)e->v.modelindex; modelindex = (int)tagentity->v.modelindex;
if (modelindex > 0 && modelindex < MAX_MODELS && (model = SV_GetTags(modelindex, &tagcount))) if (modelindex > 0 && modelindex < MAX_MODELS && (model = SV_GetTags(modelindex, &tagcount)))
{ {
for (i = 0;i < tagcount;i++) for (i = 0;i < tagcount;i++)

View file

@ -1281,24 +1281,24 @@ void SVC_DirectConnect
if (atof(Info_ValueForKey (temp.userinfo, "*FuhQuake")) < 0.3) if (atof(Info_ValueForKey (temp.userinfo, "*FuhQuake")) < 0.3)
{ {
SV_OutOfBandPrintf (isquake2client, adr, "%c\nThe server is using a halflife level and we don't think your client supports this\nuse 'setinfo iknow 1' to ignore this check\nYou can go to "ENGINEWEBSITE" to get a compatable client\n\nYou may need to enable an option\n\n", A2C_PRINT); SV_OutOfBandPrintf (isquake2client, adr, "%c\nThe server is using a halflife level and we don't think your client supports this\nuse 'setinfo iknow 1' to ignore this check\nYou can go to "ENGINEWEBSITE" to get a compatable client\n\nYou may need to enable an option\n\n", A2C_PRINT);
Con_Printf("player %s was dropped due to incompatable client\n", name); // Con_Printf("player %s was dropped due to incompatable client\n", name);
return; // return;
} }
} }
#ifdef PEXT_Q2BSP #ifdef PEXT_Q2BSP
else if (sv.worldmodel->fromgame == fg_quake2 && !(newcl->fteprotocolextensions & PEXT_Q2BSP)) else if (sv.worldmodel->fromgame == fg_quake2 && !(newcl->fteprotocolextensions & PEXT_Q2BSP))
{ {
SV_OutOfBandPrintf (isquake2client, adr, "%c\nThe server is using a quake 2 level and we don't think your client supports this\nuse 'setinfo iknow 1' to ignore this check\nYou can go to "ENGINEWEBSITE" to get a compatable client\n\nYou may need to enable an option\n\n", A2C_PRINT); SV_OutOfBandPrintf (isquake2client, adr, "%c\nThe server is using a quake 2 level and we don't think your client supports this\nuse 'setinfo iknow 1' to ignore this check\nYou can go to "ENGINEWEBSITE" to get a compatable client\n\nYou may need to enable an option\n\n", A2C_PRINT);
Con_Printf("player %s was dropped due to incompatable client\n", name); // Con_Printf("player %s was dropped due to incompatable client\n", name);
return; // return;
} }
#endif #endif
#ifdef PEXT_Q3BSP #ifdef PEXT_Q3BSP
else if (sv.worldmodel->fromgame == fg_quake3 && !(newcl->fteprotocolextensions & PEXT_Q3BSP)) else if (sv.worldmodel->fromgame == fg_quake3 && !(newcl->fteprotocolextensions & PEXT_Q3BSP))
{ {
SV_OutOfBandPrintf (isquake2client, adr, "%c\nThe server is using a quake 3 level and we don't think your client supports this\nuse 'setinfo iknow 1' to ignore this check\nYou can go to "ENGINEWEBSITE" to get a compatable client\n\nYou may need to enable an option\n\n", A2C_PRINT); SV_OutOfBandPrintf (isquake2client, adr, "%c\nThe server is using a quake 3 level and we don't think your client supports this\nuse 'setinfo iknow 1' to ignore this check\nYou can go to "ENGINEWEBSITE" to get a compatable client\n\nYou may need to enable an option\n\n", A2C_PRINT);
Con_Printf("player %s was dropped due to incompatable client\n", name); // Con_Printf("player %s was dropped due to incompatable client\n", name);
return; // return;
} }
#endif #endif
} }

View file

@ -195,20 +195,27 @@ void R_InitSkyBox (void)
wm = cl.worldmodel; wm = cl.worldmodel;
r_skyfaces = wm->surfaces + wm->numsurfaces; Hunk_Check();
wm->numsurfaces += 6;
r_skyverts = wm->vertexes + wm->numvertexes; if (wm->numsurfaces+6 > MAX_MAP_FACES
wm->numvertexes += 8; || wm->numvertexes+8 > MAX_MAP_VERTS
r_skyedges = wm->edges + wm->numedges; || wm->numedges+12 > MAX_MAP_EDGES)
wm->numedges += 12;
r_skysurfedges = wm->surfedges + wm->numsurfedges;
wm->numsurfedges += 24;
if (wm->numsurfaces > MAX_MAP_FACES
|| wm->numvertexes > MAX_MAP_VERTS
|| wm->numedges > MAX_MAP_EDGES)
Host_Error ("InitSkyBox: map overflow"); Host_Error ("InitSkyBox: map overflow");
r_skyfaces = wm->surfaces + wm->numsurfaces;
// wm->numsurfaces += 6;
r_skyverts = wm->vertexes + wm->numvertexes;
// wm->numvertexes += 8;
r_skyedges = wm->edges + wm->numedges;
// wm->numedges += 12;
r_skysurfedges = wm->surfedges + wm->numsurfedges;
// wm->numsurfedges += 24;
Hunk_Check();
memset (r_skyfaces, 0, 6*sizeof(*r_skyfaces)); memset (r_skyfaces, 0, 6*sizeof(*r_skyfaces));
Hunk_Check();
for (i=0 ; i<6 ; i++) for (i=0 ; i<6 ; i++)
{ {
r_skyplanes[i].normal[skybox_planes[i*2]] = 1; r_skyplanes[i].normal[skybox_planes[i*2]] = 1;
@ -220,26 +227,30 @@ void R_InitSkyBox (void)
r_skyfaces[i].plane = &r_skyplanes[i]; r_skyfaces[i].plane = &r_skyplanes[i];
r_skyfaces[i].numedges = 4; r_skyfaces[i].numedges = 4;
r_skyfaces[i].flags = box_faces[i] | SURF_DRAWSKYBOX; r_skyfaces[i].flags = box_faces[i] | SURF_DRAWSKYBOX;
r_skyfaces[i].firstedge = wm->numsurfedges-24+i*4; r_skyfaces[i].firstedge = wm->numsurfedges+i*4;
r_skyfaces[i].texinfo = &r_skytexinfo[i]; r_skyfaces[i].texinfo = &r_skytexinfo[i];
r_skyfaces[i].texturemins[0] = -128; r_skyfaces[i].texturemins[0] = -128;
r_skyfaces[i].texturemins[1] = -128; r_skyfaces[i].texturemins[1] = -128;
r_skyfaces[i].extents[0] = 256; r_skyfaces[i].extents[0] = 256;
r_skyfaces[i].extents[1] = 256; r_skyfaces[i].extents[1] = 256;
} }
Hunk_Check();
for (i=0 ; i<24 ; i++) for (i=0 ; i<24 ; i++)
if (box_surfedges[i] > 0) if (box_surfedges[i] > 0)
r_skysurfedges[i] = wm->numedges-13 + box_surfedges[i]; r_skysurfedges[i] = wm->numedges-12 + box_surfedges[i];
else else
r_skysurfedges[i] = - (wm->numedges-13 + -box_surfedges[i]); r_skysurfedges[i] = - (wm->numedges-12 + -box_surfedges[i]);
Hunk_Check();
for(i=0 ; i<12 ; i++) for(i=0 ; i<12 ; i++)
{ {
r_skyedges[i].v[0] = wm->numvertexes-9+box_edges[i*2+0]; r_skyedges[i].v[0] = wm->numvertexes-8+box_edges[i*2+0];
r_skyedges[i].v[1] = wm->numvertexes-9+box_edges[i*2+1]; r_skyedges[i].v[1] = wm->numvertexes-8+box_edges[i*2+1];
r_skyedges[i].cachededgeoffset = 0; r_skyedges[i].cachededgeoffset = 0;
} }
Hunk_Check();
} }
/* /*

View file

@ -261,7 +261,7 @@ R_NewMap
void SWR_NewMap (void) void SWR_NewMap (void)
{ {
int i; int i;
memset (&r_worldentity, 0, sizeof(r_worldentity)); memset (&r_worldentity, 0, sizeof(r_worldentity));
AngleVectors(r_worldentity.angles, r_worldentity.axis[0], r_worldentity.axis[1], r_worldentity.axis[2]); AngleVectors(r_worldentity.angles, r_worldentity.axis[0], r_worldentity.axis[1], r_worldentity.axis[2]);
VectorInverse(r_worldentity.axis[1]); VectorInverse(r_worldentity.axis[1]);

View file

@ -2926,9 +2926,6 @@ void SWMod_LoadAlias3Model (model_t *mod, void *buffer)
vec3_t mins, maxs; vec3_t mins, maxs;
if (!strcmp(loadmodel->name, "progs/player.mdl") || if (!strcmp(loadmodel->name, "progs/player.mdl") ||
!strcmp(loadmodel->name, "progs/eyes.mdl")) { !strcmp(loadmodel->name, "progs/eyes.mdl")) {
unsigned short crc; unsigned short crc;
@ -3225,7 +3222,7 @@ void SWMod_LoadAlias3Model (model_t *mod, void *buffer)
// //
// move the complete, relocatable alias model to the cache // move the complete, relocatable alias model to the cache
// //
end = Hunk_LowMark (); end = Hunk_LowMark ();
total = end - start; total = end - start;

View file

@ -109,15 +109,20 @@ void R_GammaCorrectAndSetPalette(const unsigned char *pal)
void SWAppActivate(BOOL fActive, BOOL minimize) void SWAppActivate(BOOL fActive, BOOL minimize)
{ {
boolean newa;
Minimized = minimize; Minimized = minimize;
Key_ClearStates();
// we don't want to act like we're active if we're minimized // we don't want to act like we're active if we're minimized
if (fActive && !Minimized) if (fActive && !Minimized)
ActiveApp = true; newa = true;
else else
ActiveApp = false; newa = false;
if (ActiveApp == newa) //don't pause and resume these too often.
return;
ActiveApp = newa;
Key_ClearStates();
// minimize/restore mouse-capture on demand // minimize/restore mouse-capture on demand
if (!ActiveApp) if (!ActiveApp)