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)
|