EVENT-TYP
ET_DEATH - Todes-Event
BEDEUTUNG
Stirbt ein Lebewesen wird im die() der ET_DEATH-Event erzeugt. Man
kann theoretisch bestimmte Daten im Event (siehe unten) veraendern.
Praktisch sollte er aber nur dazu benutzt werden, den Tod eines
Lebwesens zu erfahren oder fuer bestimmte Items den Tod zu verhin-
dern. Globales Lauschen auf ET_DEATH ist momentan nicht erlaubt.
Veraenderung und/oder Abbrechen des Events sollte unbedingt mit
einem Erzmagier abgesprochen werden!
Der Event kann nur vom sterbenden Lebewesen selbst erzeugt werden!
DEFAULT HANDLER
/global/handler/death.c
EVENT DEFINES
/sys/events.h
/sys/death.h
EVENT DATEN
Das Event-Mapping enthaelt folgende Daten:
Key | Inhalt
---------------+----------------------------------------------------
Eintraege, die nicht veraendert werden duerfen:
E_SENDER | (object) Event-Erzeuger. (das sterbende Lebwesen)
E_DESTINATIONS | (array) Objekte, an die der Event gesandt wird. (Im
| Normalfall das aeusserste Environment)
E_COMMAND | (string) Das eingegebene Kommando (query_command())
| von this_player() das zum Tod gefuehrt hat oder 0.
E_DEATH_REASON | Der Todesgrund. Entspricht Argument 'poisondeath'
| von die(). 0 == Normaltod, 1 == Gifttod.
E_DEATH_KILLOBJ| Das toetende Objekt oder 0. Entspricht dem Argument
| 'enemy' bei do_damage() oder die(). Bei einem Gift-
| tod oder sonstigem 'Selbstmord' ist E_DEATH_KILLOBJ
| gleich E_SENDER. Soll NICHT veraendert werden oder
| nur nach Ruecksprache mit einem Erzmagier!
Eintraege, die (theoretisch) veraendert werden duerfen:
E_DEATH_MSG | Die Sterbemeldung an den Raum ("Die Fliege faellt tot
| zu Boden.") mit dem Namen des Lebwesens. Standard-
| maessig der Inhalt von P_DIE_MSG mit vorangestelltem
| Namen oder P_DC_NAME1. Existiert kein
| E_DEATH_KILLOBJ, kommt "Etwas Geheimnisvolles
| und Unbekanntes hat soeben bla...". Beim Gifttod wird
| standardmaessig " wird von Gift hinweggerafft und
| kippt um." benutzt. Als Name wird der Name oder
| P_DC_NAME1 des E_DEATH_KILLOBJ verwendet.
E_DEATH_CHMSG | (string*) Die Moerdermeldung des Lebwesens auf -M
| ({meldung, name (i.e. "Geist XXX")}) (nur NPCs).
E_DEATH_CORPSE | Der Pfad zur Leiche des Lebwesens. Wird nur verwen-
| det, wenn das Lebewesen NICHT P_NOCORPSE gesetzt
| hat.
Nach oder waehrend der Abarbeitung EVENTUELL enthalten:
E_DEATH_CRPSOBJ| Das Leichenobjekt, sofern eins erzeugt wurde oder 0
E_HANDLED | (int) Wenn gesetzt, wurde der Event ausgefuehrt.
| Der Wert ist GHOST oder DEAD (aus /sys/death.h)
E_HANDLER | (object) Der ausfuehrende Handler.
E_CANCELLED | (mixed) Wenn gesetzt, wurde der Event abgebrochen.
| Der Inhalt kann beliebig sein.
E_CANCELLER | (object) Das abbrechende Object.
SYNTAX EVENT-LAUSCHER
Siehe allgemeine Syntaxen in event_listeners(WL).
SYNTAX EVENT-SENDER
Siehe allgemeine Syntaxen in event_senders(WL).
Automatisch werden immer gesetzt:
E_SENDER, E_DESTINATION und E_COMMAND
Ziel des Events sollte immer all_environment(this_object())[<1]
sein, oder falls es das wirklich nicht gibt (???) this_object().
BESCHREIBUNG
Stirbt ein Lebewesen wird im die() P_DEAD auf -1 gesetzt. Dann wird
ein Events vom Typ ET_DEATH ausgeloest. Der Handler lauscht mit
EPRIO_DEF_HANDLE und fuehrt die Todesprozedur durch. Er setzt P_DEAD
auf 1 und markiert das Lebwesen damit als tot und die Sterbemeldung
an den Raum wird ausgegeben. Wenn P_CORPSE gesetzt war und mit
E_DEATH_CORPSE im Event mitgesandt wurde und P_NOCORPSE nicht ge-
setzt ist, wird eine Leiche geclont und das Inventar des Lebewesens
in die Leiche uebertragen. Ansonsten wird das Inventory in die Umge-
bung des Lebwesen transferiert. Dann wird im Lebewesen second_life()
aufgerufen. Bei Spielern uebernimmt second_life() das Herabsetzen
der Stats und das Ausloesen der Todessequenz. Standard-NPCs haben
kein second_life(). Returnt second_life() einen Wert != 0 wird
E_HANDLED auf GHOST (1) gesetzt. Anonsten auf DEAD (2) (das sind
Defines in /sys/death.h). Dann ist der Handler fertig. Am Ende des
Events setzt die() P_DEAD wieder auf 0. Ist E_HANDLED auf DEAD ge-
setzt und das Lebwesen ist kein Spieler, wird es destructet. NPCs
werden standardmaessig also immer destructet. P_DEAD ist fuer einen
normalen Lauscher auf ET_DEATH uninteressant!!! Die Propertie dient
nur intern dazu, nochmaliges Sterben innerhalb eines Sterbevorganges
zu verhindern. Wird der Event abgebrochen, wird P_DEAD ebenfalls auf
0 gesetzt. Setzen+Veraendern von P_DEAD ist VERBOTEN!
Objekte die mit hoeherer Prioritaet lauschen (z.B.: EPRIO_MODIFY
(700) bzw. EPRIO_CANCEL (400)), koennen VOR dem eigentlichen Sterben
Aenderungen vornehmen (Sterbemeldung manipulieren) oder den Event
ganz abbrechen (Schutzamulett).
Objekte die mit kleinerer Prioritaet (z.B.: EPRIO_REACT (-300))
lauschen, koennen NACH dem Tod entsprechend darauf reagieren. (Inv-
entar der Leiche ausrauben, Zombie aus der Leiche erzeugen).
Abbrechen oder Modifizieren der Daten ist dann aber VERBOTEN!!!
BEACHTE
Das Zerstoeren (remove(L) oder destruct(E)) des sterbenden Lebe-
wesens ist VERBOTEN! Die Lib zerstoert den NPC selbst, wenn er
gestorben ist in die(). Das 'vorzeitige' Zerstoeren fuehrt zu
Laufzeitfehlern. Das Setzen oder Veraendern von P_DEAD ist
ebenfalls VERBOTEN!
BEISPIEL
Will man einem Death-Event lauschen, um beispielsweise die Leiche
sofort im Sumpf verschwinden zu lassen, sieht das wie folgt aus
fuer einen Raum (ungetestet):
void leiche_versinkt(mapping data, string type); // Prototyp
void create() {
...
listen_event(ET_DEATH, EPRIO_REACT, #'leiche_versinkt);
...
}
void leiche_versinkt(mapping data, string type) {
object sorpse;
if(!stringp(type) || type!=ET_DEATH || !mappingp(data))
return;
if(!objectp(corpse=data[E_DEATH_CRPSOBJ])) return;
tell_room(ME, capitalize(corpse->name(WER,2))+" versinkt im "
"Sumpf.\n", ({data[E_SENDER]}) );
corpse->move("/foo/room/sumpf", M_NOCHECK);
return;
}
SIEHE AUCH
events(WL), event_types(WL), event_prioritaeten(WL), send_event(S),
listen_event(S), die(L), do_damage(L), P_DEAD, P_DIE_MSG, P_DC_NAME1,
P_GHOST, P_CORPSE, P_NOCORPSE, second_life(A)
|