From 7446dc17c1531c4986cdffa483f357ca0bd02e23 Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Tue, 21 Apr 2026 12:21:41 +0300 Subject: [PATCH] v1.12.7.0 (Spring Update 2026 Hotfix 1) --- .../ClientSource/Settings/SettingsMenu.cs | 45 +++++++++++++++++- .../ClientSource/Steam/Workshop.cs | 14 ++++-- .../BarotraumaClient/LinuxClient.csproj | 2 +- Barotrauma/BarotraumaClient/MacClient.csproj | 2 +- .../BarotraumaClient/WindowsClient.csproj | 2 +- .../BarotraumaServer/LinuxServer.csproj | 2 +- Barotrauma/BarotraumaServer/MacServer.csproj | 2 +- .../BarotraumaServer/WindowsServer.csproj | 2 +- .../OxygenDispenserTest.xml | 2 +- .../RotationAndFlippingTests.sub | Bin 13456 -> 13119 bytes .../Characters/AI/EnemyAIController.cs | 21 +++++--- .../Items/Components/ItemContainer.cs | 22 +++++---- .../Items/Components/Machines/Controller.cs | 4 -- .../Map/Levels/LevelObjects/LevelTrigger.cs | 2 +- Barotrauma/BarotraumaShared/changelog.txt | 14 +++++- README.md | 2 +- 16 files changed, 103 insertions(+), 35 deletions(-) diff --git a/Barotrauma/BarotraumaClient/ClientSource/Settings/SettingsMenu.cs b/Barotrauma/BarotraumaClient/ClientSource/Settings/SettingsMenu.cs index 34ebe4aca..2bbb63397 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Settings/SettingsMenu.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Settings/SettingsMenu.cs @@ -174,9 +174,9 @@ namespace Barotrauma private static RectTransform NewItemRectT(GUILayoutGroup parent) => new RectTransform((1.0f, 0.06f), parent.RectTransform, Anchor.CenterLeft); - private static void Spacer(GUILayoutGroup parent) + private static void Spacer(GUILayoutGroup parent, float height = 0.03f) { - new GUIFrame(new RectTransform((1.0f, 0.03f), parent.RectTransform, Anchor.CenterLeft), style: null); + new GUIFrame(new RectTransform((1.0f, height), parent.RectTransform, Anchor.CenterLeft), style: null); } private static GUITextBlock Label(GUILayoutGroup parent, LocalizedString str, GUIFont font) @@ -507,6 +507,47 @@ namespace Barotrauma return true; } }; +#if OSX + Spacer(voiceChat, 0.003f); + + // On macOS, microphone permission can apparently sometimes end up in a broken state when the app binary changes (eg. after a Steam update). + // The device seems to be there, but won't receive anything, even if the mic permission is fine. + // This button lets the user reset it and reboot the game, so the mic permission check will be retriggered on next run. + new GUIButton(new RectTransform(new Vector2(1.0f, 1.0f), voiceChat.RectTransform), + text: TextManager.Get("MacResetMicPermissions"), + style: "GUIButtonSmall") + { + ToolTip = TextManager.Get("MacResetMicPermissionsToolTip"), + OnClicked = (btn, obj) => + { + var confirmBox = new GUIMessageBox( + TextManager.Get("MacResetMicPermissions"), + TextManager.Get("MacResetMicPermissionsConfirm"), + [TextManager.Get("OK"), TextManager.Get("Cancel")]); + confirmBox.Buttons[0].OnClicked = (_, _) => + { + try + { + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo + { + FileName = "tccutil", + Arguments = "reset Microphone com.FakeFish.Barotrauma", + UseShellExecute = false + }); + } + catch (Exception e) + { + DebugConsole.NewMessage($"Failed to reset microphone permission: {e.Message}", Color.Orange); + } + GameMain.Instance.Exit(); + confirmBox.Close(); + return true; + }; + confirmBox.Buttons[1].OnClicked = confirmBox.Close; + return true; + } + }; +#endif Spacer(voiceChat); Label(voiceChat, TextManager.Get("VCInputMode"), GUIStyle.SubHeadingFont); diff --git a/Barotrauma/BarotraumaClient/ClientSource/Steam/Workshop.cs b/Barotrauma/BarotraumaClient/ClientSource/Steam/Workshop.cs index 5f33df3bc..dc31dc47c 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/Steam/Workshop.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/Steam/Workshop.cs @@ -18,6 +18,10 @@ namespace Barotrauma.Steam { public const int MaxThumbnailSize = 1024 * 1024; + /// + /// Tags the players can choose for their workshop items. These must match the ones defined in the Steamworks backend. They're case insensitive, but must otherwise match exactly for the tag filtering to work correctly. + /// The localized names for these are fetched from the loca files with the identifier "workshop.contenttag.{tag.RemoveWhitespace()}". + /// public static readonly ImmutableArray Tags = new [] { "submarine", @@ -25,7 +29,7 @@ namespace Barotrauma.Steam "monster", "mission", "outpost", - "beaconstation", + "beacon station", "wreck", "ruin", "weapons", @@ -34,14 +38,14 @@ namespace Barotrauma.Steam "art", "event set", "total conversion", - "gamemode", - "gameplaymechanics", + "game mode", + "gameplay mechanics", "environment", "item assembly", "language", "qol", - "clientside", - "serverside", + "client-side", + "server-side", "outdated", "library" }.ToIdentifiers().ToImmutableArray(); diff --git a/Barotrauma/BarotraumaClient/LinuxClient.csproj b/Barotrauma/BarotraumaClient/LinuxClient.csproj index 0fd9b5f60..76c505259 100644 --- a/Barotrauma/BarotraumaClient/LinuxClient.csproj +++ b/Barotrauma/BarotraumaClient/LinuxClient.csproj @@ -6,7 +6,7 @@ Barotrauma FakeFish, Undertow Games Barotrauma - 1.12.6.2 + 1.12.7.0 Copyright © FakeFish 2018-2024 AnyCPU;x64 Barotrauma diff --git a/Barotrauma/BarotraumaClient/MacClient.csproj b/Barotrauma/BarotraumaClient/MacClient.csproj index ced8f9692..4f6ffc38d 100644 --- a/Barotrauma/BarotraumaClient/MacClient.csproj +++ b/Barotrauma/BarotraumaClient/MacClient.csproj @@ -6,7 +6,7 @@ Barotrauma FakeFish, Undertow Games Barotrauma - 1.12.6.2 + 1.12.7.0 Copyright © FakeFish 2018-2024 AnyCPU;x64 Barotrauma diff --git a/Barotrauma/BarotraumaClient/WindowsClient.csproj b/Barotrauma/BarotraumaClient/WindowsClient.csproj index a62c8335f..649d8f930 100644 --- a/Barotrauma/BarotraumaClient/WindowsClient.csproj +++ b/Barotrauma/BarotraumaClient/WindowsClient.csproj @@ -6,7 +6,7 @@ Barotrauma FakeFish, Undertow Games Barotrauma - 1.12.6.2 + 1.12.7.0 Copyright © FakeFish 2018-2024 AnyCPU;x64 Barotrauma diff --git a/Barotrauma/BarotraumaServer/LinuxServer.csproj b/Barotrauma/BarotraumaServer/LinuxServer.csproj index 050b41dce..37c1595ca 100644 --- a/Barotrauma/BarotraumaServer/LinuxServer.csproj +++ b/Barotrauma/BarotraumaServer/LinuxServer.csproj @@ -6,7 +6,7 @@ Barotrauma FakeFish, Undertow Games Barotrauma Dedicated Server - 1.12.6.2 + 1.12.7.0 Copyright © FakeFish 2018-2023 AnyCPU;x64 DedicatedServer diff --git a/Barotrauma/BarotraumaServer/MacServer.csproj b/Barotrauma/BarotraumaServer/MacServer.csproj index b255712af..b216a3a40 100644 --- a/Barotrauma/BarotraumaServer/MacServer.csproj +++ b/Barotrauma/BarotraumaServer/MacServer.csproj @@ -6,7 +6,7 @@ Barotrauma FakeFish, Undertow Games Barotrauma Dedicated Server - 1.12.6.2 + 1.12.7.0 Copyright © FakeFish 2018-2023 AnyCPU;x64 DedicatedServer diff --git a/Barotrauma/BarotraumaServer/WindowsServer.csproj b/Barotrauma/BarotraumaServer/WindowsServer.csproj index 828830e30..0d3c8a9d1 100644 --- a/Barotrauma/BarotraumaServer/WindowsServer.csproj +++ b/Barotrauma/BarotraumaServer/WindowsServer.csproj @@ -6,7 +6,7 @@ Barotrauma FakeFish, Undertow Games Barotrauma Dedicated Server - 1.12.6.2 + 1.12.7.0 Copyright © FakeFish 2018-2023 AnyCPU;x64 DedicatedServer diff --git a/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]RotationAndFlippingTests/OxygenDispenserTest.xml b/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]RotationAndFlippingTests/OxygenDispenserTest.xml index 1cf6e86ca..82378a936 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]RotationAndFlippingTests/OxygenDispenserTest.xml +++ b/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]RotationAndFlippingTests/OxygenDispenserTest.xml @@ -14,7 +14,7 @@ AttachedByDefault="true" DisallowAttachingOverTags="container,planter,refuelableitem" DisallowAttachingOverSize="115,130"> - + diff --git a/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]RotationAndFlippingTests/RotationAndFlippingTests.sub b/Barotrauma/BarotraumaShared/LocalMods/[DebugOnlyTest]RotationAndFlippingTests/RotationAndFlippingTests.sub index 7eafd5c1c5bcc44e349a1aa1f7ce44430c4078cb..10d816db3920a87423d7c115a9f0bf7ae2ce249d 100644 GIT binary patch literal 13119 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 Vfe8+1e9ZoZ{plCTl*nfcEDpPREUs%m#v_p_gU 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 - /// The monster won't try to damage these submarines + /// The monster won't try to damage these submarines. Applies to hulls, structures and static items (items without a physics body) belonging to these submarines. Does not apply to non-static items, e.g. flares or other provocative items. + /// + private readonly HashSet unattackableSubmarines = []; + + ///

+ /// Set the submarine(s) the monster won't attack. Applies to hulls, structures and static items (items without a physics body) belonging to these submarines. Does not apply to non-static items, e.g. flares or other provocative items. /// - private readonly HashSet unattackableSubmarines = new HashSet(); - public void SetUnattackableSubmarines(Submarine submarine, bool includeOwnSub = true, bool includeConnectedSubs = true, bool clearExisting = true) { if (clearExisting) @@ -3075,11 +3078,17 @@ namespace Barotrauma } else { - // Ignore all structures, items, and hulls inside these subs. - if (aiTarget.Entity.Submarine != null) + if (aiTarget.Entity.Submarine != null) { + //ignore all items, structures and hulls in wrecks and beacon stations + //(we don't want monsters to be distracted by them during missions, + //nor have monsters inside them attack "their home" rather than the player) if (aiTarget.Entity.Submarine.Info.IsWreck || - aiTarget.Entity.Submarine.Info.IsBeacon || + aiTarget.Entity.Submarine.Info.IsBeacon) + { + continue; + } + if (aiTarget.Entity is Structure or Hull or Item { body: null } && unattackableSubmarines.Contains(aiTarget.Entity.Submarine)) { continue; diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemContainer.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemContainer.cs index 561fa6716..c105aee80 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemContainer.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/ItemContainer.cs @@ -99,7 +99,7 @@ namespace Barotrauma.Items.Components } } - [Serialize("0.0,0.0", IsPropertySaveable.No, description: "The position where the contained items get drawn at. In the case of items with a physics body, the offset is from the center of the body, on items without one from the top-left corner of the sprite. In pixels.")] + [Serialize("0.0,0.0", IsPropertySaveable.No, description: "The position where the contained items get drawn at (offset from the upper left corner of the sprite in pixels).")] public Vector2 ItemPos { get; set; } [Serialize("0.0,0.0", IsPropertySaveable.No, description: "The interval at which the contained items are spaced apart from each other (in pixels).")] @@ -1093,25 +1093,21 @@ namespace Barotrauma.Items.Components { if (item.body == null) { - //if the item is a holdable item currently attached to a wall (i.e. normally has a physics body, but the body is now disabled), - //we must position the contained items using the center as the origin since the item positions have been configured with the assumption the item has a body - bool isAttachedHoldable = item.GetComponent() is { Attached: true }; - bool useCenterAsOrigin = isAttachedHoldable; if (flippedX) { transformedItemPos.X = -transformedItemPos.X; - if (!useCenterAsOrigin) { transformedItemPos.X += item.Rect.Width; } + transformedItemPos.X += item.Rect.Width; transformedItemInterval.X = -transformedItemInterval.X; transformedItemIntervalHorizontal.X = -transformedItemIntervalHorizontal.X; } if (flippedY) { transformedItemPos.Y = -transformedItemPos.Y; - if (!useCenterAsOrigin) { transformedItemPos.Y -= item.Rect.Height; } + transformedItemPos.Y -= item.Rect.Height; transformedItemInterval.Y = -transformedItemInterval.Y; transformedItemIntervalVertical.Y = -transformedItemIntervalVertical.Y; } - transformedItemPos += useCenterAsOrigin ? item.Position : new Vector2(item.Rect.X, item.Rect.Y); + transformedItemPos += new Vector2(item.Rect.X, item.Rect.Y); if (drawPosition) { if (item.Submarine != null) { transformedItemPos += item.Submarine.DrawPosition; } @@ -1129,6 +1125,16 @@ namespace Barotrauma.Items.Components } else { + if (item.GetComponent() is { Attachable: true }) + { + //if the item is attachable to walls, we need a bit of special logic because the item can either + //have or not have a body depending on whether it's attached. + + //since it seems previously the contained item positions have always been configured as if the item had no body (using the top-left corner as the origin), + //let's modify the position here to position the items correctly even when the body is active (moving the origin from the center of the body to the top-left corner) + transformedItemPos -= item.Rect.Size.FlipY().ToVector2() / 2; + } + Matrix transform = Matrix.CreateRotationZ(drawPosition ? item.body.DrawRotation : item.body.Rotation); if (bodyFlipped) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Controller.cs b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Controller.cs index b9c3222ba..9e2d344fe 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Controller.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Items/Components/Machines/Controller.cs @@ -862,10 +862,6 @@ namespace Barotrauma.Items.Components } else if (CanBeSelectedByCharacters) { -#if SERVER - GameServer.Log($"{GameServer.CharacterLogName(activator)} entered {item.Name}", ServerLog.MessageType.ItemInteraction); -#endif - activator.DeselectCharacter(); User = activator; diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelObjects/LevelTrigger.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelObjects/LevelTrigger.cs index 21a71b22b..ec3bafffc 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelObjects/LevelTrigger.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelObjects/LevelTrigger.cs @@ -816,7 +816,7 @@ namespace Barotrauma public static float GetDistanceFactor(PhysicsBody triggererBody, PhysicsBody triggerBody, float colliderRadius) { - return 1.0f - ConvertUnits.ToDisplayUnits(Vector2.Distance(triggererBody.SimPosition, triggerBody.SimPosition)) / colliderRadius; + return 1.0f - ConvertUnits.ToDisplayUnits(Vector2.Distance(triggererBody.SimPosition, triggerBody.SimPosition) - triggererBody.GetMaxExtent() / 2) / colliderRadius; } public Vector2 GetWaterFlowVelocity(Vector2 viewPosition) diff --git a/Barotrauma/BarotraumaShared/changelog.txt b/Barotrauma/BarotraumaShared/changelog.txt index 3c6b19da0..1e029d35c 100644 --- a/Barotrauma/BarotraumaShared/changelog.txt +++ b/Barotrauma/BarotraumaShared/changelog.txt @@ -1,4 +1,17 @@ ------------------------------------------------------------------------------------------------------------------------------------------------- +v1.12.7.0 +------------------------------------------------------------------------------------------------------------------------------------------------- + +- Reduced how much the new weak points in the reworked subs push bots around to make them more capable of fixing broken weak points. +- Fixed selecting any item that forces the character to some pose (chairs, periscopes) getting logged in the server console. +- Mac only: added a button for settings mic permissions to the audio settings. It seems that on Mac, the game updates may cause the OS to revoke the permissions. +- Fixed some of the Workshop tags you can choose in-game not working on Steam's side. + +Modding: +- Fixed contained items being misaligned on attachable items (e.g. in mods that make diving suit cabinets attachable). +- Fixed monsters spawned by an event inside an outpost being unable to attack any items inside that outpost. To our knowledge, didn't affect vanilla events, but caused issues in certain mods. + +------------------------------------------------------------------------------------------------------------------------------------------------- v1.12.6.2 ------------------------------------------------------------------------------------------------------------------------------------------------- @@ -439,7 +452,6 @@ v1.8.8.1 Modding: - Fixed transferring afflictions to a newly spawned character using status effects causing a crash if the original character had already been removed. Didn't affect any vanilla content. ->>>>>>> master ------------------------------------------------------------------------------------------------------------------------------------------------- v1.8.7.0 diff --git a/README.md b/README.md index b1aa385e2..0cefa4c80 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Barotrauma -Copyright © FakeFish Ltd 2017-2024 +Copyright © FakeFish Ltd 2017-2026 Before downloading the source code, please read the [EULA](EULA.txt).