blob: 2543f167c951b7bf5f8a303d7efdd9434eeb3f8d [file] [log] [blame]
Zesstrab0b953f2018-08-30 23:55:28 +02001#pragma strong_types,rtt_checks
2
3inherit "/std/container";
4#include <moving.h>
Zesstra0339e4f2019-11-11 21:38:07 +01005#include <errord.h>
6#include <config.h>
7#include <language.h>
8#include <living/comm.h>
Zesstrab0b953f2018-08-30 23:55:28 +02009
Zesstrabc517a42018-12-02 20:26:38 +010010object cloner;
11
Zesstrab0b953f2018-08-30 23:55:28 +020012protected void create()
13{
Zesstrabc517a42018-12-02 20:26:38 +010014 cloner=previous_object();
Zesstrab0b953f2018-08-30 23:55:28 +020015 ::create();
16 // Das Objekt raeumt sich selber im reset auf. (D.h. kein Env-Check)
17 SetAutoObject(1);
18}
19
20// Dieses Objekt raeumt sich immer im ersten reset auf - es ist kurzlebig und
21// transient und Aenderungen an seinen Daten bleiben nicht erhalten.
22void reset()
23{
24 remove(1);
25}
26
27public varargs void init(object origin)
28{
29 // leer ueberschreiben. Das klingt abstrus, hat aber folgenden Hintergrund:
30 // dieses Objekt ist nicht dazu gedacht, in irgendeine Umgebung zu gelangen.
31 // Und selbst wenn das jemand mit M_NOCHECK tut, soll die Interaktion dieses
32 // Objekts mit anderen minimiert werden. Also keine Anmeldung von actions
33 // etc.
34}
35
36// Auch dies ist ungewoehnlich: Bewegung nie erlauben, daher eruebrigt sich
37// der Aufruf des geerbten PreventMove(). Auch wird M_NOCHECK nicht
38// beruecksichtigt... Don't do this anywhere else.
39protected int PreventMove(object dest, object oldenv, int method)
40{
41 return ME_NOT_ALLOWED;
42}
43
Zesstrabc517a42018-12-02 20:26:38 +010044public object *AllVirtualEnvironments()
45{
46 if (cloner)
47 {
48 object *cloner_envs = all_environment(cloner)
49 || cloner->AllVirtualEnvironments();
50 if (cloner_envs)
51 return ({cloner}) + cloner_envs;
52 return ({cloner});
53 }
54 return 0;
55}
Zesstra0339e4f2019-11-11 21:38:07 +010056
57// Fehler werden nicht an diesem Objekt eingetragen, sondern am erzeugenden
58// Objekt. Wenn das unbekannt ist, wird das Standardverfahren zum Logging
59// verwendet.
60public int SmartLog(string unused, string error_type, string meldung,
61 string date)
62{
63 // Wenn kein Cloner, loggt der Aufrufer (vermutlich an diesem Objekt).
64 // Und ausserdem nur Meldungen von Spielershells akzeptieren.
65 if (!cloner
66 || strstr(load_name(previous_object()),"/std/shells/") == -1)
67 return 0;
68
69 mapping err = ([ F_PROG: "unbekannt",
70 F_LINE: 0,
71 F_MSG: meldung,
72 F_OBJ: cloner
73 ]);
74 string desc="etwas unbekanntes";
75 switch(error_type) {
76 case "BUGS":
77 desc="einen Fehler";
78 err[F_TYPE]=T_REPORTED_ERR;
79 break;
80 case "DETAILS":
81 desc="ein fehlendes Detail";
82 err[F_TYPE]=T_REPORTED_MD;
83 break;
84 case "IDEA":
85 desc="eine Idee";
86 err[F_TYPE]=T_REPORTED_IDEA;
87 break;
88 case "TYPO":
89 desc="einen Typo";
90 err[F_TYPE]=T_REPORTED_TYPO;
91 break;
92 case "SYNTAX":
93 desc="einen Syntaxhinweis";
94 err[F_TYPE]=T_REPORTED_SYNTAX;
95 break;
96 }
97 // Eintragung in die Fehler-DB
Vaniondb7851b2020-03-10 21:52:34 +010098 string hashkey = ({string})ERRORD->LogReportedError(err);
Zesstra0339e4f2019-11-11 21:38:07 +010099 if (stringp(hashkey))
100 {
101 previous_object()->ReceiveMsg(sprintf(
102 "Ein kleiner Fehlerteufel hat D%s an %s unter der ID %s "
103 "notiert.",
104 (cloner->IsRoom() ? "diesem Raum" : cloner->name(WEM,1)), desc,
105 hashkey || "N/A"),
106 MT_NOTIFICATION | MSG_DONT_BUFFER | MSG_DONT_STORE | MSG_DONT_IGNORE,
107 MA_UNKNOWN, 0, this_object());
108 return 1; // wurde erfolgreich protokolliert.
109 }
110
111 return 0; // nicht erfolgreich, Aufrufer muss protokollieren.
112}