Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/std/player/pklog.c b/std/player/pklog.c
new file mode 100644
index 0000000..4613ebe
--- /dev/null
+++ b/std/player/pklog.c
@@ -0,0 +1,108 @@
+// MorgenGrauen MUDlib
+/** \file /std/player/pklog.c
+* Funktion zur Detektion und Loggen von Angriffen von Spielern auf Spieler.
+* \author Zesstra
+* \date 12.08.2008
+* \version $Id$
+*/
+/* Changelog:
+*/
+#pragma strong_types
+#pragma save_types
+#pragma no_clone
+#pragma no_shadow
+#pragma pedantic
+#pragma range_check
+
+#include <defines.h>
+#include <commands.h>
+#include <wizlevels.h>
+#include <player/base.h>
+
+#define RNAME(x) capitalize(getuid(x))
+
+/** Ist victim in einer Arena oder Schattenwelt?
+  */
+nomask int CheckArenaFight(object victim) {
+  return (object_name(environment(victim))[0..14]=="/d/schattenwelt");
+}
+
+nomask protected int CheckPlayerAttack(object attacker, object victim,
+                                       string angriffsmsg)
+{
+  // falls mal jemand ne Closure auf diese Funktion in die Finger bekommt und
+  // protected umgeht.
+  if (extern_call())
+      raise_error(sprintf("Extern Call to CheckPlayerAttack in %O!\n",ME));
+
+  // nur Spieler sind interessant.
+  if ( query_once_interactive(attacker) && query_once_interactive(victim)
+      && !( IS_LEARNER(attacker) && IS_LEARNER(victim) ) ) {
+    string filemessage, wizshout;
+    int arena;
+
+    // Arena- oder Schattenweltkampf?
+    arena=CheckArenaFight(attacker);
+
+    wizshout = sprintf("\n**** %s greift %s an. (%s) ***\n",
+        RNAME(attacker), RNAME(victim), object_name(ME));
+    filemessage = sprintf("\n[%s] %s greift %s an. (%s) %s %s\n",
+        strftime("%d%m%y-%H:%M:%S",time()), RNAME(attacker),
+        RNAME(victim), object_name(this_object()),
+        (arena ? "(ARENA)" : ""),
+        (victim->QueryProp(P_TESTPLAYER) ? "(Testspieler)" : ""));
+
+    // Angriffsmsg vom Aufrufer anhaengen.
+    if (stringp(angriffsmsg) && sizeof(angriffsmsg)) {
+      wizshout += angriffsmsg;
+      filemessage += angriffsmsg;
+    }
+    // ggf. echten TI anhaengen oder warnen, falls keiner existiert.
+    if ( this_interactive() != attacker ) {
+        if ( this_interactive() ) {
+          wizshout += "ACHTUNG: TI = " + getuid(this_interactive())
+            +"\n";
+          filemessage += "ACHTUNG: TI = "+getuid(this_interactive())
+            +"\n";
+        }
+        else {
+            filemessage += " ACHTUNG: Kein TI vorhanden!\n";
+            wizshout += " ACHTUNG: Kein TI vorhanden!\n";
+        }
+    }
+    // caller_stack() mitloggen (aber nicht Magier vollscrollen).
+    filemessage += "Callerstack: " + CountUp(map(caller_stack(1),
+          function string (object po) {return to_string(po);}),
+        ", ", ", ") + "\n";
+    // Commandstack anhaengen
+    mixed cstack = command_stack();
+    filemessage += "Commandstack: " + CountUp(map(cstack,
+          function string (mixed arr) {
+              return sprintf("({Original-TP: %O, TP: %O, Kommando: %s})",
+                arr[CMD_ORIGIN],arr[CMD_PLAYER],arr[CMD_TEXT] || "");
+          },", ",", ")) + "\n";
+    // fuer Magier originaeren Befehl anhaengen:
+    if (sizeof(cstack))
+      wizshout += sprintf("Kommando: %s\n",
+          cstack[0][CMD_TEXT] || "<unbekannt>");
+
+    wizshout += "\n";
+
+    // erstmal loggen
+    if ( arena )
+        log_file("ATTACKS_ARENA", filemessage);
+    else 
+        log_file("ATTACKS", filemessage);
+
+    // dann Magiern bescheidgeben
+    if ( !arena && !(victim->QueryProp(P_TESTPLAYER)) ) {
+      foreach(object wiz: users()) {
+        if ( IS_LORD(wiz) || IS_DEPUTY(wiz) )
+          tell_object(wiz, wizshout);
+      }
+    }
+    return 1; // Spieler-Spielerkampf
+  }
+  return 0; // kein Spieler-Spielerkampf
+}
+