From 88abbe28e32ce2c6915887f4b10609ffaa5d334f Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 17 Jul 2018 12:50:04 +0300 Subject: [PATCH] Fixed entity IDs getting messed up and causing desync because of purchased items in multiplayer campaign. The server created cargo items first and then mission-related entities, while the clients only spawned mission entities and relied on the server to spawn the cargo, which caused mission entities to have wrong IDs. Closes #484 --- .../BarotraumaShared/Source/DebugConsole.cs | 20 +++++++++++++++++++ .../GameModes/MultiPlayerCampaign.cs | 8 +------- .../Source/GameSession/GameSession.cs | 11 ++++++++-- .../BarotraumaShared/Source/Items/Item.cs | 4 ++-- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs index 70e992c45..ffb676918 100644 --- a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs @@ -1267,6 +1267,26 @@ namespace Barotrauma } })); + commands.Add(new Command("findentityids", "findentityids [entityname]", (string[] args) => + { + if (args.Length == 0) return; + args[0] = args[0].ToLowerInvariant(); + foreach (MapEntity mapEntity in MapEntity.mapEntityList) + { + if (mapEntity.Name.ToLowerInvariant() == args[0]) + { + ThrowError(mapEntity.ID + ": " + mapEntity.Name.ToString()); + } + } + foreach (Character character in Character.CharacterList) + { + if (character.Name.ToLowerInvariant() == args[0] || character.SpeciesName.ToLowerInvariant() == args[0]) + { + ThrowError(character.ID + ": " + character.Name.ToString()); + } + } + })); + commands.Add(new Command("heal", "heal [character name]: Restore the specified character to full health. If the name parameter is omitted, the controlled character will be healed.", (string[] args) => { Character healedCharacter = (args.Length == 0) ? Character.Controlled : FindMatchingCharacter(args); diff --git a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/MultiPlayerCampaign.cs index ffcbcf961..54155e44a 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSession/GameModes/MultiPlayerCampaign.cs @@ -55,13 +55,7 @@ namespace Barotrauma public override void Start() { - base.Start(); - - if (GameMain.Server != null) - { - CargoManager.CreateItems(); - } - + base.Start(); lastUpdateID++; } diff --git a/Barotrauma/BarotraumaShared/Source/GameSession/GameSession.cs b/Barotrauma/BarotraumaShared/Source/GameSession/GameSession.cs index 855db7f5f..ef9c4f3fb 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSession/GameSession.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSession/GameSession.cs @@ -226,7 +226,14 @@ namespace Barotrauma EventManager.StartRound(level); - if (GameMode != null) GameMode.MsgBox(); + if (GameMode != null) + { + GameMode.MsgBox(); + if (GameMode is MultiPlayerCampaign campaign && GameMain.Server != null) + { + campaign.CargoManager.CreateItems(); + } + } if (GameSettings.SendUserStatistics) { @@ -234,7 +241,7 @@ namespace Barotrauma GameAnalyticsSDK.Net.GameAnalytics.AddProgressionEvent(GameAnalyticsSDK.Net.EGAProgressionStatus.Start, GameMode.Name, (Mission == null ? "None" : Mission.GetType().ToString())); } - + #if CLIENT roundSummary = new RoundSummary(this); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 3248be891..32da8efeb 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -315,9 +315,9 @@ namespace Barotrauma public override string ToString() { #if CLIENT - return (GameMain.DebugDraw) ? Name + "(ID: " + ID + ")" : Name; + return (GameMain.DebugDraw) ? Name + " (ID: " + ID + ")" : Name; #elif SERVER - return Name + "(ID: " + ID + ")"; + return Name + " (ID: " + ID + ")"; #endif }