Attempting to fix/rework splitscreen.

Removed the impulse2/+forward2 etc commands.
Added +p2, -p2, p2 commands as a prefixed command instead. don't use + or - on them (so '+p2 forward' to move player 2 forward), this permits a simple generic way to send commands to a single player from an input device.
rawinput mice will submit commands/movements based upon idx%maxsplits, they will correctly submit mouse clicks, which will be mapped through the +p2/+p3 commands as appropriate, so each mouse is purely for a single player.
Fixed player model visibility in splitscreen mode.
Ignoring allow_splitscreen for the local player, cl_splitscreen is technically now the only enabler (though you will need to configure rawinput or binds).
Added support for { texturename prefixes.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3582 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2010-08-14 00:15:07 +00:00
parent fd16657900
commit 2cad75bc69
28 changed files with 351 additions and 308 deletions

View File

@ -755,7 +755,7 @@ void DP5_ParseDelta(entity_state_t *s)
s->flags = 0;
if (i & RENDER_VIEWMODEL)
s->flags |= Q2RF_WEAPONMODEL|Q2RF_MINLIGHT|Q2RF_DEPTHHACK;
if (i & RENDER_EXTERIORMODEL)
if (i & RENDER_EXTERIORMODEL)
s->flags |= Q2RF_EXTERNALMODEL;
}
if (bits & E5_ORIGIN)
@ -1882,6 +1882,10 @@ void CL_LinkPacketEntities (void)
if (state->effects & EF_NODEPTHTEST)
ent->flags |= RF_NODEPTHTEST;
/*FIXME: pay attention to tags instead, so nexuiz can work with splitscreen*/
if (ent->flags & Q2RF_EXTERNALMODEL)
ent->externalmodelview = ~0;
// set colormap
if (state->colormap && (state->colormap <= MAX_CLIENTS)
&& (gl_nocolors.value == -1 || (ent->model/* && state->modelindex == cl_playerindex*/)))
@ -2658,6 +2662,7 @@ void CL_LinkPlayers (void)
vec3_t angles;
float *org;
qboolean predictplayers;
model_t *model;
if (!cl.worldmodel || cl.worldmodel->needload)
return;
@ -2694,13 +2699,18 @@ void CL_LinkPlayers (void)
if (info->spectator)
continue;
//the extra modelindex check is to stop lame mods from using vweps with rings
if (state->command.impulse && cl.model_precache_vwep[0] && state->modelindex == cl_playerindex)
model = cl.model_precache_vwep[0];
else
model = cl.model_precache[state->modelindex];
// spawn light flashes, even ones coming from invisible objects
if (r_powerupglow.value && !(r_powerupglow.value == 2 && j == cl.playernum[0])
&& (state->effects & (EF_BLUE|EF_RED|EF_BRIGHTLIGHT|EF_DIMLIGHT)))
{
vec3_t colour;
float radius;
org = (j == cl.playernum[0]) ? cl.simorg[0] : state->origin;
colour[0] = 0;
colour[1] = 0;
colour[2] = 0;
@ -2737,6 +2747,13 @@ void CL_LinkPlayers (void)
if (radius)
{
vec3_t org;
int i;
VectorCopy(state->origin, org);
for (pnum = 0; pnum < cl.splitclients; pnum++)
VectorCopy(cl.simorg[pnum], org);
org[2] -= model->mins[2];
org[2] += 24;
radius += r_lightflicker.value?(rand()&31):0;
CL_NewDlightRGB(j+1, org, radius, 0.1, colour[0], colour[1], colour[2])->flags &= ~LFLAG_ALLOW_FLASH;
}
@ -2758,13 +2775,9 @@ void CL_LinkPlayers (void)
cl_numvisedicts++;
ent->keynum = j+1;
ent->flags = 0;
ent->model = model;
ent->forcedshader = NULL;
//the extra modelindex check is to stop lame mods from using vweps with rings
if (state->command.impulse && cl.model_precache_vwep[0] && state->modelindex == cl_playerindex)
ent->model = cl.model_precache_vwep[0];
else
ent->model = cl.model_precache[state->modelindex];
ent->skinnum = state->skinnum;
CL_UpdateNetFrameLerpState(false, state->frame, &cl.lerpplayers[j]);
@ -2809,6 +2822,7 @@ void CL_LinkPlayers (void)
ent->origin[1] = cl.simorg[pnum][1];
ent->origin[2] = cl.simorg[pnum][2]+cl.crouch[pnum];
ent->flags |= Q2RF_EXTERNALMODEL;
ent->externalmodelview = (1<<pnum);
break;
}
}

View File

@ -46,6 +46,50 @@ cvar_t prox_inmenu = CVAR("prox_inmenu", "0");
usercmd_t independantphysics[MAX_SPLITS];
vec3_t mousemovements[MAX_SPLITS];
/*kinda a hack...*/
int con_splitmodifier;
cvar_t cl_defaultsplitclient = CVAR("cl_defaultsplitclient", "0");
int CL_TargettedSplit(void)
{
char *c;
int pnum;
if (!cl.splitclients)
return 0;
c = Cmd_Argv(0);
pnum = atoi(c+strlen(c)-1);
if (pnum && !(c[1] == 'b'&&c[2] == 'u' && !atoi(c+strlen(c)-2)))
{
pnum--;
return pnum;
}
if (con_splitmodifier > 0)
return (con_splitmodifier - 1)% cl.splitclients;
else if (cl_defaultsplitclient.ival > 0)
return cl_defaultsplitclient.ival % cl.splitclients;
else
return 0;
}
void CL_Split_f(void)
{
int tmp;
char *c;
c = Cmd_Argv(0);
tmp = con_splitmodifier;
if (*c == '+' || *c == '-')
{
con_splitmodifier = c[2];
Cmd_ExecuteString(va("%c%s", *c, Cmd_Args()), Cmd_ExecLevel);
}
else
{
con_splitmodifier = c[1];
Cmd_ExecuteString(Cmd_Args(), Cmd_ExecLevel);
}
con_splitmodifier = tmp;
}
/*
===============================================================================
@ -85,17 +129,15 @@ float cursor_screen[2];
qboolean cursor_active;
void KeyDown (kbutton_t *b)
{
int k;
char *c;
int pnum;
c = Cmd_Argv(0);
pnum = atoi(c+strlen(c)-1);
if (c[1] == 'b'&&c[2] == 'u' && !atoi(c+strlen(c)-2))
pnum = 0;
else if (pnum)pnum--;
int pnum = CL_TargettedSplit();
c = Cmd_Argv(1);
if (c[0])
@ -126,12 +168,7 @@ void KeyUp (kbutton_t *b)
int k;
char *c;
int pnum;
c = Cmd_Argv(0);
pnum = atoi(c+strlen(c)-1);
if (c[1] == 'b'&&c[2] == 'u' && !atoi(c+strlen(c)-2))
pnum = 0;
else if (pnum)pnum--;
int pnum = CL_TargettedSplit();
c = Cmd_Argv(1);
if (c[0])
@ -161,15 +198,12 @@ void KeyUp (kbutton_t *b)
void IN_KLookDown (void) {KeyDown(&in_klook);}
void IN_KLookUp (void) {KeyUp(&in_klook);}
void IN_MLookDown (void) {KeyDown(&in_mlook);}
void IN_MLookUp (void) {
char *c;
int pnum;
c = Cmd_Argv(0);
pnum = atoi(c+strlen(c)-1);
if (pnum)pnum--;
KeyUp(&in_mlook);
if ( !(in_mlook.state[pnum]&1) && lookspring.ival)
V_StartPitchDrift(pnum);
void IN_MLookUp (void)
{
int pnum = CL_TargettedSplit();
KeyUp(&in_mlook);
if ( !(in_mlook.state[pnum]&1) && lookspring.ival)
V_StartPitchDrift(pnum);
}
void IN_UpDown(void) {KeyDown(&in_up);}
void IN_UpUp(void) {KeyUp(&in_up);}
@ -207,11 +241,7 @@ void IN_JumpDown (void)
qboolean condition;
int pnum;
char *c;
c = Cmd_Argv(0);
pnum = atoi(c+strlen(c)-1);
if (pnum)pnum--;
int pnum = CL_TargettedSplit();
@ -1766,132 +1796,6 @@ static char *VARGS vahunk(char *format, ...)
return ret;
}
void CL_RegisterSplitCommands(void)
{
static int oldsplit;
char spn[8];
int sp;
for (sp = 0; sp < MAX_SPLITS; sp++)
{
if (sp)
sprintf(spn, "%i", sp+1);
else
*spn = '\0';
if (sp < cl.splitclients)
{
if (oldsplit & (1<<sp))
continue;
oldsplit |= (1<<sp);
Cmd_AddRemCommand (vahunk("+moveup%s", spn), IN_UpDown);
Cmd_AddRemCommand (vahunk("-moveup%s", spn), IN_UpUp);
Cmd_AddRemCommand (vahunk("+movedown%s", spn), IN_DownDown);
Cmd_AddRemCommand (vahunk("-movedown%s", spn), IN_DownUp);
Cmd_AddRemCommand (vahunk("+left%s", spn), IN_LeftDown);
Cmd_AddRemCommand (vahunk("-left%s", spn), IN_LeftUp);
Cmd_AddRemCommand (vahunk("+right%s", spn), IN_RightDown);
Cmd_AddRemCommand (vahunk("-right%s", spn), IN_RightUp);
Cmd_AddRemCommand (vahunk("+forward%s", spn), IN_ForwardDown);
Cmd_AddRemCommand (vahunk("-forward%s", spn), IN_ForwardUp);
Cmd_AddRemCommand (vahunk("+back%s", spn), IN_BackDown);
Cmd_AddRemCommand (vahunk("-back%s", spn), IN_BackUp);
Cmd_AddRemCommand (vahunk("+lookup%s", spn), IN_LookupDown);
Cmd_AddRemCommand (vahunk("-lookup%s", spn), IN_LookupUp);
Cmd_AddRemCommand (vahunk("+lookdown%s", spn), IN_LookdownDown);
Cmd_AddRemCommand (vahunk("-lookdown%s", spn), IN_LookdownUp);
Cmd_AddRemCommand (vahunk("+strafe%s", spn), IN_StrafeDown);
Cmd_AddRemCommand (vahunk("-strafe%s", spn), IN_StrafeUp);
Cmd_AddRemCommand (vahunk("+moveleft%s", spn), IN_MoveleftDown);
Cmd_AddRemCommand (vahunk("-moveleft%s", spn), IN_MoveleftUp);
Cmd_AddRemCommand (vahunk("+moveright%s", spn), IN_MoverightDown);
Cmd_AddRemCommand (vahunk("-moveright%s", spn), IN_MoverightUp);
Cmd_AddRemCommand (vahunk("+speed%s", spn), IN_SpeedDown);
Cmd_AddRemCommand (vahunk("-speed%s", spn), IN_SpeedUp);
Cmd_AddRemCommand (vahunk("+attack%s", spn), IN_AttackDown);
Cmd_AddRemCommand (vahunk("-attack%s", spn), IN_AttackUp);
Cmd_AddRemCommand (vahunk("+use%s", spn), IN_UseDown);
Cmd_AddRemCommand (vahunk("-use%s", spn), IN_UseUp);
Cmd_AddRemCommand (vahunk("+jump%s", spn), IN_JumpDown);
Cmd_AddRemCommand (vahunk("-jump%s", spn), IN_JumpUp);
Cmd_AddRemCommand (vahunk("impulse%s", spn), IN_Impulse);
Cmd_AddRemCommand (vahunk("+klook%s", spn), IN_KLookDown);
Cmd_AddRemCommand (vahunk("-klook%s", spn), IN_KLookUp);
Cmd_AddRemCommand (vahunk("+mlook%s", spn), IN_MLookDown);
Cmd_AddRemCommand (vahunk("-mlook%s", spn), IN_MLookUp);
Cmd_AddRemCommand (vahunk("+button3%s", spn), IN_Button3Down);
Cmd_AddRemCommand (vahunk("-button3%s", spn), IN_Button3Up);
Cmd_AddRemCommand (vahunk("+button4%s", spn), IN_Button4Down);
Cmd_AddRemCommand (vahunk("-button4%s", spn), IN_Button4Up);
Cmd_AddRemCommand (vahunk("+button5%s", spn), IN_Button5Down);
Cmd_AddRemCommand (vahunk("-button5%s", spn), IN_Button5Up);
Cmd_AddRemCommand (vahunk("+button6%s", spn), IN_Button6Down);
Cmd_AddRemCommand (vahunk("-button6%s", spn), IN_Button6Up);
Cmd_AddRemCommand (vahunk("+button7%s", spn), IN_Button7Down);
Cmd_AddRemCommand (vahunk("-button7%s", spn), IN_Button7Up);
Cmd_AddRemCommand (vahunk("+button8%s", spn), IN_Button8Down);
Cmd_AddRemCommand (vahunk("-button8%s", spn), IN_Button8Up);
}
else
{
if (!(oldsplit & (1<<sp)))
continue;
oldsplit &= ~(1<<sp);
Cmd_RemoveCommand (vahunk("+moveup%s", spn));
Cmd_RemoveCommand (vahunk("-moveup%s", spn));
Cmd_RemoveCommand (vahunk("+movedown%s", spn));
Cmd_RemoveCommand (vahunk("-movedown%s", spn));
Cmd_RemoveCommand (vahunk("+left%s", spn));
Cmd_RemoveCommand (vahunk("-left%s", spn));
Cmd_RemoveCommand (vahunk("+right%s", spn));
Cmd_RemoveCommand (vahunk("-right%s", spn));
Cmd_RemoveCommand (vahunk("+forward%s", spn));
Cmd_RemoveCommand (vahunk("-forward%s", spn));
Cmd_RemoveCommand (vahunk("+back%s", spn));
Cmd_RemoveCommand (vahunk("-back%s", spn));
Cmd_RemoveCommand (vahunk("+lookup%s", spn));
Cmd_RemoveCommand (vahunk("-lookup%s", spn));
Cmd_RemoveCommand (vahunk("+lookdown%s", spn));
Cmd_RemoveCommand (vahunk("-lookdown%s", spn));
Cmd_RemoveCommand (vahunk("+strafe%s", spn));
Cmd_RemoveCommand (vahunk("-strafe%s", spn));
Cmd_RemoveCommand (vahunk("+moveleft%s", spn));
Cmd_RemoveCommand (vahunk("-moveleft%s", spn));
Cmd_RemoveCommand (vahunk("+moveright%s", spn));
Cmd_RemoveCommand (vahunk("-moveright%s", spn));
Cmd_RemoveCommand (vahunk("+speed%s", spn));
Cmd_RemoveCommand (vahunk("-speed%s", spn));
Cmd_RemoveCommand (vahunk("+attack%s", spn));
Cmd_RemoveCommand (vahunk("-attack%s", spn));
Cmd_RemoveCommand (vahunk("+use%s", spn));
Cmd_RemoveCommand (vahunk("-use%s", spn));
Cmd_RemoveCommand (vahunk("+jump%s", spn));
Cmd_RemoveCommand (vahunk("-jump%s", spn));
Cmd_RemoveCommand (vahunk("impulse%s", spn));
Cmd_RemoveCommand (vahunk("+klook%s", spn));
Cmd_RemoveCommand (vahunk("-klook%s", spn));
Cmd_RemoveCommand (vahunk("+mlook%s", spn));
Cmd_RemoveCommand (vahunk("-mlook%s", spn));
Cmd_RemoveCommand (vahunk("+button3%s", spn));
Cmd_RemoveCommand (vahunk("-button3%s", spn));
Cmd_RemoveCommand (vahunk("+button4%s", spn));
Cmd_RemoveCommand (vahunk("-button4%s", spn));
Cmd_RemoveCommand (vahunk("+button5%s", spn));
Cmd_RemoveCommand (vahunk("-button5%s", spn));
Cmd_RemoveCommand (vahunk("+button6%s", spn));
Cmd_RemoveCommand (vahunk("-button6%s", spn));
Cmd_RemoveCommand (vahunk("+button7%s", spn));
Cmd_RemoveCommand (vahunk("-button7%s", spn));
Cmd_RemoveCommand (vahunk("+button8%s", spn));
Cmd_RemoveCommand (vahunk("-button8%s", spn));
}
}
}
void CL_SendCvar_f (void)
{
cvar_t *var;
@ -1915,9 +1819,9 @@ CL_InitInput
*/
void CL_InitInput (void)
{
int sp;
#define inputnetworkcvargroup "client networking options"
cl.splitclients = 1;
CL_RegisterSplitCommands();
Cmd_AddCommand("rotate", IN_Rotate_f);
Cmd_AddCommand("in_restart", IN_Restart);
@ -1937,4 +1841,62 @@ void CL_InitInput (void)
Cvar_Register (&cl_prydoncursor, inputnetworkcvargroup);
Cvar_Register (&cl_instantrotate, inputnetworkcvargroup);
Cvar_Register (&cl_defaultsplitclient, inputnetworkcvargroup);
for (sp = 0; sp < MAX_SPLITS; sp++)
{
Cmd_AddRemCommand (vahunk("p%i", sp+1), CL_Split_f);
Cmd_AddRemCommand (vahunk("+p%i", sp+1), CL_Split_f);
Cmd_AddRemCommand (vahunk("-p%i", sp+1), CL_Split_f);
in_mlook.state[sp] = 1;
}
Cmd_AddCommand ("+moveup", IN_UpDown);
Cmd_AddCommand ("-moveup", IN_UpUp);
Cmd_AddCommand ("+movedown", IN_DownDown);
Cmd_AddCommand ("-movedown", IN_DownUp);
Cmd_AddCommand ("+left", IN_LeftDown);
Cmd_AddCommand ("-left", IN_LeftUp);
Cmd_AddCommand ("+right", IN_RightDown);
Cmd_AddCommand ("-right", IN_RightUp);
Cmd_AddCommand ("+forward", IN_ForwardDown);
Cmd_AddCommand ("-forward", IN_ForwardUp);
Cmd_AddCommand ("+back", IN_BackDown);
Cmd_AddCommand ("-back", IN_BackUp);
Cmd_AddCommand ("+lookup", IN_LookupDown);
Cmd_AddCommand ("-lookup", IN_LookupUp);
Cmd_AddCommand ("+lookdown", IN_LookdownDown);
Cmd_AddCommand ("-lookdown", IN_LookdownUp);
Cmd_AddCommand ("+strafe", IN_StrafeDown);
Cmd_AddCommand ("-strafe", IN_StrafeUp);
Cmd_AddCommand ("+moveleft", IN_MoveleftDown);
Cmd_AddCommand ("-moveleft", IN_MoveleftUp);
Cmd_AddCommand ("+moveright", IN_MoverightDown);
Cmd_AddCommand ("-moveright", IN_MoverightUp);
Cmd_AddCommand ("+speed", IN_SpeedDown);
Cmd_AddCommand ("-speed", IN_SpeedUp);
Cmd_AddCommand ("+attack", IN_AttackDown);
Cmd_AddCommand ("-attack", IN_AttackUp);
Cmd_AddCommand ("+use", IN_UseDown);
Cmd_AddCommand ("-use", IN_UseUp);
Cmd_AddCommand ("+jump", IN_JumpDown);
Cmd_AddCommand ("-jump", IN_JumpUp);
Cmd_AddCommand ("impulse", IN_Impulse);
Cmd_AddCommand ("+klook", IN_KLookDown);
Cmd_AddCommand ("-klook", IN_KLookUp);
Cmd_AddCommand ("+mlook", IN_MLookDown);
Cmd_AddCommand ("-mlooks", IN_MLookUp);
Cmd_AddCommand ("+button3", IN_Button3Down);
Cmd_AddCommand ("-button3", IN_Button3Up);
Cmd_AddCommand ("+button4", IN_Button4Down);
Cmd_AddCommand ("-button4", IN_Button4Up);
Cmd_AddCommand ("+button5", IN_Button5Down);
Cmd_AddCommand ("-button5", IN_Button5Up);
Cmd_AddCommand ("+button6", IN_Button6Down);
Cmd_AddCommand ("-button6", IN_Button6Up);
Cmd_AddCommand ("+button7", IN_Button7Down);
Cmd_AddCommand ("-button7", IN_Button7Up);
Cmd_AddCommand ("+button8", IN_Button8Down);
Cmd_AddCommand ("-button8", IN_Button8Up);
}

View File

@ -573,7 +573,6 @@ void CL_SendConnectPacket (
NET_SendPacket (NS_CLIENT, strlen(data), data, adr);
cl.splitclients = 0;
CL_RegisterSplitCommands();
}
char *CL_TryingToConnect(void)
@ -3644,8 +3643,6 @@ void Host_FinishInit(void)
Cbuf_AddText ("cl_warncmd 0\n", RESTRICT_LOCAL);
Cbuf_AddText ("+mlook\n", RESTRICT_LOCAL); //fixme: this is bulky, only exec one of these.
//who should we imitate?
qrc = COM_FDepthFile("quake.rc", true); //q1
hrc = COM_FDepthFile("hexen.rc", true); //h2

View File

@ -2156,7 +2156,6 @@ void CL_ParseServerData (void)
cl.frames[i].playerstate[cl.playernum[0]].pm_type = PM_SPECTATOR;
cl.splitclients = 1;
CL_RegisterSplitCommands();
}
else
{
@ -2183,7 +2182,6 @@ void CL_ParseServerData (void)
Host_EndGame("Server sent us too many alternate clients\n");
}
cl.splitclients = clnum+1;
CL_RegisterSplitCommands();
}
// get the full level name
@ -2330,7 +2328,6 @@ void CLQ2_ParseServerData (void)
// parse player entity number
cl.playernum[0] = MSG_ReadShort ();
cl.splitclients = 1;
CL_RegisterSplitCommands();
cl.spectator = false;
cl.numq2visibleweapons = 1; //give it a default.
@ -2458,7 +2455,6 @@ void CLNQ_ParseServerData(void) //Doesn't change gamedir - use with caution.
}
cl.splitclients = 1;
CL_RegisterSplitCommands();
gametype = MSG_ReadByte ();
@ -3032,9 +3028,7 @@ void CLQ2_ParseConfigString (void)
}
else if (i >= Q2CS_LIGHTS && i < Q2CS_LIGHTS+Q2MAX_LIGHTSTYLES)
{
#ifdef PEXT_LIGHTSTYLECOL
cl_lightstyle[i - Q2CS_LIGHTS].colour = 7; //white
#endif
Q_strncpyz (cl_lightstyle[i - Q2CS_LIGHTS].map, s, sizeof(cl_lightstyle[i-Q2CS_LIGHTS].map));
cl_lightstyle[i - Q2CS_LIGHTS].length = Q_strlen(cl_lightstyle[i - Q2CS_LIGHTS].map);
@ -3899,6 +3893,8 @@ void CL_MuzzleFlash (int destsplit)
dl = CL_AllocDlight (-i);
VectorCopy (pl->origin, dl->origin); //set it's origin
if (pl->hullnum & 0x80) /*hull is 0-based, so origin is bottom of model, move the light up slightly*/
dl->origin[2] += 24;
AngleVectors(pl->viewangles, dl->axis[0], dl->axis[1], dl->axis[2]);
AngleVectors (pl->viewangles, fv, rv, uv); //shift it up a little
@ -4901,9 +4897,7 @@ void CL_ParseServerMessage (void)
i = MSG_ReadByte ();
if (i >= MAX_LIGHTSTYLES)
Host_EndGame ("svc_lightstyle > MAX_LIGHTSTYLES");
#ifdef PEXT_LIGHTSTYLECOL
cl_lightstyle[i].colour = 7; //white
#endif
Q_strncpyz (cl_lightstyle[i].map, MSG_ReadString(), sizeof(cl_lightstyle[i].map));
cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map);
break;
@ -5771,9 +5765,7 @@ void CLNQ_ParseServerMessage (void)
MSG_ReadString();
break;
}
#ifdef PEXT_LIGHTSTYLECOL
cl_lightstyle[i].colour = 7; //white
#endif
Q_strncpyz (cl_lightstyle[i].map, MSG_ReadString(), sizeof(cl_lightstyle[i].map));
cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map);
break;

View File

@ -419,7 +419,7 @@ void VQ3_AddEntity(const q3refEntity_t *q3)
if (q3->renderfx & Q3RF_DEPTHHACK)
ent.flags |= Q2RF_DEPTHHACK;
if (q3->renderfx & Q3RF_THIRD_PERSON)
ent.flags |= Q2RF_EXTERNALMODEL;
ent.externalmodelview = ~0;
if (q3->renderfx & Q3RF_NOSHADOW)
ent.flags |= RF_NOSHADOW;

View File

@ -755,7 +755,7 @@ int QDECL CLGHL_checkparm(char *str, const char **next)
int QDECL CLGHL_keyevent(int key, int down)
{
if (key >= 241 && key <= 241+5)
Key_Event(K_MOUSE1+key-241, 0, down);
Key_Event(0, K_MOUSE1+key-241, 0, down);
else
Con_Printf("CLGHL_keyevent: Unrecognised HL key code\n");
return true; //fixme: check the return type

View File

@ -821,7 +821,6 @@ extern float in_sensitivityscale;
void CL_MakeActive(char *gamename);
void CL_RegisterSplitCommands(void);
void CL_InitInput (void);
void CL_SendCmd (double frametime, qboolean mainloop);
void CL_SendMove (usercmd_t *cmd);

View File

@ -1497,6 +1497,9 @@ void CLQ2_AddPacketEntities (q2frame_t *frame)
else
ent.flags = renderfx;
if (renderfx & Q2RF_EXTERNALMODEL)
ent.externalmodelview = ~0;
// calculate angles
if (effects & Q2EF_ROTATE)
{ // some bonus items auto-rotate

View File

@ -596,7 +596,6 @@ void CLQ3_ParseGameState(void)
CL_MakeActive("Quake3Arena");
cl.splitclients = 1;
CL_RegisterSplitCommands();
{
char buffer[2048];
@ -1020,7 +1019,6 @@ void CLQ3_SendConnectPacket(netadr_t to)
memset(&ccs, 0, sizeof(ccs));
cl.splitclients = 1;
CL_RegisterSplitCommands();
msg.data = data;
msg.cursize = 0;
msg.overflowed = msg.allowoverflow = 0;

View File

@ -168,17 +168,17 @@ void IN_Commands(void)
if (imsgs[i].ie_Code == NM_BUTTON_FOURTH)
{
Key_Event(K_MOUSE4, 0, true);
Key_Event(0, K_MOUSE4, 0, true);
}
else if (imsgs[i].ie_Code == (NM_BUTTON_FOURTH|IECODE_UP_PREFIX))
{
Key_Event(K_MOUSE4, 0, false);
Key_Event(0, K_MOUSE4, 0, false);
}
if (key)
{
Key_Event(key, 0, 1);
Key_Event(key, 0, 0);
Key_Event(0, key, 0, 1);
Key_Event(0, key, 0, 0);
}
}
@ -194,7 +194,7 @@ void IN_Commands(void)
key = keyconv[imsgs[i].ie_Code];
if (key)
Key_Event(key, key, down);
Key_Event(0, key, key, down);
else
{
if (developer.value)
@ -205,17 +205,17 @@ void IN_Commands(void)
else if (imsgs[i].ie_Class == IECLASS_RAWMOUSE)
{
if (imsgs[i].ie_Code == IECODE_LBUTTON)
Key_Event(K_MOUSE1, 0, true);
Key_Event(0, K_MOUSE1, 0, true);
else if (imsgs[i].ie_Code == (IECODE_LBUTTON|IECODE_UP_PREFIX))
Key_Event(K_MOUSE1, 0, false);
Key_Event(0, K_MOUSE1, 0, false);
else if (imsgs[i].ie_Code == IECODE_RBUTTON)
Key_Event(K_MOUSE2, 0, true);
Key_Event(0, K_MOUSE2, 0, true);
else if (imsgs[i].ie_Code == (IECODE_RBUTTON|IECODE_UP_PREFIX))
Key_Event(K_MOUSE2, 0, false);
Key_Event(0, K_MOUSE2, 0, false);
else if (imsgs[i].ie_Code == IECODE_MBUTTON)
Key_Event(K_MOUSE3, 0, true);
Key_Event(0, K_MOUSE3, 0, true);
else if (imsgs[i].ie_Code == (IECODE_MBUTTON|IECODE_UP_PREFIX))
Key_Event(K_MOUSE3, 0, false);
Key_Event(0, K_MOUSE3, 0, false);
mouse_x+= imsgs[i].ie_position.ie_xy.ie_x;
mouse_y+= imsgs[i].ie_position.ie_xy.ie_y;

View File

@ -264,7 +264,7 @@ void Sys_SendKeyEvents(void)
case SDL_KEYUP:
case SDL_KEYDOWN:
Key_Event(tbl_sdltoquake[event.key.keysym.sym], event.key.keysym.unicode, event.key.state);
Key_Event(0, tbl_sdltoquake[event.key.keysym.sym], event.key.keysym.unicode, event.key.state);
break;
case SDL_MOUSEMOTION:
@ -277,7 +277,7 @@ void Sys_SendKeyEvents(void)
//Hmm. SDL allows for 255 buttons...
if (event.button.button > sizeof(tbl_sdltoquakemouse)/sizeof(tbl_sdltoquakemouse[0]))
event.button.button = sizeof(tbl_sdltoquakemouse)/sizeof(tbl_sdltoquakemouse[0]);
Key_Event(tbl_sdltoquakemouse[event.button.button-1], 0, event.button.state);
Key_Event(0, tbl_sdltoquakemouse[event.button.button-1], 0, event.button.state);
break;
case SDL_QUIT:

View File

@ -76,6 +76,7 @@ typedef struct {
} handles;
int numbuttons;
int playerid;
volatile int buttons;
volatile int oldbuttons;
@ -274,7 +275,6 @@ RAWINPUT *raw;
int ribuffersize;
cvar_t in_rawinput = SCVAR("in_rawinput", "0");
cvar_t in_rawinput_combine = SCVAR("in_rawinput_combine", "0");
cvar_t in_rawinput_rdp = SCVAR("in_rawinput_rdp", "0");
void IN_RawInput_DeRegister(void);
@ -376,11 +376,11 @@ void MW_Hook_Message (long buttons)
buttons &= 0xFFFF;
switch (buttons ^ old_buttons)
{
case 8: Key_Event(K_MOUSE4, 0, buttons > old_buttons ? true : false); break;
case 16: Key_Event(K_MOUSE5, 0, buttons > old_buttons ? true : false); break;
case 32: Key_Event(K_MOUSE6, 0, buttons > old_buttons ? true : false); break;
case 64: Key_Event(K_MOUSE7, 0, buttons > old_buttons ? true : false); break;
case 128: Key_Event(K_MOUSE8, 0, buttons > old_buttons ? true : false); break;
case 8: Key_Event(0, K_MOUSE4, 0, buttons > old_buttons ? true : false); break;
case 16: Key_Event(0, K_MOUSE5, 0, buttons > old_buttons ? true : false); break;
case 32: Key_Event(0, K_MOUSE6, 0, buttons > old_buttons ? true : false); break;
case 64: Key_Event(0, K_MOUSE7, 0, buttons > old_buttons ? true : false); break;
case 128: Key_Event(0, K_MOUSE8, 0, buttons > old_buttons ? true : false); break;
default: break;
}
@ -1008,7 +1008,7 @@ int IN_RawInput_Register(void)
int IN_RawInput_IsRDPMouse(char *cDeviceString)
{
char cRDPString[] = "\\??\\Root#RDP_MOU#";
char cRDPString[] = "\\\\?\\Root#RDP_MOU#";
int i;
if (strlen(cDeviceString) < strlen(cRDPString)) {
@ -1142,6 +1142,7 @@ void IN_RawInput_Init(void)
rawmice[rawmicecount].handles.rawinputhandle = pRawInputDeviceList[i].hDevice;
rawmice[rawmicecount].numbuttons = 10;
rawmice[rawmicecount].pos[0] = RI_INVALID_POS;
rawmice[rawmicecount].playerid = rawmicecount;
rawmicecount++;
}
}
@ -1342,7 +1343,6 @@ void IN_Init (void)
#ifdef USINGRAWINPUT
Cvar_Register (&in_rawinput, "Input Controls");
Cvar_Register (&in_rawinput_combine, "Input Controls");
Cvar_Register (&in_rawinput_rdp, "Input Controls");
#endif
}
@ -1395,13 +1395,13 @@ void IN_MouseEvent (int mstate)
if ( (mstate & (1<<i)) &&
!(sysmouse.oldbuttons & (1<<i)) )
{
Key_Event (K_MOUSE1 + i, 0, true);
Key_Event (0, K_MOUSE1 + i, 0, true);
}
if ( !(mstate & (1<<i)) &&
(sysmouse.oldbuttons & (1<<i)) )
{
Key_Event (K_MOUSE1 + i, 0, false);
Key_Event (0, K_MOUSE1 + i, 0, false);
}
}
@ -1420,19 +1420,27 @@ static void ProcessMouse(mouse_t *mouse, float *movements, int pnum)
int i;
int wpnum;
wpnum = cl.splitclients;
if (wpnum < 1)
wpnum = 1;
wpnum = mouse->playerid % wpnum;
if (wpnum != pnum)
return;
// perform button actions
for (i=0 ; i<mouse->numbuttons ; i++)
{
if ( (mouse->buttons & (1<<i)) &&
!(mouse->oldbuttons & (1<<i)) )
{
Key_Event (K_MOUSE1 + i, 0, true);
Key_Event (pnum, K_MOUSE1 + i, 0, true);
}
if ( !(mouse->buttons & (1<<i)) &&
(mouse->oldbuttons & (1<<i)) )
{
Key_Event (K_MOUSE1 + i, 0, false);
Key_Event (pnum, K_MOUSE1 + i, 0, false);
}
}
mouse->oldbuttons = mouse->buttons;
@ -1444,15 +1452,15 @@ static void ProcessMouse(mouse_t *mouse, float *movements, int pnum)
{
while(mouse->wheeldelta <= -mfwt)
{
Key_Event (K_MWHEELUP, 0, true);
Key_Event (K_MWHEELUP, 0, false);
Key_Event (pnum, K_MWHEELUP, 0, true);
Key_Event (pnum, K_MWHEELUP, 0, false);
mouse->wheeldelta += mfwt;
}
while(mouse->wheeldelta >= mfwt)
{
Key_Event (K_MWHEELDOWN, 0, true);
Key_Event (K_MWHEELDOWN, 0, false);
Key_Event (pnum, K_MWHEELDOWN, 0, true);
Key_Event (pnum, K_MWHEELDOWN, 0, false);
mouse->wheeldelta -= mfwt;
}
}
@ -1749,29 +1757,18 @@ void IN_MouseMove (float *movements, int pnum)
#ifdef USINGRAWINPUT
if (rawmicecount)
{
if ((in_rawinput_combine.value && pnum == 0) || cl.splitclients <= 1)
int x;
for (x = 0; x < rawmicecount; x++)
{
// not the right way to do this but it'll work for now
int x;
for (x = 0; x < rawmicecount; x++)
{
ProcessMouse(rawmice + x, movements, 0);
}
}
else if (pnum < rawmicecount)
{
ProcessMouse(rawmice + pnum, movements, pnum);
ProcessMouse(rawmice + x, movements, pnum);
}
}
#endif
if (pnum == 0)
ProcessMouse(&sysmouse, movements, pnum);
ProcessMouse(&sysmouse, movements, pnum);
#ifdef SERIALMOUSE
if (pnum == 1 || cl.splitclients<2)
ProcessMouse(&serialmouse, movements, pnum);
ProcessMouse(&serialmouse, movements, pnum);
#endif
}
@ -1827,6 +1824,7 @@ void IN_RawInput_MouseRead(HANDLE in_device_handle)
{
int i = 0, tbuttons, j;
int dwSize;
int pnum;
// get raw input
if ((*_GRID)((HRAWINPUT)in_device_handle, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)) == -1)
@ -1844,7 +1842,7 @@ void IN_RawInput_MouseRead(HANDLE in_device_handle)
if ((*_GRID)((HRAWINPUT)in_device_handle, RID_INPUT, raw, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize ) {
Con_Printf("Raw input: unable to add to get raw input header.\n");
return;
}
}
// find mouse in our mouse list
for (; i < rawmicecount; i++)
@ -1856,6 +1854,11 @@ void IN_RawInput_MouseRead(HANDLE in_device_handle)
if (i == rawmicecount) // we're not tracking this mouse
return;
pnum = cl.splitclients;
if (pnum < 1)
pnum = 1;
pnum = rawmice[i].playerid % pnum;
// movement
if (raw->data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE)
{
@ -1876,38 +1879,38 @@ void IN_RawInput_MouseRead(HANDLE in_device_handle)
// buttons
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN)
Key_Event(K_MOUSE1, 0, true);
Key_Event(pnum, K_MOUSE1, 0, true);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP)
Key_Event(K_MOUSE1, 0, false);
Key_Event(pnum, K_MOUSE1, 0, false);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN)
Key_Event(K_MOUSE2, 0, true);
Key_Event(pnum, K_MOUSE2, 0, true);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP)
Key_Event(K_MOUSE2, 0, false);
Key_Event(pnum, K_MOUSE2, 0, false);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN)
Key_Event(K_MOUSE3, 0, true);
Key_Event(pnum, K_MOUSE3, 0, true);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP)
Key_Event(K_MOUSE3, 0, false);
Key_Event(pnum, K_MOUSE3, 0, false);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN)
Key_Event(K_MOUSE4, 0, true);
Key_Event(pnum, K_MOUSE4, 0, true);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP)
Key_Event(K_MOUSE4, 0, false);
Key_Event(pnum, K_MOUSE4, 0, false);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN)
Key_Event(K_MOUSE5, 0, true);
Key_Event(pnum, K_MOUSE5, 0, true);
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP)
Key_Event(K_MOUSE5, 0, false);
Key_Event(pnum, K_MOUSE5, 0, false);
// mouse wheel
if (raw->data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
{ // If the current message has a mouse_wheel message
if ((SHORT)raw->data.mouse.usButtonData > 0)
{
Key_Event(K_MWHEELUP, 0, true);
Key_Event(K_MWHEELUP, 0, false);
Key_Event(pnum, K_MWHEELUP, 0, true);
Key_Event(pnum, K_MWHEELUP, 0, false);
}
if ((SHORT)raw->data.mouse.usButtonData < 0)
{
Key_Event(K_MWHEELDOWN, 0, true);
Key_Event(K_MWHEELDOWN, 0, false);
Key_Event(pnum, K_MWHEELDOWN, 0, true);
Key_Event(pnum, K_MWHEELDOWN, 0, false);
}
}
@ -1917,12 +1920,12 @@ void IN_RawInput_MouseRead(HANDLE in_device_handle)
{
if ( (tbuttons & (1<<j)) && !(rawmice[i].buttons & (1<<j)) )
{
Key_Event (K_MOUSE1 + j, 0, true);
Key_Event (pnum, K_MOUSE1 + j, 0, true);
}
if ( !(tbuttons & (1<<j)) && (rawmice[i].buttons & (1<<j)) )
{
Key_Event (K_MOUSE1 + j, 0, false);
Key_Event (pnum, K_MOUSE1 + j, 0, false);
}
}
@ -2145,13 +2148,13 @@ void IN_Commands (void)
if ( (buttonstate & (1<<i)) && !(joy_oldbuttonstate & (1<<i)) )
{
key_index = (i < 4) ? K_JOY1 : K_AUX1;
Key_Event (key_index + i, 0, true);
Key_Event (0, key_index + i, 0, true);
}
if ( !(buttonstate & (1<<i)) && (joy_oldbuttonstate & (1<<i)) )
{
key_index = (i < 4) ? K_JOY1 : K_AUX1;
Key_Event (key_index + i, 0, false);
Key_Event (0, key_index + i, 0, false);
}
}
joy_oldbuttonstate = buttonstate;
@ -2178,12 +2181,12 @@ void IN_Commands (void)
{
if ( (povstate & (1<<i)) && !(joy_oldpovstate & (1<<i)) )
{
Key_Event (K_AUX29 + i, 0, true);
Key_Event (0, K_AUX29 + i, 0, true);
}
if ( !(povstate & (1<<i)) && (joy_oldpovstate & (1<<i)) )
{
Key_Event (K_AUX29 + i, 0, false);
Key_Event (0, K_AUX29 + i, 0, false);
}
}
joy_oldpovstate = povstate;
@ -2554,5 +2557,5 @@ void IN_TranslateKeyEvent(WPARAM wParam, LPARAM lParam, qboolean down)
}
}
Key_Event (qcode, unicode, down);
Key_Event (0, qcode, unicode, down);
}

View File

@ -1336,7 +1336,7 @@ Called by the system between frames for both key up and key down events
Should NOT be called during an interrupt!
===================
*/
void Key_Event (int key, unsigned int unicode, qboolean down)
void Key_Event (int pnum, int key, unsigned int unicode, qboolean down)
{
char *kb;
char cmd[1024];
@ -1567,19 +1567,39 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
deltaused[key][keystate] = false;
kb = keybindings[key][keystate];
if (kb && kb[0] == '+')
if (pnum)
{
sprintf (cmd, "-%s %i\n", kb+1, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
if (kb && kb[0] == '+')
{
sprintf (cmd, "-p%i %s %i\n", pnum+1, kb+1, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
}
if (keyshift[key] != key)
{
kb = keybindings[keyshift[key]][keystate];
if (kb && kb[0] == '+')
{
sprintf (cmd, "-p%i %s %i\n", pnum+1, kb+1, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
}
}
}
if (keyshift[key] != key)
else
{
kb = keybindings[keyshift[key]][keystate];
if (kb && kb[0] == '+')
{
sprintf (cmd, "-%s %i\n", kb+1, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
}
if (keyshift[key] != key)
{
kb = keybindings[keyshift[key]][keystate];
if (kb && kb[0] == '+')
{
sprintf (cmd, "-%s %i\n", kb+1, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
}
}
}
return;
}
@ -1612,17 +1632,36 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
{
deltaused[key][keystate] = true;
kb = keybindings[key][keystate];
if (kb)
if (pnum)
{
if (kb[0] == '+')
{ // button commands add keynum as a parm
sprintf (cmd, "%s %i\n", kb, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
}
else
if (kb)
{
Cbuf_AddText (kb, bindcmdlevel[key][keystate]);
Cbuf_AddText ("\n", bindcmdlevel[key][keystate]);
if (kb[0] == '+')
{ // button commands add keynum as a parm
sprintf (cmd, "+p%i %s %i\n", pnum+1, kb+1, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
}
else
{
sprintf (cmd, "+p%i %s\n", pnum+1, kb+1, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
}
}
}
else
{
if (kb)
{
if (kb[0] == '+')
{ // button commands add keynum as a parm
sprintf (cmd, "%s %i\n", kb, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]);
}
else
{
Cbuf_AddText (kb, bindcmdlevel[key][keystate]);
Cbuf_AddText ("\n", bindcmdlevel[key][keystate]);
}
}
}

View File

@ -176,7 +176,7 @@ extern char chat_buffer[];
extern int chat_bufferlen;
extern qboolean chat_team;
void Key_Event (int key, unsigned int unicode, qboolean down);
void Key_Event (int pnum, int key, unsigned int unicode, qboolean down);
void Key_Init (void);
void Key_WriteBindings (vfsfile_t *f);
void Key_SetBinding (int keynum, int modifier, char *binding, int cmdlevel);

View File

@ -688,7 +688,7 @@ static qboolean CopyCSQCEdictToEntity(csqcedict_t *in, entity_t *out)
if (rflags & CSQCRF_VIEWMODEL)
out->flags |= Q2RF_DEPTHHACK|Q2RF_WEAPONMODEL;
if (rflags & CSQCRF_EXTERNALMODEL)
out->flags |= Q2RF_EXTERNALMODEL;
out->externalmodelview = ~0;
if (rflags & CSQCRF_DEPTHHACK)
out->flags |= Q2RF_DEPTHHACK;
if (rflags & CSQCRF_ADDITIVE)

View File

@ -941,9 +941,6 @@ static void Surf_BuildLightMap (msurface_t *surf, qbyte *dest, qbyte *deluxdest,
int stride = LMBLOCK_WIDTH*lightmap_bytes;
if (!surf->samples && currentmodel->lightdata && ambient >= 0)
return;
shift += 7; // increase to base value
surf->cached_dlight = (surf->dlightframe == r_framecount);
@ -988,11 +985,22 @@ static void Surf_BuildLightMap (msurface_t *surf, qbyte *dest, qbyte *deluxdest,
}
else if (!currentmodel->lightdata)
{
/*fullbright if map is not lit*/
for (i=0 ; i<size*3 ; i++)
{
blocklights[i] = 255*256;
}
}
else if (!surf->samples)
{
/*no samples, but map is otherwise lit = pure black*/
for (i=0 ; i<size*3 ; i++)
{
blocklights[i] = 0;
}
surf->cached_light[0] = 0;
surf->cached_colour[0] = 0;
}
else
{
// clear to no light
@ -1146,7 +1154,16 @@ static void Surf_BuildLightMap (msurface_t *surf, qbyte *dest, qbyte *deluxdest,
#endif
{
// set to full bright if no light data
if (r_fullbright.ival || !currentmodel->lightdata)
if (!surf->samples || !currentmodel->lightdata)
{
for (i=0 ; i<size*3 ; i++)
{
blocklights[i] = 255*256;
}
surf->cached_light[0] = d_lightstylevalue[0];
surf->cached_colour[0] = cl_lightstyle[0].colour;
}
else if (r_fullbright.ival)
{
for (i=0 ; i<size ; i++)
blocklights[i] = 255*256;
@ -1231,15 +1248,18 @@ void Surf_RenderDynamicLightmaps (msurface_t *fa, int shift)
return;
// check for lightmap modification
// if (cl.worldmodel->fromgame != fg_quake3) //no lightstyles on q3 maps
if (!fa->samples)
{
if (d_lightstylevalue[0] != fa->cached_light[0]
|| cl_lightstyle[0].colour != fa->cached_colour[0])
goto dynamic;
}
else
{
for (maps = 0 ; maps < MAXLIGHTMAPS && fa->styles[maps] != 255 ;
maps++)
if (d_lightstylevalue[fa->styles[maps]] != fa->cached_light[maps]
#ifdef PEXT_LIGHTSTYLECOL
|| cl_lightstyle[fa->styles[maps]].colour != fa->cached_colour[maps]
#endif
)
|| cl_lightstyle[fa->styles[maps]].colour != fa->cached_colour[maps])
goto dynamic;
}

View File

@ -106,6 +106,7 @@ typedef struct entity_s
framestate_t framestate;
unsigned int externalmodelview;
int flags;
refEntityType_t rtype;

View File

@ -428,19 +428,19 @@ LRESULT CALLBACK LowLevelKeyboardProc (INT nCode, WPARAM wParam, LPARAM lParam)
//Trap the Left Windowskey
if (pkbhs->vkCode == VK_LWIN)
{
Key_Event (K_LWIN, 0, !(pkbhs->flags & LLKHF_UP));
Key_Event (0, K_LWIN, 0, !(pkbhs->flags & LLKHF_UP));
return 1;
}
//Trap the Right Windowskey
if (pkbhs->vkCode == VK_RWIN)
{
Key_Event (K_RWIN, 0, !(pkbhs->flags & LLKHF_UP));
Key_Event (0, K_RWIN, 0, !(pkbhs->flags & LLKHF_UP));
return 1;
}
//Trap the Application Key (what a pointless key)
if (pkbhs->vkCode == VK_APPS)
{
Key_Event (K_APP, 0, !(pkbhs->flags & LLKHF_UP));
Key_Event (0, K_APP, 0, !(pkbhs->flags & LLKHF_UP));
return 1;
}

View File

@ -990,10 +990,15 @@ void V_CalcRefdef (int pnum)
V_CalcViewRoll (pnum);
V_AddIdle (pnum);
if (view_message && view_message->flags & PF_GIB)
r_refdef.vieworg[2] += 8; // gib view height
else if (view_message && view_message->flags & PF_DEAD)
r_refdef.vieworg[2] -= 16; // corpse view height
if (cl.viewheight[pnum] == DEFAULT_VIEWHEIGHT)
{
if (view_message && view_message->flags & PF_GIB)
r_refdef.vieworg[2] += 8; // gib view height
else if (view_message && view_message->flags & PF_DEAD)
r_refdef.vieworg[2] -= 16; // corpse view height
else
r_refdef.vieworg[2] += DEFAULT_VIEWHEIGHT;
}
else
r_refdef.vieworg[2] += cl.viewheight[pnum];

View File

@ -1172,9 +1172,7 @@ void D3DR_RenderDynamicLightmaps (msurface_t *fa, int shift)
for (maps = 0 ; maps < MAXLIGHTMAPS && fa->styles[maps] != 255 ;
maps++)
if (d_lightstylevalue[fa->styles[maps]] != fa->cached_light[maps]
#ifdef PEXT_LIGHTSTYLECOL
|| cl_lightstyle[fa->styles[maps]].colour != fa->cached_colour[maps]
#endif
)
{
goto dynamic;

View File

@ -221,6 +221,17 @@ static texnums_t *GL_ChooseSkin(galiasinfo_t *inf, char *modelname, int surfnum,
unsigned int tc, bc;
qboolean forced;
if (e->skinnum >= 100 && e->skinnum < 110)
{
shader_t *s;
s = R_RegisterSkin(va("gfx/skin%d.lmp", e->skinnum));
if (!TEXVALID(s->defaulttextures.base))
s->defaulttextures.base = R_LoadHiResTexture(va("gfx/skin%d.lmp", e->skinnum), NULL, 0);
s->defaulttextures.shader = s;
return &s->defaulttextures;
}
if ((e->model->engineflags & MDLF_NOTREPLACEMENTS) && !ruleset_allow_sensative_texture_replacements.ival)
forced = true;
else

View File

@ -1088,9 +1088,9 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n"));
tn.base = R_LoadReplacementTexture(mt->name, loadname, IF_NOALPHA);
if (!TEXVALID(tn.base))
{
tn.base = R_LoadReplacementTexture(mt->name, "bmodels", IF_NOALPHA);
tn.base = R_LoadReplacementTexture(mt->name, "bmodels", (*mt->name == '{')?0:IF_NOALPHA);
if (!TEXVALID(tn.base))
tn.base = R_LoadTexture8 (mt->name, mipwidth, mipheight, mipbase, IF_NOALPHA, 1);
tn.base = R_LoadTexture8 (mt->name, mipwidth, mipheight, mipbase, (*mt->name == '{')?0:IF_NOALPHA, 1);
}
if (r_fb_bmodels.value)
@ -1098,11 +1098,11 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n"));
snprintf(altname, sizeof(altname)-1, "%s_luma", mt->name);
if (gl_load24bit.value)
{
tn.fullbright = R_LoadReplacementTexture(altname, loadname, IF_NOALPHA);
tn.fullbright = R_LoadReplacementTexture(altname, loadname, IF_NOGAMMA);
if (!TEXVALID(tn.fullbright))
tn.fullbright = R_LoadReplacementTexture(altname, "bmodels", IF_NOALPHA);
tn.fullbright = R_LoadReplacementTexture(altname, "bmodels", IF_NOGAMMA);
}
if (!TEXVALID(tn.fullbright)) //generate one (if possible).
if ((*mt->name != '{') && !TEXVALID(tn.fullbright)) //generate one (if possible).
tn.fullbright = R_LoadTextureFB(altname, mipwidth, mipheight, mipbase, IF_NOGAMMA);
}
}
@ -2670,7 +2670,7 @@ static void Q1BSP_StainNode (mnode_t *node, float *parms)
surf = cl.worldmodel->surfaces + node->firstsurface;
for (i=0 ; i<node->numsurfaces ; i++, surf++)
{
if (surf->flags&~(SURF_DONTWARP|SURF_PLANEBACK))
if (surf->flags&~(SURF_DRAWALPHA|SURF_DONTWARP|SURF_PLANEBACK))
continue;
Surf_StainSurf(surf, parms);
}

View File

@ -322,9 +322,7 @@ typedef struct msurface_s
qbyte styles[MAXLIGHTMAPS];
int cached_light[MAXLIGHTMAPS]; // values currently used in lightmap
qboolean cached_dlight; // true if dynamic light in cache
#ifdef PEXT_LIGHTSTYLECOL
qbyte cached_colour[MAXLIGHTMAPS];
#endif
#ifndef NOSTAINS
qboolean stained;
#endif

View File

@ -947,7 +947,7 @@ This is where they're filtered (based on which view is currently being drawn).
*/
qboolean R_ShouldDraw(entity_t *e)
{
if (e->flags & Q2RF_EXTERNALMODEL && !r_refdef.externalview)
if (!r_refdef.externalview && (e->externalmodelview & (1<<r_refdef.currentplayernum)))
return false;
if (!Cam_DrawPlayer(r_refdef.currentplayernum, e->keynum-1))
return false;

View File

@ -1942,19 +1942,20 @@ void Shader_SetPassFlush (shaderpass_t *pass, shaderpass_t *pass2)
#ifdef GLQUAKE
if (((pass->flags & SHADER_PASS_DETAIL) && !r_detailtextures.value) ||
((pass2->flags & SHADER_PASS_DETAIL) && !r_detailtextures.value) ||
(pass->flags & SHADER_PASS_VIDEOMAP) || (pass2->flags & SHADER_PASS_VIDEOMAP) ||
((pass->shaderbits & SBITS_ATEST_BITS) && !(pass2->shaderbits & SBITS_MISC_DEPTHEQUALONLY)))
(pass->flags & SHADER_PASS_VIDEOMAP) || (pass2->flags & SHADER_PASS_VIDEOMAP))
{
return;
}
if (pass2->rgbgen != RGB_GEN_IDENTITY || pass2->alphagen != ALPHA_GEN_IDENTITY)
{
return;
}
if (pass->rgbgen != RGB_GEN_IDENTITY || pass->alphagen != ALPHA_GEN_IDENTITY)
return;
/*if its alphatest, don't merge with anything other than lightmap*/
if ((pass->shaderbits & SBITS_ATEST_BITS) && (!(pass2->shaderbits & SBITS_MISC_DEPTHEQUALONLY) || pass2->texgen != T_GEN_LIGHTMAP))
return;
// check if we can use multiple passes
if (pass2->blendmode == GL_DOT3_RGB_ARB)
{

View File

@ -1471,7 +1471,7 @@ void ClearAllStates (void)
// send an up event for each key, to make sure the server clears them all
for (i=0 ; i<256 ; i++)
{
Key_Event (i, 0, false);
Key_Event (0, i, 0, false);
}
Key_ClearStates ();
@ -1682,13 +1682,13 @@ LONG WINAPI GLMainWndProc (
{
if ((short) HIWORD(wParam) > 0)
{
Key_Event(K_MWHEELUP, 0, true);
Key_Event(K_MWHEELUP, 0, false);
Key_Event(0, K_MWHEELUP, 0, true);
Key_Event(0, K_MWHEELUP, 0, false);
}
else
{
Key_Event(K_MWHEELDOWN, 0, true);
Key_Event(K_MWHEELDOWN, 0, false);
Key_Event(0, K_MWHEELDOWN, 0, true);
Key_Event(0, K_MWHEELDOWN, 0, false);
}
}
break;

View File

@ -1468,9 +1468,6 @@ void SV_WritePlayersToClient (client_t *client, client_frame_t *frame, edict_t *
if (needcleanup < (j+1))
{
needcleanup = (j+1);
MSG_WriteByte(&sv.multicast, svc_muzzleflash);
MSG_WriteShort(&sv.multicast, (j+1));
SV_Multicast(ent->v->origin, MULTICAST_PVS);
}
}
}
@ -1691,9 +1688,6 @@ void SV_WritePlayersToClient (client_t *client, client_frame_t *frame, edict_t *
if (needcleanup < (j+1))
{
needcleanup = (j+1);
MSG_WriteByte(&sv.multicast, svc_muzzleflash);
MSG_WriteShort(&sv.multicast, (j+1));
SV_Multicast(ent->v->origin, MULTICAST_PVS);
}
}
}
@ -2418,9 +2412,6 @@ void SV_Snapshot_BuildQ1(client_t *client, packet_entities_t *pack, qbyte *pvs,
if (needcleanup < e)
{
needcleanup = e;
MSG_WriteByte(&sv.multicast, svc_muzzleflash);
MSG_WriteShort(&sv.multicast, e);
SV_Multicast(ent->v->origin, MULTICAST_PVS);
}
}
}
@ -2759,6 +2750,7 @@ void SV_CleanupEnts(void)
{
int e;
edict_t *ent;
vec3_t org;
if (!needcleanup)
return;
@ -2767,7 +2759,16 @@ void SV_CleanupEnts(void)
{
ent = EDICT_NUM(svprogfuncs, e);
if ((int)ent->v->effects & EF_MUZZLEFLASH)
{
ent->v->effects = (int)ent->v->effects & ~EF_MUZZLEFLASH;
MSG_WriteByte(&sv.multicast, svc_muzzleflash);
MSG_WriteShort(&sv.multicast, e);
VectorCopy(ent->v->origin, org);
if (progstype == PROG_H2)
org[2] += 24;
SV_Multicast(org, MULTICAST_PVS);
}
}
needcleanup=0;
}

View File

@ -1814,7 +1814,8 @@ client_t *SVC_DirectConnect(void)
else
maxpacketentities = MAX_STANDARD_PACKET_ENTITIES;
if (!sv_allow_splitscreen.ival)
/*allow_splitscreen applies only to non-local clients, so that clients have only one enabler*/
if (!sv_allow_splitscreen.ival && net_from.type != NA_LOOPBACK)
numssclients = 1;
if (!(protextsupported & PEXT_SPLITSCREEN))