+/*
+========================
+VM_findflags
+
+entity findflags(entity start, .float field, float match)
+========================
+*/
+// LordHavoc: search for flags in float fields
+void VM_findflags (void)
+{
+ int e;
+ int f;
+ int s;
+ prvm_edict_t *ed;
+
+ VM_SAFEPARMCOUNT(3, VM_findflags);
+
+
+ e = PRVM_G_EDICTNUM(OFS_PARM0);
+ f = PRVM_G_INT(OFS_PARM1);
+ s = (int)PRVM_G_FLOAT(OFS_PARM2);
+
+ for (e++ ; e < prog->num_edicts ; e++)
+ {
+ prog->xfunction->builtinsprofile++;
+ ed = PRVM_EDICT_NUM(e);
+ if (ed->priv.required->free)
+ continue;
+ if ((int)PRVM_E_FLOAT(ed,f) & s)
+ {
+ VM_RETURN_EDICT(ed);
+ return;
+ }
+ }
+
+ VM_RETURN_EDICT(prog->edicts);
+}
+
+/*
+========================
+VM_findchainflags
+
+entity findchainflags(.float field, float match)
+========================
+*/
+// LordHavoc: chained search for flags in float fields
+void VM_findchainflags (void)
+{
+ int i;
+ int f;
+ int s;
+ int chain_of;
+ prvm_edict_t *ent, *chain;
+
+ VM_SAFEPARMCOUNT(2, VM_findchainflags);
+
+ if(!prog->flag & PRVM_FE_CHAIN)
+ PRVM_ERROR("VM_findchainflags: %s doesnt have a chain field !\n", PRVM_NAME);
+
+ chain_of = PRVM_ED_FindField("chain")->ofs;
+
+ chain = (prvm_edict_t *)prog->edicts;
+
+ f = PRVM_G_INT(OFS_PARM0);
+ s = (int)PRVM_G_FLOAT(OFS_PARM1);
+
+ ent = PRVM_NEXT_EDICT(prog->edicts);
+ for (i = 1;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
+ {
+ prog->xfunction->builtinsprofile++;
+ if (ent->priv.required->free)
+ continue;
+ if (!((int)PRVM_E_FLOAT(ent,f) & s))
+ continue;
+
+ PRVM_E_INT(ent,chain_of) = PRVM_EDICT_TO_PROG(chain);
+ chain = ent;
+ }
+
+ VM_RETURN_EDICT(chain);
+}
+