]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - pr_cmds.c
corrected a few LittleLongs to LittleFloat in md3 loading (EEP those were bad)
[xonotic/darkplaces.git] / pr_cmds.c
index ffa23aacd53569f357dee9023ca5fd6d5d18560c..72c72335478ffacd3748fa44e2dca6da265b345c 100644 (file)
--- a/pr_cmds.c
+++ b/pr_cmds.c
@@ -75,9 +75,11 @@ 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_GFX_EXTERNALTEXTURES "
 "DP_HALFLIFE_MAP "
 "DP_HALFLIFE_MAP_CVAR "
 "DP_INPUTBUTTONS "
@@ -862,7 +864,7 @@ int PF_newcheckclient (int check)
 
 // 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;
 }
@@ -908,10 +910,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++;
@@ -1311,7 +1313,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);
@@ -1497,7 +1499,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));
 }
 
 /*
@@ -2555,9 +2557,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;
 }
 
 
@@ -2641,9 +2643,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)
@@ -2929,7 +2931,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);
@@ -2949,6 +2951,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 < 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[] =
 {
@@ -3119,7 +3163,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