From c402ba208b8b3b538c5878e1943ab63e0a11223a Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 26 Sep 2016 17:06:20 +0300 Subject: [PATCH] Spawning client characters with correct characterinfo --- Subsurface/Source/Networking/GameClient.cs | 23 +++++++++++--- Subsurface/Source/Networking/GameServer.cs | 37 ++++++++++++++++++++-- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index c5b5ad9d6..d0f97b42b 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -534,6 +534,8 @@ namespace Barotrauma.Networking GameMain.NetLobbyScreen.TrySelectSub(subName, subHash, GameMain.NetLobbyScreen.SubList) && GameMain.NetLobbyScreen.TrySelectSub(shuttleName, shuttleHash, GameMain.NetLobbyScreen.ShuttleList.ListBox)); + WriteCharacterInfo(readyToStartMsg); + client.SendMessage(readyToStartMsg, NetDeliveryMethod.ReliableUnordered); break; @@ -602,7 +604,7 @@ namespace Barotrauma.Networking GameMain.GameScreen.Select(); DebugConsole.NewMessage(Convert.ToString(posX) + "," + Convert.ToString(posY), Color.Lime); - Character myChar = Character.Create(Character.HumanConfigFile, new Vector2(posX, posY), null, true, false); + Character myChar = Character.Create(Character.HumanConfigFile, new Vector2(posX, posY), characterInfo, true, false); Character.Controlled = myChar; yield return CoroutineStatus.Success; @@ -800,18 +802,31 @@ namespace Barotrauma.Networking { spriteBatch.DrawString(GUI.Font, "Disconnected", new Vector2(x + 10, y + 25), Color.White); } - - } public override void Disconnect() { - //TODO: tell server client.Shutdown(""); GameMain.NetworkMember = null; } + public void WriteCharacterInfo(NetOutgoingMessage msg) + { + if (characterInfo == null) return; + + msg.Write(characterInfo.Gender == Gender.Male); + msg.Write((byte)characterInfo.HeadSpriteId); + + var jobPreferences = GameMain.NetLobbyScreen.JobPreferences; + int count = Math.Min(jobPreferences.Count, 3); + msg.Write((byte)count); + for (int i = 0; i < count; i++) + { + msg.Write(jobPreferences[i].Name); + } + } + public override bool SelectCrewCharacter(GUIComponent component, object obj) { diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 029350a9c..2518c5a91 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -499,6 +499,7 @@ namespace Barotrauma.Networking if (connectedClient != null) { connectedClient.ReadyToStart = inc.ReadBoolean(); + UpdateCharacterInfo(inc, connectedClient); } break; case ClientPacketHeader.UPDATE_LOBBY: @@ -848,7 +849,7 @@ namespace Barotrauma.Networking Vector2 spawnPosition = spawnPoint.WorldPosition; DebugConsole.NewMessage(Convert.ToString(spawnPosition.X) + "," + Convert.ToString(spawnPosition.Y), Color.Lime); - Character spawnedCharacter = Character.Create(Character.HumanConfigFile, spawnPosition, null, true, false); + Character spawnedCharacter = Character.Create(Character.HumanConfigFile, spawnPosition, c.characterInfo, true, false); spawnedCharacter.AnimController.Frozen = true; c.Character = spawnedCharacter; @@ -907,7 +908,7 @@ namespace Barotrauma.Networking msg.Write(c.Character.WorldPosition.X); msg.Write(c.Character.WorldPosition.Y); - + c.Connection.SendMessage(msg, NetDeliveryMethod.ReliableUnordered,0); } } @@ -1233,6 +1234,38 @@ namespace Barotrauma.Networking return true; } + + private void UpdateCharacterInfo(NetIncomingMessage message, Client sender) + { + Gender gender = Gender.Male; + int headSpriteId = 0; + try + { + gender = message.ReadBoolean() ? Gender.Male : Gender.Female; + headSpriteId = message.ReadByte(); + } + catch (Exception e) + { + gender = Gender.Male; + headSpriteId = 0; + + DebugConsole.Log("Received invalid characterinfo from \"" +sender.name+"\"! { "+e.Message+" }"); + } + + List jobPreferences = new List(); + int count = message.ReadByte(); + for (int i = 0; i < Math.Min(count, 3); i++) + { + string jobName = message.ReadString(); + + JobPrefab jobPrefab = JobPrefab.List.Find(jp => jp.Name == jobName); + if (jobPrefab != null) jobPreferences.Add(jobPrefab); + } + + sender.characterInfo = new CharacterInfo(Character.HumanConfigFile, name, gender); + sender.characterInfo.HeadSpriteId = headSpriteId; + sender.jobPreferences = jobPreferences; + } public void AssignJobs(List unassigned) {