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
