RemoveSensitiveObject()
=======================

FUNKTION
--------
::

     void RemoveSensitiveObject(object ob)

DEFINIERT IN
------------
::

     /std/container/inventory.c
     generalizes /std/living/inventory.c

ARGUMENTE
---------
::

     ob - zu entfernendes Objekt

BESCHREIBUNG
------------
::

     Entfernt ob aus den Benachrichtigungslisten des Containers.
     Wird von thing/moving.c im alten Environment gerufen, wenn
     P_SENSITIVE gesetzt ist.
     Ruft dazu RemoveSensitiveObjectFromList().

BEMERKUNGEN
-----------
::

     Setzt man P_SENSITIVE nicht als Default sondern situationsabhaengig,
     dann muss man auch RemoveSensitiveObject im Environment
     auch selbst rufen!

BEISPIEL
--------
::

     // Fackel (inheriting lightsource)
     void create() {
     ...
       SetProp(P_SENSITIVE,
        ({({SENSITIVE_INVENTORY_TRIGGER,DT_FIRE,120})}));
     ...
     }

     // wenn die Fackel geloescht wird, verliert sie ihre aktive
     // Eigenschaft und muss das dem environment() mitteilen
     static int extinguish(string str) {
      int i;
      i=::extinguish(str);
      if(i && QueryProp(P_LIGHT)<=0) {
       SetProp(P_SENSITIVE,0);
       if(environment())
        environment()->RemoveSensitiveObject(this_object());
      }
      return i;
     }

     - empfindliche Objekte wie Eiszapfen koennen jetzt wieder gefahrlos
       in das selbe environment() bewegt werden

SIEHE AUCH
----------
::

     P_SENSITIVE
     InsertSensitiveObject
     insert_sensitive_inv_trigger, insert_sensitive_inv
     P_SENSITIVE_ATTACK, P_SENSITIVE_INVENTORY, P_SENSITIVE_INVENTORY_TRIGGER
     CheckSensitiveAttack

25.Apr.2001, Gloinson@MG

