Start Info Community Spielen
 
 

Morgengrauner Dokumentation

Dateipfad: /home/mud/mudlib/doc//wiz/channel-supervisor

Supervisoren fuer Ebenen
************************

    Die Supervisoren (im Folgenden kurz SV) von Ebenen werden vom channeld
    gefragt, ob ein Objekt eine bestimmte Aktion auf einer bestimmten Ebenen
    ausfuehren darf, z.B. Betreten einer Ebene oder Senden auf einer Ebene.
    Die SVs sind selbst ebenfalls immer Zuhoerer auf der Ebene.

    Wird ein SV zerstoert, wird im Normalfall ein neuer SV aus dem Kreise der
    aktuellen Zuhoerer bestimmt, ueblicherweise das am laengsten zuhoerende
    Objekt.

    Betritt ein Objekt, das eine Ebene erschaffen hat (der erste Supervisor), 
    eine Ebene nach Verlassen erneut, uebernimmt es automatisch die SV-Rolle
    wieder, sofern das Objekt *kein* Spieler oder Magier ist.


Erstellen von Supervisoren
==========================

    Im einfachsten Fall wird /std/channel_supervisor geerbt, ein Name
    konfiguriert und das systemweite Init-File fuer Ebenen eingelesen. 
    Anschliessend erhaelt man das Standardverhalten, was im Init-File
    konfiguriert ist. Ein Beispiel hierfuer findet sich 
    /doc/beispiele/ebenen/supervisor.c.

    Man kann die SV-Funktionalitaet in einem bestehenden Objekt ergaenzen,
    indem man /std/channel_supervisor zusaetzlich erbt. Hierbei ist zu
    beachten, dass channel_supervisor.c selbst bereits die Funktionen name()
    und Name() definiert und dort (undekliniert) den Namen zurueckgibt, der
    per ch_set_sv_name() eingestellt wurde.
    
    Wenn also das erbende Objekt deklinierte Namen ausgeben soll oder
    einen anderen Namen als den SV-Namen, muss im erbenden Objekt name()
    ueberschrieben werden. Dabei ist zu beachten, dass die ueberschreibende
    Funktion explizit das Objekt angeben muss, in dem das geerbte name()
    gerufen werden soll, d.h. beispielsweise   return thing::name();   statt
    nur ::name();
    
    Alternativ kann man die Inherit-Reihenfolge geeignet waehlen, so dass
    channel_supervisor::name() schon dadurch ueberschrieben wird.
    Ein Beispiel hierfuer steht in /doc/beispiele/ebenen/supervisor-thing.c.

    Will man einen SV fuer eine Ebene konfigurieren, die keine Standardebene
    ist, kann man ein eigenes Init-File einlesen (Format siehe Manpage
    "channeld.init"). In diesem Fall ist aber zu beachten, dass man
    durch Aufruf von CHMASTER->new() selber Sorge dafuer tragen muss, dass
    die Ebene erstellt wird. 
    (Eine Standardebene ist eine Ebene, die in der globalen
    Konfigurationsdatei /p/daemon/channeld.init aufgefuehrt ist und daher
    vom Channeld automatisch erzeugt wird.)

    Will man einen SV mit einem gaenzlich anderen Verhalten bauen, so ist
    auch das moeglich, indem man die lfun

      public int ch_check_access(string ch, object user, string cmd)

    ueberschreibt. Diese wird vom channeld im SV gerufen. Gibt sie eine 1
    zurueck, darf das Objekt  auf der Ebene  die Aktion 
    ausfuehren.  Anderenfalls muss 0 zurueckgeben werden.  ist hierbei
    eines der in /p/daemon/channel.h definierten Kommandos.

    Die Ebene  wird immer kleingeschrieben uebergeben. Auch wenn der
    Name Spielern case-sensitiv angezeigt wird, kann es keine zwei Ebenen
    geben, welche sich nur in Gross-/Kleinschreibung unterscheiden und intern
    erfolgt die Verwaltung *immer* kleingeschrieben - dies gilt auch fuer die
    Rechtepruefung.


Siehe auch:
-----------
    
    Ebenen:     channels
    Init-File:  channeld.init
    Beispiele:  /doc/beispiele/ebenen/supervisor.c
                /doc/beispiele/ebenen/supervisor-thing.c
    lfuns:      ch_read_init_file()
                ch_set_sv_name()


zurück zur Übersicht

YOUTUBE | FACEBOOK | TWITTER | DISCORD | FEEDBACK | IMPRESSUM | DATENSCHUTZ 1992–2023 © MorgenGrauen.