NotifyPlayerDeath()
*******************


FUNKTION
========

   void NotifyPlayerDeath(object victim,object killer,int lost_exp);


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

   /std/player/life.c


ARGUMENTE
=========

   victim
      Getoeteter Spieler.

   killer
      Objekt, welches den Spieler getoetet hat.

   lost_exp
      Erfahrungspunkte, die der Spieler durch den Tod verloren hat.


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

   Diese Funktion wird aus dem Spielerobjekt heraus immer dann
   aufgerufen, wenn der Spieler stirbt und zwar:

      1. im Gegner, der den Spieler getoetet hat,

      2. im Environment des getoeteten Spielers,

      3. in der Gilde des Spielers,

      4. in allen Objekten in diesem Environment und

      5. in allen Objekten (auch innerhalb Containern) im Spieler.

   Der Gegner wird hierbei nur einmal informiert, also bei letzteren
   Faellen herausgefiltert, falls noetig! Hauptaufgabe dieser Funktion
   ist es somit, auf Tode von Spielern zu reagieren oder selbige
   einfach nur mitzuloggen.

   Zu dem Zeitpunkt des Aufrufs dieser Funktion ist der Spieler noch
   _nicht_ Geist und noch _nicht_ im Todesraum - dies wird im
   Anschluss an den Aufruf der NotifyPlayerDeath() durchgefuehrt.

   Wenn ein Spieler an Gift stirbt, gibt es kein Killerobjekt - in dem
   Fall ist <killer> 0. (P_KILLER im Opfer ist in diesem Fall "gift".)

   Aufgerufen wird die Funktion aus '/std/player/life.c' mittels
   catch() und werden mit limited() auf max. 150k (Gegner,
   Environment, Gilde) bzw. 80k (alle anderen Objekte) Ticks
   beschraenkt. Fehler in dieser Funktion haben somit keine negativen
   Auswirkungen auf das Sterben des Spielers.


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

   keiner


BEISPIELE
=========

   Folgendes Beispiel demonstriert, wie man Tode von Spielern
   mitloggen kann (das Beispiel ist hierbei auf den am haeufigsten
   auftretenden Fall bezogen, dass nur das toetende Objekt den Tod
   protokollieren soll):

      void NotifyPlayerDeath(object dead, object killer, int lost_exp)
      {
        if ( intp(lost_exp) && objectp(dead) && objectp(killer) &&
             killer==this_object() )
          write_file( "/log/patryn/dead", sprintf(
            "%s - %s von %s getoetet. XP: -%d", ctime(), getuid(dead),
             killer->name(WEM), lost_exp) );
      }

   Bitte beachten: write_file() schreibt ohne Groessenbegrenzung in
   das Logfile. Da dies auf Dauer bzw. in Gebieten mit hoher Log-
   Aktivitaet zu Logfiles von enormer Groesse fuehren kann, ist die
   Verwendung von write_file() nicht empfehlenswert. Ausnahmen koennen
   natuerlich mit dem zustaendigen Regionsmagier abgesprochen werden,
   z.B. fuer begrenzte Anwendung etwa bei sehr starken, selten
   besiegten Gegnern.

   Weiterhin ist es empfehlenswert, das toetende Objekt (killer) nicht
   im NotifyPlayerDeath() zu zestoeren, sondern etwas zeitversetzt,
   damit nicht etwa im nachfolgenden NotifyPlayerDeath() eines anderen
   Objektes (s.o. Reihenfolge) killer==0 ist.


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

   Defend(), do_damage(), catch(), write_file(), log_file()
   P_LAST_DEATH_PROPS

04.04.2020, Zesstra
