
AddInsertHook()
***************

********************* OBSOLETE LFUN
*********************************** * Diese Efun bitte nicht mehr
benutzen, sondern stattdessen die       * * Hooks (s. /doc/std/hooks).
* *******************************************************************
**** AddInsertHook()


FUNKTION
========

   void AddInsertHook(object ob);


DEFINIERT IN
============

   /std/player/restrictions.c


ARGUMENTE
=========

   ob - Das Objekt, das informiert werden soll, wenn ein Objekt dem
        Spielerinventar hinzugefuegt wurde.


BESCHREIBUNG
============

   (Diese Funktionalitaet wurde ersetzt durch den allgemeinen Hook
    H_HOOK_INSERT und ist nur noch aus Gruenden der Kompatibilitaet
    vorhanden.)

   Diese Funktion wird im Spielerobjekt aufgerufen, um das Objekt ob als
   Hook-Listener anzumelden. Auf diese Weise eingetragene Listener
   werden informiert, wenn ein Objekt ins Spielerinventar bewegt wurde.
   Technisch wird die Bewegung ueber NotifyInsert() im Spielerobjekt
   detektiert, und im Listener-Objekt wird die Funktion InsertNotify()
   gerufen, die als Parameter das neu ins Spielerinventar bewegte Objekt
   uebergeben bekommt.


RUeCKGABEWERT
=============

   keiner


BEMERKUNGEN
===========

   Das Listener-Objekt muss sich ebenfalls im Spielerinventar befinden,
   ansonsten wird der eingetragene Hook wieder geloescht.


BEISPIEL
========

   a) Objekt "ob" wird im Spieler als Listener angemeldet:
      this_player()->AddInsertHook(ob);

   b) Objekt "new" wird ins Spielerinventar bewegt, das Spielerobjekt
      informiert "ob" darueber:
      ob->InsertNotify(new);

   c) Das Listener-Objekt "ob" reagiert darauf, z.B. indem es die Fackel
      loescht, sofern sie vorher brannte:
      void InsertNotify(object new) {
        if ( objectp(new) && new->id("\nfackel") &&
             new->QueryProp(P_LIGHTED) )
          new->unlight();
        return;
      }


SIEHE AUCH
==========

   NotifyInsert(), RemoveInsertHook(), QueryInsertHooks()

Last modified: 14.04.2010, Arathorn
