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