Dokumentation zu: notifier(WL)

HR Image


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)


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