KONZEPT
Event Prioritaeten
AUTOR
Holger@Wunderland
BEDEUTUNG
Wichtig fuer ein funktionierendes Event-System ist eine sinnvolle
Verwendung der Prioritaeten der Lauscher. (Das heisst, je hoeher
die Prioritaet eines Lauschers ist, desto eher wird er abgearbeitet.)
Die Prioritaeten haben nichts mit Macht oder Staerke eines Objektes
zu tun, sondern sollten mit der Realitaet korrespondieren! Es gibt
grundsaetzlich 4 Arten von Lauschern fuer einen Event:
1.) Veraenderer
Diese Lauscher modifizieren den Event. Zum Beispiel ein Bein-
steller veraendert den Zielraum eines 'Move-Events' oder ein
Chinesenhut vertauscht alle 'r' in einem 'Sag-Event' mit 'l'.
2.) Abbrecher
Diese Lauscher brechen einen Event ganz ab. Zum Beispiel ein
Sperrmonster in einem Raum bricht alle 'Move-Events' eines
Lebewesens ab, die einen bestimmten Ausgang benutzen wollen.
3a.) Handler
Der oder die Handler fuehren die eigentliche Aktion des Events
aus. In aller Regel sind dies MUDlib interne Objekte. Z.B. ein
Move-Handler.
3b.) C-Handler
Wenn das Ereignis abgebrochen wurde wird natuerlich nicht der
normale Handler aufgerufen, da hierdurch zB die Bewegnung
stattfinden wuerde. Manchmal moechte man aber auch bei einem
Abbruch eine Aktion starten (zB ein beinstellender Npc lacht),
dies kann man mit einem C-Handler machen. Achtung, es wird immer
nur das Objekt welches auch das Ereignis abbrach als C-Handler
benutzt.
4a.) Reagierer
Ein Reagierer fuehrt seine Aktion aus, wenn der Event schon
verarbeitet wurde. Zum Beispiel, wenn ein Lebewesen einen Raum
betreten hat und der Reagierer sich daraufhin verneigen soll.
Dazu gehoeren auch Funktionen, die einfach nur zur Benach-
richtigung ueber den Event dienen, ohne fuer Spieler sichtbare
Handlungen auszuloesen (notifier).
4b.) C-Reagierer
Diese Reagierer koennen wiederum auf abgebrochene Ereignisse
reagieren, so zum Beispiel ein Npc der stoehnt, wenn der
Schluessel eines Spielers im Tuerschloss abgebrochen ist.
Es macht keinen Sinn, einem Reagierer eine positive Prioritaet zu
geben, denn moeglicherweise will ein anderes Objekt den Event noch
abbrechen. Um die Objekte der Magier untereinander zu koordinieren,
muesse Listen angelegt werden, in denen vermerkt ist, welcher Objekt
mit welcher Prioritaet einem Event lauscht.
STANDARD
Die Standard-Prioriaeten sehen wie folgt aus. Innerhalb der Grenzen
dieser Vorgaben sollte jedes Objekt eines bestimmten Typs liegen!
999 <= Abbrecher/Veraenderer <= 200
199 <= Handler <= 1 (0 == Default Handler)
Default Handler == 0
-1 <= Reagierer <= -999
C-Handler == -10000 (immer nur das Abbrecher-Obj)
-10001 <= C-Reagierer <= -10999
Es gibt in /sys/events.h einige Defines, die bestimmte Prioritaeten
vorschlagen und die als Ausgangspunkt fuer die eigne Prioritaet
benutzt werden sollten.
EPRIO_MODIFY 700 - Prioritaet fuer Modifizierer
EPRIO_CANCEL 400 - Prioritaet fuer Abbrecher
EPRIO_HANDLE 100 - Prioritaet fuer einen Handler
EPRIO_DEF_HANDLE 0 - Prioritaet fuer System-Handler
EPRIO_REACT (-300) - Prioritaet fuer Reagierer
EPRIO_NOTIFY (-999) - Prioritaet fuer Benachrichtigungen
EPRIO_C_HANDLE (-10000) - Prioritaet fuer den Abbruch-Handler
EPRIO_C_REACT (-10300) - Prioritaet fuer Abbruch-Reagierer
Nuetzlichstes Hilfsmittel beim Finden einer 'vernuenftigen' Prio-
ritaet ist eine Liste /doc/WL/events/prio_liste die immer auf
aktuellem Stand gehalten werden sollte. Jeder Magier ab Level 30
kann diese Liste ergaenzen. Fuer Regions/Erzmagier sollte es
selbstverstaendlich sein.
BEACHTE
Es ist wichtig, dass ein Lauscher auch wirklich nur das tut, was man
von ihm 'erwartet'. Super-Mega-Magie-Schilde, die mit Prioritaet 999
lauschen und alles abfangen, was nach Magie aussieht, sind schlicht
ueberfluessig und unrealistisch. Es gilt hierfuer das gleiche wie
fuer Waffen&Ruestungen (Augenmass!).
Weiterhin ist es eminent wichtig, dass Modifizierer und Abbrecher
wirklich nichts weiter tun als das Ereignis zu beeinflussen. Ins
besondere sollen sie weder etwas Ausgeben noch Aktionen oder Events
starten! Auch das setzen eines notify_fail()s ist nicht erwuenscht
(Abbruchgruende koennen als Argument von cancel_event() uebergeben
werden). Moechte man mehr als einen Text als Abbruchbegruendung oder
Abbruchreaktion, so muss das abbrechende Objekt EPRIO_C_HANDLE
lauschen und darf nur dort (!) die gewuenschten Dinge durchfuehren.
SIEHE AUCH
events(WL), prio_liste(WL)
|