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_??? ?