From dc67eeebd42a460b370607b4229aea3fa3cd8ae4 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 23 Aug 2016 14:19:50 +0300 Subject: [PATCH] Humans can be spawned through console in multiplayer --- Subsurface/Source/Characters/Character.cs | 6 ++---- Subsurface/Source/DebugConsole.cs | 12 +++++++----- Subsurface/Source/Networking/GameClient.cs | 21 +++++++++++++-------- Subsurface/Source/Networking/GameServer.cs | 13 ++++++++++--- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index e3abc045d..fc748ec24 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -432,8 +432,7 @@ namespace Barotrauma return enemyCharacter; } - - if (hasAi && !isNetworkPlayer) + else if (hasAi) { var aiCharacter = new AICharacter(file, position, characterInfo, isNetworkPlayer); var ai = new HumanAIController(aiCharacter); @@ -442,7 +441,6 @@ namespace Barotrauma aiCharacter.minHealth = -100.0f; return aiCharacter; - } var character = new Character(file, position, characterInfo, isNetworkPlayer); @@ -1200,7 +1198,7 @@ namespace Barotrauma if (this == controlled) return; - if (IsNetworkPlayer && info!=null) + if (info != null) { Vector2 namePos = new Vector2(pos.X, pos.Y - 120.0f) - GUI.Font.MeasureString(Info.Name) * 0.5f; spriteBatch.DrawString(GUI.Font, Info.Name, namePos - new Vector2(1.0f, 1.0f), Color.Black); diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index 8705f28dc..3fe2f6aa7 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -252,15 +252,17 @@ namespace Barotrauma if (commands[1].ToLowerInvariant()=="human") { - spawnedCharacter = Character.Create(Character.HumanConfigFile, spawnPosition); - Character.Controlled = spawnedCharacter; + spawnedCharacter = Character.Create(Character.HumanConfigFile, spawnPosition); if (GameMain.GameSession != null) { SinglePlayerMode mode = GameMain.GameSession.gameMode as SinglePlayerMode; - if (mode == null) break; - GameMain.GameSession.CrewManager.AddCharacter(Character.Controlled); - GameMain.GameSession.CrewManager.SelectCharacter(null, Character.Controlled); + if (mode != null) + { + Character.Controlled = spawnedCharacter; + GameMain.GameSession.CrewManager.AddCharacter(Character.Controlled); + GameMain.GameSession.CrewManager.SelectCharacter(null, Character.Controlled); + } } } else diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index f296de32c..2d59d1f10 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -890,12 +890,19 @@ namespace Barotrauma.Networking { string configPath = message.ReadString(); - ushort id = message.ReadUInt16(); + if (configPath != Character.HumanConfigFile) + { + ushort id = message.ReadUInt16(); - Vector2 position = new Vector2(message.ReadFloat(), message.ReadFloat()); + Vector2 position = new Vector2(message.ReadFloat(), message.ReadFloat()); - var character = Character.Create(configPath, position, null, true); - if (character != null) character.ID = id; + var character = Character.Create(configPath, position, null, true); + if (character != null) character.ID = id; + } + else + { + ReadCharacterData(message, false, true); + } } public void RequestFile(string file, FileTransferMessageType fileType) @@ -1069,7 +1076,7 @@ namespace Barotrauma.Networking client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered); } - public Character ReadCharacterData(NetIncomingMessage inc, bool isMyCharacter) + public Character ReadCharacterData(NetIncomingMessage inc, bool isMyCharacter, bool hasAi = false) { string newName = inc.ReadString(); ushort ID = inc.ReadUInt16(); @@ -1082,12 +1089,10 @@ namespace Barotrauma.Networking string jobName = inc.ReadString(); JobPrefab jobPrefab = JobPrefab.List.Find(jp => jp.Name == jobName); - //ushort spawnPointID = inc.ReadUInt16(); - CharacterInfo ch = new CharacterInfo(Character.HumanConfigFile, newName, isFemale ? Gender.Female : Gender.Male, jobPrefab); ch.HeadSpriteId = headSpriteID; - Character character = Character.Create(ch, position, !isMyCharacter, false); + Character character = Character.Create(ch, position, !isMyCharacter, hasAi); GameMain.GameSession.CrewManager.characters.Add(character); character.ID = ID; diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index cba549500..3db49de8c 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -1587,10 +1587,17 @@ namespace Barotrauma.Networking message.Write(character.ConfigPath); - message.Write(character.ID); + if (character.ConfigPath == Character.HumanConfigFile) + { + WriteCharacterData(message, character.Name, character); + } + else + { + message.Write(character.ID); - message.Write(character.Position.X); - message.Write(character.Position.Y); + message.Write(character.Position.X); + message.Write(character.Position.Y); + } SendMessage(message, NetDeliveryMethod.ReliableUnordered, recipients); }