From b132ccbd81d360fc065fa54fc846fe416c62e66e Mon Sep 17 00:00:00 2001 From: havoc Date: Sat, 7 Jun 2003 19:21:07 +0000 Subject: [PATCH] KRIMZON_SV_PARSECLIENTCOMMAND extension (untested currently!) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3070 d7cf8633-e32d-0410-b094-e92efae38249 --- pr_cmds.c | 104 +++++++++++++++++++++++++++++++++++++++++------------ pr_edict.c | 4 +++ progs.h | 2 ++ sv_user.c | 25 ++++++------- 4 files changed, 101 insertions(+), 34 deletions(-) diff --git a/pr_cmds.c b/pr_cmds.c index fc4ef6ef..04843d7c 100644 --- a/pr_cmds.c +++ b/pr_cmds.c @@ -128,6 +128,7 @@ char *ENGINE_EXTENSIONS = "DP_TE_STANDARDEFFECTBUILTINS " "DP_VIEWZOOM " "FRIK_FILE " +"KRIMZON_SV_PARSECLIENTCOMMAND " "NEH_CMD_PLAY2 " "NEH_RESTOREGAME " "TW_SV_STEPCONTROL " @@ -2855,29 +2856,17 @@ void PF_strcat(void) //string(string s, float start, float length) substring = #116; // returns a section of a string as a tempstring void PF_substring(void) { - int end, start, length, slen; - char *s; - char string[MAX_VARSTRING]; + int i, start, end; + char *s, string[MAX_VARSTRING]; s = G_STRING(OFS_PARM0); start = G_FLOAT(OFS_PARM1); - length = G_FLOAT(OFS_PARM2); - if (s) - slen = strlen(s); - else - slen = 0; - if (start < 0) - start = 0; - if (length > slen - start) - length = slen - start; - if (length > MAX_VARSTRING - 1) - length = MAX_VARSTRING - 1; - end = 0; - if (length > 0) - { - memcpy(string, s + start, length); - end = length; - } - string[end] = 0; + end = G_FLOAT(OFS_PARM2) + start; + if (!s) + s = ""; + for (i = 0;i < start && *s;i++, s++); + for (i = 0;i < MAX_VARSTRING - 1 && *s && i < end;i++, s++) + string[i] = *s; + string[i] = 0; G_INT(OFS_RETURN) = PR_SetString(string); } @@ -2903,6 +2892,67 @@ void PF_strunzone(void) Mem_Free(G_STRING(OFS_PARM0)); } +//void(entity e, string s) clientcommand = #440; // executes a command string as if it came from the specified client +//this function originally written by KrimZon, made shorter by LordHavoc +void PF_clientcommand (void) +{ + client_t *temp_client; + int i; + + //find client for this entity + i = (NUM_FOR_EDICT(G_EDICT(OFS_PARM0)) - 1); + if (i < 0 || i >= svs.maxclients) + Host_Error("PF_clientcommand: entity is not a client"); + + temp_client = host_client; + host_client = &svs.clients[i]; + Cmd_ExecuteString (G_STRING(OFS_PARM1), src_client); + host_client = temp_client; +} + +//float(string s) tokenize = #441; // takes apart a string into individal words (access them with argv), returns how many +//this function originally written by KrimZon, made shorter by LordHavoc +char **tokens = NULL; +int max_tokens, num_tokens = 0; +void PF_tokenize (void) +{ + const char *p; + char *str; + str = G_STRING(OFS_PARM0); + + if (tokens != NULL) + { + int i; + for (i=0;i= 0 && token_num < num_tokens) + G_INT(OFS_RETURN) = PR_SetString(tokens[token_num]); + else + G_INT(OFS_RETURN) = PR_SetString(""); +} + + builtin_t pr_builtin[] = { NULL, // #0 @@ -3069,7 +3119,17 @@ PF_getsurfacenormal, // #436 vector(entity e, float s) getsurfacenormal (DP_QC_ PF_getsurfacetexture, // #437 string(entity e, float s) getsurfacetexture (DP_QC_GETSURFACE) PF_getsurfacenearpoint, // #438 float(entity e, vector p) getsurfacenearpoint (DP_QC_GETSURFACE) PF_getsurfaceclippedpoint, // #439 vector(entity e, float s, vector p) getsurfaceclippedpoint (DP_QC_GETSURFACE) -a a a a a a // #440-499 (LordHavoc) +PF_clientcommand, // #440 void(entity e, string s) clientcommand (KRIMZON_SV_PARSECLIENTCOMMAND) +PF_tokenize, // #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND) +PF_argv, // #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND) +NULL, // #443 +NULL, // #444 +NULL, // #445 +NULL, // #446 +NULL, // #447 +NULL, // #448 +NULL, // #449 +a a a a a // #450-499 (LordHavoc) }; builtin_t *pr_builtins = pr_builtin; diff --git a/pr_edict.c b/pr_edict.c index ec7ffb83..b7d34730 100644 --- a/pr_edict.c +++ b/pr_edict.c @@ -122,6 +122,8 @@ int eval_viewzoom; mfunction_t *SV_PlayerPhysicsQC; mfunction_t *EndFrameQC; +//KrimZon - SERVER COMMANDS IN QUAKEC +mfunction_t *SV_ParseClientCommandQC; int FindFieldOffset(const char *field) { @@ -173,6 +175,8 @@ void FindEdictFieldOffsets(void) SV_PlayerPhysicsQC = ED_FindFunction ("SV_PlayerPhysics"); // LordHavoc: support for endframe EndFrameQC = ED_FindFunction ("EndFrame"); + //KrimZon - SERVER COMMANDS IN QUAKEC + SV_ParseClientCommandQC = ED_FindFunction ("SV_ParseClientCommand"); } /* diff --git a/progs.h b/progs.h index 415a11d6..9fdaffd4 100644 --- a/progs.h +++ b/progs.h @@ -126,6 +126,8 @@ extern int eval_viewzoom; extern mfunction_t *SV_PlayerPhysicsQC; extern mfunction_t *EndFrameQC; +//KrimZon - SERVER COMMANDS IN QUAKEC +extern mfunction_t *SV_ParseClientCommandQC; //============================================================================ diff --git a/sv_user.c b/sv_user.c index 91f4ff34..1e4b6558 100644 --- a/sv_user.c +++ b/sv_user.c @@ -528,7 +528,7 @@ qboolean SV_ReadClientMessage (void) int cmd; char *s; - do + for (;;) { nextmsg: ret = NET_GetMessage (host_client->netconnection); @@ -542,7 +542,7 @@ nextmsg: MSG_BeginReading (); - while (1) + for(;;) { if (!host_client->active) // a command caused an error @@ -571,8 +571,17 @@ nextmsg: case clc_stringcmd: s = MSG_ReadString (); - ret = 0; - if (strncasecmp(s, "status", 6) == 0 + if (strncasecmp(s, "spawn", 5) == 0 + || strncasecmp(s, "begin", 5) == 0 + || strncasecmp(s, "prespawn", 8) == 0) + Cmd_ExecuteString (s, src_client); + else if (SV_ParseClientCommandQC) + { + G_INT(OFS_PARM0) = PR_SetString(s); + pr_global_struct->self = EDICT_TO_PROG(host_client->edict); + PR_ExecuteProgram ((func_t)(SV_ParseClientCommandQC - pr_functions), ""); + } + else if (strncasecmp(s, "status", 6) == 0 || strncasecmp(s, "name", 4) == 0 || strncasecmp(s, "say", 3) == 0 || strncasecmp(s, "say_team", 8) == 0 @@ -580,19 +589,13 @@ nextmsg: || strncasecmp(s, "color", 5) == 0 || strncasecmp(s, "kill", 4) == 0 || strncasecmp(s, "pause", 5) == 0 - || strncasecmp(s, "spawn", 5) == 0 - || strncasecmp(s, "begin", 5) == 0 - || strncasecmp(s, "prespawn", 8) == 0 || strncasecmp(s, "kick", 4) == 0 || strncasecmp(s, "ping", 4) == 0 || strncasecmp(s, "ban", 3) == 0 || strncasecmp(s, "pmodel", 6) == 0 || (gamemode == GAME_NEHAHRA && (strncasecmp(s, "max", 3) == 0 || strncasecmp(s, "monster", 7) == 0 || strncasecmp(s, "scrag", 5) == 0 || strncasecmp(s, "gimme", 5) == 0 || strncasecmp(s, "wraith", 6) == 0)) || (gamemode != GAME_NEHAHRA && (strncasecmp(s, "god", 3) == 0 || strncasecmp(s, "notarget", 8) == 0 || strncasecmp(s, "fly", 3) == 0 || strncasecmp(s, "give", 4) == 0 || strncasecmp(s, "noclip", 6) == 0))) - { - ret = 1; Cmd_ExecuteString (s, src_client); - } else Con_Printf("%s tried to %s\n", host_client->name, s); break; @@ -610,8 +613,6 @@ nextmsg: } } } - while (ret == 1); - return true; } -- 2.39.2