give_notify()
FUNKTION:
     void give_notify(object obj);

DEFINIERT IN:
     /std/npc/put_and_get.c

ARGUMENTE:
     obj
       an den NPC uebergebenes Objekt
RUeCKGABEWERT:
     keiner

BESCHREIBUNG:
     Diese Funktion wird automatisch immer dann aufgerufen, wenn ein
     Lebewesen (welches kein Spielercharakter ist) ein Objekt uebergeben
     bekommt. Dies muss jedoch ueber die Funktionalitaet von
     put_and_get.c geschehen sein, innerhalb von move() wird die Funktion
     nicht aufgerufen!

BEISPIEL:
     Oftmals will man in Quests erreichen, dass einem NPC ein bestimmtes
     Item als Beweis der Erfuellung einer bestimmten Aufgabe ueberbracht
     wird. Folgendermasse kann dies realisiert werden:
     void create() {
       ::create();
       ...
       SetProp(P_REJECT,({REJECT_GIVE,
         Name(WER)+" sagt: Das brauche ich nicht!\n"}));
       ...
     }

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

     void give_notify(object obj) {
       if(obj->id("\nquestitem")) // Questitem bekommen?
         quest_ok(obj);
       else
         ::give_notify(obj);  // P_REJECT soll sonst greifen
     }
     Der Aufruf von ::give_notify() stellt sicher, dass ein Objekt
     zurueckgegeben wird, sofern es nicht das gesuchte ist. Erreicht wird
     dies ueber P_REJECT (siehe Bemerkungen).

BEMERKUNGEN:
     Speziell in NPCs ist diese Funktion normalerweise dafuer
     verantwortlich, dass mittels der Property P_REJECT die Annahme von
     Objekten verweigert werden kann. Ueberschreibt man sie, so sollte
     man gegebenenfalls darauf achten, dass diese Standardfunktion
     ebenfalls aufgerufen wird.

SIEHE AUCH:
     P_REJECT, show_notify(), 
     /std/npc/put_and_get.c, /std/living/put_and_get.c

22. Oktober 2013, Arathorn.
