public static void Main(string[] args) { //Bug workaround System.Web.Util.HttpEncoder.Current = System.Web.Util.HttpEncoder.Default; Directory.SetCurrentDirectory(MineSharp.Settings.BaseWorldsPath); Console.WriteLine(); Console.WriteLine("Starting Mineproxy: " + DateTime.Now); Log.Init(); //Init commands Commands.MainCommands.Init(); System.Threading.Thread.CurrentThread.Name = "Player Listener"; Console.CancelKeyPress += HandleConsoleCancelKeyPress; int controllerPort = 25465; #if DEBUG //Only for debugging the live server //MinecraftServer.Port = 25665; //Debug.WriteLine(MinecraftProtocol.Minecraft.Protocol); #endif //Load settings Banned.LoadBanned(); MineProxy.Regions.WarpPortalVisuals.Init(); //VoteListener.Start(); ServerCommander.Startup(); ControlListener.Start(controllerPort); BackupProxy.Start(); try { PlayerList.StartUpdater(); //SpawnRegion.Start (); Settings.Start(); QueryListener.Start(); } catch (Exception e) { Log.WriteServer(e); Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } while (true) { Console.WriteLine(DateTime.Now + " Starting Main true loop"); listener = new TcpListener(IPAddress.Any, MinecraftServer.MainPort); try { listener.Start(); Console.WriteLine("Listening for players on " + MinecraftServer.MainPort); while (Active) { TcpClient client = listener.AcceptTcpClient(); if (Active == false) { break; } //Console.WriteLine ("Got incoming"); try { //check banned ip if (Banned.IsBanned(((IPEndPoint)client.Client.RemoteEndPoint).Address)) { try { client.Close(); } catch (Exception e) { Log.WriteServer("Error closing banned ip", e); } continue; } Client proxy = new VanillaClient(client.Client); proxy.Start(); } catch (SocketException) { try { client.Close(); } catch { } } } //Program is exiting here Console.WriteLine("Kicking all players: " + ShutdownMessage); foreach (Client p in PlayerList.List) { p.Kick(ShutdownMessage); } Log.Flush(); ServerCommander.Shutdown(); ControlListener.Stop(); return; #if !DEBUG } catch (Exception e) { Console.WriteLine(DateTime.Now + " Main loop error: " + e.GetType().Name + " " + e.Message); Log.WriteServer("MainClass.Main general", e); System.Threading.Thread.Sleep(500); #endif } finally { Console.WriteLine(DateTime.Now + " Main loop finally Start"); try { //Save region stats RegionLoader.Save(World.Main.Regions); Regions.WarpPortalVisuals.Stop(); } catch (Exception e) { Log.WriteServer("Main closing region stats saving", e); } Console.WriteLine(DateTime.Now + " Main loop finally End"); Environment.Exit(0); } } }
public static void Ban(Client admin, string username, DateTime bannedUntil, string reason) { if (admin != null && admin.Admin(Permissions.Ban) == false) { admin.TellSystem(Chat.Yellow, "Disabled"); return; } if (Donors.IsDonor(username) && bannedUntil < DateTime.Now.AddMinutes(35)) { Log.WritePlayer(username, "Donor not Banned: " + reason); if (admin != null) { admin.TellSystem(Chat.Gold, "Donor not banned for: " + reason); } return; } bool newban = false; BadPlayer b = GetBanHistory(username); if (b == null) { //Make sure we spelled correctly if (admin != null) { if (File.Exists("proxy/players/" + Path.GetFileName(username) + ".json") == false) { admin.TellSystem(Chat.Red, "No such player: " + username); return; } } newban = true; b = new BadPlayer(); b.Username = username; b.BannedUntil = bannedUntil; b.Reason = reason; lock (blacklist) blacklist.List.Add(b); } else { if (b.BannedUntil < DateTime.Now) { newban = true; } //Make sure longer bans are not removed by a shorter violation if (b.BannedUntil > bannedUntil) { return; } b.BannedUntil = bannedUntil; b.Reason = reason; } SaveBanned(); //Console.WriteLine ("Banning " + b.Username + " for " + b.Reason); double banMinutes = (b.BannedUntil - DateTime.Now).TotalMinutes; string banlength = "forever"; if (banMinutes < 24 * 60 * 30) { banlength = banMinutes.ToString("0") + " minutes"; } if (admin != null) { Log.WritePlayer(b.Username, "Banned " + banlength + " by " + admin.MinecraftUsername + ": " + reason); } else { Log.WritePlayer(b.Username, "Banned " + banlength + ": " + reason); } Client pp = PlayerList.GetPlayerByUsernameOrName(username); if (pp != null) { if (newban) { Chatting.Parser.Say(Chat.Purple, pp.Name + " is banned " + banlength + ": " + reason); } if (pp.Session is HellSession == false) { pp.SetWorld(World.HellBanned); } } else { admin.TellSystem(Chat.Purple, username + " was banned(offline): " + reason); } }
public static bool Filter(VanillaSession real, Packet p) { Client player = real.Player; IEntity e = p as IEntity; if (e == null) { return(false); } //Pass all own actions normally if (e.EID == player.EntityID) { return(false); } Client namedPlayer = null; VanillaSession r = World.Main.GetPlayer(e.EID); if (r != null) { namedPlayer = r.Player; } byte pid = p.PacketID; //New named entity if (pid == SpawnPlayer.ID) { SpawnPlayer spawnNamedEntity = (SpawnPlayer)p; //Search by vanilla uuid since we ahv enot yet modified the packet if (namedPlayer == null) { namedPlayer = PlayerList.GetPlayerByVanillaUUID(spawnNamedEntity.PlayerUUID); } if (namedPlayer == null) { Debug.WriteLine("NamedEntity not found in player list: " + spawnNamedEntity.PlayerUUID); return(false); //Still let through } //pass any none cloaked player if (namedPlayer.Settings.Cloaked == null) { return(false); } //Invisible mode, hide everything about entity if (namedPlayer.Settings.Cloaked == MobType.None.ToString()) { return(true); } if (namedPlayer.Settings.Cloaked == null) { //Debug.WriteLine ("Spawning player " + ne.PlayerName + " as nick " + np.Name); return(false); } //Debug.WriteLine ("Spawning player " + ne.PlayerName + " cloaked as \"" + np.Cloaked + "\" nick: " + np.Name); MobType mt; try { mt = (MobType)Enum.Parse(typeof(MobType), namedPlayer.Settings.Cloaked); } catch (Exception) { Debug.WriteLine("Unknown cloak for " + namedPlayer.MinecraftUsername + ": " + namedPlayer.Settings.Cloaked); return(false); } SpawnMob ms = new SpawnMob(mt); ms.EID = spawnNamedEntity.EID; ms.Pos = spawnNamedEntity.Position; ms.Pitch = spawnNamedEntity.Pitch; ms.Yaw = spawnNamedEntity.Yaw; //Add metadata to specific mobs - some already set in constructor if (ms.Type == MobType.MagmaCube || ms.Type == MobType.Slime) { ms.Metadata.SetByte(16, 1); } if (ms.Type == MobType.Ghast) { ms.Metadata.SetByte(16, 0); } if (ms.Type == MobType.Enderman) { ms.Metadata.SetByte(16, (sbyte)BlockID.Dirt); ms.Metadata.SetByte(17, 0); } if (ms.Type == MobType.Blaze) { ms.Metadata.SetByte(16, 0); } if (ms.Type == MobType.Sheep) { ms.Metadata.SetByte(16, 0); } if (ms.Type == MobType.Spider) { ms.Metadata.SetByte(16, 0); } player.Queue.Queue(ms); return(true); } if (pid == DestroyEntities.ID) { return(false); } //Not in list if (namedPlayer == null) { return(false); } //Not cloaked if (namedPlayer.Settings.Cloaked == null) { return(false); } //Invisible mode, hide everything about entity if (namedPlayer.Settings.Cloaked == MobType.None.ToString()) { return(true); } //Else any mob if (pid == Animation.ID) { return(true); } if (pid == EntityEquipment.ID) { return(true); } return(false); }
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); } } }