blob: 778d9aefa3e59b3ed7ef0d299c28e3fd44e3168f [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{
Zesstraecc82c62020-03-30 13:49:39 +020041 // Wert vom PreventMove liefern (fuer Meldungen bzgl. P_NOGET & Co), aber
42 // wenn das die Bewegung erlauben wurde, darf sie dennoch nicht stattfinden,
43 // dann generischer Move-Fehler.
44 return ::PreventMove(dest, 0, method) || ME_NOT_ALLOWED;
Zesstrab0b953f2018-08-30 23:55:28 +020045}
46
Zesstrabc517a42018-12-02 20:26:38 +010047public object *AllVirtualEnvironments()
48{
49 if (cloner)
50 {
51 object *cloner_envs = all_environment(cloner)
52 || cloner->AllVirtualEnvironments();
53 if (cloner_envs)
54 return ({cloner}) + cloner_envs;
55 return ({cloner});
56 }
57 return 0;
58}
Zesstra0339e4f2019-11-11 21:38:07 +010059
60// Fehler werden nicht an diesem Objekt eingetragen, sondern am erzeugenden
61// Objekt. Wenn das unbekannt ist, wird das Standardverfahren zum Logging
62// verwendet.
63public int SmartLog(string unused, string error_type, string meldung,
64 string date)
65{
66 // Wenn kein Cloner, loggt der Aufrufer (vermutlich an diesem Objekt).
67 // Und ausserdem nur Meldungen von Spielershells akzeptieren.
68 if (!cloner
69 || strstr(load_name(previous_object()),"/std/shells/") == -1)
70 return 0;
71
72 mapping err = ([ F_PROG: "unbekannt",
73 F_LINE: 0,
74 F_MSG: meldung,
75 F_OBJ: cloner
76 ]);
77 string desc="etwas unbekanntes";
78 switch(error_type) {
79 case "BUGS":
80 desc="einen Fehler";
81 err[F_TYPE]=T_REPORTED_ERR;
82 break;
83 case "DETAILS":
84 desc="ein fehlendes Detail";
85 err[F_TYPE]=T_REPORTED_MD;
86 break;
87 case "IDEA":
88 desc="eine Idee";
89 err[F_TYPE]=T_REPORTED_IDEA;
90 break;
91 case "TYPO":
92 desc="einen Typo";
93 err[F_TYPE]=T_REPORTED_TYPO;
94 break;
95 case "SYNTAX":
96 desc="einen Syntaxhinweis";
97 err[F_TYPE]=T_REPORTED_SYNTAX;
98 break;
99 }
100 // Eintragung in die Fehler-DB
Vaniondb7851b2020-03-10 21:52:34 +0100101 string hashkey = ({string})ERRORD->LogReportedError(err);
Zesstra0339e4f2019-11-11 21:38:07 +0100102 if (stringp(hashkey))
103 {
104 previous_object()->ReceiveMsg(sprintf(
105 "Ein kleiner Fehlerteufel hat D%s an %s unter der ID %s "
106 "notiert.",
107 (cloner->IsRoom() ? "diesem Raum" : cloner->name(WEM,1)), desc,
108 hashkey || "N/A"),
109 MT_NOTIFICATION | MSG_DONT_BUFFER | MSG_DONT_STORE | MSG_DONT_IGNORE,
110 MA_UNKNOWN, 0, this_object());
111 return 1; // wurde erfolgreich protokolliert.
112 }
113
114 return 0; // nicht erfolgreich, Aufrufer muss protokollieren.
115}