Dokumentation zu: ET_GET(WL)

HR Image


EVENT-TYPEN
        ET_GET  - 'Nimm' Event
        ET_PUT  - 'Lege/Stecke' (in/auf etwas) Event
        ET_GIVE - 'Gib/Schenke/Ueberreiche' Event
        ET_DROP - 'Wegleg/Wegwerf' Event

BEDEUTUNG
        Put&Get-Events fuer Lebewesen. Aufgrund der Aehnlichkeit zu ET_GET
        erklaert diese manpage auch ET_PUT, ET_GIVE, ET_DROP.

DEFAULT HANDLER
        /global/handler/put_and_get.c

EVENT DEFINES
        /sys/events.h
        /sys/moving.h

EVENT DATEN
        Das Event-Mapping enthaelt IMMER folgende Daten:

        Key            | Inhalt
        ---------------+----------------------------------------------------
        Eintraege, die automatisch gesetzt werden (NICHT VERAENDERN!)
        E_SENDER       | (object) Event-Erzeuger. (Meist ein Lebwesen)
        E_DESTINATIONS | (array) Objekte, an die der Event gesandt wird. (Im
                       | Normalfall das aeusserste Environment, da put&get
                       | in 'Nachbarraeume' wohl nicht moeglich sein sollte)
        E_COMMAND      | (string) Das eingegebene Kommando. (das Verb)

        Moving-Daten, die veraendert werden duerfen:
        E_MOVE_OBJ     | (object) Die zu bewegende Sache.
        E_ACTOR        | Das agierende Lebewesen. Also das Lebwesen, was die
                       | Bewegung des Objekts bewirkt. Also z.B. der Spieler
                       | der etwas weglegt usw. E_ACTOR kann benutzt werden,
                       | um Meldungen an den Spieler auszugeben, wenn er etwa
                       | tut. (Vorausgesetzt es ist richtig gesetzt)
        E_MOVE_SOURCE  | (object) Die Umgebung des Objekts vor der Bewegung.
        E_MOVE_DEST    | (object) Dahin soll die Sache gelegt/gegeben/ge-
                       | nommen werden.
        E_MOVE_METHOD  | (int) Wenn gesetzt, zusaetzliche Move-Methoden.
        E_MOVE_RVALUE  | (int) Enthaelt den Returnwert des move()-Aufrufs
                       | mit der Methode M_NOEVENT.

        Nach oder waehrend der Abarbeitung EVENTUELL enthalten:
        E_HANDLED      | (int) Wenn gesetzt, wurde der Event ausgefuehrt.
                       | Der Wert entspricht dem Returnwert von obj->move().
        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.
        E_MOVE_RVALUE  | (int) Enthaelt den Returnwert des move()-Aufrufs
                       | mit der Methode M_NOEVENT. Enthaelt nur einen Wert,
                       | wenn der Event nicht abgebrochen wurde!

EVENT-LAUSCHER
        Siehe allgemeine Syntaxen in event_listeners(WL).

EVENT-SENDER
        Siehe allgemeine Syntaxen in event_senders(WL). Gesendet werden
        muessen mindestens:
        E_MOVE_OBJ, E_ACTOR (soll nur weggelassen werden, wenn ein Objekt
        wirklich 'aus dem Nichts' kommen soll), E_MOVE_SOURCE, E_MOVE_DEST

        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
        Die Put&Get-Events werden normalerweise im move() des zu bewegenden
        Objekts erzeugt, wenn sie mit einer Movemethode (M_GET, M_DROP,
        M_PUT, M_GIVE) und NICHT mit M_NOEVENT und/oder M_NOCHECK bewegt
        werden.

        Der Event geht mit Prioritaet EPRIO_DEF_HANDLE (0) an den Default-
        Handler (siehe oben). Dieser macht dann das eigentliche Geben oder
        Nehmen usw. indem er wiederum das move() des Objekts aufruft mit
        M_NOEVENT, um Rekursionen zu vermeiden. Der Returnwert dieses
        move() wird in E_MOVE_RVALUE gespeichert.

        Objekte die mit hoeherer Prioritaet lauschen (z.B.: EPRIO_MODIFY 
        (700) bzw. EPRIO_CANCEL (400)), koennen VOR dem Bewegen Modifizie-
        rungen vornehmen (Lostrommel *grins*) oder den Event ganz abbrechen
        (Falle). Wird der Event abgebrochen, bevor der Handler ihn
        abarbeiten kann, ist E_MOVE_RVALUE nicht gesetzt!

        Objekte, die mit kleinerer Prioritaet (z.B.: EPRIO_REACT (-300)) 
        lauschen, koennen NACH dem Bewegen entsprechend auf die Bewegung
        reagieren. Abbrechen oder Modifizieren der Daten ist dann aber
        VERBOTEN.

VERALTETE FUNKTIONALITAETEN
        Die Put&Get-Events sollen, wenn immer es geht, statt folgendem ver-
        wendet werden:

        1. Die MOVE-HOOKS.
        2. Aufruf von LeaveMe().
        3. Aufruf von PreventInsert().

BEISPIEL
        Will man in einem Raum einem GET-Event lauschen, um dem Spieler mit
        10% auf die Finger zu klopfen, wenn er eine Fackel nimmt, sieht das
        wie folgt aus:

        void finger_klopfen(mapping data, string type); // Prototyp

        void create() {
            ...
            // fuer das reine Abbrechen des Events:
            listen_event(ET_GET, EPRIO_CANCEL, #'finger_klopfen);
            // wenn wir der Abbrecher waren, wollen wir noch was tun:
            listen_event(ET_GET, EPRIO_C_HANDLE, #'finger_klopfen);
            ...
        }

        void finger_klopfen(mapping data, string type) {
            object opfer, fackel;

            if(!mappingp(data) || !living(opfer=data[E_ACTOR]) ||
              !objectp(fackel=data[E_MOVE_OBJ] || !fackel->id("fackel")))
                return;

            switch (prio)
            {
                case EPRIO_CANCEL: // nur abbrechen
                    if(random(100)>9) return; // nur in 10% der Faelle
                    cancel_event();
                    break;
                // Erst wenn wir sicher sind, dass wir auch wirklich der 
                // Abbrecher waren (koennten ja noch andere Objekte 
                // versuchen), geben wir den Text aus und verbrennen
                // den Spieler ;-) 
                // (Den Event mit EPRIO_C_HANDLE bekommt im Gegensatz zum
                // EPRIO_C_REACT _nur_ das abbrechende Objekt)
                case EPRIO_C_HANDLE:
                    tell_object(opfer, "Du verbrennst Dir Deine Fingerchen.\n");
                    opfer->reduce_hit_point(10); // Weh tun muss es B->
            }
            return;
        }

SIEHE AUCH
        move(L), events(WL), event_types(WL), event_prioritaeten(WL),
        listen_event(S)


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