X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=pr_cmds.c;h=b4afef3d46b4f70e9c70d19107400b860629bd18;hb=301157297096e22c94a47205d529a2cfbeaf996d;hp=b432657bd800c37fe2671cba0539dd7038b846b7;hpb=9912a20422cea9a76f89ad056033368c5c97c687;p=xonotic%2Fdarkplaces.git diff --git a/pr_cmds.c b/pr_cmds.c index b432657b..b4afef3d 100644 --- a/pr_cmds.c +++ b/pr_cmds.c @@ -75,9 +75,13 @@ char *ENGINE_EXTENSIONS = "DP_ENT_GLOW " "DP_ENT_SCALE " "DP_ENT_VIEWMODEL " +"DP_GFX_EXTERNALTEXTURES " "DP_GFX_FOG " +"DP_GFX_QUAKE3MODELTAGS " +"DP_GFX_SKINFILES " "DP_GFX_SKYBOX " "DP_HALFLIFE_MAP " +"DP_HALFLIFE_MAP_CVAR " "DP_INPUTBUTTONS " "DP_MONSTERWALK " "DP_MOVETYPEBOUNCEMISSILE " @@ -368,16 +372,15 @@ void PF_sprint (void) entnum = G_EDICTNUM(OFS_PARM0); s = PF_VarString(1); - if (entnum < 1 || entnum > svs.maxclients) + if (entnum < 1 || entnum > MAX_SCOREBOARD || !svs.connectedclients[entnum-1]) { Con_Printf ("tried to sprint to a non-client\n"); return; } - client = &svs.clients[entnum-1]; - - MSG_WriteChar (&client->message,svc_print); - MSG_WriteString (&client->message, s ); + client = svs.connectedclients[entnum-1]; + MSG_WriteChar(&client->message,svc_print); + MSG_WriteString(&client->message, s ); } @@ -399,16 +402,15 @@ void PF_centerprint (void) entnum = G_EDICTNUM(OFS_PARM0); s = PF_VarString(1); - if (entnum < 1 || entnum > svs.maxclients) + if (entnum < 1 || entnum > MAX_SCOREBOARD || !svs.connectedclients[entnum-1]) { Con_Printf ("tried to sprint to a non-client\n"); return; } - client = &svs.clients[entnum-1]; - - MSG_WriteChar (&client->message,svc_centerprint); - MSG_WriteString (&client->message, s ); + client = svs.connectedclients[entnum-1]; + MSG_WriteChar(&client->message,svc_centerprint); + MSG_WriteString(&client->message, s ); } @@ -826,41 +828,31 @@ int PF_newcheckclient (int check) // cycle to the next one - if (check < 1) - check = 1; - if (check > svs.maxclients) - check = svs.maxclients; - - if (check == svs.maxclients) + check = bound(1, check, MAX_SCOREBOARD); + if (check == MAX_SCOREBOARD) i = 1; else i = check + 1; for ( ; ; i++) { + // count the cost pr_xfunction->builtinsprofile++; - if (i == svs.maxclients+1) + // wrap around + if (i == MAX_SCOREBOARD+1) i = 1; - + // look up the client's edict ent = EDICT_NUM(i); - - if (i == check) - break; // didn't find anything else - - if (ent->e->free) + // check if it is to be ignored, but never ignore the one we started on (prevent infinite loop) + if (i != check && (ent->e->free || ent->v->health <= 0 || ((int)ent->v->flags & FL_NOTARGET))) continue; - if (ent->v->health <= 0) - continue; - if ((int)ent->v->flags & FL_NOTARGET) - continue; - - // anything that is a client, or has a client as an enemy + // found a valid client (possibly the same one again) break; } // get the PVS for the entity VectorAdd (ent->v->origin, ent->v->view_ofs, org); - memcpy (checkpvs, sv.worldmodel->LeafPVS(sv.worldmodel, sv.worldmodel->PointInLeaf(sv.worldmodel, org)), (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; } @@ -906,10 +898,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 = sv.worldmodel->PointInLeaf(sv.worldmodel, view); + 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++; @@ -942,13 +934,13 @@ void PF_stuffcmd (void) client_t *old; entnum = G_EDICTNUM(OFS_PARM0); - if (entnum < 1 || entnum > svs.maxclients) + if (entnum < 1 || entnum > MAX_SCOREBOARD) Host_Error ("Parm 0 not a client"); str = G_STRING(OFS_PARM1); old = host_client; - host_client = &svs.clients[entnum-1]; - Host_ClientCommands ("%s", str); + if ((host_client = svs.connectedclients[entnum-1])) + Host_ClientCommands ("%s", str); host_client = old; } @@ -1126,7 +1118,7 @@ void PF_Remove (void) ed = G_EDICT(OFS_PARM0); if (ed == sv.edicts) Host_Error("remove: tried to remove world\n"); - if (NUM_FOR_EDICT(ed) <= svs.maxclients) + if (NUM_FOR_EDICT(ed) <= MAX_SCOREBOARD) Host_Error("remove: tried to remove a client\n"); ED_Free (ed); } @@ -1309,7 +1301,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); @@ -1450,13 +1442,15 @@ void PF_lightstyle (void) if (sv.state != ss_active) return; - for (j=0, client = svs.clients ; jactive || client->spawned) + for (j = 0;j < MAX_SCOREBOARD;j++) + { + if ((client = svs.connectedclients[j])) { MSG_WriteChar (&client->message, svc_lightstyle); MSG_WriteChar (&client->message,style); MSG_WriteString (&client->message, val); } + } } void PF_rint (void) @@ -1495,7 +1489,7 @@ PF_pointcontents */ void PF_pointcontents (void) { - G_FLOAT(OFS_RETURN) = sv.worldmodel->PointContents(sv.worldmodel, G_VECTOR(OFS_PARM0)); + G_FLOAT(OFS_RETURN) = SV_PointContents(G_VECTOR(OFS_PARM0)); } /* @@ -1737,9 +1731,9 @@ sizebuf_t *WriteDest (void) case MSG_ONE: ent = PROG_TO_EDICT(pr_global_struct->msg_entity); entnum = NUM_FOR_EDICT(ent); - if (entnum < 1 || entnum > svs.maxclients) - Host_Error ("WriteDest: not a client"); - return &svs.clients[entnum-1].message; + if (entnum < 1 || entnum > MAX_SCOREBOARD || svs.connectedclients[entnum-1] == NULL) + Host_Error("WriteDest: not a client"); + return &svs.connectedclients[entnum-1]->message; case MSG_ALL: return &sv.reliable_datagram; @@ -1849,12 +1843,11 @@ void PF_setspawnparms (void) ent = G_EDICT(OFS_PARM0); i = NUM_FOR_EDICT(ent); - if (i < 1 || i > svs.maxclients) + if (i < 1 || i > MAX_SCOREBOARD || !svs.connectedclients[i-1]) Host_Error ("Entity is not a client"); // copy spawn parms out of the client_t - client = svs.clients + (i-1); - + client = svs.connectedclients[i-1]; for (i=0 ; i< NUM_SPAWN_PARMS ; i++) (&pr_global_struct->parm1)[i] = client->spawn_parms[i]; } @@ -2090,13 +2083,12 @@ void PF_setcolor (void) entnum = G_EDICTNUM(OFS_PARM0); i = G_FLOAT(OFS_PARM1); - if (entnum < 1 || entnum > svs.maxclients) + if (entnum < 1 || entnum > MAX_SCOREBOARD || !(client = svs.connectedclients[entnum-1])) { Con_Printf ("tried to setcolor a non-client\n"); return; } - client = &svs.clients[entnum-1]; if ((val = GETEDICTFIELDVALUE(client->edict, eval_clientcolors))) val->_float = i; client->colors = i; @@ -2553,9 +2545,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; } @@ -2639,9 +2631,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) @@ -2851,15 +2843,15 @@ 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 i, start, end; - char *s, string[MAX_VARSTRING]; + int i, start, length; + char *s, *string = PR_GetTempString(); s = G_STRING(OFS_PARM0); start = G_FLOAT(OFS_PARM1); - end = G_FLOAT(OFS_PARM2) + start; + length = G_FLOAT(OFS_PARM2); if (!s) s = ""; for (i = 0;i < start && *s;i++, s++); - for (i = 0;i < MAX_VARSTRING - 1 && *s && i < end;i++, s++) + for (i = 0;i < STRINGTEMP_LENGTH - 1 && *s && i < length;i++, s++) string[i] = *s; string[i] = 0; G_INT(OFS_RETURN) = PR_SetString(string); @@ -2896,11 +2888,11 @@ void PF_clientcommand (void) //find client for this entity i = (NUM_FOR_EDICT(G_EDICT(OFS_PARM0)) - 1); - if (i < 0 || i >= svs.maxclients) + if (i < 0 || i >= MAX_SCOREBOARD || !svs.connectedclients[i]) Host_Error("PF_clientcommand: entity is not a client"); temp_client = host_client; - host_client = &svs.clients[i]; + host_client = svs.connectedclients[i]; Cmd_ExecuteString (G_STRING(OFS_PARM1), src_client); host_client = temp_client; } @@ -2927,7 +2919,7 @@ void PF_tokenize (void) tokens = Z_Malloc(strlen(str) * sizeof(char *)); max_tokens = strlen(str); - for (p = str;COM_ParseToken(&p) && num_tokens < max_tokens;num_tokens++) + for (p = str;COM_ParseToken(&p, false) && num_tokens < max_tokens;num_tokens++) { tokens[num_tokens] = Z_Malloc(strlen(com_token) + 1); strcpy(tokens[num_tokens], com_token); @@ -2947,6 +2939,48 @@ void PF_argv (void) G_INT(OFS_RETURN) = PR_SetString(""); } +//void(entity e, entity tagentity, string tagname) setattachment = #443; // attachs e to a tag on tagentity (note: use "" to attach to entity origin/angles instead of a tag) +void PF_setattachment (void) +{ + edict_t *e = G_EDICT(OFS_PARM0); + edict_t *tagentity = G_EDICT(OFS_PARM1); + char *tagname = G_STRING(OFS_PARM2); + eval_t *v; + int i, modelindex; + model_t *model; + + if (tagentity == NULL) + tagentity = sv.edicts; + + v = GETEDICTFIELDVALUE(e, eval_tag_entity); + if (v) + v->edict = EDICT_TO_PROG(tagentity); + + v = GETEDICTFIELDVALUE(e, eval_tag_index); + if (v) + v->_float = 0; + if (tagentity != NULL && tagentity != sv.edicts && tagname && tagname[0]) + { + modelindex = (int)tagentity->v->modelindex; + if (modelindex >= 0 && modelindex < MAX_MODELS) + { + model = sv.models[modelindex]; + if (model->data_overridetagnamesforskin && (unsigned int)tagentity->v->skin < (unsigned int)model->numskins && model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].num_overridetagnames) + for (i = 0;i < model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].num_overridetagnames;i++) + if (!strcmp(tagname, model->data_overridetagnamesforskin[(unsigned int)tagentity->v->skin].data_overridetagnames[i].name)) + v->_float = i + 1; + if (v->_float == 0 && model->alias.aliasnum_tags) + for (i = 0;i < model->alias.aliasnum_tags;i++) + if (!strcmp(tagname, model->alias.aliasdata_tags[i].name)) + v->_float = i + 1; + if (v->_float == 0) + Con_DPrintf("setattachment(edict %i, edict %i, string \"%s\"): tried to find tag named \"%s\" on entity %i (model \"%s\") but could not find it\n", NUM_FOR_EDICT(e), NUM_FOR_EDICT(tagentity), tagname, tagname, NUM_FOR_EDICT(tagentity), model->name); + } + else + Con_DPrintf("setattachment(edict %i, edict %i, string \"%s\"): tried to find tag named \"%s\" on entity %i but it has no model\n", NUM_FOR_EDICT(e), NUM_FOR_EDICT(tagentity), tagname, tagname, NUM_FOR_EDICT(tagentity)); + } +} + builtin_t pr_builtin[] = { @@ -3117,7 +3151,7 @@ PF_getsurfaceclippedpoint, // #439 vector(entity e, float s, vector p) getsurfac 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 +PF_setattachment, // #443 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS) NULL, // #444 NULL, // #445 NULL, // #446