blob: a722c8c342b8389e53db7e20ae65e5c3fa15f659 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001RM - HOWTO
2**********
3
4Vorlaeufiges Inhaltsverzeichnis:
5
61) Allgemeines
Arathorn41004de2020-10-18 22:03:28 +02007 - Konzepte fuer neue Gebiete
MG Mud User88f12472016-06-24 23:31:02 +02008 - Fehlerteufel
MG Mud User88f12472016-06-24 23:31:02 +02009 - Kommentierung von Aenderungen
10 - eigene Anschluesse
Arathorn41004de2020-10-18 22:03:28 +020011 - "Datenhygiene" im Regionsverzeichnis
MG Mud User88f12472016-06-24 23:31:02 +0200122) Abnahme von Code/Gebieten
13 - Balance/Genehmigungen
14 - Konzeptionelle Eignung
15 - formale Pruefung
16 - Gemeinschaftsarbeiten
173) Verlegung von Dateien
184) Seherhaeuser
19 - Sonderwuensche/Unsichtbarkeit
20 - anderer Befehl zum Betreten
21 - Verweise auf Beispielcode
225) Debuggen von Code
236) besondere Funktionen/Funktionaelitaeten
24 - catch_tell() / ReceiveMsg()
25 - move()
26 - Attack() / Defend()
27 - call_out()
28 - remove() / destruct()
29 - for()-Schleifen
30 - write_file()
31 - Verwalten von charakterbezogenen Daten
32
331) Allgemeines
34==============
35
Arathorn41004de2020-10-18 22:03:28 +0200361a) Konzepte und Dokumentation
MG Mud User88f12472016-06-24 23:31:02 +020037
Arathorn41004de2020-10-18 22:03:28 +020038 o Die Erfahrung zeigt, dass es aus verschiedenen Gruenden wirklich dringend
39 zu empfehlen ist, sich fuer neue Gebiete ein Konzept vorlegen zu lassen,
40 dieses gruendlich zu pruefen und zu durchdenken und mit dem betreffenden
41 Regionsmitarbeiter zu diskutieren. Weiterhin empfiehlt es sich ebenfalls,
42 eine ueber das Konzept erzielte Einigung im Verzeichnis "doc" Deiner
43 Region zu dokumentieren. Hierdurch erreichst Du mehrere Dinge:
44 - Du vermeidest Ueberraschungen ("Hier ist mein neues Gebiet zur Abnahme,
45 sind nur 120 Raeume. Oh, hoppla, hab ich Dir nicht Bescheid gesagt?");
46 auch fuer Deine etwaigen Nachfolger.
47 - Du vermeidest bei absehbaren technischen Schwierigkeiten Frustration
48 beim Deinem Regionsmitarbeiter.
49 - Du erhoehst die Wahrscheinlichkeit, dass das Gebiet tatsaechlich
50 fertiggestellt wird.
51 - Jeder kann weitgehend verbindlich nachlesen, was Du genehmigt hast.
52 - Es ist klar ersichtlich, welche Konzepte bekanntermassen schon in Arbeit
53 sind, so dass inhaltliche Aehnlichkeiten im Vorfeld vermieden werden
54 koennen.
55
56 Du solltest den betreffenden Regionsmitarbeiter auch darauf hinweisen,
57 dass er Dich informieren moege, wenn er eine groessere konzeptionelle
58 Umstellung des neuen Gebietes durchfuehren will.
MG Mud User88f12472016-06-24 23:31:02 +020059
Arathorn41004de2020-10-18 22:03:28 +020060 Welche Kriterien man als RM ansetzt, um ein Gebiet als regionstauglich
61 zu bewerten, liegt in der Entscheidung des RM.
MG Mud User88f12472016-06-24 23:31:02 +020062
Arathorn41004de2020-10-18 22:03:28 +020063 o Wenn ein Konzept fuer ein Gesellenstueck eingereicht wird, und es handelt
64 sich um eine Gemeinschaftsarbeit mehrerer Magier (Kooperation mehrerer
65 Lehrlinge oder Lehrling(e) + erfahrene Magier), UEBERLEGT EUCH GUT, OB
66 IHR DAS ZULASSEN WOLLT! Erfahrungsgemaess laesst sich schwer beurteilen,
67 welcher Teil des Codes von wem ist. Wenn es zugelassen wird, sollten mit
68 den betreffenden Lehrlingen klare Vereinbarungen insbesondere ueber die
69 Trennung des Codes nach Autor getroffen werden.
MG Mud User88f12472016-06-24 23:31:02 +020070
Arathorn41004de2020-10-18 22:03:28 +0200711b) Fehlerteufel / Abarbeitung von Bugs
72
73 o Um stets einen Ueberblick ueber die in Deiner Region (hoffentlich selten)
74 auftretenden Bugs und Warnungen zu behalten, solltest Du einen
75 Fehlerteufel (/obj/tools/fehlerteufel.c) besitzen, bedienen koennen und
76 regelmaessig dessen Listen durchsehen. Deinen Regionsmitarbeitern solltest
77 Du, allein schon, um zusaetzliche Arbeit fuer Dich selbst zu reduzieren,
78 dieses Werkzeug ebenfalls an die Hand geben und sie auffordern, ihren
79 Kram moeglichst umfassend selbst zu reparieren.
80 Neuen Magiern wird dieses Tool uebrigens automatisch von Merlin in die
81 Hand gedrueckt, so dass sie sich vom ersten Tag an daran gewoehnen
82 koennen.
83
84 o Wenn Du in fremdem Code Aenderungen vornehmen musst, die mehr beruehren
85 als nur ein paar Tippfehler in Details oder Infos, dann fuege den
86 reparierten Code mit Kommentar ein. Wenn in Deiner Region git/gerrit zur
87 Codeverwaltung verwendet werden, schreibe eine aussagekraeftige Commit-
88 Message, bei Bedarf ergaenzt durch einen Kommentar im Code.
89
901c) Anschluss eigener Gebiete in der eigenen Region
91
92 o Willst Du in Deiner eigenen Region ein Gebiet anschliessen, solltest Du
93 diesen vor Anschluss entweder vom Co-RM oder von einem RM einer anderen
94 Region lesen lassen. Auch wenn Du ein guter Programmierer bist, findet ein
95 zweites Paar Augen oft Dinge, an die man nicht gedacht hat.
96
971d) "Hygiene" in den Regionsverzeichnissen
98
99 o Wenn Du nicht angeschlossene Objekte aus Deiner Region aussortieren
100 moechtest, ist sprich am besten einen EM an, der Dir dabei hilft:
101 Einerseits kann man auf der Shell bequemer herausfinden, ob ein Objekt
102 tatsaechlich nicht verwendet wird. Andererseits soll der ungenutzte
103 Code in das /players-Verzeichnis des Autors verschoben werden, was
104 haeufig ebenfalls EM-Rechte benoetigt.
105
106 o Es wird dringend empfohlen, neuen Regionscode nur noch in /players zu
107 entwickeln.
108
109 o Als Regionsmagier hast Du aufgrund eines EM-Beschlusses die Moeglichkeit,
110 fuer Deine jeweilige(n) Region(en) verbindlich festzulegen, ob es erlaubt
111 ist, die Entwicklung neuer Gebiete im Regionsverzeichnis durchzufuehren.
112
MG Mud User88f12472016-06-24 23:31:02 +0200113
1142) Code wird zur Abnahme vorgelegt
115==================================
116
Arathorn41004de2020-10-18 22:03:28 +0200117o Bei Waffen und Ruestungen unbedingt darauf achten, dass Objekte, die die
118 Genehmigungsgrenzen ueberschreiten, bei der Balance zur Genehmigung
119 vorgestellt wurden. Fuer alle Objekte mit Balance-relevanten Eigenschaften
120 bitte penibel darauf achten, dass die Balance-Vorgaben eingehalten werden.
121 Jeder Magier kann sich ein Balance-Tool "light" clonen, mit dem er den Text
122 der Genehmigung selbst anschauen kann, um den vorgelegten Code damit zu
123 vergleichen. Nicht genehmigte oder in der Funktion abweichende Objekte
124 duerfen nicht angeschlossen werden. (Bei schon sehr lange angeschlossenen
125 Objekten, deren Abweichung von der Genehmigung erst sehr spaet auffaellt,
126 kann man ggf. auf das temporaere Abhaengen verzichten.)
MG Mud User88f12472016-06-24 23:31:02 +0200127
128o Sofern ein Objekt eine Balance-Genehmigung besitzt, muss die BTOP-Nummer,
129 die die Balance als eindeutige ID fuer jeden Antrag vergibt, im Header
Arathorn41004de2020-10-18 22:03:28 +0200130 des betreffenden Objektes erkennbar eingetragen sein. Bevorzugt traegt
131 man auch die genehmigten Eigenschaften ein.
MG Mud User88f12472016-06-24 23:31:02 +0200132
Arathorn41004de2020-10-18 22:03:28 +0200133o Vor Anschluss sollte man kontrollieren, dass der Magier alle wesentlichen
134 Punkte beruecksichtigt hat:
135 - Liegen alle Balance-Genehmigungen vor?
136 BTool light gibt's fuer alle, damit kann jeder fuer Objekte in seinem
137 Zustaendigkeitsbereich die Genehmigungen einsehen.
138 - Sind die FP eingetragen?
139 FP kann der RM fuer das neue Gebiet selbst abfragen.
140 - Sind die ZTs eingetragen und getestet?
141 Dies laesst sich mit dem Magierkommando "traenke" herausfinden.
142 - Falls Sonder-EK-Stupse vorgesehen sind: sind diese genehmigt?
143 Die Eintragung bzw. Anpassung der Stufenpunkte fuer den Kill wird
144 erledigt, sobald der NPC das erste Mal getoetet wurde, dies muss also nicht
145 ueberprueft werden.
MG Mud User88f12472016-06-24 23:31:02 +0200146
147o Alle NPCs sollten vor Anschluss einmal gekillt werden, um sie auf
148 grundsaetzliche Kampf-Funktionsfaehigkeit zu pruefen.
149
150o Haben NPCs Namen, sollte ueberlegt werden, diese Namen ggf. zu banishen.
151 (hilfe banish).
152
153o Es existiert ein Shell-Skript, mit dessen Hilfe man offensichtliche
154 Formfehler in einem kompletten Verzeichnis ermitteln kann (Umlaute im
155 Code, zu lange Zeilen etc.), wobei bezueglich der Formalien auch auf
156 den Regionsmitarbeiter-Leitfaden fuer neue Projekte verwiesen werden
Arathorn41004de2020-10-18 22:03:28 +0200157 soll. Das Skript liegt im oeffentlichen Git-Repo "static-lpc-check" auf
158 dem MG-Gerrit-Server. Man kann es mit git oder ueber das Webinterface
159 herunterladen. Der Regionsmagier hat hierbei die Entscheidungsfreiheit,
160 die Berichte dieses Skripts dem Programmierer des neuen Gebiets als
161 Anhaltspunkte zur Verfuegung zu stellen, oder die Abarbeitung der
162 gemeldeten Punkte zur Voraussetzung fuer den Anschluss zu machen, aber
163 auch jede Abstufung dazwischen ist OK. :-)
MG Mud User88f12472016-06-24 23:31:02 +0200164 Zusaetzlicher Tip: Das Skript differenziert zwischen eigentlich nicht
165 akzeptablen Konstrukten und zumindest fragwuerdigen, d.h. man kann diese
166 Unterscheidung an den Verantwortlichen mit entsprechenden Forderungen
167 weitergeben.
MG Mud User88f12472016-06-24 23:31:02 +0200168
Arathorn41004de2020-10-18 22:03:28 +0200169o Sollte ein zur Abnahme anstehendes Gesellenstueck eine (grundsaetzlich
MG Mud User88f12472016-06-24 23:31:02 +0200170 selbstverstaendlich zulaessige) Gemeinschaftsarbeit sein, sollte man
Arathorn41004de2020-10-18 22:03:28 +0200171 darauf bestehen, eine sauber getrennte Codebasis in unterschiedlichen
172 Verzeichnissen vorgelegt zu bekommen, oder aber eine Auflistung, welcher
173 Beitrag von welchem Magier stammt. Es sollte klar sein, dass die
174 Beurteilung der Faehigkeiten eines Lehrlings darauf angewiesen ist, dass
175 man den Code richtig zuordnen kann.
176 Wenn eine solche Auflistung sich bis auf Funktionsebene erstreckt
MG Mud User88f12472016-06-24 23:31:02 +0200177 (z.B. "DoWield() ist von X, Details von Y, DefendFunc von Z"), ist
178 das unschoen und an sich abzulehnen.
179
180
1813) Verlegung von Dateien
182========================
183
184o Sollte ein Objekt aus einer anderen Region bzw. allgemein aus einem
185 anderen Verzeichnis (z.B. /players) in Deine Region verlegt werden
186 muessen, sind VOR dem Umhaengen folgende Punkte zu beachten:
Arathorn454f1762020-05-01 22:39:30 +0200187 -- Forscherpunkte muessen umgetragen werden
188 -- Quests und Minquests muessen umgetragen werden
189 -- Erstkill-Stufenpunkte muessen umgetragen werden
190 -- Zaubertraenke umtragen lassen
191 -- Seherportal(e) verlegen lassen
192 -- Ruestungen in Padreics Ruestungsskill umtragen lassen
Zesstra299bc492019-08-19 20:09:10 +0200193 -- Waffen in der Liste legendaerer Waffen der Kaempfergilde umtragen
Arathorn454f1762020-05-01 22:39:30 +0200194 (GM Kaempfer oder EM ansprechen)
195 -- im Gebiet vorhandene Seherhaeuser umziehen, an P_SEHERHAUS_ERLAUBT im
196 Zielraum denken
197 -- evtl. im Gebiet vorhandene Kraeuterskill-Kraeuter beruecksichtigen
Arathornae6dbc92020-07-27 23:36:15 +0200198 -- evtl. vorhandene Autoload-Objekte pruefen; in einfachen Faellen kann
199 man ein Wrapper-Objekt erstellen, das das alte beim Clonen durch das
200 neue ersetzt.
MG Mud User88f12472016-06-24 23:31:02 +0200201 -- evtl. Briefempfaenger der Postquest beruecksichtigen,
202 -- ueber die Mudlib greppen lassen, um eventuell in anderen Regionen
203 verwendete Referenzen auf die alten Pfade des umziehenden Codes
204 zu finden und dort umzustellen. Hierbei sind in Ausnahmefaellen von
205 fiesem Code auch in Spielersavefiles gespeicherte Pfade zu
206 beruecksichtigen (*ARGL*).
207
Arathorn454f1762020-05-01 22:39:30 +0200208 Sofern nichts anderes angegeben ist, muss Dir dabei ein EM helfen.
MG Mud User88f12472016-06-24 23:31:02 +0200209
2104) Seherhaeuser
211===============
212
213o Die Erlaubnis zum Bau eines Seherhauses in einem Gebiet haengt einzig und
214 allein von dem verantwortlichen Magier ab. Sollte dieser laenger nicht
215 erreichbar sein (auch nicht ueber externe Mail!), liegt die Entscheidung
216 beim Regionsmagier, der aber in jedem Fall die Eignung des Bauplatzes
217 in der Umgebung bewerten muss.
218
219o Fuer Sonderwuensche bezueglich Unsichtbarkeit von Seherhaeusern oder
220 besonderer Kommandos zum Betreten des Hauses sei auf die Datei
221 /doc/beispiele/misc/seherhaus.c verwiesen, wo die Vorgehensweise
222 erlaeutert wird. Ein Beispiel einer sehr umfangreichen Implementierung
223 findet sich in /d/ebene/room/hp_str8a.c.
224
225o Bei geaenderten Befehlen zum Betreten muss beachtet werden, dass bei einer
226 Standardimplementierung die Erlaube-Liste umgangen wird, d.h. ohne
227 besondere Vorkehrungen u.U. JEDER das Haus ungehindert betreten kann.
228 Es ist hingegen moeglich, die Erlaube-Liste abzufragen und entsprechend
229 zu behandeln, ein Beispiel hierfuer ist in /d/ebene/room/hp_str8a.c
230 nachzulesen (derzeit jedoch auf Spielerwunsch deaktiviert).
231
232
2335) Debuggen von Code
234====================
235
236o Nach dem Reparieren eines Objektes ist es meist erforderlich, das
237 betreffende Objekt neu zu laden. Falls es sich dabei um Objekte handelt,
238 die z.B. in einem Raum mittels AddItem() hinzugefuegt wurden (wie etwa
239 ein NPC), dann ist es am besten, die Datei mit dem Befehl
240 <upd -ad datei.c> zu aktualisieren und somit saemtliche Clones zu
241 zerstoeren. Wenn man mittels <upd -ar datei.c> die bestehenden Clones
242 ersetzen wuerde, wuerden diese aus der Item-Liste des clonenden Raumes
243 ausgetragen, so dass dieser Raum dann im reset() neue Items erzeugt und
244 diese in der Folge doppelt existieren wuerden.
245
246
2476) besondere Funktionen
248=======================
249
250Es kommt haeufig vor, dass Funktionen ueberschrieben werden muessen, und das
251ist auch normalerweise vollkommen normal und nicht beanstandenswert. Jedoch
252sollte man bei bestimmten Funktionen einiges Augenmerk auf die korrekte
253Ausfuehrung richten. Einige Beispiele sind nachfolgend aufgefuehrt:
254
255o catch_tell() / ReceiveMsg()
256 Die Reaktion von Objekten, insbesondere NPCs, auf eingehende Textmeldungen
257 laesst sich nutzen, um schoene und stimmungsvolle Gebiete mit dynamisch
258 reagierenden Bewohnern zu schaffen. Es laesst sich auf der dunklen Seite
259 der Macht hingegen auch verwenden, um ueble Konstrukte zu realisieren,
260 fuer die es seit Ewigkeiten geeignete Implementierungen gibt, und die
261 demzufolge niemals durch eine Endabnahme durch einen RM durchschluepfen
262 duerfen. Ein paar reale NPC-Beispiele aus der Praxis:
263
264 Schnipsel 1)
265
266 if (sscanf(str, " %s greift den Priester %s",name1, dummy) == 2)
267 {
268 pl = find_player(lower_case(name1));
269 if (!pl || !living(pl))
Arathorn41004de2020-10-18 22:03:28 +0200270 return;
MG Mud User88f12472016-06-24 23:31:02 +0200271 else
272 Kill(pl);
273 }
274 Zweck: Simulation von AddDefender() und InformDefend()/DefendOther()
275 Kommentar: Absolutes No-Go! Mit Echo-Faehigkeiten von Spielern (Gilde oder
276 anderweitig) ist hiermit ein indirekter Playerkill moeglich.
277 Inakzeptable Implementierung.
278
279
280 Schnipsel 2)
281
282 if (sscanf(str, "%s sagt: %s\n", wer,was))
283 {
284 if (lower_case(was)=="ja" )
285 this_player()->move(zielraum, M_TPORT);
286 }
287 Zweck: Ausloesen eines Kommandos, ohne "sage ..." als Befehl
288 ueberschreiben zu muessen.
289 Kommentar: Ausnutzbar als Remote-Fluchtteleport, indem man die Meldung
290 mittels teile-mit an den NPC sendet:
291 "Robert teilt Dir mit: sagt: ja", was ungeprueft ein move()
292 zur Folge hat. Offensichtlich ebenso ungeeignet wie das
293 vorige Beispiel.
294
295
296 Schnipsel 3)
297
298 if (sscanf(lower_case(str),"%s sagt: %sversteck%s",s1,s2,s3))
299 tell_room(environment(),sprintf("Der Fisch sagt: Das ist aber keine "
300 "grosse Hilfe, %s.\n",capitalize(s1)),({TO}));
301
302 sieht erstmal harmlos aus, fuehrt aber mit der Anweisung
303
304 SetChats(8, ({ "Der Fisch sagt: Wo kann ich mich nur verstecken?"}) );
305
306 dazu, dass der NPC dauernd mit sich selber schwatzt. Kein kritischer Bug
307 im eigentlichen Sinn, aber auf jeden Fall der Atmosphaere im Gebiet
308 sehr abtraeglich.
309
310o move()
311 Ueberschreiben von move() ist eine extrem heikle Angelegenheit, bei der
312 beim kleinsten Fehler massive Probleme resultieren koennen, jedoch meist
313 nicht offensichtlich ist, woher das resultiert. Als allgemeine Empfehlung
314 sollte gelten, dass move() NIE ueberschrieben wird, und wenn, dann muss
315 ausfuehrlich und aufmerksam geprueft werden, was da passiert, und ob der
316 gewuenschte Effekt nicht anders sauberer erreicht werden kann.
317 Als zusaetzlicher Hinweis sei auf NotifyMove() und PreventMove() verwiesen,
318 mit deren Hilfe sich die allermeisten Faelle erschlagen lassen, in denen
319 Magier faelschlicherweise glauben, move() ueberschreiben zu muessen.
320
321o Defend()/Attack()
322 hier ist ein beliebter Fehler einfach der, dass man am Ende der Funktion
323 ::Defend() bzw. ::Attack() ruft, aber im Codeblock vorher das Objekt
324 durch eigenen Tod oder anderes schon zerstoert wurde. Dann geht das schief.
325 Einfach mal hinschauen - es ist aber kein wirklich gravierender Fehler,
326 da sowas im Kampf meist ziemlich schnell auffaellt.
327
328o call_out()
329 Hierzu zwei Hinweise: zum einen fuehrt call_out("x",0) seit der Umstellung
330 auf LDmud als Driver nicht mehr implizit zu einem call_out("x",1), wie es
331 zuvor war, sondern tatsaechlich zu einem fast sofortigen Funktionsaufruf der
332 Funktion x() - mit allen Konsequenzen, inklusive eines "too long eval"-
333 Bugs. Wer eine echte Verzoegerung braucht, muss mindestens call_out("x",1)
334 verwenden.
335 Zum anderen wurde mit LDmud die Granularitaet des reset()-Aufrufes auf
336 Heartbeat-Genauigkeit (2 s) verfeinert, so dass man bequem laengere
337 Verzoegerungen auf die Verwendung von reset() umstellen kann.
338
339o Zerstoeren von Objekten mit remove() oder destruct()
340 Man sollte einen sehr kritischen Blick auf Konstrukte werfen, die
341 nach einem remove() noch weiteren Code ausfuehren (Ausnahme: echte efuns
342 und Compiler-Konstrukte wie return).
343 Wenn man Objekte zerstoeren will oder muss, sollte man immer zuerst
344 remove() verwenden. Destruct muss dem absoluten Ausnahmefall vorbehalten
345 bleiben. Man sollte im Hinterkopf behalten, dass Objekte gute Gruende haben
346 koennen, sich einem remove() zu verweigern.
347
348o for()-Schleifen
349 Eigentlich keine Funktion, aber an dieser Stelle doch passend:
350 for()-Schleifen sollten generell durch foreach()-Konstruktionen ersetzt
Arathorn41004de2020-10-18 22:03:28 +0200351 werden, da dies signifikant und messbar schneller ist. Der groesste
352 Zeit- und Kostenfaktor ist die Verwendung von sizeof() als Abbruchkriterium
353 in einer for()-Schleife. Wenn sich die Schleife also nicht ersetzen laesst,
354 dann nehmt zumindest einen konstanten Wert als Abbruchkriterium.
MG Mud User88f12472016-06-24 23:31:02 +0200355
356o write_file()
357 Benutzung dieser Funktion nur in begruendeten Ausnahmefaellen abnehmen, da
358 keinerlei Begrenzung der Dateigroesse existiert. Insbesondere bei Logfiles
359 entstehen hierdurch im Laufe der Zeit Monsterdateien, die nur Plattenplatz
360 verbrauchen, aber kaum zu ueberschauen sind. Statt write_file() wird in
361 den allermeisten Faellen log_file() mit der Standardgroesse von 50 kB fuer
362 Logfile und eine ggf. vorhandene Altversion (*.OLD) ausreichend sein.
Arathorn41004de2020-10-18 22:03:28 +0200363 Standardmaessig ist das Schreiben eines Questlog-Eintrages in /log/quest
364 der einzige Einsatzzweck, wo write_file() wirklich notwendig ist.
365 Ansonsten sind Ausnahmen vorstellbar, wenn die neuen Daten die alte Datei
366 komplett ersetzen, d.h. nicht angehaengt werden.
MG Mud User88f12472016-06-24 23:31:02 +0200367
368o Verwalten von charakterbezogenen Daten
369 Als Beispiel seien hier Statusdaten fuer den Ablauf von Quests genannt,
370 oder Highscores in irgendwelchen Toplisten. Fuer die Umsetzung dieser
371 Datenerfassung werden typischerweise zwei Techniken eingesetzt. Zum
372 einen kann ein Masterobjekt erstellt werden, das die Daten sammelt und
373 mittels save_object() dauerhaft speichert. Zum anderen kann man auch
374 Daten in einer Property im Spieler ablegen und diese je nach Anwendungs-
375 fall auf SAVE setzen.
376
377 Bei der ersten Variante wird man ueblicherweise die UID oder UUID des
378 Spielers als Indizierungsmerkmal verwenden. Der erste Fallstrick ist nun,
379 dass die UID bei Spielern (nicht Sehern) ggf. nach einer Selbstloeschung
380 neu vergeben werden kann, so dass die Daten inkonsistent werden bzw. der
381 Spieler scheinbar schon in Eurem Master eingetragen ist, obwohl es sich
382 eigentlich um jemand ganz anderes handelt.
383 Als Abhilfemassnahme bietet sich folgendes an:
384 a) UUID verwenden, da diese fuer jeden Spieler eindeutig ist.
385 b) Hinweis: find_player() kann auch mit UUIDs umgehen und das zugehoerige
386 Spielerobjekt ermitteln.
387 c) Man sollte ggf. auf das Mudlib-Event EVT_LIB_PLAYER_DELETION lauschen,
388 um Spieler auszutragen, die sich loeschen, wodurch die zugehoerigen
389 Daten obsolet werden.
390
391 Bei der zweiten Variante muss man verschiedene Dinge beruecksichtigen:
392 a) nicht endlos viele Properties machen, sondern pro Thema (z.B. Quest)
393 einfach eine.
394 b) nur die Properties speichern, bei denen das wirklich noetig ist.
395 c) Speichert man Properties und die Aufgabe wird erledigt, d.h. der
396 Inhalt der Property obsolet, muss die Property wieder geloescht werden.