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