AddCmd(): Bei @PRESENT P_INVIS beachten
Mit Objekte mit P_INVIS soll nicht interagiert werden koennen.
Change-Id: I8da0a15e780f8cccfec7ccb13c174fda2ef7f458
diff --git a/std/thing/commands.c b/std/thing/commands.c
index 98934eb..3dc879d 100644
--- a/std/thing/commands.c
+++ b/std/thing/commands.c
@@ -393,6 +393,27 @@
return 0;
}
+// Objekt fuer @PRESENT suchen. Es sollen keine Objekte mit P_INVIS
+// auftauchen.
+private object _GetPresentObject(string str)
+{
+ // erst Inventory des PL, spaeter Environment des PL durchsuchen. 2 foreach,
+ // um zu vermeiden, die zwei Arrays (unnoetig) zu erzeugen und zu addieren.
+ foreach(object ob : all_inventory(PL))
+ {
+ // Kein call_strict(), falls Objekte ohne die Funktionen rumliegen.
+ if(({int})ob->id(str) && !({int})ob->QueryProp(P_INVIS))
+ return ob;
+ }
+ foreach(object ob : all_inventory(environment(PL)))
+ {
+ if(({int})ob->id(str) && !({int})ob->QueryProp(P_INVIS))
+ return ob;
+ }
+ return 0;
+}
+
+
#define CHECK_PRESENT 1
#define CHECK_ID 2
#define CHECK_PUTGETNONE 4
@@ -482,10 +503,8 @@
else tmpstr=noparsestr[q_start];
//DBG(tmpstr);
- if(check_present&CHECK_PRESENT && // PRESENT ?
- ((tmpobj=present(tmpstr,this_player())) ||
- (tmpobj=present(tmpstr,environment(this_player())))))
- matchstr=tmpobj;
+ if(check_present&CHECK_PRESENT && // PRESENT ?
+ matchstr = _GetPresentObject(tmpstr));
else if(check_present&CHECK_ID && id(tmpstr)) // ID ?
matchstr=this_object();
else if((check_present&CHECK_PUTGET) && // PUT_GET_??? ?