public override void Clear()
 {
     server.Clear();
     server = null;
     baseGameplay.Clear();
     base.Clear();
 }
Example #2
0
        public static void ServerSteamNetTick(MultiplayerServer server)
        {
            foreach (var packet in ReadPackets())
            {
                if (packet.joinPacket)
                {
                    ClearChannel(0);
                }

                var player = server.players.FirstOrDefault(p => p.conn is SteamBaseConn conn && conn.remoteId == packet.remote);

                if (packet.joinPacket && player == null)
                {
                    IConnection conn = new SteamServerConn(packet.remote);
                    conn.State  = ConnectionStateEnum.ServerJoining;
                    player      = server.OnConnected(conn);
                    player.type = PlayerType.Steam;

                    player.steamId          = (ulong)packet.remote;
                    player.steamPersonaName = SteamFriends.GetFriendPersonaName(packet.remote);
                    if (player.steamPersonaName.Length == 0)
                    {
                        player.steamPersonaName = "[unknown]";
                    }

                    conn.Send(Packets.Server_SteamAccept);
                }

                if (!packet.joinPacket && player != null)
                {
                    player.HandleReceive(packet.data, packet.reliable);
                }
            }
        }
        /// <summary>
        /// Handles the packet.
        /// </summary>
        /// <param name="Server">The server.</param>
        /// <param name="Client">The client.</param>
        /// <remarks></remarks>
        public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
        {
            if (EntityID != Client.PlayerEntity.ID)
            {
                Server.KickPlayer(Client.PlayerEntity.Name, "Hacking!");
                return;
            }

            if (Action == EntityAction.Crouch || Action == EntityAction.UnCrouch)
            {
                Animation animation = Action == EntityAction.Crouch ? Animation.Crouch : Animation.UnCrouch;
                foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(Client), Client))
                {
                    c.PacketQueue.Enqueue(new AnimationPacket(Client.PlayerEntity.ID, animation));
                }
            }
            if (Action == EntityAction.LeaveBed)
            {
                //Unoccupy the metadata of the block
                Block bed = Server.GetWorld(Client.PlayerEntity).GetBlock(Client.PlayerEntity.OccupiedBed); //Get the block
                bed.Metadata = (byte)(bed.Metadata & ~0x4); // Remove flag
                Server.GetWorld(Client.PlayerEntity).SetBlock(Client.PlayerEntity.OccupiedBed, bed); //Set block

                Client.PlayerEntity.OccupiedBed = null; //Nullify the clients bed position

                Server.EnqueueToAllClients(new AnimationPacket(Client.PlayerEntity.ID, Animation.LeaveBed));
            }
        }
Example #4
0
 public SingleplayerServer(World world)
 {
     World = world;
     Server = new MultiplayerServer();
     TrueCraft.Program.ServerConfiguration = new ServerConfiguration()
     {
         MOTD = null,
         Singleplayer = true
     };
     world.BlockRepository = Server.BlockRepository;
     Server.AddWorld(world);
     Server.AddLogProvider(new ConsoleLogProvider());
 }
Example #5
0
 public SingleplayerServer(World world)
 {
     World  = world;
     Server = new MultiplayerServer();
     TrueCraft.Program.ServerConfiguration = new ServerConfiguration()
     {
         MOTD         = null,
         Singleplayer = true
     };
     world.BlockRepository = Server.BlockRepository;
     Server.AddWorld(world);
     Server.AddLogProvider(new ConsoleLogProvider());
 }
        public override void Init(CubeWorld.World.CubeWorld world)
        {
            base.Init(world);

            stats = MultiplayerStats.Singleton;
            stats.Reset();
            stats.serverMode = true;
            stats.connected  = true;

            baseGameplay.Init(world);

            server = new MultiplayerServer(9999, this, this);
        }
        /// <summary>
        /// Handles the packet.
        /// </summary>
        /// <param name="Server">The server.</param>
        /// <param name="client">The client.</param>
        /// <remarks></remarks>
        public override void HandlePacket(MultiplayerServer Server, RemoteClient client)
        {
            if (client.LoggedIn)
            {
                Server.KickPlayer(client.PlayerEntity.Name, "Invalid packet recieved!");
                return;
            }
            if (ProtocolVersionOrEID < MultiplayerServer.ProtocolVersion)
            {
                client.PacketQueue.Clear();
                client.PacketQueue.Enqueue(new DisconnectPacket("Outdated client!"));
                return;
            }
            if (ProtocolVersionOrEID > MultiplayerServer.ProtocolVersion)
            {
                client.PacketQueue.Clear();
                client.PacketQueue.Enqueue(new DisconnectPacket("Outdated server!"));
                return;
            }

            client.PlayerEntity = Server.Levels[0].LoadPlayer(Username);

            if (Server.CurrentServer.OnlineMode)
            {
                WebClient webClient = new WebClient();
                try
                {
                    StreamReader r = new StreamReader(webClient.OpenRead("http://session.minecraft.net/game/checkserver.jsp?user="******"&serverId=" + client.OnlineModeHash));
                    if (!r.ReadToEnd().ToUpper().Contains("YES"))
                    {
                        Server.KickPlayer(client.PlayerEntity.Name, "Failed to verify username!");
                        r.Close();
                        return;
                    }
                    r.Close();
                }
                catch
                {
                    Server.KickPlayer(client.PlayerEntity.Name, "Failed to verify username!");
                    return;
                }
            }

            this.ProtocolVersionOrEID = client.PlayerEntity.ID;
            this.WorldMode = Server.Levels[0].GameMode;
            this.LevelType = Server.Levels[0].WorldGenerator.Name;
            this.IsServerContext = false;
            this.MaxPlayers = (byte)Server.CurrentServer.MaxPlayers;
            client.PacketQueue.Enqueue(this);
            this.IsServerContext = true;
            this.Username = client.PlayerEntity.Name;

            ChunkManager.RecalculateClientColumns(client, Server, true);

            // TODO: Send inventory
            client.PacketQueue.Enqueue(new SpawnPositionPacket(Server.Levels[client.PlayerEntity.LevelIndex].Spawn));
            client.PlayerEntity.Location = Server.Levels[client.PlayerEntity.LevelIndex].Spawn;

            // Send Position
            client.PacketQueue.Enqueue(new PlayerPositionAndLookPacket(client.PlayerEntity));
            client.LoggedIn = true;
            client.PlayerEntity.GameMode = Server.Levels[client.PlayerEntity.LevelIndex].GameMode;

            // Send the new client to all logged in clients
            Server.EnqueueToAllClients(new PlayerListItemPacket(client.PlayerEntity.Name, true, 0));

            // Send all logged in clients to the new client
            foreach (RemoteClient c in Server.GetLoggedInClients())
                if (c.PlayerEntity.Name != client.PlayerEntity.Name)
                    client.PacketQueue.Enqueue(new PlayerListItemPacket(c.PlayerEntity.Name, true, 0));

            // Add entity
            Server.GetWorld(client).AddEntity(client.PlayerEntity);
            foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(client), client))
            {
                c.PacketQueue.Enqueue(new SpawnNamedEntityPacket(client.PlayerEntity.ID, client.PlayerEntity.Name,
                    client.PlayerEntity.Location, client.PlayerEntity.Rotation, client.PlayerEntity.InHand.ID));
                c.PacketQueue.Enqueue(new EntityPacket());

                client.PacketQueue.Enqueue(new SpawnNamedEntityPacket(c.PlayerEntity.ID, c.PlayerEntity.Name,
                    c.PlayerEntity.Location, c.PlayerEntity.Rotation, c.PlayerEntity.InHand.ID));
            }
            client.PacketQueue.Enqueue(new TimeUpdatePacket(Server.Levels[client.PlayerEntity.LevelIndex].Time));

            if (Server.GetLevel(client).WeatherManager.WeatherOccuring)
                client.PacketQueue.Enqueue(new ChangeGameStatePacket(NewOrInvalidState.BeginRain));

            SetWindowItemsPacket swip = new SetWindowItemsPacket(0, client.PlayerEntity.Inventory);
            client.PacketQueue.Enqueue(swip);
        }
        /// <summary>
        /// Handles the packet.
        /// </summary>
        /// <param name="Server">The server.</param>
        /// <param name="client">The client.</param>
        /// <remarks></remarks>
        public override void HandlePacket(MultiplayerServer Server, RemoteClient client)
        {
            // TODO: More stuff
            Block b = Server.Levels[client.PlayerEntity.LevelIndex].GetBlock(new Vector3(X, Y, Z));

            if (Status == 0x00 && client.PlayerEntity.GameMode == GameMode.Creative ||
                Server.Levels[client.PlayerEntity.LevelIndex].GetBlock(new Vector3(X, Y, Z)).InstantBreak)
                Status = 0x02;

            switch (Status)
            {
                case 0x00:
                    foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(client), client))
                        c.PacketQueue.Enqueue(new AnimationPacket(client.PlayerEntity.ID, Animation.SwingArm));
                    break;
                case 0x02:
                    Block blockDestroyed = Server.Levels[client.PlayerEntity.LevelIndex].GetBlock(new Vector3(X, Y, Z));
                    blockDestroyed.BlockDestroyed(Server.GetWorld(client), new Vector3(X, Y, Z),
                        client.PlayerEntity);
                    Server.GetWorld(client).SetBlock(new Vector3(X, Y, Z), new AirBlock());
                    foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(client), client))
                        c.PacketQueue.Enqueue(new AnimationPacket(client.PlayerEntity.ID, Animation.SwingArm));
                    Server.EnqueueToAllClientsExcept(new SoundOrParticleEffectPacket(SoundOrParticleEffect.BlockBreak,
                            new Vector3(X, Y, Z), blockDestroyed), client.PlayerEntity);
                    break;
                case 0x04:
                case 0x05:
                    break;
            }
        }
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     Server._SendChat("<" + Client.PlayerEntity.Name + "> " + Message, Client);
 }
Example #10
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     Client.PlayerEntity.Location = Server.Levels[Client.PlayerEntity.LevelIndex].Spawn;
     Client.PacketQueue.Enqueue(new RespawnPacket(Client, Server.GetWorld(Client)));
 }
Example #11
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public abstract void HandlePacket(MultiplayerServer Server, RemoteClient Client);
Example #12
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     // TODO
 }
Example #13
0
        /// <summary>
        /// Handles the packet.
        /// </summary>
        /// <param name="server">The server.</param>
        /// <param name="client">The client.</param>
        /// <remarks></remarks>
        public override void HandlePacket(MultiplayerServer server, RemoteClient client)
        {
            // TODO: Ban list
            client.PlayerEntity = new PlayerEntity(); // TODO: Load existing data, or create new data
            string[] parts = this.UsernameOrHash.Split(';');
            client.PlayerEntity.Name = parts[0];
            client.Hostname = parts[1];

            // Create response
            if (server.CurrentServer.OnlineMode)
            {
                MD5 md5 = MD5.Create();
                client.OnlineModeHash = new Random().Next().ToString(); // TODO
                client.PacketQueue.Enqueue(new HandshakePacket(client.OnlineModeHash));
            }
            else
            {
                client.OnlineModeHash = "-";
                client.PacketQueue.Enqueue(new HandshakePacket("-"));
            }
        }
Example #14
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     throw new InvalidOperationException();
 }
Example #15
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     //if (this.KeepAlive != Server.keepAlive.KeepAlive)
     //    Server.KickPlayer(Client.PlayerEntity.Name, "Network timeout"); // TODO: Kick Packet
 }
Example #16
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     Block b = Server.GetWorld(Client).GetBlock(this.SignLocation);
     if (!(b is SignPostBlock) && !(b is WallSignBlock))
     {
         Server.KickPlayer(Client.PlayerEntity.Name, "Sign hacking!");
         return;
     }
     if (b is SignPostBlock)
         (b as SignPostBlock).Data.Text = this.Text;
     else
         (b as WallSignBlock).Data.Text = this.Text;
     Server.Levels[Client.PlayerEntity.LevelIndex].SetBlock(this.SignLocation, b);
     Server.EnqueueToAllClientsExcept(this, Client.PlayerEntity);
 }
Example #17
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     if (Client.PlayerEntity.ID != EntityID)
     {
         Server.KickPlayer(Client.PlayerEntity.Name, "Hacking!");
         return;
     }
 }
Example #18
0
        public static void HostServer(ServerSettings settings, bool fromReplay)
        {
            Log.Message($"Starting the server");

            OnMainThread.ClearCaches();

            var session = Multiplayer.session = new MultiplayerSession();

            session.myFactionId   = Faction.OfPlayer.loadID;
            session.localSettings = settings;
            session.gameName      = settings.gameName;

            var localServer = new MultiplayerServer(settings);

            localServer.debugOnlySyncCmds = new HashSet <int>(Sync.handlers.Where(h => h.debugOnly).Select(h => h.SyncId));
            localServer.hostUsername      = Multiplayer.username;
            localServer.coopFactionId     = Faction.OfPlayer.loadID;

            if (settings.steam)
            {
                localServer.NetTick += SteamIntegration.ServerSteamNetTick;
            }

            if (fromReplay)
            {
                localServer.gameTimer = TickPatch.Timer;
            }

            MultiplayerServer.instance = localServer;
            session.localServer        = localServer;

            if (!fromReplay)
            {
                SetupGame();
            }

            Find.PlaySettings.usePlanetDayNightSystem = false;

            Multiplayer.RealPlayerFaction = Faction.OfPlayer;
            localServer.playerFactions[Multiplayer.username] = Faction.OfPlayer.loadID;

            SetupLocalClient();

            Find.MainTabsRoot.EscapeCurrentTab(false);

            Multiplayer.session.AddMsg("Wiki on desyncs:");
            Multiplayer.session.AddMsg(new ChatMsg_Url("https://github.com/Zetrith/Multiplayer/wiki/Desyncs"));
            Multiplayer.session.hasUnread = false;

            LongEventHandler.QueueLongEvent(() =>
            {
                SaveLoad.CacheGameData(SaveLoad.SaveAndReload());
                SaveLoad.SendCurrentGameData(false);

                localServer.StartListening();

                session.serverThread = new Thread(localServer.Run)
                {
                    Name = "Local server thread"
                };
                session.serverThread.Start();

                string text = "Server started.";
                if (settings.bindAddress != null)
                {
                    text += $" Bound to {settings.bindAddress}:{localServer.NetPort}.";
                }
                if (settings.lanAddress != null)
                {
                    text += $" LAN at {settings.lanAddress}:{localServer.LanPort}.";
                }

                Messages.Message(text, MessageTypeDefOf.SilentInput, false);
                Log.Message(text);
            }, "MpSaving", false, null);
        }
Example #19
0
        public static void HostServer(ServerSettings settings, bool fromReplay, bool withSimulation = false, bool debugMode = false, bool logDesyncTraces = false)
        {
            Log.Message($"Starting the server");

            var session = Multiplayer.session = new MultiplayerSession();

            session.myFactionId   = Faction.OfPlayer.loadID;
            session.localSettings = settings;
            session.gameName      = settings.gameName;

            var localServer = new MultiplayerServer(settings);

            if (withSimulation)
            {
                localServer.savedGame = GZipStream.CompressBuffer(OnMainThread.cachedGameData);
                localServer.mapData   = OnMainThread.cachedMapData.ToDictionary(kv => kv.Key, kv => GZipStream.CompressBuffer(kv.Value));
                localServer.mapCmds   = OnMainThread.cachedMapCmds.ToDictionary(kv => kv.Key, kv => kv.Value.Select(c => c.Serialize()).ToList());
            }
            else
            {
                OnMainThread.ClearCaches();
            }

            localServer.debugMode         = debugMode;
            localServer.debugOnlySyncCmds = new HashSet <int>(Sync.handlers.Where(h => h.debugOnly).Select(h => h.syncId));
            localServer.hostOnlySyncCmds  = new HashSet <int>(Sync.handlers.Where(h => h.hostOnly).Select(h => h.syncId));
            localServer.hostUsername      = Multiplayer.username;
            localServer.coopFactionId     = Faction.OfPlayer.loadID;

            localServer.rwVersion      = session.mods.remoteRwVersion = VersionControl.CurrentVersionString;
            localServer.modNames       = session.mods.remoteModNames = LoadedModManager.RunningModsListForReading.Select(m => m.Name).ToArray();
            localServer.modIds         = session.mods.remoteModIds = LoadedModManager.RunningModsListForReading.Select(m => m.PackageId).ToArray();
            localServer.workshopModIds = session.mods.remoteWorkshopModIds = ModManagement.GetEnabledWorkshopMods().ToArray();
            localServer.defInfos       = session.mods.defInfo = Multiplayer.localDefInfos;
            Log.Message($"MP Host modIds: {string.Join(", ", localServer.modIds)}");
            Log.Message($"MP Host workshopIds: {string.Join(", ", localServer.workshopModIds)}");

            if (settings.steam)
            {
                localServer.NetTick += SteamIntegration.ServerSteamNetTick;
            }

            if (fromReplay)
            {
                localServer.gameTimer = TickPatch.Timer;
            }

            MultiplayerServer.instance = localServer;
            session.localServer        = localServer;

            if (!fromReplay)
            {
                SetupGame();
            }

            foreach (var tickable in TickPatch.AllTickables)
            {
                tickable.Cmds.Clear();
            }

            Find.PlaySettings.usePlanetDayNightSystem = false;

            Multiplayer.RealPlayerFaction = Faction.OfPlayer;
            localServer.playerFactions[Multiplayer.username] = Faction.OfPlayer.loadID;

            SetupLocalClient();

            Find.MainTabsRoot.EscapeCurrentTab(false);

            Multiplayer.session.AddMsg("If you are having a issue with the mod and would like some help resolving it, then please reach out to us on our discord server:", false);
            Multiplayer.session.AddMsg(new ChatMsg_Url("https://discord.gg/S4bxXpv"), false);

            if (withSimulation)
            {
                StartServerThread();
            }
            else
            {
                var timeSpeed = TimeSpeed.Paused;

                Multiplayer.WorldComp.TimeSpeed = timeSpeed;
                foreach (var map in Find.Maps)
                {
                    map.AsyncTime().TimeSpeed = timeSpeed;
                }
                Multiplayer.WorldComp.UpdateTimeSpeed();

                Multiplayer.WorldComp.debugMode       = debugMode;
                Multiplayer.WorldComp.logDesyncTraces = logDesyncTraces;

                LongEventHandler.QueueLongEvent(() =>
                {
                    SaveLoad.CacheGameData(SaveLoad.SaveAndReload());
                    SaveLoad.SendCurrentGameData(false);

                    StartServerThread();
                }, "MpSaving", false, null);
            }

            void StartServerThread()
            {
                var netStarted = localServer.StartListeningNet();
                var lanStarted = localServer.StartListeningLan();

                string text = "Server started.";

                if (netStarted != null)
                {
                    text += (netStarted.Value ? $" Direct at {settings.bindAddress}:{localServer.NetPort}." : " Couldn't bind direct.");
                }

                if (lanStarted != null)
                {
                    text += (lanStarted.Value ? $" LAN at {settings.lanAddress}:{localServer.LanPort}." : " Couldn't bind LAN.");
                }

                session.serverThread = new Thread(localServer.Run)
                {
                    Name = "Local server thread"
                };
                session.serverThread.Start();

                Messages.Message(text, MessageTypeDefOf.SilentInput, false);
                Log.Message(text);
            }
        }
Example #20
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     Server.KickPlayer(Client.PlayerEntity.Name, "Sent invalid packet!");
 }