Meldungen am vitem_proxy am Erzeuger loggen.

Wenn eine Fehlermeldung an einem vitem_proxy abgesetzt wird,
wird diese am Erzeuger protokolliert, da dieser das vItem
unter seiner Kontrolle und konfiguriert hat (vItem ohne
Templat!).

Change-Id: I3471a985ad28e070f2a4b06979b95b5f6716a763
diff --git a/obj/vitem_proxy.c b/obj/vitem_proxy.c
index 5a957e3..333d6ce 100644
--- a/obj/vitem_proxy.c
+++ b/obj/vitem_proxy.c
@@ -2,6 +2,10 @@
 
 inherit "/std/container";
 #include <moving.h>
+#include <errord.h>
+#include <config.h>
+#include <language.h>
+#include <living/comm.h>
 
 object cloner;
 
@@ -49,3 +53,60 @@
   }
   return 0;
 }
+
+// Fehler werden nicht an diesem Objekt eingetragen, sondern am erzeugenden
+// Objekt. Wenn das unbekannt ist, wird das Standardverfahren zum Logging
+// verwendet.
+public int SmartLog(string unused, string error_type, string meldung,
+                    string date)
+{
+  // Wenn kein Cloner, loggt der Aufrufer (vermutlich an diesem Objekt).
+  // Und ausserdem nur Meldungen von Spielershells akzeptieren.
+  if (!cloner
+      || strstr(load_name(previous_object()),"/std/shells/") == -1)
+    return 0;
+
+  mapping err = ([ F_PROG: "unbekannt",
+           F_LINE: 0,
+           F_MSG: meldung,
+           F_OBJ: cloner
+         ]);
+  string desc="etwas unbekanntes";
+  switch(error_type) {
+    case "BUGS":
+      desc="einen Fehler";
+      err[F_TYPE]=T_REPORTED_ERR;
+      break;
+    case "DETAILS":
+      desc="ein fehlendes Detail";
+      err[F_TYPE]=T_REPORTED_MD;
+      break;
+    case "IDEA":
+      desc="eine Idee";
+      err[F_TYPE]=T_REPORTED_IDEA;
+      break;
+    case "TYPO":
+      desc="einen Typo";
+      err[F_TYPE]=T_REPORTED_TYPO;
+      break;
+    case "SYNTAX":
+      desc="einen Syntaxhinweis";
+      err[F_TYPE]=T_REPORTED_SYNTAX;
+      break;
+  }
+  // Eintragung in die Fehler-DB
+  string hashkey = (string)ERRORD->LogReportedError(err);
+  if (stringp(hashkey))
+  {
+    previous_object()->ReceiveMsg(sprintf(
+          "Ein kleiner Fehlerteufel hat D%s an %s unter der ID %s "
+          "notiert.",
+          (cloner->IsRoom() ? "diesem Raum" : cloner->name(WEM,1)), desc,
+          hashkey || "N/A"),
+        MT_NOTIFICATION | MSG_DONT_BUFFER | MSG_DONT_STORE | MSG_DONT_IGNORE,
+        MA_UNKNOWN, 0, this_object());
+    return 1; // wurde erfolgreich protokolliert.
+  }
+
+  return 0; // nicht erfolgreich, Aufrufer muss protokollieren.
+}