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