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.
+}
diff --git a/secure/errord.c b/secure/errord.c
index 6ce0759..b7d647b 100644
--- a/secure/errord.c
+++ b/secure/errord.c
@@ -344,10 +344,11 @@
 // T_REPORTED_MD, T_REPORTED_SYNTAX
 public string LogReportedError(mapping err)
 {
-    //darf nur von Spielershells oder Fehlerteufel gerufen werden.
+    //darf nur von Spielershells oder Objekt in /obj/ (z.B. Fehlerteufel oder
+    //vitem_proxy) gerufen werden.
     if (extern_call() && !previous_object()
         || (strstr(load_name(previous_object()),"/std/shells/") == -1
-           && load_name(previous_object()) != "/obj/tools/fehlerteufel"))
+            && strstr(load_name(previous_object()), "/"LIBOBJDIR"/") == -1))
         return 0;
 
     //DEBUG("LogReportedError\n");