blob: 9166150221f539a3cbe467452e3f1fd00ea7a8f5 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001NotifyPlayerDeath()
2
3FUNKTION:
4 void NotifyPlayerDeath(object victim,object killer,int lost_exp);
5
6DEFINIERT IN:
7 /std/player/life.c
8
9ARGUMENTE:
10 victim
11 Getoeteter Spieler.
12 killer
13 Objekt, welches den Spieler getoetet hat.
14 lost_exp
15 Erfahrungspunkte, die der Spieler durch den Tod verloren hat.
16
17BESCHREIBUNG:
18 Diese Funktion wird aus dem Spielerobjekt heraus immer dann
19 aufgerufen, wenn der Spieler stirbt und zwar:
20 1) im Gegner, der den Spieler getoetet hat,
21 2) im Environment des getoeteten Spielers,
22 3) in der Gilde des Spielers,
23 4) in allen Objekten in diesem Environment und
24 5) in allen Objekten (auch innerhalb Containern) im Spieler.
25 Der Gegner wird hierbei nur einmal informiert, also bei letzteren
26 Faellen herausgefiltert, falls noetig!
27 Hauptaufgabe dieser Funktion ist es somit, auf Tode von Spielern zu
28 reagieren oder selbige einfach nur mitzuloggen.
29
30 Zu dem Zeitpunkt des Aufrufs dieser Funktion ist der Spieler noch _nicht_
31 Geist und noch _nicht_ im Todesraum - dies wird im Anschluss an den Aufruf
32 der NotifyPlayerDeath() durchgefuehrt.
33
34 Aufgerufen wird die Funktion aus '/std/player/life.c' mittels catch() und
35 werden mit limited() auf max. 150k (Gegner, Environment, Gilde) bzw. 80k
36 (alle anderen Objekte) Ticks beschraenkt.
37 Fehler in dieser Funktion haben somit keine negativen Auswirkungen
38 auf das Sterben des Spielers.
39
40RUeCKGABEWERT:
41 keiner
42
43BEISPIELE:
44 Folgendes Beispiel demonstriert beispielsweise, wie man Tode von
45 Spielern mitloggen kann (das Beispiel ist hierbei auf den am
46 haeufigsten auftretenden Fall bezogen, dass nur das toetende Objekt
47 den Tod protokollieren soll):
48
49 void NotifyPlayerDeath(object dead, object killer, int lost_exp)
50 {
51 if ( intp(lost_exp) && objectp(dead) && objectp(killer) &&
52 killer==this_object() )
53 write_file( "/log/patryn/dead", sprintf(
54 "%s - %s von %s getoetet. XP: -%d", ctime(), getuid(dead),
55 killer->name(WEM), lost_exp) );
56 }
57
58 Bitte beachten: write_file() schreibt ohne Groessenbegrenzung in das
59 Logfile. Da dies auf Dauer bzw. in Gebieten mit hoher Log-Aktivitaet
60 zu Logfiles von enormer Groesse fuehren kann, ist die Verwendung
61 von write_file() nicht empfehlenswert. Ausnahmen koennen natuerlich
62 mit dem zustaendigen Regionsmagier abgesprochen werden, z.B. fuer
63 begrenzte Anwendung etwa bei sehr starken, selten besiegten Gegnern.
64
65 Weiterhin ist es empfehlenswert, das toetende Objekt (killer) nicht
66 im NotifyPlayerDeath() zu zestoeren, sondern etwas zeitversetzt,
67 damit nicht etwa im nachfolgenden NotifyPlayerDeath() eines anderen
68 Objektes (s.o. Reihenfolge) killer==0 ist.
69
70SIEHE AUCH:
71 Defend(), do_damage(), NotifyHpChange(), catch(), write_file(), log_file()
72 P_LAST_DEATH_PROPS
73----------------------------------------------------------------------------
7424.03.2012, Zesstra