Dokumentation zu: ET_DEATH(WL)

HR Image


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)


Start » Magierhandbuch » Docu » Konzepte » ET_DEATH Letzte Generierung: 25.04.2021, 01:58
Email an: mud@wl.mud.de
Valid HTML 4.01!