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; s->flags = 0;
if (i & RENDER_VIEWMODEL) if (i & RENDER_VIEWMODEL)
s->flags |= Q2RF_WEAPONMODEL|Q2RF_MINLIGHT|Q2RF_DEPTHHACK; s->flags |= Q2RF_WEAPONMODEL|Q2RF_MINLIGHT|Q2RF_DEPTHHACK;
if (i & RENDER_EXTERIORMODEL) if (i & RENDER_EXTERIORMODEL)
s->flags |= Q2RF_EXTERNALMODEL; s->flags |= Q2RF_EXTERNALMODEL;
} }
if (bits & E5_ORIGIN) if (bits & E5_ORIGIN)
@ -1882,6 +1882,10 @@ void CL_LinkPacketEntities (void)
if (state->effects & EF_NODEPTHTEST) if (state->effects & EF_NODEPTHTEST)
ent->flags |= RF_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 // set colormap
if (state->colormap && (state->colormap <= MAX_CLIENTS) if (state->colormap && (state->colormap <= MAX_CLIENTS)
&& (gl_nocolors.value == -1 || (ent->model/* && state->modelindex == cl_playerindex*/))) && (gl_nocolors.value == -1 || (ent->model/* && state->modelindex == cl_playerindex*/)))
@ -2658,6 +2662,7 @@ void CL_LinkPlayers (void)
vec3_t angles; vec3_t angles;
float *org; float *org;
qboolean predictplayers; qboolean predictplayers;
model_t *model;
if (!cl.worldmodel || cl.worldmodel->needload) if (!cl.worldmodel || cl.worldmodel->needload)
return; return;
@ -2694,13 +2699,18 @@ void CL_LinkPlayers (void)
if (info->spectator) if (info->spectator)
continue; 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 // spawn light flashes, even ones coming from invisible objects
if (r_powerupglow.value && !(r_powerupglow.value == 2 && j == cl.playernum[0]) if (r_powerupglow.value && !(r_powerupglow.value == 2 && j == cl.playernum[0])
&& (state->effects & (EF_BLUE|EF_RED|EF_BRIGHTLIGHT|EF_DIMLIGHT))) && (state->effects & (EF_BLUE|EF_RED|EF_BRIGHTLIGHT|EF_DIMLIGHT)))
{ {
vec3_t colour; vec3_t colour;
float radius; float radius;
org = (j == cl.playernum[0]) ? cl.simorg[0] : state->origin;
colour[0] = 0; colour[0] = 0;
colour[1] = 0; colour[1] = 0;
colour[2] = 0; colour[2] = 0;
@ -2737,6 +2747,13 @@ void CL_LinkPlayers (void)
if (radius) 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; 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; 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++; cl_numvisedicts++;
ent->keynum = j+1; ent->keynum = j+1;
ent->flags = 0; ent->flags = 0;
ent->model = model;
ent->forcedshader = NULL; 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; ent->skinnum = state->skinnum;
CL_UpdateNetFrameLerpState(false, state->frame, &cl.lerpplayers[j]); 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[1] = cl.simorg[pnum][1];
ent->origin[2] = cl.simorg[pnum][2]+cl.crouch[pnum]; ent->origin[2] = cl.simorg[pnum][2]+cl.crouch[pnum];
ent->flags |= Q2RF_EXTERNALMODEL; ent->flags |= Q2RF_EXTERNALMODEL;
ent->externalmodelview = (1<<pnum);
break; break;
} }
} }

View file

@ -46,6 +46,50 @@ cvar_t prox_inmenu = CVAR("prox_inmenu", "0");
usercmd_t independantphysics[MAX_SPLITS]; usercmd_t independantphysics[MAX_SPLITS];
vec3_t mousemovements[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; qboolean cursor_active;
void KeyDown (kbutton_t *b) void KeyDown (kbutton_t *b)
{ {
int k; int k;
char *c; char *c;
int pnum; int pnum = CL_TargettedSplit();
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--;
c = Cmd_Argv(1); c = Cmd_Argv(1);
if (c[0]) if (c[0])
@ -126,12 +168,7 @@ void KeyUp (kbutton_t *b)
int k; int k;
char *c; char *c;
int pnum; int pnum = CL_TargettedSplit();
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--;
c = Cmd_Argv(1); c = Cmd_Argv(1);
if (c[0]) if (c[0])
@ -161,15 +198,12 @@ void KeyUp (kbutton_t *b)
void IN_KLookDown (void) {KeyDown(&in_klook);} void IN_KLookDown (void) {KeyDown(&in_klook);}
void IN_KLookUp (void) {KeyUp(&in_klook);} void IN_KLookUp (void) {KeyUp(&in_klook);}
void IN_MLookDown (void) {KeyDown(&in_mlook);} void IN_MLookDown (void) {KeyDown(&in_mlook);}
void IN_MLookUp (void) { void IN_MLookUp (void)
char *c; {
int pnum; int pnum = CL_TargettedSplit();
c = Cmd_Argv(0); KeyUp(&in_mlook);
pnum = atoi(c+strlen(c)-1); if ( !(in_mlook.state[pnum]&1) && lookspring.ival)
if (pnum)pnum--; V_StartPitchDrift(pnum);
KeyUp(&in_mlook);
if ( !(in_mlook.state[pnum]&1) && lookspring.ival)
V_StartPitchDrift(pnum);
} }
void IN_UpDown(void) {KeyDown(&in_up);} void IN_UpDown(void) {KeyDown(&in_up);}
void IN_UpUp(void) {KeyUp(&in_up);} void IN_UpUp(void) {KeyUp(&in_up);}
@ -207,11 +241,7 @@ void IN_JumpDown (void)
qboolean condition; qboolean condition;
int pnum; int pnum = CL_TargettedSplit();
char *c;
c = Cmd_Argv(0);
pnum = atoi(c+strlen(c)-1);
if (pnum)pnum--;
@ -1766,132 +1796,6 @@ static char *VARGS vahunk(char *format, ...)
return ret; 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) void CL_SendCvar_f (void)
{ {
cvar_t *var; cvar_t *var;
@ -1915,9 +1819,9 @@ CL_InitInput
*/ */
void CL_InitInput (void) void CL_InitInput (void)
{ {
int sp;
#define inputnetworkcvargroup "client networking options" #define inputnetworkcvargroup "client networking options"
cl.splitclients = 1; cl.splitclients = 1;
CL_RegisterSplitCommands();
Cmd_AddCommand("rotate", IN_Rotate_f); Cmd_AddCommand("rotate", IN_Rotate_f);
Cmd_AddCommand("in_restart", IN_Restart); Cmd_AddCommand("in_restart", IN_Restart);
@ -1937,4 +1841,62 @@ void CL_InitInput (void)
Cvar_Register (&cl_prydoncursor, inputnetworkcvargroup); Cvar_Register (&cl_prydoncursor, inputnetworkcvargroup);
Cvar_Register (&cl_instantrotate, 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); NET_SendPacket (NS_CLIENT, strlen(data), data, adr);
cl.splitclients = 0; cl.splitclients = 0;
CL_RegisterSplitCommands();
} }
char *CL_TryingToConnect(void) char *CL_TryingToConnect(void)
@ -3644,8 +3643,6 @@ void Host_FinishInit(void)
Cbuf_AddText ("cl_warncmd 0\n", RESTRICT_LOCAL); 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? //who should we imitate?
qrc = COM_FDepthFile("quake.rc", true); //q1 qrc = COM_FDepthFile("quake.rc", true); //q1
hrc = COM_FDepthFile("hexen.rc", true); //h2 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.frames[i].playerstate[cl.playernum[0]].pm_type = PM_SPECTATOR;
cl.splitclients = 1; cl.splitclients = 1;
CL_RegisterSplitCommands();
} }
else else
{ {
@ -2183,7 +2182,6 @@ void CL_ParseServerData (void)
Host_EndGame("Server sent us too many alternate clients\n"); Host_EndGame("Server sent us too many alternate clients\n");
} }
cl.splitclients = clnum+1; cl.splitclients = clnum+1;
CL_RegisterSplitCommands();
} }
// get the full level name // get the full level name
@ -2330,7 +2328,6 @@ void CLQ2_ParseServerData (void)
// parse player entity number // parse player entity number
cl.playernum[0] = MSG_ReadShort (); cl.playernum[0] = MSG_ReadShort ();
cl.splitclients = 1; cl.splitclients = 1;
CL_RegisterSplitCommands();
cl.spectator = false; cl.spectator = false;
cl.numq2visibleweapons = 1; //give it a default. 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.splitclients = 1;
CL_RegisterSplitCommands();
gametype = MSG_ReadByte (); gametype = MSG_ReadByte ();
@ -3032,9 +3028,7 @@ void CLQ2_ParseConfigString (void)
} }
else if (i >= Q2CS_LIGHTS && i < Q2CS_LIGHTS+Q2MAX_LIGHTSTYLES) else if (i >= Q2CS_LIGHTS && i < Q2CS_LIGHTS+Q2MAX_LIGHTSTYLES)
{ {
#ifdef PEXT_LIGHTSTYLECOL
cl_lightstyle[i - Q2CS_LIGHTS].colour = 7; //white 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)); 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); 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); dl = CL_AllocDlight (-i);
VectorCopy (pl->origin, dl->origin); //set it's origin 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, dl->axis[0], dl->axis[1], dl->axis[2]);
AngleVectors (pl->viewangles, fv, rv, uv); //shift it up a little AngleVectors (pl->viewangles, fv, rv, uv); //shift it up a little
@ -4901,9 +4897,7 @@ void CL_ParseServerMessage (void)
i = MSG_ReadByte (); i = MSG_ReadByte ();
if (i >= MAX_LIGHTSTYLES) if (i >= MAX_LIGHTSTYLES)
Host_EndGame ("svc_lightstyle > MAX_LIGHTSTYLES"); Host_EndGame ("svc_lightstyle > MAX_LIGHTSTYLES");
#ifdef PEXT_LIGHTSTYLECOL
cl_lightstyle[i].colour = 7; //white cl_lightstyle[i].colour = 7; //white
#endif
Q_strncpyz (cl_lightstyle[i].map, MSG_ReadString(), sizeof(cl_lightstyle[i].map)); Q_strncpyz (cl_lightstyle[i].map, MSG_ReadString(), sizeof(cl_lightstyle[i].map));
cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map); cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map);
break; break;
@ -5771,9 +5765,7 @@ void CLNQ_ParseServerMessage (void)
MSG_ReadString(); MSG_ReadString();
break; break;
} }
#ifdef PEXT_LIGHTSTYLECOL
cl_lightstyle[i].colour = 7; //white cl_lightstyle[i].colour = 7; //white
#endif
Q_strncpyz (cl_lightstyle[i].map, MSG_ReadString(), sizeof(cl_lightstyle[i].map)); Q_strncpyz (cl_lightstyle[i].map, MSG_ReadString(), sizeof(cl_lightstyle[i].map));
cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map); cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map);
break; break;

View file

@ -419,7 +419,7 @@ void VQ3_AddEntity(const q3refEntity_t *q3)
if (q3->renderfx & Q3RF_DEPTHHACK) if (q3->renderfx & Q3RF_DEPTHHACK)
ent.flags |= Q2RF_DEPTHHACK; ent.flags |= Q2RF_DEPTHHACK;
if (q3->renderfx & Q3RF_THIRD_PERSON) if (q3->renderfx & Q3RF_THIRD_PERSON)
ent.flags |= Q2RF_EXTERNALMODEL; ent.externalmodelview = ~0;
if (q3->renderfx & Q3RF_NOSHADOW) if (q3->renderfx & Q3RF_NOSHADOW)
ent.flags |= RF_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) int QDECL CLGHL_keyevent(int key, int down)
{ {
if (key >= 241 && key <= 241+5) if (key >= 241 && key <= 241+5)
Key_Event(K_MOUSE1+key-241, 0, down); Key_Event(0, K_MOUSE1+key-241, 0, down);
else else
Con_Printf("CLGHL_keyevent: Unrecognised HL key code\n"); Con_Printf("CLGHL_keyevent: Unrecognised HL key code\n");
return true; //fixme: check the return type return true; //fixme: check the return type

View file

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

View file

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

View file

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

View file

@ -168,17 +168,17 @@ void IN_Commands(void)
if (imsgs[i].ie_Code == NM_BUTTON_FOURTH) 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)) 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) if (key)
{ {
Key_Event(key, 0, 1); Key_Event(0, key, 0, 1);
Key_Event(key, 0, 0); Key_Event(0, key, 0, 0);
} }
} }
@ -194,7 +194,7 @@ void IN_Commands(void)
key = keyconv[imsgs[i].ie_Code]; key = keyconv[imsgs[i].ie_Code];
if (key) if (key)
Key_Event(key, key, down); Key_Event(0, key, key, down);
else else
{ {
if (developer.value) if (developer.value)
@ -205,17 +205,17 @@ void IN_Commands(void)
else if (imsgs[i].ie_Class == IECLASS_RAWMOUSE) else if (imsgs[i].ie_Class == IECLASS_RAWMOUSE)
{ {
if (imsgs[i].ie_Code == IECODE_LBUTTON) 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)) 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) 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)) 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) 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)) 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_x+= imsgs[i].ie_position.ie_xy.ie_x;
mouse_y+= imsgs[i].ie_position.ie_xy.ie_y; 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_KEYUP:
case SDL_KEYDOWN: 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; break;
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
@ -277,7 +277,7 @@ void Sys_SendKeyEvents(void)
//Hmm. SDL allows for 255 buttons... //Hmm. SDL allows for 255 buttons...
if (event.button.button > sizeof(tbl_sdltoquakemouse)/sizeof(tbl_sdltoquakemouse[0])) if (event.button.button > sizeof(tbl_sdltoquakemouse)/sizeof(tbl_sdltoquakemouse[0]))
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; break;
case SDL_QUIT: case SDL_QUIT:

View file

@ -76,6 +76,7 @@ typedef struct {
} handles; } handles;
int numbuttons; int numbuttons;
int playerid;
volatile int buttons; volatile int buttons;
volatile int oldbuttons; volatile int oldbuttons;
@ -274,7 +275,6 @@ RAWINPUT *raw;
int ribuffersize; int ribuffersize;
cvar_t in_rawinput = SCVAR("in_rawinput", "0"); 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"); cvar_t in_rawinput_rdp = SCVAR("in_rawinput_rdp", "0");
void IN_RawInput_DeRegister(void); void IN_RawInput_DeRegister(void);
@ -376,11 +376,11 @@ void MW_Hook_Message (long buttons)
buttons &= 0xFFFF; buttons &= 0xFFFF;
switch (buttons ^ old_buttons) switch (buttons ^ old_buttons)
{ {
case 8: Key_Event(K_MOUSE4, 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(K_MOUSE5, 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(K_MOUSE6, 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(K_MOUSE7, 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(K_MOUSE8, 0, buttons > old_buttons ? true : false); break; case 128: Key_Event(0, K_MOUSE8, 0, buttons > old_buttons ? true : false); break;
default: break; default: break;
} }
@ -1008,7 +1008,7 @@ int IN_RawInput_Register(void)
int IN_RawInput_IsRDPMouse(char *cDeviceString) int IN_RawInput_IsRDPMouse(char *cDeviceString)
{ {
char cRDPString[] = "\\??\\Root#RDP_MOU#"; char cRDPString[] = "\\\\?\\Root#RDP_MOU#";
int i; int i;
if (strlen(cDeviceString) < strlen(cRDPString)) { if (strlen(cDeviceString) < strlen(cRDPString)) {
@ -1142,6 +1142,7 @@ void IN_RawInput_Init(void)
rawmice[rawmicecount].handles.rawinputhandle = pRawInputDeviceList[i].hDevice; rawmice[rawmicecount].handles.rawinputhandle = pRawInputDeviceList[i].hDevice;
rawmice[rawmicecount].numbuttons = 10; rawmice[rawmicecount].numbuttons = 10;
rawmice[rawmicecount].pos[0] = RI_INVALID_POS; rawmice[rawmicecount].pos[0] = RI_INVALID_POS;
rawmice[rawmicecount].playerid = rawmicecount;
rawmicecount++; rawmicecount++;
} }
} }
@ -1342,7 +1343,6 @@ void IN_Init (void)
#ifdef USINGRAWINPUT #ifdef USINGRAWINPUT
Cvar_Register (&in_rawinput, "Input Controls"); Cvar_Register (&in_rawinput, "Input Controls");
Cvar_Register (&in_rawinput_combine, "Input Controls");
Cvar_Register (&in_rawinput_rdp, "Input Controls"); Cvar_Register (&in_rawinput_rdp, "Input Controls");
#endif #endif
} }
@ -1395,13 +1395,13 @@ void IN_MouseEvent (int mstate)
if ( (mstate & (1<<i)) && if ( (mstate & (1<<i)) &&
!(sysmouse.oldbuttons & (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)) && if ( !(mstate & (1<<i)) &&
(sysmouse.oldbuttons & (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 i;
int wpnum;
wpnum = cl.splitclients;
if (wpnum < 1)
wpnum = 1;
wpnum = mouse->playerid % wpnum;
if (wpnum != pnum)
return;
// perform button actions // perform button actions
for (i=0 ; i<mouse->numbuttons ; i++) for (i=0 ; i<mouse->numbuttons ; i++)
{ {
if ( (mouse->buttons & (1<<i)) && if ( (mouse->buttons & (1<<i)) &&
!(mouse->oldbuttons & (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)) && if ( !(mouse->buttons & (1<<i)) &&
(mouse->oldbuttons & (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; mouse->oldbuttons = mouse->buttons;
@ -1444,15 +1452,15 @@ static void ProcessMouse(mouse_t *mouse, float *movements, int pnum)
{ {
while(mouse->wheeldelta <= -mfwt) while(mouse->wheeldelta <= -mfwt)
{ {
Key_Event (K_MWHEELUP, 0, true); Key_Event (pnum, K_MWHEELUP, 0, true);
Key_Event (K_MWHEELUP, 0, false); Key_Event (pnum, K_MWHEELUP, 0, false);
mouse->wheeldelta += mfwt; mouse->wheeldelta += mfwt;
} }
while(mouse->wheeldelta >= mfwt) while(mouse->wheeldelta >= mfwt)
{ {
Key_Event (K_MWHEELDOWN, 0, true); Key_Event (pnum, K_MWHEELDOWN, 0, true);
Key_Event (K_MWHEELDOWN, 0, false); Key_Event (pnum, K_MWHEELDOWN, 0, false);
mouse->wheeldelta -= mfwt; mouse->wheeldelta -= mfwt;
} }
} }
@ -1749,29 +1757,18 @@ void IN_MouseMove (float *movements, int pnum)
#ifdef USINGRAWINPUT #ifdef USINGRAWINPUT
if (rawmicecount) 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 ProcessMouse(rawmice + x, movements, pnum);
int x;
for (x = 0; x < rawmicecount; x++)
{
ProcessMouse(rawmice + x, movements, 0);
}
}
else if (pnum < rawmicecount)
{
ProcessMouse(rawmice + pnum, movements, pnum);
} }
} }
#endif #endif
if (pnum == 0) ProcessMouse(&sysmouse, movements, pnum);
ProcessMouse(&sysmouse, movements, pnum);
#ifdef SERIALMOUSE #ifdef SERIALMOUSE
if (pnum == 1 || cl.splitclients<2) ProcessMouse(&serialmouse, movements, pnum);
ProcessMouse(&serialmouse, movements, pnum);
#endif #endif
} }
@ -1827,6 +1824,7 @@ void IN_RawInput_MouseRead(HANDLE in_device_handle)
{ {
int i = 0, tbuttons, j; int i = 0, tbuttons, j;
int dwSize; int dwSize;
int pnum;
// get raw input // get raw input
if ((*_GRID)((HRAWINPUT)in_device_handle, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)) == -1) 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 ) { 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"); Con_Printf("Raw input: unable to add to get raw input header.\n");
return; return;
} }
// find mouse in our mouse list // find mouse in our mouse list
for (; i < rawmicecount; i++) 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 if (i == rawmicecount) // we're not tracking this mouse
return; return;
pnum = cl.splitclients;
if (pnum < 1)
pnum = 1;
pnum = rawmice[i].playerid % pnum;
// movement // movement
if (raw->data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) if (raw->data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE)
{ {
@ -1876,38 +1879,38 @@ void IN_RawInput_MouseRead(HANDLE in_device_handle)
// buttons // buttons
if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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 // mouse wheel
if (raw->data.mouse.usButtonFlags & RI_MOUSE_WHEEL) if (raw->data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
{ // If the current message has a mouse_wheel message { // If the current message has a mouse_wheel message
if ((SHORT)raw->data.mouse.usButtonData > 0) if ((SHORT)raw->data.mouse.usButtonData > 0)
{ {
Key_Event(K_MWHEELUP, 0, true); Key_Event(pnum, K_MWHEELUP, 0, true);
Key_Event(K_MWHEELUP, 0, false); Key_Event(pnum, K_MWHEELUP, 0, false);
} }
if ((SHORT)raw->data.mouse.usButtonData < 0) if ((SHORT)raw->data.mouse.usButtonData < 0)
{ {
Key_Event(K_MWHEELDOWN, 0, true); Key_Event(pnum, K_MWHEELDOWN, 0, true);
Key_Event(K_MWHEELDOWN, 0, false); 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)) ) 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)) ) 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)) ) if ( (buttonstate & (1<<i)) && !(joy_oldbuttonstate & (1<<i)) )
{ {
key_index = (i < 4) ? K_JOY1 : K_AUX1; 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)) ) if ( !(buttonstate & (1<<i)) && (joy_oldbuttonstate & (1<<i)) )
{ {
key_index = (i < 4) ? K_JOY1 : K_AUX1; 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; joy_oldbuttonstate = buttonstate;
@ -2178,12 +2181,12 @@ void IN_Commands (void)
{ {
if ( (povstate & (1<<i)) && !(joy_oldpovstate & (1<<i)) ) 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)) ) 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; 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! 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 *kb;
char cmd[1024]; char cmd[1024];
@ -1567,19 +1567,39 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
deltaused[key][keystate] = false; deltaused[key][keystate] = false;
kb = keybindings[key][keystate]; kb = keybindings[key][keystate];
if (kb && kb[0] == '+') if (pnum)
{ {
sprintf (cmd, "-%s %i\n", kb+1, key+oldstate*256); if (kb && kb[0] == '+')
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]); {
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] == '+') if (kb && kb[0] == '+')
{ {
sprintf (cmd, "-%s %i\n", kb+1, key+oldstate*256); sprintf (cmd, "-%s %i\n", kb+1, key+oldstate*256);
Cbuf_AddText (cmd, bindcmdlevel[key][keystate]); 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; return;
} }
@ -1612,17 +1632,36 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
{ {
deltaused[key][keystate] = true; deltaused[key][keystate] = true;
kb = keybindings[key][keystate]; kb = keybindings[key][keystate];
if (kb) if (pnum)
{ {
if (kb[0] == '+') if (kb)
{ // 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]); if (kb[0] == '+')
Cbuf_AddText ("\n", bindcmdlevel[key][keystate]); { // 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 int chat_bufferlen;
extern qboolean chat_team; 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_Init (void);
void Key_WriteBindings (vfsfile_t *f); void Key_WriteBindings (vfsfile_t *f);
void Key_SetBinding (int keynum, int modifier, char *binding, int cmdlevel); 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) if (rflags & CSQCRF_VIEWMODEL)
out->flags |= Q2RF_DEPTHHACK|Q2RF_WEAPONMODEL; out->flags |= Q2RF_DEPTHHACK|Q2RF_WEAPONMODEL;
if (rflags & CSQCRF_EXTERNALMODEL) if (rflags & CSQCRF_EXTERNALMODEL)
out->flags |= Q2RF_EXTERNALMODEL; out->externalmodelview = ~0;
if (rflags & CSQCRF_DEPTHHACK) if (rflags & CSQCRF_DEPTHHACK)
out->flags |= Q2RF_DEPTHHACK; out->flags |= Q2RF_DEPTHHACK;
if (rflags & CSQCRF_ADDITIVE) 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; int stride = LMBLOCK_WIDTH*lightmap_bytes;
if (!surf->samples && currentmodel->lightdata && ambient >= 0)
return;
shift += 7; // increase to base value shift += 7; // increase to base value
surf->cached_dlight = (surf->dlightframe == r_framecount); 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) else if (!currentmodel->lightdata)
{ {
/*fullbright if map is not lit*/
for (i=0 ; i<size*3 ; i++) for (i=0 ; i<size*3 ; i++)
{ {
blocklights[i] = 255*256; 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 else
{ {
// clear to no light // clear to no light
@ -1146,7 +1154,16 @@ static void Surf_BuildLightMap (msurface_t *surf, qbyte *dest, qbyte *deluxdest,
#endif #endif
{ {
// set to full bright if no light data // 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++) for (i=0 ; i<size ; i++)
blocklights[i] = 255*256; blocklights[i] = 255*256;
@ -1231,15 +1248,18 @@ void Surf_RenderDynamicLightmaps (msurface_t *fa, int shift)
return; return;
// check for lightmap modification // 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 ; for (maps = 0 ; maps < MAXLIGHTMAPS && fa->styles[maps] != 255 ;
maps++) maps++)
if (d_lightstylevalue[fa->styles[maps]] != fa->cached_light[maps] if (d_lightstylevalue[fa->styles[maps]] != fa->cached_light[maps]
#ifdef PEXT_LIGHTSTYLECOL || cl_lightstyle[fa->styles[maps]].colour != fa->cached_colour[maps])
|| cl_lightstyle[fa->styles[maps]].colour != fa->cached_colour[maps]
#endif
)
goto dynamic; goto dynamic;
} }

View file

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

View file

@ -428,19 +428,19 @@ LRESULT CALLBACK LowLevelKeyboardProc (INT nCode, WPARAM wParam, LPARAM lParam)
//Trap the Left Windowskey //Trap the Left Windowskey
if (pkbhs->vkCode == VK_LWIN) 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; return 1;
} }
//Trap the Right Windowskey //Trap the Right Windowskey
if (pkbhs->vkCode == VK_RWIN) 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; return 1;
} }
//Trap the Application Key (what a pointless key) //Trap the Application Key (what a pointless key)
if (pkbhs->vkCode == VK_APPS) 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; return 1;
} }

View file

@ -990,10 +990,15 @@ void V_CalcRefdef (int pnum)
V_CalcViewRoll (pnum); V_CalcViewRoll (pnum);
V_AddIdle (pnum); V_AddIdle (pnum);
if (view_message && view_message->flags & PF_GIB) if (cl.viewheight[pnum] == DEFAULT_VIEWHEIGHT)
r_refdef.vieworg[2] += 8; // gib view height {
else if (view_message && view_message->flags & PF_DEAD) if (view_message && view_message->flags & PF_GIB)
r_refdef.vieworg[2] -= 16; // corpse view height 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 else
r_refdef.vieworg[2] += cl.viewheight[pnum]; 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 ; for (maps = 0 ; maps < MAXLIGHTMAPS && fa->styles[maps] != 255 ;
maps++) maps++)
if (d_lightstylevalue[fa->styles[maps]] != fa->cached_light[maps] if (d_lightstylevalue[fa->styles[maps]] != fa->cached_light[maps]
#ifdef PEXT_LIGHTSTYLECOL
|| cl_lightstyle[fa->styles[maps]].colour != fa->cached_colour[maps] || cl_lightstyle[fa->styles[maps]].colour != fa->cached_colour[maps]
#endif
) )
{ {
goto dynamic; goto dynamic;

View file

@ -221,6 +221,17 @@ static texnums_t *GL_ChooseSkin(galiasinfo_t *inf, char *modelname, int surfnum,
unsigned int tc, bc; unsigned int tc, bc;
qboolean forced; 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) if ((e->model->engineflags & MDLF_NOTREPLACEMENTS) && !ruleset_allow_sensative_texture_replacements.ival)
forced = true; forced = true;
else else

View file

@ -1088,9 +1088,9 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n"));
tn.base = R_LoadReplacementTexture(mt->name, loadname, IF_NOALPHA); tn.base = R_LoadReplacementTexture(mt->name, loadname, IF_NOALPHA);
if (!TEXVALID(tn.base)) 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)) 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) if (r_fb_bmodels.value)
@ -1098,11 +1098,11 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n"));
snprintf(altname, sizeof(altname)-1, "%s_luma", mt->name); snprintf(altname, sizeof(altname)-1, "%s_luma", mt->name);
if (gl_load24bit.value) if (gl_load24bit.value)
{ {
tn.fullbright = R_LoadReplacementTexture(altname, loadname, IF_NOALPHA); tn.fullbright = R_LoadReplacementTexture(altname, loadname, IF_NOGAMMA);
if (!TEXVALID(tn.fullbright)) 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); 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; surf = cl.worldmodel->surfaces + node->firstsurface;
for (i=0 ; i<node->numsurfaces ; i++, surf++) 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; continue;
Surf_StainSurf(surf, parms); Surf_StainSurf(surf, parms);
} }

View file

@ -322,9 +322,7 @@ typedef struct msurface_s
qbyte styles[MAXLIGHTMAPS]; qbyte styles[MAXLIGHTMAPS];
int cached_light[MAXLIGHTMAPS]; // values currently used in lightmap int cached_light[MAXLIGHTMAPS]; // values currently used in lightmap
qboolean cached_dlight; // true if dynamic light in cache qboolean cached_dlight; // true if dynamic light in cache
#ifdef PEXT_LIGHTSTYLECOL
qbyte cached_colour[MAXLIGHTMAPS]; qbyte cached_colour[MAXLIGHTMAPS];
#endif
#ifndef NOSTAINS #ifndef NOSTAINS
qboolean stained; qboolean stained;
#endif #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) 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; return false;
if (!Cam_DrawPlayer(r_refdef.currentplayernum, e->keynum-1)) if (!Cam_DrawPlayer(r_refdef.currentplayernum, e->keynum-1))
return false; return false;

View file

@ -1942,19 +1942,20 @@ void Shader_SetPassFlush (shaderpass_t *pass, shaderpass_t *pass2)
#ifdef GLQUAKE #ifdef GLQUAKE
if (((pass->flags & SHADER_PASS_DETAIL) && !r_detailtextures.value) || if (((pass->flags & SHADER_PASS_DETAIL) && !r_detailtextures.value) ||
((pass2->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->flags & SHADER_PASS_VIDEOMAP) || (pass2->flags & SHADER_PASS_VIDEOMAP))
((pass->shaderbits & SBITS_ATEST_BITS) && !(pass2->shaderbits & SBITS_MISC_DEPTHEQUALONLY)))
{ {
return; return;
} }
if (pass2->rgbgen != RGB_GEN_IDENTITY || pass2->alphagen != ALPHA_GEN_IDENTITY) if (pass2->rgbgen != RGB_GEN_IDENTITY || pass2->alphagen != ALPHA_GEN_IDENTITY)
{
return; return;
}
if (pass->rgbgen != RGB_GEN_IDENTITY || pass->alphagen != ALPHA_GEN_IDENTITY) if (pass->rgbgen != RGB_GEN_IDENTITY || pass->alphagen != ALPHA_GEN_IDENTITY)
return; 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 // check if we can use multiple passes
if (pass2->blendmode == GL_DOT3_RGB_ARB) 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 // send an up event for each key, to make sure the server clears them all
for (i=0 ; i<256 ; i++) for (i=0 ; i<256 ; i++)
{ {
Key_Event (i, 0, false); Key_Event (0, i, 0, false);
} }
Key_ClearStates (); Key_ClearStates ();
@ -1682,13 +1682,13 @@ LONG WINAPI GLMainWndProc (
{ {
if ((short) HIWORD(wParam) > 0) if ((short) HIWORD(wParam) > 0)
{ {
Key_Event(K_MWHEELUP, 0, true); Key_Event(0, K_MWHEELUP, 0, true);
Key_Event(K_MWHEELUP, 0, false); Key_Event(0, K_MWHEELUP, 0, false);
} }
else else
{ {
Key_Event(K_MWHEELDOWN, 0, true); Key_Event(0, K_MWHEELDOWN, 0, true);
Key_Event(K_MWHEELDOWN, 0, false); Key_Event(0, K_MWHEELDOWN, 0, false);
} }
} }
break; break;

View file

@ -1468,9 +1468,6 @@ void SV_WritePlayersToClient (client_t *client, client_frame_t *frame, edict_t *
if (needcleanup < (j+1)) if (needcleanup < (j+1))
{ {
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)) if (needcleanup < (j+1))
{ {
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) if (needcleanup < e)
{ {
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; int e;
edict_t *ent; edict_t *ent;
vec3_t org;
if (!needcleanup) if (!needcleanup)
return; return;
@ -2767,7 +2759,16 @@ void SV_CleanupEnts(void)
{ {
ent = EDICT_NUM(svprogfuncs, e); ent = EDICT_NUM(svprogfuncs, e);
if ((int)ent->v->effects & EF_MUZZLEFLASH) if ((int)ent->v->effects & EF_MUZZLEFLASH)
{
ent->v->effects = (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; needcleanup=0;
} }

View file

@ -1814,7 +1814,8 @@ client_t *SVC_DirectConnect(void)
else else
maxpacketentities = MAX_STANDARD_PACKET_ENTITIES; 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; numssclients = 1;
if (!(protextsupported & PEXT_SPLITSCREEN)) if (!(protextsupported & PEXT_SPLITSCREEN))