Auto-Objekt-Modus fuer Dinge.

Gegenstaende bekommen einen sog. Auto-Objekt-Modus. Wird
dieser nach der Erzeugung eingeschaltet, entfaellt der
Check auf ein gueltiges Environment 10s nach der Erzeugung.
Allerdings wird ein Objekt sich dann im naechsten Reset
kommentarlos aufraeumen, falls es dann noch kein Environment
hat.

Change-Id: Ib010562036b6d9c1b18f0c42ed3af733b1f3ec99
diff --git a/std/armour.c b/std/armour.c
index e0f4b8f..03546b0 100644
--- a/std/armour.c
+++ b/std/armour.c
@@ -48,6 +48,8 @@
 
 // Zum Ueberschreiben, damit es nicht buggt, wenn die Leute in ihren Objekten (wie
 // gewuenscht) ::reset() rufen.
-void reset() {
+void reset()
+{
+  envchk::reset();
 }
 
diff --git a/std/armour_container.c b/std/armour_container.c
index 7ea22d2..604741f 100644
--- a/std/armour_container.c
+++ b/std/armour_container.c
@@ -50,5 +50,6 @@
 
 void reset()  {
   items::reset();
+  envchk::reset();
 }
 
diff --git a/std/clothing.c b/std/clothing.c
index 8d25984..2486111 100644
--- a/std/clothing.c
+++ b/std/clothing.c
@@ -48,6 +48,7 @@
 // zum Ueberschreiben, damit es nicht buggt, wenn Leute (wie gewuenscht) in 
 // ihren Objekten ::reset() aufrufen.
 void reset() {
+  envchk::reset();
 }
 
 int IsClothing() {return 1;}
diff --git a/std/clothing_container.c b/std/clothing_container.c
index ec93b92..5ee5a94 100644
--- a/std/clothing_container.c
+++ b/std/clothing_container.c
@@ -48,6 +48,7 @@
 
 void reset()  {
   items::reset();
+  envchk::reset();
 }
 
 int IsClothing() {return 1;}
diff --git a/std/container.c b/std/container.c
index ff47d35..d3ff7df 100644
--- a/std/container.c
+++ b/std/container.c
@@ -55,5 +55,6 @@
 void reset()
 {
   items::reset();
+  envchk::reset();
 }
 
diff --git a/std/npc.c b/std/npc.c
index 5f4faf1..0ddd719 100644
--- a/std/npc.c
+++ b/std/npc.c
@@ -110,6 +110,7 @@
 void reset(){
   items::reset();
   combat::reset();
+  envchk::reset();
 }
 
 static int _set_level(int arg)
diff --git a/std/thing.c b/std/thing.c
index 908b6c1..eb197f3 100644
--- a/std/thing.c
+++ b/std/thing.c
@@ -41,5 +41,7 @@
 }
 
 // Damit man in ALLEN Standardobjekten ::reset aufrufen kann.
-void reset() {}
-
+void reset()
+{
+  envchk::reset();
+}
diff --git a/std/thing/envchk.c b/std/thing/envchk.c
index f6ce13b..3c63dff 100644
--- a/std/thing/envchk.c
+++ b/std/thing/envchk.c
@@ -13,6 +13,7 @@
 #include <moving.h>
 #define NEED_PROTOTYPES
 #include <thing/moving.h>
+#include <thing/properties.h>
 
 protected void check_for_environment(string cloner)
 {
@@ -29,8 +30,47 @@
   }
 }
 
-void create()
+protected void create()
 {
-	if( clonep() ) 
+  if( clonep() )
     call_out(#'check_for_environment, 3, object_name(previous_object()));
 }
+
+// Kein Envcheck fuer Auto-Objekte, dafuer entfernen diese sich im naechsten
+// Reset, sofern sie noch kein Environment haben.
+// BTW: Abschalten des Resets sorgt fuer kein Aufraeumen.
+public int SetAutoObject(int autostate)
+{
+  if (autostate)
+  {
+    Set("p_lib_autoobject", 1, F_VALUE);
+    Set("p_lib_autoobject", PROTECTED|NOSETMETHOD, F_MODE_AS);
+    remove_call_out(#'check_for_environment);
+    if (autostate > 1)
+      set_next_reset(autostate);
+    // else: Standardresetzeit
+  }
+  else
+  {
+    // (Re-)Enable envchk
+    Set("p_lib_autoobject", 0, F_VALUE);
+    Set("p_lib_autoobject", PROTECTED|NOSETMETHOD, F_MODE_AD);
+    if (clonep() && find_call_out(#'check_for_environment) == -1)
+      call_out(#'check_for_environment, 3, object_name(previous_object()));
+  }
+  return autostate;
+}
+
+void reset()
+{
+  // wenn kein env und Autoobject: zerstoeren
+  if (clonep() && !environment()
+      && Query("p_lib_autoobject", F_VALUE))
+  {
+    remove(1);
+    // hier wirklich erzwingen, um unter allen Umstaenden zu vermeiden, dass
+    // sich dauerhaft Clones ansammeln, die niemand mehr referenziert.
+    if (objectp(this_object()))
+      destruct(this_object());
+  }
+}
diff --git a/std/tray.c b/std/tray.c
index e5f05b3..51319c6 100644
--- a/std/tray.c
+++ b/std/tray.c
@@ -52,4 +52,5 @@
 void reset()
 {
   items::reset();
+  envchk::reset();
 }
diff --git a/std/weapon.c b/std/weapon.c
index c80c767..6ccc886 100644
--- a/std/weapon.c
+++ b/std/weapon.c
@@ -42,5 +42,7 @@
 }
 
 void reset()  // Man kann in ALLEN Standardobjekten ::reset aufrufen!
-{ }
+{
+  envchk::reset();
+}