show_notify()
=============

show_notify()

FUNKTION
--------
::

     void show_notify(object obj)

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

     beliebigen Objekten

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

     obj - dem Lebewesen gezeigtes Objekt

RUeCKGABEWERT
-------------
::

     keiner

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

     Diese Funktion wird automatisch immer dann aufgerufen, wenn einem
     Lebewesen (welches kein Spielercharakter ist) ein Objekt gezeigt wird.
     Will das Lebewesen auf so etwas reagieren, ist das Implementieren dieser
     Funktion der einfachste Weg.

     Dies funktioniert nur dann, wenn der Standardbefehl der Spielershell
     verwendet wird ("zeige <name> <gegenstand>"). Selbstgebautes "zeige"
     funktioniert nicht.

BEISPIEL
--------
::

     Oftmals will man in Quests erreichen, dass einem NPC ein bestimmtes
     Item als Beweis der Erfuellung einer bestimmten Aufgabe vorgezeigt
     wird. Folgendermassen kann dies realisiert werden:

     void quest_ok(object obj) { ...
       // z.B. Vernichtung des Questobjektes und Questtexte
       // Questbelohnung und Questanerkennung, etc.
     }

     void show_notify(object obj) {
       if(obj->id("\nquestitem")) // Ist das das geforderte Questobjekt?
         quest_ok(obj);
     }

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

     Da es nur um das Vorzeigen von Gegenstaenden geht, die nicht den 
     Besitzer wechseln, sind Mechanismen wie P_REJECT in diesem Fall 
     nicht erforderlich.

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

     give_notify(), /std/npc/put_and_get.c, /std/living/put_and_get.c

04.02.2020 Zesstra

