OBJEKT:
NOTIFIER (definiert in service.h)
BESCHREIBUNG:
Der Notifier ermoeglicht die (asynchrone) Benachrichtigung von
Objekten wenn bestimmte abstrakte Ereignisse auftreten. Beim
Notifier angemeldete Objekte werden dann von einem solchen Ereignis
durch Aufruf einer Funktion in Kenntnis gesetzt.
Die Ereignisse sind:
* SENS_LOGIN Einloggen eines Spielers
* SENS_LOGOUT Ausloggen eines Spielers
* SENS_DELETE Selbstloeschung eines Spielers
* SENS_DEATH Tod eines beliebigen Lebewesens
* SENS_FULL_HOUR Eine volle Stunde wurde erreicht
* SENS_GUILD_JOIN Jemand ist einer Gilde beigetreten
* SENS_GUILD_LEAVE Jemand hat eine Gilde verlassen
* SENS_ADVANCE Jemand hat etwas erhoeht (z.B. Level)
Da bei jedem Ereignis alle angemeldeten Objekte benachrichtigt
werden, sollten wirklich nur die noetigsten angemeldet sein,
um Lags und anderes zu verhindern. Es ist immer gut, im Voraus
die Erlaubnis bei einem Erzmagier einzuholen; das spart
Enttaeuschungen beim/nach dem Anschliessen.
Bei vielen gleichzeitig angemeldeten Objekten kann es vorkommen,
dass einige Objekte erst verzoegert (asynchron) benachrichtigt
werden. Deswegen sind insbesondere Objektzeiger immer selbst noch
auf Vorhandensein zu pruefen. Dies ist der entscheidende Unterschied
zum Event-System, bei dem immer alle angemeldeten Objekte benach-
richtigt werden (muessen).
Tritt in einer Funktion ein Fehler auf, so wird genau diese Funktion
abgemeldet. War es die letzte Funktion eines Objekts, so wird es
komplett abgemeldet. Abmeldungen mit Fehlerangabe werden in
der Datei /log/NOTIFIER gespeichert.
BEACHTE:
Der Notifier speichert seine Listen im Memory(WL) und vergisst
daher auch beim Updaten die angemeldeten Objekte nicht! Es ist daher
NICHT notwendig staendig den Anmeldestatus zu ueberpruefen.
FUNKTIONEN:
int AddObject(Typus, object Objekt, string Funktion)
Meldet das Objekt mit der Funktion an. Wenn das Ereignis
Typus auftritt, wird also die Funktion im Objekt aufgerufen.
Welche Parameter uebergeben werden haengt vom Typus ab und
ist unten angegeben.
Ein Objekt kann auch mit mehreren verschiedenen Funktionen
angemeldet werden (durch mehrmalige differierende Aufrufe),
jedoch fuer jede Funktion nur einmal.
Eine erfolgreiche Anmeldung liefert 1 zurueck.
int RemoveObject(Typus, object Objekt, string Funktion)
Meldet die Funktion des Objekts wieder ab. War dies die letzte
Funktion, mit der das Objekt angemeldet ist, so wird das ganz
Objekt angemeldet.
Erfolgreiche Abmeldung (d.h. insbesondere, dass man ueberhaupt
angemeldet war) liefert 1 zurueck. Misserfolg 0.
mapping QueryObject(Typus)
Liefert ein Mapping zurueck, in dem alle fuer den Typus
angemeldeten Objekte als Schluessel enthalten sind. Die
mituebergebenen Daten sind *undefiniert*! Man kann also nur
die Schluessel auswerten.
Moechte man sicherstellen, dass eine Funktion auch angemeldet ist,
so meldet man sie einfach nocheinmal an. Da Doubletten nicht
vorkommen koennen, wird die Anmeldung ggf. abgelehnt.
UEBERGEBENE WERTE:
Wenn ein Ereignis auftritt, wird an die Funktionen der angemeldeten
Objekte folgende Daten gesandt (schematische Prototypen):
SENS_LOGIN:
void my_login_fun(object einloggender_spieler);
SENS_LOGOUT:
void my_logout_fun(string uid_ausloggender_spieler);
SENS_DELETE:
void my_delete_fun(string uid_ausloggender_spieler);
SENS_DEATH:
void my_death_fun(string, string, object, string, string, object,
int, int, int) mit den Werten
Opfer->name(), file_name(Opfer), Opferobjekt,
Killer->name(), file_name(Killer), Killerobjekt,
Opfer->QueryProp(P_XP), Opfer->QueryProp(P_MAX_HP),
Opfer->QueryProp(P_GXP)
Diese Daten koennen unvollstaendig sein, wenn zB kein Killer
existiert. Die entsprechenden Argumente liefern dann Null.
SENS_FULL_HOUR
void my_clock_fun(int volle_stunde); // 0 - 23
SENS_GUILD_JOIN
void my_grats_fun(string spieler_name, object spieler_objekt,
string gildenname);
SENS_GUILD_LEAVE
void my_sorry_fun(string spieler_name, object spieler_objekt,
string gildenname);
SENS_ADVANCE
void my_stat_fun(string spieler_name, object spieler_objekt,
string was_wurde_erhoeht, int neu_gesetzter_wert);
'was_wurde_erhoeht' entspricht dem E_ADVANCE_WHAT Flag des
ET_ADVANCE Events. Zur Zeit unterstuetzt sind: P_LEVEL,
P_GUILD_LEVEL, A_INT, A_DEX, A_STR, A_CON
'neu_gesetzter_wert' bezieht sich entsprechend auf die
Werte zuvor und entspricht dem E_ADVANCE_NEW Flag im
ET_ADVANCE Event.
BEISPIEL:
NOTIFIER->AddObject(SENS_LOGIN, ME, "teste_geburtstag");
HISTORIE:
Der Notifier hat sich aus dem Lib-Sensor entwickelt. Zur
Rueckwaertskompatibilitaet stellt er auch noch alle Funktionen
usw. bereit. Naehere Infos in lib_sensor(C).
SIEHE AUCH:
events(C), memory(WL)
|