static void Run() { DateTime nextUpdate = DateTime.Now; while (active) { try { TcpClient client = new TcpClient(); client.Connect(IPAddress.Loopback, port); var stream = client.GetStream(); var reader = new BinaryReader(stream); writer = new BinaryWriter(stream); Console.WriteLine("Listening on proxy"); Connected = true; while (true) { TimeSpan wait = nextUpdate - DateTime.Now; if (wait.Ticks > 0) { Thread.Sleep(wait); } nextUpdate = DateTime.Now.Add(PlayerHistory.StepSize); //Console.WriteLine ("Sending"); ControlMessage cm = new ControlMessage(); cm.PlayerUpdate = true; Send(cm); int length = reader.ReadInt32(); byte[] data = reader.ReadBytes(length); PlayersUpdate pu = Json.Deserialize <PlayersUpdate>(data); if (pu.List == null) { continue; } Players = pu; //Console.WriteLine ("Got reply"); foreach (var p in Players.List) { PlayerHistory.Update(p); } if (Update != null) { Update(); } } } catch (SocketException se) { Console.WriteLine(se.Message); Thread.Sleep(1000); } catch (IOException ioe) { Console.WriteLine(ioe.Message); Thread.Sleep(1000); } catch (ObjectDisposedException ode) { Console.WriteLine(ode.Message); Thread.Sleep(1000); } finally { Connected = false; if (writer != null) { writer.Dispose(); } Players = new PlayersUpdate(); Players.List = new List <MineProxy.Control.Player>(); if (Update != null) { Update(); } } } }
void RunController() { BinaryReader r = new BinaryReader(stream); BinaryWriter w = new BinaryWriter(stream); while (Program.Active) { int length = r.ReadInt32(); byte[] packet = r.ReadBytes(length); string json = Encoding.UTF8.GetString(packet); ControlMessage c = JsonConvert.DeserializeObject <ControlMessage>(json); if (Program.Active == false) { return; } try { //Console.WriteLine ("Got from controller " + c); if (c.Kick != null) { //Console.WriteLine ("Kick"); Client p = PlayerList.GetPlayerByUsername(c.Kick.Username); if (p != null) { p.Kick(c.Kick.Reason); } } if (c.Ban != null) { Banned.Ban(null, c.Ban.Username, c.Ban.BannedUntil, c.Ban.Reason); } if (c.Pardon != null) { Banned.Pardon(null, c.Pardon.Username); } if (c.PlayerUpdate) { //Console.WriteLine ("Update"); //Send complete player status update PlayersUpdate pu = new PlayersUpdate(); pu.List = new List <Control.Player>(); pu.MessageID = messageID; messageID += 2; foreach (Client pp in PlayerList.List) { pu.List.Add(new Control.Player(pp)); } byte[] buffer = Json.Serialize(pu); w.Write((int)buffer.Length); w.Write(buffer); w.Flush(); //Console.WriteLine ("Update Sent"); } if (c.TP != null) { var p = PlayerList.GetPlayerByUsernameOrName(c.TP.Username); if (p == null) { return; } if (c.TP.ToUsername != null) { var pTo = PlayerList.GetPlayerByUsernameOrName(c.TP.ToUsername); if (pTo == null) { return; } p.Session.World.Send("tp " + p.MinecraftUsername + " " + pTo.MinecraftUsername); continue; } if (c.TP.Position != null) { p.Warp(c.TP.Position, (Dimensions)c.TP.Dimension, Worlds.World.Main); continue; } } } catch (Exception ie) { Log.WriteServer(ie); } } }
static ProxyControl() { Players = new PlayersUpdate(); Players.List = new List <MineProxy.Control.Player>(); }