Example #1
0
        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);
                }
            }
        }
Example #2
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);
            }
        }
Example #3
0
        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);
        }
Example #4
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);
                }
            }
        }