--- orig/rpggame/rpgobjset.h
+++ mod/rpggame/rpgobjset.h
@@ -75,6 +75,7 @@
         CCOMMAND(r_y,           "f",   (rpgobjset *self, float *val), { if (self->stack[0]->ent) self->stack[0]->ent->o.y = *val; });
         CCOMMAND(r_z,           "f",   (rpgobjset *self, float *val), { if (self->stack[0]->ent) self->stack[0]->ent->o.z = *val; });
         CCOMMAND(r_sleep,       "is",  (rpgobjset *self, int *msec, char *cmd), { self->r_sleep(*msec, cmd); });
+        CCOMMAND(r_loop_inrange,"is",  (rpgobjset *self, int *maxrange, char *body), { self->loop_inrange(*maxrange, body); });
         clearworld();
     }
 
@@ -281,6 +282,30 @@
         }
     }
 
+    void loop_inrange(int maxrange, char *body)
+    {
+        if (!stack[0]->ent) return;
+
+        vec *o = &(stack[0]->ent->o);
+
+        loopv(set) if (set[i] != stack[0])
+        {
+            if (o->dist(set[i]->ent->o) <= maxrange)
+            {
+                pushobj(set[i]);
+                execute(body);
+                popobj();
+            }
+        }
+
+        if (o->dist(playerobj->ent->o) <= maxrange)
+        {
+            pushobj(playerobj);
+            execute(body);
+            popobj();
+        }
+    }
+
     char *stringpool(char *name)
     {
         char **n = names.access(name);



