unfortunatly, the pr_cmds forms use fast lookups using the globals... we don't even know if the chain field exists!

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@536 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2004-11-26 06:07:41 +00:00
parent 3822458c53
commit f468184e98
1 changed files with 66 additions and 2 deletions

View File

@ -800,6 +800,70 @@ void PF_CL_precache_file (progfuncs_t *prinst, struct globalvars_s *pr_globals)
G_INT(OFS_RETURN) = G_INT(OFS_PARM0);
}
//entity findchainstring(.string _field, string match) = #26;
void PF_menu_findchain (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
int i, f;
char *s, *t;
edict_t *ent, *chain; //note, all edicts share the common header, but don't use it's fields!
eval_t *val;
chain = (edict_t *) *prinst->parms->sv_edicts;
f = G_INT(OFS_PARM0)+prinst->fieldadjust;
f += prinst->parms->edictsize/4;
s = PR_GetStringOfs(prinst, OFS_PARM1);
for (i = 1; i < *prinst->parms->sv_num_edicts; i++)
{
ent = EDICT_NUM(prinst, i);
if (ent->isfree)
continue;
t = *(string_t *)&((float*)ent)[f] + prinst->stringtable;
if (!t)
continue;
if (strcmp(t, s))
continue;
val = prinst->GetEdictFieldValue(prinst, ent, "chain", NULL);
if (val)
val->edict = EDICT_TO_PROG(prinst, chain);
chain = ent;
}
RETURN_EDICT(prinst, chain);
}
//entity findchainfloat(.float _field, float match) = #27;
void PF_menu_findchainfloat (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
int i, f;
float s;
edict_t *ent, *chain; //note, all edicts share the common header, but don't use it's fields!
eval_t *val;
chain = (edict_t *) *prinst->parms->sv_edicts;
f = G_INT(OFS_PARM0)+prinst->fieldadjust;
f += prinst->parms->edictsize/4;
s = G_FLOAT(OFS_PARM1);
for (i = 1; i < *prinst->parms->sv_num_edicts; i++)
{
ent = EDICT_NUM(prinst, i);
if (ent->isfree)
continue;
if (((float *)ent)[f] != s)
continue;
val = prinst->GetEdictFieldValue(prinst, ent, "chain", NULL);
if (val)
val->edict = EDICT_TO_PROG(prinst, chain);
chain = ent;
}
RETURN_EDICT(prinst, chain);
}
builtin_t menu_builtins[] = {
//0
PF_Fixme,
@ -830,8 +894,8 @@ builtin_t menu_builtins[] = {
PF_Remove_,//23
PF_FindString,//24
PF_FindFloat,//25
PF_findchain,//26 //entity findchainstring(.string _field, string match) = #26;
PF_findchainfloat,//27 //entity findchainfloat(.float _field, float match) = #27;
PF_menu_findchain,//26 //entity findchainstring(.string _field, string match) = #26;
PF_menu_findchainfloat,//27 //entity findchainfloat(.float _field, float match) = #27;
PF_CL_precache_file,//28
PF_CL_precache_sound,//29