Arathorn | 3ec3af0 | 2021-01-20 00:17:51 +0100 | [diff] [blame^] | 1 | Supervisoren 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 | |
| 18 | Erstellen 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 | |
| 70 | Siehe 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() |