FUNKTION
varargs mapping send_event(string type, mapping data, mixed dest,
int mode)
ARGUMENTE
type - der Event-Typ als String (event_types(WL))
data - die Event-Daten als Mapping (event_types(WL))
dest - Objekt oder Array aus Objekten oder String oder Array aus
Strings oder Array gemischt aus Strings und Objekten, an
die der Event gesendet werden soll. Strings stellen in
dem Falle die Pfadnamen der Zielobjekte dar und werden
vorm Senden automatisch gesucht oder geladen mittels
load_object(). Globale Lauscher oder Default-Handler
muessen nicht angegeben werden. (automatisch)
Alle Objekte im deep_inventory() von dest erhalten den
Event, wenn sie ihm lauschen.
mode - Ein Sende-Modus. Wird kein Modus angegeben, wird EM_SIMPLE
benutzt. In /sys/events.h sind definiert:
EM_SIMPLE - Standard Modus - maximale Performance
EM_COPY - einfache Kopie des Daten-Mappings
EM_DEEP_COPY - echte Kopie des Daten-Mappings
EM_NO_MODIFY - macht genau das gleiche wie EM_DEEP_COPY. Ein
Modifizieren der Event-Daten ist dadurch un-
moeglich.
EM_NO_CANCEL - der Event kann durch niemanden abgebrochen
werden. cancel_event() returnt 0.
EM_FAKE - Simuliert den Event nur intern im Daemon
interessant i.V.m. EM_DEBUG, um alle Lauscher
auf einen Event zu finden
Einer der vorhergehenden Modi kann kombiniert werden mit:
EM_COMPLEX - Mehr Daten in E_RECEIVERS
EM_DEBUG - maximale Infos in E_DEBUG_INFO
EM_STOP_CANCEL - 'spekulative Ausfuehrung', siehe hierzu
auch event_senders(WL)
RÜCKGABEWERT
mapping - Das Daten-Mapping NACH abgearbeitetem Event mit ggf. ver-
aenderten Daten. Zum debuggen interessant, oder um zu er-
fahren, ob alles so geklappt hat, wie gewuenscht.
0 - schwerer Argumentfehler
BESCHREIBUNG
Kernfunktion zum Event-Senden. Es wird ein Event 'type' mit den
Event-Daten 'data' erzeugt. Alle Objekte im deep_inventory() von
'dest' und natuerlich die 'dest' selbst koennen den Event empfangen,
wenn sie ihm lauschen. Wie der Event gesendet wird, haengt mass-
geblich von 'mode' ab. Gewoehnlich wird EM_SIMPLE verwendet. Dann
erhalten die Lauscher das Daten-Mapping als volle Referenz und
koennen so die Daten relativ einfach veraendern. Fuer mehr sicher-
heitsbeduerftige Events wird eher EM_COPY oder EM_DEEP_COPY in Frage
kommen. EM_FAKE oder in Kombination mit EM_COMPLEX und EM_DEBUG sind
zum Debuggen und Event-Entwicklung nuetzlich. Welche Daten versandt
werden ist bei jedem Event unterschiedlich.
Um alle Lauscher eines Events zu finden, ohne den Event wirklich
auszufuehren, empfiehlt sich: modus=(EM_FAKE|EM_DEBUG). Dann steht
im Daten-Mapping in E_DEBUG_INFO eine Alist mit folgendes Werten:
({ Prios, Closures, Kosten }) (Kosten ist bei EM_FAKE nat. immer 0);
BEACHTE
Events koennen zu Rekursionen fuehren. Es kann also passieren, dass
2 sich gegenseitig ausloesende Events eine Endlosschleife bilden.
Daran sollte man beim Versenden denken...
BEISPIEL
Will man in einem Raum einen GO-Event senden, wenn der Spieler
'keller' eingibt, sieht das wie folgt aus:
mapping result;
string zielraum; // Der Zielraum als String
result = send_event(ET_GO,
([ E_MOVE_OBJ : this_player(),
E_MOVE_DEST : zielraum,
E_MOVE_MSGS :
({"Du steigst in den Keller.",
"&Name steigt in den Keller.",
"&Name kommt herab."})
]), ({ this_object(), zielraum }) );
Danach wird der Event wie ein normaler GO-Event behandelt, wie ihn
die MUDlib selbst auch ausloest. result[E_HANDLED] ist auf ME_OK
oder ME_SILENT gesetzt, wenn alles geklappt hat.
SIEHE AUCH
listen_event(S), unlisten_event(S), set_global_listener(S),
cancel_event(S), handle_event(S), events(WL), event_senders(WL),
event_prioritaeten(WL), event_types(WL)
|