blob: 816bf2424a3207bd5300be307b2970e1f332c71b [file] [log] [blame]
Arathorn3ec3af02021-01-20 00:17:51 +01001Supervisoren fuer Ebenen
2************************
3
4 Die Supervisoren (im Folgenden kurz SV) von Ebenen werden vom channeld
5 gefragt, ob ein Objekt eine bestimmte Aktion auf einer bestimmten Ebenen
6 ausfuehren darf, z.B. Betreten einer Ebene oder Senden auf einer Ebene.
7 Die SVs sind selbst ebenfalls immer Zuhoerer auf der Ebene.
8
9 Wird ein SV zerstoert, wird im Normalfall ein neuer SV aus dem Kreise der
10 aktuellen Zuhoerer bestimmt, ueblicherweise das am laengsten zuhoerende
11 Objekt.
12
13 Betritt ein Objekt, das eine Ebene erschaffen hat (der erste Supervisor),
14 eine Ebene nach Verlassen erneut, uebernimmt es automatisch die SV-Rolle
15 wieder, sofern das Objekt *kein* Spieler oder Magier ist.
16
17
18Erstellen von Supervisoren
19==========================
20
21 Im einfachsten Fall wird /std/channel_supervisor geerbt, ein Name
22 konfiguriert und das systemweite Init-File fuer Ebenen eingelesen.
23 Anschliessend erhaelt man das Standardverhalten, was im Init-File
24 konfiguriert ist. Ein Beispiel hierfuer findet sich
25 /doc/beispiele/ebenen/supervisor.c.
26
27 Man kann die SV-Funktionalitaet in einem bestehenden Objekt ergaenzen,
28 indem man /std/channel_supervisor zusaetzlich erbt. Hierbei ist zu
29 beachten, dass channel_supervisor.c selbst bereits die Funktionen name()
30 und Name() definiert und dort (undekliniert) den Namen zurueckgibt, der
31 per ch_set_sv_name() eingestellt wurde.
32
33 Wenn also das erbende Objekt deklinierte Namen ausgeben soll oder
34 einen anderen Namen als den SV-Namen, muss im erbenden Objekt name()
35 ueberschrieben werden. Dabei ist zu beachten, dass die ueberschreibende
36 Funktion explizit das Objekt angeben muss, in dem das geerbte name()
37 gerufen werden soll, d.h. beispielsweise return thing::name(); statt
38 nur ::name();
39
40 Alternativ kann man die Inherit-Reihenfolge geeignet waehlen, so dass
41 channel_supervisor::name() schon dadurch ueberschrieben wird.
42 Ein Beispiel hierfuer steht in /doc/beispiele/ebenen/supervisor-thing.c.
43
44 Will man einen SV fuer eine Ebene konfigurieren, die keine Standardebene
45 ist, kann man ein eigenes Init-File einlesen (Format siehe Manpage
46 "channeld.init"). In diesem Fall ist aber zu beachten, dass man
47 durch Aufruf von CHMASTER->new() selber Sorge dafuer tragen muss, dass
48 die Ebene erstellt wird.
49 (Eine Standardebene ist eine Ebene, die in der globalen
50 Konfigurationsdatei /p/daemon/channeld.init aufgefuehrt ist und daher
51 vom Channeld automatisch erzeugt wird.)
52
53 Will man einen SV mit einem gaenzlich anderen Verhalten bauen, so ist
54 auch das moeglich, indem man die lfun
55
56 public int ch_check_access(string ch, object user, string cmd)
57
58 ueberschreibt. Diese wird vom channeld im SV gerufen. Gibt sie eine 1
59 zurueck, darf das Objekt <user> auf der Ebene <ch> die Aktion <cmd>
60 ausfuehren. Anderenfalls muss 0 zurueckgeben werden. <cmd> ist hierbei
61 eines der in /p/daemon/channel.h definierten Kommandos.
62
63 Die Ebene <ch> wird immer kleingeschrieben uebergeben. Auch wenn der
64 Name Spielern case-sensitiv angezeigt wird, kann es keine zwei Ebenen
65 geben, welche sich nur in Gross-/Kleinschreibung unterscheiden und intern
66 erfolgt die Verwaltung *immer* kleingeschrieben - dies gilt auch fuer die
67 Rechtepruefung.
68
69
70Siehe auch:
71-----------
72
73 Ebenen: channels
74 Init-File: channeld.init
75 Beispiele: /doc/beispiele/ebenen/supervisor.c
76 /doc/beispiele/ebenen/supervisor-thing.c
77 lfuns: ch_read_init_file()
78 ch_set_sv_name()