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):

  .. code-block:: pike

    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
----------

  :doc:`Defend`, :doc:`do_damage`,
  :doc:`../efun/catch`, :doc:`../efun/write_file`, :doc:`../sefun/log_file`
  :doc:`../props/P_LAST_DEATH_PROPS`

04.04.2020, Zesstra

