Dokumentation zu: ET_DOOR(WL)

HR Image


EVENT-TYPEN:
        ET_DOOR_OPEN                fuer den Tuer-Oeffnungs-Event
        ET_DOOR_CLOSE               fuer den Tuer-Schliess-Event
        ET_DOOR_LOCK                fuer den Tuer-Abschliess-Event
        ET_DOOR_UNLOCK              fuer den Tuer-Aufschliess-Event

BEDEUTUNG:
        Primaere Events fuer das Oeffnen und Schliessen der Tueren. 
        Aufgrund der Aehnlichkeit von ET_DOOR_OPEN, ET_DOOR_CLOSE,
        ET_DOOR_LOCK und ET_DOOR_UNLOCK steht diese Manpage fuer 
        alle vier Events.

EVENT DEFINES
        /sys/events.h
        /sys/doors.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 das Lebewesen)
        E_DESTINATIONS | (array) Objekte, an die der Event gesandt wird. (Im
                       | Normalfall der Start- und Zielraum)
        E_COMMAND      | (string) Das eingegebene Kommando. (Der Ausgang)
                       | Kann auch 0 sein! (siehe Manpage zu query_command()

        Eventdaten, die veraendert werden duerfen:
        E_DOOR	       | Kommando zum Durchschreiten der Tuer 
        E_DOOR_ACTOR   | Das agierende Lebewesen. Achtung, kann
                       | auch 0 sein! Veraenderung mit
                       | Erzmagier absprechen!
        E_DOOR_DEST    | Raum, in den die Tuer fuehrt (Zielraum)
        E_DOOR_ROOM    | Raum, in dem die Tuer ist (Startraum)
        E_DOOR_MSGS    | 3-teiliges Array, wenn es mittels SetDoorEventMsgs
                       | gesetzt wurde
        E_DOOR_KEY     | wird nur bei ET_DOOR_UNLOCK gesendet

        Nach oder waehrend der Abarbeitung EVENTUELL enthalten:
        E_HANDLED      | (int) Wenn 1 wurde der Event erfolgreich gehandelt.
        E_HANDLER      | (object) Der ausfuehrende Handler.
        E_CANCELLED    | (mixed) Wenn gesetzt, wurde der Event abgebrochen.
                       | Der Inhalt sollte immer 1 sein.
        E_CANCELLER    | (object) Das abbrechende Object.
        

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

EVENT-SENDER
        Siehe allgemeine Syntaxen in event_senders(WL). Gesendet werden
        muessen mindestens:
        E_DOOR, E_DOOR_ROOM, E_DOOR_DEST

        Zusaetzlich kann auch E_DOOR_MSGS und bei ET_DOOR_UNLOCK 
        E_DOOR_KEY gesendet werden.
        
        Automatisch werden immer gesetzt:
        E_SENDER, E_DESTINATION und E_COMMAND

        Ziel des Events sollte immer der Startraum und der Zielraum sein,
        bzw. deren aeusserstes Environment, falls sich ein Raum in einem
        anderen Raum befindet. (all_environment(raum)[<1])

BESCHREIBUNG
        

BEMERKUNG
        Wenn ein Door-Event abgebrochen wird (z.B. ET_DOOR_OPEN) muss ein 
        notify_fail angegeben werden, um die Standardfehlermeldung 
        "Hier ist kein 'tuer', was Du oeffnen koenntest." zu unterdruecken.

BEISPIEL
        Will man in einem Raum mit einer Tuer einem UNLOCK-Event lauschen, 
        um den Schluessel dabei mit 10% Wahrscheinlichkeit abbrechen zu
        lassen, sieht das wie folgt aus:

        #include <doors.h>
        #include <events.h>

        // Prototyp
        void receive_event(mapping data, string type, int prio, int mode); 

        void create() 
        {
           AddDoor("norden", "/doc/beispiele/doors/raum_b", DS_OPEN,
              DF_AUTO_OPEN|DF_LOCKABLE|DF_UNBREAKABLE|DF_LOCK_ALWAYS,   
              ([ P_NAME     : "Gartentor",
                 P_NAME_ADJ : "knarrend",
                 P_DESCR    : "nach Norden",
                 P_LONG     : "Eine @@es Gartentor welches wieder "
                              "nach Norden fuehrt.",
                 P_GENDER   : NEUTER,
                 P_ARTICLE  : ART_AUTO,
                 P_IDS      : ({"tor","gartentor"})]));
        
            ...
            listen_event(ET_DOOR_UNLOCK, EPRIO_REACT, #'receive_event);
            ...
        }

        void receive_event(mapping data, string type, int prio, int mode) 
        {
           object schluessel, spieler;

            if(!mappingp(data) || !living(spieler=data[E_DOOR_ACTOR]))
                return;
            if (!objectp(schluessel = data[E_DOOR_KEY])) return;
            
            if (random(100)<101) 
            {
                tell_object(spieler, break_string(
                  "So ein Pech aber auch! Jetzt ist Dir der Schluessel "
                  "im Schloss abgebrochen."));
                tell_room(data[E_DOOR_ROOM], break_string(
                  "Es knackt. Der Schluessel scheint im Schloss stecken"
                  "geblieben und abgebrochen zu sein."), ({spieler}));
                // Schluessel zerstoeren
                schluessel->remove(1);
                // Tuer ist nicht mehr abschliessbar
                SetDoorFlags("norden", DF_AUTO_OPEN|DF_UNBREAKABLE);
                // dass die Tuer 2 Seiten hat, lass ich bei diesem 
                // Beispiel unberuecksichtigt
            }
         }

         // der Handwerker kommt und repariert die Tuer
         void reset()
         {
             ::reset();
             SetDoorFlags("norden", 
                DF_AUTO_OPEN|DF_LOCKABLE|DF_UNBREAKABLE|DF_LOCK_ALWAYS);
             tell_room(this_object(), 
                "Ein Handwerker kommt herein und repariert das "
                "Torchloss.\n", ({}));
         }

SIEHE AUCH
        doors, events(WL), event_types(WL), event_prioritaeten(WL),
        listen_event(S), AddDoor(L), QueryPathDoor(L),
        QueryDoorLong(L), QueryAllDoorLong(L), QueryDoorStatus(L),
        SetDoorStatus(L), QueryDoorFlags(L), SetDoorFlags(L), 
        QueryDoorProp(L), SetDoorProp(L), SetDoorEventMsgs(L),
        QueryDoorEventMsgs(L), QueryDoorName(L)


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