Lpc Manpages

Was sind Events?
================

Events im Anderland sind Ereignisse, die von beliebigen Objekten ausgeloest
werden koennen. Es gibt eine Reihe von vordefinierten Ereignissen, die die
Basis-Lib bereitstellt (s.u.). Zusaetzlich zu diesen koennen Magier beliebige
weitere Events erstellen bzw. benutzen.

Wenn ein Objekt dem zentralen Event-Dispatcher einen bestimmten Event meldet,
merkt dieser sich dies und die Daten, die ihm vom ausloesenden Objekt
uebergeben wurde. Mit kurzer Verzoegerung (0-2s) informiert der
Event-Dispatcher dann alle Objekte, die sich fuer diesen Event interessieren
(dafuer angemeldet sind). Hierzu ruft er eine bestimmte Funktion in den
angemeldeten Objekten auf.
Hierbei ist zu beachten, dass die informierten Objekte das Ereignis in keinem
Fall mehr beeinflussen koennen, da es bereits abgeschlossen wurde. Es ist
lediglich eine Information ueber das Ereignis. Wenn ein Objekt Einfluss nehmen
will (z.B. auf einen Tod), ist dafuer ein Hook zu verwenden.


Welche Events definiert die Mudlib?
==================================
Diese Events haben in /sys/events.h vordefinierte Event-IDs und werden von der
Basis-Mudlib mit den entsprechenden Daten ausgeloest (s. jew. Event):

- EVT_LIB_LOGIN: Login eines Spielers
- EVT_LIB_LOGOUT: Logout eines Spielers
- EVT_LIB_PLAYER_DEATH: Ein Spieler ist gestorben
- EVT_LIB_PLAYER_DELETION: Ein Spieler hat sich geloescht
- EVT_LIB_PLAYER_CREATION: Ein Spieler wurde neu angelegt
- EVT_LIB_NPC_DEATH(): Ein NPC ist gestorben (Parameter s. Event-Manpage)
- EVT_LIB_ADVANCE: Ein Spieler hat seine Spielerstufe erhoeht
- EVT_LIB_PLAYER_ATTR_CHANGE: Die Attribute eines Spielers wurden geaendert
- EVT_LIB_CLOCK: Die volle Stunde ist erreicht
- EVT_LIB_DATECHANGE: Ein neuer Tag ist angebrochen
- EVT_LIB_QUEST_SOLVED: Ein Spieler hat eine Quest geloest

Gilden muessen definieren (ggf. via /std/gilden_ob.c):
- EVT_GUILD_CHANGE: Spieler hat seine Gilde gewechselt
- EVT_GUILD_ADVANCE: Ein Spieler hat seine Gildenstufe erhoeht


Namenskonvention fuer Event-IDs:
===============================
- Die IDs aller Standardevents beginnen mit "evt_lib_". 
  Dementsprechend sind alle Strings, die damit anfangen, fuer ALLE ausser 
  der Mudlib TABU! D.h.:
  - diese Events werden NIEMALS von Objekten ausserhalb der Basislib
    ausgeloest!
  - es duerfen keine Events registriert werden, die mit dieser Zeichenfolge
    anfangen, ausser mit den symbolischen Namen in /sys/events.h
- Gilden-Events beginnen mit "evt_guild_", sofern es ein Event ist, den jede
  Gilde definiert (s. /sys/events.h).
  Die Events einzelner Gilden sollten mit "evt_gildenname_" beginnen.
- Die IDs einzelner Magier sollten am besten zwecks Eindeutigkeit mit
  "magiername_" beginnen.


Was ist als lauschendes Objekt zu beachten?
==========================================
Das lauschende Objekt muss zunaechst /sys/events.h inkludieren und sich
mittels Aufrufs von RegisterEvent() als Lauscher registrieren.
Weiterhin muss es eine Funktion oeffentlich definieren (Name beliebig), die
der EVENTD aufrufen kann. Diese Funktion bekommt 3 Argumente uebergeben:
Event-ID, event-ausloesendes Objekt und die Event-Daten, z.B.:

   public void miniquest_geloest(string eid, object trigob, mixed data);

'data' ist ein Datentyp, der vom Eventtyp abhaengt. Oft handelt es sich
um ein Mapping. Fuer eine genaue Beschreibung schaut bitte die in die Manpage
des konkreten Events.

Bitte beachten: Die Daten in 'data' im Falle eines Arrays/Mappings niemals
aendern. Aus Effizienzgruenden wird 'data' nicht kopiert, bevor es an die
einzelnen Objekte uebergeben wird. Wenn ihr also Muell reinschreibt, werden
nach euch informierte Lauscher euren Schrott empfangen. Sollte hier
'Missbrauch' auffallen, wird das entsprechend geahndet!

Und zum Schluss: Bitte missbraucht die Events nicht und meldet euch (speziell 
fuer haeufige Events) nur an, wenn ihr mit den Informationen was sinnvolles 
macht (also z.B. nicht nur, um ein Log der getoeteten NPCs im Spiel zu 
erstellen).


Was ist als ausloesendes Objekt zu beachten?
===========================================
Eigentlich gar nicht viel. Ihr muesst lediglich /sys/events.h inkludieren und
bei Auftreten des Events die Funktion TriggerEvent() im EVENTD aufrufen und
ihr die Event-ID und die Event-Daten uebergeben.
Bitte uebergebt als Event-Daten ggf. Kopien von Mappings/Arrays, da lauschende
Objekte diese Daten veraendern koennen.


Beispiele:
=========

1. Ein Objekt moechte ueber Spielertode informiert werden:

   include <events.h>;
   ...
     EVENTD->RegisterEvent(EVT_LIB_PLAYER_DEATH,"spieler_ist_tot", ME);

   Ab jetzt wird im Objekt jedes Mal, wenn ein Spieler stirbt, die Funktion
   "spieler_ist_tot" aufgerufen.

2. Ein Objekt moechte nicht mehr ueber Spielertode informiert werden:

     EVENTD->UnregisterEvent(EVT_LIB_PLAYER_DEATH,ME);

3. Ein Objekt will informiert werden, wenn der Event "zwergenkoenig_angriff"
   ausgeloest wird:

     EVENTD->RegisterEvent("zwergenkoenig_angriff","zwergenalarm",ME);

3a. Der Zwergenkoenig (oder einer seiner Waechter) wird angegriffen:

     EVENTD->TriggerEvent("zwergenkoenig_angriff",daten);

   Anschliessend wird jedes Objekt, das es wissen will (s. 3.) vom EVENTD
   informiert und kriegt dabei 'daten' uebergeben. Dies kann ein beliebiger
   Datentyp sein (z.b. ein Mapping). In diesem Fall enthaelt 'daten'
   zweckmaessigerweise den Angreifer.


Siehe auch:
==========
  Daemon:      eventd
  Aehnlich:    TriggerEvent, RegisterEvent, UnregisterEvent
  Lib-Events:  EVT_LIB_LOGIN, EVT_LIB_LOGOUT, EVT_LIB_PLAYER_DEATH,
               EVT_LIB_PLAYER_DELETION, EVT_LIB_PLAYER_CREATION,
               EVT_LIB_NPC_DEATH, EVT_LIB_ADVANCE,
               EVT_LIB_PLAYER_ATTR_CHANGE, EVT_LIB_CLOCK, EVT_LIB_DATECHANGE,
               EVT_LIB_QUEST_SOLVED,
               EVT_GUILD_CHANGE, EVT_GUILD_ADVANCE

----------------------------------------------------------------------------
01.10.17, Torin