blob: fe07e879504d1331c6f850df983eca34753b0823 [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
Arathornee7ec862020-12-01 23:57:24 +0100100 moechtest, sprich am besten einen EM an, der Dir dabei hilft:
Arathorn41004de2020-10-18 22:03:28 +0200101 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
Arathornee7ec862020-12-01 23:57:24 +0100144 erledigt, sobald der NPC das erste Mal getoetet wurde, dies muss also
145 nicht gesondert ueberprueft werden.
146 - Gibt es Kollisionen zwischen NPC-Namen und Spielernamen? Falls noetig,
147 sollten die Namen von NPC gebanisht werden, sofern es sich um
148 Personennamen handelt.
MG Mud User88f12472016-06-24 23:31:02 +0200149
150o Alle NPCs sollten vor Anschluss einmal gekillt werden, um sie auf
151 grundsaetzliche Kampf-Funktionsfaehigkeit zu pruefen.
152
153o Haben NPCs Namen, sollte ueberlegt werden, diese Namen ggf. zu banishen.
154 (hilfe banish).
155
156o Es existiert ein Shell-Skript, mit dessen Hilfe man offensichtliche
157 Formfehler in einem kompletten Verzeichnis ermitteln kann (Umlaute im
158 Code, zu lange Zeilen etc.), wobei bezueglich der Formalien auch auf
159 den Regionsmitarbeiter-Leitfaden fuer neue Projekte verwiesen werden
Arathorn41004de2020-10-18 22:03:28 +0200160 soll. Das Skript liegt im oeffentlichen Git-Repo "static-lpc-check" auf
161 dem MG-Gerrit-Server. Man kann es mit git oder ueber das Webinterface
162 herunterladen. Der Regionsmagier hat hierbei die Entscheidungsfreiheit,
163 die Berichte dieses Skripts dem Programmierer des neuen Gebiets als
164 Anhaltspunkte zur Verfuegung zu stellen, oder die Abarbeitung der
165 gemeldeten Punkte zur Voraussetzung fuer den Anschluss zu machen, aber
166 auch jede Abstufung dazwischen ist OK. :-)
MG Mud User88f12472016-06-24 23:31:02 +0200167 Zusaetzlicher Tip: Das Skript differenziert zwischen eigentlich nicht
168 akzeptablen Konstrukten und zumindest fragwuerdigen, d.h. man kann diese
169 Unterscheidung an den Verantwortlichen mit entsprechenden Forderungen
170 weitergeben.
MG Mud User88f12472016-06-24 23:31:02 +0200171
Arathorn41004de2020-10-18 22:03:28 +0200172o Sollte ein zur Abnahme anstehendes Gesellenstueck eine (grundsaetzlich
MG Mud User88f12472016-06-24 23:31:02 +0200173 selbstverstaendlich zulaessige) Gemeinschaftsarbeit sein, sollte man
Arathorn41004de2020-10-18 22:03:28 +0200174 darauf bestehen, eine sauber getrennte Codebasis in unterschiedlichen
175 Verzeichnissen vorgelegt zu bekommen, oder aber eine Auflistung, welcher
176 Beitrag von welchem Magier stammt. Es sollte klar sein, dass die
177 Beurteilung der Faehigkeiten eines Lehrlings darauf angewiesen ist, dass
178 man den Code richtig zuordnen kann.
179 Wenn eine solche Auflistung sich bis auf Funktionsebene erstreckt
MG Mud User88f12472016-06-24 23:31:02 +0200180 (z.B. "DoWield() ist von X, Details von Y, DefendFunc von Z"), ist
181 das unschoen und an sich abzulehnen.
182
183
1843) Verlegung von Dateien
185========================
186
187o Sollte ein Objekt aus einer anderen Region bzw. allgemein aus einem
188 anderen Verzeichnis (z.B. /players) in Deine Region verlegt werden
189 muessen, sind VOR dem Umhaengen folgende Punkte zu beachten:
Arathorn454f1762020-05-01 22:39:30 +0200190 -- Forscherpunkte muessen umgetragen werden
191 -- Quests und Minquests muessen umgetragen werden
192 -- Erstkill-Stufenpunkte muessen umgetragen werden
193 -- Zaubertraenke umtragen lassen
194 -- Seherportal(e) verlegen lassen
195 -- Ruestungen in Padreics Ruestungsskill umtragen lassen
Zesstra299bc492019-08-19 20:09:10 +0200196 -- Waffen in der Liste legendaerer Waffen der Kaempfergilde umtragen
Arathorn454f1762020-05-01 22:39:30 +0200197 (GM Kaempfer oder EM ansprechen)
198 -- im Gebiet vorhandene Seherhaeuser umziehen, an P_SEHERHAUS_ERLAUBT im
199 Zielraum denken
200 -- evtl. im Gebiet vorhandene Kraeuterskill-Kraeuter beruecksichtigen
Arathornae6dbc92020-07-27 23:36:15 +0200201 -- evtl. vorhandene Autoload-Objekte pruefen; in einfachen Faellen kann
202 man ein Wrapper-Objekt erstellen, das das alte beim Clonen durch das
203 neue ersetzt.
MG Mud User88f12472016-06-24 23:31:02 +0200204 -- evtl. Briefempfaenger der Postquest beruecksichtigen,
Zesstra096e2f62021-05-07 09:48:37 +0200205 -- evtl. Fotomotive von Notstroms Miniquest im Wald umstellen,
206 -- bei Kneipen: Pfad im Bierschuettler-Gildenmaster umtragen lassen
207 (GM Bierschuettler oder EM ansprechen),
MG Mud User88f12472016-06-24 23:31:02 +0200208 -- ueber die Mudlib greppen lassen, um eventuell in anderen Regionen
209 verwendete Referenzen auf die alten Pfade des umziehenden Codes
210 zu finden und dort umzustellen. Hierbei sind in Ausnahmefaellen von
211 fiesem Code auch in Spielersavefiles gespeicherte Pfade zu
212 beruecksichtigen (*ARGL*).
213
Arathorn454f1762020-05-01 22:39:30 +0200214 Sofern nichts anderes angegeben ist, muss Dir dabei ein EM helfen.
MG Mud User88f12472016-06-24 23:31:02 +0200215
2164) Seherhaeuser
217===============
218
219o Die Erlaubnis zum Bau eines Seherhauses in einem Gebiet haengt einzig und
220 allein von dem verantwortlichen Magier ab. Sollte dieser laenger nicht
221 erreichbar sein (auch nicht ueber externe Mail!), liegt die Entscheidung
222 beim Regionsmagier, der aber in jedem Fall die Eignung des Bauplatzes
223 in der Umgebung bewerten muss.
224
225o Fuer Sonderwuensche bezueglich Unsichtbarkeit von Seherhaeusern oder
226 besonderer Kommandos zum Betreten des Hauses sei auf die Datei
227 /doc/beispiele/misc/seherhaus.c verwiesen, wo die Vorgehensweise
228 erlaeutert wird. Ein Beispiel einer sehr umfangreichen Implementierung
229 findet sich in /d/ebene/room/hp_str8a.c.
230
231o Bei geaenderten Befehlen zum Betreten muss beachtet werden, dass bei einer
232 Standardimplementierung die Erlaube-Liste umgangen wird, d.h. ohne
233 besondere Vorkehrungen u.U. JEDER das Haus ungehindert betreten kann.
234 Es ist hingegen moeglich, die Erlaube-Liste abzufragen und entsprechend
235 zu behandeln, ein Beispiel hierfuer ist in /d/ebene/room/hp_str8a.c
236 nachzulesen (derzeit jedoch auf Spielerwunsch deaktiviert).
237
238
2395) Debuggen von Code
240====================
241
242o Nach dem Reparieren eines Objektes ist es meist erforderlich, das
243 betreffende Objekt neu zu laden. Falls es sich dabei um Objekte handelt,
244 die z.B. in einem Raum mittels AddItem() hinzugefuegt wurden (wie etwa
245 ein NPC), dann ist es am besten, die Datei mit dem Befehl
246 <upd -ad datei.c> zu aktualisieren und somit saemtliche Clones zu
247 zerstoeren. Wenn man mittels <upd -ar datei.c> die bestehenden Clones
248 ersetzen wuerde, wuerden diese aus der Item-Liste des clonenden Raumes
249 ausgetragen, so dass dieser Raum dann im reset() neue Items erzeugt und
250 diese in der Folge doppelt existieren wuerden.
251
252
2536) besondere Funktionen
254=======================
255
256Es kommt haeufig vor, dass Funktionen ueberschrieben werden muessen, und das
257ist auch normalerweise vollkommen normal und nicht beanstandenswert. Jedoch
258sollte man bei bestimmten Funktionen einiges Augenmerk auf die korrekte
259Ausfuehrung richten. Einige Beispiele sind nachfolgend aufgefuehrt:
260
261o catch_tell() / ReceiveMsg()
262 Die Reaktion von Objekten, insbesondere NPCs, auf eingehende Textmeldungen
263 laesst sich nutzen, um schoene und stimmungsvolle Gebiete mit dynamisch
264 reagierenden Bewohnern zu schaffen. Es laesst sich auf der dunklen Seite
265 der Macht hingegen auch verwenden, um ueble Konstrukte zu realisieren,
266 fuer die es seit Ewigkeiten geeignete Implementierungen gibt, und die
267 demzufolge niemals durch eine Endabnahme durch einen RM durchschluepfen
268 duerfen. Ein paar reale NPC-Beispiele aus der Praxis:
269
270 Schnipsel 1)
271
272 if (sscanf(str, " %s greift den Priester %s",name1, dummy) == 2)
273 {
274 pl = find_player(lower_case(name1));
275 if (!pl || !living(pl))
Arathorn41004de2020-10-18 22:03:28 +0200276 return;
MG Mud User88f12472016-06-24 23:31:02 +0200277 else
278 Kill(pl);
279 }
280 Zweck: Simulation von AddDefender() und InformDefend()/DefendOther()
281 Kommentar: Absolutes No-Go! Mit Echo-Faehigkeiten von Spielern (Gilde oder
282 anderweitig) ist hiermit ein indirekter Playerkill moeglich.
283 Inakzeptable Implementierung.
284
285
286 Schnipsel 2)
287
288 if (sscanf(str, "%s sagt: %s\n", wer,was))
289 {
290 if (lower_case(was)=="ja" )
291 this_player()->move(zielraum, M_TPORT);
292 }
293 Zweck: Ausloesen eines Kommandos, ohne "sage ..." als Befehl
294 ueberschreiben zu muessen.
295 Kommentar: Ausnutzbar als Remote-Fluchtteleport, indem man die Meldung
296 mittels teile-mit an den NPC sendet:
297 "Robert teilt Dir mit: sagt: ja", was ungeprueft ein move()
298 zur Folge hat. Offensichtlich ebenso ungeeignet wie das
299 vorige Beispiel.
300
301
302 Schnipsel 3)
303
304 if (sscanf(lower_case(str),"%s sagt: %sversteck%s",s1,s2,s3))
305 tell_room(environment(),sprintf("Der Fisch sagt: Das ist aber keine "
306 "grosse Hilfe, %s.\n",capitalize(s1)),({TO}));
307
308 sieht erstmal harmlos aus, fuehrt aber mit der Anweisung
309
310 SetChats(8, ({ "Der Fisch sagt: Wo kann ich mich nur verstecken?"}) );
311
312 dazu, dass der NPC dauernd mit sich selber schwatzt. Kein kritischer Bug
313 im eigentlichen Sinn, aber auf jeden Fall der Atmosphaere im Gebiet
314 sehr abtraeglich.
315
316o move()
317 Ueberschreiben von move() ist eine extrem heikle Angelegenheit, bei der
318 beim kleinsten Fehler massive Probleme resultieren koennen, jedoch meist
319 nicht offensichtlich ist, woher das resultiert. Als allgemeine Empfehlung
320 sollte gelten, dass move() NIE ueberschrieben wird, und wenn, dann muss
321 ausfuehrlich und aufmerksam geprueft werden, was da passiert, und ob der
322 gewuenschte Effekt nicht anders sauberer erreicht werden kann.
323 Als zusaetzlicher Hinweis sei auf NotifyMove() und PreventMove() verwiesen,
324 mit deren Hilfe sich die allermeisten Faelle erschlagen lassen, in denen
325 Magier faelschlicherweise glauben, move() ueberschreiben zu muessen.
326
327o Defend()/Attack()
328 hier ist ein beliebter Fehler einfach der, dass man am Ende der Funktion
329 ::Defend() bzw. ::Attack() ruft, aber im Codeblock vorher das Objekt
330 durch eigenen Tod oder anderes schon zerstoert wurde. Dann geht das schief.
331 Einfach mal hinschauen - es ist aber kein wirklich gravierender Fehler,
332 da sowas im Kampf meist ziemlich schnell auffaellt.
333
334o call_out()
335 Hierzu zwei Hinweise: zum einen fuehrt call_out("x",0) seit der Umstellung
336 auf LDmud als Driver nicht mehr implizit zu einem call_out("x",1), wie es
337 zuvor war, sondern tatsaechlich zu einem fast sofortigen Funktionsaufruf der
338 Funktion x() - mit allen Konsequenzen, inklusive eines "too long eval"-
339 Bugs. Wer eine echte Verzoegerung braucht, muss mindestens call_out("x",1)
340 verwenden.
341 Zum anderen wurde mit LDmud die Granularitaet des reset()-Aufrufes auf
342 Heartbeat-Genauigkeit (2 s) verfeinert, so dass man bequem laengere
343 Verzoegerungen auf die Verwendung von reset() umstellen kann.
344
345o Zerstoeren von Objekten mit remove() oder destruct()
346 Man sollte einen sehr kritischen Blick auf Konstrukte werfen, die
347 nach einem remove() noch weiteren Code ausfuehren (Ausnahme: echte efuns
348 und Compiler-Konstrukte wie return).
349 Wenn man Objekte zerstoeren will oder muss, sollte man immer zuerst
350 remove() verwenden. Destruct muss dem absoluten Ausnahmefall vorbehalten
351 bleiben. Man sollte im Hinterkopf behalten, dass Objekte gute Gruende haben
352 koennen, sich einem remove() zu verweigern.
353
354o for()-Schleifen
355 Eigentlich keine Funktion, aber an dieser Stelle doch passend:
356 for()-Schleifen sollten generell durch foreach()-Konstruktionen ersetzt
Arathorn41004de2020-10-18 22:03:28 +0200357 werden, da dies signifikant und messbar schneller ist. Der groesste
358 Zeit- und Kostenfaktor ist die Verwendung von sizeof() als Abbruchkriterium
359 in einer for()-Schleife. Wenn sich die Schleife also nicht ersetzen laesst,
360 dann nehmt zumindest einen konstanten Wert als Abbruchkriterium.
MG Mud User88f12472016-06-24 23:31:02 +0200361
362o write_file()
363 Benutzung dieser Funktion nur in begruendeten Ausnahmefaellen abnehmen, da
364 keinerlei Begrenzung der Dateigroesse existiert. Insbesondere bei Logfiles
365 entstehen hierdurch im Laufe der Zeit Monsterdateien, die nur Plattenplatz
366 verbrauchen, aber kaum zu ueberschauen sind. Statt write_file() wird in
367 den allermeisten Faellen log_file() mit der Standardgroesse von 50 kB fuer
368 Logfile und eine ggf. vorhandene Altversion (*.OLD) ausreichend sein.
Arathorn41004de2020-10-18 22:03:28 +0200369 Standardmaessig ist das Schreiben eines Questlog-Eintrages in /log/quest
370 der einzige Einsatzzweck, wo write_file() wirklich notwendig ist.
371 Ansonsten sind Ausnahmen vorstellbar, wenn die neuen Daten die alte Datei
372 komplett ersetzen, d.h. nicht angehaengt werden.
MG Mud User88f12472016-06-24 23:31:02 +0200373
374o Verwalten von charakterbezogenen Daten
375 Als Beispiel seien hier Statusdaten fuer den Ablauf von Quests genannt,
376 oder Highscores in irgendwelchen Toplisten. Fuer die Umsetzung dieser
377 Datenerfassung werden typischerweise zwei Techniken eingesetzt. Zum
378 einen kann ein Masterobjekt erstellt werden, das die Daten sammelt und
379 mittels save_object() dauerhaft speichert. Zum anderen kann man auch
380 Daten in einer Property im Spieler ablegen und diese je nach Anwendungs-
381 fall auf SAVE setzen.
382
383 Bei der ersten Variante wird man ueblicherweise die UID oder UUID des
384 Spielers als Indizierungsmerkmal verwenden. Der erste Fallstrick ist nun,
385 dass die UID bei Spielern (nicht Sehern) ggf. nach einer Selbstloeschung
386 neu vergeben werden kann, so dass die Daten inkonsistent werden bzw. der
387 Spieler scheinbar schon in Eurem Master eingetragen ist, obwohl es sich
388 eigentlich um jemand ganz anderes handelt.
389 Als Abhilfemassnahme bietet sich folgendes an:
390 a) UUID verwenden, da diese fuer jeden Spieler eindeutig ist.
391 b) Hinweis: find_player() kann auch mit UUIDs umgehen und das zugehoerige
392 Spielerobjekt ermitteln.
393 c) Man sollte ggf. auf das Mudlib-Event EVT_LIB_PLAYER_DELETION lauschen,
394 um Spieler auszutragen, die sich loeschen, wodurch die zugehoerigen
395 Daten obsolet werden.
396
397 Bei der zweiten Variante muss man verschiedene Dinge beruecksichtigen:
398 a) nicht endlos viele Properties machen, sondern pro Thema (z.B. Quest)
399 einfach eine.
400 b) nur die Properties speichern, bei denen das wirklich noetig ist.
401 c) Speichert man Properties und die Aufgabe wird erledigt, d.h. der
402 Inhalt der Property obsolet, muss die Property wieder geloescht werden.