
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
