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.

  

  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(), NotifyHpChange(), catch(), write_file(), log_file()
  P_LAST_DEATH_PROPS

24.03.2012, Zesstra

