
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 beispielsweise, 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(), *../efun/catch*, *../efun/write_file*,
   log_file() P_LAST_DEATH_PROPS

04.04.2020, Zesstra
