public override void Clear() { server.Clear(); server = null; baseGameplay.Clear(); base.Clear(); }
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)); } }
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); }
/// <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))); }
/// <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);
/// <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 }
/// <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("-")); } }
/// <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(); }
/// <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 }
/// <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); }
/// <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; } }
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); }
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); } }
/// <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!"); }