X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=pr_cmds.c;h=f49b2d205729fee951b4daaddcc9142507575fb8;hb=12626bd3d5e411a4f6b92187541962ab401d783b;hp=0da857a852ed0c6196311235bcb7737e9e1d7441;hpb=3b559840aaf1e5a218052d893881c1dd8c1b0780;p=xonotic%2Fdarkplaces.git diff --git a/pr_cmds.c b/pr_cmds.c index 0da857a8..f49b2d20 100644 --- a/pr_cmds.c +++ b/pr_cmds.c @@ -41,30 +41,26 @@ char pr_varstring_temp[MAX_VARSTRING]; */ -char *PF_VarString (int first) +char *PF_VarString (int first) { - int i, j, end; - char *s; + int i; + const char *s; + char *out, *outend; - end = 0; - for (i = first;i < pr_argc;i++) + out = pr_varstring_temp; + outend = pr_varstring_temp + sizeof(pr_varstring_temp) - 1; + for (i = first;i < pr_argc && out < outend;i++) { - // LordHavoc: FIXME: this is just a strlcat inlined s = G_STRING((OFS_PARM0+i*3)); - j = strlen(s); - if (j > MAX_VARSTRING - 1 - end) - j = MAX_VARSTRING - 1 - end; - if (j > 0) - { - memcpy(pr_varstring_temp + end, s, j); - end += j; - } + while (out < outend && *s) + *out++ = *s++; } - pr_varstring_temp[end] = 0; + *out++ = 0; return pr_varstring_temp; } char *ENGINE_EXTENSIONS = +"DP_CL_LOADSKY " "DP_EF_NODRAW " "DP_EF_ADDITIVE " "DP_EF_BLUE " @@ -80,7 +76,10 @@ char *ENGINE_EXTENSIONS = "DP_ENT_SCALE " "DP_ENT_VIEWMODEL " "DP_GFX_FOG " +"DP_GFX_SKYBOX " +"DP_GFX_EXTERNALTEXTURES " "DP_HALFLIFE_MAP " +"DP_HALFLIFE_MAP_CVAR " "DP_INPUTBUTTONS " "DP_MONSTERWALK " "DP_MOVETYPEBOUNCEMISSILE " @@ -126,6 +125,7 @@ char *ENGINE_EXTENSIONS = "DP_TE_STANDARDEFFECTBUILTINS " "DP_VIEWZOOM " "FRIK_FILE " +"KRIMZON_SV_PARSECLIENTCOMMAND " "NEH_CMD_PLAY2 " "NEH_RESTOREGAME " "TW_SV_STEPCONTROL " @@ -711,7 +711,7 @@ void PF_traceline (void) nomonsters = G_FLOAT(OFS_PARM2); ent = G_EDICT(OFS_PARM3); - trace = SV_Move (v1, vec3_origin, vec3_origin, v2, nomonsters ? MOVE_NOMONSTERS : MOVE_NORMAL, ent); + trace = SV_Move (v1, vec3_origin, vec3_origin, v2, nomonsters, ent); pr_global_struct->trace_allsolid = trace.allsolid; pr_global_struct->trace_startsolid = trace.startsolid; @@ -823,9 +823,7 @@ qbyte checkpvs[MAX_MAP_LEAFS/8]; int PF_newcheckclient (int check) { int i; - qbyte *pvs; edict_t *ent; - mleaf_t *leaf; vec3_t org; // cycle to the next one @@ -851,7 +849,7 @@ int PF_newcheckclient (int check) if (i == check) break; // didn't find anything else - if (ent->free) + if (ent->e->free) continue; if (ent->v->health <= 0) continue; @@ -864,9 +862,7 @@ int PF_newcheckclient (int check) // get the PVS for the entity VectorAdd (ent->v->origin, ent->v->view_ofs, org); - leaf = Mod_PointInLeaf (org, sv.worldmodel); - pvs = Mod_LeafPVS (leaf, sv.worldmodel); - memcpy (checkpvs, pvs, (sv.worldmodel->numleafs+7)>>3 ); + memcpy (checkpvs, sv.worldmodel->brushq1.LeafPVS(sv.worldmodel, sv.worldmodel->brushq1.PointInLeaf(sv.worldmodel, org)), (sv.worldmodel->brushq1.numleafs+7)>>3 ); return i; } @@ -903,7 +899,7 @@ void PF_checkclient (void) // return check if it might be visible ent = EDICT_NUM(sv.lastcheck); - if (ent->free || ent->v->health <= 0) + if (ent->e->free || ent->v->health <= 0) { RETURN_EDICT(sv.edicts); return; @@ -912,10 +908,10 @@ void PF_checkclient (void) // if current entity can't possibly see the check entity, return 0 self = PROG_TO_EDICT(pr_global_struct->self); VectorAdd (self->v->origin, self->v->view_ofs, view); - leaf = Mod_PointInLeaf (view, sv.worldmodel); + leaf = sv.worldmodel->brushq1.PointInLeaf(sv.worldmodel, view); if (leaf) { - l = (leaf - sv.worldmodel->leafs) - 1; + l = (leaf - sv.worldmodel->brushq1.leafs) - 1; if ( (l<0) || !(checkpvs[l>>3] & (1<<(l&7)) ) ) { c_notvis++; @@ -1036,7 +1032,7 @@ void PF_findradius (void) for (i=1 ; ibuiltinsprofile++; - if (ent->free) + if (ent->e->free) continue; if (ent->v->solid == SOLID_NOT) continue; @@ -1159,7 +1155,7 @@ void PF_Find (void) { pr_xfunction->builtinsprofile++; ed = EDICT_NUM(e); - if (ed->free) + if (ed->e->free) continue; t = E_STRING(ed,f); if (!t) @@ -1190,7 +1186,7 @@ void PF_FindFloat (void) { pr_xfunction->builtinsprofile++; ed = EDICT_NUM(e); - if (ed->free) + if (ed->e->free) continue; if (E_FLOAT(ed,f) == s) { @@ -1225,7 +1221,7 @@ void PF_findchain (void) for (i = 1;i < sv.num_edicts;i++, ent = NEXT_EDICT(ent)) { pr_xfunction->builtinsprofile++; - if (ent->free) + if (ent->e->free) continue; t = E_STRING(ent,f); if (!t) @@ -1258,7 +1254,7 @@ void PF_findchainfloat (void) for (i = 1;i < sv.num_edicts;i++, ent = NEXT_EDICT(ent)) { pr_xfunction->builtinsprofile++; - if (ent->free) + if (ent->e->free) continue; if (E_FLOAT(ent,f) != s) continue; @@ -1315,7 +1311,7 @@ void PF_precache_model (void) Host_Error ("PF_Precache_*: Precache can only be done in spawn functions"); s = G_STRING(OFS_PARM0); - if (sv.worldmodel->ishlbsp && ((!s) || (!s[0]))) + if (sv.worldmodel->brushq1.ishlbsp && ((!s) || (!s[0]))) return; G_INT(OFS_RETURN) = G_INT(OFS_PARM0); PR_CheckEmptyString (s); @@ -1428,7 +1424,7 @@ void PF_droptofloor (void) ent->v->groundentity = EDICT_TO_PROG(trace.ent); G_FLOAT(OFS_RETURN) = 1; // if support is destroyed, keep suspended (gross hack for floating items in various maps) - ent->suspendedinairflag = true; + ent->e->suspendedinairflag = true; } } @@ -1501,7 +1497,7 @@ PF_pointcontents */ void PF_pointcontents (void) { - G_FLOAT(OFS_RETURN) = Mod_PointContents(G_VECTOR(OFS_PARM0), sv.worldmodel); + G_FLOAT(OFS_RETURN) = SV_PointContents(G_VECTOR(OFS_PARM0)); } /* @@ -1527,7 +1523,7 @@ void PF_nextent (void) return; } ent = EDICT_NUM(i); - if (!ent->free) + if (!ent->e->free) { RETURN_EDICT(ent); return; @@ -2089,8 +2085,9 @@ setcolor(clientent, value) */ void PF_setcolor (void) { - client_t *client; - int entnum, i; + client_t *client; + int entnum, i; + eval_t *val; entnum = G_EDICTNUM(OFS_PARM0); i = G_FLOAT(OFS_PARM1); @@ -2102,8 +2099,11 @@ void PF_setcolor (void) } client = &svs.clients[entnum-1]; + if ((val = GETEDICTFIELDVALUE(client->edict, eval_clientcolors))) + val->_float = i; client->colors = i; - EDICT_NUM(client->edictnumber)->v->team = (i & 15) + 1; + client->old_colors = i; + client->edict->v->team = (i & 15) + 1; MSG_WriteByte (&sv.reliable_datagram, svc_updatecolors); MSG_WriteByte (&sv.reliable_datagram, entnum - 1); @@ -2547,7 +2547,7 @@ static msurface_t *getsurface(edict_t *ed, int surfnum) { int modelindex; model_t *model; - if (!ed || ed->free) + if (!ed || ed->e->free) return NULL; modelindex = ed->v->modelindex; if (modelindex < 1 || modelindex >= MAX_MODELS) @@ -2555,9 +2555,9 @@ static msurface_t *getsurface(edict_t *ed, int surfnum) model = sv.models[modelindex]; if (model->type != mod_brush) return NULL; - if (surfnum < 0 || surfnum >= model->nummodelsurfaces) + if (surfnum < 0 || surfnum >= model->brushq1.nummodelsurfaces) return NULL; - return model->surfaces + surfnum + model->firstmodelsurface; + return model->brushq1.surfaces + surfnum + model->brushq1.firstmodelsurface; } @@ -2582,7 +2582,7 @@ void PF_getsurfacepoint(void) int pointnum; VectorClear(G_VECTOR(OFS_RETURN)); ed = G_EDICT(OFS_PARM0); - if (!ed || ed->free) + if (!ed || ed->e->free) return; if (!(surf = getsurface(ed, G_FLOAT(OFS_PARM1)))) return; @@ -2628,7 +2628,7 @@ void PF_getsurfacenearpoint(void) ed = G_EDICT(OFS_PARM0); point = G_VECTOR(OFS_PARM1); - if (!ed || ed->free) + if (!ed || ed->e->free) return; modelindex = ed->v->modelindex; if (modelindex < 1 || modelindex >= MAX_MODELS) @@ -2641,9 +2641,9 @@ void PF_getsurfacenearpoint(void) VectorSubtract(point, ed->v->origin, p); best = -1; bestdist = 1000000000; - for (surfnum = 0;surfnum < model->nummodelsurfaces;surfnum++) + for (surfnum = 0;surfnum < model->brushq1.nummodelsurfaces;surfnum++) { - surf = model->surfaces + surfnum + model->firstmodelsurface; + surf = model->brushq1.surfaces + surfnum + model->brushq1.firstmodelsurface; dist = PlaneDiff(p, surf->plane); dist = dist * dist; if (dist < bestdist) @@ -2668,7 +2668,7 @@ void PF_getsurfaceclippedpoint(void) vec3_t p, out; VectorClear(G_VECTOR(OFS_RETURN)); ed = G_EDICT(OFS_PARM0); - if (!ed || ed->free) + if (!ed || ed->e->free) return; if (!(surf = getsurface(ed, G_FLOAT(OFS_PARM1)))) return; @@ -2853,29 +2853,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); } @@ -2901,6 +2889,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 @@ -3067,7 +3116,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;