Auswertung von P_EXTRA_LOOK optimiert.

Nicht mehr alle Objekte im Inventar pruefen, sondern wenn ein Objekt in
das Living bewegt wird schauen, ob P_EXTRA_LOOK gesetzt ist und in ein
Array eintragen, welches dann von long() ausgewertet wird.

Change-Id: I1fefa021dee06c3d3006d6130b5a9069b76d3dd6
diff --git a/doc/sphinx/props/P_EXTRA_LOOK_OBS.rst b/doc/sphinx/props/P_EXTRA_LOOK_OBS.rst
new file mode 100644
index 0000000..86fdd4a
--- /dev/null
+++ b/doc/sphinx/props/P_EXTRA_LOOK_OBS.rst
@@ -0,0 +1,39 @@
+P_EXTRA_LOOK_OBS
+================
+
+NAME
+----
+::
+
+    P_EXTRA_LOOK_OBS                "p_lib_extralook_obs"
+
+DEFINIERT IN
+------------
+::
+
+    /sys/living/description.h
+
+BESCHREIBUNG
+------------
+::
+
+    Array mit den im Lebewesen enthaltenen Objekten, die P_EXTRA_LOOK gesetzt
+    haben.
+
+BEMERKUNG
+---------
+::
+
+    Bitte nicht von Hand manipulieren.
+
+  
+
+SIEHE AUCH
+----------
+::
+
+    :doc:`../long`, :doc:`../AddExtraLook`, :doc:`../RemoveExtraLook`
+    :doc:`P_EXTRA_LOOK`
+    /std/living/description.c, /std/player/base.c
+
+
diff --git a/std/living/description.c b/std/living/description.c
index 6353ca9..f512e9c 100644
--- a/std/living/description.c
+++ b/std/living/description.c
@@ -187,6 +187,8 @@
   // Extralook-Property speichern und vor manueller Aenderung schuetzen
   // EMs duerfen, die wissen hoffentlich, was sie tun.
   Set(P_INTERNAL_EXTRA_LOOK, SAVE|PROTECTED, F_MODE_AS);
+  SetProp(P_EXTRA_LOOK_OBS,({}));
+  Set(P_EXTRA_LOOK, PROTECTED, F_MODE_AS);
   SetProp(P_CLOTHING,({}));
   AddId("Living");
 }
@@ -242,12 +244,25 @@
     str += tmp;
   if (stringp(tmp = QueryProp(P_INTERNAL_EXTRA_LOOK)))
     str += tmp;
-  for(ob = first_inventory(ME); ob; ob = next_inventory(ob))
-    if(exl = ob->QueryProp(P_EXTRA_LOOK)) 
-      str += exl;
-    else if(exl = ob->extra_look()) 
-      str += exl; // TO BE REMOVED
-
+  foreach(ob : QueryProp(P_EXTRA_LOOK_OBS))
+  {
+    if(objectp(ob) && environment(ob)==ME)
+    {
+      if((stringp(exl = ob->QueryProp(P_EXTRA_LOOK)))
+      {
+        str += exl;
+      }
+      else if(stringp(exl = ob->extra_look()))
+      {
+        str += exl; // TO BE REMOVED
+      }
+    }
+    else
+    {
+      // Bereinigen
+      SetProp(P_EXTRA_LOOK_OBS,QueryProp(P_EXTRA_LOOK_OBS)-({ob}));
+    }
+  }
   
   if(filter_ldfied = QueryProp(P_TRANSPARENT))
   {
@@ -330,3 +345,30 @@
   return ([MAT_MISC_LIVING:100]);
 }
 
+public void NotifyInsert(object ob, object oldenv)
+{
+  // Wenn ob mal einen Extralook hat und mal nicht, muss Magier sich was
+  // ueberlegen.
+  if(stringp(ob->QueryProp(P_EXTRA_LOOK)))
+  {
+    SetProp(P_EXTRA_LOOK_OBS,QueryProp(P_EXTRA_LOOK_OBS)+({ob}));
+  }
+  
+  // Muss leider auch beachtet werden, sollte aber mal raus fliegen ...
+  if(function_exists("extra_look",ob))
+  {
+    SetProp(P_EXTRA_LOOK_OBS,QueryProp(P_EXTRA_LOOK_OBS)+({ob}));
+    catch(raise_error(
+      "Obsolete lfun extra_look() in "+load_name(ob));
+      publish);
+  }
+}
+
+public void NotifyLeave(object ob, object dest)
+{
+  object *els=QueryProp(P_EXTRA_LOOK_OBS);
+  if(member(els,ob)!=-1)
+  {
+    SetProp(P_EXTRA_LOOK_OBS,QueryProp(els-({ob}));
+  }
+}
diff --git a/std/npc.c b/std/npc.c
index f612f1e..a6d9ce6 100644
--- a/std/npc.c
+++ b/std/npc.c
@@ -169,6 +169,19 @@
       _clone_items();
 }
 
+public void NotifyInsert(object ob, object oldenv)
+{
+  restrictions::NotifyInsert(ob,oldenv);
+  description::NotifyInsert(ob,oldenv);
+}
+  
+public void NotifyLeave(object ob, object dest)
+{
+  restrictions::NotifyLeave(ob,dest);
+  description::NotifyLeave(ob,dest);
+}
+  
+
 string _query_race()
 {
    if (stringp(Query(P_RACE))) return capitalize(Query(P_RACE));
diff --git a/std/player/base.c b/std/player/base.c
index ecc0a84..9d78006 100644
--- a/std/player/base.c
+++ b/std/player/base.c
@@ -282,6 +282,18 @@
     GMCP_Room();
 }
 
+public void NotifyInsert(object ob, object oldenv)
+{
+  restrictions::NotifyInsert(ob,oldenv);
+  description::NotifyInsert(ob,oldenv);
+}
+  
+public void NotifyLeave(object ob, object dest)
+{
+  restrictions::NotifyLeave(ob,dest);
+  description::NotifyLeave(ob,dest);
+}
+
 string Forschung()
 {
   return LEPMASTER->QueryForschung();
diff --git a/sys/living/description.h b/sys/living/description.h
index dc07fbf..def9d28 100644
--- a/sys/living/description.h
+++ b/sys/living/description.h
@@ -7,6 +7,7 @@
 #define P_VISIBLE_GUILD           "visible_guild"
 
 #define P_EXTRA_LOOK              "extralook"
+#define P_EXTRA_LOOK_OBS          "p_lib_extralook_obs"
 #define P_INTERNAL_EXTRA_LOOK     "internal_extralook"
 
 #define P_PLAYER_LIGHT            "player_light"