Morgengrauner Dokumentation
Dateipfad: /home/mud/mudlib/doc//wiz/channel-supervisorSupervisoren 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