reworked menusys combo items, as per mushi's request. should be a bit prettier now.

fixed most gcc warnings when compiling for linux.
client can now connect to 10002 servers. probably 10000+10001 too, but too lazy to test.
doom3 map loading is working again, but has too many issues for it to be useful (leaks, premature purges, no texture_d suffix support), so its still disabled for now.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4999 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2016-02-15 06:01:17 +00:00
parent 46c63cbedb
commit 5920bf05fb
98 changed files with 1037 additions and 763 deletions

View File

@ -1104,6 +1104,7 @@ ifneq (,$(findstring linux,$(FTE_TARGET)))
SV_DIR=sv_linux$(BITS) SV_DIR=sv_linux$(BITS)
SV_EXE_NAME=../fteqw.sv$(BITS) SV_EXE_NAME=../fteqw.sv$(BITS)
SV_LDFLAGS= SV_LDFLAGS=
SV_CFLAGS=$(SERVER_ONLY_CFLAGS) -DMULTITHREAD
NPFTE_OBJS=httpclient.o image.o sys_linux_threads.o sys_npfte.o sys_axfte.o sys_plugfte.o NPFTE_OBJS=httpclient.o image.o sys_linux_threads.o sys_npfte.o sys_axfte.o sys_plugfte.o
NPFTE_DLL_NAME=../npfte$(BITS).so NPFTE_DLL_NAME=../npfte$(BITS).so

View File

@ -1739,10 +1739,11 @@ int AAS_AreaRouteToGoalArea(int areanum, vec3_t origin, int goalareanum, int tra
// into the portal area // into the portal area
t += aasworld.portalmaxtraveltimes[portalnum]; t += aasworld.portalmaxtraveltimes[portalnum];
// //
*reachnum = aasworld.areasettings[areanum].firstreachablearea +
areacache->reachabilities[clusterareanum];
if (origin) if (origin)
{ {
*reachnum = aasworld.areasettings[areanum].firstreachablearea +
areacache->reachabilities[clusterareanum];
reach = aasworld.reachability + *reachnum; reach = aasworld.reachability + *reachnum;
t += AAS_AreaTravelTime(areanum, origin, reach->start); t += AAS_AreaTravelTime(areanum, origin, reach->start);
} //end if } //end if

View File

@ -919,7 +919,6 @@ void Cam_Track(playerview_t *pv, usercmd_t *cmd)
void Cam_SetModAutoTrack(int userid) void Cam_SetModAutoTrack(int userid)
{ //this is a hint from the server about who to track { //this is a hint from the server about who to track
int slot; int slot;
playerview_t *pv = &cl.playerview[0];
cl.autotrack_hint = -1; cl.autotrack_hint = -1;
for (slot = 0; slot < cl.allocated_client_slots; slot++) for (slot = 0; slot < cl.allocated_client_slots; slot++)
{ {

View File

@ -397,8 +397,9 @@ typedef struct {
size_t maxfrags; size_t maxfrags;
size_t numfrags; size_t numfrags;
} q3markFragment_ctx_t; } q3markFragment_ctx_t;
static void CG_MarkFragments_Callback(q3markFragment_ctx_t *ctx, vec3_t *fte_restrict points, size_t numtris, shader_t *shader) static void CG_MarkFragments_Callback(void *vctx, vec3_t *fte_restrict points, size_t numtris, shader_t *shader)
{ {
q3markFragment_ctx_t *ctx = vctx;
size_t i; size_t i;
if (numtris > ctx->maxfrags-ctx->numfrags) if (numtris > ctx->maxfrags-ctx->numfrags)
numtris = ctx->maxfrags-ctx->numfrags; numtris = ctx->maxfrags-ctx->numfrags;

View File

@ -1986,7 +1986,10 @@ vfsfile_t *CL_OpenFileInZipOrSys(char *name, qboolean usesystempath)
//tries to determine the demo type //tries to determine the demo type
void CL_PlayDemoFile(vfsfile_t *f, char *demoname, qboolean issyspath) void CL_PlayDemoFile(vfsfile_t *f, char *demoname, qboolean issyspath)
{ {
qofs_t start; #if defined(Q2CLIENT) || defined(NQPROT)
//figure out where we started
qofs_t start = VFS_TELL(f);
#endif
if (!VFS_GETLEN (f)) if (!VFS_GETLEN (f))
{ {
@ -1995,9 +1998,6 @@ void CL_PlayDemoFile(vfsfile_t *f, char *demoname, qboolean issyspath)
return; return;
} }
//figure out where we started
start = VFS_TELL(f);
#ifdef Q2CLIENT #ifdef Q2CLIENT
{ {
int len; int len;
@ -2015,6 +2015,7 @@ void CL_PlayDemoFile(vfsfile_t *f, char *demoname, qboolean issyspath)
CL_PlayDemoStream(f, NULL, demoname, issyspath, DPB_QUAKE2, 0); CL_PlayDemoStream(f, NULL, demoname, issyspath, DPB_QUAKE2, 0);
return; return;
} }
VFS_SEEK(f, start);
} }
#endif #endif

View File

@ -1580,7 +1580,12 @@ void CLNQ_ParseEntity(unsigned int bits)
state->dpflags = (bits & NQU_NOLERP)?RENDER_STEP:0; state->dpflags = (bits & NQU_NOLERP)?RENDER_STEP:0;
if (bits & NQU_MODEL) if (bits & NQU_MODEL)
state->modelindex = MSG_ReadByte (); {
if (CPNQ_IS_BJP)
state->modelindex = MSG_ReadShort ();
else
state->modelindex = MSG_ReadByte ();
}
if (bits & NQU_FRAME) if (bits & NQU_FRAME)
state->frame = MSG_ReadByte(); state->frame = MSG_ReadByte();
@ -2438,7 +2443,6 @@ void CLQ1_AddVisibleBBoxes(void)
wedict_t *e; wedict_t *e;
int i; int i;
shader_t *s; shader_t *s;
extern world_t csqc_world;
vec3_t min, max, size; vec3_t min, max, size;
switch(r_showbboxes.ival & 3) switch(r_showbboxes.ival & 3)
@ -2453,7 +2457,10 @@ void CLQ1_AddVisibleBBoxes(void)
#endif #endif
#ifdef CSQC_DAT #ifdef CSQC_DAT
case 2: case 2:
w = &csqc_world; {
extern world_t csqc_world;
w = &csqc_world;
}
break; break;
#endif #endif
case 3: case 3:

View File

@ -732,15 +732,15 @@ void CL_CheckForResend (void)
{ {
extern cvar_t dpcompat_nopreparse; extern cvar_t dpcompat_nopreparse;
memset(&connectinfo, 0, sizeof(connectinfo)); memset(&connectinfo, 0, sizeof(connectinfo));
Q_strncpyz (cls.servername, "internalserver", sizeof(cls.servername));
Cvar_ForceSet(&cl_servername, cls.servername);
if (!NET_StringToAdr(cls.servername, 0, &connectinfo.adr))
return; //erk?
connectinfo.trying = true; connectinfo.trying = true;
connectinfo.istransfer = false; connectinfo.istransfer = false;
NET_InitClient(true); NET_InitClient(true);
Q_strncpyz (cls.servername, "internalserver", sizeof(cls.servername));
Cvar_ForceSet(&cl_servername, cls.servername);
NET_StringToAdr(cls.servername, 0, &connectinfo.adr);
cls.state = ca_disconnected; cls.state = ca_disconnected;
switch (svs.gametype) switch (svs.gametype)
{ {
@ -1363,7 +1363,11 @@ void CL_Rcon_f (void)
return; return;
} }
NET_StringToAdr (rcon_address.string, PORT_QWSERVER, &to); if (!NET_StringToAdr (rcon_address.string, PORT_QWSERVER, &to))
{
Con_Printf("Unable to resolve target address\n");
return;
}
} }
NET_SendPacket (NS_CLIENT, strlen(message)+1, message, &to); NET_SendPacket (NS_CLIENT, strlen(message)+1, message, &to);
@ -1715,7 +1719,7 @@ void CL_Disconnect (void)
Alias_WipeStuffedAliases(); Alias_WipeStuffedAliases();
//now start up the csqc/menu module again. //now start up the csqc/menu module again.
// CSQC_UnconnectedInit(); // (void)CSQC_UnconnectedInit();
} }
#undef serverrunning #undef serverrunning
@ -1732,7 +1736,7 @@ void CL_Disconnect_f (void)
connectinfo.trying = false; connectinfo.trying = false;
CSQC_UnconnectedInit(); (void)CSQC_UnconnectedInit();
} }
/* /*
@ -2730,14 +2734,16 @@ void CL_ConnectionlessPacket (void)
netadr_t adr; netadr_t adr;
char *data = MSG_ReadStringLine(); char *data = MSG_ReadStringLine();
Con_TPrintf ("redirect to %s\n", data); Con_TPrintf ("redirect to %s\n", data);
NET_StringToAdr(data, PORT_QWSERVER, &adr); if (NET_StringToAdr(data, PORT_QWSERVER, &adr))
data = "\xff\xff\xff\xffgetchallenge\n";
if (NET_CompareAdr(&connectinfo.adr, &net_from))
{ {
connectinfo.istransfer = true; data = "\xff\xff\xff\xffgetchallenge\n";
connectinfo.adr = adr;
NET_SendPacket (NS_CLIENT, strlen(data), data, &adr); if (NET_CompareAdr(&connectinfo.adr, &net_from))
{
connectinfo.istransfer = true;
connectinfo.adr = adr;
NET_SendPacket (NS_CLIENT, strlen(data), data, &adr);
}
} }
return; return;
} }
@ -4463,6 +4469,7 @@ void Host_RunFilePrompted(void *ctx, int button)
Host_DoRunFile(f); Host_DoRunFile(f);
} }
#ifdef WEBCLIENT
static qboolean isurl(char *url) static qboolean isurl(char *url)
{ {
#ifdef FTE_TARGET_WEB #ifdef FTE_TARGET_WEB
@ -4470,6 +4477,7 @@ static qboolean isurl(char *url)
#endif #endif
return /*!strncmp(url, "data:", 5) || */!strncmp(url, "http://", 7) || !strncmp(url, "https://", 8); return /*!strncmp(url, "data:", 5) || */!strncmp(url, "http://", 7) || !strncmp(url, "https://", 8);
} }
#endif
qboolean FS_FixupGamedirForExternalFile(char *input, char *filename, size_t fnamelen); qboolean FS_FixupGamedirForExternalFile(char *input, char *filename, size_t fnamelen);
@ -5058,7 +5066,6 @@ double Host_Frame (double time)
if (cls.demoplayback && !cl.stillloading) if (cls.demoplayback && !cl.stillloading)
{ {
extern qboolean shader_reload_needed; //this can take some time when you have weird glsl.
qboolean haswork = cl.sendprespawn || COM_HasWork(); qboolean haswork = cl.sendprespawn || COM_HasWork();
if (!hadwork && !haswork) if (!hadwork && !haswork)
CL_ProgressDemoTime(); CL_ProgressDemoTime();
@ -5427,7 +5434,6 @@ void CL_ArgumentOverrides(void)
void CL_ExecInitialConfigs(char *resetcommand) void CL_ExecInitialConfigs(char *resetcommand)
{ {
int qrc, hrc, def; int qrc, hrc, def;
extern cvar_t fs_gamename, com_protocolname; //these come from the manifest, so shouldn't be reset by cvarreset
Cbuf_Execute (); //make sure any pending console commands are done with. mostly, anyway... Cbuf_Execute (); //make sure any pending console commands are done with. mostly, anyway...
SCR_ShowPic_Clear(true); SCR_ShowPic_Clear(true);

View File

@ -25,7 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
void CL_GetNumberedEntityInfo (int num, float *org, float *ang); void CL_GetNumberedEntityInfo (int num, float *org, float *ang);
void CLDP_ParseDarkPlaces5Entities(void); void CLDP_ParseDarkPlaces5Entities(void);
static void CL_SetStatNumeric (int pnum, int stat, int ivalue, float fvalue); static void CL_SetStatNumeric (int pnum, int stat, int ivalue, float fvalue);
static void CL_SetStatInt (int pnum, int stat, int ivalue); #define CL_SetStatInt(pnum,stat,ival) do{int thevalue=ival; CL_SetStatNumeric(pnum,stat,thevalue,thevalue);}while(0)
static qboolean CL_CheckModelResources (char *name); static qboolean CL_CheckModelResources (char *name);
char cl_dp_csqc_progsname[128]; char cl_dp_csqc_progsname[128];
@ -2292,7 +2292,7 @@ void DL_Abort(qdownload_t *dl, enum qdlabort aborttype)
for (b = dl->dlblocks; b; b = n) for (b = dl->dlblocks; b; b = n)
{ {
if (b->state == DLB_RECEIVED) if (b->state == DLB_RECEIVED)
VFS_PRINTF(parts, "c %"PRIx64" %"PRIx64"\n", (long long)b->start, (long long)b->end); VFS_PRINTF(parts, "c %"PRIx64" %"PRIx64"\n", (quint64_t)b->start, (quint64_t)b->end);
else else
{ {
for(;;) for(;;)
@ -2307,7 +2307,7 @@ void DL_Abort(qdownload_t *dl, enum qdlabort aborttype)
} }
break; break;
} }
VFS_PRINTF(parts, "m %"PRIx64" %"PRIx64"\n", (long long)b->start, (long long)b->end); VFS_PRINTF(parts, "m %"PRIx64" %"PRIx64"\n", (quint64_t)b->start, (quint64_t)b->end);
} }
n = b->next; n = b->next;
@ -3297,15 +3297,15 @@ void CLNQ_ParseProtoVersion(void)
cls.protocol_nq = (cls.protocol_nq==CPNQ_PROQUAKE3_4)?CPNQ_PROQUAKE3_4:CPNQ_ID; cls.protocol_nq = (cls.protocol_nq==CPNQ_PROQUAKE3_4)?CPNQ_PROQUAKE3_4:CPNQ_ID;
cls.z_ext = 0; cls.z_ext = 0;
if (protover == NEHD_PROTOCOL_VERSION) if (protover == PROTOCOL_VERSION_NEHD)
Host_EndGame ("Nehahra demo net protocol is not supported\n"); Host_EndGame ("Nehahra demo net protocol is not supported\n");
else if (protover == FITZ_PROTOCOL_VERSION) else if (protover == PROTOCOL_VERSION_FITZ)
{ {
//fitzquake 0.85 //fitzquake 0.85
cls.protocol_nq = CPNQ_FITZ666; cls.protocol_nq = CPNQ_FITZ666;
Con_DPrintf("FitzQuake 666 protocol\n"); Con_DPrintf("FitzQuake 666 protocol\n");
} }
else if (protover == RMQ_PROTOCOL_VERSION) else if (protover == PROTOCOL_VERSION_RMQ)
{ {
int fl; int fl;
cls.protocol_nq = CPNQ_FITZ666; cls.protocol_nq = CPNQ_FITZ666;
@ -3323,7 +3323,7 @@ void CLNQ_ParseProtoVersion(void)
if (fl & ~(RMQFL_SHORTANGLE|RMQFL_FLOATANGLE|RMQFL_24BITCOORD|RMQFL_FLOATCOORD|RMQFL_EDICTSCALE)) if (fl & ~(RMQFL_SHORTANGLE|RMQFL_FLOATANGLE|RMQFL_24BITCOORD|RMQFL_FLOATCOORD|RMQFL_EDICTSCALE))
Con_Printf("WARNING: Server is using unsupported RMQ extensions\n"); Con_Printf("WARNING: Server is using unsupported RMQ extensions\n");
} }
else if (protover == DP5_PROTOCOL_VERSION) else if (protover == PROTOCOL_VERSION_DP5)
{ {
//darkplaces5 //darkplaces5
cls.protocol_nq = CPNQ_DP5; cls.protocol_nq = CPNQ_DP5;
@ -3332,7 +3332,7 @@ void CLNQ_ParseProtoVersion(void)
Con_DPrintf("DP5 protocols\n"); Con_DPrintf("DP5 protocols\n");
} }
else if (protover == DP6_PROTOCOL_VERSION) else if (protover == PROTOCOL_VERSION_DP6)
{ {
//darkplaces6 (it's a small difference from dp5) //darkplaces6 (it's a small difference from dp5)
cls.protocol_nq = CPNQ_DP6; cls.protocol_nq = CPNQ_DP6;
@ -3343,7 +3343,7 @@ void CLNQ_ParseProtoVersion(void)
Con_DPrintf("DP6 protocols\n"); Con_DPrintf("DP6 protocols\n");
} }
else if (protover == DP7_PROTOCOL_VERSION) else if (protover == PROTOCOL_VERSION_DP7)
{ {
//darkplaces7 (it's a small difference from dp5) //darkplaces7 (it's a small difference from dp5)
cls.protocol_nq = CPNQ_DP7; cls.protocol_nq = CPNQ_DP7;
@ -3354,18 +3354,29 @@ void CLNQ_ParseProtoVersion(void)
Con_DPrintf("DP7 protocols\n"); Con_DPrintf("DP7 protocols\n");
} }
else if (protover == H2_PROTOCOL_VERSION) else if (protover == PROTOCOL_VERSION_H2)
{ {
Host_EndGame ("\nUnable to connect to standard Hexen2 servers. Host the game with "DISTRIBUTION"\n"); Host_EndGame ("\nUnable to connect to standard Hexen2 servers. Host the game with "DISTRIBUTION"\n");
} }
else if (protover != NQ_PROTOCOL_VERSION) else if (protover == PROTOCOL_VERSION_BJP1)
{ {
Host_EndGame ("Server is using protocol version %i, which is not supported by this version of " FULLENGINENAME ".", protover); cls.protocol_nq = CPNQ_BJP1;
Con_DPrintf("bjp1 %i protocol\n", PROTOCOL_VERSION_BJP1);
} }
else else if (protover == PROTOCOL_VERSION_BJP2)
{ {
cls.protocol_nq = CPNQ_BJP2;
Con_DPrintf("bjp2 %i protocol\n", PROTOCOL_VERSION_BJP2);
}
else if (protover == PROTOCOL_VERSION_BJP3)
{
cls.protocol_nq = CPNQ_BJP3;
Con_DPrintf("bjp3 %i protocol\n", PROTOCOL_VERSION_BJP2);
}
else if (protover == PROTOCOL_VERSION_NQ)
Con_DPrintf("Standard NQ protocols\n"); Con_DPrintf("Standard NQ protocols\n");
} else
Host_EndGame ("Server is using protocol version %i, which is not supported by this version of " FULLENGINENAME ".", protover);
if (cls.fteprotocolextensions & PEXT_FLOATCOORDS) if (cls.fteprotocolextensions & PEXT_FLOATCOORDS)
{ {
if (netprim.anglesize < 2) if (netprim.anglesize < 2)
@ -3639,7 +3650,13 @@ void CLNQ_ParseClientdata (void)
if (bits & SU_WEAPONFRAME) weaponframe |= (unsigned char)MSG_ReadByte(); if (bits & SU_WEAPONFRAME) weaponframe |= (unsigned char)MSG_ReadByte();
if (bits & SU_ARMOR) armour |= (unsigned char)MSG_ReadByte(); if (bits & SU_ARMOR) armour |= (unsigned char)MSG_ReadByte();
if (bits & SU_WEAPONMODEL) weaponmodel |= (unsigned char)MSG_ReadByte(); if (bits & SU_WEAPONMODEL)
{
if (CPNQ_IS_BJP)
weaponmodel |= (unsigned short)MSG_ReadShort();
else
weaponmodel |= (unsigned char)MSG_ReadByte();
}
health |= MSG_ReadShort(); health |= MSG_ReadShort();
currentammo |= MSG_ReadByte(); currentammo |= MSG_ReadByte();
shells |= MSG_ReadByte(); shells |= MSG_ReadByte();
@ -4086,7 +4103,10 @@ void CL_ParseBaseline (entity_state_t *es)
memcpy(es, &nullentitystate, sizeof(entity_state_t)); memcpy(es, &nullentitystate, sizeof(entity_state_t));
es->modelindex = MSG_ReadByte (); if (cls.protocol == CP_NETQUAKE && CPNQ_IS_BJP)
es->modelindex = MSG_ReadShort ();
else
es->modelindex = MSG_ReadByte ();
es->frame = MSG_ReadByte (); es->frame = MSG_ReadByte ();
es->colormap = MSG_ReadByte(); es->colormap = MSG_ReadByte();
es->skinnum = MSG_ReadByte(); es->skinnum = MSG_ReadByte();
@ -4298,7 +4318,7 @@ void CL_ParseStaticSound (qboolean large)
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
org[i] = MSG_ReadCoord (); org[i] = MSG_ReadCoord ();
if (large) if (large || (cls.protocol == CP_NETQUAKE && cls.protocol_nq == CPNQ_BJP2))
sound_num = (unsigned short)MSG_ReadShort(); sound_num = (unsigned short)MSG_ReadShort();
else else
sound_num = MSG_ReadByte (); sound_num = MSG_ReadByte ();
@ -4532,7 +4552,7 @@ void CLNQ_ParseStartSoundPacket(void)
/*unpack mangling*/ /*unpack mangling*/
channel = (channel & 7) | ((channel & 0x0f1) << 1); channel = (channel & 7) | ((channel & 0x0f1) << 1);
if (field_mask & DPSND_LARGESOUND) if ((field_mask & DPSND_LARGESOUND) || (cls.protocol == CP_NETQUAKE && (cls.protocol_nq == CPNQ_BJP2 || cls.protocol_nq == CPNQ_BJP3))) //bjp2 kinda sucks
sound_num = (unsigned short)MSG_ReadShort(); sound_num = (unsigned short)MSG_ReadShort();
else else
sound_num = (unsigned char)MSG_ReadByte (); sound_num = (unsigned char)MSG_ReadByte ();
@ -5002,10 +5022,6 @@ static void CL_SetStatNumeric (int pnum, int stat, int ivalue, float fvalue)
} }
#endif #endif
} }
static void CL_SetStatInt (int pnum, int stat, int ivalue)
{
CL_SetStatNumeric(pnum,stat,ivalue,ivalue);
}
void CL_SetStatString (int pnum, int stat, char *value) void CL_SetStatString (int pnum, int stat, char *value)
{ {
@ -5894,7 +5910,7 @@ static void CL_ParseItemTimer(void)
atof(Cmd_Argv(3))}; atof(Cmd_Argv(3))};
float radius = atof(Cmd_Argv(4)); float radius = atof(Cmd_Argv(4));
//unsigned int rgb = strtoul(Cmd_Argv(5), NULL, 16); //unsigned int rgb = strtoul(Cmd_Argv(5), NULL, 16);
char *timername = Cmd_Argv(6); // char *timername = Cmd_Argv(6);
unsigned int entnum = strtoul(Cmd_Argv(7), NULL, 0); unsigned int entnum = strtoul(Cmd_Argv(7), NULL, 0);
struct itemtimer_s *timer; struct itemtimer_s *timer;
@ -6180,6 +6196,8 @@ void CL_ParsePortalState(void)
a1 = MSG_ReadByte(); a1 = MSG_ReadByte();
#ifdef Q2BSPS #ifdef Q2BSPS
CMQ2_SetAreaPortalState(cl.worldmodel, a1, !!(mode&1)); CMQ2_SetAreaPortalState(cl.worldmodel, a1, !!(mode&1));
#else
(void)a1;
#endif #endif
break; break;
case 0xc0: case 0xc0:
@ -6195,6 +6213,9 @@ void CL_ParsePortalState(void)
} }
#ifdef Q3BSPS #ifdef Q3BSPS
CMQ3_SetAreaPortalState(cl.worldmodel, a1, a2, !!(mode&1)); CMQ3_SetAreaPortalState(cl.worldmodel, a1, a2, !!(mode&1));
#else
(void)a1;
(void)a2;
#endif #endif
break; break;
@ -6827,11 +6848,12 @@ void CLQ2_ParseServerMessage (void)
seat = 0; seat = 0;
if (cmd == svcq2_playerinfo && (cls.fteprotocolextensions & PEXT_SPLITSCREEN)) if (cmd == svcq2_playerinfo && (cls.fteprotocolextensions & PEXT_SPLITSCREEN))
{ { //playerinfo should not normally be seen here.
//so we can just 'borrow' it for seat numbers for targetted svcs.
SHOWNET(va("%i", cmd)); SHOWNET(va("%i", cmd));
seat = MSG_ReadByte (); seat = MSG_ReadByte ();
if (seat >= MAX_SPLITS) if (seat >= MAX_SPLITS)
Host_EndGame ("CLQ2_ParseServerMessage: Invalid seat", cmd); Host_EndGame ("CLQ2_ParseServerMessage: Unsupported seat (%i)", seat);
cmd = MSG_ReadByte (); cmd = MSG_ReadByte ();
} }

View File

@ -837,7 +837,6 @@ static qintptr_t VARGS Plug_GetWeaponStats(void *offset, quintptr_t mask, const
struct wstats_s *result = VM_POINTER(arg[1]); struct wstats_s *result = VM_POINTER(arg[1]);
size_t maxresults = VM_LONG(arg[2]); size_t maxresults = VM_LONG(arg[2]);
int count = 0;
int i; int i;
if (VM_OOB(arg[0], maxresults*sizeof(*result))) if (VM_OOB(arg[0], maxresults*sizeof(*result)))

View File

@ -574,7 +574,6 @@ short LerpAngles16(short to, short from, float frac)
void CL_CalcClientTime(void) void CL_CalcClientTime(void)
{ {
extern float demtime;
if (!cls.state) if (!cls.state)
{ {
cl.servertime += host_frametime; cl.servertime += host_frametime;
@ -989,7 +988,6 @@ void CL_PredictMovePNum (int seat)
if ((cl.inframes[cl.validsequence & UPDATE_MASK].playerstate[pv->cam_spec_track].messagenum == cl.validsequence) || if ((cl.inframes[cl.validsequence & UPDATE_MASK].playerstate[pv->cam_spec_track].messagenum == cl.validsequence) ||
(pv->cam_spec_track+1 < cl.maxlerpents && cl.lerpents[pv->cam_spec_track+1].sequence == cl.lerpentssequence)) (pv->cam_spec_track+1 < cl.maxlerpents && cl.lerpents[pv->cam_spec_track+1].sequence == cl.lerpentssequence))
{ {
extern cvar_t cl_chasecam;
pv->cam_state = CAM_EYECAM; pv->cam_state = CAM_EYECAM;
pv->viewentity = pv->cam_spec_track+1; pv->viewentity = pv->cam_spec_track+1;
cam_nowlocked = true; cam_nowlocked = true;

View File

@ -2298,7 +2298,7 @@ static void SCR_ScreenShot_f (void)
Con_Printf ("Couldn't write %s\n", sysname); Con_Printf ("Couldn't write %s\n", sysname);
} }
void *SCR_ScreenShot_FBO(int fbwidth, int fbheight, enum uploadfmt *fmt) void *SCR_ScreenShot_Capture(int fbwidth, int fbheight, enum uploadfmt *fmt)
{ {
int width, height; int width, height;
void *buf; void *buf;
@ -2342,8 +2342,9 @@ void *SCR_ScreenShot_FBO(int fbwidth, int fbheight, enum uploadfmt *fmt)
Q_strncpyz(r_refdef.rt_destcolour[0].texname, "", sizeof(r_refdef.rt_destcolour[0].texname)); Q_strncpyz(r_refdef.rt_destcolour[0].texname, "", sizeof(r_refdef.rt_destcolour[0].texname));
BE_RenderToTextureUpdate2d(true); BE_RenderToTextureUpdate2d(true);
if (width != fbwidth || height != fbheight) if (!buf || width != fbwidth || height != fbheight)
{ {
*fmt = TF_INVALID;
BZ_Free(buf); BZ_Free(buf);
return NULL; return NULL;
} }
@ -2427,7 +2428,7 @@ static void SCR_ScreenShot_Mega_f(void)
r_refdef.stereomethod = STEREO_LEFTONLY; r_refdef.stereomethod = STEREO_LEFTONLY;
} }
buffers[buf] = SCR_ScreenShot_FBO(fbwidth, fbheight, &fmt[buf]); buffers[buf] = SCR_ScreenShot_Capture(fbwidth, fbheight, &fmt[buf]);
if (width[buf] != width[0] || height[buf] != height[0] || fmt[buf] != fmt[0]) if (width[buf] != width[0] || height[buf] != height[0] || fmt[buf] != fmt[0])
{ //invalid is better than unmatched. { //invalid is better than unmatched.
@ -2467,14 +2468,13 @@ static void SCR_ScreenShot_VR_f(void)
int height; //equirectangular 360 * 180 gives a nice clean ratio int height; //equirectangular 360 * 180 gives a nice clean ratio
int px = 4; int px = 4;
int step = atof(Cmd_Argv(3)); int step = atof(Cmd_Argv(3));
unsigned int *left_buffer; void *left_buffer, *right_buffer, *buf;
unsigned int *right_buffer;
unsigned int *buf;
enum uploadfmt fmt; enum uploadfmt fmt;
int lx, rx, x, y; int lx, rx, x, y;
vec3_t baseang; vec3_t baseang;
float ang; float ang;
extern cvar_t r_projection, r_stereo_separation; qboolean fail = false;
extern cvar_t r_projection, r_stereo_separation, r_stereo_convergence;;
VectorCopy(r_refdef.viewangles, baseang); VectorCopy(r_refdef.viewangles, baseang);
if (width <= 2) if (width <= 2)
@ -2484,7 +2484,7 @@ static void SCR_ScreenShot_VR_f(void)
step = 5; step = 5;
left_buffer = BZF_Malloc (width*height*2*px); left_buffer = BZF_Malloc (width*height*2*px);
right_buffer = left_buffer + width*height; right_buffer = (qbyte*)left_buffer + width*height*px;
if (strstr (screenyname, "..") || strchr(screenyname, ':') || *screenyname == '.' || *screenyname == '/') if (strstr (screenyname, "..") || strchr(screenyname, ':') || *screenyname == '.' || *screenyname == '/')
screenyname = ""; screenyname = "";
@ -2520,7 +2520,7 @@ static void SCR_ScreenShot_VR_f(void)
r_refdef.stereomethod = STEREO_OFF; r_refdef.stereomethod = STEREO_OFF;
cl.playerview->simangles[0] = 0; //pitch is BAD cl.playerview->simangles[0] = 0; //pitch is BAD
cl.playerview->simangles[1] = baseang[1];// - 360.0*(lx + 0.5*(rx-lx)) / width; cl.playerview->simangles[1] = baseang[1] + r_stereo_convergence.value*0.5;
cl.playerview->simangles[2] = 0; //roll is BAD cl.playerview->simangles[2] = 0; //roll is BAD
VectorCopy(cl.playerview->simangles, cl.playerview->viewangles); VectorCopy(cl.playerview->simangles, cl.playerview->viewangles);
@ -2530,29 +2530,68 @@ static void SCR_ScreenShot_VR_f(void)
r_refdef.eyeoffset[0] = sin(ang) * r_stereo_separation.value * 0.5; r_refdef.eyeoffset[0] = sin(ang) * r_stereo_separation.value * 0.5;
r_refdef.eyeoffset[1] = cos(ang) * r_stereo_separation.value * 0.5; r_refdef.eyeoffset[1] = cos(ang) * r_stereo_separation.value * 0.5;
r_refdef.eyeoffset[2] = 0; r_refdef.eyeoffset[2] = 0;
buf = SCR_ScreenShot_FBO(width, height, &fmt); buf = SCR_ScreenShot_Capture(width, height, &fmt);
if (buf && fmt == TF_BGRA32) switch(fmt)
{ {
case TF_BGRA32:
for (y = 0; y < height; y++) for (y = 0; y < height; y++)
for (x = lx; x < rx; x++) for (x = lx; x < rx; x++)
left_buffer[y*width + x] = buf[y*width + /*(width-step)/2 +*/ x]; ((unsigned int*)left_buffer)[y*width + x] = ((unsigned int*)buf)[y*width + x];
break;
case TF_RGB24:
for (y = 0; y < height; y++)
for (x = lx; x < rx; x++)
{
((qbyte*)left_buffer)[(y*width + x)*4+0] = ((qbyte*)buf)[(y*width + x)*3+2];
((qbyte*)left_buffer)[(y*width + x)*4+1] = ((qbyte*)buf)[(y*width + x)*3+1];
((qbyte*)left_buffer)[(y*width + x)*4+2] = ((qbyte*)buf)[(y*width + x)*3+0];
((qbyte*)left_buffer)[(y*width + x)*4+3] = 255;
}
break;
default:
fail = true;
break;
} }
BZ_Free(buf); BZ_Free(buf);
cl.playerview->simangles[0] = 0; //pitch is BAD
cl.playerview->simangles[1] = baseang[1] - r_stereo_convergence.value*0.5;
cl.playerview->simangles[2] = 0; //roll is BAD
VectorCopy(cl.playerview->simangles, cl.playerview->viewangles);
r_refdef.eyeoffset[0] *= -1; r_refdef.eyeoffset[0] *= -1;
r_refdef.eyeoffset[1] *= -1; r_refdef.eyeoffset[1] *= -1;
r_refdef.eyeoffset[2] = 0; r_refdef.eyeoffset[2] = 0;
buf = SCR_ScreenShot_FBO(width, height, &fmt); buf = SCR_ScreenShot_Capture(width, height, &fmt);
if (buf && fmt == TF_BGRA32) switch(fmt)
{ {
case TF_BGRA32:
for (y = 0; y < height; y++) for (y = 0; y < height; y++)
for (x = lx; x < rx; x++) for (x = lx; x < rx; x++)
right_buffer[y*width + x] = buf[y*width + /*(width-step)/2 +*/ x]; ((unsigned int*)right_buffer)[y*width + x] = ((unsigned int*)buf)[y*width + x];
break;
case TF_RGB24:
for (y = 0; y < height; y++)
for (x = lx; x < rx; x++)
{
((qbyte*)right_buffer)[(y*width + x)*4+0] = ((qbyte*)buf)[(y*width + x)*3+2];
((qbyte*)right_buffer)[(y*width + x)*4+1] = ((qbyte*)buf)[(y*width + x)*3+1];
((qbyte*)right_buffer)[(y*width + x)*4+2] = ((qbyte*)buf)[(y*width + x)*3+0];
((qbyte*)right_buffer)[(y*width + x)*4+3] = 255;
}
break;
default:
fail = true;
break;
} }
BZ_Free(buf); BZ_Free(buf);
} }
if (SCR_ScreenShot(filename, FS_GAMEONLY, &left_buffer, 1, width, height*2, TF_BGRA32)) if (fail)
Con_Printf ("Unable to capture suitable screen image\n");
else if (SCR_ScreenShot(filename, FS_GAMEONLY, &left_buffer, 1, width, height*2, TF_BGRA32))
{ {
char sysname[1024]; char sysname[1024];
FS_NativePath(filename, FS_GAMEONLY, sysname, sizeof(sysname)); FS_NativePath(filename, FS_GAMEONLY, sysname, sizeof(sysname));

View File

@ -2411,20 +2411,20 @@ void CL_Laser (vec3_t start, vec3_t end, int colors)
void CLQ2_ParseSteam(void) void CLQ2_ParseSteam(void)
{ {
vec3_t pos, dir; vec3_t pos, dir;
qbyte colour; /*qbyte colour;
short magnitude; short magnitude;
unsigned int duration; unsigned int duration;*/
signed int id = MSG_ReadShort(); signed int id = MSG_ReadShort();
qbyte count = MSG_ReadByte(); /*qbyte count =*/ MSG_ReadByte();
MSG_ReadPos(pos); MSG_ReadPos(pos);
MSG_ReadPos(dir); MSG_ReadPos(dir);
colour = MSG_ReadByte(); /*colour =*/ MSG_ReadByte();
magnitude = MSG_ReadShort(); /*magnitude =*/ MSG_ReadShort();
if (id == -1) if (id == -1)
duration = MSG_ReadLong(); /*duration =*/ MSG_ReadLong();
else else
duration = 0; /*duration = 0;*/
Con_Printf("FIXME: CLQ2_ParseSteam: stub\n"); Con_Printf("FIXME: CLQ2_ParseSteam: stub\n");
} }

View File

@ -802,13 +802,15 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
{ {
serverinfo_t *info; serverinfo_t *info;
COM_Parse(cmdtext + 5); COM_Parse(cmdtext + 5);
NET_StringToAdr(com_token, 0, &ui_pings[i]); if (NET_StringToAdr(com_token, 0, &ui_pings[i]))
info = Master_InfoForServer(&ui_pings[i]);
if (info)
{ {
info->special |= SS_KEEPINFO; info = Master_InfoForServer(&ui_pings[i]);
info->sends++; if (info)
Master_QueryServer(info); {
info->special |= SS_KEEPINFO;
info->sends++;
Master_QueryServer(info);
}
} }
break; break;
} }
@ -819,8 +821,8 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
netadr_t na; netadr_t na;
MasterInfo_Refresh(); MasterInfo_Refresh();
NET_StringToAdr("255.255.255.255", PORT_Q3SERVER, &na); if (NET_StringToAdr("255.255.255.255", PORT_Q3SERVER, &na))
NET_SendPollPacket (14, va("%c%c%c%cgetstatus\n", 255, 255, 255, 255), na); NET_SendPollPacket (14, va("%c%c%c%cgetstatus\n", 255, 255, 255, 255), na);
} }
else else
#endif #endif

View File

@ -444,12 +444,16 @@ typedef struct
{ {
CPNQ_ID, CPNQ_ID,
CPNQ_PROQUAKE3_4, CPNQ_PROQUAKE3_4,
CPNQ_BJP1, //16bit models, strict 8bit sounds
CPNQ_BJP2, //16bit models, strict 16bit sounds
CPNQ_BJP3, //16bit models, flagged 16bit sounds
CPNQ_FITZ666, /*and rmqe999 protocol*/ CPNQ_FITZ666, /*and rmqe999 protocol*/
CPNQ_DP5, CPNQ_DP5,
CPNQ_DP6, CPNQ_DP6,
CPNQ_DP7 CPNQ_DP7
} protocol_nq; } protocol_nq;
#define CPNQ_IS_DP (cls.protocol_nq >= CPNQ_DP5) #define CPNQ_IS_DP (cls.protocol_nq >= CPNQ_DP5)
#define CPNQ_IS_BJP (cls.protocol_nq >= CPNQ_BJP1 && cls.protocol_nq <= CPNQ_BJP3)
int protocol_q2; int protocol_q2;
@ -1549,10 +1553,10 @@ int CIN_RunCinematic (struct cinematics_s *cin, qbyte **outdata, int *outwidth,
typedef struct cin_s cin_t; typedef struct cin_s cin_t;
#ifdef NOMEDIA #ifdef NOMEDIA
#define Media_Playing() false #define Media_Playing() false
#define Media_Init() 0 #define Media_Init() (void)0
#define Media_PlayingFullScreen() false #define Media_PlayingFullScreen() false
#define Media_PlayFilm(n,e) false #define Media_PlayFilm(n,e) false
#define Media_StopFilm(a) true #define Media_StopFilm(a) (void)true
#else #else
/*media playing system*/ /*media playing system*/
qboolean Media_PlayingFullScreen(void); qboolean Media_PlayingFullScreen(void);

View File

@ -121,7 +121,6 @@ sfx_t *S_PrecacheSexedSound(int entnum, const char *soundname)
void CLQ2_EntityEvent(entity_state_t *es) void CLQ2_EntityEvent(entity_state_t *es)
{ {
float ATTN_IDLE = 2;
switch (es->u.q2.event) switch (es->u.q2.event)
{ {
case Q2EV_NONE: case Q2EV_NONE:
@ -2092,9 +2091,6 @@ CL_AddViewWeapon
*/ */
static void CLQ2_AddViewWeapon (int seat, q2player_state_t *ps, q2player_state_t *ops) static void CLQ2_AddViewWeapon (int seat, q2player_state_t *ps, q2player_state_t *ops)
{ {
entity_t gun; // view model
extern cvar_t cl_gunx, cl_guny, cl_gunz;
extern cvar_t cl_gunanglex, cl_gunangley, cl_gunanglez;
playerview_t *pv = &cl.playerview[seat]; playerview_t *pv = &cl.playerview[seat];
pv->vm.oldmodel = NULL; pv->vm.oldmodel = NULL;
@ -2115,8 +2111,6 @@ static void CLQ2_AddViewWeapon (int seat, q2player_state_t *ps, q2player_state_t
AngleVectors(pv->simangles, pv->vw_axis[0], pv->vw_axis[1], pv->vw_axis[2]); AngleVectors(pv->simangles, pv->vw_axis[0], pv->vw_axis[1], pv->vw_axis[2]);
VectorInverse(pv->vw_axis[1]); VectorInverse(pv->vw_axis[1]);
memset (&gun, 0, sizeof(gun));
pv->vm.oldmodel = cl.model_precache[ps->gunindex]; pv->vm.oldmodel = cl.model_precache[ps->gunindex];
if (!pv->vm.oldmodel) if (!pv->vm.oldmodel)
return; return;
@ -2126,42 +2120,6 @@ static void CLQ2_AddViewWeapon (int seat, q2player_state_t *ps, q2player_state_t
pv->vm.prevframe = ps->gunframe; pv->vm.prevframe = ps->gunframe;
else else
pv->vm.prevframe = ops->gunframe; pv->vm.prevframe = ops->gunframe;
/*
gun.shaderRGBAf[0] = 1;
gun.shaderRGBAf[1] = 1;
gun.shaderRGBAf[2] = 1;
if (r_drawviewmodel.value < 1 || r_drawviewmodel.value > 0)
gun.shaderRGBAf[3] = r_drawviewmodel.value;
else
gun.shaderRGBAf[3] = 1;
// set up gun position
#ifdef PEXT_SCALE
gun.scale = 1;
#endif
gun.origin[0] = cl_gunz.value;
gun.origin[1] = -cl_gunx.value;
gun.origin[2] = -cl_guny.value;
gun.angles[0] = cl_gunanglex.value;
gun.angles[1] = cl_gunangley.value;
gun.angles[2] = cl_gunanglez.value;
gun.framestate.g[FS_REG].frame[0] = ps->gunframe;
if (gun.framestate.g[FS_REG].frame[0] == 0)
gun.framestate.g[FS_REG].frame[1] = 0; // just changed weapons, don't lerp from old
else
gun.framestate.g[FS_REG].frame[1] = ops->gunframe;
gun.playerindex = -1;
gun.flags = Q2RF_MINLIGHT | RF_DEPTHHACK | RF_WEAPONMODEL;
gun.framestate.g[FS_REG].lerpweight[0] = cl.lerpfrac;
gun.framestate.g[FS_REG].lerpweight[1] = 1-cl.lerpfrac;
VectorCopy (gun.origin, gun.oldorigin); // don't lerp at all
V_AddEntity (&gun);
*/
} }
@ -2274,7 +2232,9 @@ Emits all entities, particles, and lights to the refresh
*/ */
void CLQ2_AddEntities (void) void CLQ2_AddEntities (void)
{ {
#ifdef _DEBUG
extern cvar_t chase_active, chase_back, chase_up; extern cvar_t chase_active, chase_back, chase_up;
#endif
int seat; int seat;
if (cls.state != ca_active) if (cls.state != ca_active)
return; return;

View File

@ -931,7 +931,7 @@ void VARGS Con_Printf (const char *fmt, ...)
if (!Sys_IsMainThread()) if (!Sys_IsMainThread())
{ {
COM_AddWork(0, Con_PrintFromThread, NULL, Z_StrDup(msg), 0, 0); COM_AddWork(WG_MAIN, Con_PrintFromThread, NULL, Z_StrDup(msg), 0, 0);
return; return;
} }
@ -1007,7 +1007,7 @@ static void Con_DPrintFromThread (void *ctx, void *data, size_t a, size_t b)
Con_Log(data); Con_Log(data);
else else
{ {
Sys_Printf ("%s", data); // also echo to debugging console Sys_Printf ("%s", (const char*)data); // also echo to debugging console
Con_PrintCon(&con_main, data, con_main.parseflags); Con_PrintCon(&con_main, data, con_main.parseflags);
} }
BZ_Free(data); BZ_Free(data);
@ -1043,7 +1043,7 @@ void VARGS Con_DPrintf (const char *fmt, ...)
if (!Sys_IsMainThread()) if (!Sys_IsMainThread())
{ {
if (developer.ival) if (developer.ival)
COM_AddWork(0, Con_DPrintFromThread, NULL, Z_StrDup(msg), 0, 0); COM_AddWork(WG_MAIN, Con_DPrintFromThread, NULL, Z_StrDup(msg), 0, 0);
return; return;
} }

View File

@ -2561,7 +2561,7 @@ static qboolean Image_ReadDDSFile(texid_t tex, unsigned int flags, char *fname,
mips->mipcount = mipnum; mips->mipcount = mipnum;
COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0);
return true; return true;
} }
#endif #endif
@ -2606,8 +2606,6 @@ static qboolean Image_ReadBLPFile(texid_t tex, unsigned int flags, char *fname,
if (blp->encoding == 2) if (blp->encoding == 2)
{ {
int blocksize;
//s3tc/dxt //s3tc/dxt
switch(blp->alphaencoding) switch(blp->alphaencoding)
{ {
@ -2617,15 +2615,12 @@ static qboolean Image_ReadBLPFile(texid_t tex, unsigned int flags, char *fname,
mips->encoding = PTI_S3RGBA1; mips->encoding = PTI_S3RGBA1;
else else
mips->encoding = PTI_S3RGB1; mips->encoding = PTI_S3RGB1;
blocksize = 8;
break; break;
case 1: //dxt2/3 case 1: //dxt2/3
mips->encoding = PTI_S3RGBA3; mips->encoding = PTI_S3RGBA3;
blocksize = 16;
break; break;
case 7: //dxt4/5 case 7: //dxt4/5
mips->encoding = PTI_S3RGBA5; mips->encoding = PTI_S3RGBA5;
blocksize = 16;
break; break;
} }
for (miplevel = 0; miplevel < 16; ) for (miplevel = 0; miplevel < 16; )
@ -2735,7 +2730,7 @@ static qboolean Image_ReadBLPFile(texid_t tex, unsigned int flags, char *fname,
mips->mipcount = miplevel; mips->mipcount = miplevel;
} }
COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0);
return true; return true;
} }
@ -4049,7 +4044,7 @@ static qboolean Image_LoadRawTexture(texid_t tex, unsigned int flags, void *rawd
if (flags & IF_NOWORKER) if (flags & IF_NOWORKER)
Image_LoadTexture_Failed(tex, NULL, 0, 0); Image_LoadTexture_Failed(tex, NULL, 0, 0);
else else
COM_AddWork(0, Image_LoadTexture_Failed, tex, NULL, 0, 0); COM_AddWork(WG_MAIN, Image_LoadTexture_Failed, tex, NULL, 0, 0);
return false; return false;
} }
Image_GenerateMips(mips, flags); Image_GenerateMips(mips, flags);
@ -4061,7 +4056,7 @@ static qboolean Image_LoadRawTexture(texid_t tex, unsigned int flags, void *rawd
if (flags & IF_NOWORKER) if (flags & IF_NOWORKER)
Image_LoadTextureMips(tex, mips, 0, 0); Image_LoadTextureMips(tex, mips, 0, 0);
else else
COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0);
return true; return true;
} }
@ -4154,7 +4149,7 @@ qboolean Image_LoadTextureFromMemory(texid_t tex, int flags, const char *iname,
if (flags & IF_NOWORKER) if (flags & IF_NOWORKER)
Image_LoadTextureMips(tex, mips, 0, 0); Image_LoadTextureMips(tex, mips, 0, 0);
else else
COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0);
return true; return true;
} }
#endif #endif
@ -4252,7 +4247,7 @@ static qboolean Image_LoadCubemapTexture(texid_t tex, char *nicename)
if (tex->flags & IF_NOWORKER) if (tex->flags & IF_NOWORKER)
Image_LoadTextureMips(tex, mips, 0, 0); Image_LoadTextureMips(tex, mips, 0, 0);
else else
COM_AddWork(0, Image_LoadTextureMips, tex, mips, 0, 0); COM_AddWork(WG_MAIN, Image_LoadTextureMips, tex, mips, 0, 0);
return true; return true;
} }
@ -4291,7 +4286,7 @@ void Image_LoadHiResTextureWorker(void *ctx, void *data, size_t a, size_t b)
if (tex->flags & IF_NOWORKER) if (tex->flags & IF_NOWORKER)
Image_LoadTexture_Failed(tex, NULL, 0, 0); Image_LoadTexture_Failed(tex, NULL, 0, 0);
else else
COM_AddWork(0, Image_LoadTexture_Failed, tex, NULL, 0, 0); COM_AddWork(WG_MAIN, Image_LoadTexture_Failed, tex, NULL, 0, 0);
} }
return; return;
} }
@ -4481,7 +4476,7 @@ void Image_LoadHiResTextureWorker(void *ctx, void *data, size_t a, size_t b)
if (tex->flags & IF_NOWORKER) if (tex->flags & IF_NOWORKER)
Image_LoadTexture_Failed(tex, NULL, 0, 0); Image_LoadTexture_Failed(tex, NULL, 0, 0);
else else
COM_AddWork(0, Image_LoadTexture_Failed, tex, NULL, 0, 0); COM_AddWork(WG_MAIN, Image_LoadTexture_Failed, tex, NULL, 0, 0);
} }
@ -4589,7 +4584,6 @@ void Image_Downloaded(struct dl_download *dl)
image_t *Image_GetTexture(const char *identifier, const char *subpath, unsigned int flags, void *fallbackdata, void *fallbackpalette, int fallbackwidth, int fallbackheight, uploadfmt_t fallbackfmt) image_t *Image_GetTexture(const char *identifier, const char *subpath, unsigned int flags, void *fallbackdata, void *fallbackpalette, int fallbackwidth, int fallbackheight, uploadfmt_t fallbackfmt)
{ {
image_t *tex; image_t *tex;
static int seq;
qboolean dontposttoworker = (flags & (IF_NOWORKER | IF_LOADNOW)); qboolean dontposttoworker = (flags & (IF_NOWORKER | IF_LOADNOW));
qboolean lowpri = (flags & IF_LOWPRIORITY); qboolean lowpri = (flags & IF_LOWPRIORITY);
@ -4701,9 +4695,9 @@ image_t *Image_GetTexture(const char *identifier, const char *subpath, unsigned
else else
#endif #endif
if (lowpri) if (lowpri)
COM_AddWork(1, Image_LoadHiResTextureWorker, tex, NULL, 0, 0); COM_AddWork(WG_LOADER, Image_LoadHiResTextureWorker, tex, NULL, 0, 0);
else else
COM_AddWork(1, Image_LoadHiResTextureWorker, tex, NULL, 0, 0); COM_AddWork(WG_LOADER, Image_LoadHiResTextureWorker, tex, NULL, 0, 0);
} }
return tex; return tex;
} }

View File

@ -517,7 +517,13 @@ void IN_MoveMouse(struct mouse_s *mouse, float *movements, int pnum, float frame
int mfwt; int mfwt;
qboolean strafe_x, strafe_y; qboolean strafe_x, strafe_y;
int wpnum; int wpnum;
#ifdef PEXT_CSQC
#ifdef MULTITHREAD
extern qboolean runningindepphys; extern qboolean runningindepphys;
#else
const qboolean runningindepphys = false;
#endif
#endif
//small performance boost //small performance boost
if (mouse->type == M_INVALID) if (mouse->type == M_INVALID)

View File

@ -213,7 +213,7 @@ void INS_ProcessInputMessage(struct InputEvent *msg, qboolean consumemotion)
void INS_Commands(void) void INS_Commands(void)
{ {
} }
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid))
{ {
} }
void INS_Move (float *movements, int pnum) void INS_Move (float *movements, int pnum)

View File

@ -912,7 +912,7 @@ void INS_Accumulate(void) //input polling
void INS_Commands (void) //used to Cbuf_AddText joystick button events in windows. void INS_Commands (void) //used to Cbuf_AddText joystick button events in windows.
{ {
} }
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid))
{ {
} }

View File

@ -98,7 +98,7 @@ HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion,
// mouse variables // mouse variables
static cvar_t in_dinput = CVARF("in_dinput","0", CVAR_ARCHIVE); static cvar_t in_dinput = CVARF("in_dinput","0", CVAR_ARCHIVE);
static cvar_t in_xinput = CVARFD("in_xinput","0", CVAR_ARCHIVE, "Enables the use of xinput for controllers.\nNote that if you have a headset plugged in, that headset will be used for audio playback if no specific audio device is configured (may require snd_restart too)."); static cvar_t in_xinput = CVARFD("in_xinput","0", CVAR_ARCHIVE, "Enables the use of xinput for controllers.\nNote that if you have a headset plugged in, that headset will be used for audio playback if no specific audio device is configured.");
static cvar_t in_builtinkeymap = CVARF("in_builtinkeymap", "0", CVAR_ARCHIVE); static cvar_t in_builtinkeymap = CVARF("in_builtinkeymap", "0", CVAR_ARCHIVE);
static cvar_t in_simulatemultitouch = CVAR("in_simulatemultitouch", "0"); static cvar_t in_simulatemultitouch = CVAR("in_simulatemultitouch", "0");
static cvar_t in_nonstandarddeadkeys = CVARD("in_nonstandarddeadkeys", "1", "Discard input events that result in multiple keys. Only the last key will be used. This results in behaviour that differs from eg notepad. To use a dead key, press it twice instead of the dead key followed by space."); static cvar_t in_nonstandarddeadkeys = CVARD("in_nonstandarddeadkeys", "1", "Discard input events that result in multiple keys. Only the last key will be used. This results in behaviour that differs from eg notepad. To use a dead key, press it twice instead of the dead key followed by space.");
@ -2066,7 +2066,7 @@ void INS_JoyMove (float *movements, int pnum)
} }
} }
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid))
{ {
int idx; int idx;

View File

@ -58,7 +58,7 @@ void INS_ReInit (void);
void INS_Init (void); void INS_Init (void);
void INS_Shutdown (void); void INS_Shutdown (void);
void INS_Commands (void); //final chance to call IN_MouseMove/IN_KeyEvent each frame void INS_Commands (void); //final chance to call IN_MouseMove/IN_KeyEvent each frame
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)); void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid));
void INS_SetupControllerAudioDevices(qboolean enabled); //creates audio devices for each controller (where controllers have their own audio devices) void INS_SetupControllerAudioDevices(qboolean enabled); //creates audio devices for each controller (where controllers have their own audio devices)
#define DEVID_UNSET -1 #define DEVID_UNSET -1

View File

@ -411,7 +411,6 @@ static qboolean MI_Selectable(menuoption_t *op)
static void M_CheckMouseMove(void) static void M_CheckMouseMove(void)
{ {
qboolean foundexclusive = false; qboolean foundexclusive = false;
int mgt;
menu_t *menu; menu_t *menu;
menuoption_t *option; menuoption_t *option;
@ -424,8 +423,6 @@ static void M_CheckMouseMove(void)
if (mousemoved) if (mousemoved)
{ {
mgt = M_GameType();
for (menu = firstmenu; menu; menu = menu->parent) for (menu = firstmenu; menu; menu = menu->parent)
{ {
if (menu->exclusive) if (menu->exclusive)
@ -450,7 +447,7 @@ static void M_CheckMouseMove(void)
if (!option->common.noselectionsound) if (!option->common.noselectionsound)
{ {
#ifdef HEXEN2 #ifdef HEXEN2
if (mgt == MGT_HEXEN2) if (M_GameType() == MGT_HEXEN2)
S_LocalSound ("raven/menu1.wav"); S_LocalSound ("raven/menu1.wav");
else else
#endif #endif
@ -930,7 +927,6 @@ menuoption_t *MC_AddCursorSmall(menu_t *menu, menuresel_t *reselection, int x, i
menupicture_t *MC_AddCursor(menu_t *menu, menuresel_t *reselection, int x, int y) menupicture_t *MC_AddCursor(menu_t *menu, menuresel_t *reselection, int x, int y)
{ {
int mgt;
menupicture_t *n = Z_Malloc(sizeof(menupicture_t)); menupicture_t *n = Z_Malloc(sizeof(menupicture_t));
if (reselection) if (reselection)
menu->reselection = reselection; menu->reselection = reselection;
@ -944,8 +940,7 @@ menupicture_t *MC_AddCursor(menu_t *menu, menuresel_t *reselection, int x, int y
n->common.next = menu->options; n->common.next = menu->options;
menu->options = (menuoption_t *)n; menu->options = (menuoption_t *)n;
mgt = M_GameType(); switch(M_GameType())
switch(mgt)
{ {
#ifdef Q2CLIENT #ifdef Q2CLIENT
case MGT_QUAKE2: case MGT_QUAKE2:
@ -1806,9 +1801,6 @@ menuoption_t *M_PrevSelectableItem(menu_t *m, menuoption_t *old)
void M_Complex_Key(int key, int unicode) void M_Complex_Key(int key, int unicode)
{ {
int mgt;
mgt = M_GameType();
if (!currentmenu) if (!currentmenu)
return; //erm... return; //erm...
@ -1832,7 +1824,7 @@ void M_Complex_Key(int key, int unicode)
return; return;
#ifdef HEXEN2 #ifdef HEXEN2
if (mgt == MGT_HEXEN2) if (M_GameType() == MGT_HEXEN2)
S_LocalSound ("raven/menu1.wav"); S_LocalSound ("raven/menu1.wav");
else else
#endif #endif
@ -1869,7 +1861,7 @@ void M_Complex_Key(int key, int unicode)
//remove //remove
M_RemoveMenu(currentmenu); M_RemoveMenu(currentmenu);
#ifdef HEXEN2 #ifdef HEXEN2
if (mgt == MGT_HEXEN2) if (M_GameType() == MGT_HEXEN2)
S_LocalSound ("raven/menu3.wav"); S_LocalSound ("raven/menu3.wav");
else else
#endif #endif
@ -1882,7 +1874,7 @@ void M_Complex_Key(int key, int unicode)
if (currentmenu->selecteditem) if (currentmenu->selecteditem)
{ {
#ifdef HEXEN2 #ifdef HEXEN2
if (mgt == MGT_HEXEN2) if (M_GameType() == MGT_HEXEN2)
S_LocalSound ("raven/menu1.wav"); S_LocalSound ("raven/menu1.wav");
else else
#endif #endif
@ -1898,7 +1890,7 @@ void M_Complex_Key(int key, int unicode)
if (currentmenu->selecteditem) if (currentmenu->selecteditem)
{ {
#ifdef HEXEN2 #ifdef HEXEN2
if (mgt == MGT_HEXEN2) if (M_GameType() == MGT_HEXEN2)
S_LocalSound ("raven/menu1.wav"); S_LocalSound ("raven/menu1.wav");
else else
#endif #endif
@ -1932,7 +1924,7 @@ void M_Complex_Key(int key, int unicode)
{ {
Cbuf_AddText(currentmenu->selecteditem->button.command, RESTRICT_LOCAL); Cbuf_AddText(currentmenu->selecteditem->button.command, RESTRICT_LOCAL);
#ifdef HEXEN2 #ifdef HEXEN2
if (mgt == MGT_HEXEN2) if (M_GameType() == MGT_HEXEN2)
S_LocalSound ("raven/menu2.wav"); S_LocalSound ("raven/menu2.wav");
else else
#endif #endif
@ -1964,107 +1956,12 @@ void M_Complex_Key(int key, int unicode)
typedef struct {
int itemselected;
menu_t *dropout;
menutext_t *op[64];
char *text[64];
menu_t *parent;
} guiinfo_t;
static qboolean MC_GuiKey(int key, menu_t *menu)
{
guiinfo_t *info = (guiinfo_t *)menu->data;
switch(key)
{
case K_ESCAPE:
if (info->dropout)
MC_GuiKey(key, info->dropout);
else
{
guiinfo_t *gui;
M_RemoveMenu(menu);
if (menu->parent)
{
gui = (guiinfo_t *)menu->parent->data;
gui->dropout = NULL;
}
}
break;
case K_ENTER:
case K_KP_ENTER:
case K_RIGHTARROW:
if (info->dropout)
MC_GuiKey(key, info->dropout);
else
{
int y, i;
guiinfo_t *gui;
info->dropout = M_CreateMenu(sizeof(guiinfo_t));
currentmenu = info->dropout;
info->dropout->key = MC_GuiKey;
info->dropout->exclusive = false;
info->dropout->parent = menu;
info->dropout->xpos = 0;
info->dropout->ypos = menu->ypos+info->itemselected*8;
for (i = 0; info->text[i]; i++)
if (info->dropout->xpos < strlen(info->text[i]))
info->dropout->xpos = strlen(info->text[i]);
info->dropout->xpos*=8;
info->dropout->xpos+=menu->xpos;
gui = (guiinfo_t *)info->dropout->data;
gui->text[0] = "Hello";
gui->text[1] = "Hello again";
gui->text[2] = "Hello yet again";
for (y = 0, i = 0; gui->text[i]; i++, y+=1*8)
{
info->op[i] = MC_AddRedText(info->dropout, 0, 0, y, gui->text[i], false);
}
}
break;
case K_LEFTARROW:
if (info->dropout)
MC_GuiKey(key, info->dropout);
else
{
guiinfo_t *gui;
M_RemoveMenu(menu);
if (menu->parent)
{
gui = (guiinfo_t *)menu->parent->data;
gui->dropout = NULL;
}
}
break;
case K_UPARROW:
info->op[info->itemselected]->isred = true;
if (info->itemselected)
info->itemselected--;
info->op[info->itemselected]->isred = false;
break;
case K_DOWNARROW:
if (!info->op[info->itemselected])
break;
info->op[info->itemselected]->isred = true;
if (info->text[info->itemselected+1])
info->itemselected++;
info->op[info->itemselected]->isred = false;
break;
}
return true;
}
extern int m_save_demonum; extern int m_save_demonum;
qboolean MC_Main_Key (int key, menu_t *menu) //here purly to restart demos. qboolean MC_Main_Key (int key, menu_t *menu) //here purly to restart demos.
{ {
if (key == K_ESCAPE || key == K_MOUSE2) if (key == K_ESCAPE || key == K_MOUSE2)
{ {
extern cvar_t cl_demoreel, con_stayhidden; extern cvar_t con_stayhidden;
//don't spam menu open+close events if we're not going to be allowing the console to appear //don't spam menu open+close events if we're not going to be allowing the console to appear
if (con_stayhidden.ival && cls.state == ca_disconnected) if (con_stayhidden.ival && cls.state == ca_disconnected)
@ -2073,15 +1970,6 @@ qboolean MC_Main_Key (int key, menu_t *menu) //here purly to restart demos.
Key_Dest_Remove(kdm_emenu); Key_Dest_Remove(kdm_emenu);
m_state = m_none; m_state = m_none;
/* if (m_save_demonum != -1)
{
cls.demonum = m_save_demonum;
m_save_demonum = -1;
if (cls.demonum != -1 && !cls.demoplayback && cls.state == ca_disconnected && cl_demoreel.ival)
CL_NextDemo ();
}
*/
return true; return true;
} }
return false; return false;
@ -2095,8 +1983,6 @@ void M_Menu_Main_f (void)
mpic_t *p; mpic_t *p;
static menuresel_t resel; static menuresel_t resel;
int mgt;
#ifdef CSQC_DAT #ifdef CSQC_DAT
if (CSQC_ConsoleCommand(va("%s %s", Cmd_Argv(0), Cmd_Args()))) if (CSQC_ConsoleCommand(va("%s %s", Cmd_Argv(0), Cmd_Args())))
return; return;
@ -2137,9 +2023,8 @@ void M_Menu_Main_f (void)
S_LocalSound ("misc/menu2.wav"); S_LocalSound ("misc/menu2.wav");
mgt = M_GameType();
#ifdef Q2CLIENT #ifdef Q2CLIENT
if (mgt == MGT_QUAKE2) //quake2 main menu. if (M_GameType() == MGT_QUAKE2) //quake2 main menu.
{ {
if (R_GetShaderSizes(R2D_SafeCachePic("pics/m_main_quit"), NULL, NULL, true) > 0) if (R_GetShaderSizes(R2D_SafeCachePic("pics/m_main_quit"), NULL, NULL, true) > 0)
{ {
@ -2195,7 +2080,7 @@ void M_Menu_Main_f (void)
else else
#endif #endif
#ifdef HEXEN2 #ifdef HEXEN2
if (mgt == MGT_HEXEN2) if (M_GameType() == MGT_HEXEN2)
{ {
p = R2D_SafeCachePic("gfx/menu/title0.lmp"); p = R2D_SafeCachePic("gfx/menu/title0.lmp");
if (R_GetShaderSizes(p, NULL, NULL, true) <= 0) if (R_GetShaderSizes(p, NULL, NULL, true) <= 0)

View File

@ -777,9 +777,9 @@ dojoin:
char safename[128]; char safename[128];
Q_strncpyz(safename, server->name, sizeof(safename)); Q_strncpyz(safename, server->name, sizeof(safename));
//ALWAYS sanitize your inputs. //ALWAYS sanitize your inputs.
while(s = strchr(safename, ';')) while((s = strchr(safename, ';')))
*s = ' '; *s = ' ';
while(s = strchr(safename, '\n')) while((s = strchr(safename, '\n')))
*s = ' '; *s = ' ';
if (key == 'c') if (key == 'c')
Sys_SaveClipboard(va("%s - %s\n", server->name, NET_AdrToString(buf, sizeof(buf), &server->adr))); Sys_SaveClipboard(va("%s - %s\n", server->name, NET_AdrToString(buf, sizeof(buf), &server->adr)));

View File

@ -36,7 +36,9 @@ static char media_friendlyname[MAX_QPATH];
#define MEDIA_GAMEMUSIC (1u<<0) //cd music. also music command etc. #define MEDIA_GAMEMUSIC (1u<<0) //cd music. also music command etc.
#define MEDIA_CVARLIST (1u<<1) //cvar abuse. handy for preserving times when switching tracks. #define MEDIA_CVARLIST (1u<<1) //cvar abuse. handy for preserving times when switching tracks.
#define MEDIA_PLAYLIST (1u<<2) // #define MEDIA_PLAYLIST (1u<<2) //
#if !defined(NOMEDIA)
static unsigned int media_playlisttypes; static unsigned int media_playlisttypes;
#endif
static unsigned int media_playlistcurrent; static unsigned int media_playlistcurrent;
static int cdplayingtrack; //currently playing cd track (becomes 0 when paused) static int cdplayingtrack; //currently playing cd track (becomes 0 when paused)
@ -57,10 +59,12 @@ static int cdnumtracks; //maximum cd track we can play.
//cvar abuse //cvar abuse
#if !defined(NOMEDIA)
static int music_playlist_last; static int music_playlist_last;
static cvar_t music_playlist_index = CVAR("music_playlist_index", "-1"); static cvar_t music_playlist_index = CVAR("music_playlist_index", "-1");
// created dynamically: CVAR("music_playlist_list0+", ""), // created dynamically: CVAR("music_playlist_list0+", ""),
// created dynamically: CVAR("music_playlist_sampleposition0+", "-1"), // created dynamically: CVAR("music_playlist_sampleposition0+", "-1"),
#endif
static qboolean Media_Changed (unsigned int mediatype) static qboolean Media_Changed (unsigned int mediatype)
@ -115,9 +119,9 @@ qboolean Media_NamedTrack(const char *track, const char *looptrack)
}; };
char trackname[MAX_QPATH]; char trackname[MAX_QPATH];
int ie, ip; int ie, ip;
qboolean found = false;
#endif #endif
char *trackend; char *trackend;
qboolean found = false;
if (!track || !*track) //ignore calls if the primary track is invalid. whatever is already playing will continue to play. if (!track || !*track) //ignore calls if the primary track is invalid. whatever is already playing will continue to play.
return false; return false;
@ -138,9 +142,7 @@ qboolean Media_NamedTrack(const char *track, const char *looptrack)
if (!strcmp(looptrack, "-")) //- for the looptrack argument can be used to prevent looping. if (!strcmp(looptrack, "-")) //- for the looptrack argument can be used to prevent looping.
looptrack = ""; looptrack = "";
#if defined(NOMEDIA) #ifndef NOMEDIA
found = false;
#else
for(ip = 0; path[ip] && !found; ip++) for(ip = 0; path[ip] && !found; ip++)
{ {
if (tracknum) if (tracknum)
@ -3233,6 +3235,8 @@ void Media_RecordFrame (void)
case TF_RGBA32: case TF_RGBA32:
qglReadPixels(0, 0, vid.fbpwidth, vid.fbpheight, GL_RGBA, GL_UNSIGNED_BYTE, 0); qglReadPixels(0, 0, vid.fbpwidth, vid.fbpheight, GL_RGBA, GL_UNSIGNED_BYTE, 0);
break; break;
default:
break;
} }
qglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); qglBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
} }
@ -3444,7 +3448,6 @@ void Media_StopRecordFilm_f (void)
if (pbo_format) if (pbo_format)
{ {
int i; int i;
int imagesize = vid.fbpwidth * vid.fbpheight * 4;
while (pbo_oldest < captureframe) while (pbo_oldest < captureframe)
{ {
qbyte *buffer; qbyte *buffer;
@ -3559,7 +3562,7 @@ static void Media_RecordFilm (char *recordingname, qboolean demo)
#ifdef CAN_USE_PBOS #ifdef CAN_USE_PBOS
pbo_format = TF_INVALID; pbo_format = TF_INVALID;
if (qrenderer == QR_OPENGL && !gl_config.gles && gl_config.glversion >= 2.1) if (qrenderer == QR_OPENGL && !gl_config.gles && gl_config.glversion >= 2.1)
{ //both tgas and vfw favour bgr24, so lets get the gl drivers to suffer instead of us. { //both tgas and vfw favour bgr24, so lets get the gl drivers to suffer instead of us, where possible.
if (vid.fbpwidth & 3) if (vid.fbpwidth & 3)
pbo_format = TF_BGRA32; //don't bother changing pack alignment, just use something that is guarenteed to not need anything. pbo_format = TF_BGRA32; //don't bother changing pack alignment, just use something that is guarenteed to not need anything.
else else

View File

@ -420,16 +420,14 @@ void MSetup_TransDraw (int x, int y, menucustom_t *option, menu_t *menu)
void M_Menu_Setup_f (void) void M_Menu_Setup_f (void)
{ {
int mgt;
setupmenu_t *info; setupmenu_t *info;
menu_t *menu; menu_t *menu;
menucustom_t *ci; menucustom_t *ci;
menubutton_t *b; menubutton_t *b;
static menuresel_t resel; static menuresel_t resel;
mgt = M_GameType();
#ifdef Q2CLIENT #ifdef Q2CLIENT
if (mgt == MGT_QUAKE2) //quake2 main menu. if (M_GameType() == MGT_QUAKE2) //quake2 main menu.
{ {
if (R2D_SafeCachePic("pics/m_banner_player_setup")) if (R2D_SafeCachePic("pics/m_banner_player_setup"))
{ {
@ -481,7 +479,7 @@ void M_Menu_Setup_f (void)
(info->teamedit = MC_AddEdit(menu, 64, 160, 56, "Your team", team.string)); (info->teamedit = MC_AddEdit(menu, 64, 160, 56, "Your team", team.string));
#ifdef HEXEN2 #ifdef HEXEN2
info->ticlass = -1; info->ticlass = -1;
if (mgt == MGT_HEXEN2) if (M_GameType() == MGT_HEXEN2)
{ {
static const char *classnames[] = static const char *classnames[] =
{ {
@ -597,7 +595,6 @@ qboolean MultiBeginGame (union menuoption_s *option,struct menu_s *menu, int key
} }
void M_Menu_GameOptions_f (void) void M_Menu_GameOptions_f (void)
{ {
extern cvar_t pr_maxedicts;
static const char *deathmatchoptions[] = { static const char *deathmatchoptions[] = {
"Cooperative", "Cooperative",
"Deathmatch 1", "Deathmatch 1",

View File

@ -172,19 +172,27 @@ qboolean M_Options_InvertMouse (menucheck_t *option, struct menu_s *menu, chk_se
} }
} }
#if defined(WEBCLIENT) && defined(_WIN32)
#define HAVEAUTOUPDATE
void M_Options_Remove(menu_t *m) void M_Options_Remove(menu_t *m)
{ {
menucombo_t *c = m->data; menucombo_t *c = m->data;
if (c) if (c)
Sys_SetAutoUpdateSetting(c->selectedoption); Sys_SetAutoUpdateSetting(c->selectedoption);
} }
#endif
//options menu. //options menu.
void M_Menu_Options_f (void) void M_Menu_Options_f (void)
{ {
extern cvar_t crosshair, r_projection, sv_autosave; extern cvar_t crosshair, r_projection;
#ifndef CLIENTONLY
extern cvar_t sv_autosave;
#endif
int y; int y;
#ifdef HAVEAUTOUPDATE
#define HAVEAUTOUPDATE
menuoption_t *updatecbo; menuoption_t *updatecbo;
static const char *autoupopts[] = { static const char *autoupopts[] = {
"Revert", "Revert",
@ -193,7 +201,7 @@ void M_Menu_Options_f (void)
"Untested(Latest)", "Untested(Latest)",
NULL NULL
}; };
#endif
static const char *projections[] = { static const char *projections[] = {
"Regular", "Regular",
"Stereographic", "Stereographic",
@ -209,9 +217,11 @@ void M_Menu_Options_f (void)
"2", "2",
"3", "3",
"4", "4",
"5",
NULL NULL
}; };
#ifndef CLIENTONLY
static const char *autosaveopts[] = { static const char *autosaveopts[] = {
"Off", "Off",
"30 secs", "30 secs",
@ -221,7 +231,7 @@ void M_Menu_Options_f (void)
"5 mins", "5 mins",
NULL NULL
}; };
static const char *autsavevals[] = { static const char *autosavevals[] = {
"0", "0",
"0.5", "0.5",
"1", "1",
@ -230,6 +240,7 @@ void M_Menu_Options_f (void)
"5", "5",
NULL NULL
}; };
#endif
menubulk_t bulk[] = { menubulk_t bulk[] = {
MB_CONSOLECMD("Customize controls", "menu_keys\n", "Modify keyboard and mouse inputs."), MB_CONSOLECMD("Customize controls", "menu_keys\n", "Modify keyboard and mouse inputs."),
@ -246,9 +257,11 @@ void M_Menu_Options_f (void)
MB_CHECKBOXCVAR("Lookspring", lookspring, 0), MB_CHECKBOXCVAR("Lookspring", lookspring, 0),
MB_CHECKBOXCVAR("Lookstrafe", lookstrafe, 0), MB_CHECKBOXCVAR("Lookstrafe", lookstrafe, 0),
MB_CHECKBOXCVAR("Windowed Mouse", _windowed_mouse, 0), MB_CHECKBOXCVAR("Windowed Mouse", _windowed_mouse, 0),
#ifdef HAVEAUTOUPDATE
MB_COMBORETURN("Auto Update", autoupopts, Sys_GetAutoUpdateSetting(), updatecbo, "This downloads engine updates from the internet, when a new build is available."), MB_COMBORETURN("Auto Update", autoupopts, Sys_GetAutoUpdateSetting(), updatecbo, "This downloads engine updates from the internet, when a new build is available."),
#endif
#ifndef CLIENTONLY #ifndef CLIENTONLY
MB_COMBOCVAR("Auto Save", sv_autosave, autosaveopts, autsavevals, NULL), MB_COMBOCVAR("Auto Save", sv_autosave, autosaveopts, autosavevals, NULL),
#endif #endif
MB_SPACING(4), MB_SPACING(4),
// removed hud options (cl_sbar, cl_hudswap, old-style chat, old-style msg) // removed hud options (cl_sbar, cl_hudswap, old-style chat, old-style msg)
@ -300,9 +313,10 @@ void M_Menu_Options_f (void)
} }
#endif #endif
#ifdef HAVEAUTOUPDATE
menu->data = updatecbo; menu->data = updatecbo;
menu->remove = M_Options_Remove; menu->remove = M_Options_Remove;
#endif
} }
#ifndef __CYGWIN__ #ifndef __CYGWIN__
@ -1220,6 +1234,7 @@ qboolean M_VideoApplyShadowLighting (union menuoption_s *op,struct menu_s *menu,
if (key != K_ENTER && key != K_KP_ENTER && key != K_MOUSE1) if (key != K_ENTER && key != K_KP_ENTER && key != K_MOUSE1)
return false; return false;
#ifdef RTLIGHTS
{ {
char *cvarsrw = "0"; char *cvarsrw = "0";
char *cvarsrws = "0"; char *cvarsrws = "0";
@ -1243,6 +1258,7 @@ qboolean M_VideoApplyShadowLighting (union menuoption_s *op,struct menu_s *menu,
Cbuf_AddText(va("r_vertexlight %s;r_shadow_realtime_world %s;r_shadow_realtime_world_shadows %s\n", cvarv, cvarsrw, cvarsrws), RESTRICT_LOCAL); Cbuf_AddText(va("r_vertexlight %s;r_shadow_realtime_world %s;r_shadow_realtime_world_shadows %s\n", cvarv, cvarsrw, cvarsrws), RESTRICT_LOCAL);
#endif #endif
} }
#endif
{ {
char *cvard = "0"; char *cvard = "0";
@ -1269,11 +1285,20 @@ qboolean M_VideoApplyShadowLighting (union menuoption_s *op,struct menu_s *menu,
cvarvd = "1"; cvarvd = "1";
break; break;
} }
#ifdef RTLIGHTS
#ifdef MINIMAL #ifdef MINIMAL
Cbuf_AddText(va("r_shadow_realtime_dlight %s;r_shadow_realtime_dlight_shadows %s;r_dynamic %s\n", cvarsrd, cvarsrds, cvard), RESTRICT_LOCAL); Cbuf_AddText(va("r_shadow_realtime_dlight %s;r_shadow_realtime_dlight_shadows %s;r_dynamic %s\n", cvarsrd, cvarsrds, cvard), RESTRICT_LOCAL);
#else #else
Cbuf_AddText(va("r_shadow_realtime_dlight %s;r_shadow_realtime_dlight_shadows %s;r_dynamic %s;r_vertexdlight %s\n", cvarsrd, cvarsrds, cvard, cvarvd), RESTRICT_LOCAL); Cbuf_AddText(va("r_shadow_realtime_dlight %s;r_shadow_realtime_dlight_shadows %s;r_dynamic %s;r_vertexdlight %s\n", cvarsrd, cvarsrds, cvard, cvarvd), RESTRICT_LOCAL);
#endif #endif
#else
#ifdef MINIMAL
Cbuf_AddText(va("r_dynamic %s\n", cvard), RESTRICT_LOCAL);
#else
Cbuf_AddText(va("r_dynamic %s;r_vertexdlight %s\n", cvard, cvarvd), RESTRICT_LOCAL);
#endif
#endif
(void)cvarsrd, (void)cvarsrds, (void)cvard, (void)cvarvd;
} }
Cbuf_AddText("vid_restart\n", RESTRICT_LOCAL); Cbuf_AddText("vid_restart\n", RESTRICT_LOCAL);
@ -1288,9 +1313,11 @@ void M_Menu_Lighting_f (void)
#ifndef MINIMAL #ifndef MINIMAL
extern cvar_t r_vertexlight, r_vertexdlights; extern cvar_t r_vertexlight, r_vertexdlights;
#endif #endif
extern cvar_t r_stains, r_shadows, r_shadow_realtime_world, r_loadlits, r_dynamic; extern cvar_t r_stains, r_shadows, r_loadlits;
extern cvar_t r_lightstylesmooth, r_nolightdir; extern cvar_t r_lightstylesmooth, r_nolightdir;
extern cvar_t r_shadow_realtime_dlight, r_shadow_realtime_dlight_shadows; #ifdef RTLIGHTS
extern cvar_t r_dynamic, r_shadow_realtime_world, r_shadow_realtime_dlight, r_shadow_realtime_dlight_shadows;
#endif
extern cvar_t r_fb_models, r_rocketlight, r_powerupglow; extern cvar_t r_fb_models, r_rocketlight, r_powerupglow;
extern cvar_t v_powerupshell, r_explosionlight; extern cvar_t v_powerupshell, r_explosionlight;
//extern cvar_t r_fb_bmodels, r_shadow_realtime_world_lightmaps, r_lightstylespeed; //extern cvar_t r_fb_bmodels, r_shadow_realtime_world_lightmaps, r_lightstylespeed;
@ -1298,10 +1325,12 @@ void M_Menu_Lighting_f (void)
static const char *lightingopts[] = static const char *lightingopts[] =
{ {
"Standard", "Standard",
#ifdef RTLIGHTS
"Realtime", "Realtime",
"RT+Shadows", "RT+Shadows",
#ifndef MINIMAL #ifndef MINIMAL
"Vertex", "Vertex",
#endif
#endif #endif
NULL NULL
}; };
@ -1309,11 +1338,13 @@ void M_Menu_Lighting_f (void)
{ {
"None", "None",
"Standard", "Standard",
#ifdef RTLIGHTS
"Realtime", "Realtime",
"RT+Shadows", "RT+Shadows",
"Threaded Lightmaps", "Threaded Lightmaps",
#ifndef MINIMAL #ifndef MINIMAL
"Vertex", "Vertex",
#endif
#endif #endif
NULL NULL
}; };
@ -1381,9 +1412,9 @@ void M_Menu_Lighting_f (void)
int y; int y;
menu_t *menu = M_Options_Title(&y, sizeof(lightingmenuinfo_t)); menu_t *menu = M_Options_Title(&y, sizeof(lightingmenuinfo_t));
#ifdef RTLIGHTS
int lightselect, dlightselect; int lightselect, dlightselect;
#ifdef RTLIGHTS
if (r_shadow_realtime_world.ival) if (r_shadow_realtime_world.ival)
{ {
if (r_shadow_realtime_world_shadows.ival) if (r_shadow_realtime_world_shadows.ival)
@ -1391,13 +1422,16 @@ void M_Menu_Lighting_f (void)
else else
lightselect = 1; lightselect = 1;
} }
#ifndef MINIMAL
else if (r_vertexlight.ival)
lightselect = 3;
#endif
else else
#endif
#ifndef MINIMAL
if (r_vertexlight.ival)
lightselect = 3;
else
#endif
lightselect = 0; lightselect = 0;
#ifdef RTLIGHTS
if (r_shadow_realtime_dlight.ival) if (r_shadow_realtime_dlight.ival)
{ {
if (r_shadow_realtime_dlight_shadows.ival) if (r_shadow_realtime_dlight_shadows.ival)
@ -1411,11 +1445,12 @@ void M_Menu_Lighting_f (void)
else if (r_vertexdlights.ival) else if (r_vertexdlights.ival)
dlightselect = 5; dlightselect = 5;
#endif #endif
else if (r_dynamic.ival > 0) else
#endif
if (r_dynamic.ival > 0)
dlightselect = 1; dlightselect = 1;
else else
dlightselect = 0; dlightselect = 0;
#endif
{ {
lightingmenuinfo_t *info = menu->data; lightingmenuinfo_t *info = menu->data;
@ -1423,9 +1458,9 @@ void M_Menu_Lighting_f (void)
{ {
MB_REDTEXT("Lighting Options", false), MB_REDTEXT("Lighting Options", false),
MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", false), MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", false),
#ifdef RTLIGHTS
MB_COMBORETURN("Lighting Mode", lightingopts, lightselect, info->lightcombo, "Selects method used for world lighting. Realtime lighting requires appropriate realtime lighting files for maps."), MB_COMBORETURN("Lighting Mode", lightingopts, lightselect, info->lightcombo, "Selects method used for world lighting. Realtime lighting requires appropriate realtime lighting files for maps."),
MB_COMBORETURN("Dynamic Lighting Mode", dlightopts, dlightselect, info->dlightcombo, "Selects method used for dynamic lighting such as explosion lights and muzzle flashes."), MB_COMBORETURN("Dynamic Lighting Mode", dlightopts, dlightselect, info->dlightcombo, "Selects method used for dynamic lighting such as explosion lights and muzzle flashes."),
#ifdef RTLIGHTS
MB_CHECKBOXCVARTIP("Soft Shadows", r_shadow_shadowmapping, 0, "Enables softer shadows instead of course-edged pixelated shadows."), MB_CHECKBOXCVARTIP("Soft Shadows", r_shadow_shadowmapping, 0, "Enables softer shadows instead of course-edged pixelated shadows."),
MB_CMD("Apply Lighting", M_VideoApplyShadowLighting, "Applies set lighting modes and restarts video."), MB_CMD("Apply Lighting", M_VideoApplyShadowLighting, "Applies set lighting modes and restarts video."),
MB_SPACING(4), MB_SPACING(4),
@ -1456,6 +1491,7 @@ menucombo_t *skillcombo;
menucombo_t *mapcombo; menucombo_t *mapcombo;
} singleplayerinfo_t; } singleplayerinfo_t;
#ifndef CLIENTONLY
static const char *maplist_q1[] = static const char *maplist_q1[] =
{ {
"start", "start",
@ -1528,7 +1564,7 @@ static const char *mapoptions_q1[] =
NULL NULL
}; };
#ifdef Q2CLIENT
static const char *maplist_q2[] = static const char *maplist_q2[] =
{ {
"base1", "base1",
@ -1614,6 +1650,8 @@ static const char *mapoptions_q2[] =
"boss2 (Unit 9 Boss Levels: Final Showdown)", "boss2 (Unit 9 Boss Levels: Final Showdown)",
NULL NULL
}; };
#endif
#endif
qboolean M_Apply_SP_Cheats (union menuoption_s *op,struct menu_s *menu,int key) qboolean M_Apply_SP_Cheats (union menuoption_s *op,struct menu_s *menu,int key)
{ {
@ -1638,8 +1676,10 @@ qboolean M_Apply_SP_Cheats (union menuoption_s *op,struct menu_s *menu,int key)
break; break;
} }
#ifndef CLIENTONLY
if ((unsigned int)info->mapcombo->selectedoption >= sizeof(maplist_q1)/sizeof(maplist_q1[0])) if ((unsigned int)info->mapcombo->selectedoption >= sizeof(maplist_q1)/sizeof(maplist_q1[0]))
Cbuf_AddText(va("map %s\n", maplist_q1[info->mapcombo->selectedoption]), RESTRICT_LOCAL); Cbuf_AddText(va("map %s\n", maplist_q1[info->mapcombo->selectedoption]), RESTRICT_LOCAL);
#endif
M_RemoveMenu(menu); M_RemoveMenu(menu);
Cbuf_AddText("menu_spcheats\n", RESTRICT_LOCAL); Cbuf_AddText("menu_spcheats\n", RESTRICT_LOCAL);
@ -1649,6 +1689,7 @@ qboolean M_Apply_SP_Cheats (union menuoption_s *op,struct menu_s *menu,int key)
void M_Menu_Singleplayer_Cheats_Quake (void) void M_Menu_Singleplayer_Cheats_Quake (void)
{ {
#ifndef CLIENTONLY
static const char *skilloptions[] = static const char *skilloptions[] =
{ {
"Easy", "Easy",
@ -1658,15 +1699,13 @@ void M_Menu_Singleplayer_Cheats_Quake (void)
"None Set", "None Set",
NULL NULL
}; };
singleplayerinfo_t *info;
int cursorpositionY;
#ifndef CLIENTONLY
int currentskill; int currentskill;
int currentmap; int currentmap;
extern cvar_t sv_gravity, sv_cheats, sv_maxspeed, skill; extern cvar_t sv_gravity, sv_cheats, sv_maxspeed, skill;
extern cvar_t host_mapname; extern cvar_t host_mapname;
#endif #endif
singleplayerinfo_t *info;
int cursorpositionY;
int y; int y;
menu_t *menu = M_Options_Title(&y, sizeof(*info)); menu_t *menu = M_Options_Title(&y, sizeof(*info));
info = menu->data; info = menu->data;
@ -1725,6 +1764,7 @@ void M_Menu_Singleplayer_Cheats_Quake (void)
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 170, 0, cursorpositionY, NULL, false); menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 170, 0, cursorpositionY, NULL, false);
} }
#ifdef Q2CLIENT
// Quake 2 // Quake 2
typedef struct { typedef struct {
@ -1760,7 +1800,6 @@ qboolean M_Apply_SP_Cheats_Q2 (union menuoption_s *op,struct menu_s *menu,int ke
return true; return true;
} }
void M_Menu_Singleplayer_Cheats_Quake2 (void) void M_Menu_Singleplayer_Cheats_Quake2 (void)
{ {
@ -1848,11 +1887,9 @@ void M_Menu_Singleplayer_Cheats_Quake2 (void)
menu->selecteditem = (union menuoption_s *)info->skillcombo; menu->selecteditem = (union menuoption_s *)info->skillcombo;
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 170, 0, cursorpositionY, NULL, false); menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 170, 0, cursorpositionY, NULL, false);
} }
#endif // Quake 2
// Hexen 2 #ifdef HEXEN2 // Hexen 2
// Quake 2
typedef struct { typedef struct {
menucombo_t *skillcombo; menucombo_t *skillcombo;
menucombo_t *mapcombo; menucombo_t *mapcombo;
@ -2203,6 +2240,7 @@ void M_Menu_Singleplayer_Cheats_Hexen2 (void)
menu->selecteditem = (union menuoption_s *)info->skillcombo; menu->selecteditem = (union menuoption_s *)info->skillcombo;
menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 250, 0, cursorpositionY, NULL, false); menu->cursoritem = (menuoption_t*)MC_AddWhiteText(menu, 250, 0, cursorpositionY, NULL, false);
} }
#endif
void M_Menu_Singleplayer_Cheats_f (void) void M_Menu_Singleplayer_Cheats_f (void)
{ {

View File

@ -295,8 +295,8 @@ void M_Menu_SinglePlayer_f (void)
#ifndef CLIENTONLY #ifndef CLIENTONLY
menubutton_t *b; menubutton_t *b;
mpic_t *p; mpic_t *p;
#endif
static menuresel_t resel; static menuresel_t resel;
#endif
Key_Dest_Add(kdm_emenu); Key_Dest_Add(kdm_emenu);
m_state = m_complex; m_state = m_complex;

View File

@ -1276,7 +1276,7 @@ void M_Reinit(void)
{ {
M_Init_Internal(); M_Init_Internal();
CSQC_UnconnectedInit(); (void)CSQC_UnconnectedInit();
} }
} }
@ -1329,7 +1329,7 @@ void M_Reinit(void)
if (!MP_Init()) if (!MP_Init())
#endif #endif
{ {
CSQC_UnconnectedInit(); (void)CSQC_UnconnectedInit();
} }
} }
void M_Init (void) void M_Init (void)

View File

@ -333,7 +333,7 @@ void SV_Master_Worker_Resolve(void *ctx, void *data, size_t a, size_t b)
first = false; first = false;
} }
work->success = !!found; work->success = !!found;
COM_AddWork(0, SV_Master_Worker_Resolved, NULL, work, a, b); COM_AddWork(WG_MAIN, SV_Master_Worker_Resolved, NULL, work, a, b);
} }
/* /*
@ -388,7 +388,7 @@ void SV_Master_Heartbeat (void)
struct thr_res *work = Z_Malloc(sizeof(*work) + strlen(net_masterlist[i].cv.string)); struct thr_res *work = Z_Malloc(sizeof(*work) + strlen(net_masterlist[i].cv.string));
strcpy(work->str, net_masterlist[i].cv.string); strcpy(work->str, net_masterlist[i].cv.string);
net_masterlist[i].resolving = true; //don't spam work net_masterlist[i].resolving = true; //don't spam work
COM_AddWork(0, SV_Master_Worker_Resolve, NULL, work, i, 0); COM_AddWork(WG_MAIN, SV_Master_Worker_Resolve, NULL, work, i, 0);
} }
} }
else else
@ -1259,9 +1259,10 @@ serverinfo_t *Master_FindRoute(netadr_t target)
if (chain) if (chain)
*chain = 0; *chain = 0;
NET_StringToAdr(cl_proxyaddr.string, 0, &pa); if (NET_StringToAdr(cl_proxyaddr.string, 0, &pa))
prox = Master_InfoForServer(&pa);
prox = Master_InfoForServer(&pa); else
prox = NULL;
if (chain) if (chain)
*chain = '@'; *chain = '@';
} }
@ -1419,7 +1420,7 @@ void CLMaster_AddMaster_Worker_Resolve(void *ctx, void *data, size_t a, size_t b
//add the main ip address //add the main ip address
work->adr = adrs[0]; work->adr = adrs[0];
COM_AddWork(0, CLMaster_AddMaster_Worker_Resolved, NULL, work, a, b); COM_AddWork(WG_MAIN, CLMaster_AddMaster_Worker_Resolved, NULL, work, a, b);
//add dupes too (eg: ipv4+ipv6) //add dupes too (eg: ipv4+ipv6)
for (i = 1; i < found; i++) for (i = 1; i < found; i++)
@ -1445,7 +1446,7 @@ void CLMaster_AddMaster_Worker_Resolve(void *ctx, void *data, size_t a, size_t b
alt->sends = 1; alt->sends = 1;
alt->nosave = true; alt->nosave = true;
alt->adr = adrs[i]; alt->adr = adrs[i];
COM_AddWork(0, CLMaster_AddMaster_Worker_Resolved, NULL, alt, a, b); COM_AddWork(WG_MAIN, CLMaster_AddMaster_Worker_Resolved, NULL, alt, a, b);
} }
} }
} }
@ -1468,7 +1469,7 @@ void Master_AddMaster (char *address, enum mastertype_e mastertype, enum masterp
strcpy(mast->address, address); strcpy(mast->address, address);
mast->sends = 1; mast->sends = 1;
COM_AddWork(1, CLMaster_AddMaster_Worker_Resolve, NULL, mast, 0, 0); COM_AddWork(WG_LOADER, CLMaster_AddMaster_Worker_Resolve, NULL, mast, 0, 0);
} }
void MasterInfo_Shutdown(void) void MasterInfo_Shutdown(void)
@ -2104,7 +2105,10 @@ char *jsonnode(int level, char *node)
if (level == 1) if (level == 1)
{ {
if (!strcmp(key, "IPAddress")) if (!strcmp(key, "IPAddress"))
NET_StringToAdr(com_token, 0, &adr); {
if (!NET_StringToAdr(com_token, 0, &adr))
adr.type = NA_INVALID;
}
if (!strcmp(key, "Port")) if (!strcmp(key, "Port"))
port = atoi(com_token); port = atoi(com_token);
if (!strcmp(key, "DNS")) if (!strcmp(key, "DNS"))
@ -2843,14 +2847,14 @@ int CL_ReadServerInfo(char *msg, enum masterprotocol_e prototype, qboolean favor
{ {
case PROTOCOL_VERSION_QW: info->special = SS_QUAKEWORLD; break; case PROTOCOL_VERSION_QW: info->special = SS_QUAKEWORLD; break;
#ifdef NQPROT #ifdef NQPROT
case NQ_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; case PROTOCOL_VERSION_NQ: info->special = SS_NETQUAKE; break;
case H2_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; //erk case PROTOCOL_VERSION_H2: info->special = SS_NETQUAKE; break; //erk
case NEHD_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; case PROTOCOL_VERSION_NEHD: info->special = SS_NETQUAKE; break;
case FITZ_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; case PROTOCOL_VERSION_FITZ: info->special = SS_NETQUAKE; break;
case RMQ_PROTOCOL_VERSION: info->special = SS_NETQUAKE; break; case PROTOCOL_VERSION_RMQ: info->special = SS_NETQUAKE; break;
case DP5_PROTOCOL_VERSION: info->special = SS_DARKPLACES; break; //dp actually says 3... but hey, that's dp being WEIRD. case PROTOCOL_VERSION_DP5: info->special = SS_DARKPLACES; break; //dp actually says 3... but hey, that's dp being WEIRD.
case DP6_PROTOCOL_VERSION: info->special = SS_DARKPLACES; break; case PROTOCOL_VERSION_DP6: info->special = SS_DARKPLACES; break;
case DP7_PROTOCOL_VERSION: info->special = SS_DARKPLACES; break; case PROTOCOL_VERSION_DP7: info->special = SS_DARKPLACES; break;
#endif #endif
default: default:
if (PROTOCOL_VERSION_Q2 >= info->protocol && info->protocol >= PROTOCOL_VERSION_Q2_MIN) if (PROTOCOL_VERSION_Q2 >= info->protocol && info->protocol >= PROTOCOL_VERSION_Q2_MIN)

View File

@ -847,11 +847,10 @@ static void Classic_BrightField (vec3_t org)
extern float r_avertexnormals[NUMVERTEXNORMALS][3]; extern float r_avertexnormals[NUMVERTEXNORMALS][3];
float beamlength = 16; float beamlength = 16;
int count;
int i; int i;
cparticle_t *p; cparticle_t *p;
float angle; float angle;
float sr, sp, sy, cr, cp, cy; float sp, sy, cp, cy;
vec3_t forward; vec3_t forward;
float dist; float dist;
@ -859,12 +858,15 @@ static void Classic_BrightField (vec3_t org)
particleframe = cl_framecount; particleframe = cl_framecount;
dist = 64; dist = 64;
count = 50;
if (!avelocities[0][0]) if (!avelocities[0][0])
{ {
for (i=0 ; i<NUMVERTEXNORMALS*3 ; i++) for (i=0 ; i<NUMVERTEXNORMALS ; i++)
avelocities[0][i] = (rand()&255) * 0.01; {
avelocities[i][0] = (rand()&255) * 0.01;
avelocities[i][1] = (rand()&255) * 0.01;
avelocities[i][2] = (rand()&255) * 0.01;
}
} }
for (i=0 ; i<NUMVERTEXNORMALS ; i++) for (i=0 ; i<NUMVERTEXNORMALS ; i++)
@ -882,9 +884,8 @@ static void Classic_BrightField (vec3_t org)
angle = cl.time * avelocities[i][1]; angle = cl.time * avelocities[i][1];
sp = sin(angle); sp = sin(angle);
cp = cos(angle); cp = cos(angle);
angle = cl.time * avelocities[i][2];
sr = sin(angle); //fixme: is roll important?
cr = cos(angle);
forward[0] = cp*cy; forward[0] = cp*cy;
forward[1] = cp*sy; forward[1] = cp*sy;

View File

@ -2356,6 +2356,9 @@ qboolean PScript_Query(int typenum, int body, char *outstr, int outstrlen)
case SM_BOX: case SM_BOX:
Q_strncatz(outstr, va("spawnmode box %g %g\n", ptype->spawnparam1, ptype->spawnparam2), outstrlen); Q_strncatz(outstr, va("spawnmode box %g %g\n", ptype->spawnparam1, ptype->spawnparam2), outstrlen);
break; break;
case SM_MESHSURFACE:
Q_strncatz(outstr, va("spawnmode meshsurface\n"), outstrlen);
break;
} }
if (ptype->spawnvel || ptype->spawnvelvert || all) if (ptype->spawnvel || ptype->spawnvelvert || all)
Q_strncatz(outstr, va("spawnvel %g %g\n", ptype->spawnvel, ptype->spawnvelvert), outstrlen); Q_strncatz(outstr, va("spawnvel %g %g\n", ptype->spawnvel, ptype->spawnvelvert), outstrlen);
@ -4138,7 +4141,6 @@ static void PScript_ApplyOrgVel(vec3_t oorg, vec3_t ovel, vec3_t eforg, vec3_t a
static void PScript_EffectSpawned(part_type_t *ptype, vec3_t org, vec3_t axis[3], int dlkey, float countscale) static void PScript_EffectSpawned(part_type_t *ptype, vec3_t org, vec3_t axis[3], int dlkey, float countscale)
{ {
extern cvar_t r_rocketlight;
extern cvar_t r_lightflicker; extern cvar_t r_lightflicker;
if (ptype->nummodels) if (ptype->nummodels)
{ {

View File

@ -198,6 +198,7 @@ static void bonemat_fromqcvectors(float *out, const float vx[3], const float vy[
out[10] = vz[2]; out[10] = vz[2];
out[11] = t[2]; out[11] = t[2];
} }
#ifndef SERVERONLY
static void bonemat_fromaxisorg(float *out, vec3_t axis[3], const float t[3]) static void bonemat_fromaxisorg(float *out, vec3_t axis[3], const float t[3])
{ {
out[0] = axis[0][0]; out[0] = axis[0][0];
@ -213,6 +214,7 @@ static void bonemat_fromaxisorg(float *out, vec3_t axis[3], const float t[3])
out[10]= axis[2][2]; out[10]= axis[2][2];
out[11]= t[2]; out[11]= t[2];
} }
#endif
static void bonemat_fromentity(world_t *w, wedict_t *ed, float *trans) static void bonemat_fromentity(world_t *w, wedict_t *ed, float *trans)
{ {
vec3_t d[3], a; vec3_t d[3], a;
@ -932,7 +934,9 @@ void skel_info_f(void)
{ {
if (skelobjects[i].world) if (skelobjects[i].world)
{ {
#ifndef SERVERONLY
extern world_t csqc_world; extern world_t csqc_world;
#endif
Con_Printf("doll %i:\n", i); Con_Printf("doll %i:\n", i);
#ifndef CLIENTONLY #ifndef CLIENTONLY
if (skelobjects[i].world == &sv.world) if (skelobjects[i].world == &sv.world)

View File

@ -325,7 +325,13 @@ extern cvar_t worker_flush;
qboolean COM_DoWork(int thread, qboolean leavelocked); qboolean COM_DoWork(int thread, qboolean leavelocked);
#define COM_MainThreadWork() while (COM_DoWork(0, false) && worker_flush.ival) /*called each frame to do any gl uploads or whatever*/ #define COM_MainThreadWork() while (COM_DoWork(0, false) && worker_flush.ival) /*called each frame to do any gl uploads or whatever*/
#define COM_MainThreadFlush() while (COM_DoWork(0, false)) /*make sure the main thread has done ALL work pending*/ #define COM_MainThreadFlush() while (COM_DoWork(0, false)) /*make sure the main thread has done ALL work pending*/
void COM_AddWork(int thread, void(*func)(void *ctx, void *data, size_t a, size_t b), void *ctx, void *data, size_t a, size_t b); typedef enum
{
WG_MAIN = 0,
WG_LOADER = 1,
WG_COUNT = 2 //main and loaders
} wgroup_t;
void COM_AddWork(wgroup_t thread, void(*func)(void *ctx, void *data, size_t a, size_t b), void *ctx, void *data, size_t a, size_t b);
qboolean COM_HasWork(void); qboolean COM_HasWork(void);
void COM_WorkerFullSync(void); void COM_WorkerFullSync(void);
void COM_DestroyWorkerThread(void); void COM_DestroyWorkerThread(void);

View File

@ -5,10 +5,17 @@
#include "shader.h" #include "shader.h"
#endif #endif
//FIXME: shadowmaps should build a cache of the nearby area surfaces and flag those models as RF_NOSHADOW or something
void Mod_SetParent (mnode_t *node, mnode_t *parent); void Mod_SetParent (mnode_t *node, mnode_t *parent);
static int D3_ClusterForPoint (struct model_s *model, vec3_t point); static int D3_ClusterForPoint (struct model_s *model, vec3_t point);
#ifndef SERVERONLY #ifndef SERVERONLY
void ModD3_GenAreaVBO(void *ctx, void *data, size_t a, size_t b)
{
model_t *sub = ctx;
BE_GenBrushModelVBO(sub);
}
static qboolean Mod_LoadMap_Proc(model_t *model, char *data) static qboolean Mod_LoadMap_Proc(model_t *model, char *data)
{ {
char token[256]; char token[256];
@ -106,6 +113,7 @@ static qboolean Mod_LoadMap_Proc(model_t *model, char *data)
data = COM_ParseOut(data, token, sizeof(token)); data = COM_ParseOut(data, token, sizeof(token));
b[surf].shader = R_RegisterShader_Vertex(token); b[surf].shader = R_RegisterShader_Vertex(token);
// R_BuildDefaultTexnums(NULL, b[surf].shader);
data = COM_ParseOut(data, token, sizeof(token)); data = COM_ParseOut(data, token, sizeof(token));
numverts = atoi(token); numverts = atoi(token);
data = COM_ParseOut(data, token, sizeof(token)); data = COM_ParseOut(data, token, sizeof(token));
@ -116,7 +124,7 @@ static qboolean Mod_LoadMap_Proc(model_t *model, char *data)
m[surf].numvertexes = numverts; m[surf].numvertexes = numverts;
m[surf].numindexes = numindicies; m[surf].numindexes = numindicies;
vdata = ZG_Malloc(&model->memgroup, numverts * (sizeof(vecV_t) + sizeof(vec2_t) + sizeof(vec3_t) + sizeof(vec4_t)) + numindicies * sizeof(index_t)); vdata = ZG_Malloc(&sub->memgroup, numverts * (sizeof(vecV_t) + sizeof(vec2_t) + sizeof(vec3_t) + sizeof(vec4_t)) + numindicies * sizeof(index_t));
m[surf].colors4f_array[0] = (vec4_t*)vdata;vdata += sizeof(vec4_t)*numverts; m[surf].colors4f_array[0] = (vec4_t*)vdata;vdata += sizeof(vec4_t)*numverts;
m[surf].xyz_array = (vecV_t*)vdata;vdata += sizeof(vecV_t)*numverts; m[surf].xyz_array = (vecV_t*)vdata;vdata += sizeof(vecV_t)*numverts;
@ -194,7 +202,8 @@ static qboolean Mod_LoadMap_Proc(model_t *model, char *data)
sub->fromgame = fg_doom3; sub->fromgame = fg_doom3;
sub->type = mod_brush; sub->type = mod_brush;
BE_GenBrushModelVBO(sub); COM_AddWork(WG_MAIN, ModD3_GenAreaVBO, sub, NULL, MLS_LOADED, 0);
COM_AddWork(WG_MAIN, Mod_ModelLoaded, sub, NULL, MLS_LOADED, 0);
} }
else if (!strcmp(token, "shadowModel")) else if (!strcmp(token, "shadowModel"))
{ {
@ -358,7 +367,8 @@ static qboolean Mod_LoadMap_Proc(model_t *model, char *data)
qboolean R_CullBox (vec3_t mins, vec3_t maxs); qboolean R_CullBox (vec3_t mins, vec3_t maxs);
static int walkno; static int walkno;
/*convert each portal to a 2d box, because its much much simpler than true poly clipping*/ /*fixme: convert each portal to a 2d box, because its much much simpler than true poly clipping*/
/*fixme: use occlusion tests, with temporal coherance (draw the portal as black or something if we think its invisible)*/
static void D3_WalkPortal(model_t *mod, int start, vec_t bounds[4], unsigned char *vis) static void D3_WalkPortal(model_t *mod, int start, vec_t bounds[4], unsigned char *vis)
{ {
int i; int i;
@ -393,70 +403,56 @@ static void D3_WalkPortal(model_t *mod, int start, vec_t bounds[4], unsigned cha
unsigned char *D3_CalcVis(model_t *mod, vec3_t org) unsigned char *D3_CalcVis(model_t *mod, vec3_t org)
{ {
int start; int start;
static unsigned char vis[256]; static qbyte visbuf[256];
qbyte *usevis;
vec_t newbounds[4]; vec_t newbounds[4];
int area;
entity_t ent;
start = D3_ClusterForPoint(mod, org); start = D3_ClusterForPoint(mod, org);
/*figure out which area we're in*/ /*figure out which area we're in*/
if (start < 0) if (start < 0)
{ {
/*outside the world, just make it all visible, and take the fps hit*/ /*outside the world, just make it all visible, and take the fps hit*/
memset(vis, 255, 4); memset(visbuf, 255, 4);
return vis; usevis = visbuf;
} }
else if (r_novis.value) else if (r_novis.value)
return vis; usevis = visbuf;
else else
{ {
memset(vis, 0, 4); memset(visbuf, 0, 4);
/*make a bounds the size of the view*/ /*make a bounds the size of the view*/
newbounds[0] = -1; newbounds[0] = -1;
newbounds[1] = 1; newbounds[1] = 1;
newbounds[2] = -1; newbounds[2] = -1;
newbounds[3] = 1; newbounds[3] = 1;
walkno++; walkno++;
D3_WalkPortal(mod, start, newbounds, vis); D3_WalkPortal(mod, start, newbounds, visbuf);
// Con_Printf("%x %x %x %x\n", vis[0], vis[1], vis[2], vis[3]); // Con_Printf("%x %x %x %x\n", vis[0], vis[1], vis[2], vis[3]);
return vis; usevis = visbuf;
} }
}
/*emits static entities, one for each area, which is only visible if that area is in the vis*/
void D3_GenerateAreas(model_t *mod)
{
entity_t *ent;
int area;
//now generate the various entities for that region.
memset(&ent, 0, sizeof(ent));
for (area = 0; area < 256*8; area++) for (area = 0; area < 256*8; area++)
{ {
if (cl.num_statics == cl_max_static_entities) if (usevis[area>>3] & (1u<<(area&7)))
{ {
cl_max_static_entities += 16; ent.model = Mod_FindName(va("*_area%i", area));
cl_static_entities = BZ_Realloc(cl_static_entities, sizeof(*cl_static_entities) * cl_max_static_entities); ent.scale = 1;
AngleVectors(ent.angles, ent.axis[0], ent.axis[1], ent.axis[2]);
VectorInverse(ent.axis[1]);
ent.shaderRGBAf[0] = 1;
ent.shaderRGBAf[1] = 1;
ent.shaderRGBAf[2] = 1;
ent.shaderRGBAf[3] = 1;
V_AddEntity(&ent);
} }
ent = &cl_static_entities[cl.num_statics].ent;
cl_static_entities[cl.num_statics].mdlidx = 0;
memset(ent, 0, sizeof(*ent));
ent->model = Mod_FindName(va("*_area%i", area));
ent->scale = 1;
AngleVectors(ent->angles, ent->axis[0], ent->axis[1], ent->axis[2]);
VectorInverse(ent->axis[1]);
ent->shaderRGBAf[0] = 1;
ent->shaderRGBAf[1] = 1;
ent->shaderRGBAf[2] = 1;
ent->shaderRGBAf[3] = 1;
/*put it in that area*/
cl_static_entities[cl.num_statics].pvscache.num_leafs = 1;
cl_static_entities[cl.num_statics].pvscache.leafnums[0] = area;
if (ent->model && ent->model->loadstate != MLS_NOTLOADED)
cl.num_statics++;
else
break;
} }
return usevis;
} }
#endif #endif
@ -526,7 +522,7 @@ typedef struct cm_surface_s
int numedges; int numedges;
vec4_t *edge; vec4_t *edge;
shader_t *shader; // shader_t *shader;
struct cm_surface_s *next; struct cm_surface_s *next;
} cm_surface_t; } cm_surface_t;
@ -1167,7 +1163,8 @@ qboolean QDECL D3_LoadMap_CollisionMap(model_t *mod, void *buf, size_t bufsize)
buf = COM_ParseOut(buf, token, sizeof(token)); buf = COM_ParseOut(buf, token, sizeof(token));
#ifndef SERVERONLY #ifndef SERVERONLY
surf->shader = R_RegisterShader_Vertex(token); // surf->shader = R_RegisterShader_Vertex(token);
// R_BuildDefaultTexnums(NULL, surf->shader);
#endif #endif
if (filever == 3) if (filever == 3)
@ -1320,6 +1317,8 @@ qboolean QDECL D3_LoadMap_CollisionMap(model_t *mod, void *buf, size_t bufsize)
BZ_Free(buf); BZ_Free(buf);
} }
#endif #endif
return true; return true;
} }

View File

@ -2801,7 +2801,7 @@ void R_GenWorldEBO(void *ctx, void *data, size_t a, size_t b)
Surf_SimpleWorld(es, pvs); Surf_SimpleWorld(es, pvs);
COM_AddWork(0, R_GeneratedWorldEBO, es, NULL, 0, 0); COM_AddWork(WG_MAIN, R_GeneratedWorldEBO, es, NULL, 0, 0);
} }
#endif #endif
@ -2816,7 +2816,6 @@ void Surf_DrawWorld (void)
//surfvis vs entvis - the key difference is that surfvis is surfaces while entvis is volume. though surfvis should be frustum culled also for lighting. entvis doesn't care. //surfvis vs entvis - the key difference is that surfvis is surfaces while entvis is volume. though surfvis should be frustum culled also for lighting. entvis doesn't care.
qbyte *surfvis, *entvis; qbyte *surfvis, *entvis;
qbyte frustumvis_[MAX_MAP_LEAFS/8]; qbyte frustumvis_[MAX_MAP_LEAFS/8];
extern cvar_t temp1;
RSpeedLocals(); RSpeedLocals();
if (r_refdef.flags & RDF_NOWORLDMODEL) if (r_refdef.flags & RDF_NOWORLDMODEL)
@ -2883,7 +2882,7 @@ void Surf_DrawWorld (void)
for (i = 0; i < MAX_LIGHTSTYLES; i++) for (i = 0; i < MAX_LIGHTSTYLES; i++)
webogenerating->lightstylevalues[i] = d_lightstylevalue[i]; webogenerating->lightstylevalues[i] = d_lightstylevalue[i];
Q_strncpyz(webogenerating->dbgid, "webostate", sizeof(webogenerating->dbgid)); Q_strncpyz(webogenerating->dbgid, "webostate", sizeof(webogenerating->dbgid));
COM_AddWork(1, R_GenWorldEBO, webogenerating, NULL, 0, 0); COM_AddWork(WG_LOADER, R_GenWorldEBO, webogenerating, NULL, 0, 0);
} }
} }
if (webostate) if (webostate)
@ -3057,8 +3056,8 @@ void Surf_Clear(model_t *mod)
{ {
int i; int i;
vbo_t *vbo; vbo_t *vbo;
if (mod->fromgame == fg_doom3) // if (mod->fromgame == fg_doom3)
return;/*they're on the hunk*/ // return;/*they're on the hunk*/
#ifdef THREADEDWORLD #ifdef THREADEDWORLD
while(webogenerating) while(webogenerating)
@ -3580,11 +3579,6 @@ TRACE(("dbg: Surf_NewMap: tp\n"));
TP_NewMap(); TP_NewMap();
R_SetSky(cl.skyname); R_SetSky(cl.skyname);
#ifdef MAP_PROC
if (cl.worldmodel->fromgame == fg_doom3)
D3_GenerateAreas(cl.worldmodel);
#endif
for (i = 0; i < cl.num_statics; i++) for (i = 0; i < cl.num_statics; i++)
{ {
vec3_t mins, maxs; vec3_t mins, maxs;

View File

@ -252,6 +252,7 @@ cvar_t vid_dpi_x = CVARFD ("vid_dpi_x", "0", CVAR_NOSET, "For mods that ne
cvar_t vid_dpi_y = CVARFD ("vid_dpi_y", "0", CVAR_NOSET, "For mods that need to determine the physical screen size (like with touchscreens). 0 means unknown"); cvar_t vid_dpi_y = CVARFD ("vid_dpi_y", "0", CVAR_NOSET, "For mods that need to determine the physical screen size (like with touchscreens). 0 means unknown");
cvar_t r_stereo_separation = CVARD("r_stereo_separation", "4", "How far apart your eyes are, in quake units. A non-zero value will enable stereoscoping rendering. You might need some of them retro 3d glasses. Hardware support is recommended, see r_stereo_context."); cvar_t r_stereo_separation = CVARD("r_stereo_separation", "4", "How far apart your eyes are, in quake units. A non-zero value will enable stereoscoping rendering. You might need some of them retro 3d glasses. Hardware support is recommended, see r_stereo_context.");
cvar_t r_stereo_convergence = CVARD("r_stereo_convergence", "0", "Nudges the angle of each eye inwards when using stereoscopic rendering.");
cvar_t r_stereo_method = CVARFD("r_stereo_method", "0", CVAR_ARCHIVE, "Value 0 = Off.\nValue 1 = Attempt hardware acceleration. Requires vid_restart.\nValue 2 = red/cyan.\nValue 3 = red/blue.\nValue 4=red/green.\nValue 5=eye strain."); cvar_t r_stereo_method = CVARFD("r_stereo_method", "0", CVAR_ARCHIVE, "Value 0 = Off.\nValue 1 = Attempt hardware acceleration. Requires vid_restart.\nValue 2 = red/cyan.\nValue 3 = red/blue.\nValue 4=red/green.\nValue 5=eye strain.");
extern cvar_t r_dodgytgafiles; extern cvar_t r_dodgytgafiles;
@ -737,6 +738,7 @@ void Renderer_Init(void)
Cvar_Register (&r_wireframe_smooth, GRAPHICALNICETIES); Cvar_Register (&r_wireframe_smooth, GRAPHICALNICETIES);
Cvar_Register (&r_refract_fbo, GRAPHICALNICETIES); Cvar_Register (&r_refract_fbo, GRAPHICALNICETIES);
Cvar_Register (&r_stereo_separation, GRAPHICALNICETIES); Cvar_Register (&r_stereo_separation, GRAPHICALNICETIES);
Cvar_Register (&r_stereo_convergence, GRAPHICALNICETIES);
Cvar_Register (&r_stereo_method, GRAPHICALNICETIES); Cvar_Register (&r_stereo_method, GRAPHICALNICETIES);
Cvar_Register(&scr_viewsize, SCREENOPTIONS); Cvar_Register(&scr_viewsize, SCREENOPTIONS);

View File

@ -206,6 +206,7 @@ static ALC_API ALCboolean (ALC_APIENTRY *palcIsExtensionPresent)( ALCdevice
//#include "AL/al.h" //#include "AL/al.h"
//#include "AL/alext.h" //#include "AL/alext.h"
#if defined(VOICECHAT)
//capture-specific stuff //capture-specific stuff
static ALC_API void (ALC_APIENTRY *palcGetIntegerv)( ALCdevice *device, ALCenum param, ALCsizei size, ALCint *data ); static ALC_API void (ALC_APIENTRY *palcGetIntegerv)( ALCdevice *device, ALCenum param, ALCsizei size, ALCint *data );
static ALC_API ALCdevice * (ALC_APIENTRY *palcCaptureOpenDevice)( const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize ); static ALC_API ALCdevice * (ALC_APIENTRY *palcCaptureOpenDevice)( const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize );
@ -216,6 +217,7 @@ static ALC_API void (ALC_APIENTRY *palcCaptureSamples)( ALCdevice *dev
#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310 #define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311 #define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
#define ALC_CAPTURE_SAMPLES 0x312 #define ALC_CAPTURE_SAMPLES 0x312
#endif
#endif #endif

View File

@ -831,7 +831,7 @@ void S_LoadSoundWorker (void *ctx, void *ctxdata, size_t a, size_t b)
else else
{ {
Con_SafePrintf ("Couldn't load %s\n", namebuffer); Con_SafePrintf ("Couldn't load %s\n", namebuffer);
COM_AddWork(0, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); COM_AddWork(WG_MAIN, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0);
return; return;
} }
} }
@ -880,7 +880,7 @@ void S_LoadSoundWorker (void *ctx, void *ctxdata, size_t a, size_t b)
{ {
//FIXME: check to see if queued for download. //FIXME: check to see if queued for download.
Con_DPrintf ("Couldn't load %s\n", namebuffer); Con_DPrintf ("Couldn't load %s\n", namebuffer);
COM_AddWork(0, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); COM_AddWork(WG_MAIN, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0);
return; return;
} }
@ -891,7 +891,7 @@ void S_LoadSoundWorker (void *ctx, void *ctxdata, size_t a, size_t b)
if (AudioInputPlugins[i](s, data, filesize, snd_speed)) if (AudioInputPlugins[i](s, data, filesize, snd_speed))
{ {
//wake up the main thread in case it decided to wait for us. //wake up the main thread in case it decided to wait for us.
COM_AddWork(0, S_LoadedOrFailed, s, NULL, SLS_LOADED, 0); COM_AddWork(WG_MAIN, S_LoadedOrFailed, s, NULL, SLS_LOADED, 0);
BZ_Free(data); BZ_Free(data);
return; return;
} }
@ -901,7 +901,7 @@ void S_LoadSoundWorker (void *ctx, void *ctxdata, size_t a, size_t b)
if (s->loadstate != SLS_FAILED) if (s->loadstate != SLS_FAILED)
Con_Printf ("Format not recognised: %s\n", namebuffer); Con_Printf ("Format not recognised: %s\n", namebuffer);
COM_AddWork(0, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0); COM_AddWork(WG_MAIN, S_LoadedOrFailed, s, NULL, SLS_FAILED, 0);
BZ_Free(data); BZ_Free(data);
return; return;
} }
@ -911,7 +911,7 @@ qboolean S_LoadSound (sfx_t *s)
if (s->loadstate == SLS_NOTLOADED && sndcardinfo) if (s->loadstate == SLS_NOTLOADED && sndcardinfo)
{ {
s->loadstate = SLS_LOADING; s->loadstate = SLS_LOADING;
COM_AddWork(1, S_LoadSoundWorker, s, NULL, 0, 0); COM_AddWork(WG_LOADER, S_LoadSoundWorker, s, NULL, 0, 0);
} }
if (s->loadstate == SLS_FAILED) if (s->loadstate == SLS_FAILED)
return false; //it failed to load once before, don't bother trying again. return false; //it failed to load once before, don't bother trying again.

View File

@ -151,8 +151,6 @@ static sfxcache_t *OV_DecodeSome(struct sfx_s *sfx, struct sfxcache_s *buf, ssam
int outspeed = snd_speed; int outspeed = snd_speed;
int errorcode = 1;
// Con_Printf("Minlength = %03i ", minlength); // Con_Printf("Minlength = %03i ", minlength);
start *= 2*dec->srcchannels; start *= 2*dec->srcchannels;
@ -287,12 +285,12 @@ static sfxcache_t *OV_DecodeSome(struct sfx_s *sfx, struct sfxcache_s *buf, ssam
} }
return buf; return buf;
} }
static void OV_CanceledDecoder(void *ctx, void *data, size_t a, size_t b) /*static void OV_CanceledDecoder(void *ctx, void *data, size_t a, size_t b)
{ {
sfx_t *s = ctx; sfx_t *s = ctx;
if (s->loadstate != SLS_LOADING) if (s->loadstate != SLS_LOADING)
s->loadstate = SLS_NOTLOADED; s->loadstate = SLS_NOTLOADED;
} }*/
static void OV_CancelDecoder(sfx_t *s) static void OV_CancelDecoder(sfx_t *s)
{ {
ovdecoderbuffer_t *dec; ovdecoderbuffer_t *dec;
@ -320,7 +318,7 @@ static void OV_CancelDecoder(sfx_t *s)
//due to the nature of message passing, we can get into a state where the main thread is going to flag us as loaded when we have already failed. //due to the nature of message passing, we can get into a state where the main thread is going to flag us as loaded when we have already failed.
//that is bad. //that is bad.
//so post a message to the main thread to override it, just in case. //so post a message to the main thread to override it, just in case.
// COM_AddWork(0, OV_CanceledDecoder, s, NULL, SLS_NOTLOADED, 0); // COM_AddWork(WG_MAIN, OV_CanceledDecoder, s, NULL, SLS_NOTLOADED, 0);
s->loadstate = SLS_NOTLOADED; s->loadstate = SLS_NOTLOADED;
} }

View File

@ -84,7 +84,7 @@ void INS_Move(float *movements, int pnum)
void INS_Commands(void) void INS_Commands(void)
{ {
} }
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid))
{ {
} }
void INS_Init(void) void INS_Init(void)

View File

@ -1907,7 +1907,7 @@ void R_DrawNameTags(void)
} }
} }
if ((!cl.spectator && !cls.demoplayback || !scr_autoid.ival) && (!cl.teamplay || !scr_autoid_team.ival)) if (((!cl.spectator && !cls.demoplayback) || !scr_autoid.ival) && (!cl.teamplay || !scr_autoid_team.ival))
return; return;
if (cls.state != ca_active || !cl.validsequence || cl.intermissionmode != IM_NONE) if (cls.state != ca_active || !cl.validsequence || cl.intermissionmode != IM_NONE)
return; return;

View File

@ -211,7 +211,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define SVRANKING #define SVRANKING
#define USE_SQLITE #define USE_SQLITE
#ifdef SERVERONLY #ifdef SERVERONLY
#define USE_MYSQL //allow mysql in dedicated servers. // #define USE_MYSQL //allow mysql in dedicated servers.
#endif #endif
#if defined(_WIN32) && !defined(FTE_SDL) && !defined(WINRT) #if defined(_WIN32) && !defined(FTE_SDL) && !defined(WINRT)
#define SUBSERVERS //use subserver code. #define SUBSERVERS //use subserver code.

View File

@ -265,7 +265,7 @@ void Cbuf_AddText (const char *text, int level)
if (!Sys_IsMainThread()) if (!Sys_IsMainThread())
{ {
COM_AddWork(0, Cbuf_WorkerAddText, NULL, Z_StrDup(text), level, 0); COM_AddWork(WG_MAIN, Cbuf_WorkerAddText, NULL, Z_StrDup(text), level, 0);
return; return;
} }

View File

@ -36,7 +36,7 @@ void Mod_DoCRC(model_t *mod, char *buffer, int buffersize)
for (len = buffersize, p = buffer; len; len--, p++) for (len = buffersize, p = buffer; len; len--, p++)
QCRC_ProcessByte(&crc, *p); QCRC_ProcessByte(&crc, *p);
COM_AddWork(0, Mod_UpdateCRC, (mod->engineflags & MDLF_PLAYER) ? pmodel_name : emodel_name, NULL, crc, 0); COM_AddWork(WG_MAIN, Mod_UpdateCRC, (mod->engineflags & MDLF_PLAYER) ? pmodel_name : emodel_name, NULL, crc, 0);
if (!(mod->engineflags & MDLF_PLAYER)) if (!(mod->engineflags & MDLF_PLAYER))
{ //eyes { //eyes
@ -1025,14 +1025,8 @@ void R_LightArrays(const entity_t *entity, vecV_t *coords, avec4_t *colours, int
} }
} }
} }
#endif
static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float lerp, float expand, float lerpcutoff) static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float lerp, float expand, float lerpcutoff)
{ {
#ifdef SERVERONLY
//no lerping in dedicated servers. too lazy.
mesh->xyz_array = p1->ofsverts;
#else
extern cvar_t r_nolerp; // r_nolightdir is unused extern cvar_t r_nolerp; // r_nolightdir is unused
float blerp = 1-lerp; float blerp = 1-lerp;
int i; int i;
@ -1124,9 +1118,9 @@ static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float
} }
} }
} }
#endif
} }
#endif #endif
#endif
#ifdef SKELETALMODELS #ifdef SKELETALMODELS
/* /*
@ -1151,7 +1145,9 @@ static qboolean Alias_BuildSkelLerps(skellerps_t *lerps, struct framestateregion
galiasanimation_t *g; galiasanimation_t *g;
unsigned int b; unsigned int b;
float totalweight = 0; float totalweight = 0;
#ifndef SERVERONLY
extern cvar_t r_nolerp; extern cvar_t r_nolerp;
#endif
lerps->skeltype = SKEL_IDENTITY; //sometimes nothing else is valid. lerps->skeltype = SKEL_IDENTITY; //sometimes nothing else is valid.
@ -1623,16 +1619,20 @@ void Alias_Shutdown(void)
qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, int surfnum, entity_t *e, qboolean usebones) qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, int surfnum, entity_t *e, qboolean usebones)
{ {
extern cvar_t r_nolerp;
galiasanimation_t *g1, *g2; galiasanimation_t *g1, *g2;
#ifndef SERVERONLY
extern cvar_t r_nolerp;
float lerpcutoff; float lerpcutoff;
#endif
int frame1; int frame1;
int frame2; int frame2;
float lerp; float lerp;
float fg1time; float fg1time;
// float fg2time; // float fg2time;
#ifdef SKELETALMODELS
qboolean bytecolours = false; qboolean bytecolours = false;
#endif
if (!inf->numanimations) if (!inf->numanimations)
{ {
@ -1670,7 +1670,9 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in
#ifndef SERVERONLY #ifndef SERVERONLY
mesh->colors4f_array[0] = inf->ofs_rgbaf; mesh->colors4f_array[0] = inf->ofs_rgbaf;
mesh->colors4b_array = inf->ofs_rgbaub; mesh->colors4b_array = inf->ofs_rgbaub;
#ifdef SKELETALMODELS
bytecolours = !!inf->ofs_rgbaub; bytecolours = !!inf->ofs_rgbaub;
#endif
mesh->st_array = inf->ofs_st_array; mesh->st_array = inf->ofs_st_array;
#endif #endif
mesh->trneighbors = inf->ofs_trineighbours; mesh->trneighbors = inf->ofs_trineighbours;
@ -1923,9 +1925,8 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in
frame2=0; frame2=0;
} }
lerpcutoff = inf->lerpcutoff * r_lerpmuzzlehack.value;
#ifndef SERVERONLY #ifndef SERVERONLY
lerpcutoff = inf->lerpcutoff * r_lerpmuzzlehack.value;
if (/*qrenderer != QR_OPENGL ||*/ Sh_StencilShadowsActive() || e->fatness || lerpcutoff) if (/*qrenderer != QR_OPENGL ||*/ Sh_StencilShadowsActive() || e->fatness || lerpcutoff)
{ {
mesh->xyz2_array = NULL; mesh->xyz2_array = NULL;
@ -1937,7 +1938,9 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in
#endif #endif
{ {
galiaspose_t *p1 = &g1->poseofs[frame1]; galiaspose_t *p1 = &g1->poseofs[frame1];
#ifndef SERVERONLY
galiaspose_t *p2 = &g2->poseofs[frame2]; galiaspose_t *p2 = &g2->poseofs[frame2];
#endif
meshcache.vbo.indicies = inf->vboindicies; meshcache.vbo.indicies = inf->vboindicies;
meshcache.vbo.indexcount = inf->numindexes; meshcache.vbo.indexcount = inf->numindexes;
@ -2054,7 +2057,7 @@ qboolean Mod_Trace_Trisoup(vecV_t *posedata, index_t *indexes, int numindexes, v
float frac; float frac;
vec3_t impactpoint; vec3_t impactpoint;
shader_t *lineshader = NULL; // shader_t *lineshader = NULL;
for (i = 0; i < numindexes; i+=3) for (i = 0; i < numindexes; i+=3)
{ {
@ -2208,7 +2211,9 @@ qboolean Mod_Trace(model_t *model, int forcehullnum, int frame, vec3_t axis[3],
vecV_t *posedata; vecV_t *posedata;
index_t *indexes; index_t *indexes;
int surfnum = 0; int surfnum = 0;
#ifdef SKELETALMODELS
int cursurfnum = -1; int cursurfnum = -1;
#endif
vec3_t start_l, end_l; vec3_t start_l, end_l;
@ -2348,6 +2353,7 @@ static void Mod_ClampModelSize(model_t *mod)
#endif #endif
} }
#ifndef SERVERONLY
static int R_FindTriangleWithEdge (index_t *indexes, int numtris, int start, int end, int ignore) static int R_FindTriangleWithEdge (index_t *indexes, int numtris, int start, int end, int ignore)
{ {
int i; int i;
@ -2377,27 +2383,27 @@ static int R_FindTriangleWithEdge (index_t *indexes, int numtris, int start, int
return match; return match;
} }
static void Mod_BuildTriangleNeighbours ( int *neighbours, index_t *indexes, int numtris ) #endif
{
int i, *n;
index_t *index;
for (i = 0, index = indexes, n = neighbours; i < numtris; i++, index += 3, n += 3)
{
n[0] = R_FindTriangleWithEdge (indexes, numtris, index[1], index[0], i);
n[1] = R_FindTriangleWithEdge (indexes, numtris, index[2], index[1], i);
n[2] = R_FindTriangleWithEdge (indexes, numtris, index[0], index[2], i);
}
}
void Mod_CompileTriangleNeighbours(model_t *loadmodel, galiasinfo_t *galias) void Mod_CompileTriangleNeighbours(model_t *loadmodel, galiasinfo_t *galias)
{ {
#ifndef SERVERONLY #ifndef SERVERONLY
if (Sh_StencilShadowsActive()) if (Sh_StencilShadowsActive())
{ {
int i, *n;
index_t *index;
index_t *indexes = galias->ofs_indexes;
int numtris = galias->numindexes/3;
int *neighbours; int *neighbours;
neighbours = ZG_Malloc(&loadmodel->memgroup, sizeof(int)*galias->numindexes/3*3); neighbours = ZG_Malloc(&loadmodel->memgroup, sizeof(int)*numtris*3);
galias->ofs_trineighbours = neighbours; galias->ofs_trineighbours = neighbours;
Mod_BuildTriangleNeighbours(neighbours, galias->ofs_indexes, galias->numindexes/3);
for (i = 0, index = indexes, n = neighbours; i < numtris; i++, index += 3, n += 3)
{
n[0] = R_FindTriangleWithEdge (indexes, numtris, index[1], index[0], i);
n[1] = R_FindTriangleWithEdge (indexes, numtris, index[2], index[1], i);
n[2] = R_FindTriangleWithEdge (indexes, numtris, index[0], index[2], i);
}
} }
#endif #endif
} }
@ -2571,7 +2577,6 @@ void Mod_BuildTextureVectors(galiasinfo_t *galias)
vec3_t *nv, *sv, *tv; vec3_t *nv, *sv, *tv;
vec2_t *tc; vec2_t *tc;
index_t *idx; index_t *idx;
int vbospace = 0;
//don't fail on dedicated servers //don't fail on dedicated servers
if (!BE_VBO_Begin) if (!BE_VBO_Begin)
@ -3170,39 +3175,6 @@ static void *Q1MDL_LoadSkins_GL (galiasinfo_t *galias, dmdl_t *pq1inmodel, model
frames[0].texels = saved; frames[0].texels = saved;
memcpy(saved, pskintype+1, s); memcpy(saved, pskintype+1, s);
Mod_FloodFillSkin(saved, outskin->skinwidth, outskin->skinheight); Mod_FloodFillSkin(saved, outskin->skinwidth, outskin->skinheight);
#if 0
//the extra underscore is to stop replacement matches
if (!TEXVALID(texture))
{
snprintf(skinname, sizeof(skinname), "%s__%i.", basename, i);
switch (skintranstype)
{
default:
texture = r_nulltex;//R_LoadTexture(skinname,outskin->skinwidth,outskin->skinheight, TF_SOLID8, saved, IF_NOALPHA|IF_NOGAMMA);
if (r_fb_models.ival)
{
snprintf(skinname, sizeof(skinname), "%s__%i_luma.", basename, i);
fbtexture = r_nulltex;//R_LoadTextureFB(skinname, outskin->skinwidth, outskin->skinheight, saved, IF_NOGAMMA);
}
if (r_loadbumpmapping)
{
snprintf(skinname, sizeof(skinname), "%s__%i_bump.", basename, i);
bumptexture = r_nulltex;//R_LoadTexture8BumpPal(skinname, outskin->skinwidth, outskin->skinheight, saved, IF_NOGAMMA);
}
break;
case 2:
texture = r_nulltex;//R_LoadTexture(skinname,outskin->skinwidth,outskin->skinheight, TF_H2_T7G1, saved, IF_NOGAMMA);
break;
case 3:
texture = r_nulltex;//R_LoadTexture(skinname,outskin->skinwidth,outskin->skinheight, TF_H2_TRANS8_0, saved, IF_NOGAMMA);
break;
case 4:
texture = r_nulltex;//R_LoadTexture(skinname,outskin->skinwidth,outskin->skinheight, TF_H2_T4A4, saved, IF_NOGAMMA);
break;
}
}
#endif
} }
else else
frames = ZG_Malloc(&loadmodel->memgroup, sizeof(*frames)); frames = ZG_Malloc(&loadmodel->memgroup, sizeof(*frames));
@ -3344,7 +3316,7 @@ static void *Q1MDL_LoadSkins_GL (galiasinfo_t *galias, dmdl_t *pq1inmodel, model
void Mesh_HandleFramegroupsFile(model_t *mod, galiasinfo_t *galias) void Mesh_HandleFramegroupsFile(model_t *mod, galiasinfo_t *galias)
{ {
unsigned int numanims, a, p, n, g, oldnumanims = galias->numanimations, targpose; unsigned int numanims, a, p, g, oldnumanims = galias->numanimations, targpose;
galiasanimation_t *o, *oldanims = galias->ofsanimations, *frame; galiasanimation_t *o, *oldanims = galias->ofsanimations, *frame;
frameinfo_t *framegroups = ParseFrameInfo(mod->name, &numanims); frameinfo_t *framegroups = ParseFrameInfo(mod->name, &numanims);
if (framegroups) if (framegroups)
@ -3356,7 +3328,7 @@ void Mesh_HandleFramegroupsFile(model_t *mod, galiasinfo_t *galias)
for (p = 0; p < framegroups[a].posecount; p++) for (p = 0; p < framegroups[a].posecount; p++)
{ {
targpose = framegroups[a].firstpose + p; targpose = framegroups[a].firstpose + p;
for (n = 0, g = 0, frame = oldanims; g < oldnumanims; g++, frame++) for (g = 0, frame = oldanims; g < oldnumanims; g++, frame++)
{ {
if (targpose < frame->numposes) if (targpose < frame->numposes)
break; break;
@ -4635,6 +4607,7 @@ qboolean QDECL Mod_LoadQ3Model(model_t *mod, void *buffer, size_t fsize)
vec3_t *tvector; vec3_t *tvector;
vec2_t *st_array; vec2_t *st_array;
md3Shader_t *inshader; md3Shader_t *inshader;
int externalskins;
#endif #endif
// int version; // int version;
int s, i, j, d; int s, i, j, d;
@ -4655,7 +4628,6 @@ qboolean QDECL Mod_LoadQ3Model(model_t *mod, void *buffer, size_t fsize)
int size; int size;
int externalskins;
md3Header_t *header; md3Header_t *header;
md3Surface_t *surf; md3Surface_t *surf;
@ -4671,8 +4643,6 @@ qboolean QDECL Mod_LoadQ3Model(model_t *mod, void *buffer, size_t fsize)
#ifndef SERVERONLY #ifndef SERVERONLY
externalskins = Mod_CountSkinFiles(mod->name); externalskins = Mod_CountSkinFiles(mod->name);
#else
externalskins = 0;
#endif #endif
min[0] = min[1] = min[2] = 0; min[0] = min[1] = min[2] = 0;
@ -5994,7 +5964,6 @@ qboolean QDECL Mod_LoadDarkPlacesModel(model_t *mod, void *buffer, size_t fsize)
unsigned int *index; index_t *outdex; // groan... unsigned int *index; index_t *outdex; // groan...
int numtransforms; int numtransforms;
int numverts;
header = buffer; header = buffer;
@ -6048,7 +6017,6 @@ qboolean QDECL Mod_LoadDarkPlacesModel(model_t *mod, void *buffer, size_t fsize)
mesh->ofs_groupids = BigLong(mesh->ofs_groupids); mesh->ofs_groupids = BigLong(mesh->ofs_groupids);
numverts = mesh->num_verts;
numtransforms = 0; numtransforms = 0;
//count and byteswap the transformations //count and byteswap the transformations
vert = (dpmvertex_t*)((char *)buffer+mesh->ofs_verts); vert = (dpmvertex_t*)((char *)buffer+mesh->ofs_verts);
@ -6064,11 +6032,11 @@ qboolean QDECL Mod_LoadDarkPlacesModel(model_t *mod, void *buffer, size_t fsize)
#ifdef SERVERONLY #ifdef SERVERONLY
transforms = ZG_Malloc(&mod->memgroup, numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t)); transforms = ZG_Malloc(&mod->memgroup, numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t));
#else #else
outst = ZG_Malloc(&mod->memgroup, numverts*sizeof(vec2_t) + numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t)); outst = ZG_Malloc(&mod->memgroup, mesh->num_verts*sizeof(vec2_t) + numtransforms*sizeof(galisskeletaltransforms_t) + mesh->num_tris*3*sizeof(index_t));
m->ofs_st_array = (vec2_t*)outst; m->ofs_st_array = (vec2_t*)outst;
m->numverts = mesh->num_verts; m->numverts = mesh->num_verts;
inst = (float*)((char*)buffer + mesh->ofs_texcoords); inst = (float*)((char*)buffer + mesh->ofs_texcoords);
for (j = 0; j < numverts; j++, outst+=2, inst+=2) for (j = 0; j < mesh->num_verts; j++, outst+=2, inst+=2)
{ {
outst[0] = BigFloat(inst[0]); outst[0] = BigFloat(inst[0]);
outst[1] = BigFloat(inst[1]); outst[1] = BigFloat(inst[1]);

View File

@ -78,10 +78,10 @@ glibc SUCKS. 64bit glibc is depending upon glibc 2.14 because of some implementa
or something. or something.
anyway, the actual interface is the same. the old version might be slower, but when updating glibc generally results in also installing systemd, requiring the new version is NOT an option. anyway, the actual interface is the same. the old version might be slower, but when updating glibc generally results in also installing systemd, requiring the new version is NOT an option.
*/ */
#if defined(__GNUC__) && defined(__LP64__) #if defined(__GNUC__) && defined(__LP64__) && defined(__linux__)
#include <features.h> /* for glibc version */ #include <features.h> /* for glibc version */
#if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 14) #if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 14)
__asm__(".symver oldmemcpy,memcpy@GLIBC_2.2.5"); __asm__(".symver oldmemcpy,memcpy@GLIBC_2.2.5"); void *oldmemcpy(void *__restrict dst, const void *__restrict src, size_t len);
__attribute__ ((visibility ("hidden"))) void *memcpy(void *__restrict dst, const void *__restrict src, size_t len) __attribute__ ((visibility ("hidden"))) void *memcpy(void *__restrict dst, const void *__restrict src, size_t len)
{ {
return oldmemcpy(dst,src,len); return oldmemcpy(dst,src,len);
@ -4763,9 +4763,6 @@ cvar_t worker_flush = CVARD("worker_flush", "1", "If set, process the entire loa
cvar_t worker_count = CVARFDC("worker_count", "", CVAR_NOTFROMSERVER, "Specifies the number of worker threads to utilise.", COM_WorkerCount_Change); cvar_t worker_count = CVARFDC("worker_count", "", CVAR_NOTFROMSERVER, "Specifies the number of worker threads to utilise.", COM_WorkerCount_Change);
cvar_t worker_sleeptime = CVARFD("worker_sleeptime", "0", CVAR_NOTFROMSERVER, "Causes workers to sleep for a period of time after each job."); cvar_t worker_sleeptime = CVARFD("worker_sleeptime", "0", CVAR_NOTFROMSERVER, "Causes workers to sleep for a period of time after each job.");
#define WG_MAIN 0
#define WG_LOADER 1
#define WG_COUNT 2 //main and loaders
#define WORKERTHREADS 16 //max #define WORKERTHREADS 16 //max
/*multithreading worker thread stuff*/ /*multithreading worker thread stuff*/
static int com_liveworkers[WG_COUNT]; static int com_liveworkers[WG_COUNT];
@ -4781,7 +4778,6 @@ static struct com_worker_s
} request; } request;
volatile int ackseq; volatile int ackseq;
} com_worker[WORKERTHREADS]; } com_worker[WORKERTHREADS];
static unsigned int mainthreadid;
qboolean com_workererror; qboolean com_workererror;
static struct com_work_s static struct com_work_s
{ {
@ -4803,8 +4799,7 @@ qboolean COM_HasWork(void)
} }
return false; return false;
} }
//thread==0 is main thread, thread==1 is a worker thread void COM_AddWork(wgroup_t tg, void(*func)(void *ctx, void *data, size_t a, size_t b), void *ctx, void *data, size_t a, size_t b)
void COM_AddWork(int tg, void(*func)(void *ctx, void *data, size_t a, size_t b), void *ctx, void *data, size_t a, size_t b)
{ {
struct com_work_s *work; struct com_work_s *work;
@ -4900,7 +4895,7 @@ qboolean COM_DoWork(int tg, qboolean leavelocked)
//nothing going on, if leavelocked then noone can add anything until we sleep. //nothing going on, if leavelocked then noone can add anything until we sleep.
return false; return false;
} }
static void COM_WorkerSync_ThreadAck(void *ctx, void *data, size_t a, size_t b) /*static void COM_WorkerSync_ThreadAck(void *ctx, void *data, size_t a, size_t b)
{ {
int us; int us;
int *ackbuf = ctx; int *ackbuf = ctx;
@ -4920,6 +4915,7 @@ static void COM_WorkerSync_ThreadAck(void *ctx, void *data, size_t a, size_t b)
Sys_ConditionSignal(com_workercondition[WG_MAIN]); Sys_ConditionSignal(com_workercondition[WG_MAIN]);
Sys_UnlockConditional(com_workercondition[WG_MAIN]); Sys_UnlockConditional(com_workercondition[WG_MAIN]);
} }
*/
/*static void COM_WorkerSync_SignalMain(void *ctx, void *data, size_t a, size_t b) /*static void COM_WorkerSync_SignalMain(void *ctx, void *data, size_t a, size_t b)
{ {
Sys_LockConditional(com_workercondition[a]); Sys_LockConditional(com_workercondition[a]);
@ -5261,9 +5257,9 @@ static void COM_InitWorkerThread(void)
//technically its ready now... //technically its ready now...
if (COM_CheckParm("-noworker")) if (COM_CheckParm("-noworker") || COM_CheckParm("-noworkers"))
{ {
worker_count.string = "0"; worker_count.enginevalue = "0";
worker_count.flags |= CVAR_NOSET; worker_count.flags |= CVAR_NOSET;
} }
Cvar_Register(&worker_count, NULL); Cvar_Register(&worker_count, NULL);

View File

@ -37,11 +37,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <stdint.h> #include <stdint.h>
#define qintptr_t intptr_t #define qintptr_t intptr_t
#define quintptr_t uintptr_t #define quintptr_t uintptr_t
#define qint32_t qint32_t
#define quint32_t quint32_t
#define qint64_t qint64_t
#define quint64_t quint64_t
#else #else
#define qint32_t int
#define quint32_t unsigned qint32_t
#if defined(_WIN64) #if defined(_WIN64)
#define qintptr_t __int64 #define qintptr_t __int64
#define FTE_WORDSIZE 64 #define FTE_WORDSIZE 64
#define quintptr_t unsigned qintptr_t #define quintptr_t unsigned qintptr_t
#define qint64_t __int64
#define quint64_t unsigned __int64
#elif defined(_WIN32) #elif defined(_WIN32)
#ifndef _MSC_VER #ifndef _MSC_VER
#define __w64 #define __w64
@ -50,16 +58,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
typedef unsigned __int32 __w64 quintptr_t; typedef unsigned __int32 __w64 quintptr_t;
// #define qintptr_t __int32 // #define qintptr_t __int32
// #define quintptr_t unsigned qintptr_t // #define quintptr_t unsigned qintptr_t
#define qint64_t __int64
#define quint64_t unsigned __int64
#define FTE_WORDSIZE 32 #define FTE_WORDSIZE 32
#else #else
#if __WORDSIZE == 64 #ifdef __LP64__
#define qintptr_t long
#define qint64_t long
#define FTE_WORDSIZE 64
#elif __WORDSIZE == 64
#define qintptr_t long long #define qintptr_t long long
#define qint64_t long long
#define FTE_WORDSIZE 64 #define FTE_WORDSIZE 64
#else #else
#define qintptr_t long #define qintptr_t long
#define qint64_t long long
#define FTE_WORDSIZE 32 #define FTE_WORDSIZE 32
#endif #endif
#define quintptr_t unsigned qintptr_t #define quintptr_t unsigned qintptr_t
#define quint64_t unsigned qint64_t
#endif #endif
#endif #endif
@ -397,13 +414,13 @@ extern char com_configdir[MAX_OSPATH]; //dir to put cfg_save configs in
#define FS_64BIT #define FS_64BIT
#endif #endif
#if 1//def FS_64BIT #if 1//def FS_64BIT
typedef unsigned long long qofs_t; //type to use for a file offset typedef quint64_t qofs_t; //type to use for a file offset
#define qofs_Make(low,high) (low | (((qofs_t)(high))<<32)) #define qofs_Make(low,high) (low | (((qofs_t)(high))<<32))
#define qofs_Low(o) ((o)&0xffffffffu) #define qofs_Low(o) ((o)&0xffffffffu)
#define qofs_High(o) ((o)>>32) #define qofs_High(o) ((o)>>32)
#define qofs_Error(o) ((o) == ~0ull) #define qofs_Error(o) ((o) == ~0ull)
#else #else
typedef unsigned int qofs_t; //type to use for a file offset typedef quint32_t qofs_t; //type to use for a file offset
#define qofs_Make(low,high) (low) #define qofs_Make(low,high) (low)
#define qofs_Low(o) (o) #define qofs_Low(o) (o)
#define qofs_High(o) (0) #define qofs_High(o) (0)

View File

@ -2516,7 +2516,7 @@ qboolean FS_PathURLCache(const char *url, char *path, size_t pathsize)
{ {
const char *FS_GetCleanPath(const char *pattern, char *outbuf, int outlen); const char *FS_GetCleanPath(const char *pattern, char *outbuf, int outlen);
char tmp[MAX_QPATH]; char tmp[MAX_QPATH];
char *o = tmp, *e = o + sizeof(tmp)-1; char *o = tmp;
const char *i = url; const char *i = url;
strcpy(o, "downloads/"); strcpy(o, "downloads/");
o += strlen(o); o += strlen(o);
@ -3814,6 +3814,7 @@ static ftemanifest_t *FS_GenerateLegacyManifest(char *newbasedir, int sizeof_new
return man; return man;
} }
#ifdef WEBCLIENT
static char *FS_RelativeURL(char *base, char *file, char *buffer, int bufferlen) static char *FS_RelativeURL(char *base, char *file, char *buffer, int bufferlen)
{ {
//fixme: cope with windows paths //fixme: cope with windows paths
@ -3847,16 +3848,15 @@ static char *FS_RelativeURL(char *base, char *file, char *buffer, int bufferlen)
return buffer; return buffer;
} }
#ifdef WEBCLIENT
static struct dl_download *curpackagedownload; static struct dl_download *curpackagedownload;
static enum manifestdeptype_e fspdl_type; static enum manifestdeptype_e fspdl_type;
static enum { static enum {
X_DLONLY, X_DLONLY, //simple pk3 file
X_COPY, X_COPY, //we copy it from an existing install (ie: special install path for total conversion)
X_MULTIUNZIP, X_MULTIUNZIP, //zip with multiple files that need extracting
X_UNZIP, X_UNZIP, //pull a single file from a zip
X_GZ, X_GZ, //dlonly+ungzip
X_XZ X_XZ //dlonly+unxzip
} fspdl_extracttype; } fspdl_extracttype;
static char fspdl_internalname[MAX_QPATH]; static char fspdl_internalname[MAX_QPATH];
static char fspdl_temppath[MAX_OSPATH]; static char fspdl_temppath[MAX_OSPATH];
@ -4256,6 +4256,8 @@ static qboolean FS_BeginPackageDownload(struct manpack_s *pack, char *baseurl, q
tmpf = NULL; tmpf = NULL;
#endif #endif
break; break;
default:
break;
} }
if (!tmpf) if (!tmpf)
@ -4697,12 +4699,12 @@ qboolean FS_ChangeGame(ftemanifest_t *man, qboolean allowreloadconfigs, qboolean
{ {
FS_ReloadPackFilesFlags(~0); FS_ReloadPackFilesFlags(~0);
Sys_UnlockMutex(fs_thread_mutex);
FS_BeginManifestUpdates(); FS_BeginManifestUpdates();
COM_CheckRegistered(); COM_CheckRegistered();
Sys_UnlockMutex(fs_thread_mutex);
if (allowreloadconfigs) if (allowreloadconfigs)
{ {
qboolean vidrestart = false; qboolean vidrestart = false;
@ -4751,10 +4753,12 @@ qboolean FS_ChangeGame(ftemanifest_t *man, qboolean allowreloadconfigs, qboolean
#endif #endif
} }
} }
#ifndef SERVERONLY
else if (vidrestart) else if (vidrestart)
{
#ifndef SERVERONLY
Cbuf_AddText ("vid_reload\n", RESTRICT_LOCAL); Cbuf_AddText ("vid_reload\n", RESTRICT_LOCAL);
#endif #endif
}
} }
//rebuild the cache now, should be safe to waste some cycles on it //rebuild the cache now, should be safe to waste some cycles on it

View File

@ -52,15 +52,19 @@ void *zlib_handle;
#endif #endif
#endif #endif
#ifndef Z_U4
#define z_crc_t uLongf
#endif
//#pragma comment(lib, MSVCLIBSPATH "zlib.lib") //#pragma comment(lib, MSVCLIBSPATH "zlib.lib")
static int (ZEXPORT *qinflateEnd) (z_streamp strm) ZSTATIC(inflateEnd); static int (ZEXPORT *qinflateEnd) (z_streamp strm) ZSTATIC(inflateEnd);
static int (ZEXPORT *qinflate) (z_streamp strm, int flush) ZSTATIC(inflate); static int (ZEXPORT *qinflate) (z_streamp strm, int flush) ZSTATIC(inflate);
static int (ZEXPORT *qinflateInit2_) (z_streamp strm, int windowBits, static int (ZEXPORT *qinflateInit2_) (z_streamp strm, int windowBits,
const char *version, int stream_size) ZSTATIC(inflateInit2_); const char *version, int stream_size) ZSTATIC(inflateInit2_);
//static uLong (ZEXPORT *qcrc32) (uLong crc, const Bytef *buf, uInt len) ZSTATIC(crc32); //static z_crc_t (ZEXPORT *qcrc32) (uLong crc, const Bytef *buf, uInt len) ZSTATIC(crc32);
#ifdef ZIPCRYPT #ifdef ZIPCRYPT
static const uLongf *(ZEXPORT *qget_crc_table) (void) ZSTATIC(get_crc_table); static const z_crc_t *(ZEXPORT *qget_crc_table) (void) ZSTATIC(get_crc_table);
#endif #endif
#define qinflateInit2(strm, windowBits) \ #define qinflateInit2(strm, windowBits) \
@ -288,7 +292,7 @@ static int QDECL FS_GZ_Dec_Write(vfsfile_t *f, const void *buffer, int len)
{ {
if (n->inlen >= 8) if (n->inlen >= 8)
{ {
unsigned int crc = (n->in[0]<<0) | (n->in[1]<<8) | (n->in[2]<<16) | (n->in[3]<<24); //unsigned int crc = (n->in[0]<<0) | (n->in[1]<<8) | (n->in[2]<<16) | (n->in[3]<<24);
unsigned int isize = (n->in[4]<<0) | (n->in[5]<<8) | (n->in[6]<<16) | (n->in[7]<<24); unsigned int isize = (n->in[4]<<0) | (n->in[5]<<8) | (n->in[6]<<16) | (n->in[7]<<24);
if (n->strm.total_out != isize) if (n->strm.total_out != isize)
return -1; //the file we just received decoded to a different length (yay, concat...). return -1; //the file we just received decoded to a different length (yay, concat...).
@ -853,7 +857,7 @@ static vfsfile_t *FSZIP_Decompress_ToTempFile(struct decompressstate *decompress
zipfile_t *source = decompress->source; zipfile_t *source = decompress->source;
qboolean encrypted = decompress->encrypted; qboolean encrypted = decompress->encrypted;
unsigned int cryptkeys[3]; unsigned int cryptkeys[3];
const uLongf *crctab = decompress->crctable; const z_crc_t *crctab = decompress->crctable;
memcpy(cryptkeys, decompress->initialkey, sizeof(cryptkeys)); memcpy(cryptkeys, decompress->initialkey, sizeof(cryptkeys));

View File

@ -57,11 +57,12 @@ qboolean Mod_LoadEdges (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
qboolean Mod_LoadMarksurfaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean lm); qboolean Mod_LoadMarksurfaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean lm);
qboolean Mod_LoadSurfedges (model_t *loadmodel, qbyte *mod_base, lump_t *l); qboolean Mod_LoadSurfedges (model_t *loadmodel, qbyte *mod_base, lump_t *l);
#ifdef Q2BSPS
static qboolean CM_NativeTrace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, qboolean capsule, unsigned int contents, trace_t *trace); static qboolean CM_NativeTrace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, qboolean capsule, unsigned int contents, trace_t *trace);
static unsigned int CM_NativeContents(struct model_s *model, int hulloverride, int frame, vec3_t axis[3], vec3_t p, vec3_t mins, vec3_t maxs); static unsigned int CM_NativeContents(struct model_s *model, int hulloverride, int frame, vec3_t axis[3], vec3_t p, vec3_t mins, vec3_t maxs);
static unsigned int Q2BSP_PointContents(model_t *mod, vec3_t axis[3], vec3_t p); static unsigned int Q2BSP_PointContents(model_t *mod, vec3_t axis[3], vec3_t p);
static int CM_PointCluster (model_t *mod, vec3_t p); static int CM_PointCluster (model_t *mod, vec3_t p);
#endif
float RadiusFromBounds (vec3_t mins, vec3_t maxs) float RadiusFromBounds (vec3_t mins, vec3_t maxs)
{ {
@ -3875,9 +3876,11 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole
char loadname[32]; char loadname[32];
qbyte *mod_base = (qbyte *)filein; qbyte *mod_base = (qbyte *)filein;
#ifndef SERVERONLY
void (*buildmeshes)(model_t *mod, msurface_t *surf, builddata_t *cookie) = NULL; void (*buildmeshes)(model_t *mod, msurface_t *surf, builddata_t *cookie) = NULL;
qbyte *facedata = NULL; qbyte *facedata = NULL;
unsigned int facesize = 0; unsigned int facesize = 0;
#endif
cminfo_t *prv; cminfo_t *prv;
COM_FileBase (mod->name, loadname, sizeof(loadname)); COM_FileBase (mod->name, loadname, sizeof(loadname));
@ -4263,7 +4266,7 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole
bd->buildfunc = buildmeshes; bd->buildfunc = buildmeshes;
memcpy(bd+1, facedata + mod->firstmodelsurface*facesize, facesize*mod->nummodelsurfaces); memcpy(bd+1, facedata + mod->firstmodelsurface*facesize, facesize*mod->nummodelsurfaces);
} }
COM_AddWork(0, ModBrush_LoadGLStuff, mod, bd, 0, 0); COM_AddWork(WG_MAIN, ModBrush_LoadGLStuff, mod, bd, 0, 0);
} }
#endif #endif
@ -4320,10 +4323,10 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole
bd->buildfunc = buildmeshes; bd->buildfunc = buildmeshes;
memcpy(bd+1, facedata + mod->firstmodelsurface*facesize, facesize*mod->nummodelsurfaces); memcpy(bd+1, facedata + mod->firstmodelsurface*facesize, facesize*mod->nummodelsurfaces);
} }
COM_AddWork(0, ModBrush_LoadGLStuff, mod, bd, i, 0); COM_AddWork(WG_MAIN, ModBrush_LoadGLStuff, mod, bd, i, 0);
} }
#endif #endif
COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0);
} }
#ifdef TERRAIN #ifdef TERRAIN
@ -4426,7 +4429,6 @@ can just be stored out and get a proper clipping hull structure.
void CM_InitBoxHull (void) void CM_InitBoxHull (void)
{ {
int i; int i;
int side;
mplane_t *p; mplane_t *p;
q2cbrushside_t *s; q2cbrushside_t *s;
@ -4455,8 +4457,6 @@ void CM_InitBoxHull (void)
for (i=0 ; i<6 ; i++) for (i=0 ; i<6 ; i++)
{ {
side = i&1;
//the pointers //the pointers
s = &box_sides[i]; s = &box_sides[i];
p = &box_planes[i]; p = &box_planes[i];

View File

@ -62,11 +62,7 @@ struct sockaddr_qstorage
{ {
short dontusesa_family; short dontusesa_family;
unsigned char dontusesa_pad[6]; unsigned char dontusesa_pad[6];
#if defined(_MSC_VER) || defined(MINGW) qint64_t sa_align;
__int64 sa_align;
#else
int sa_align[2];
#endif
unsigned char sa_pad2[112]; unsigned char sa_pad2[112];
}; };
@ -269,14 +265,17 @@ void Huff_EmitByte(int ch, qbyte *buffer, int *count);
#define CCREP_RULE_INFO 0x85 #define CCREP_RULE_INFO 0x85
//server->client protocol info //server->client protocol info
#define NQ_PROTOCOL_VERSION 15 #define PROTOCOL_VERSION_NQ 15
#define H2_PROTOCOL_VERSION 19 #define PROTOCOL_VERSION_H2 19
#define NEHD_PROTOCOL_VERSION 250 #define PROTOCOL_VERSION_NEHD 250
#define FITZ_PROTOCOL_VERSION 666 #define PROTOCOL_VERSION_FITZ 666
#define RMQ_PROTOCOL_VERSION 999 #define PROTOCOL_VERSION_RMQ 999
#define DP5_PROTOCOL_VERSION 3502 #define PROTOCOL_VERSION_DP5 3502
#define DP6_PROTOCOL_VERSION 3503 #define PROTOCOL_VERSION_DP6 3503
#define DP7_PROTOCOL_VERSION 3504 #define PROTOCOL_VERSION_DP7 3504
#define PROTOCOL_VERSION_BJP1 10000
#define PROTOCOL_VERSION_BJP2 10001
#define PROTOCOL_VERSION_BJP3 10002
/*RMQ protocol flags*/ /*RMQ protocol flags*/
#define RMQFL_SHORTANGLE (1 << 1) #define RMQFL_SHORTANGLE (1 << 1)

View File

@ -668,13 +668,15 @@ qboolean QDECL ICE_Set(struct icestate_s *con, const char *prop, const char *val
{ {
Z_Free(con->stunserver); Z_Free(con->stunserver);
con->stunserver = Z_StrDup(value); con->stunserver = Z_StrDup(value);
NET_StringToAdr(con->stunserver, con->stunport, &con->pubstunserver); if (!NET_StringToAdr(con->stunserver, con->stunport, &con->pubstunserver))
return false;
} }
else if (!strcmp(prop, "stunport")) else if (!strcmp(prop, "stunport"))
{ {
con->stunport = atoi(value); con->stunport = atoi(value);
if (con->stunserver) if (con->stunserver)
NET_StringToAdr(con->stunserver, con->stunport, &con->pubstunserver); if (!NET_StringToAdr(con->stunserver, con->stunport, &con->pubstunserver))
return false;
} }
/* /*
else if (!strcmp(prop, "sdp")) else if (!strcmp(prop, "sdp"))
@ -785,7 +787,7 @@ qboolean QDECL ICE_Set(struct icestate_s *con, const char *prop, const char *val
return false; return false;
return true; return true;
} }
qboolean QDECL ICE_Get(struct icestate_s *con, char *prop, char *value, int valuelen) qboolean QDECL ICE_Get(struct icestate_s *con, const char *prop, char *value, int valuelen)
{ {
if (!strcmp(prop, "sid")) if (!strcmp(prop, "sid"))
Q_strncpyz(value, con->conname, valuelen); Q_strncpyz(value, con->conname, valuelen);
@ -983,9 +985,7 @@ void ICE_Tick(void)
{ {
struct icecandidate_s *rc; struct icecandidate_s *rc;
rc = con->rc; rc = con->rc;
if (rc) if (!rc || !NET_StringToAdr(rc->info.addr, rc->info.port, &con->chosenpeer))
NET_StringToAdr(rc->info.addr, rc->info.port, &con->chosenpeer);
else
con->chosenpeer.type = NA_INVALID; con->chosenpeer.type = NA_INVALID;
ICE_Set(con, "state", STRINGIFY(ICE_CONNECTED)); ICE_Set(con, "state", STRINGIFY(ICE_CONNECTED));
} }

View File

@ -201,7 +201,7 @@ typedef struct
#define CAFILE "/etc/ssl/certs/ca-certificates.crt" #define CAFILE "/etc/ssl/certs/ca-certificates.crt"
static void QDECL SSL_Close(vfsfile_t *vfs) static qboolean QDECL SSL_Close(vfsfile_t *vfs)
{ {
gnutlsfile_t *file = (void*)vfs; gnutlsfile_t *file = (void*)vfs;
@ -213,6 +213,7 @@ static void QDECL SSL_Close(vfsfile_t *vfs)
if (file->stream) if (file->stream)
VFS_CLOSE(file->stream); VFS_CLOSE(file->stream);
file->stream = NULL; file->stream = NULL;
return true;
} }
static int QDECL SSL_CheckCert(gnutls_session_t session) static int QDECL SSL_CheckCert(gnutls_session_t session)
{ {

View File

@ -81,7 +81,6 @@ cvar_t net_enabled = CVARD("net_enabled", "1", "If 0, disables all network acce
extern cvar_t sv_public, sv_listen_qw, sv_listen_nq, sv_listen_dp, sv_listen_q3; extern cvar_t sv_public, sv_listen_qw, sv_listen_nq, sv_listen_dp, sv_listen_q3;
static qboolean allowconnects = false;
@ -439,7 +438,7 @@ static void NET_AdrToStringDoResolve(void *ctx, void *data, size_t a, size_t b)
NET_BaseAdrToString(adrstring, NI_MAXHOST, n); NET_BaseAdrToString(adrstring, NI_MAXHOST, n);
} }
} }
COM_AddWork(0, resolved, ctx, adrstring, a, b); COM_AddWork(WG_MAIN, resolved, ctx, adrstring, a, b);
Z_Free(n); Z_Free(n);
} }
@ -448,7 +447,7 @@ void NET_AdrToStringResolve (netadr_t *adr, void (*resolved)(void *ctx, void *da
netadr_t *n = Z_Malloc(sizeof(*n) + sizeof(void*)); netadr_t *n = Z_Malloc(sizeof(*n) + sizeof(void*));
*n = *adr; *n = *adr;
*(void**)(n+1) = resolved; *(void**)(n+1) = resolved;
COM_AddWork(2, NET_AdrToStringDoResolve, ctx, n, a, b); COM_AddWork(WG_LOADER, NET_AdrToStringDoResolve, ctx, n, a, b);
} }
*/ */
@ -824,6 +823,7 @@ size_t NET_StringToSockaddr2 (const char *s, int defaultport, struct sockaddr_qs
char dupbase[256]; char dupbase[256];
int len; int len;
size_t i; size_t i;
double restime = Sys_DoubleTime();
memset(&udp6hint, 0, sizeof(udp6hint)); memset(&udp6hint, 0, sizeof(udp6hint));
udp6hint.ai_family = 0;//Any... we check for AF_INET6 or 4 udp6hint.ai_family = 0;//Any... we check for AF_INET6 or 4
@ -863,6 +863,13 @@ size_t NET_StringToSockaddr2 (const char *s, int defaultport, struct sockaddr_qs
if (error) //failed, try string with no port. if (error) //failed, try string with no port.
error = pgetaddrinfo(s, NULL, &udp6hint, &addrinfo); //remember, this func will return any address family that could be using the udp protocol... (ip4 or ip6) error = pgetaddrinfo(s, NULL, &udp6hint, &addrinfo); //remember, this func will return any address family that could be using the udp protocol... (ip4 or ip6)
} }
restime = Sys_DoubleTime()-restime;
if (restime > 0.5)
{ //adding this in an attempt to debug somewhat periodic stalls that I'm being told about.
Con_DPrintf("DNS resolution of %s %s %f seconds (on %s thread)\n", s, error?"failed after":"took", restime, Sys_IsMainThread()?"main":"worker");
}
if (error) if (error)
{ {
return false; return false;
@ -1764,20 +1771,26 @@ ftenet_connections_t *FTENET_CreateCollection(qboolean listen)
col->islisten = listen; col->islisten = listen;
return col; return col;
} }
#if !defined(SERVERONLY) && !defined(CLIENTONLY)
static ftenet_generic_connection_t *FTENET_Loop_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_Loop_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
#endif
static ftenet_generic_connection_t *FTENET_UDP4_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_UDP4_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
static ftenet_generic_connection_t *FTENET_UDP6_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_UDP6_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
#ifdef TCPCONNECT
static ftenet_generic_connection_t *FTENET_TCP4Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_TCP4Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
static ftenet_generic_connection_t *FTENET_TCP6Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_TCP6Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
static ftenet_generic_connection_t *FTENET_TLS4Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_TLS4Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
static ftenet_generic_connection_t *FTENET_TLS6Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_TLS6Connect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
#endif
#ifdef USEIPX #ifdef USEIPX
static ftenet_generic_connection_t *FTENET_IPX_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_IPX_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
#endif #endif
#ifdef HAVE_WEBSOCKCL #ifdef HAVE_WEBSOCKCL
static ftenet_generic_connection_t *FTENET_WebSocket_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_WebSocket_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
#endif #endif
#ifdef IRCCONNECT
static ftenet_generic_connection_t *FTENET_IRCConnect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_IRCConnect_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
#endif
#ifdef HAVE_NATPMP #ifdef HAVE_NATPMP
static ftenet_generic_connection_t *FTENET_NATPMP_EstablishConnection(qboolean isserver, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_NATPMP_EstablishConnection(qboolean isserver, const char *address, netadr_t adr);
#endif #endif
@ -2095,7 +2108,7 @@ qboolean FTENET_AddToCollection(ftenet_connections_t *col, const char *name, con
ftenet_generic_connection_t *(*establish[countof(adr)])(qboolean isserver, const char *address, netadr_t adr); ftenet_generic_connection_t *(*establish[countof(adr)])(qboolean isserver, const char *address, netadr_t adr);
char address[countof(adr)][256]; char address[countof(adr)][256];
unsigned int i, j; unsigned int i, j;
qboolean success; qboolean success = false;
if (strchr(name, ':')) if (strchr(name, ':'))
return false; return false;
@ -2109,7 +2122,10 @@ qboolean FTENET_AddToCollection(ftenet_connections_t *col, const char *name, con
else if (islisten) else if (islisten)
NET_PortToAdr(addrtype, address[i], &adr[i]); NET_PortToAdr(addrtype, address[i], &adr[i]);
else else
NET_StringToAdr(address[i], 0, &adr[i]); {
if (!NET_StringToAdr(address[i], 0, &adr[i]))
return false;
}
switch(adr[i].type) switch(adr[i].type)
{ {
@ -3377,7 +3393,7 @@ handshakeerror:
} }
if ((ctrl & 0x7f) == 127) if ((ctrl & 0x7f) == 127)
{ {
unsigned long long ullpaylen; quint64_t ullpaylen;
//as a payload is not allowed to be encoded as too large a type, and quakeworld never used packets larger than 1450 bytes anyway, this code isn't needed (65k is the max even without this) //as a payload is not allowed to be encoded as too large a type, and quakeworld never used packets larger than 1450 bytes anyway, this code isn't needed (65k is the max even without this)
if (sizeof(ullpaylen) < 8) if (sizeof(ullpaylen) < 8)
{ {
@ -3389,14 +3405,14 @@ handshakeerror:
if (payoffs + 8 > st->inlen) if (payoffs + 8 > st->inlen)
break; break;
ullpaylen = ullpaylen =
(unsigned long long)((unsigned char*)st->inbuffer)[payoffs+0]<<56ull | (quint64_t)((unsigned char*)st->inbuffer)[payoffs+0]<<56ull |
(unsigned long long)((unsigned char*)st->inbuffer)[payoffs+1]<<48ull | (quint64_t)((unsigned char*)st->inbuffer)[payoffs+1]<<48ull |
(unsigned long long)((unsigned char*)st->inbuffer)[payoffs+2]<<40ull | (quint64_t)((unsigned char*)st->inbuffer)[payoffs+2]<<40ull |
(unsigned long long)((unsigned char*)st->inbuffer)[payoffs+3]<<32ull | (quint64_t)((unsigned char*)st->inbuffer)[payoffs+3]<<32ull |
(unsigned long long)((unsigned char*)st->inbuffer)[payoffs+4]<<24ull | (quint64_t)((unsigned char*)st->inbuffer)[payoffs+4]<<24ull |
(unsigned long long)((unsigned char*)st->inbuffer)[payoffs+5]<<16ull | (quint64_t)((unsigned char*)st->inbuffer)[payoffs+5]<<16ull |
(unsigned long long)((unsigned char*)st->inbuffer)[payoffs+6]<< 8ull | (quint64_t)((unsigned char*)st->inbuffer)[payoffs+6]<< 8ull |
(unsigned long long)((unsigned char*)st->inbuffer)[payoffs+7]<< 0ull; (quint64_t)((unsigned char*)st->inbuffer)[payoffs+7]<< 0ull;
if (ullpaylen < 0x10000) if (ullpaylen < 0x10000)
{ {
Con_Printf ("%s: payload size (%"PRIu64") encoded badly\n", NET_AdrToString (adr, sizeof(adr), &st->remoteaddr), ullpaylen); Con_Printf ("%s: payload size (%"PRIu64") encoded badly\n", NET_AdrToString (adr, sizeof(adr), &st->remoteaddr), ullpaylen);
@ -3936,7 +3952,8 @@ qboolean FTENET_IRCConnect_GetPacket(ftenet_generic_connection_t *gcon)
cvar_t *ircsomething = Cvar_Get("ircsomething", "moo", 0, "IRC Connect"); cvar_t *ircsomething = Cvar_Get("ircsomething", "moo", 0, "IRC Connect");
cvar_t *ircclientaddr = Cvar_Get("ircclientaddr", "127.0.0.1", 0, "IRC Connect"); cvar_t *ircclientaddr = Cvar_Get("ircclientaddr", "127.0.0.1", 0, "IRC Connect");
NET_StringToAdr(con->ircserver.address.irc.host, 6667, &ip); if (!NET_StringToAdr(con->ircserver.address.irc.host, 6667, &ip))
return false;
con->generic.thesocket = TCP_OpenStream(&ip); con->generic.thesocket = TCP_OpenStream(&ip);
//when hosting, the specified nick is the name we're using. //when hosting, the specified nick is the name we're using.
@ -5002,23 +5019,24 @@ qboolean NET_EnsureRoute(ftenet_connections_t *collection, char *routename, char
{ {
netadr_t adr; netadr_t adr;
NET_StringToAdr(host, 0, &adr); if (NET_StringToAdr(host, 0, &adr))
switch(adr.type)
{ {
case NA_WEBSOCKET: switch(adr.type)
case NA_TLSV4: {
case NA_TLSV6: case NA_WEBSOCKET:
case NA_TCP: case NA_TLSV4:
case NA_TCPV6: case NA_TLSV6:
case NA_IRC: case NA_TCP:
if (!FTENET_AddToCollection(collection, routename, host, adr.type, islisten)) case NA_TCPV6:
return false; case NA_IRC:
Con_Printf("Establishing connection to %s\n", host); if (!FTENET_AddToCollection(collection, routename, host, adr.type, islisten))
break; return false;
default: Con_Printf("Establishing connection to %s\n", host);
//not recognised, or not needed break;
break; default:
//not recognised, or not needed
break;
}
} }
return true; return true;
} }
@ -5557,7 +5575,8 @@ void NET_GetLocalAddress (int socket, netadr_t *out)
buff[512-1] = 0; buff[512-1] = 0;
if (!NET_StringToAdr (buff, 0, &adr)) //urm if (!NET_StringToAdr (buff, 0, &adr)) //urm
NET_StringToAdr ("127.0.0.1", 0, &adr); if (!NET_StringToAdr ("127.0.0.1", 0, &adr))
return;
namelen = sizeof(address); namelen = sizeof(address);
@ -5648,6 +5667,7 @@ void NET_ClientPort_f(void)
qboolean NET_WasSpecialPacket(netsrc_t netsrc) qboolean NET_WasSpecialPacket(netsrc_t netsrc)
{ {
#ifdef HAVE_NATPMP
ftenet_connections_t *collection = NULL; ftenet_connections_t *collection = NULL;
if (netsrc == NS_SERVER) if (netsrc == NS_SERVER)
{ {
@ -5661,6 +5681,7 @@ qboolean NET_WasSpecialPacket(netsrc_t netsrc)
collection = cls.sockets; collection = cls.sockets;
#endif #endif
} }
#endif
#ifdef SUPPORT_ICE #ifdef SUPPORT_ICE
if (ICE_WasStun(netsrc)) if (ICE_WasStun(netsrc))
@ -5851,8 +5872,6 @@ void SVNET_RegisterCvars(void)
void NET_CloseServer(void) void NET_CloseServer(void)
{ {
allowconnects = false;
FTENET_CloseCollection(svs.sockets); FTENET_CloseCollection(svs.sockets);
svs.sockets = NULL; svs.sockets = NULL;
} }
@ -5869,8 +5888,6 @@ void NET_InitServer(void)
#endif #endif
} }
allowconnects = true;
#ifdef HAVE_IPV4 #ifdef HAVE_IPV4
Cvar_ForceCallback(&sv_port_ipv4); Cvar_ForceCallback(&sv_port_ipv4);
#endif #endif

View File

@ -235,8 +235,8 @@ struct icestate_s;
typedef struct typedef struct
{ {
struct icestate_s *(QDECL *ICE_Create)(void *module, char *conname, char *peername, enum icemode_e mode, enum iceproto_e proto); //doesn't start pinging anything. struct icestate_s *(QDECL *ICE_Create)(void *module, char *conname, char *peername, enum icemode_e mode, enum iceproto_e proto); //doesn't start pinging anything.
qboolean (QDECL *ICE_Set)(struct icestate_s *con, char *prop, char *value); qboolean (QDECL *ICE_Set)(struct icestate_s *con, const char *prop, const char *value);
qboolean (QDECL *ICE_Get)(struct icestate_s *con, char *prop, char *value, int valuesize); qboolean (QDECL *ICE_Get)(struct icestate_s *con, const char *prop, char *value, int valuesize);
struct icecandinfo_s *(QDECL *ICE_GetLCandidateInfo)(struct icestate_s *con); //retrieves candidates that need reporting to the peer. struct icecandinfo_s *(QDECL *ICE_GetLCandidateInfo)(struct icestate_s *con); //retrieves candidates that need reporting to the peer.
void (QDECL *ICE_AddRCandidateInfo)(struct icestate_s *con, struct icecandinfo_s *cand); //stuff that came from the peer. void (QDECL *ICE_AddRCandidateInfo)(struct icestate_s *con, struct icecandinfo_s *cand); //stuff that came from the peer.
void (QDECL *ICE_Close)(struct icestate_s *con); //bye then. void (QDECL *ICE_Close)(struct icestate_s *con); //bye then.

View File

@ -135,10 +135,10 @@ void Plug_RegisterBuiltin(char *name, Plug_Builtin_t bi, int flags)
static qintptr_t VARGS Plug_GetNativePointer(void *offset, quintptr_t mask, const qintptr_t *args) static qintptr_t VARGS Plug_GetNativePointer(void *offset, quintptr_t mask, const qintptr_t *args)
{ {
#ifdef SUPPORT_ICE
char *p = (char *)VM_POINTER(args[0]); char *p = (char *)VM_POINTER(args[0]);
if (offset) //QVMs are not allowed to call this if (offset) //QVMs are not allowed to call this
return 0; return 0;
#ifdef SUPPORT_ICE
if (!strcmp(p, ICE_API_CURRENT)) if (!strcmp(p, ICE_API_CURRENT))
return (qintptr_t)&iceapi; return (qintptr_t)&iceapi;
#endif #endif

View File

@ -96,7 +96,9 @@ char *PF_VarString (pubprogfuncs_t *prinst, int first, struct globalvars_s *pr_g
static int debuggerresume; static int debuggerresume;
static int debuggerresumeline; static int debuggerresumeline;
extern int isPlugin; //if 2, we were invoked by a debugger, and we need to give it debug locations (and it'll feed us continue/steps/breakpoints) extern int isPlugin; //if 2, we were invoked by a debugger, and we need to give it debug locations (and it'll feed us continue/steps/breakpoints)
#ifndef SERVERONLY
static int debuggerstacky; static int debuggerstacky;
#endif
#if defined(_WIN32) && !defined(FTE_SDL) #if defined(_WIN32) && !defined(FTE_SDL)
#include <windows.h> #include <windows.h>
@ -139,6 +141,13 @@ size_t debuggerwnd;
qboolean QCExternalDebuggerCommand(char *text) qboolean QCExternalDebuggerCommand(char *text)
{ {
#if defined(CSQC_DAT) && !defined(SERVERONLY)
extern world_t csqc_world;
#endif
#if defined(MENU_DAT) && !defined(SERVERONLY)
extern world_t menu_world;
#endif
if (!isPlugin) if (!isPlugin)
return false; return false;
if ((!strncmp(text, "qcstep", 6) && (text[6] == 0 || text[6] == ' ')) || (!strncmp(text, "qcresume", 8) && (text[8] == 0 || text[8] == ' '))) if ((!strncmp(text, "qcstep", 6) && (text[6] == 0 || text[6] == ' ')) || (!strncmp(text, "qcresume", 8) && (text[8] == 0 || text[8] == ' ')))
@ -187,16 +196,15 @@ qboolean QCExternalDebuggerCommand(char *text)
else if (!strncmp(text, "qcinspect ", 10)) else if (!strncmp(text, "qcinspect ", 10))
{ {
//called on mouse-over events in the gui //called on mouse-over events in the gui
extern world_t csqc_world, menu_world;
char *variable; char *variable;
char *function; // char *function;
char resultbuffer[8192], tmpbuffer[8192]; char resultbuffer[8192], tmpbuffer[8192];
char *vmnames[4] = {"cur: ", "ssqc: ", "csqc: ", "menu: "}; char *vmnames[4] = {"cur: ", "ssqc: ", "csqc: ", "menu: "};
char *values[4] = {NULL, NULL, NULL, NULL}; char *values[4] = {NULL, NULL, NULL, NULL};
int i; int i;
Cmd_TokenizeString(text, false, false); Cmd_TokenizeString(text, false, false);
variable = Cmd_Argv(1); variable = Cmd_Argv(1);
function = Cmd_Argv(2); // function = Cmd_Argv(2);
//togglebreakpoint just finds the first statement (via the function table for file names) with the specified line number, and sets some unused high bit that causes it to be an invalid opcode. //togglebreakpoint just finds the first statement (via the function table for file names) with the specified line number, and sets some unused high bit that causes it to be an invalid opcode.
@ -243,7 +251,7 @@ qboolean QCExternalDebuggerCommand(char *text)
} }
else if (!strncmp(text, "qcreload", 8)) else if (!strncmp(text, "qcreload", 8))
{ {
#ifdef MENU_DAT #if defined(MENU_DAT) && !defined(SERVERONLY)
Cbuf_AddText("menu_restart\n", RESTRICT_LOCAL); Cbuf_AddText("menu_restart\n", RESTRICT_LOCAL);
#endif #endif
#ifndef CLIENTONLY #ifndef CLIENTONLY
@ -255,7 +263,6 @@ qboolean QCExternalDebuggerCommand(char *text)
} }
else if (!strncmp(text, "qcbreakpoint ", 13)) else if (!strncmp(text, "qcbreakpoint ", 13))
{ {
extern world_t csqc_world, menu_world;
int mode; int mode;
char *filename; char *filename;
int line; int line;
@ -1744,7 +1751,7 @@ void QCBUILTIN PF_hash_createtab (pubprogfuncs_t *prinst, struct globalvars_s *p
} }
if (i == pf_hash_maxtables) if (i == pf_hash_maxtables)
{ //all slots taken, expand list { //all slots taken, expand list
if (!ZF_ReallocElements(&pf_hashtab, &pf_hash_maxtables, pf_hash_maxtables+64, sizeof(*pf_hashtab))) if (!ZF_ReallocElements((void**)&pf_hashtab, &pf_hash_maxtables, pf_hash_maxtables+64, sizeof(*pf_hashtab)))
{ {
G_FLOAT(OFS_RETURN) = 0; G_FLOAT(OFS_RETURN) = 0;
return; return;
@ -2684,7 +2691,6 @@ void QCBUILTIN PF_copyentity (pubprogfuncs_t *prinst, struct globalvars_s *pr_gl
void QCBUILTIN PF_entityprotection (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) void QCBUILTIN PF_entityprotection (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
{ {
world_t *w = prinst->parms->user;
wedict_t *e = G_WEDICT(prinst, OFS_PARM0); wedict_t *e = G_WEDICT(prinst, OFS_PARM0);
int prot = G_FLOAT(OFS_PARM1); int prot = G_FLOAT(OFS_PARM1);
@ -3547,7 +3553,7 @@ void QCBUILTIN PF_buf_create (pubprogfuncs_t *prinst, struct globalvars_s *pr_g
int i; int i;
const char *type = ((prinst->callargc>0)?PR_GetStringOfs(prinst, OFS_PARM0):"string"); const char *type = ((prinst->callargc>0)?PR_GetStringOfs(prinst, OFS_PARM0):"string");
unsigned int flags = ((prinst->callargc>1)?G_FLOAT(OFS_PARM1):0); // unsigned int flags = ((prinst->callargc>1)?G_FLOAT(OFS_PARM1):1);
if (!Q_strcasecmp(type, "string")) if (!Q_strcasecmp(type, "string"))
; ;

View File

@ -127,12 +127,23 @@ qboolean Sys_ConditionSignal(void *condv); //lock first
qboolean Sys_ConditionBroadcast(void *condv); //lock first qboolean Sys_ConditionBroadcast(void *condv); //lock first
void Sys_DestroyConditional(void *condv); void Sys_DestroyConditional(void *condv);
#else #else
#define Sys_IsMainThread() (true) #ifdef __GNUC__ //gcc complains about if (true) when these are maros. msvc complains about static not being called in headers. gah.
#define Sys_CreateMutex() (NULL) static inline qboolean Sys_MutexStub(void) {return true;}
#define Sys_LockMutex(m) (true) static inline void *Sys_CreateMutex(void) {return NULL;}
#define Sys_UnlockMutex(m) (true) #define Sys_IsMainThread() Sys_MutexStub()
#define Sys_DestroyMutex(m) #define Sys_DestroyMutex(m) Sys_MutexStub()
#define Sys_IsThread(t) (!t) #define Sys_IsMainThread() Sys_MutexStub()
#define Sys_LockMutex(m) Sys_MutexStub()
#define Sys_UnlockMutex(m) Sys_MutexStub()
static inline qboolean Sys_IsThread(void *thread) {return !thread;}
#else
#define Sys_IsMainThread() (qboolean)(true)
#define Sys_CreateMutex() (void*)(NULL)
#define Sys_LockMutex(m) (qboolean)(true)
#define Sys_UnlockMutex(m) (qboolean)(true)
#define Sys_DestroyMutex(m) (void)0
#define Sys_IsThread(t) (!t)
#endif
#endif #endif
void Sys_Sleep(double seconds); void Sys_Sleep(double seconds);

View File

@ -20228,6 +20228,170 @@
/> />
</FileConfiguration> </FileConfiguration>
</File> </File>
<File
RelativePath="..\common\sys_linux_threads.c"
>
<FileConfiguration
Name="MinGLDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLDebug|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="D3DDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="D3DDebug|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLRelease|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="GLDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="GLDebug|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="GLRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="GLRelease|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="D3DRelease|Win32"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
<FileConfiguration
Name="D3DRelease|x64"
ExcludedFromBuild="true"
>
<Tool
Name="VCCLCompilerTool"
/>
</FileConfiguration>
</File>
<File <File
RelativePath="..\client\sys_morphos.c" RelativePath="..\client\sys_morphos.c"
> >

View File

@ -2194,7 +2194,6 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode)
vec4_t *rgba; vec4_t *rgba;
scenetris_t *t; scenetris_t *t;
extern cvar_t gl_blendsprites;
shader_t *shader = NULL; shader_t *shader = NULL;
mspriteframe_t *frame; mspriteframe_t *frame;
@ -2260,9 +2259,9 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode)
} }
else else
{ {
#ifdef RTLIGHTS
extern cvar_t r_shadow_realtime_world_lightmaps; extern cvar_t r_shadow_realtime_world_lightmaps;
//lit sprites need to sample the world lighting. with rtlights that generally means they're 0. //lit sprites need to sample the world lighting. with rtlights that generally means they're 0.
#ifdef RTLIGHTS
if (r_shadow_realtime_world.ival) if (r_shadow_realtime_world.ival)
lightmap = r_shadow_realtime_world_lightmaps.value; lightmap = r_shadow_realtime_world_lightmaps.value;
else else
@ -2498,8 +2497,8 @@ void BE_GenModelBatches(batch_t **batches, const dlight_t *dl, unsigned int bemo
model_t *emodel; model_t *emodel;
unsigned int orig_numstris = cl_numstris; unsigned int orig_numstris = cl_numstris;
unsigned int orig_numvisedicts = cl_numvisedicts; unsigned int orig_numvisedicts = cl_numvisedicts;
unsigned int orig_numstrisidx = cl_numstrisidx; // unsigned int orig_numstrisidx = cl_numstrisidx;
unsigned int orig_numstrisvert = cl_numstrisvert; // unsigned int orig_numstrisvert = cl_numstrisvert;
/*clear the batch list*/ /*clear the batch list*/
for (i = 0; i < SHADER_SORT_COUNT; i++) for (i = 0; i < SHADER_SORT_COUNT; i++)

View File

@ -2249,7 +2249,7 @@ static void deformgen(const deformv_t *deformv, int cnt, vecV_t *src, vecV_t *ds
for (j = 0; j < 4; j++) for (j = 0; j < 4; j++)
{ {
VectorSubtract(quad[j], rot_centre, tv); VectorSubtract(quad[j], rot_centre, tv);
Matrix3_Multiply_Vec3(result, tv, quad[j]); Matrix3_Multiply_Vec3((const vec3_t*)result, tv, quad[j]);
VectorAdd(rot_centre, quad[j], quad[j]); VectorAdd(rot_centre, quad[j], quad[j]);
} }
} }
@ -2397,7 +2397,7 @@ static void alphagen(const shaderpass_t *pass, int cnt, avec4_t *const src, avec
{ {
VectorSubtract(r_origin, shaderstate.curentity->origin, v1); VectorSubtract(r_origin, shaderstate.curentity->origin, v1);
if (!Matrix3_Compare(shaderstate.curentity->axis, axisDefault)) if (!Matrix3_Compare((const vec3_t*)shaderstate.curentity->axis, (const vec3_t*)axisDefault))
{ {
Matrix3_Multiply_Vec3(shaderstate.curentity->axis, v1, v2); Matrix3_Multiply_Vec3(shaderstate.curentity->axis, v1, v2);
} }
@ -2844,7 +2844,10 @@ static void BE_SubmitMeshChain(qboolean usetesselation)
#ifndef GLSLONLY #ifndef GLSLONLY
static void DrawPass(const shaderpass_t *pass) static void DrawPass(const shaderpass_t *pass)
{ {
int i, j, k; int i;
#if MAXRLIGHTMAPS > 1
int j, k;
#endif
int tmu; int tmu;
int lastpass = pass->numMergedPasses; int lastpass = pass->numMergedPasses;
unsigned int attr = (1u<<VATTR_LEG_VERTEX) | (1u<<VATTR_LEG_COLOUR); unsigned int attr = (1u<<VATTR_LEG_VERTEX) | (1u<<VATTR_LEG_COLOUR);
@ -3717,7 +3720,9 @@ static qboolean GLBE_RegisterLightShader(int mode)
qboolean GLBE_SelectDLight(dlight_t *dl, vec3_t colour, vec3_t axis[3], unsigned int lmode) qboolean GLBE_SelectDLight(dlight_t *dl, vec3_t colour, vec3_t axis[3], unsigned int lmode)
{ {
#ifdef RTLIGHTS
extern cvar_t gl_specular; extern cvar_t gl_specular;
#endif
shaderstate.lastuniform = 0; shaderstate.lastuniform = 0;
shaderstate.curdlight = dl; shaderstate.curdlight = dl;
@ -5430,7 +5435,9 @@ void GLBE_DrawLightPrePass(qbyte *vis)
void GLBE_DrawWorld (batch_t **worldbatches, qbyte *vis) void GLBE_DrawWorld (batch_t **worldbatches, qbyte *vis)
{ {
#ifdef RTLIGHTS
extern cvar_t r_shadow_realtime_world, r_shadow_realtime_world_lightmaps; extern cvar_t r_shadow_realtime_world, r_shadow_realtime_world_lightmaps;
#endif
batch_t *batches[SHADER_SORT_COUNT]; batch_t *batches[SHADER_SORT_COUNT];
batch_t **ob = shaderstate.mbatches; batch_t **ob = shaderstate.mbatches;
RSpeedLocals(); RSpeedLocals();

View File

@ -238,7 +238,7 @@ static void GL_Texturemode_Apply(GLenum targ, unsigned int flags)
{ {
if ((filter[1] && !(flags & IF_NEAREST)) || (flags & IF_LINEAR)) if ((filter[1] && !(flags & IF_NEAREST)) || (flags & IF_LINEAR))
{ {
if (filter[0] && !(flags & IF_NEAREST) || (flags & IF_LINEAR)) if ((filter[0] && !(flags & IF_NEAREST)) || (flags & IF_LINEAR))
min = GL_LINEAR_MIPMAP_LINEAR; min = GL_LINEAR_MIPMAP_LINEAR;
else else
min = GL_NEAREST_MIPMAP_LINEAR; min = GL_NEAREST_MIPMAP_LINEAR;

View File

@ -1784,7 +1784,7 @@ float Font_LineScaleWidth(conchar_t *start, conchar_t *end)
int x = 0; int x = 0;
struct font_s *font = curfont; struct font_s *font = curfont;
unsigned int codeflags, codepoint; unsigned int codeflags, codepoint;
for (; start < end; start) while(start < end)
{ {
start = Font_Decode(start, &codeflags, &codepoint); start = Font_Decode(start, &codeflags, &codepoint);
x = Font_CharEndCoord(font, x, codeflags, codepoint); x = Font_CharEndCoord(font, x, codeflags, codepoint);

View File

@ -381,16 +381,18 @@ typedef struct heightmap_s
#ifndef SERVERONLY #ifndef SERVERONLY
static void ted_dorelight(heightmap_t *hm); static void ted_dorelight(heightmap_t *hm);
#endif static void Terr_WorkerLoadedSectionLightmap(void *ctx, void *data, size_t a, size_t b);
static qboolean Terr_Collect(heightmap_t *hm); static qboolean Terr_Collect(heightmap_t *hm);
#endif
static hmsection_t *Terr_GetSection(heightmap_t *hm, int x, int y, unsigned int flags); static hmsection_t *Terr_GetSection(heightmap_t *hm, int x, int y, unsigned int flags);
static void Terr_LoadSectionWorker(void *ctx, void *data, size_t a, size_t b); static void Terr_LoadSectionWorker(void *ctx, void *data, size_t a, size_t b);
static void Terr_WorkerLoadedSectionLightmap(void *ctx, void *data, size_t a, size_t b);
static void Terr_WorkerLoadedSection(void *ctx, void *data, size_t a, size_t b); static void Terr_WorkerLoadedSection(void *ctx, void *data, size_t a, size_t b);
static void Terr_WorkerFailedSection(void *ctx, void *data, size_t a, size_t b); static void Terr_WorkerFailedSection(void *ctx, void *data, size_t a, size_t b);
static void Terr_Brush_DeleteIdx(heightmap_t *hm, size_t idx); static void Terr_Brush_DeleteIdx(heightmap_t *hm, size_t idx);
#ifndef SERVERONLY
static void Terr_Brush_Draw(heightmap_t *hm, batch_t **batches, entity_t *e); static void Terr_Brush_Draw(heightmap_t *hm, batch_t **batches, entity_t *e);
#endif
#ifndef SERVERONLY #ifndef SERVERONLY
static texid_t Terr_LoadTexture(char *name) static texid_t Terr_LoadTexture(char *name)
@ -692,7 +694,7 @@ static hmsection_t *Terr_GenerateSection(heightmap_t *hm, int sx, int sy, qboole
#ifdef LOADERTHREAD #ifdef LOADERTHREAD
Sys_UnlockMutex(com_resourcemutex); Sys_UnlockMutex(com_resourcemutex);
#endif #endif
COM_AddWork(1, Terr_LoadSectionWorker, s, hm, sx, sy); COM_AddWork(WG_LOADER, Terr_LoadSectionWorker, s, hm, sx, sy);
return s; return s;
} }
if (scheduleload) if (scheduleload)
@ -722,6 +724,7 @@ static void *Terr_GenerateWater(hmsection_t *s, float maxheight)
return w; return w;
} }
#ifndef SERVERONLY
//embeds a mesh //embeds a mesh
static void Terr_AddMesh(heightmap_t *hm, int loadflags, model_t *mod, vec3_t epos, vec3_t axis[3], float scale) static void Terr_AddMesh(heightmap_t *hm, int loadflags, model_t *mod, vec3_t epos, vec3_t axis[3], float scale)
{ {
@ -840,6 +843,7 @@ static void Terr_AddMesh(heightmap_t *hm, int loadflags, model_t *mod, vec3_t ep
} }
Sys_UnlockMutex(hm->entitylock); Sys_UnlockMutex(hm->entitylock);
} }
#endif
static void *Terr_ReadV1(heightmap_t *hm, hmsection_t *s, void *ptr, int len) static void *Terr_ReadV1(heightmap_t *hm, hmsection_t *s, void *ptr, int len)
{ {
@ -884,7 +888,7 @@ static void *Terr_ReadV1(heightmap_t *hm, hmsection_t *s, void *ptr, int len)
/*load in the mixture/lighting*/ /*load in the mixture/lighting*/
lmstart = BZ_Malloc(SECTTEXSIZE*SECTTEXSIZE*4); lmstart = BZ_Malloc(SECTTEXSIZE*SECTTEXSIZE*4);
memcpy(lmstart, ds->texmap, SECTTEXSIZE*SECTTEXSIZE*4); memcpy(lmstart, ds->texmap, SECTTEXSIZE*SECTTEXSIZE*4);
COM_AddWork(0, Terr_WorkerLoadedSectionLightmap, hm, lmstart, s->sx, s->sy); COM_AddWork(WG_MAIN, Terr_WorkerLoadedSectionLightmap, hm, lmstart, s->sx, s->sy);
s->mesh.colors4f_array[0] = s->colours; s->mesh.colors4f_array[0] = s->colours;
if (flags & TSF_HASCOLOURS) if (flags & TSF_HASCOLOURS)
@ -1199,6 +1203,7 @@ static void Terr_SaveV2(heightmap_t *hm, hmsection_t *s, vfsfile_t *f, int sx, i
VFS_WRITE(f, strm.buffer, strm.pos); VFS_WRITE(f, strm.buffer, strm.pos);
strm.pos = 0; strm.pos = 0;
} }
#ifndef SERVERONLY
static void Terr_WorkerLoadedSectionLightmap(void *ctx, void *data, size_t a, size_t b) static void Terr_WorkerLoadedSectionLightmap(void *ctx, void *data, size_t a, size_t b)
{ {
heightmap_t *hm = ctx; heightmap_t *hm = ctx;
@ -1223,6 +1228,7 @@ static void Terr_WorkerLoadedSectionLightmap(void *ctx, void *data, size_t a, si
BZ_Free(data); BZ_Free(data);
} }
#endif #endif
#endif
static void *Terr_ReadV2(heightmap_t *hm, hmsection_t *s, void *ptr, int len) static void *Terr_ReadV2(heightmap_t *hm, hmsection_t *s, void *ptr, int len)
{ {
#ifndef SERVERONLY #ifndef SERVERONLY
@ -1363,7 +1369,7 @@ static void *Terr_ReadV2(heightmap_t *hm, hmsection_t *s, void *ptr, int len)
} }
if (lmstart) if (lmstart)
COM_AddWork(0, Terr_WorkerLoadedSectionLightmap, hm, lmstart, s->sx, s->sy); COM_AddWork(WG_MAIN, Terr_WorkerLoadedSectionLightmap, hm, lmstart, s->sx, s->sy);
/*load any static ents*/ /*load any static ents*/
j = Terr_Read_SInt(&strm); j = Terr_Read_SInt(&strm);
@ -1597,9 +1603,9 @@ static hmsection_t *Terr_ReadSection(heightmap_t *hm, hmsection_t *s, int ver, v
s->loadstate = TSLS_LOADING2; s->loadstate = TSLS_LOADING2;
if (failed) if (failed)
COM_AddWork(0, Terr_WorkerFailedSection, s, NULL, s->sx, s->sy); COM_AddWork(WG_MAIN, Terr_WorkerFailedSection, s, NULL, s->sx, s->sy);
else else
COM_AddWork(0, Terr_WorkerLoadedSection, s, NULL, s->sx, s->sy); COM_AddWork(WG_MAIN, Terr_WorkerLoadedSection, s, NULL, s->sx, s->sy);
return s; return s;
} }
@ -1638,9 +1644,9 @@ qboolean Terr_DownloadedSection(char *fname)
} }
#endif #endif
#ifndef SERVERONLY
static void Terr_LoadSection(heightmap_t *hm, hmsection_t *s, int sx, int sy, unsigned int flags) static void Terr_LoadSection(heightmap_t *hm, hmsection_t *s, int sx, int sy, unsigned int flags)
{ {
#ifndef SERVERONLY
//when using networked terrain, the client will never load a section from disk, but will only load it from the server //when using networked terrain, the client will never load a section from disk, but will only load it from the server
//one section at a time. //one section at a time.
if (mod_terrain_networked.ival && !sv.state) if (mod_terrain_networked.ival && !sv.state)
@ -1653,20 +1659,19 @@ static void Terr_LoadSection(heightmap_t *hm, hmsection_t *s, int sx, int sy, un
CL_CheckOrEnqueDownloadFile(Terr_DiskSectionName(hm, sx, sy, fname, sizeof(fname)), Terr_TempDiskSectionName(hm, sx, sy), DLLF_OVERWRITE|DLLF_TEMPORARY); CL_CheckOrEnqueDownloadFile(Terr_DiskSectionName(hm, sx, sy, fname, sizeof(fname)), Terr_TempDiskSectionName(hm, sx, sy), DLLF_OVERWRITE|DLLF_TEMPORARY);
return; return;
} }
#endif
if (!s) if (!s)
{ {
Terr_GenerateSection(hm, sx, sy, true); Terr_GenerateSection(hm, sx, sy, true);
} }
} }
#endif
static void Terr_LoadSectionWorker(void *ctx, void *data, size_t a, size_t b) static void Terr_LoadSectionWorker(void *ctx, void *data, size_t a, size_t b)
{ {
heightmap_t *hm = data; heightmap_t *hm = data;
hmsection_t *s = ctx; hmsection_t *s = ctx;
int sx = a; int sx = a;
int sy = b; int sy = b;
int flags = 0;
void *diskimage; void *diskimage;
qofs_t len; qofs_t len;
char fname[MAX_QPATH]; char fname[MAX_QPATH];
@ -2199,6 +2204,7 @@ static void Terr_DoEditNotify(heightmap_t *hm)
} }
} }
#ifndef SERVERONLY
//garbage collect the oldest section, to make space for another //garbage collect the oldest section, to make space for another
static qboolean Terr_Collect(heightmap_t *hm) static qboolean Terr_Collect(heightmap_t *hm)
{ {
@ -2239,6 +2245,7 @@ static qboolean Terr_Collect(heightmap_t *hm)
return false; return false;
} }
#endif #endif
#endif
/*purge all sections, but not root /*purge all sections, but not root
lightmaps only are purged whenever the client rudely kills lightmaps (purges all lightmaps on map changes, to cope with models/maps potentially being unloaded) lightmaps only are purged whenever the client rudely kills lightmaps (purges all lightmaps on map changes, to cope with models/maps potentially being unloaded)
@ -4345,8 +4352,6 @@ void Heightmap_FindTouchedLeafs (model_t *mod, pvscache_t *ent, float *mins, flo
void Heightmap_LightPointValues (model_t *mod, vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t res_dir) void Heightmap_LightPointValues (model_t *mod, vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t res_dir)
{ {
float time = realtime;
res_diffuse[0] = 128; res_diffuse[0] = 128;
res_diffuse[1] = 128; res_diffuse[1] = 128;
res_diffuse[2] = 128; res_diffuse[2] = 128;
@ -5249,8 +5254,8 @@ void Terr_ParseEntityLump(char *data, heightmap_t *heightmap)
void Terr_FinishTerrain(model_t *mod) void Terr_FinishTerrain(model_t *mod)
{ {
heightmap_t *hm = mod->terrain;
#ifndef SERVERONLY #ifndef SERVERONLY
heightmap_t *hm = mod->terrain;
if (qrenderer != QR_NONE) if (qrenderer != QR_NONE)
{ {
if (*hm->skyname) if (*hm->skyname)
@ -6453,7 +6458,7 @@ void QCBUILTIN PF_brush_selected(pubprogfuncs_t *prinst, struct globalvars_s *pr
model_t *mod = vmw->Get_CModel(vmw, G_FLOAT(OFS_PARM0)); model_t *mod = vmw->Get_CModel(vmw, G_FLOAT(OFS_PARM0));
heightmap_t *hm = mod?mod->terrain:NULL; heightmap_t *hm = mod?mod->terrain:NULL;
unsigned int brushid = G_INT(OFS_PARM1); unsigned int brushid = G_INT(OFS_PARM1);
unsigned int faceid = G_INT(OFS_PARM2); // unsigned int faceid = G_INT(OFS_PARM2);
unsigned int state = G_FLOAT(OFS_PARM3); unsigned int state = G_FLOAT(OFS_PARM3);
unsigned int i; unsigned int i;
brushes_t *br; brushes_t *br;

View File

@ -971,7 +971,9 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b)
unsigned *buf = NULL; unsigned *buf = NULL;
char mdlbase[MAX_QPATH]; char mdlbase[MAX_QPATH];
char *replstr; char *replstr;
#ifdef DSPMODELS
qboolean doomsprite = false; qboolean doomsprite = false;
#endif
unsigned int magic, i; unsigned int magic, i;
size_t filesize; size_t filesize;
char ext[8]; char ext[8];
@ -986,7 +988,7 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b)
mod->maxs[1] = 16; mod->maxs[1] = 16;
mod->maxs[2] = 16; mod->maxs[2] = 16;
mod->engineflags = 0; mod->engineflags = 0;
COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0);
return; return;
} }
@ -1042,11 +1044,13 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b)
COM_FileExtension(mod->name, ext, sizeof(ext)); COM_FileExtension(mod->name, ext, sizeof(ext));
if (!Q_strcasecmp(ext, "spr") || !Q_strcasecmp(ext, "sp2")) if (!Q_strcasecmp(ext, "spr") || !Q_strcasecmp(ext, "sp2"))
replstr = ""; // sprite replstr = ""; // sprite
#ifdef DSPMODELS
else if (!Q_strcasecmp(ext, "dsp")) // doom sprite else if (!Q_strcasecmp(ext, "dsp")) // doom sprite
{ {
replstr = ""; replstr = "";
doomsprite = true; doomsprite = true;
} }
#endif
else // assume models else // assume models
replstr = r_replacemodels.string; replstr = r_replacemodels.string;
@ -1080,7 +1084,7 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b)
TRACE(("Mod_LoadModel: doomsprite: \"%s\"\n", mod->name)); TRACE(("Mod_LoadModel: doomsprite: \"%s\"\n", mod->name));
Mod_LoadDoomSprite(mod); Mod_LoadDoomSprite(mod);
BZ_Free(buf); BZ_Free(buf);
COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0);
return; return;
} }
#endif #endif
@ -1149,7 +1153,7 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b)
BZ_Free(buf); BZ_Free(buf);
COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0); COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0);
return; return;
} }
@ -1161,7 +1165,7 @@ void Mod_LoadModelWorker (void *ctx, void *data, size_t a, size_t b)
mod->maxs[1] = 16; mod->maxs[1] = 16;
mod->maxs[2] = 16; mod->maxs[2] = 16;
mod->engineflags = 0; mod->engineflags = 0;
COM_AddWork(0, Mod_ModelLoaded, mod, NULL, MLS_FAILED, verbose); COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_FAILED, verbose);
} }
@ -1174,9 +1178,9 @@ model_t *Mod_LoadModel (model_t *mod, enum mlverbosity_e verbose)
// Mod_LoadModelWorker(mod, MLV_WARN, 0); // Mod_LoadModelWorker(mod, MLV_WARN, 0);
// else // else
if (verbose == MLV_ERROR || verbose == MLV_WARNSYNC) if (verbose == MLV_ERROR || verbose == MLV_WARNSYNC)
COM_AddWork(0, Mod_LoadModelWorker, mod, NULL, verbose, 0); COM_AddWork(WG_MAIN, Mod_LoadModelWorker, mod, NULL, verbose, 0);
else else
COM_AddWork(1, Mod_LoadModelWorker, mod, NULL, verbose, 0); COM_AddWork(WG_LOADER, Mod_LoadModelWorker, mod, NULL, verbose, 0);
} }
if (verbose == MLV_ERROR) if (verbose == MLV_ERROR)
@ -1216,7 +1220,7 @@ model_t *Mod_ForName (const char *name, enum mlverbosity_e verbosity)
=============================================================================== ===============================================================================
*/ */
#ifndef SERVERONLY
static const struct static const struct
{ {
const char *oldname; const char *oldname;
@ -1264,6 +1268,7 @@ static const char *Mod_RemapBuggyTexture(const char *name, const qbyte *data, un
} }
return NULL; return NULL;
} }
#endif
void Mod_FinishTexture(texture_t *tx, const char *loadname, qboolean safetoloadfromwads) void Mod_FinishTexture(texture_t *tx, const char *loadname, qboolean safetoloadfromwads)
@ -4830,12 +4835,12 @@ TRACE(("LoadBrushModel %i\n", __LINE__));
TRACE(("LoadBrushModel %i\n", __LINE__)); TRACE(("LoadBrushModel %i\n", __LINE__));
if (!isDedicated || ode) if (!isDedicated || ode)
{ {
COM_AddWork(0, ModBrush_LoadGLStuff, submod, NULL, i, 0); COM_AddWork(WG_MAIN, ModBrush_LoadGLStuff, submod, NULL, i, 0);
} }
TRACE(("LoadBrushModel %i\n", __LINE__)); TRACE(("LoadBrushModel %i\n", __LINE__));
if (i) if (i)
COM_AddWork(0, Mod_ModelLoaded, submod, NULL, MLS_LOADED, 0); COM_AddWork(WG_MAIN, Mod_ModelLoaded, submod, NULL, MLS_LOADED, 0);
if (i < submod->numsubmodels-1) if (i < submod->numsubmodels-1)
{ // duplicate the basic information { // duplicate the basic information
char name[MAX_QPATH]; char name[MAX_QPATH];

View File

@ -39,6 +39,7 @@ typedef enum {
SHADER_SORT_PORTAL, SHADER_SORT_PORTAL,
SHADER_SORT_SKY, SHADER_SORT_SKY,
SHADER_SORT_OPAQUE, SHADER_SORT_OPAQUE,
//fixme: occlusion tests
SHADER_SORT_DECAL, SHADER_SORT_DECAL,
SHADER_SORT_SEETHROUGH, SHADER_SORT_SEETHROUGH,
SHADER_SORT_BANNER, SHADER_SORT_BANNER,

View File

@ -1670,7 +1670,9 @@ void GLQ1BSP_LightPointValues(model_t *model, vec3_t point, vec3_t res_diffuse,
{ {
vec3_t end; vec3_t end;
float *r; float *r;
#ifdef RTLIGHTS
extern cvar_t r_shadow_realtime_world, r_shadow_realtime_world_lightmaps; extern cvar_t r_shadow_realtime_world, r_shadow_realtime_world_lightmaps;
#endif
if (!model->lightdata || r_fullbright.ival) if (!model->lightdata || r_fullbright.ival)
{ {

View File

@ -60,6 +60,7 @@ cvar_t gl_affinemodels = SCVAR("gl_affinemodels","0");
cvar_t gl_finish = SCVAR("gl_finish","0"); cvar_t gl_finish = SCVAR("gl_finish","0");
cvar_t gl_dither = SCVAR("gl_dither", "1"); cvar_t gl_dither = SCVAR("gl_dither", "1");
extern cvar_t r_stereo_separation; extern cvar_t r_stereo_separation;
extern cvar_t r_stereo_convergence;
extern cvar_t r_stereo_method; extern cvar_t r_stereo_method;
extern cvar_t r_postprocshader, r_fxaa; extern cvar_t r_postprocshader, r_fxaa;
@ -405,7 +406,9 @@ void R_SetupGL (float stereooffset)
newa[0] = r_refdef.viewangles[0]; newa[0] = r_refdef.viewangles[0];
newa[1] = r_refdef.viewangles[1]; newa[1] = r_refdef.viewangles[1];
newa[2] = r_refdef.viewangles[2] + gl_screenangle.value; newa[2] = r_refdef.viewangles[2] + gl_screenangle.value;
if (1) if (stereooffset)
newa[1] += r_stereo_convergence.value * ((stereooffset>0)?-0.5:0.5); //can we get away with this cheapness? rip 6dof
if (0)
{ {
vec3_t paxis[3]; vec3_t paxis[3];
AngleVectors (newa, paxis[0], paxis[1], paxis[2]); AngleVectors (newa, paxis[0], paxis[1], paxis[2]);

View File

@ -296,8 +296,8 @@ char *GLVID_GetRGBInfo(int *truewidth, int *trueheight, enum uploadfmt *fmt)
} }
ret = BZ_Realloc(ret, (*truewidth)*(*trueheight)*3); ret = BZ_Realloc(ret, (*truewidth)*(*trueheight)*3);
} }
#ifdef _DEBUG #if 1//def _DEBUG
else if (!gl_config.gles && gl_config.glversion >= 1.2) else if (!gl_config.gles && sh_config.texfmt[PTI_BGRA8])
{ {
*fmt = TF_BGRA32; *fmt = TF_BGRA32;
ret = BZ_Malloc((*truewidth)*(*trueheight)*4); ret = BZ_Malloc((*truewidth)*(*trueheight)*4);

View File

@ -832,7 +832,7 @@ static void Shader_ClutterParms(shader_t *shader, shaderpass_t *pass, char **ptr
static void Shader_SkyParms(shader_t *shader, shaderpass_t *pass, char **ptr) static void Shader_SkyParms(shader_t *shader, shaderpass_t *pass, char **ptr)
{ {
skydome_t *skydome; skydome_t *skydome;
float skyheight; // float skyheight;
char *boxname; char *boxname;
if (shader->skydome) if (shader->skydome)
@ -846,7 +846,7 @@ static void Shader_SkyParms(shader_t *shader, shaderpass_t *pass, char **ptr)
boxname = Shader_ParseString(ptr); boxname = Shader_ParseString(ptr);
Shader_ParseSkySides(shader->name, boxname, skydome->farbox_textures); Shader_ParseSkySides(shader->name, boxname, skydome->farbox_textures);
skyheight = Shader_ParseFloat(shader, ptr, 512); /*skyheight =*/ Shader_ParseFloat(shader, ptr, 512);
boxname = Shader_ParseString(ptr); boxname = Shader_ParseString(ptr);
Shader_ParseSkySides(shader->name, boxname, skydome->nearbox_textures); Shader_ParseSkySides(shader->name, boxname, skydome->nearbox_textures);
@ -1867,10 +1867,10 @@ static void Shader_HLSL11ProgramName (shader_t *shader, shaderpass_t *pass, char
static void Shader_ProgramParam ( shader_t *shader, shaderpass_t *pass, char **ptr ) static void Shader_ProgramParam ( shader_t *shader, shaderpass_t *pass, char **ptr )
{ {
#if 1
Con_DPrintf("shader %s: 'param' no longer supported\n", shader->name);
#elif defined(GLQUAKE)
cvar_t *cv = NULL; cvar_t *cv = NULL;
int specialint = 0;
float specialfloat = 0;
vec3_t specialvec = {0};
enum shaderprogparmtype_e parmtype = SP_BAD; enum shaderprogparmtype_e parmtype = SP_BAD;
char *token; char *token;
qboolean silent = false; qboolean silent = false;
@ -1952,9 +1952,12 @@ static void Shader_ProgramParam ( shader_t *shader, shaderpass_t *pass, char **p
else else
token = Shader_ParseSensString(ptr); token = Shader_ParseSensString(ptr);
#if 0//def GLQUAKE
if (qrenderer == QR_OPENGL) if (qrenderer == QR_OPENGL)
{ {
int specialint = 0;
float specialfloat = 0;
vec3_t specialvec = {0};
int p; int p;
qboolean foundone; qboolean foundone;
unsigned int uniformloc; unsigned int uniformloc;
@ -2493,11 +2496,10 @@ static void Shaderpass_ClampMap (shader_t *shader, shaderpass_t *pass, char **pt
static void Shaderpass_VideoMap (shader_t *shader, shaderpass_t *pass, char **ptr) static void Shaderpass_VideoMap (shader_t *shader, shaderpass_t *pass, char **ptr)
{ {
char *token; char *token = Shader_ParseSensString (ptr);
token = Shader_ParseSensString (ptr);
#ifdef NOMEDIA #ifdef NOMEDIA
(void)token;
#else #else
if (pass->cin) if (pass->cin)
Z_Free (pass->cin); Z_Free (pass->cin);

View File

@ -2026,7 +2026,7 @@ void INS_ReInit(void)
void INS_Shutdown(void) void INS_Shutdown(void)
{ {
} }
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid))
{ {
} }

View File

@ -205,7 +205,7 @@ void INS_Shutdown (void)
void INS_Commands (void) void INS_Commands (void)
{ {
} }
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid))
{ {
} }
void INS_Move (float *movements, int pnum) void INS_Move (float *movements, int pnum)

View File

@ -2359,7 +2359,7 @@ LONG WINAPI GLMainWndProc (
{ {
COPYDATASTRUCT *cds = (COPYDATASTRUCT*)lParam; COPYDATASTRUCT *cds = (COPYDATASTRUCT*)lParam;
#ifdef WTHREAD #ifdef WTHREAD
COM_AddWork(0, MainThreadWndProc, NULL, memcpy(Z_Malloc(cds->cbData), cds->lpData, cds->cbData), uMsg, cds->cbData); COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, memcpy(Z_Malloc(cds->cbData), cds->lpData, cds->cbData), uMsg, cds->cbData);
#else #else
Host_RunFile(cds->lpData, cds->cbData, NULL); Host_RunFile(cds->lpData, cds->cbData, NULL);
#endif #endif
@ -2368,7 +2368,7 @@ LONG WINAPI GLMainWndProc (
break; break;
case WM_KILLFOCUS: case WM_KILLFOCUS:
#ifdef WTHREAD #ifdef WTHREAD
COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0); COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, NULL, uMsg, 0);
#else #else
GLAppActivate(FALSE, Minimized);//FIXME: thread GLAppActivate(FALSE, Minimized);//FIXME: thread
if (modestate == MS_FULLDIB) if (modestate == MS_FULLDIB)
@ -2378,7 +2378,7 @@ LONG WINAPI GLMainWndProc (
break; break;
case WM_SETFOCUS: case WM_SETFOCUS:
#ifdef WTHREAD #ifdef WTHREAD
COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0); COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, NULL, uMsg, 0);
#else #else
if (!GLAppActivate(TRUE, Minimized))//FIXME: thread if (!GLAppActivate(TRUE, Minimized))//FIXME: thread
break; break;
@ -2396,7 +2396,7 @@ LONG WINAPI GLMainWndProc (
case WM_MOVE: case WM_MOVE:
VID_UpdateWindowStatus (hWnd); VID_UpdateWindowStatus (hWnd);
#ifdef WTHREAD #ifdef WTHREAD
COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0); COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, NULL, uMsg, 0);
#else #else
Cvar_ForceCallback(&vid_conautoscale); Cvar_ForceCallback(&vid_conautoscale);
#endif #endif
@ -2535,7 +2535,7 @@ LONG WINAPI GLMainWndProc (
{ {
VID_UpdateWindowStatus (hWnd); VID_UpdateWindowStatus (hWnd);
#ifdef WTHREAD #ifdef WTHREAD
COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0); COM_AddWork(WG_MAIN, MainThreadWndProc, NULL, NULL, uMsg, 0);
#else #else
Cvar_ForceCallback(&vid_conautoscale); Cvar_ForceCallback(&vid_conautoscale);
#endif #endif

View File

@ -2221,7 +2221,7 @@ qboolean QDECL Mod_LoadDoomLevel(model_t *mod, void *buffer, size_t fsize)
QuakifyThings(mod, thingsl); QuakifyThings(mod, thingsl);
COM_AddWork(0, Doom_LoadShaders, mod, NULL, 0, 0); COM_AddWork(WG_MAIN, Doom_LoadShaders, mod, NULL, 0, 0);
return true; return true;
} }

View File

@ -515,7 +515,6 @@ struct shader_s
texnums_t *defaulttextures; //must always have at least one entry. multiple will only appear if the diffuse texture was animmapped. texnums_t *defaulttextures; //must always have at least one entry. multiple will only appear if the diffuse texture was animmapped.
struct shader_s *next; struct shader_s *next;
int id; int id;
//end of shared fields.
shader_t *bemoverrides[bemoverride_max]; shader_t *bemoverrides[bemoverride_max];
shader_t *remapto; //render using this shader instead. for q3 nonsense. shader_t *remapto; //render using this shader instead. for q3 nonsense.
@ -551,7 +550,7 @@ struct shader_s
SHADER_NODLIGHT = 1 << 15, //from surfaceflags SHADER_NODLIGHT = 1 << 15, //from surfaceflags
SHADER_HASLIGHTMAP = 1 << 16, SHADER_HASLIGHTMAP = 1 << 16,
SHADER_HASTOPBOTTOM = 1 << 17, SHADER_HASTOPBOTTOM = 1 << 17,
SHADER_STATICDATA = 1 << 18, //set if true: no deforms, no tcgen, rgbgen=identitylighting, alphagen=identity, tmu0=st + tmu1=lm(if available) for every pass, no norms // SHADER_STATICDATA = 1 << 18, //set if true: no deforms, no tcgen, rgbgen=identitylighting, alphagen=identity, tmu0=st + tmu1=lm(if available) for every pass, no norms
SHADER_HASREFLECT = 1 << 19, //says that we need to generate a reflection image first SHADER_HASREFLECT = 1 << 19, //says that we need to generate a reflection image first
SHADER_HASREFRACT = 1 << 20, //says that we need to generate a refraction image first SHADER_HASREFRACT = 1 << 20, //says that we need to generate a refraction image first
SHADER_HASREFRACTDEPTH = 1 << 21, //refraction generation needs to generate a depth texture too. SHADER_HASREFRACTDEPTH = 1 << 21, //refraction generation needs to generate a depth texture too.
@ -586,7 +585,6 @@ struct shader_s
char modelname[1]; char modelname[1];
} *clutter; } *clutter;
// meshfeatures_t features;
bucket_t bucket; bucket_t bucket;
}; };

View File

@ -295,7 +295,7 @@ void Cookie_Feed(char *domain, int secure, char *name, char *value)
{ {
cookie_t **link, *c; cookie_t **link, *c;
Sys_LockMutex(com_resourcemutex); Sys_LockMutex(com_resourcemutex);
for(link = &cookies; c = *link; link = &(*link)->next) for(link = &cookies; (c=*link)!=NULL; link = &(*link)->next)
{ {
if (!strcmp(c->domain, domain) && c->secure == secure && !strcmp(c->name, name)) if (!strcmp(c->domain, domain) && c->secure == secure && !strcmp(c->name, name))
break; break;
@ -368,7 +368,7 @@ void Cookie_Regurgitate(char *domain, int secure, char *buffer, size_t buffersiz
{ {
qboolean hascookies = false; qboolean hascookies = false;
cookie_t *c; cookie_t *c;
char *l = buffer; // char *l = buffer;
buffersize -= 3; //\r\n\0 buffersize -= 3; //\r\n\0
*buffer = 0; *buffer = 0;
Sys_LockMutex(com_resourcemutex); Sys_LockMutex(com_resourcemutex);
@ -1328,7 +1328,7 @@ static int DL_Thread_Work(void *arg)
} }
#if defined(LOADERTHREAD) && !defined(NPFTE) #if defined(LOADERTHREAD) && !defined(NPFTE)
COM_AddWork(0, HTTP_Wake_Think, NULL, NULL, 0, 0); COM_AddWork(WG_MAIN, HTTP_Wake_Think, NULL, NULL, 0, 0);
#endif #endif
return 0; return 0;
} }

View File

@ -15,7 +15,7 @@ static char lastrecordedmvd[MAX_QPATH];
static IWeb_FileGen_t *IWeb_GenerationBuffer; static IWeb_FileGen_t *IWeb_GenerationBuffer;
static size_t IWeb_GenerationBufferTotal; static size_t IWeb_GenerationBufferTotal;
/*
static void IWeb_MoreGeneratedResize(size_t newsize) static void IWeb_MoreGeneratedResize(size_t newsize)
{ {
IWeb_FileGen_t *ob; IWeb_FileGen_t *ob;
@ -37,6 +37,7 @@ static void IWeb_MoreGeneratedResize(size_t newsize)
IWeb_GenerationBufferTotal = newsize; IWeb_GenerationBufferTotal = newsize;
} }
*/
static void IWeb_Generate(const char *buf) static void IWeb_Generate(const char *buf)
{ {
size_t count = strlen(buf); size_t count = strlen(buf);
@ -72,6 +73,7 @@ static void IWeb_Generate(const char *buf)
int Rank_Enumerate (unsigned int first, unsigned int last, void (*callback) (const rankinfo_t *ri)); //leader first. int Rank_Enumerate (unsigned int first, unsigned int last, void (*callback) (const rankinfo_t *ri)); //leader first.
/*
static void IWeb_ParseForm(char *info, int infolen, char *text) static void IWeb_ParseForm(char *info, int infolen, char *text)
{ {
char *eq, *and; char *eq, *and;
@ -196,7 +198,7 @@ static void IWeb_GenerateAdminFile(char *parms, char *content, int contentlength
IWeb_Generate("<H1>Remote administration is not enabled.<H2>"); IWeb_Generate("<H1>Remote administration is not enabled.<H2>");
IWeb_Generate("</BODY></HTML>"); IWeb_Generate("</BODY></HTML>");
} }
*/
static void IWeb_GenerateRankingsFileCallback(const rankinfo_t *ri) static void IWeb_GenerateRankingsFileCallback(const rankinfo_t *ri)
{ {

View File

@ -733,13 +733,6 @@ eval_t *PDECL PR_FindGlobal(pubprogfuncs_t *ppf, const char *globname, progsnum_
return NULL; return NULL;
} }
//fixme: remove?
static void PDECL SetGlobalEdict(pubprogfuncs_t *ppf, struct edict_s *ed, int ofs)
{
progfuncs_t *progfuncs = (progfuncs_t*)ppf;
((int*)pr_globals)[ofs] = EDICT_TO_PROG(progfuncs, ed);
}
char *PDECL PR_VarString (pubprogfuncs_t *ppf, int first) char *PDECL PR_VarString (pubprogfuncs_t *ppf, int first)
{ {
progfuncs_t *progfuncs = (progfuncs_t*)ppf; progfuncs_t *progfuncs = (progfuncs_t*)ppf;
@ -1027,7 +1020,8 @@ string_t PDECL PR_AllocTempString (pubprogfuncs_t *ppf, const char *str)
return 0; return 0;
len = strlen(str)+1; len = strlen(str)+1;
res = PR_AllocTempStringLen(ppf, &out, len); res = PR_AllocTempStringLen(ppf, &out, len);
memcpy(out, str, len); if (res)
memcpy(out, str, len);
return res; return res;
#else #else
progfuncs_t *progfuncs = (progfuncs_t*)ppf; progfuncs_t *progfuncs = (progfuncs_t*)ppf;

View File

@ -21,7 +21,7 @@ Sets everything to NULL
*/ */
void PDECL QC_ClearEdict (pubprogfuncs_t *ppf, struct edict_s *ed) void PDECL QC_ClearEdict (pubprogfuncs_t *ppf, struct edict_s *ed)
{ {
progfuncs_t *progfuncs = (progfuncs_t*)ppf; // progfuncs_t *progfuncs = (progfuncs_t*)ppf;
edictrun_t *e = (edictrun_t *)ed; edictrun_t *e = (edictrun_t *)ed;
int num = e->entnum; int num = e->entnum;
memset (e->fields, 0, e->fieldsize); memset (e->fields, 0, e->fieldsize);
@ -1882,7 +1882,6 @@ int PDECL PR_LoadEnts(pubprogfuncs_t *ppf, const char *file, float killonspawnfl
char filename[128]; char filename[128];
int num; int num;
int numbuiltins;
edictrun_t *ed=NULL; edictrun_t *ed=NULL;
ddef16_t *d16; ddef16_t *d16;
ddef32_t *d32; ddef32_t *d32;
@ -2005,7 +2004,6 @@ int PDECL PR_LoadEnts(pubprogfuncs_t *ppf, const char *file, float killonspawnfl
filename[0] = '\0'; filename[0] = '\0';
header_crc = 0; header_crc = 0;
numbuiltins = 0;
while(1) while(1)
{ {

View File

@ -603,7 +603,7 @@ pbool LocateDebugTerm(progfuncs_t *progfuncs, char *key, eval_t **result, etype_
char *c, *c2; char *c, *c2;
etype_t type = ev_void; etype_t type = ev_void;
struct edictrun_s *ed; struct edictrun_s *ed;
etype_t ptrtype = ev_void; // etype_t ptrtype = ev_void;
c = strchr(key, '.'); c = strchr(key, '.');
if (c) *c = '\0'; if (c) *c = '\0';
@ -807,7 +807,7 @@ char *PDECL PR_EvaluateDebugString(pubprogfuncs_t *ppf, char *key)
{ {
if (!LocateDebugTerm(progfuncs, key+1, &val, &type, &fakeval) && val != &fakeval) if (!LocateDebugTerm(progfuncs, key+1, &val, &type, &fakeval) && val != &fakeval)
return "(unable to evaluate)"; return "(unable to evaluate)";
QC_snprintfz(buf, sizeof(buf), "(%s*)%#x", ((type>=10)?"???":basictypenames[type]), (char*)val - progfuncs->funcs.stringtable); QC_snprintfz(buf, sizeof(buf), "(%s*)%#x", ((type>=10)?"???":basictypenames[type]), (unsigned int)((char*)val - progfuncs->funcs.stringtable));
return buf; return buf;
} }
@ -1955,6 +1955,10 @@ pbool PDECL PR_GetBuiltinCallInfo (pubprogfuncs_t *ppf, int *builtinnum, char *f
op = pr_statements32[st].op; op = pr_statements32[st].op;
a = pr_statements32[st].a; a = pr_statements32[st].a;
break; break;
default:
op = OP_DONE;
a = 0;
break;
} }
*builtinnum = 0; *builtinnum = 0;

View File

@ -1057,6 +1057,7 @@ static void inline QCC_PR_Expect (char *string)
void editbadfile(char *fname, int line); void editbadfile(char *fname, int line);
char *TypeName(QCC_type_t *type, char *buffer, int buffersize); char *TypeName(QCC_type_t *type, char *buffer, int buffersize);
void QCC_PR_AddIncludePath(const char *newinc);
void QCC_PR_IncludeChunk (char *data, pbool duplicate, char *filename); void QCC_PR_IncludeChunk (char *data, pbool duplicate, char *filename);
void QCC_PR_IncludeChunkEx(char *data, pbool duplicate, char *filename, CompilerConstant_t *cnst); void QCC_PR_IncludeChunkEx(char *data, pbool duplicate, char *filename, CompilerConstant_t *cnst);
void QCC_PR_CloseProcessor(void); void QCC_PR_CloseProcessor(void);

View File

@ -8605,7 +8605,7 @@ QCC_ref_t *QCC_PR_RefExpression (QCC_ref_t *retbuf, int priority, int exprflags)
} }
if (priority > 1 && exprflags & EXPR_WARN_ABOVE_1) if (priority > 1 && exprflags & EXPR_WARN_ABOVE_1)
QCC_PR_ParseWarning(WARN_UNARYNOTSCOPE, "unary-not applies to non-unary expression"); QCC_PR_ParseWarning(WARN_UNARYNOTSCOPE, "suggest parenthesis for unary operator that applies to multiple terms");
break; break;
} }
@ -12661,7 +12661,7 @@ void QCC_PR_ParseDefs (char *classname)
QCC_def_t *def, *d; QCC_def_t *def, *d;
QCC_sref_t dynlength; QCC_sref_t dynlength;
QCC_function_t *f; QCC_function_t *f;
int i = 0; // warning: i may be used uninitialized in this function // int i = 0; // warning: i may be used uninitialized in this function
pbool shared=false; pbool shared=false;
pbool isstatic=defaultstatic; pbool isstatic=defaultstatic;
pbool externfnc=false; pbool externfnc=false;

View File

@ -112,7 +112,7 @@ void QCC_PR_CloseProcessor(void)
*qccincludedir[i] = 0; *qccincludedir[i] = 0;
currentchunk = NULL; currentchunk = NULL;
} }
void QCC_PR_AddIncludePath(char *newinc) void QCC_PR_AddIncludePath(const char *newinc)
{ {
int i; int i;
@ -1445,13 +1445,25 @@ void QCC_PR_LexString (void)
if (!c) if (!c)
QCC_PR_ParseError (ERR_EOF, "EOF inside quote"); QCC_PR_ParseError (ERR_EOF, "EOF inside quote");
if (!qccwarningaction[WARN_NOTUTF8] && c < 0 && utf8_check(&pr_token[c-1], &code)) /*
if (!qccwarningaction[WARN_NOTUTF8] && (c&0x80))
{ {
//convert 0xe000 private-use area to quake's charset (if they don't have the utf-8 warning enabled) //convert 0xe000 private-use area to quake's charset (if they don't have the utf-8 warning enabled)
//note: this may have a small false-positive risk. //note: this may have a small false-positive risk.
if (code >= 0xe000 && code <= 0xe0ff) if (utf8_check(pr_file_p-1, &code))
pr_file_p += utf8_check(&pr_token[c-1], &code)-1; {
if (code >= 0xe000 && code <= 0xe0ff)
{
pr_file_p += utf8_check(pr_file_p-1, &code)-1;
c = code & 0xff;
}
else
QCC_PR_ParseWarning(WARN_DODGYCHARSET, "non-ascii chars outside of quake-mapped private-use area", sizeof(pr_token)-1);
}
else
QCC_PR_ParseWarning(WARN_DODGYCHARSET, "source file is not unicode", sizeof(pr_token)-1);
} }
*/
/* //these two conditions are generally part of the C preprocessor. /* //these two conditions are generally part of the C preprocessor.
if (c == '\\' && *pr_file_p == '\r' && pr_file_p[1] == '\n') if (c == '\\' && *pr_file_p == '\r' && pr_file_p[1] == '\n')
@ -4722,9 +4734,9 @@ QCC_type_t *QCC_PR_ParseType (int newtype, pbool silentfail)
pbool isnonvirt = false; pbool isnonvirt = false;
pbool isstatic = false; pbool isstatic = false;
pbool isignored = false; pbool isignored = false;
pbool ispublic = false; // pbool ispublic = false;
pbool isprivate = false; // pbool isprivate = false;
pbool isprotected = false; // pbool isprotected = false;
while(1) while(1)
{ {
if (QCC_PR_CheckKeyword(1, "nonvirtual")) if (QCC_PR_CheckKeyword(1, "nonvirtual"))
@ -4738,11 +4750,11 @@ QCC_type_t *QCC_PR_ParseType (int newtype, pbool silentfail)
else if (QCC_PR_CheckKeyword(1, "strip")) else if (QCC_PR_CheckKeyword(1, "strip"))
isignored = true; isignored = true;
else if (QCC_PR_CheckKeyword(1, "public")) else if (QCC_PR_CheckKeyword(1, "public"))
ispublic = true; /*ispublic = true*/;
else if (QCC_PR_CheckKeyword(1, "private")) else if (QCC_PR_CheckKeyword(1, "private"))
isprivate = true; /*isprivate = true*/;
else if (QCC_PR_CheckKeyword(1, "protected")) else if (QCC_PR_CheckKeyword(1, "protected"))
isprotected = true; /*isprotected = true*/;
else else
break; break;
} }

View File

@ -9297,8 +9297,8 @@ static void QCBUILTIN PF_SendPacket(pubprogfuncs_t *prinst, struct globalvars_s
const char *address = PR_GetStringOfs(prinst, OFS_PARM0); const char *address = PR_GetStringOfs(prinst, OFS_PARM0);
const char *contents = PF_VarString(prinst, 1, pr_globals); const char *contents = PF_VarString(prinst, 1, pr_globals);
NET_StringToAdr(address, 0, &to); if (NET_StringToAdr(address, 0, &to))
NET_SendPacket(NS_SERVER, strlen(contents), contents, &to); NET_SendPacket(NS_SERVER, strlen(contents), contents, &to);
} }
//be careful to not touch the resource unless we're meant to, to avoid stalling //be careful to not touch the resource unless we're meant to, to avoid stalling
@ -9356,6 +9356,11 @@ static void QCBUILTIN PF_resourcestatus(pubprogfuncs_t *prinst, struct globalvar
} }
} }
break; break;
case RESTYPE_PARTICLE:
case RESTYPE_SHADER:
case RESTYPE_SKIN:
case RESTYPE_TEXTURE:
//FIXME
default: default:
G_FLOAT(OFS_RETURN) = -1; G_FLOAT(OFS_RETURN) = -1;
break; break;

View File

@ -1097,7 +1097,6 @@ void SV_Savegame (const char *savename, qboolean mapchange)
extern cvar_t temp1; extern cvar_t temp1;
extern cvar_t noexit; extern cvar_t noexit;
extern cvar_t pr_maxedicts; extern cvar_t pr_maxedicts;
extern cvar_t scr_sshot_type;
client_t *cl; client_t *cl;
@ -1230,7 +1229,7 @@ void SV_Savegame (const char *savename, qboolean mapchange)
{ {
int width; int width;
int height; int height;
qbyte *rgbbuffer; void *rgbbuffer;
image_t *img; image_t *img;
//poke the various modes into redrawing the screen (without huds), to avoid any menus or console drawn over the top of the current backbuffer. //poke the various modes into redrawing the screen (without huds), to avoid any menus or console drawn over the top of the current backbuffer.
@ -1257,6 +1256,7 @@ void SV_Savegame (const char *savename, qboolean mapchange)
rgbbuffer = VID_GetRGBInfo(&width, &height, &fmt); rgbbuffer = VID_GetRGBInfo(&width, &height, &fmt);
if (rgbbuffer) if (rgbbuffer)
{ {
// extern cvar_t scr_sshot_type;
SCR_ScreenShot(savefilename, FS_GAMEONLY, &rgbbuffer, 1, width, height, fmt); SCR_ScreenShot(savefilename, FS_GAMEONLY, &rgbbuffer, 1, width, height, fmt);
BZ_Free(rgbbuffer); BZ_Free(rgbbuffer);

View File

@ -1104,7 +1104,7 @@ qboolean MSV_ClusterLogin(char *guid, char *userinfo, size_t userinfosize);
void MSV_PollSlaves(void); void MSV_PollSlaves(void);
void MSV_Status(void); void MSV_Status(void);
#else #else
#define SSV_UpdateAddresses() false #define SSV_UpdateAddresses() ((void)0)
#define MSV_ClusterLogin(guid,info,infosize) false #define MSV_ClusterLogin(guid,info,infosize) false
#define SSV_IsSubServer() false #define SSV_IsSubServer() false
#endif #endif

View File

@ -48,17 +48,17 @@ static const struct banflags_s
const char *names[2]; const char *names[2];
} banflags[] = } banflags[] =
{ {
{BAN_BAN, "ban"}, {BAN_BAN, {"ban"}},
{BAN_PERMIT, "safe", "permit"}, {BAN_PERMIT, {"safe", "permit"}},
{BAN_CUFF, "cuff"}, {BAN_CUFF, {"cuff"}},
{BAN_MUTE, "mute"}, {BAN_MUTE, {"mute"}},
{BAN_CRIPPLED, "cripple"}, {BAN_CRIPPLED, {"cripple"}},
{BAN_DEAF, "deaf"}, {BAN_DEAF, {"deaf"}},
{BAN_LAGGED, "lag", "lagged"}, {BAN_LAGGED, {"lag", "lagged"}},
{BAN_VIP, "vip"}, {BAN_VIP, {"vip"}},
{BAN_BLIND, "blind"}, {BAN_BLIND, {"blind"}},
{BAN_SPECONLY, "spec"}, {BAN_SPECONLY, {"spec"}},
{BAN_STEALTH, "stealth"} {BAN_STEALTH, {"stealth"}}
}; };
//generic helper function for naming players. //generic helper function for naming players.
@ -434,7 +434,6 @@ void SV_Map_f (void)
qboolean waschangelevel = false; qboolean waschangelevel = false;
int i; int i;
char *startspot; char *startspot;
float oldtime;
nextserver = 0; nextserver = 0;
@ -651,7 +650,6 @@ void SV_Map_f (void)
MP_Toggle(0); MP_Toggle(0);
#endif #endif
oldtime = sv.time;
if (preserveplayers && svprogfuncs) if (preserveplayers && svprogfuncs)
{ {
for (i=0 ; i<svs.allocated_client_slots ; i++) //we need to drop all q2 clients. We don't mix q1w with q2. for (i=0 ; i<svs.allocated_client_slots ; i++) //we need to drop all q2 clients. We don't mix q1w with q2.
@ -1264,7 +1262,7 @@ static void SV_BanList_f (void)
{ {
*middlebit = 0; *middlebit = 0;
if (nb->expiretime) if (nb->expiretime)
Q_strncatz(middlebit, va(",\t+%"PRIu64, (unsigned long long)nb->expiretime - bantime), sizeof(middlebit)); Q_strncatz(middlebit, va(",\t+%"PRIu64, (quint64_t)(nb->expiretime - bantime)), sizeof(middlebit));
if (nb->reason[0]) if (nb->reason[0])
Q_strncatz(middlebit, ",\t", sizeof(middlebit)); Q_strncatz(middlebit, ",\t", sizeof(middlebit));
Con_Printf("%s%s%s\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), middlebit, nb->reason); Con_Printf("%s%s%s\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), middlebit, nb->reason);
@ -1302,7 +1300,7 @@ static void SV_FilterList_f (void)
if (nb->expiretime) if (nb->expiretime)
{ {
time_t secs = nb->expiretime - curtime; time_t secs = nb->expiretime - curtime;
Con_Printf("%s %s +%"PRIu64":%02u\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), banflagtext, (unsigned long long)(secs/60), (unsigned int)(secs%60)); Con_Printf("%s %s +%"PRIu64":%02u\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), banflagtext, (quint64_t)(secs/60), (unsigned int)(secs%60));
} }
else else
Con_Printf("%s %s\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), banflagtext); Con_Printf("%s %s\n", NET_AdrToStringMasked(adr, sizeof(adr), &nb->adr, &nb->adrmask), banflagtext);
@ -1487,9 +1485,9 @@ static void SV_WriteIP_f (void)
} }
} }
if (bi->reason[0]) if (bi->reason[0])
s = va("addip %s %s %"PRIu64" \"%s\"\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext, (unsigned long long) bi->expiretime, bi->reason); s = va("addip %s %s %"PRIu64" \"%s\"\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext, (quint64_t) bi->expiretime, bi->reason);
else if (bi->expiretime) else if (bi->expiretime)
s = va("addip %s %s %"PRIu64"\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext, (unsigned long long) bi->expiretime); s = va("addip %s %s %"PRIu64"\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext, (quint64_t) bi->expiretime);
else else
s = va("addip %s %s\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext); s = va("addip %s %s\n", NET_AdrToStringMasked(adr, sizeof(adr), &bi->adr, &bi->adrmask), banflagtext);
VFS_WRITE(f, s, strlen(s)); VFS_WRITE(f, s, strlen(s));

View File

@ -1747,16 +1747,23 @@ void SVDP_EmitEntityDelta(entity_state_t *from, entity_state_t *to, sizebuf_t *m
void SVDP_EmitEntitiesUpdate (client_t *client, packet_entities_t *to, sizebuf_t *msg) void SVDP_EmitEntitiesUpdate (client_t *client, packet_entities_t *to, sizebuf_t *msg)
{ {
client_frame_t *fromframe;
packet_entities_t *from; packet_entities_t *from;
int oldindex, newindex; int oldindex, newindex;
int oldnum, newnum; int oldnum, newnum;
int oldmax; int oldmax;
// this is the frame that we are going to delta update from // this is the frame that we are going to delta update from
fromframe = &client->frameunion.frames[client->netchan.incoming_sequence-1 & UPDATE_MASK]; if (!client->netchan.incoming_sequence)
from = &fromframe->entities; {
oldmax = from->num_entities; oldmax = 0;
from = NULL;
}
else
{
client_frame_t *fromframe = &client->frameunion.frames[(client->netchan.incoming_sequence-1) & UPDATE_MASK];
from = &fromframe->entities;
oldmax = from->num_entities;
}
// Con_Printf ("frame %i\n", client->netchan.incoming_sequence); // Con_Printf ("frame %i\n", client->netchan.incoming_sequence);

View File

@ -760,8 +760,9 @@ void SV_WipeServerState(void)
if (sv.stringsalloced) if (sv.stringsalloced)
{ {
unsigned int i; unsigned int i;
char **ptrs = (char**)&sv.strings;
for (i = 0; i < sizeof(sv.strings) / sizeof(sv.strings.ptrs[0]); i++) for (i = 0; i < sizeof(sv.strings) / sizeof(sv.strings.ptrs[0]); i++)
Z_Free((char*)sv.strings.ptrs[i]); Z_Free(ptrs[i]);
} }
memset (&sv, 0, sizeof(sv)); memset (&sv, 0, sizeof(sv));
sv.logindatabase = -1; sv.logindatabase = -1;

View File

@ -2389,18 +2389,18 @@ client_t *SVC_DirectConnect(void)
protocol = (protocol==SCP_PROQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE; protocol = (protocol==SCP_PROQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE;
else switch(sv_protocol_nq.ival) else switch(sv_protocol_nq.ival)
{ {
case RMQ_PROTOCOL_VERSION: case PROTOCOL_VERSION_RMQ:
case FITZ_PROTOCOL_VERSION: case PROTOCOL_VERSION_FITZ:
protocol = SCP_FITZ666; protocol = SCP_FITZ666;
break; break;
case 15: case 15:
//don't trip up on proquake's angle change. //don't trip up on proquake's angle change.
protocol = (protocol==SCP_PROQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE; protocol = (protocol==SCP_PROQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE;
break; break;
case DP6_PROTOCOL_VERSION: case PROTOCOL_VERSION_DP6:
protocol = SCP_DARKPLACES6; protocol = SCP_DARKPLACES6;
break; break;
case DP7_PROTOCOL_VERSION: case PROTOCOL_VERSION_DP7:
protocol = SCP_DARKPLACES7; protocol = SCP_DARKPLACES7;
break; break;
default: default:
@ -3812,12 +3812,13 @@ void SV_OpenRoute_f(void)
netadr_t to; netadr_t to;
char data[64]; char data[64];
NET_StringToAdr(Cmd_Argv(1), PORT_QWCLIENT, &to); if (NET_StringToAdr(Cmd_Argv(1), PORT_QWCLIENT, &to))
{
sprintf(data, "\xff\xff\xff\xff%c", S2C_CONNECTION);
sprintf(data, "\xff\xff\xff\xff%c", S2C_CONNECTION); Netchan_OutOfBandPrint(NS_SERVER, &to, "hello");
// NET_SendPacket (strlen(data)+1, data, to);
Netchan_OutOfBandPrint(NS_SERVER, &to, "hello"); }
// NET_SendPacket (strlen(data)+1, data, to);
} }
//============================================================================ //============================================================================

View File

@ -1835,7 +1835,7 @@ void SV_UpdateQCStats(edict_t *ent, int *statsi, char const** statss, float *sta
} }
/*this function calculates the current stat values for the given client*/ /*this function calculates the current stat values for the given client*/
void SV_CalcClientStats(client_t *client, int statsi[MAX_CL_STATS], float statsf[MAX_CL_STATS], char const **statss) void SV_CalcClientStats(client_t *client, int statsi[MAX_CL_STATS], float statsf[MAX_CL_STATS], const char **statss)
{ {
edict_t *ent; edict_t *ent;
ent = client->edict; ent = client->edict;
@ -1938,7 +1938,7 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr
{ {
int statsi[MAX_CL_STATS]; int statsi[MAX_CL_STATS];
float statsf[MAX_CL_STATS]; float statsf[MAX_CL_STATS];
char *statss[MAX_CL_STATS]; const char *statss[MAX_CL_STATS];
int i, m; int i, m;
/*figure out what the stat values should be*/ /*figure out what the stat values should be*/
@ -1963,8 +1963,7 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr
//diff string stats. //diff string stats.
for (i=0 ; i<m ; i++) for (i=0 ; i<m ; i++)
{ {
char *blank=""; const char *o=client->statss[i], *n=statss[i];
char *o=client->statss[i], *n=statss[i];
if (o != n) if (o != n)
{ {
if (!o) if (!o)
@ -1974,8 +1973,8 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr
if (strcmp(o, n)) if (strcmp(o, n))
client->pendingstats[(i+MAX_CL_STATS)>>5u] |= 1u<<((i+MAX_CL_STATS)&0x1f); client->pendingstats[(i+MAX_CL_STATS)>>5u] |= 1u<<((i+MAX_CL_STATS)&0x1f);
//FIXME: we could always just run the QCGC on the player's string stats too. wouldn't need string compares that way //FIXME: we could always just run the QCGC on the player's string stats too. wouldn't need string compares that way
if (client->statss) if (client->statss[i])
Z_Free(client->statss[i]); Z_Free((void*)client->statss[i]);
client->statss[i] = (statss[i]&&*statss[i])?Z_StrDup(statss[i]):NULL; client->statss[i] = (statss[i]&&*statss[i])?Z_StrDup(statss[i]):NULL;
} }
} }
@ -2041,7 +2040,7 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr
{ {
if (client->pendingstats[(i+MAX_CL_STATS)>>5u] & (1u<<((i+MAX_CL_STATS)&0x1f))) if (client->pendingstats[(i+MAX_CL_STATS)>>5u] & (1u<<((i+MAX_CL_STATS)&0x1f)))
{ {
char *s = client->statss[i]; const char *s = client->statss[i];
if (!s) if (!s)
s = ""; s = "";
@ -2105,7 +2104,13 @@ void SV_UpdateClientStats (client_t *client, int pnum, sizebuf_t *msg, client_fr
if (statss[i] || client->statss[i]) if (statss[i] || client->statss[i])
if (strcmp(statss[i]?statss[i]:"", client->statss[i]?client->statss[i]:"")) if (strcmp(statss[i]?statss[i]:"", client->statss[i]?client->statss[i]:""))
{ {
client->statss[i] = statss[i]; if (client->statss[i])
Z_Free((void*)client->statss[i]);
if (statss[i] && *statss[i])
client->statss[i] = Z_StrDup(statss[i]);
else
client->statss[i] = NULL;
if (pnum) if (pnum)
{ {
ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 5+strlen(statss[i])); ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 5+strlen(statss[i]));
@ -2884,7 +2889,7 @@ void SV_SendClientMessages (void)
c->netchan.nqunreliableonly = false; c->netchan.nqunreliableonly = false;
c->send_message = false; c->send_message = false;
//nq sends one packet only for each server physics frame //nq sends one packet only for each server physics frame
if (c->nextservertimeupdate < pt && c->state >= ca_connected) if (c->nextservertimeupdate < pt && c->state >= cs_connected)
{ {
c->send_message = true; c->send_message = true;
c->nextservertimeupdate = pt + 1.0/77; c->nextservertimeupdate = pt + 1.0/77;
@ -2953,7 +2958,7 @@ void SV_SendMVDMessage(void)
sizebuf_t msg; sizebuf_t msg;
int statsi[MAX_CL_STATS]; int statsi[MAX_CL_STATS];
float statsf[MAX_CL_STATS]; float statsf[MAX_CL_STATS];
char *statss[MAX_CL_STATS]; const char *statss[MAX_CL_STATS];
float min_fps; float min_fps;
extern cvar_t sv_demofps; extern cvar_t sv_demofps;
extern cvar_t sv_demoPings; extern cvar_t sv_demoPings;
@ -3032,7 +3037,14 @@ void SV_SendMVDMessage(void)
if (strcmp(statss[j]?statss[j]:"", demo.statss[i][j]?demo.statss[i][j]:"")) if (strcmp(statss[j]?statss[j]:"", demo.statss[i][j]?demo.statss[i][j]:""))
{ {
sizebuf_t *msg = MVDWrite_Begin(dem_stats, i, 3+strlen(statss[j])); sizebuf_t *msg = MVDWrite_Begin(dem_stats, i, 3+strlen(statss[j]));
demo.statss[i][j] = statss[j];
if (demo.statss[i][j])
Z_Free(demo.statss[i][j]);
if (statss[j] && *statss[j])
demo.statss[i][j] = Z_StrDup(statss[j]);
else
demo.statss[i][j] = NULL;
MSG_WriteByte(msg, svcfte_updatestatstring); MSG_WriteByte(msg, svcfte_updatestatstring);
MSG_WriteByte(msg, j); MSG_WriteByte(msg, j);
MSG_WriteString(msg, statss[j]); MSG_WriteString(msg, statss[j]);

View File

@ -689,7 +689,6 @@ int main(int argc, char *argv[])
quakeparms_t parms; quakeparms_t parms;
// fd_set fdset; // fd_set fdset;
// extern int net_socket; // extern int net_socket;
int j;
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
tcgetattr(STDIN_FILENO, &orig); tcgetattr(STDIN_FILENO, &orig);

View File

@ -500,7 +500,7 @@ void SVNQ_New_f (void)
protext1 = host_client->fteprotocolextensions; protext1 = host_client->fteprotocolextensions;
protext2 = host_client->fteprotocolextensions2; protext2 = host_client->fteprotocolextensions2;
protmain = NQ_PROTOCOL_VERSION; protmain = PROTOCOL_VERSION_NQ;
protfl = 0; protfl = 0;
//force floatcoords as required. //force floatcoords as required.
if (sv.nqdatagram.prim.coordsize >= 4) if (sv.nqdatagram.prim.coordsize >= 4)
@ -525,33 +525,33 @@ void SVNQ_New_f (void)
if (protfl) if (protfl)
{ {
protext1 &= ~PEXT_FLOATCOORDS; //never report floatcoords when using rmq protocol, as the base protocol allows us to be more specific anyway. protext1 &= ~PEXT_FLOATCOORDS; //never report floatcoords when using rmq protocol, as the base protocol allows us to be more specific anyway.
protmain = RMQ_PROTOCOL_VERSION; protmain = PROTOCOL_VERSION_RMQ;
protoname = "RMQ"; protoname = "RMQ";
} }
else else
{ {
protmain = FITZ_PROTOCOL_VERSION; protmain = PROTOCOL_VERSION_FITZ;
protoname = "666"; protoname = "666";
} }
} }
else else
{ {
host_client->protocol = (host_client->protocol!=SCP_NETQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE; //identical other than the client->server angles host_client->protocol = (host_client->protocol!=SCP_NETQUAKE)?SCP_PROQUAKE:SCP_NETQUAKE; //identical other than the client->server angles
protmain = NQ_PROTOCOL_VERSION; protmain = PROTOCOL_VERSION_NQ;
protoname = "NQ"; protoname = "NQ";
} }
maxplayers = 16; maxplayers = 16;
break; break;
case SCP_DARKPLACES6: case SCP_DARKPLACES6:
SV_LogPlayer(host_client, "new (DP6)"); SV_LogPlayer(host_client, "new (DP6)");
protmain = DP6_PROTOCOL_VERSION; protmain = PROTOCOL_VERSION_DP6;
protext1 &= ~PEXT_FLOATCOORDS; //always enabled, try not to break things protext1 &= ~PEXT_FLOATCOORDS; //always enabled, try not to break things
maxplayers = 255; maxplayers = 255;
protoname = "DPP6"; protoname = "DPP6";
break; break;
case SCP_DARKPLACES7: case SCP_DARKPLACES7:
SV_LogPlayer(host_client, "new (DP7)"); SV_LogPlayer(host_client, "new (DP7)");
protmain = DP7_PROTOCOL_VERSION; protmain = PROTOCOL_VERSION_DP7;
protext1 &= ~PEXT_FLOATCOORDS; //always enabled, try not to break things protext1 &= ~PEXT_FLOATCOORDS; //always enabled, try not to break things
maxplayers = 255; maxplayers = 255;
protoname = "DPP7"; protoname = "DPP7";
@ -580,11 +580,18 @@ void SVNQ_New_f (void)
} }
COM_FileBase(sv.modelname, mapname, sizeof(mapname)); COM_FileBase(sv.modelname, mapname, sizeof(mapname));
Q_snprintfz (message, sizeof(message), "%c\n%s - "DISTRIBUTION" (%s%s%s%s %s) - %s", 2, gamedir, // if (host_client->netchan.remote_address.type != NA_LOOPBACK) //don't display this to localhost, because its just spam at the end of the day. you don't want to see it in single player.
protoname,(protext1||(protext2&~(PEXT2_REPLACEMENTDELTAS|PEXT2_VOICECHAT)))?"+":"",(protext2&PEXT2_REPLACEMENTDELTAS)?"F":"",(protext2&PEXT2_VOICECHAT)?"V":"", {
build, mapname); //note that certain clients glitch out if this does not have a trailing new line.
MSG_WriteByte (&host_client->netchan.message, svc_print); //note that those clients will also glitch out from vanilla servers too.
MSG_WriteString (&host_client->netchan.message,message); //vanilla prints something like: VERSION 1.08 SERVER (%i CRC)
//which isn't all that useful. so lets customise it to advertise properly, as well as provide gamedir and map (file)name info
Q_snprintfz (message, sizeof(message), "%c\n%s - "DISTRIBUTION" (%s%s%s%s %s) - %s", 2, gamedir,
protoname,(protext1||(protext2&~(PEXT2_REPLACEMENTDELTAS|PEXT2_VOICECHAT)))?"+":"",(protext2&PEXT2_REPLACEMENTDELTAS)?"F":"",(protext2&PEXT2_VOICECHAT)?"V":"",
build, mapname);
MSG_WriteByte (&host_client->netchan.message, svc_print);
MSG_WriteString (&host_client->netchan.message,message);
}
if (host_client->protocol == SCP_DARKPLACES6 || host_client->protocol == SCP_DARKPLACES7) if (host_client->protocol == SCP_DARKPLACES6 || host_client->protocol == SCP_DARKPLACES7)
{ {
@ -625,7 +632,7 @@ void SVNQ_New_f (void)
MSG_WriteLong (&host_client->netchan.message, protext2); MSG_WriteLong (&host_client->netchan.message, protext2);
} }
MSG_WriteLong (&host_client->netchan.message, protmain); MSG_WriteLong (&host_client->netchan.message, protmain);
if (protmain == RMQ_PROTOCOL_VERSION) if (protmain == PROTOCOL_VERSION_RMQ)
MSG_WriteLong (&host_client->netchan.message, protfl); MSG_WriteLong (&host_client->netchan.message, protfl);
MSG_WriteByte (&host_client->netchan.message, (sv.allocated_client_slots>maxplayers)?maxplayers:sv.allocated_client_slots); MSG_WriteByte (&host_client->netchan.message, (sv.allocated_client_slots>maxplayers)?maxplayers:sv.allocated_client_slots);
@ -3669,18 +3676,15 @@ void SV_Pause_f (void)
static void SV_UpdateSeats(client_t *controller) static void SV_UpdateSeats(client_t *controller)
{ {
client_t *cl, *prev; client_t *cl;
int curclients; int curclients;
for (curclients = 0, cl = controller; cl; cl = cl->controlled)
{
prev = cl;
curclients++;
}
if (controller->protocol == SCP_QUAKE2) if (controller->protocol == SCP_QUAKE2)
return; //wait for the clientinfo stuff instead. return; //wait for the clientinfo stuff instead.
for (curclients = 0, cl = controller; cl; cl = cl->controlled)
curclients++;
ClientReliableWrite_Begin(controller, svc_signonnum, 2+curclients); ClientReliableWrite_Begin(controller, svc_signonnum, 2+curclients);
ClientReliableWrite_Byte(controller, curclients); ClientReliableWrite_Byte(controller, curclients);
for (curclients = 0, cl = controller; cl; cl = cl->controlled, curclients++) for (curclients = 0, cl = controller; cl; cl = cl->controlled, curclients++)
@ -5234,13 +5238,15 @@ void SVNQ_Begin_f (void)
// call the spawn function // call the spawn function
pr_global_struct->time = sv.world.physicstime; pr_global_struct->time = sv.world.physicstime;
pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, sv_player); pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, sv_player);
PR_ExecuteProgram (svprogfuncs, pr_global_struct->ClientConnect); if (pr_global_ptrs->ClientConnect)
PR_ExecuteProgram (svprogfuncs, pr_global_struct->ClientConnect);
sv.skipbprintclient = NULL; sv.skipbprintclient = NULL;
// actually spawn the player // actually spawn the player
pr_global_struct->time = sv.world.physicstime; pr_global_struct->time = sv.world.physicstime;
pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, sv_player); pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, sv_player);
PR_ExecuteProgram (svprogfuncs, pr_global_struct->PutClientInServer); if (pr_global_ptrs->PutClientInServer)
PR_ExecuteProgram (svprogfuncs, pr_global_struct->PutClientInServer);
} }
} }
} }
@ -5311,7 +5317,28 @@ void SVNQ_PreSpawn_f (void)
host_client->prespawn_idx = 0; host_client->prespawn_idx = 0;
if (sv_mapcheck.value) if (sv_mapcheck.value)
Con_Printf("Warning: %s cannot be enforced on NQ clients.\n", sv_mapcheck.name); //as you can fake it in a client anyway, this is hardly a significant issue. {
const char *prot = "";
switch(host_client->protocol)
{
case SCP_NETQUAKE:
prot = " (nq)";
break;
case SCP_PROQUAKE:
prot = " (pq)";
break;
case SCP_FITZ666:
prot = " (fitz)";
break;
case SCP_DARKPLACES6:
prot = " (dpp6)";
break;
case SCP_DARKPLACES7:
prot = " (dpp7)";
break;
}
Con_Printf("Warning: %s cannot be enforced on player %s%s.\n", sv_mapcheck.name, host_client->name, prot); //as you can fake it in a client anyway, this is hardly a significant issue.
}
} }
host_client->send_message = true; host_client->send_message = true;
@ -6222,7 +6249,6 @@ SV_RunCmd
*/ */
void SV_RunCmd (usercmd_t *ucmd, qboolean recurse) void SV_RunCmd (usercmd_t *ucmd, qboolean recurse)
{ {
extern int isPlugin;
edict_t *ent; edict_t *ent;
int i, n; int i, n;
int oldmsec; int oldmsec;
@ -6254,10 +6280,11 @@ void SV_RunCmd (usercmd_t *ucmd, qboolean recurse)
if ((tmp_time = realtime - host_client->last_check) >= sv_cheatspeedchecktime.value) if ((tmp_time = realtime - host_client->last_check) >= sv_cheatspeedchecktime.value)
{ {
extern int isPlugin;
double tmp_time; double tmp_time;
tmp_time = tmp_time * 1000.0 * sv_cheatpc.value/100.0; tmp_time = tmp_time * 1000.0 * sv_cheatpc.value/100.0;
if (host_client->msecs > tmp_time && if (host_client->msecs > tmp_time &&
isPlugin < 2) //debugging can result in WEIRD timings, so don't warn about weird timings if we're likely to get blocked out for long periods isPlugin < 2) //qc-debugging can result in WEIRD timings, so don't warn about weird timings if we're likely to get blocked out for long periods
{ {
host_client->msec_cheating++; host_client->msec_cheating++;
SV_BroadcastTPrintf(PRINT_HIGH, SV_BroadcastTPrintf(PRINT_HIGH,

View File

@ -306,7 +306,7 @@ void INS_Accumulate(void)
void INS_Commands (void) void INS_Commands (void)
{ {
} }
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, char *type, char *devicename, int *qdevid)) void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, int *qdevid))
{ {
} }

View File

@ -1601,8 +1601,8 @@ void SendNQClientData(sv_t *tv, viewer_t *v, netmsg_t *msg)
WriteByte (msg, 0); WriteByte (msg, 0);
} }
// [always sent] if (bits & SU_ITEMS) if (bits & SU_ITEMS)
WriteLong (msg, pl->stats[STAT_ITEMS]); WriteLong (msg, pl->stats[STAT_ITEMS]);
if (bits & SU_WEAPONFRAME) if (bits & SU_WEAPONFRAME)
WriteByte (msg, pl->current.weaponframe); WriteByte (msg, pl->current.weaponframe);

View File

@ -6,6 +6,8 @@ Will show actual value when focused, and will show readable value when not.
The possible values is a separate popup. The possible values is a separate popup.
*/ */
//FIXME: should probably set up a grabs to intercept right-click / escape outside of the item
class mitem_combo; class mitem_combo;
class mitem_combo_popup; class mitem_combo_popup;
@ -20,11 +22,7 @@ class mitem_combo : mitem
float firstrow; float firstrow;
float visrows; float visrows;
virtual void() item_remove = virtual void() item_remove;
{
strunzone(mstrlist);
super::item_remove();
};
}; };
class mitem_combo_popup : mitem class mitem_combo_popup : mitem
@ -34,6 +32,22 @@ class mitem_combo_popup : mitem
virtual void(mitem newfocus, float changedflag) item_focuschange; virtual void(mitem newfocus, float changedflag) item_focuschange;
mitem_combo pfriend; mitem_combo pfriend;
virtual void() item_remove =
{
if (pfriend)
pfriend.cfriend = 0;
super::item_remove();
};
};
void() mitem_combo::item_remove =
{
mitem_combo_popup p = cfriend;
if (p)
p.item_remove();
strunzone(mstrlist);
super::item_remove();
}; };
void(vector pos) mitem_combo::item_draw = void(vector pos) mitem_combo::item_draw =
@ -63,11 +77,13 @@ void(vector pos) mitem_combo::item_draw =
pos_x += item_size_x / 2; pos_x += item_size_x / 2;
/* //border
ui.drawfill(pos, [item_size_x/2, 1], TD_BOT, item_alpha, 0); ui.drawfill(pos, [item_size_x/2, 1], TD_BOT, item_alpha, 0);
ui.drawfill(pos, [1, item_size_y - 1], TD_RGT, item_alpha, 0); ui.drawfill(pos, [1, item_size_y - 1], TD_RGT, item_alpha, 0);
ui.drawfill(pos + [item_size_x/2-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0); ui.drawfill(pos + [item_size_x/2-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0);
ui.drawfill(pos + [0, item_size_y-1], [item_size_x/2, 1], TD_TOP, item_alpha, 0); ui.drawfill(pos + [0, item_size_y-1], [item_size_x/2, 1], TD_TOP, item_alpha, 0);
*/
//silly strings need to get cut off properly. //silly strings need to get cut off properly.
ui.setcliparea(pos[0], pos[1], item_size_x/2, item_size_y); ui.setcliparea(pos[0], pos[1], item_size_x/2, item_size_y);
pos_y += (item_size_y - item_scale)*0.5; pos_y += (item_size_y - item_scale)*0.5;
@ -109,11 +125,12 @@ void(vector pos) mitem_combo_popup::item_draw =
ui.drawfill(pos, item_size, item_rgb, item_alpha, 0); ui.drawfill(pos, item_size, item_rgb, item_alpha, 0);
/* //border
ui.drawfill(pos, [item_size_x, 1], TD_BOT, item_alpha, 0); ui.drawfill(pos, [item_size_x, 1], TD_BOT, item_alpha, 0);
ui.drawfill(pos, [1, item_size_y - 1], TD_RGT, item_alpha, 0); ui.drawfill(pos, [1, item_size_y - 1], TD_RGT, item_alpha, 0);
ui.drawfill(pos + [item_size_x-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0); ui.drawfill(pos + [item_size_x-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0);
ui.drawfill(pos + [0, item_size_y-1], [item_size_x, 1], TD_TOP, item_alpha, 0); ui.drawfill(pos + [0, item_size_y-1], [item_size_x, 1], TD_TOP, item_alpha, 0);
pos_x += 1; */ pos_x += 1;
v = tokenize(f.mstrlist); v = tokenize(f.mstrlist);
for (c = 0; c < v; c += 2) for (c = 0; c < v; c += 2)
@ -179,8 +196,15 @@ float(vector pos, float scan, float char, float down) mitem_combo::item_keypress
} }
} }
if (scan == K_ESCAPE) if (scan == K_ESCAPE || scan == K_MOUSE2)
{
if (cfriend)
{
cfriend.item_remove();
return TRUE;
}
return FALSE; return FALSE;
}
else if (scan == K_MWHEELUP || (scan == K_UPARROW && cfriend)) else if (scan == K_MWHEELUP || (scan == K_UPARROW && cfriend))
{ {
i -= 2; i -= 2;

View File

@ -24,11 +24,11 @@ void(vector pos) mitem_edit::item_draw =
super::item_draw(pos); super::item_draw(pos);
pos_x += item_size_x / 2; pos_x += item_size_x / 2;
ui.drawfill(pos, [item_size_x/2, 1], TD_BOT, item_alpha, 0); /* ui.drawfill(pos, [item_size_x/2, 1], TD_BOT, item_alpha, 0);
ui.drawfill(pos, [1, self.item_size_y - 1], TD_RGT, item_alpha, 0); ui.drawfill(pos, [1, self.item_size_y - 1], TD_RGT, item_alpha, 0);
ui.drawfill(pos + [item_size_x/2-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0); ui.drawfill(pos + [item_size_x/2-1, 1], [1, item_size_y - 1], TD_LFT, item_alpha, 0);
ui.drawfill(pos + [0, item_size_y-1], [item_size_x/2, 1], TD_TOP, item_alpha, 0); ui.drawfill(pos + [0, item_size_y-1], [item_size_x/2, 1], TD_TOP, item_alpha, 0);
pos_y += (item_size_y - item_scale)*0.5; */ pos_y += (item_size_y - item_scale)*0.5;
pos_x += 1; pos_x += 1;
spos = min(spos, strlen(curval)); spos = min(spos, strlen(curval));

View File

@ -51,8 +51,13 @@ var float dp_workarounds;
#define TD_RGT '0.2 0.2 0.2' #define TD_RGT '0.2 0.2 0.2'
#define TD_BOT '0.0 0.0 0.0' #define TD_BOT '0.0 0.0 0.0'
#define MENUBACK_RGB '0.5 0.5 0.6' #ifndef MENUBACK_RGB
#define MENUBACK_RGB '0.4 0.365 0.29'
//#define MENUBACK_RGB '0.5 0.5 0.6'
#endif
#ifndef MENUBACK_ALPHA
#define MENUBACK_ALPHA 0.8 #define MENUBACK_ALPHA 0.8
#endif
//#ifdef TARGET_FTE //#ifdef TARGET_FTE
//#pragma TARGET FTE //#pragma TARGET FTE