diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index d0f97b42b..db1026bda 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -569,9 +569,6 @@ namespace Barotrauma.Networking bool respawnAllowed = inc.ReadBoolean(); - float posX = inc.ReadFloat(); - float posY = inc.ReadFloat(); - GameModePreset gameMode = GameModePreset.list.Find(gm => gm.Name == modeName); if (gameMode == null) @@ -597,16 +594,23 @@ namespace Barotrauma.Networking if (respawnAllowed) respawnManager = new RespawnManager(this, GameMain.NetLobbyScreen.SelectedShuttle); + int characterCount = inc.ReadByte(); + for (int i = 0; i < characterCount; i++) + { + var character = Character.ReadSpawnData(inc); + if (inc.ReadBoolean()) + { + myCharacter = character; + Character.Controlled = character; + } + } + gameStarted = true; endVoteTickBox.Visible = Voting.AllowEndVoting && myCharacter != null; GameMain.GameScreen.Select(); - - DebugConsole.NewMessage(Convert.ToString(posX) + "," + Convert.ToString(posY), Color.Lime); - Character myChar = Character.Create(Character.HumanConfigFile, new Vector2(posX, posY), characterInfo, true, false); - Character.Controlled = myChar; - + yield return CoroutineStatus.Success; } @@ -906,46 +910,5 @@ namespace Barotrauma.Networking return false; } - - /// - /// sends some random data to the server (can be a networkevent or just something completely random) - /// use for debugging purposes - /// - //public void SendRandomData() - //{ - // NetOutgoingMessage msg = client.CreateMessage(); - // switch (Rand.Int(5)) - // { - // case 0: - // msg.WriteEnum(PacketTypes.NetworkEvent); - // msg.WriteEnum(NetworkEventType.EntityUpdate); - // msg.Write(Rand.Int(MapEntity.mapEntityList.Count)); - // break; - // case 1: - // msg.WriteEnum(PacketTypes.NetworkEvent); - // msg.Write((byte)Enum.GetNames(typeof(NetworkEventType)).Length); - // msg.Write(Rand.Int(MapEntity.mapEntityList.Count)); - // break; - // case 2: - // msg.WriteEnum(PacketTypes.NetworkEvent); - // msg.WriteEnum(NetworkEventType.ComponentUpdate); - // msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID); - // msg.Write(Rand.Int(8)); - // break; - // case 3: - // msg.Write((byte)Enum.GetNames(typeof(PacketTypes)).Length); - // break; - // } - - // int bitCount = Rand.Int(100); - // for (int i = 0; i c.Connection).ToList(), NetDeliveryMethod.ReliableUnordered, 0); @@ -883,9 +883,9 @@ namespace Barotrauma.Networking yield return CoroutineStatus.Success; } - private void CreateStartMessage(int seed, Submarine selectedSub, GameModePreset selectedMode, List clients) + private void SendStartMessage(int seed, Submarine selectedSub, GameModePreset selectedMode, List clients) { - foreach (Client c in clients) + foreach (Client client in clients) { NetOutgoingMessage msg = server.CreateMessage(); msg.Write((byte)ServerPacketHeader.STARTGAME); @@ -905,12 +905,19 @@ namespace Barotrauma.Networking msg.Write(selectedMode.Name); msg.Write(AllowRespawn); - - msg.Write(c.Character.WorldPosition.X); - msg.Write(c.Character.WorldPosition.Y); - - c.Connection.SendMessage(msg, NetDeliveryMethod.ReliableUnordered,0); + + var clientsWithCharacter = clients.FindAll(c => c.Character != null); + + msg.Write((byte)clientsWithCharacter.Count); + foreach (Client c in clientsWithCharacter) + { + c.Character.WriteSpawnData(msg); + msg.Write(c == client); + } + + server.SendMessage(msg, client.Connection, NetDeliveryMethod.ReliableUnordered); } + } public void EndGame()