Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/std/shells/magier/players.c b/std/shells/magier/players.c
new file mode 100644
index 0000000..c563d9d
--- /dev/null
+++ b/std/shells/magier/players.c
@@ -0,0 +1,529 @@
+// MorgenGrauen MUDlib
+//
+// players.c
+//
+// $Id: players.c 9551 2016-04-20 22:54:58Z Arathorn $
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <wizlevels.h>
+#include <ansi.h>
+#include <logging.h>
+#define NEED_PROTOTYPES
+#include <magier.h>
+#include <thing/properties.h>
+#include <thing/description.h>
+#include <living/comm.h>
+#include <player.h>
+#undef NEED_PROTOTYPES
+#include <properties.h>
+#include <moving.h>
+
+static mixed _query_localcmds()
+{
+  return ({({"zap","_zap",0,WIZARD_LVL}),
+           ({"verfolge","_verfolge",0,LEARNER_LVL}),
+           ({"trans","_trans",0,LEARNER_LVL}),
+           ({"peace","_frieden",0,LEARNER_LVL}),
+           ({"frieden","_frieden",0,LEARNER_LVL}),
+           ({"pwho","_pwho",0,WIZARD_LVL}),
+           ({"zwinge","_zwinge",0,WIZARD_LVL}),
+           ({"heal","_heile",0,WIZARD_LVL}),
+           ({"heil","_heile",1,WIZARD_LVL}),
+           ({"people","_people",0,LEARNER_LVL}),
+           ({"spieler","_spieler",0,WIZARD_LVL})});
+}
+
+//                               #######
+//################################ ZAP ##################################
+//                               #######
+
+private string _zap_message(string str, object obj)
+{
+  str=regreplace(str,"@@wer@@",(string)obj->name(WER,2),1);
+  str=regreplace(str,"@@wessen@@",(string)obj->name(WESSEN,2),1);
+  str=regreplace(str,"@@wem@@",(string)obj->name(WEM,2),1);
+  str=regreplace(str,"@@wen@@",(string)obj->name(WEN,2),1);
+  str=regreplace(str,"@@ich@@",name(WER,2),1);
+  return capitalize(str);
+}
+
+static int _zap(string str)
+{
+    object opfer;
+    string *message, dummy;
+    int spieler;
+
+    if (!str) return USAGE("zap <name>");
+    if (sscanf( str, "spieler %s", dummy ))
+    {
+      str = dummy;
+      spieler = 1;
+    }
+    if (opfer=present(str,environment()))
+    {
+      if ( !living(opfer) )
+      {
+        printf("%s ist doch gar kein Lebewesen!\n",capitalize(str) );
+        return 1;
+      }
+      if (query_once_interactive(opfer)&&!spieler )
+      {
+        printf( "Spieler kannst Du nur mit der Syntax 'zap spieler <name>' "
+                "toeten!\n" );
+        return 1;
+      }
+      else
+        if ( !query_once_interactive(opfer) && spieler )
+        {
+          printf( "Aber %s ist doch gar kein Spieler!\n",capitalize(str));
+          return 1;
+        }
+
+      message = QueryProp(P_ZAP_MSG);
+
+      if ( !pointerp(message) || sizeof(message) != 3 ){
+          tell_room(environment(),sprintf("%s beschwoert einen Blitz "
+                "vom Himmel.\n",capitalize(getuid())),({ this_object() }));
+          printf("Du toetest %s.\n",opfer->name( WEN,2));
+      }
+      else
+      {
+        printf(_zap_message(message[0],opfer));
+        tell_room(environment(),_zap_message(message[1],opfer),
+             ({this_player(),opfer}));
+        tell_object(opfer,_zap_message(message[2],opfer));
+      }
+
+      opfer->die();
+      return 1;
+  }
+  else{
+      printf("Sowas siehst Du hier nicht.\n");
+      return 1;
+  }
+}
+
+
+//                             ############
+//############################## VERFOLGE ################################
+//                             ############
+
+static int _verfolge(string str)
+{
+  // Wenn nichts eingegeben wurde, wird ver Verfolgungsmodus beendet, sofern
+  // er zuvor eingeschaltet war. Ansonsten wird eine Fehlermeldung 
+  // ausgegeben.
+  if (!sizeof(str))
+  {
+    mixed *pur = Query(P_PURSUERS);
+    if ( pointerp(pur) && sizeof(pur) && objectp(pur[0]) )
+    {
+      pur[0]->RemovePursuer(this_object());
+      ReceiveMsg("Verfolgungsmodus abgeschaltet.", MT_NOTIFICATION);
+    }
+    else
+    {
+      ReceiveMsg("Du verfolgst doch ueberhaupt niemanden.", MT_NOTIFICATION);
+    }
+    return 1;
+  }
+  str=lower_case(str);
+  
+  // match_living() erlaubt die Pruefung, ob die Angabe eindeutig war.
+  int|string lv = match_living(str);
+  if ( intp(lv) )
+  {
+    if ( lv == -2 )
+      ReceiveMsg("Kein solches Wesen gefunden.", MT_NOTIFICATION);
+    else
+      ReceiveMsg(sprintf("verfolge: '%s' ist nicht eindeutig.\n", str),
+        MT_NOTIFICATION);
+    return 1;
+  }
+  
+  // Spieler zuerst auswaehlen, danach im Raum anwesende Lebewesen.
+  object ziel = find_player(lv) || present(lv, environment(this_player()));
+  
+  // Wurde kein Lebewesen gefunden, wird das erste Element aus der Liste der
+  // Lebewesen dieses Namens gewaehlt, falls vorhanden. Nur Lebewesen mit
+  // Environment kommen in Frage, denn sonst gibt es keinen Raum, in den der
+  // neue Verfolger bewegt werden koennte.
+  if ( !objectp(ziel) ) {
+    object* eligible_livings = filter(find_livings(lv), #'environment);
+    if (sizeof(eligible_livings))
+      ziel = eligible_livings[0];
+  }
+  
+  // Endlich etwas gefunden? Dann Verfolger eintragen und zum Ziel bewegen.
+  if ( objectp(ziel) )
+  {
+    if ( ziel == this_player() ) 
+    {
+      ReceiveMsg("Du kannst Dich nicht selbst verfolgen.", MT_NOTIFICATION);
+    }
+    else
+    {
+      ReceiveMsg(sprintf(
+        "Du verfolgst jetzt %s. [%s]", ziel->name(WEN), object_name(ziel)),
+        MT_NOTIFICATION, MA_MOVE);
+      ziel->AddPursuer(this_object());
+      ziel->TakeFollowers();
+    }
+  }
+  else
+  {
+    ReceiveMsg("Kein Wesen mit dem Namen '"+lv+"' gefunden, oder nur "
+      "solche ohne Environment.", MT_NOTIFICATION, 0, "verfolge: ");
+  }
+  return 1;
+}
+
+
+//                              #########
+//############################### TRANS #################################
+//                              #########
+
+static int _trans(string str)
+{
+  object living;
+
+  if (!sizeof(str))
+    return _notify_fail("Syntax: trans <spielername>\n"),0;
+  str=match_living(str,0);
+  if (intp(str))
+    switch (str)
+    {
+      case -1: write("Das war nicht eindeutig.\n"); return 1;
+      case -2: write("So ein Wesen gibt es nicht.\n"); return 1;
+    }
+  if(living=find_living(str))
+  {
+    if (living->move(object_name(environment()),
+                     M_TPORT|M_NOCHECK)<=0)
+    {
+      printf("Teleportieren von %s fehlgeschlagen.\n",living->Name(WEM));
+      if (IS_LEARNER(living))
+        tell_object(living,sprintf("%s wollte Dich teleportieren, "
+             "hat aber versagt!\n",capitalize(getuid())));
+      return 1;
+    }
+    tell_object(living,sprintf(
+    "Ein seltsames Gefuehl ueberkommt Dich ...\n"
+    "Du verlierst die Orientierung ...\n"
+    +(QueryProp(P_INVIS)?"":"%s holt Dich zu sich.\n"),
+    capitalize(getuid())));
+    printf("%s wurde herbeizitiert.\n",living->Name(WER));
+    return 1;
+  }
+  printf("Das Lebewesen '%s' konnte nicht gefunden werden.\n",
+         capitalize(str));
+  return 1;
+}
+
+//                             ###########
+//############################## FRIEDEN #################################
+//                             ###########
+
+static int _frieden(string sname)
+{
+  object *enem,obj;
+  int i;
+  string him;
+  
+  if (!sname)
+  {
+    enem=all_inventory(environment());
+    map_objects(enem,"StopHuntingMode");
+    tell_room(environment(),sprintf("%s stiftet Frieden.\n",capitalize(getuid())),
+              ({ this_object()}));
+    printf("Du stiftest Frieden.\n");
+    return 1;
+  }
+  else
+  {
+    if (!obj=find_living(sname))
+      return printf("Kein solches Lebewesen im Spiel.\n"),1;
+    him=(string)obj->name(WEM);
+    i=sizeof(enem=(object *)(((mixed *)obj->StopHuntingMode())[0]));
+    // Mistdriver ... object** waere richtig gewesen ... *seufz*
+    while(i--)
+    {
+      enem[i]->StopHuntFor(obj);
+      tell_object(obj,sprintf("%s beendet Deinen Kampf mit %s.\n",
+                              capitalize(getuid()),enem[i]->Name(WEM)));
+      tell_object(enem[0],sprintf("%s beendet Deinen Kampf mit %s.\n",
+                                  capitalize(getuid()),him));
+    }
+  }
+  printf("%s und alle Gegner wurden befriedet.\n",obj->Name(WER));
+  return 1;
+}
+
+//                              ########
+//############################### PWHO ##################################
+//                              ########
+
+#if __VERSION__ < "3.2.9"
+private int _pwho_learner_test(object ob)
+{
+  return !IS_LEARNER(ob);
+}
+#endif
+
+static int _pwho()
+{
+  mixed* spieler, res, *hands;
+  int i;
+#if __VERSION__ < "3.2.9"
+  spieler = filter(users(),#'_pwho_learner_test);
+#else
+  spieler = filter(users(),(: return !IS_LEARNER($1); :));
+#endif
+  spieler = sort_array(spieler, function int (object a, object b)
+      { return a->QueryProp(P_LEVEL) > b->QueryProp(P_LEVEL); } );
+  
+  res = "Lvl Name         Erfahrung   QP  Int Str Dex Con WC   "
+    "AC   HANDS HP  (max)\n"
+    "--------------------------------------------------------------"
+    "-----------------\n";
+  for (i=sizeof(spieler)-1; i>=0; i--)
+    res += sprintf("%3d %-12s %9d %5d %3d %3d %3d %3d %4d %4d  %5d "
+                   "%4d (%4d)\n",
+     spieler[i]->QueryProp(P_LEVEL),
+     capitalize(getuid(spieler[i])),
+     spieler[i]->QueryProp(P_XP),
+     spieler[i]->QueryProp(P_QP),
+     spieler[i]->QueryAttribute(A_INT),
+     spieler[i]->QueryAttribute(A_STR),
+     spieler[i]->QueryAttribute(A_DEX),
+     spieler[i]->QueryAttribute(A_CON),
+     spieler[i]->QueryProp(P_TOTAL_WC),
+     spieler[i]->QueryProp(P_TOTAL_AC),
+     (sizeof(hands=((int *)spieler[i]->QueryProp(P_HANDS)))?hands[1]:0),
+     spieler[i]->QueryProp(P_HP),
+     spieler[i]->QueryProp(P_MAX_HP));
+  More(res);
+  return 1;
+}
+
+//                             ##########
+//############################## ZWINGE #################################
+//                             ##########
+
+static int _zwinge(string str)
+{
+  object living;
+  string what, rest;
+  string living_name;
+
+  str = _unparsed_args();
+  if(!str|| sscanf( str, "%s %s", living_name, what ) != 2 )
+    return _notify_fail("Zwinge WEN zu WAS?\n"),0;
+  if( sscanf( what, "zu %s", rest ) == 1 ) what = rest;
+  if (!(living = find_living(living_name)))
+    return printf ("Ein Lebewesen namens '%s' konnte nicht gefunden werden!\n",
+                   capitalize(living_name)),1;
+  if (living->command_me(what))
+  {
+    printf("Du zwingst %s zu \"%s\".\n",capitalize(living_name),what);
+    if (!IS_ARCH(this_object())&&getuid()!=(string)living->QueryProp(P_TESTPLAYER))
+      log_file(SHELLLOG("ZWINGE"),
+               sprintf("%s zwingt %s (%s) zu %s [%s]\n",
+                       capitalize(getuid()),living->Name(),capitalize(getuid(living)),
+                       what,dtime(time())));
+  }
+  else
+    write("Hat leider nicht geklappt!\n");
+  return 1;
+}
+
+//                              #########
+//############################### HEILE #################################
+//                              #########
+
+static int _heile(string name)
+{
+  object ob;
+  int lpv, mpv;
+
+  if (!name) return USAGE("heile <name>");
+  name = lower_case(name);
+  if ((!(ob = present(name,environment())))
+      ||!living(ob))
+    ob = find_living(name);
+  if (!ob)
+  {
+    printf("'%s' ist momentan nicht da.\n",capitalize(name));
+    return 1;
+  }
+  lpv = (int)ob->QueryProp(P_HP);
+  mpv = (int)ob->QueryProp(P_SP);
+  ob->heal_self(1000000);
+  if (!IS_LEARNER(ob) && (!ob->QueryProp(P_TESTPLAYER)||
+          (((string)ob->QueryProp(P_TESTPLAYER))[<5..<1]=="Gilde")))
+    log_file(SHELLLOG("HEAL"),
+       sprintf("%s heilt %s (%s) %s (LP: %d -> %d, MP: %d -> %d)\n",
+         capitalize(geteuid(this_player())),
+         call_other(ob,"name"), capitalize(geteuid(ob)),
+         dtime(time()), lpv, (int)ob->QueryProp(P_HP),
+               mpv,(int)ob->QueryProp(P_SP)));
+  tell_object(ob, QueryProp(P_NAME) + " heilt Dich.\n");
+  printf("Du heilst %s.\n",capitalize(name));
+  return 1;
+}
+
+//                             ##########
+//############################## PEOPLE #################################
+//                             ##########
+
+private string _people_filename(object obj)
+{
+  string str;
+  str=object_name(environment(obj));
+  if (!str) return 0;
+  if (str[0..2] == "/d/") return sprintf("+%s",str[3..<1]);
+  if (str[0..8] == "/players/") return sprintf("~%s",str[9..<1]);
+  return str;
+}
+
+static int _people()
+{
+  mixed *list, res;
+  int i,j, a;
+  string a_age,a_ipnum,a_name,a_level,a_idle,a_room,a_end, a_title;
+
+  switch(QueryProp("tty"))
+  {
+    case "vt100":
+      a_ipnum = ""; a_name = ANSI_BOLD;
+      a_level = ANSI_NORMAL; a_idle = ANSI_BLINK;
+      a_room = ANSI_NORMAL; a_end = ANSI_NORMAL;
+      a_title = ANSI_INVERS; a_age = ANSI_NORMAL;
+      break;
+    case "ansi":
+      a_ipnum = ANSI_BLUE; a_name = ANSI_BOLD;
+      a_level = ANSI_RED; a_idle = ANSI_BLACK+ANSI_BOLD;
+      a_room = ANSI_BOLD+ANSI_BLUE; a_end = ANSI_NORMAL;
+      a_title = ANSI_INVERS; a_age = ANSI_PURPLE;
+      break;
+    default:
+      a_title = a_ipnum = a_name = a_level = a_idle = a_room = a_end = "";
+      a_age = "";
+  }
+  list = sort_array(users(), function int (object a, object b) {
+      return query_ip_number(a)>query_ip_number(b);} ); 
+
+  j=sizeof(list);
+  a=0;res="";
+  for(i=0; i<sizeof(list); i++) {
+    string name_; 
+    name_ = capitalize(list[i]->query_real_name()||"<logon>");
+    res += sprintf( "%s%-15s%s %s%-13s%s %s%3d%s %s %s %s%s%s%s %s%s\n",
+                    a_ipnum, query_ip_number(list[i]),a_end,a_name,
+                    (list[i]->QueryProp(P_INVIS)?"("+name_+")":name_),
+                    a_end,a_level, MASTER->get_wiz_level(getuid(list[i])),
+                    a_end,a_age,
+                    time2string("%4x %0X",((int)list[i]->QueryProp(P_AGE))*2),
+                    query_idle(list[i])>=300?(a++,(a_idle+"I")):" ",
+                    a_end,
+                    query_editing(list[i])?a_idle+"E"+a_end:" ",
+                    query_input_pending(list[i])?a_idle+"M"+a_end:" ",
+                    environment(list[i])?a_room+_people_filename(list[i]):"",
+                    a_end);
+  }
+  if (a)
+    res = sprintf("%s%d Spieler anwesend (%d aktiv). %s%s\n",a_title,j,
+                  (j-a),query_load_average(),a_end)+res;
+  else
+    res = sprintf("%s%d Spieler anwesend. %s%s\n",a_title,j,
+                  query_load_average(),a_end)+res;
+  More(res);
+
+  return 1;
+}
+
+
+//                             ###########
+//############################## SPIELER #################################
+//                             ###########
+
+private string _spieler_time2string(int time)
+{
+  string ret;
+
+  ret="";
+  if (time>=86400)
+  {
+    ret+=time/86400+"d ";
+    time%=86400;
+  }
+  if(time<36000) ret+="0";
+  ret+=time/3600+":";
+  time%=3600;
+  if(time<600) ret+="0";
+  ret+=time/60+":";
+  time%=60;
+  if(time<10) ret+="0";
+  ret+=time+"";
+  return ret;
+}
+
+
+static int _spieler(string arg)
+{
+  string dummy,ip;
+  object *spieler,pl;
+  int i;
+  
+  arg=_unparsed_args();
+  if(!sizeof(arg) || sscanf(arg,"aus ip %s",dummy)!=1)
+    return USAGE("spieler aus ip [von <spieler>|<ip>]");
+  arg=dummy;
+  if (sscanf(arg,"von %s",dummy)==1)
+  {
+    dummy=lower_case(dummy);
+    if (!(pl=find_player(dummy)))
+      return notify_fail(sprintf("Spieler '%s' konnte nicht gefunden "
+                                 "werden.\n",capitalize(dummy))),0;
+    ip=query_ip_number(pl);
+  }
+  else ip=arg;
+  ip=implode((explode(ip,".")-({""})+({"*","*","*","*"}))[0..3],".");
+if (catch(
+  spieler=filter(users(),
+    (: return sizeof(regexp(({query_ip_number($1)}),$2)); :),"^"+glob2regexp(ip)+"$")
+
+                                      ))
+  return printf("In der IP duerfen nur Zahlen(0-255), Punkte (.) und "
+                "Sterne (*) vorkommen.\n"),1;
+  if (!sizeof(spieler))
+    return printf("Es konnte kein Spieler mit der IP '%s' gefunden "
+                  "werden.\n",ip),1;
+  arg=sprintf("\nFolgende Spieler haben die IP %s:\n"
+       "================================================================"
+              "===========\n"
+       "Name:       Zweitie von:      Eingeloggt:                  "
+              "Idle seit:\n"
+       "----------------------------------------------------------------"
+              "-----------\n",ip);
+  i=sizeof(spieler);
+  while(i--)
+  {
+    arg+=sprintf("%-11s %-17s %26s  %-15s\n",
+                 capitalize(getuid(spieler[i])),
+                 ((dummy=(string)spieler[i]->QueryProp(P_SECOND))?
+                  (sizeof((mixed *)call_other(master(),
+                                              "get_userinfo",dummy))?
+                   capitalize(dummy):"*ungueltig*"):""),
+                 dtime(spieler[i]->QueryProp(P_LAST_LOGIN)),
+                 _spieler_time2string(query_idle(spieler[i])));
+  }
+  arg+="==============================================================="
+    "============\n\n";
+  More(arg);
+  return 1;
+}