From c46f6a3a5329e2a9be969ac5b8fa83c0e67b43e4 Mon Sep 17 00:00:00 2001 From: Spoike Date: Thu, 30 Mar 2017 18:37:16 +0000 Subject: [PATCH] fix a couple of serious issues molgrum reported. fix dedicated server to integrate inside fteqcc. fix bug with jump being released. fix fteqcc always using 32bit output. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5086 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/cl_pred.c | 2 ++ engine/client/in_win.c | 6 ++--- engine/common/pr_bgcmd.c | 21 ++++++++++++--- engine/common/zone.c | 8 ++++++ engine/common/zone.h | 2 ++ engine/qclib/qcc_pr_comp.c | 2 +- engine/qclib/qccmain.c | 31 +++++++++++++++++----- engine/server/pr_cmds.c | 26 ++++++++----------- engine/server/sv_ccmds.c | 8 +----- engine/server/sv_send.c | 52 +++++++++++++++++++++++-------------- engine/server/sv_sys_win.c | 53 ++++++++++++++++++++++++++++++++++++-- engine/server/sv_user.c | 20 +++----------- 12 files changed, 158 insertions(+), 73 deletions(-) diff --git a/engine/client/cl_pred.c b/engine/client/cl_pred.c index 8b37dd7c1..d6ce621aa 100644 --- a/engine/client/cl_pred.c +++ b/engine/client/cl_pred.c @@ -723,9 +723,11 @@ static void CL_EntStateToPlayerState(player_state_t *plstate, entity_state_t *st vec3_t a; int pmtype; qboolean onground = plstate->onground; + qboolean jumpheld = plstate->jump_held; vec3_t vel; VectorCopy(plstate->velocity, vel); memset(plstate, 0, sizeof(*plstate)); + plstate->jump_held = jumpheld; switch(state->u.q1.pmovetype) { diff --git a/engine/client/in_win.c b/engine/client/in_win.c index e28c292f7..2c074c42d 100644 --- a/engine/client/in_win.c +++ b/engine/client/in_win.c @@ -1838,7 +1838,7 @@ void INS_Commands (void) K_AUX9, //left trigger K_AUX10 //right trigger }; - static const int dinputjbuttons[32] = + static const int mmjbuttons[32] = { K_JOY1, K_JOY2, @@ -1908,10 +1908,10 @@ void INS_Commands (void) for (i=0 ; i < joy->numbuttons ; i++) { if ( (buttonstate & (1<oldbuttonstate & (1<devid, dinputjbuttons[i], 0, true); + Key_Event (joy->devid, mmjbuttons[i], 0, true); if ( !(buttonstate & (1<oldbuttonstate & (1<devid, dinputjbuttons[i], 0, false); + Key_Event (joy->devid, mmjbuttons[i], 0, false); } } joy->oldbuttonstate = buttonstate; diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c index a52d1707a..8da497ead 100644 --- a/engine/common/pr_bgcmd.c +++ b/engine/common/pr_bgcmd.c @@ -305,7 +305,6 @@ qboolean QCExternalDebuggerCommand(char *text) int QDECL QCEditor (pubprogfuncs_t *prinst, const char *filename, int *line, int *statement, char *reason, pbool fatal) { -#ifndef SERVERONLY #if defined(_WIN32) && !defined(FTE_SDL) && !defined(_XBOX) if (isPlugin >= 2) { @@ -318,7 +317,11 @@ int QDECL QCEditor (pubprogfuncs_t *prinst, const char *filename, int *line, int return DEBUG_TRACE_ABORT; return DEBUG_TRACE_OFF; } +#ifdef SERVERONLY + SV_GetConsoleCommands(); +#else Sys_SendKeyEvents(); +#endif debuggerresume = -1; debuggerresumeline = *line; if (debuggerwnd) @@ -331,9 +334,21 @@ int QDECL QCEditor (pubprogfuncs_t *prinst, const char *filename, int *line, int else printf("qcstep \"%s\":%i\n", filename, *line); fflush(stdout); - INS_UpdateGrabs(false, false); debuggerinstance = prinst; debuggerfile = filename; +#ifdef SERVERONLY + if (reason) + { + printf("Debugger triggered at \"%s\":%i, %s\n", filename, *line, reason); + PR_StackTrace(prinst, 1); + } + while(debuggerresume == -1 && !wantquit) + { + Sleep(10); + SV_GetConsoleCommands(); + } +#else + INS_UpdateGrabs(false, false); if (reason) Con_Footerf(NULL, false, "^bDebugging: %s", reason); else @@ -359,6 +374,7 @@ int QDECL QCEditor (pubprogfuncs_t *prinst, const char *filename, int *line, int } } Con_Footerf(NULL, false, ""); +#endif *line = debuggerresumeline; debuggerinstance = NULL; debuggerfile = NULL; @@ -367,7 +383,6 @@ int QDECL QCEditor (pubprogfuncs_t *prinst, const char *filename, int *line, int return debuggerresume; } #endif -#endif #ifdef TEXTEDITOR return QCLibEditor(prinst, filename, line, statement, reason, fatal); diff --git a/engine/common/zone.c b/engine/common/zone.c index cefac7f80..6a73a7989 100644 --- a/engine/common/zone.c +++ b/engine/common/zone.c @@ -327,7 +327,11 @@ void VARGS Z_FreeTags(int tag) #define SIZE_MAX ((size_t)-1) #endif +#ifdef USE_MSVCRT_DEBUG +qboolean ZF_ReallocElementsNamed(void **ptr, size_t *elements, size_t newelements, size_t elementsize, const char *file, int line) +#else qboolean ZF_ReallocElements(void **ptr, size_t *elements, size_t newelements, size_t elementsize) +#endif { void *n; size_t oldsize; @@ -340,7 +344,11 @@ qboolean ZF_ReallocElements(void **ptr, size_t *elements, size_t newelements, si oldsize = *elements * elementsize; newsize = newelements * elementsize; +#ifdef USE_MSVCRT_DEBUG + n = BZ_ReallocNamed(*ptr, newsize, file, line); +#else n = BZ_Realloc(*ptr, newsize); +#endif if (!n) return false; if (newsize > oldsize) diff --git a/engine/common/zone.h b/engine/common/zone.h index 1f52c5a6f..78b160d5d 100644 --- a/engine/common/zone.h +++ b/engine/common/zone.h @@ -96,6 +96,7 @@ void *VARGS Z_TagMalloc (int size, int tag); void VARGS Z_TagFree(void *ptr); void VARGS Z_FreeTags(int tag); qboolean ZF_ReallocElements(void **ptr, size_t *elements, size_t newelements, size_t elementsize); //returns false on error +qboolean ZF_ReallocElementsNamed(void **ptr, size_t *elements, size_t newelements, size_t elementsize, char *file, int line); //returns false on error #define Z_ReallocElements(ptr,elements,newelements,elementsize) do{if (!ZF_ReallocElements(ptr,elements,newelements,elementsize))Sys_Error("Z_ReallocElements failed (%s %i)\n", __FILE__, __LINE__);}while(0) //returns false on error //Big Zone: allowed to fail, doesn't clear. The expectation is a large file, rather than sensitive data structures. @@ -128,6 +129,7 @@ void ZG_FreeGroup(zonegroup_t *ctx); #define ZF_Malloc(size) ZF_MallocNamed(size, __FILE__, __LINE__) #define BZF_Realloc(ptr, size) BZF_ReallocNamed(ptr, size, __FILE__, __LINE__) #define ZG_Malloc(ctx, size) ZG_MallocNamed(ctx, size, __FILE__, __LINE__) +#define ZF_ReallocElements(p,e,n,s) ZF_ReallocElementsNamed(p,e,n,s,__FILE__,__LINE__) #endif #define Z_StrDup(s) strcpy(Z_Malloc(strlen(s)+1), s) diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index b110fcd92..ed03f0636 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -7633,7 +7633,7 @@ QCC_ref_t *QCC_PR_RefTerm (QCC_ref_t *retbuf, unsigned int exprflags) QCC_PR_ParseWarning(WARN_ASSIGNMENTTOCONSTANT, "Assignment to constant %s", QCC_GetSRefName(e)); QCC_PR_ParsePrintSRef(WARN_ASSIGNMENTTOCONSTANT, e); } - if (e.sym->temp) + if (e.sym->temp && r->type == REF_GLOBAL) QCC_PR_ParseWarning(WARN_ASSIGNMENTTOCONSTANT, "Hey! That's a temp! ++ operators cannot work on temps!"); switch (r->cast->type) { diff --git a/engine/qclib/qccmain.c b/engine/qclib/qccmain.c index 58e30aebb..a406a69f1 100644 --- a/engine/qclib/qccmain.c +++ b/engine/qclib/qccmain.c @@ -1225,6 +1225,22 @@ const char *QCC_FileForStatement(int st) } return ret; } +const char *QCC_FunctionForStatement(int st) +{ + const char *ret = "???"; + int i; + for (i = 0; i < numfunctions; i++) + { + if (functions[i].code > 0) + { + if (st < functions[i].code) + break; + ret = functions[i].filen; + } + } + return ret; +} + CompilerConstant_t *QCC_PR_CheckCompConstDefined(char *def); @@ -1242,7 +1258,7 @@ pbool QCC_WriteData (int crc) int *statement_linenums; void *funcdata; size_t funcdatasize; - pbool bigjumps; + const char *bigjumps = NULL; extern char *basictypenames[]; @@ -1283,14 +1299,15 @@ pbool QCC_WriteData (int crc) for (i=0 ; i 0x7fff || statements[i].a.ofs < 0x7fff)) + if (!statements[i].a.sym && ((int)statements[i].a.ofs > 0x7fff || (int)statements[i].a.ofs < -0x7fff)) break; - if (!statements[i].a.sym && (statements[i].a.ofs > 0x7fff || statements[i].a.ofs < 0x7fff)) + if (!statements[i].a.sym && ((int)statements[i].a.ofs > 0x7fff || (int)statements[i].a.ofs < -0x7fff)) break; - if (!statements[i].a.sym && (statements[i].a.ofs > 0x7fff || statements[i].a.ofs < 0x7fff)) + if (!statements[i].a.sym && ((int)statements[i].a.ofs > 0x7fff || (int)statements[i].a.ofs < -0x7fff)) break; } - bigjumps = i 65530) @@ -1340,7 +1357,7 @@ pbool QCC_WriteData (int crc) { if (bigjumps) { - printf("Using 32 bit target due to large functions\n"); + printf("Using 32 bit target due to large function %s\n", bigjumps); outputsttype = PST_FTE32; } else if (numpr_globals > 65530) diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index ee36d5c10..b324826d4 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -2937,7 +2937,7 @@ void PF_centerprint_Internal (int entnum, qboolean plaque, const char *s) if (entnum < 1 || entnum > sv.allocated_client_slots) { - Con_TPrintf ("tried to sprint to a non-client\n"); + PR_RunWarning(sv.world.progs, "tried to centerprint to a non-client\n"); return; } @@ -9027,7 +9027,7 @@ int PF_ForceInfoKey_Internal(unsigned int entnum, const char *key, const char *v svs.clients[entnum-1].spectator = ns; } - SV_BroadcastUserinfoChange(host_client, SV_UserInfoIsBasic(key), key, value); + SV_BroadcastUserinfoChange(&svs.clients[entnum-1], SV_UserInfoIsBasic(key), key, value); } return 1; @@ -9066,6 +9066,7 @@ static void QCBUILTIN PF_setcolors (pubprogfuncs_t *prinst, struct globalvars_s client_t *client; int entnum, i; char number[8]; + char *key = NULL; entnum = G_EDICTNUM(prinst, OFS_PARM0); i = G_FLOAT(OFS_PARM1); @@ -9078,31 +9079,26 @@ static void QCBUILTIN PF_setcolors (pubprogfuncs_t *prinst, struct globalvars_s client = &svs.clients[entnum-1]; client->edict->v->team = (i & 15) + 1; -#ifdef NQPROT - MSG_WriteByte (&sv.nqreliable_datagram, svc_updatecolors); - MSG_WriteByte (&sv.nqreliable_datagram, entnum - 1); - MSG_WriteByte (&sv.nqreliable_datagram, i); -#endif + sprintf(number, "%i", i>>4); if (!strcmp(number, Info_ValueForKey(client->userinfo, "topcolor"))) { Info_SetValueForKey(client->userinfo, "topcolor", number, sizeof(client->userinfo)); - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, entnum-1); - MSG_WriteString (&sv.reliable_datagram, "topcolor"); - MSG_WriteString (&sv.reliable_datagram, number); + key = "topcolor"; } sprintf(number, "%i", i&15); if (!strcmp(number, Info_ValueForKey(client->userinfo, "bottomcolor"))) { Info_SetValueForKey(client->userinfo, "bottomcolor", number, sizeof(client->userinfo)); - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, entnum-1); - MSG_WriteString (&sv.reliable_datagram, "bottomcolor"); - MSG_WriteString (&sv.reliable_datagram, number); + key = key?"*bothcolours":"bottomcolor"; } + SV_ExtractFromUserinfo (client, true); + if (key) + { //something changed at least. + SV_BroadcastUserinfoChange(client, true, key, NULL); + } } static void ParamNegateFix ( float * xx, float * yy, int Zone ) diff --git a/engine/server/sv_ccmds.c b/engine/server/sv_ccmds.c index 0ed1b0489..524b771bd 100644 --- a/engine/server/sv_ccmds.c +++ b/engine/server/sv_ccmds.c @@ -1548,7 +1548,6 @@ static void SV_ForceName_f (void) { client_t *cl; int clnum=-1; - int i; while((cl = SV_GetClientForString(Cmd_Argv(1), &clnum))) { @@ -1556,12 +1555,7 @@ static void SV_ForceName_f (void) SV_LogPlayer(cl, "name forced"); SV_ExtractFromUserinfo(cl, true); Q_strncpyz(cl->name, Cmd_Argv(2), sizeof(cl->namebuf)); - i = cl - svs.clients; - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, i); - MSG_WriteString (&sv.reliable_datagram, "name"); - MSG_WriteString (&sv.reliable_datagram, cl->name); - + SV_BroadcastUserinfoChange(cl, true, "name", cl->name); return; } diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c index e7857aa15..cdc5a52fd 100644 --- a/engine/server/sv_send.c +++ b/engine/server/sv_send.c @@ -2807,16 +2807,7 @@ void SV_UpdateToReliableMessages (void) Info_SetValueForKey(host_client->userinfo, "bottomcolor", va("%i", (int)host_client->edict->xv->clientcolors&15), sizeof(host_client->userinfo)); { SV_ExtractFromUserinfo (host_client, true); //this will take care of nq for us anyway. - - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, i); - MSG_WriteString (&sv.reliable_datagram, "topcolor"); - MSG_WriteString (&sv.reliable_datagram, Info_ValueForKey(host_client->userinfo, "topcolor")); - - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, i); - MSG_WriteString (&sv.reliable_datagram, "bottomcolor"); - MSG_WriteString (&sv.reliable_datagram, Info_ValueForKey(host_client->userinfo, "bottomcolor")); + SV_BroadcastUserinfoChange(host_client, true, "*bothcolours", NULL); } } #endif @@ -2837,10 +2828,7 @@ void SV_UpdateToReliableMessages (void) if (strcmp(oname, host_client->name)) { - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, i); - MSG_WriteString (&sv.reliable_datagram, "name"); - MSG_WriteString (&sv.reliable_datagram, host_client->name); + SV_BroadcastUserinfoChange(host_client, true, "name", host_client->name); } #ifdef QCGC @@ -3025,18 +3013,42 @@ void SV_UpdateToReliableMessages (void) //a single userinfo value was changed. +//*bothcolours sends out both topcolor and bottomcolor, with a single svc_updatecolors in nq static void SV_SendUserinfoChange(client_t *to, client_t *about, qboolean isbasic, const char *key, const char *newval) { int playernum = about - svs.clients; + if (playernum > to->max_net_clients) + return; + + if (!newval) + newval = Info_ValueForKey(about->userinfo, key); + if (ISQWCLIENT(to)) { if (isbasic || (to->fteprotocolextensions & PEXT_BIGUSERINFOS)) { - ClientReliableWrite_Begin(to, svc_setinfo, 4+strlen(key)+strlen(newval)); - ClientReliableWrite_Byte(to, playernum); - ClientReliableWrite_String(to, key); - ClientReliableWrite_String(to, newval); + if (ISQWCLIENT(to) && !strcmp(key, "*bothcolours")) + { + newval = Info_ValueForKey(about->userinfo, "topcolor"); + ClientReliableWrite_Begin(to, svc_setinfo, 4+strlen(key)+strlen(newval)); + ClientReliableWrite_Byte(to, playernum); + ClientReliableWrite_String(to, "topcolor"); + ClientReliableWrite_String(to, Info_ValueForKey(about->userinfo, "topcolor")); + + newval = Info_ValueForKey(about->userinfo, "bottomcolor"); + ClientReliableWrite_Begin(to, svc_setinfo, 4+strlen(key)+strlen(newval)); + ClientReliableWrite_Byte(to, playernum); + ClientReliableWrite_String(to, "bottomcolor"); + ClientReliableWrite_String(to, newval); + } + else + { + ClientReliableWrite_Begin(to, svc_setinfo, 4+strlen(key)+strlen(newval)); + ClientReliableWrite_Byte(to, playernum); + ClientReliableWrite_String(to, key); + ClientReliableWrite_String(to, newval); + } } } #ifdef NQPROT @@ -3058,7 +3070,7 @@ static void SV_SendUserinfoChange(client_t *to, client_t *about, qboolean isbasi ClientReliableWrite_Byte(to, playernum); ClientReliableWrite_String(to, newval); } - else if (!strcmp(key, "topcolor") || !strcmp(key, "bottomcolor")) + else if (!strcmp(key, "topcolor") || !strcmp(key, "bottomcolor") || !strcmp(key, "*bothcolours")) { //due to these being combined, nq players get double colour change notifications... int tc = atoi(Info_ValueForKey(about->userinfo, "topcolor")); int bc = atoi(Info_ValueForKey(about->userinfo, "bottomcolor")); @@ -3086,6 +3098,8 @@ void SV_BroadcastUserinfoChange(client_t *about, qboolean isbasic, const char *k { client_t *client; int j; + if (!newval) + newval = Info_ValueForKey(about->userinfo, key); for (j = 0; j < svs.allocated_client_slots; j++) { client = svs.clients+j; diff --git a/engine/server/sv_sys_win.c b/engine/server/sv_sys_win.c index 1a0db5775..451a6c87f 100644 --- a/engine/server/sv_sys_win.c +++ b/engine/server/sv_sys_win.c @@ -905,8 +905,8 @@ char *Sys_ConsoleInput (void) { if (!GetMessage (&msg, NULL, 0, 0)) return NULL; - TranslateMessage (&msg); - DispatchMessage (&msg); + TranslateMessage (&msg); + DispatchMessage (&msg); } return NULL; } @@ -955,6 +955,55 @@ char *Sys_ConsoleInput (void) } #endif + if (isPlugin) + { + DWORD avail; + static char text[256], *nl; + static int textpos = 0; + + HANDLE input = GetStdHandle(STD_INPUT_HANDLE); + if (!PeekNamedPipe(input, NULL, 0, NULL, &avail, NULL)) + { + wantquit = true; + Cmd_ExecuteString("quit force", RESTRICT_LOCAL); + } + else if (avail) + { + if (avail > sizeof(text)-1-textpos) + avail = sizeof(text)-1-textpos; + if (ReadFile(input, text+textpos, avail, &avail, NULL)) + { + textpos += avail; + if (textpos > sizeof(text)-1) + Sys_Error("No."); + } + } + while (textpos) + { + text[textpos] = 0; + nl = strchr(text, '\n'); + if (nl) + { + *nl++ = 0; + if (coninput_len) + { + putch ('\r'); + putch (']'); + } + coninput_len = 0; + Q_strncpyz(coninput_text, text, sizeof(coninput_text)); + memmove(text, nl, textpos - (nl - text)); + textpos -= (nl - text); + return coninput_text; + } + else + break; + } + } + + + + // read a line out while (_kbhit()) { diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c index 3c4007218..bc28ae84d 100644 --- a/engine/server/sv_user.c +++ b/engine/server/sv_user.c @@ -2932,7 +2932,7 @@ static int SV_LocateDownload(const char *name, flocation_t *loc, char **replacem } //mvdsv demo downloading support. demos/ -> demodir (sets up the server paths) - if (Q_strncasecmp(name, "demos/", 6)) + if (!Q_strncasecmp(name, "demos/", 6)) { Q_snprintfz(tmpname, sizeof(tmpname), "%s/%s", sv_demoDir.string, name+6); name = tmpname; @@ -5569,22 +5569,14 @@ static void SVNQ_NQColour_f (void) if (strcmp(val, Info_ValueForKey(host_client->userinfo, "topcolor"))) { Info_SetValueForKey(host_client->userinfo, "topcolor", val, sizeof(host_client->userinfo)); - - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients); - MSG_WriteString (&sv.reliable_datagram, "topcolor"); - MSG_WriteString (&sv.reliable_datagram, Info_ValueForKey(host_client->userinfo, "topcolor")); + SV_BroadcastUserinfoChange(host_client, true, "topcolor", NULL); } val = va("%i", bottom); if (strcmp(val, Info_ValueForKey(host_client->userinfo, "bottomcolor"))) { Info_SetValueForKey(host_client->userinfo, "bottomcolor", val, sizeof(host_client->userinfo)); - - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients); - MSG_WriteString (&sv.reliable_datagram, "bottomcolor"); - MSG_WriteString (&sv.reliable_datagram, Info_ValueForKey(host_client->userinfo, "bottomcolor")); + SV_BroadcastUserinfoChange(host_client, true, "bottomcolor", NULL); } switch(bottom) @@ -5602,11 +5594,7 @@ static void SVNQ_NQColour_f (void) if (strcmp(val, Info_ValueForKey(host_client->userinfo, "team"))) { Info_SetValueForKey(host_client->userinfo, "team", val, sizeof(host_client->userinfo)); - - MSG_WriteByte (&sv.reliable_datagram, svc_setinfo); - MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients); - MSG_WriteString (&sv.reliable_datagram, "team"); - MSG_WriteString (&sv.reliable_datagram, Info_ValueForKey(host_client->userinfo, "team")); + SV_BroadcastUserinfoChange(host_client, true, "team", NULL); } SV_ExtractFromUserinfo (host_client, true);