コード例 #1
0
ファイル: ProxyControl.cs プロジェクト: mctraveler/MineSharp
 static ProxyControl()
 {
     Players = new PlayersUpdate();
     Players.List = new List<MineProxy.Control.Player>();
 }
コード例 #2
0
ファイル: ProxyControl.cs プロジェクト: mctraveler/MineSharp
        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();
                }
            }
        }
コード例 #3
0
 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);
         }
     }
 }