blob: 763799665820d3b0cf8c7f530b360075705e680b [file] [log] [blame]
Zesstra3be5be82020-09-22 00:14:21 +02001Supervisoren fuer Ebenen
2************************
3
4Die Supervisoren von Ebenen werden vom CHANNELD gefragt, ob ein Objekt eine
5bestimmte Aktion auf einer bestimmten Ebenen tun darf, z.B. Betreten einer
6Ebene oder Senden auf einer Ebene. Die SVs sind ebenfalls immer Zuhoerer auf
7der Ebene.
8
9Wird ein SV zerstoert, wird im Normalfall ein neuer SV aus dem Kreise der
10aktuellen Zuhoerer bestimmt, ueblicherweise das am laengsten zuhoerende
11Objekt.
12
13Betritt ein Objekt, was eine Ebene erschaffen hat (der erste Supervisor), eine
14Ebene nach Verlassen erneut, uebernimmt es automatisch die SV-Rolle wieder,
15sofern das Objekt *kein* Spieler oder Magier ist.
16
17
18Erstellen von Supervisoren
19==========================
20
21Im einfachsten Fall wird /std/channel_supervisor geerbt, ein Name konfiguriert
22und das systemweite Init-File fuer Ebenen eingelesen. Anschliessend erhaelt
23man das Standardverhalten, was im Init-File konfiguriert ist. Ein Beispiel
24hierfuer findet sich /doc/beispiele/ebenen/supervisor.c.
25
26Man kann ein bestehendes Objekt zu einem SV machen, indem man
27/std/channel_supervisor zusaetzlich erbt. In diesem Fall muss man ggf. auf
28name() und Name() aufpassen, sofern das Objekt auch /std/thing/description
29oder aehnliche erbt und gezielt die von dort geerbten lfuns aufrufen. Ein
30Beispiel hierfuer steht in /doc/beispiele/ebenen/supervisor-thing.c.
31
32Will man einen SV fuer eine Ebene konfigurieren, die keine Standardebene ist,
33kann man ein eigenes Init-File einlesen (Format s. u.). In diesem Fall ist
34aber zu beachten, dass man auch selber Sorge dafuer tragen muss, dass die
35Ebene erstellt wird (CHANNELD->new()).
36
37Will man einen SV mit einem gaenzlich anderen Verhalten bauen, so ist auch das
38moeglich, indem man die lfun
39 public int ch_check_access(string ch, object user, string cmd)
40ueberschreibt. Diese wird vom CHANNELD im SV gerufen. Gibt sie eine 1 zurueck,
41darf das Objekt <user> auf der Ebene <ch> die Aktion <cmd> ausfuehren.
Zesstra222fd4e2020-09-22 00:32:36 +020042Anderenfalls muss 0 zurueckgeben werden.
Zesstra3be5be82020-09-22 00:14:21 +020043<cmd> ist hierbei eine der in /p/daemon/channel.h definierten Kommandos.
44
45Die Ebene <ch> wird immer kleingeschrieben uebergeben. Auch wenn der Name
46Spielern case-sensitiv angezeigt wird, kann es keine zwei Ebenen geben,
47welche sich nur in Gross-/Kleinschreibung unterscheiden und intern erfolgt
48die Verwaltung *immer* kleingeschrieben - dies gilt auch fuer die
49Rechtepruefung.
50
51
52Eigenes Init-File
53-----------------
54
55Das Init-File hat folgenden Aufbau:
56<name>:<recv>:<send>:<accessflags>:<channelflags>:<desc>:<supervisor>
57z.B.
58abgilde: 0: 0: 0: 0:Fuer Abenteurer:/gilden/abenteurer
59
60Fuer SVs sind nur die Felder <name>, <recv>, <send> und <accessflags>
61relevant. Das vordefinierte ch_check_access() entscheidet wie folgt anhand der
62Angaben:
63
64Verlassen (C_LEAVE) ist immer erlaubt. Die anderen Aktionen sind in zwei
65Gruppen eingeteilt:
66 1) RECV. Die Aktionen dieser Gruppe sind Suchen (C_FIND), Auflisten
67 (C_LIST) und Betreten (C_JOIN).
68 2) SEND. Die Aktion dieser Gruppe ist zur Zeit nur Senden (C_SEND).
69
Zesstra222fd4e2020-09-22 00:32:36 +020070Aktionen werden zugelassen, wenn Spieler/MagierLevel groesser oder gleich ist
71wie die fuer die jeweilige Aktionsgruppe RECV oder SEND festgelegte Stufe.
Zesstra3be5be82020-09-22 00:14:21 +020072
73Handelt es sich um eine Magierebene (<accessflags> enthaelt das Flag
Zesstra222fd4e2020-09-22 00:32:36 +020074CH_ACCESS_WIZARD), muss die Magierstufe des Spielers groesser oder gleich sein
75wie die Mindeststufe der Ebene. Ansonsten wird gegen den Spielerlevel geprueft.
Zesstra3be5be82020-09-22 00:14:21 +020076Enthaelt <accessflags> das Flag CH_ACCESS_NOGUEST, darf die Ebene nicht von
Zesstra222fd4e2020-09-22 00:32:36 +020077Gaesten benutzt werden (weder Empfangen noch Senden).
Zesstra3be5be82020-09-22 00:14:21 +020078
79Wenn RECV_LVL oder SEND_LVL auf -1 gesetzt ist, sind die Aktionen der
80jeweiligen Gruppen komplett geblockt.
81
Zesstra222fd4e2020-09-22 00:32:36 +020082Bemerkung: Im Initfile sollten nur Blueprints als SVs verwendet werden - aber
83im Allgemeinen koennen SVs auch Clones sein!
Zesstra3be5be82020-09-22 00:14:21 +020084