diff --git a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs index 43e6a9938..f2da4d263 100644 --- a/Barotrauma/BarotraumaClient/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaClient/Source/DebugConsole.cs @@ -525,6 +525,28 @@ namespace Barotrauma } }, isCheat: true)); + commands.Add(new Command("resetall", "Reset all items and structures to prefabs. Only applicable in the subeditor.", args => + { + if (Screen.Selected == GameMain.SubEditorScreen) + { + Item.ItemList.ForEach(i => i.Reset()); + Structure.WallList.ForEach(s => s.Reset()); + foreach (MapEntity entity in MapEntity.SelectedList) + { + if (entity is Item item) + { + item.CreateEditingHUD(); + break; + } + else if (entity is Structure structure) + { + structure.CreateEditingHUD(); + break; + } + } + } + })); + commands.Add(new Command("alpha", "Change the alpha (as bytes from 0 to 255) of the selected item/structure instances. Applied only in the subeditor.", (string[] args) => { if (Screen.Selected == GameMain.SubEditorScreen) diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs index 142d4c73c..96ea38e4b 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/GameModes/MultiPlayerCampaign.cs @@ -12,7 +12,7 @@ namespace Barotrauma { private UInt16 startWatchmanID, endWatchmanID; - public static GUIComponent StartCampaignSetup(IEnumerable saveFiles) + public static GUIComponent StartCampaignSetup( IEnumerable submarines, IEnumerable saveFiles) { GUIFrame background = new GUIFrame(new RectTransform(Vector2.One, GUI.Canvas), style: "GUIBackgroundBlocker"); @@ -35,7 +35,7 @@ namespace Barotrauma var newCampaignContainer = new GUIFrame(new RectTransform(Vector2.One, campaignContainer.RectTransform, Anchor.BottomLeft), style: null); var loadCampaignContainer = new GUIFrame(new RectTransform(Vector2.One, campaignContainer.RectTransform, Anchor.BottomLeft), style: null); - var campaignSetupUI = new CampaignSetupUI(true, newCampaignContainer, loadCampaignContainer, saveFiles); + var campaignSetupUI = new CampaignSetupUI(true, newCampaignContainer, loadCampaignContainer, submarines, saveFiles); var newCampaignButton = new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), buttonContainer.RectTransform), TextManager.Get("NewCampaign")) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs index c6732589d..d9927245e 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs @@ -313,7 +313,7 @@ namespace Barotrauma.Items.Components if (sound == null) { return 0.0f; } if (sound.VolumeProperty == "") { return sound.VolumeMultiplier; } - if (properties.TryGetValue(sound.VolumeProperty, out SerializableProperty property)) + if (SerializableProperties.TryGetValue(sound.VolumeProperty, out SerializableProperty property)) { float newVolume = 0.0f; try @@ -486,5 +486,18 @@ namespace Barotrauma.Items.Components yield return CoroutineStatus.Success; } + + partial void ParseMsg() + { + string msg = TextManager.Get(Msg, true); + if (msg != null) + { + foreach (InputType inputType in Enum.GetValues(typeof(InputType))) + { + msg = msg.Replace("[" + inputType.ToString().ToLowerInvariant() + "]", GameMain.Config.KeyBind(inputType).ToString()); + } + Msg = msg; + } + } } } diff --git a/Barotrauma/BarotraumaClient/Source/Items/Item.cs b/Barotrauma/BarotraumaClient/Source/Items/Item.cs index 40af52153..574b97e2e 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Item.cs @@ -448,7 +448,7 @@ namespace Barotrauma } } - private GUIComponent CreateEditingHUD(bool inGame = false) + public GUIComponent CreateEditingHUD(bool inGame = false) { editingHUD = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.25f), GUI.Canvas, Anchor.CenterRight) { MinSize = new Point(400, 0) }) { UserData = this }; GUIListBox listBox = new GUIListBox(new RectTransform(new Vector2(0.95f, 0.8f), editingHUD.RectTransform, Anchor.Center), style: null) @@ -457,40 +457,38 @@ namespace Barotrauma }; var itemEditor = new SerializableEntityEditor(listBox.Content.RectTransform, this, inGame, showName: true); - - if (!inGame && Linkable) - { - var linkText = new GUITextBlock(new RectTransform(new Point(editingHUD.Rect.Width, 20)), TextManager.Get("HoldToLink"), font: GUI.SmallFont); - var itemsText = new GUITextBlock(new RectTransform(new Point(editingHUD.Rect.Width, 20)), TextManager.Get("AllowedLinks") + ": ", font: GUI.SmallFont); - if (AllowedLinks.None()) - { - itemsText.Text += TextManager.Get("None"); - } - else - { - for (int i = 0; i < AllowedLinks.Count; i++) - { - itemsText.Text += AllowedLinks[i]; - if (i < AllowedLinks.Count - 1) - { - itemsText.Text += ", "; - } - } - } - itemEditor.AddCustomContent(linkText, 1); - itemEditor.AddCustomContent(itemsText, 2); - linkText.TextColor = Color.Yellow; - itemsText.TextColor = Color.Yellow; - } - if (!inGame) { + if (Linkable) + { + var linkText = new GUITextBlock(new RectTransform(new Point(editingHUD.Rect.Width, 20)), TextManager.Get("HoldToLink"), font: GUI.SmallFont); + var itemsText = new GUITextBlock(new RectTransform(new Point(editingHUD.Rect.Width, 20)), TextManager.Get("AllowedLinks") + ": ", font: GUI.SmallFont); + if (AllowedLinks.None()) + { + itemsText.Text += TextManager.Get("None"); + } + else + { + for (int i = 0; i < AllowedLinks.Count; i++) + { + itemsText.Text += AllowedLinks[i]; + if (i < AllowedLinks.Count - 1) + { + itemsText.Text += ", "; + } + } + } + itemEditor.AddCustomContent(linkText, 1); + itemEditor.AddCustomContent(itemsText, 2); + linkText.TextColor = Color.Yellow; + itemsText.TextColor = Color.Yellow; + } var buttonContainer = new GUILayoutGroup(new RectTransform(new Point(listBox.Content.Rect.Width, 20)), isHorizontal: true) { Stretch = true, RelativeSpacing = 0.02f }; - new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityX")) + new GUIButton(new RectTransform(new Vector2(0.23f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityX")) { ToolTip = TextManager.Get("MirrorEntityXToolTip"), OnClicked = (button, data) => @@ -499,7 +497,7 @@ namespace Barotrauma return true; } }; - new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityY")) + new GUIButton(new RectTransform(new Vector2(0.23f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityY")) { ToolTip = TextManager.Get("MirrorEntityYToolTip"), OnClicked = (button, data) => @@ -510,7 +508,7 @@ namespace Barotrauma }; if (Sprite != null) { - var reloadTextureButton = new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), buttonContainer.RectTransform), TextManager.Get("ReloadSprite")); + var reloadTextureButton = new GUIButton(new RectTransform(new Vector2(0.23f, 1.0f), buttonContainer.RectTransform), TextManager.Get("ReloadSprite")); reloadTextureButton.OnClicked += (button, data) => { Sprite.ReloadXML(); @@ -518,6 +516,15 @@ namespace Barotrauma return true; }; } + new GUIButton(new RectTransform(new Vector2(0.23f, 1.0f), buttonContainer.RectTransform), TextManager.Get("ResetToPrefab")) + { + OnClicked = (button, data) => + { + Reset(); + CreateEditingHUD(); + return true; + } + }; itemEditor.AddCustomContent(buttonContainer, itemEditor.ContentCount); } diff --git a/Barotrauma/BarotraumaClient/Source/Map/Structure.cs b/Barotrauma/BarotraumaClient/Source/Map/Structure.cs index bf0d8126a..02545e1e0 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Structure.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Structure.cs @@ -87,7 +87,7 @@ namespace Barotrauma } } - private GUIComponent CreateEditingHUD(bool inGame = false) + public GUIComponent CreateEditingHUD(bool inGame = false) { editingHUD = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.25f), GUI.Canvas, Anchor.CenterRight) { MinSize = new Point(400, 0) }) { UserData = this }; GUIListBox listBox = new GUIListBox(new RectTransform(new Vector2(0.95f, 0.8f), editingHUD.RectTransform, Anchor.Center), style: null); @@ -98,7 +98,7 @@ namespace Barotrauma Stretch = true, RelativeSpacing = 0.02f }; - new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityX")) + new GUIButton(new RectTransform(new Vector2(0.23f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityX")) { ToolTip = TextManager.Get("MirrorEntityXToolTip"), OnClicked = (button, data) => @@ -107,7 +107,7 @@ namespace Barotrauma return true; } }; - new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityY")) + new GUIButton(new RectTransform(new Vector2(0.23f, 1.0f), buttonContainer.RectTransform), TextManager.Get("MirrorEntityY")) { ToolTip = TextManager.Get("MirrorEntityYToolTip"), OnClicked = (button, data) => @@ -116,7 +116,7 @@ namespace Barotrauma return true; } }; - var reloadTextureButton = new GUIButton(new RectTransform(new Vector2(0.3f, 1.0f), buttonContainer.RectTransform), TextManager.Get("ReloadSprite")) + var reloadTextureButton = new GUIButton(new RectTransform(new Vector2(0.23f, 1.0f), buttonContainer.RectTransform), TextManager.Get("ReloadSprite")) { OnClicked = (button, data) => { @@ -125,6 +125,15 @@ namespace Barotrauma return true; } }; + new GUIButton(new RectTransform(new Vector2(0.23f, 1.0f), buttonContainer.RectTransform), TextManager.Get("ResetToPrefab")) + { + OnClicked = (button, data) => + { + Reset(); + CreateEditingHUD(); + return true; + } + }; editor.AddCustomContent(buttonContainer, editor.ContentCount); PositionEditingHUD(); diff --git a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs index a20d1dd42..1deac6e29 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs @@ -40,6 +40,8 @@ namespace Barotrauma.Networking private List otherClients; + private readonly List serverSubmarines = new List(); + private string serverIP; private bool needAuth; @@ -779,7 +781,7 @@ namespace Barotrauma.Networking saveFiles.Add(inc.ReadString()); } - GameMain.NetLobbyScreen.CampaignSetupUI = MultiPlayerCampaign.StartCampaignSetup(saveFiles); + GameMain.NetLobbyScreen.CampaignSetupUI = MultiPlayerCampaign.StartCampaignSetup(serverSubmarines, saveFiles); break; case ServerPacketHeader.PERMISSIONS: ReadPermissions(inc); @@ -1162,7 +1164,7 @@ namespace Barotrauma.Networking VoipClient = new VoipClient(this, client); UInt16 subListCount = inc.ReadUInt16(); - List submarines = new List(); + serverSubmarines.Clear(); for (int i = 0; i < subListCount; i++) { string subName = inc.ReadString(); @@ -1171,16 +1173,16 @@ namespace Barotrauma.Networking var matchingSub = Submarine.SavedSubmarines.FirstOrDefault(s => s.Name == subName && s.MD5Hash.Hash == subHash); if (matchingSub != null) { - submarines.Add(matchingSub); + serverSubmarines.Add(matchingSub); } else { - submarines.Add(new Submarine(Path.Combine(Submarine.SavePath, subName) + ".sub", subHash, false)); + serverSubmarines.Add(new Submarine(Path.Combine(Submarine.SavePath, subName) + ".sub", subHash, false)); } } - GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.SubList, submarines); - GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.ShuttleList.ListBox, submarines); + GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.SubList, serverSubmarines); + GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.ShuttleList.ListBox, serverSubmarines); gameStarted = inc.ReadBoolean(); bool allowSpectating = inc.ReadBoolean(); diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs index 02442a5a5..fd030ef09 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs @@ -31,14 +31,14 @@ namespace Barotrauma } } - private bool isMultiplayer; + private readonly bool isMultiplayer; - public CampaignSetupUI(bool isMultiplayer, GUIComponent newGameContainer, GUIComponent loadGameContainer, IEnumerable saveFiles=null) + public CampaignSetupUI(bool isMultiplayer, GUIComponent newGameContainer, GUIComponent loadGameContainer, IEnumerable submarines, IEnumerable saveFiles = null) { this.isMultiplayer = isMultiplayer; this.newGameContainer = newGameContainer; this.loadGameContainer = loadGameContainer; - + var columnContainer = new GUILayoutGroup(new RectTransform(Vector2.One, newGameContainer.RectTransform), isHorizontal: true) { Stretch = true, @@ -60,7 +60,7 @@ namespace Barotrauma new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.1f), leftColumn.RectTransform), TextManager.Get("SelectedSub") + ":", textAlignment: Alignment.BottomLeft); subList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.65f), leftColumn.RectTransform)); - UpdateSubList(); + UpdateSubList(submarines); // New game right side new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.1f), rightColumn.RectTransform), TextManager.Get("SaveName") + ":", textAlignment: Alignment.BottomLeft); @@ -87,9 +87,8 @@ namespace Barotrauma return false; } - Submarine selectedSub = subList.SelectedData as Submarine; - if (selectedSub == null) return false; - + if (!(subList.SelectedData is Submarine selectedSub)) { return false; } + if (string.IsNullOrEmpty(selectedSub.MD5Hash.Hash)) { ((GUITextBlock)subList.SelectedComponent).TextColor = Color.DarkRed * 0.8f; @@ -193,12 +192,12 @@ namespace Barotrauma saveNameBox.Text = Path.GetFileNameWithoutExtension(savePath); } - public void UpdateSubList() + public void UpdateSubList(IEnumerable submarines) { #if DEBUG - var subsToShow = Submarine.SavedSubmarines.Where(s => !s.HasTag(SubmarineTag.HideInMenus)); + var subsToShow = submarines.Where(s => !s.HasTag(SubmarineTag.HideInMenus)); #else - var subsToShow = Submarine.SavedSubmarines; + var subsToShow = submarines; #endif subList.ClearChildren(); diff --git a/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs index 091909577..c46668705 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/MainMenuScreen.cs @@ -282,7 +282,7 @@ namespace Barotrauma menuTabs[(int)Tab.LoadGame] = new GUIFrame(new RectTransform(relativeSize, GUI.Canvas, anchor, pivot, minSize, maxSize)); var paddedLoadGame = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.9f), menuTabs[(int)Tab.LoadGame].RectTransform, Anchor.Center), style: null); - campaignSetupUI = new CampaignSetupUI(false, paddedNewGame, paddedLoadGame) + campaignSetupUI = new CampaignSetupUI(false, paddedNewGame, paddedLoadGame, Submarine.SavedSubmarines) { LoadGame = LoadGame, StartNewGame = StartGame @@ -336,7 +336,7 @@ namespace Barotrauma UpdateTutorialList(); - campaignSetupUI.UpdateSubList(); + campaignSetupUI.UpdateSubList(Submarine.SavedSubmarines); ResetButtonStates(null); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs index cf7cc4ea7..6187cf67a 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs @@ -712,6 +712,7 @@ namespace Barotrauma } Body closestBody = Submarine.CheckVisibility(rayStart, rayEnd); + if (Submarine.LastPickedFraction == 1.0f || closestBody == null) { return; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs index 8fed8a9ae..91d669c94 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs @@ -462,10 +462,7 @@ namespace Barotrauma.Items.Components public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power = 0.0f, float signalStrength = 1.0f) { - if (componentElement == null) return; - base.Load(componentElement); - var prevRequiredItems = new Dictionary>(requiredItems); - bool overrideRequiredItems = false; + if (isStuck) return; bool wasOpen = PredictedState == null ? isOpen : PredictedState.Value; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index ff6c1255e..76a75d62e 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -51,6 +51,8 @@ namespace Barotrauma.Items.Components public ItemComponent Parent; + public readonly XElement originalElement; + protected const float CorrectionDelay = 1.0f; protected CoroutineHandle delayedCorrectionCoroutine; protected float correctionTimer; @@ -64,11 +66,7 @@ namespace Barotrauma.Items.Components set; } - public readonly Dictionary properties; - public Dictionary SerializableProperties - { - get { return properties; } - } + public Dictionary SerializableProperties { get; protected set; } public virtual bool IsActive { @@ -194,7 +192,7 @@ namespace Barotrauma.Items.Components get { return name; } } - [Editable, Serialize("", false)] + [Editable, Serialize("", true)] public string Msg { get { return msg; } @@ -210,8 +208,9 @@ namespace Barotrauma.Items.Components public ItemComponent(Item item, XElement element) { this.item = item; + originalElement = element; name = element.Name.ToString(); - properties = SerializableProperty.GetProperties(this); + SerializableProperties = SerializableProperty.GetProperties(this); requiredItems = new Dictionary>(); requiredSkills = new List(); @@ -245,18 +244,9 @@ namespace Barotrauma.Items.Components DebugConsole.ThrowError("Invalid pick key in " + element + "!", e); } - properties = SerializableProperty.DeserializeProperties(this, element); -#if CLIENT - string msg = TextManager.Get(Msg, true); - if (msg != null) - { - foreach (InputType inputType in Enum.GetValues(typeof(InputType))) - { - msg = msg.Replace("[" + inputType.ToString().ToLowerInvariant() + "]", GameMain.Config.KeyBind(inputType).ToString()); - } - Msg = msg; - } -#endif + SerializableProperties = SerializableProperty.DeserializeProperties(this, element); + ParseMsg(); + foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) @@ -318,7 +308,6 @@ namespace Barotrauma.Items.Components item.AddComponent(ic); break; } - } } @@ -623,87 +612,13 @@ namespace Barotrauma.Items.Components public virtual void Load(XElement componentElement) { if (componentElement == null) return; - foreach (XAttribute attribute in componentElement.Attributes()) { - if (!properties.TryGetValue(attribute.Name.ToString().ToLowerInvariant(), out SerializableProperty property)) continue; + if (!SerializableProperties.TryGetValue(attribute.Name.ToString().ToLowerInvariant(), out SerializableProperty property)) continue; property.TrySetValue(this, attribute.Value); } -#if CLIENT - string msg = TextManager.Get(Msg, true); - if (msg != null) - { - foreach (InputType inputType in Enum.GetValues(typeof(InputType))) - { - msg = msg.Replace("[" + inputType.ToString().ToLowerInvariant() + "]", GameMain.Config.KeyBind(inputType).ToString()); - } - Msg = msg; - } -#endif - var prevRequiredItems = new Dictionary>(requiredItems); - bool overrideRequiredItems = false; - - foreach (XElement subElement in componentElement.Elements()) - { - foreach (InputType inputType in Enum.GetValues(typeof(InputType))) - { - case "requireditem": - if (!overrideRequiredItems) requiredItems.Clear(); - overrideRequiredItems = true; - - RelatedItem newRequiredItem = RelatedItem.Load(subElement, item.Name); - if (newRequiredItem == null) continue; - - var prevRequiredItem = prevRequiredItems.ContainsKey(newRequiredItem.Type) ? - prevRequiredItems[newRequiredItem.Type].Find(ri => ri.JoinedIdentifiers == newRequiredItem.JoinedIdentifiers) : null; - if (prevRequiredItem != null) - { - newRequiredItem.statusEffects = prevRequiredItem.statusEffects; - newRequiredItem.Msg = prevRequiredItem.Msg; - } - - if (!requiredItems.ContainsKey(newRequiredItem.Type)) - { - requiredItems[newRequiredItem.Type] = new List(); - } - requiredItems[newRequiredItem.Type].Add(newRequiredItem); - break; - } - Msg = msg; - } -#endif - - // Only door override required items - //var prevRequiredItems = new Dictionary>(requiredItems); - //bool overrideRequiredItems = false; - - //foreach (XElement subElement in componentElement.Elements()) - //{ - // switch (subElement.Name.ToString().ToLowerInvariant()) - // { - // case "requireditem": - // if (!overrideRequiredItems) requiredItems.Clear(); - // overrideRequiredItems = true; - - // RelatedItem newRequiredItem = RelatedItem.Load(subElement, item.Name); - // if (newRequiredItem == null) continue; - - // var prevRequiredItem = prevRequiredItems.ContainsKey(newRequiredItem.Type) ? - // prevRequiredItems[newRequiredItem.Type].Find(ri => ri.JoinedIdentifiers == newRequiredItem.JoinedIdentifiers) : null; - // if (prevRequiredItem != null) - // { - // newRequiredItem.statusEffects = prevRequiredItem.statusEffects; - // newRequiredItem.Msg = prevRequiredItem.Msg; - // } - - // if (!requiredItems.ContainsKey(newRequiredItem.Type)) - // { - // requiredItems[newRequiredItem.Type] = new List(); - // } - // requiredItems[newRequiredItem.Type].Add(newRequiredItem); - // break; - // } - //} + ParseMsg(); + OverrideRequiredItems(componentElement); } /// @@ -794,5 +709,47 @@ namespace Barotrauma.Items.Components parentElement.Add(componentElement); return componentElement; } + + public virtual void Reset() + { + SerializableProperties = SerializableProperty.DeserializeProperties(this, originalElement); + ParseMsg(); + OverrideRequiredItems(originalElement); + } + + private void OverrideRequiredItems(XElement element) + { + var prevRequiredItems = new Dictionary>(requiredItems); + bool overrideRequiredItems = false; + foreach (XElement subElement in element.Elements()) + { + switch (subElement.Name.ToString().ToLowerInvariant()) + { + case "requireditem": + if (!overrideRequiredItems) requiredItems.Clear(); + overrideRequiredItems = true; + + RelatedItem newRequiredItem = RelatedItem.Load(subElement, item.Name); + if (newRequiredItem == null) continue; + + var prevRequiredItem = prevRequiredItems.ContainsKey(newRequiredItem.Type) ? + prevRequiredItems[newRequiredItem.Type].Find(ri => ri.JoinedIdentifiers == newRequiredItem.JoinedIdentifiers) : null; + if (prevRequiredItem != null) + { + newRequiredItem.statusEffects = prevRequiredItem.statusEffects; + newRequiredItem.Msg = prevRequiredItem.Msg; + } + + if (!requiredItems.ContainsKey(newRequiredItem.Type)) + { + requiredItems[newRequiredItem.Type] = new List(); + } + requiredItems[newRequiredItem.Type].Add(newRequiredItem); + break; + } + } + } + + partial void ParseMsg(); } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 434281de1..9bc8b0e87 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -76,11 +76,7 @@ namespace Barotrauma //a dictionary containing lists of the status effects in all the components of the item private Dictionary> statusEffectLists; - public readonly Dictionary properties; - public Dictionary SerializableProperties - { - get { return properties; } - } + public Dictionary SerializableProperties { get; protected set; } private bool? hasInGameEditableProperties; bool HasInGameEditableProperties @@ -90,7 +86,7 @@ namespace Barotrauma if (hasInGameEditableProperties == null) { hasInGameEditableProperties = false; - if (properties.Values.Any(p => p.Attributes.OfType().Any())) + if (SerializableProperties.Values.Any(p => p.Attributes.OfType().Any())) { hasInGameEditableProperties = true; } @@ -99,7 +95,7 @@ namespace Barotrauma foreach (ItemComponent component in components) { if (!component.AllowInGameEditing) { continue; } - if (component.properties.Values.Any(p => p.Attributes.OfType().Any())) + if (component.SerializableProperties.Values.Any(p => p.Attributes.OfType().Any())) { hasInGameEditableProperties = true; break; @@ -468,8 +464,8 @@ namespace Barotrauma XElement element = itemPrefab.ConfigElement; if (element == null) return; - - properties = SerializableProperty.DeserializeProperties(this, element); + + SerializableProperties = SerializableProperty.DeserializeProperties(this, element); if (submarine == null || !submarine.Loading) FindHull(); @@ -586,10 +582,10 @@ namespace Barotrauma public override MapEntity Clone() { Item clone = new Item(rect, Prefab, Submarine, callOnItemLoaded: false); - foreach (KeyValuePair property in properties) + foreach (KeyValuePair property in SerializableProperties) { if (!property.Value.Attributes.OfType().Any()) continue; - clone.properties[property.Key].TrySetValue(clone, property.Value.GetValue(this)); + clone.SerializableProperties[property.Key].TrySetValue(clone, property.Value.GetValue(this)); } if (components.Count != clone.components.Count) @@ -603,10 +599,10 @@ namespace Barotrauma for (int i = 0; i < components.Count && i < clone.components.Count; i++) { - foreach (KeyValuePair property in components[i].properties) + foreach (KeyValuePair property in components[i].SerializableProperties) { if (!property.Value.Attributes.OfType().Any()) continue; - clone.components[i].properties[property.Key].TrySetValue(clone.components[i], property.Value.GetValue(components[i])); + clone.components[i].SerializableProperties[property.Key].TrySetValue(clone.components[i], property.Value.GetValue(components[i])); } //clone requireditem identifiers @@ -1881,7 +1877,7 @@ namespace Barotrauma foreach (XAttribute attribute in element.Attributes()) { - if (!item.properties.TryGetValue(attribute.Name.ToString(), out SerializableProperty property)) continue; + if (!item.SerializableProperties.TryGetValue(attribute.Name.ToString(), out SerializableProperty property)) continue; bool shouldBeLoaded = false; foreach (var propertyAttribute in property.Attributes.OfType()) { @@ -1974,6 +1970,12 @@ namespace Barotrauma return element; } + public virtual void Reset() + { + SerializableProperties = SerializableProperty.DeserializeProperties(this, Prefab.ConfigElement); + components.ForEach(c => c.Reset()); + } + public override void OnMapLoaded() { FindHull(); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs index 53466bc5a..6e4fe089b 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs @@ -1193,5 +1193,10 @@ namespace Barotrauma SetDamage(i, Sections[i].damage, createNetworkEvent: false); } } + + public virtual void Reset() + { + SerializableProperties = SerializableProperty.DeserializeProperties(this, Prefab.ConfigElement); + } } } diff --git a/Barotrauma/BarotraumaShared/Source/Map/StructurePrefab.cs b/Barotrauma/BarotraumaShared/Source/Map/StructurePrefab.cs index 75ec3391b..a4077554a 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/StructurePrefab.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/StructurePrefab.cs @@ -8,6 +8,8 @@ namespace Barotrauma { partial class StructurePrefab : MapEntityPrefab { + public XElement ConfigElement { get; private set; } + private bool canSpriteFlipX, canSpriteFlipY; private float health; @@ -150,6 +152,7 @@ namespace Barotrauma { name = element.GetAttributeString("name", "") }; + sp.ConfigElement = element; if (string.IsNullOrEmpty(sp.name)) sp.name = element.Name.ToString(); sp.identifier = element.GetAttributeString("identifier", "");