diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs index 73826cd2c..51190dbd6 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs @@ -10,6 +10,7 @@ using System.Xml.Linq; #if CLIENT using Barotrauma.Lights; #endif +using Barotrauma.Extensions; namespace Barotrauma.Items.Components { @@ -210,12 +211,13 @@ namespace Barotrauma.Items.Components #endif } - public override bool HasRequiredItems(Character character, bool addMessage) + private string text = TextManager.Get("DoorMsgCannotOpen"); + public override bool HasRequiredItems(Character character, bool addMessage, string msg = null) { if (item.Condition <= RepairThreshold) return true; //For repairing //this is a bit pointless atm because if canBePicked is false it won't allow you to do Pick() anyway, however it's still good for future-proofing. - return requiredItems.Any() ? base.HasRequiredItems(character, addMessage) : canBePicked; + return requiredItems.Any() ? base.HasRequiredItems(character, addMessage, msg ?? text) : canBePicked; } public override bool Pick(Character picker) @@ -226,18 +228,27 @@ namespace Barotrauma.Items.Components public override bool OnPicked(Character picker) { if (item.Condition <= RepairThreshold) return true; //repairs + if (requiredItems.Any()) + { + ForceOpen(ActionType.OnPicked); + } + return false; + } + private void ForceOpen(ActionType actionType) + { SetState(PredictedState == null ? !isOpen : !PredictedState.Value, false, true); //crowbar function #if CLIENT - PlaySound(ActionType.OnPicked, item.WorldPosition, picker); + PlaySound(actionType, item.WorldPosition, picker); #endif - return false; } public override bool Select(Character character) { //can only be selected if the item is broken - return item.Condition <= RepairThreshold; + if (item.Condition <= RepairThreshold) return true; //repairs + ForceOpen(ActionType.OnUse); + return false; } public override void Update(float deltaTime, Camera cam) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index ca1677eac..e53053186 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -554,7 +554,7 @@ namespace Barotrauma.Items.Components public virtual void FlipY(bool relativeToSub) { } - public bool HasRequiredContainedItems(bool addMessage) + public bool HasRequiredContainedItems(bool addMessage, string msg = null) { if (!requiredItems.ContainsKey(RelatedItem.RelationType.Contained)) return true; if (item.OwnInventory == null) return false; @@ -564,7 +564,11 @@ namespace Barotrauma.Items.Components if (!item.OwnInventory.Items.Any(it => it != null && it.Condition > 0.0f && ri.MatchesItem(it))) { #if CLIENT - if (addMessage && !string.IsNullOrEmpty(ri.Msg)) GUI.AddMessage(ri.Msg, Color.Red); + msg = msg ?? ri.Msg; + if (addMessage && !string.IsNullOrEmpty(msg)) + { + GUI.AddMessage(msg, Color.Red); + } #endif return false; } @@ -573,7 +577,7 @@ namespace Barotrauma.Items.Components return true; } - public virtual bool HasRequiredItems(Character character, bool addMessage) + public virtual bool HasRequiredItems(Character character, bool addMessage, string msg = null) { if (!requiredItems.Any()) return true; if (character.Inventory == null) return false; @@ -585,7 +589,11 @@ namespace Barotrauma.Items.Components if (character.SelectedItems.FirstOrDefault(it => it != null && it.Condition > 0.0f && ri.MatchesItem(it)) == null) { #if CLIENT - if (addMessage && !string.IsNullOrEmpty(ri.Msg)) GUI.AddMessage(ri.Msg, Color.Red); + msg = msg ?? ri.Msg; + if (addMessage && !string.IsNullOrEmpty(msg)) + { + GUI.AddMessage(msg, Color.Red); + } #endif return false; } @@ -598,7 +606,11 @@ namespace Barotrauma.Items.Components if (character.Inventory.Items.FirstOrDefault(it => it != null && it.Condition > 0.0f && ri.MatchesItem(it)) == null) { #if CLIENT - if (addMessage && !string.IsNullOrEmpty(ri.Msg)) GUI.AddMessage(ri.Msg, Color.Red); + msg = msg ?? ri.Msg; + if (addMessage && !string.IsNullOrEmpty(msg)) + { + GUI.AddMessage(msg, Color.Red); + } #endif return false; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index ff324aca2..62aec47ac 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -1619,7 +1619,12 @@ namespace Barotrauma if (ic is Holdable holdable && !holdable.CanBeDeattached()) continue; Color color = Color.Red; - if (ic.HasRequiredSkills(character) && ic.HasRequiredItems(character, false)) color = Color.Orange; + bool hasRequiredSkillsAndItems = ic.HasRequiredSkills(character) && ic.HasRequiredItems(character, false); + if (hasRequiredSkillsAndItems) + { + color = Color.Orange; + } + // TODO: Blue color if the item is selected texts.Add(new ColoredText(ic.DisplayMsg, color, false)); } diff --git a/Barotrauma/BarotraumaShared/Submarines/Berilia_ManualDoorTest.sub b/Barotrauma/BarotraumaShared/Submarines/Berilia_ManualDoorTest.sub new file mode 100644 index 000000000..02de8459d Binary files /dev/null and b/Barotrauma/BarotraumaShared/Submarines/Berilia_ManualDoorTest.sub differ