X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=pr_cmds.c;h=55ea9032ea4ace45f6dc10d73dd5245ff105c7fb;hb=e13a8c596f2c51ca815773f89fee4f4f4f723f74;hp=7eaa915f45e5b71d07b1c1ff3c38196074c417e1;hpb=e11263d3ea167699c332c40802df925881d8a58d;p=xonotic%2Fdarkplaces.git diff --git a/pr_cmds.c b/pr_cmds.c index 7eaa915f..55ea9032 100644 --- a/pr_cmds.c +++ b/pr_cmds.c @@ -76,6 +76,7 @@ char *ENGINE_EXTENSIONS = "DP_EF_FLAME " "DP_EF_FULLBRIGHT " "DP_EF_NODRAW " +"DP_EF_NOSHADOW " "DP_EF_RED " "DP_EF_STARDUST " "DP_ENT_ALPHA " @@ -108,6 +109,7 @@ char *ENGINE_EXTENSIONS = "DP_QC_GETLIGHT " "DP_QC_GETSURFACE " "DP_QC_MINMAXBOUND " +"DP_QC_MULTIPLETEMPSTRINGS " "DP_QC_RANDOMVEC " "DP_QC_SINCOSSQRTPOW " "DP_QC_TRACEBOX " @@ -118,6 +120,9 @@ char *ENGINE_EXTENSIONS = "DP_QUAKE2_MODEL " "DP_QUAKE3_MODEL " "DP_REGISTERCVAR " +"DP_SND_DIRECTIONLESSATTNNONE " +"DP_SND_OGGVORBIS " +"DP_SND_STEREOWAV " "DP_SOLIDCORPSE " "DP_SPRITE32 " "DP_SV_DRAWONLYTOCLIENT " @@ -125,6 +130,7 @@ char *ENGINE_EXTENSIONS = "DP_SV_EXTERIORMODELTOCLIENT " "DP_SV_NODRAWTOCLIENT " "DP_SV_PLAYERPHYSICS " +"DP_SV_ROTATINGBMODEL " "DP_SV_SETCOLOR " "DP_SV_SLOWMO " "DP_TE_BLOOD " @@ -145,6 +151,7 @@ char *ENGINE_EXTENSIONS = "KRIMZON_SV_PARSECLIENTCOMMAND " "NEH_CMD_PLAY2 " "NEH_RESTOREGAME " +"TENEBRAE_GFX_DLIGHTS " "TW_SV_STEPCONTROL " ; @@ -199,9 +206,9 @@ void PF_error (void) char string[STRINGTEMP_LENGTH]; PF_VarString(0, string, sizeof(string)); - Con_Printf ("======SERVER ERROR in %s:\n%s\n", PR_GetString(pr_xfunction->s_name), string); + Con_Printf("======SERVER ERROR in %s:\n%s\n", PR_GetString(pr_xfunction->s_name), string); ed = PROG_TO_EDICT(pr_global_struct->self); - ED_Print (ed); + ED_Print(ed); PF_ERROR("Program error"); } @@ -222,9 +229,9 @@ void PF_objerror (void) char string[STRINGTEMP_LENGTH]; PF_VarString(0, string, sizeof(string)); - Con_Printf ("======OBJECT ERROR in %s:\n%s\n", PR_GetString(pr_xfunction->s_name), string); + Con_Printf("======OBJECT ERROR in %s:\n%s\n", PR_GetString(pr_xfunction->s_name), string); ed = PROG_TO_EDICT(pr_global_struct->self); - ED_Print (ed); + ED_Print(ed); ED_Free (ed); } @@ -377,7 +384,7 @@ void PF_bprint (void) { char string[STRINGTEMP_LENGTH]; PF_VarString(0, string, sizeof(string)); - SV_BroadcastPrintf("%s", string); + SV_BroadcastPrint(string); } /* @@ -399,7 +406,7 @@ void PF_sprint (void) if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf ("tried to sprint to a non-client\n"); + Con_Print("tried to sprint to a non-client\n"); return; } @@ -431,7 +438,7 @@ void PF_centerprint (void) if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf ("tried to sprint to a non-client\n"); + Con_Print("tried to sprint to a non-client\n"); return; } @@ -635,7 +642,7 @@ void PF_ambientsound (void) if (!*check) { - Con_Printf ("no precache: %s\n", samp); + Con_Printf("no precache: %s\n", samp); return; } @@ -731,17 +738,17 @@ void PF_traceline (void) { float *v1, *v2; trace_t trace; - int nomonsters; + int move; edict_t *ent; pr_xfunction->builtinsprofile += 30; v1 = G_VECTOR(OFS_PARM0); v2 = G_VECTOR(OFS_PARM1); - nomonsters = G_FLOAT(OFS_PARM2); + move = G_FLOAT(OFS_PARM2); ent = G_EDICT(OFS_PARM3); - trace = SV_Move (v1, vec3_origin, vec3_origin, v2, nomonsters, ent); + trace = SV_Move (v1, vec3_origin, vec3_origin, v2, move, ent); pr_global_struct->trace_allsolid = trace.allsolid; pr_global_struct->trace_startsolid = trace.startsolid; @@ -775,7 +782,7 @@ void PF_tracebox (void) { float *v1, *v2, *m1, *m2; trace_t trace; - int nomonsters; + int move; edict_t *ent; pr_xfunction->builtinsprofile += 30; @@ -784,10 +791,10 @@ void PF_tracebox (void) m1 = G_VECTOR(OFS_PARM1); m2 = G_VECTOR(OFS_PARM2); v2 = G_VECTOR(OFS_PARM3); - nomonsters = G_FLOAT(OFS_PARM4); + move = G_FLOAT(OFS_PARM4); ent = G_EDICT(OFS_PARM5); - trace = SV_Move (v1, m1, m2, v2, nomonsters ? MOVE_NOMONSTERS : MOVE_NORMAL, ent); + trace = SV_Move (v1, m1, m2, v2, move, ent); pr_global_struct->trace_allsolid = trace.allsolid; pr_global_struct->trace_startsolid = trace.startsolid; @@ -964,7 +971,7 @@ void PF_stuffcmd (void) entnum = G_EDICTNUM(OFS_PARM0); if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf("Can't stuffcmd to a non-client"); + Con_Print("Can't stuffcmd to a non-client\n"); return; } str = G_STRING(OFS_PARM1); @@ -1073,7 +1080,7 @@ void PF_dprint (void) if (developer.integer) { PF_VarString(0, string, sizeof(string)); - Con_Printf("%s",string); + Con_Print(string); } } @@ -1888,7 +1895,7 @@ void PF_setspawnparms (void) i = NUM_FOR_EDICT(ent); if (i < 1 || i > svs.maxclients || !svs.clients[i-1].active) { - Con_Printf("tried to setspawnparms on a non-client\n"); + Con_Print("tried to setspawnparms on a non-client\n"); return; } @@ -1996,7 +2003,7 @@ void PF_registercvar (void) // check for overlap with a command if (Cmd_Exists (name)) { - Con_Printf ("PF_registercvar: %s is a command\n", name); + Con_Printf("PF_registercvar: %s is a command\n", name); return; } @@ -2148,7 +2155,7 @@ void PF_setcolor (void) if (entnum < 1 || entnum > svs.maxclients || !svs.clients[entnum-1].active) { - Con_Printf ("tried to setcolor a non-client\n"); + Con_Print("tried to setcolor a non-client\n"); return; } @@ -2497,6 +2504,7 @@ void PF_te_explosion2 (void) MSG_WriteDPCoord(&sv.datagram, G_VECTOR(OFS_PARM0)[2]); // color MSG_WriteByte(&sv.datagram, G_FLOAT(OFS_PARM1)); + MSG_WriteByte(&sv.datagram, G_FLOAT(OFS_PARM2)); } void PF_te_lightning1 (void) @@ -2607,9 +2615,9 @@ static msurface_t *getsurface(edict_t *ed, int surfnum) if (modelindex < 1 || modelindex >= MAX_MODELS) return NULL; model = sv.models[modelindex]; - if (surfnum < 0 || surfnum >= model->brushq1.nummodelsurfaces) + if (surfnum < 0 || surfnum >= model->nummodelsurfaces) return NULL; - return model->brushq1.surfaces + surfnum + model->brushq1.firstmodelsurface; + return model->brushq1.surfaces + surfnum + model->firstmodelsurface; } @@ -2693,9 +2701,9 @@ void PF_getsurfacenearpoint(void) VectorSubtract(point, ed->v->origin, p); best = -1; bestdist = 1000000000; - for (surfnum = 0;surfnum < model->brushq1.nummodelsurfaces;surfnum++) + for (surfnum = 0;surfnum < model->nummodelsurfaces;surfnum++) { - surf = model->brushq1.surfaces + surfnum + model->brushq1.firstmodelsurface; + surf = model->brushq1.surfaces + surfnum + model->firstmodelsurface; dist = PlaneDiff(p, surf->plane); dist = dist * dist; if (dist < bestdist) @@ -2762,7 +2770,7 @@ void PF_stof(void) //float(string filename, float mode) fopen = #110; // opens a file inside quake/gamedir/data/ (mode is FILE_READ, FILE_APPEND, or FILE_WRITE), returns fhandle >= 0 if successful, or fhandle < 0 if unable to open file for any reason void PF_fopen(void) { - int filenum, mode; + int filenum, mode, i; char *modestring, *filename; for (filenum = 0;filenum < MAX_PRFILES;filenum++) if (pr_files[filenum] == NULL) @@ -2791,17 +2799,26 @@ void PF_fopen(void) return; } filename = G_STRING(OFS_PARM0); - // .. is parent directory on many platforms - // / is parent directory on Amiga + // control characters do not cause issues with any platforms I know of, but they are usually annoying to deal with + // ../ is parent directory on many platforms + // // is parent directory on Amiga + // / at the beginning of a path is root on unix, and parent directory on Amiga // : is root of drive on Amiga (also used as a directory separator on Mac, but / works there too, so that's a bad idea) // \ is a windows-ism (so it's naughty to use it, / works on all platforms) - if ((filename[0] == '.' && filename[1] == '.') || filename[0] == '/' || strrchr(filename, ':') || strrchr(filename, '\\')) + for (i = 0;filename[i];i++) { - Con_Printf("PF_fopen: dangerous or non-portable filename \"%s\" not allowed. (contains : or \\ or begins with .. or /)\n", filename); - G_FLOAT(OFS_RETURN) = -4; - return; + if (filename[i] < ' ' || (filename[i] == '/' && filename[i+1] == '/') || (filename[i] == '.' && filename[i+1] == '.') || filename[i] == ':' || filename[i] == '\\' || filename[0] == '/') + { + Con_Printf("PF_fopen: dangerous/confusing/annoying/non-portable filename \"%s\" not allowed. (contains control characters or // or .. or : or \\ or begins with /)\n", filename); + G_FLOAT(OFS_RETURN) = -4; + return; + } } pr_files[filenum] = FS_Open(va("data/%s", filename), modestring, false); + + if (pr_files[filenum] == NULL && modestring == "rb") + pr_files[filenum] = FS_Open(filename, modestring, false); + if (pr_files[filenum] == NULL) G_FLOAT(OFS_RETURN) = -1; else @@ -2957,7 +2974,7 @@ void PF_clientcommand (void) i = (NUM_FOR_EDICT(G_EDICT(OFS_PARM0)) - 1); if (i < 0 || i >= svs.maxclients || !svs.clients[i].active) { - Con_Printf("PF_clientcommand: entity is not a client"); + Con_Print("PF_clientcommand: entity is not a client\n"); return; } @@ -2969,30 +2986,26 @@ void PF_clientcommand (void) //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; +//20040203: rewritten by LordHavoc (no longer uses allocations) +int num_tokens = 0; +char *tokens[256], tokenbuf[4096]; void PF_tokenize (void) { + int pos; const char *p; - char *str; - str = G_STRING(OFS_PARM0); + p = G_STRING(OFS_PARM0); - if (tokens != NULL) + num_tokens = 0; + pos = 0; + while(COM_ParseToken(&p, false)) { - int i; - for (i=0;i= (int)(sizeof(tokens)/sizeof(tokens[0]))) + break; + if (pos + strlen(com_token) + 1 > sizeof(tokenbuf)) + break; + tokens[num_tokens++] = tokenbuf + pos; + strcpy(tokenbuf + pos, com_token); + pos += strlen(com_token) + 1; } G_FLOAT(OFS_RETURN) = num_tokens; @@ -3409,7 +3422,7 @@ int pr_numbuiltins = sizeof(pr_builtin)/sizeof(pr_builtin[0]); void PR_Cmd_Init(void) { - pr_strings_mempool = Mem_AllocPool("pr_stringszone"); + pr_strings_mempool = Mem_AllocPool("pr_stringszone", 0, NULL); PR_Files_Init(); PR_Search_Init(); }