Merge branch 'master' of https://github.com/Regalis11/Barotrauma into develop

This commit is contained in:
EvilFactory
2025-04-16 18:08:37 -03:00
20 changed files with 106 additions and 41 deletions
+1 -1
View File
@@ -73,7 +73,7 @@ body:
label: Version label: Version
description: Which version of the game did the bug happen in? You can see the current version number in the bottom left corner of your screen in the main menu. description: Which version of the game did the bug happen in? You can see the current version number in the bottom left corner of your screen in the main menu.
options: options:
- v1.8.6.2 (Calm Before the Storm update) - v1.8.7.0 (Calm Before the Storm update)
- Other - Other
validations: validations:
required: true required: true
@@ -915,6 +915,10 @@ namespace Barotrauma
{ {
openAccordion.AddToGUIUpdateList(order: 1); openAccordion.AddToGUIUpdateList(order: 1);
} }
if (PlayerInput.PrimaryMouseButtonDown())
{
GUIComponent.OpenAccordionPopups.Clear();
}
SocialOverlay.Instance?.AddToGuiUpdateList(); SocialOverlay.Instance?.AddToGuiUpdateList();
@@ -2647,6 +2651,8 @@ namespace Barotrauma
if (color.HasValue) if (color.HasValue)
{ {
button.Color = color.Value; button.Color = color.Value;
button.HoverColor = Color.Lerp(color.Value, Color.White, 0.5f);
button.PressedColor = Color.Lerp(color.Value, Color.Black, 0.5f);
} }
} }
@@ -1701,7 +1701,7 @@ namespace Barotrauma
if (hasPortrait) if (hasPortrait)
{ {
float portraitAspectRatio = portrait.SourceRect.Width / portrait.SourceRect.Height; float portraitAspectRatio = portrait.SourceRect.Width / portrait.SourceRect.Height;
GUIImage portraitImage = new GUIImage(new RectTransform(new Vector2(0.5f, 1f), locationInfoContainer.RectTransform, Anchor.CenterRight), portrait, scaleToFit: true) GUIImage portraitImage = new GUIImage(new RectTransform(new Vector2(0.45f, 1f), locationInfoContainer.RectTransform, Anchor.CenterRight), portrait, scaleToFit: GUIImage.ScalingMode.ScaleToFitLargestExtent)
{ {
IgnoreLayoutGroups = true IgnoreLayoutGroups = true
}; };
@@ -6,7 +6,7 @@
<RootNamespace>Barotrauma</RootNamespace> <RootNamespace>Barotrauma</RootNamespace>
<Authors>FakeFish, Undertow Games</Authors> <Authors>FakeFish, Undertow Games</Authors>
<Product>Barotrauma</Product> <Product>Barotrauma</Product>
<Version>1.8.6.2</Version> <Version>1.8.7.0</Version>
<Copyright>Copyright © FakeFish 2018-2024</Copyright> <Copyright>Copyright © FakeFish 2018-2024</Copyright>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<AssemblyName>Barotrauma</AssemblyName> <AssemblyName>Barotrauma</AssemblyName>
+1 -1
View File
@@ -6,7 +6,7 @@
<RootNamespace>Barotrauma</RootNamespace> <RootNamespace>Barotrauma</RootNamespace>
<Authors>FakeFish, Undertow Games</Authors> <Authors>FakeFish, Undertow Games</Authors>
<Product>Barotrauma</Product> <Product>Barotrauma</Product>
<Version>1.8.6.2</Version> <Version>1.8.7.0</Version>
<Copyright>Copyright © FakeFish 2018-2024</Copyright> <Copyright>Copyright © FakeFish 2018-2024</Copyright>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<AssemblyName>Barotrauma</AssemblyName> <AssemblyName>Barotrauma</AssemblyName>
@@ -6,7 +6,7 @@
<RootNamespace>Barotrauma</RootNamespace> <RootNamespace>Barotrauma</RootNamespace>
<Authors>FakeFish, Undertow Games</Authors> <Authors>FakeFish, Undertow Games</Authors>
<Product>Barotrauma</Product> <Product>Barotrauma</Product>
<Version>1.8.6.2</Version> <Version>1.8.7.0</Version>
<Copyright>Copyright © FakeFish 2018-2024</Copyright> <Copyright>Copyright © FakeFish 2018-2024</Copyright>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<AssemblyName>Barotrauma</AssemblyName> <AssemblyName>Barotrauma</AssemblyName>
@@ -6,7 +6,7 @@
<RootNamespace>Barotrauma</RootNamespace> <RootNamespace>Barotrauma</RootNamespace>
<Authors>FakeFish, Undertow Games</Authors> <Authors>FakeFish, Undertow Games</Authors>
<Product>Barotrauma Dedicated Server</Product> <Product>Barotrauma Dedicated Server</Product>
<Version>1.8.6.2</Version> <Version>1.8.7.0</Version>
<Copyright>Copyright © FakeFish 2018-2023</Copyright> <Copyright>Copyright © FakeFish 2018-2023</Copyright>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<AssemblyName>DedicatedServer</AssemblyName> <AssemblyName>DedicatedServer</AssemblyName>
+1 -1
View File
@@ -6,7 +6,7 @@
<RootNamespace>Barotrauma</RootNamespace> <RootNamespace>Barotrauma</RootNamespace>
<Authors>FakeFish, Undertow Games</Authors> <Authors>FakeFish, Undertow Games</Authors>
<Product>Barotrauma Dedicated Server</Product> <Product>Barotrauma Dedicated Server</Product>
<Version>1.8.6.2</Version> <Version>1.8.7.0</Version>
<Copyright>Copyright © FakeFish 2018-2023</Copyright> <Copyright>Copyright © FakeFish 2018-2023</Copyright>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<AssemblyName>DedicatedServer</AssemblyName> <AssemblyName>DedicatedServer</AssemblyName>
@@ -284,7 +284,12 @@ namespace Barotrauma
break; break;
case VoteType.Kick: case VoteType.Kick:
byte kickedClientID = inc.ReadByte(); byte kickedClientID = inc.ReadByte();
if ((DateTime.Now - sender.JoinTime).TotalSeconds < GameMain.Server.ServerSettings.DisallowKickVoteTime)
if (!GameMain.Server.ServerSettings.AllowVoteKick)
{
DebugConsole.ThrowError($"Client {sender.Name} attempted to vote to kick a client, even though vote kicking is disabled. Ignoring the vote.");
}
else if ((DateTime.Now - sender.JoinTime).TotalSeconds < GameMain.Server.ServerSettings.DisallowKickVoteTime)
{ {
GameMain.Server.SendDirectChatMessage($"ServerMessage.kickvotedisallowed", sender); GameMain.Server.SendDirectChatMessage($"ServerMessage.kickvotedisallowed", sender);
} }
@@ -67,7 +67,7 @@ namespace Barotrauma.Steam
Steamworks.SteamServer.Passworded = hasPassword; Steamworks.SteamServer.Passworded = hasPassword;
return; return;
case string serverMessage when key == "message": case string serverMessage when key == "message":
int maxValueLength = 255; int maxValueLength = 127;
int totalMaxLength = 2000; int totalMaxLength = 2000;
int chunkIndex = 0; int chunkIndex = 0;
for (int charIndex = 0; charIndex < serverMessage.Length && charIndex < totalMaxLength; charIndex += maxValueLength) for (int charIndex = 0; charIndex < serverMessage.Length && charIndex < totalMaxLength; charIndex += maxValueLength)
@@ -6,7 +6,7 @@
<RootNamespace>Barotrauma</RootNamespace> <RootNamespace>Barotrauma</RootNamespace>
<Authors>FakeFish, Undertow Games</Authors> <Authors>FakeFish, Undertow Games</Authors>
<Product>Barotrauma Dedicated Server</Product> <Product>Barotrauma Dedicated Server</Product>
<Version>1.8.6.2</Version> <Version>1.8.7.0</Version>
<Copyright>Copyright © FakeFish 2018-2023</Copyright> <Copyright>Copyright © FakeFish 2018-2023</Copyright>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<AssemblyName>DedicatedServer</AssemblyName> <AssemblyName>DedicatedServer</AssemblyName>
@@ -2196,17 +2196,22 @@ namespace Barotrauma
private static float CalculateHullSafety(Hull hull, IEnumerable<Hull> visibleHulls, Character character, bool ignoreWater = false, bool ignoreOxygen = false, bool ignoreFire = false, bool ignoreEnemies = false, bool ignorePressureProtection = false) private static float CalculateHullSafety(Hull hull, IEnumerable<Hull> visibleHulls, Character character, bool ignoreWater = false, bool ignoreOxygen = false, bool ignoreFire = false, bool ignoreEnemies = false, bool ignorePressureProtection = false)
{ {
bool isProtectedFromPressure = character.IsProtectedFromPressure;
if (!ignorePressureProtection) if (!ignorePressureProtection)
{ {
bool isProtectedFromPressure = character.IsProtectedFromPressure;
if (hull == null) { return isProtectedFromPressure ? 100 : 0; } if (hull == null) { return isProtectedFromPressure ? 100 : 0; }
if (hull.LethalPressure > 0 && !isProtectedFromPressure) { return 0; } if (hull.LethalPressure > 0 && !isProtectedFromPressure) { return 0; }
} }
else
{
if (hull == null) { return 0; }
}
// Oxygen factor should be 1 with 70% oxygen or more and 0.1 when the oxygen level is 30% or lower. // Oxygen factor should be 1 with 70% oxygen or more and 0.1 when the oxygen level is 30% or lower.
// With insufficient oxygen, the safety of the hull should be 39, all the other factors aside. So, just below the HULL_SAFETY_THRESHOLD. // With insufficient oxygen, the safety of the hull should be 39, all the other factors aside. So, just below the HULL_SAFETY_THRESHOLD.
float oxygenFactor = ignoreOxygen ? 1 : MathHelper.Lerp((HULL_SAFETY_THRESHOLD - 1) / 100, 1, MathUtils.InverseLerp(HULL_LOW_OXYGEN_PERCENTAGE, 100 - HULL_LOW_OXYGEN_PERCENTAGE, hull.OxygenPercentage)); float oxygenFactor = ignoreOxygen ? 1 : MathHelper.Lerp((HULL_SAFETY_THRESHOLD - 1) / 100, 1, MathUtils.InverseLerp(HULL_LOW_OXYGEN_PERCENTAGE, 100 - HULL_LOW_OXYGEN_PERCENTAGE, hull.OxygenPercentage));
float waterFactor = 1; float waterFactor = 1;
if (!ignoreWater) if (!ignoreWater && !isProtectedFromPressure)
{ {
if (visibleHulls != null) if (visibleHulls != null)
{ {
@@ -2694,7 +2694,7 @@ namespace Barotrauma
return false; return false;
} }
if (character == this) { return true; } if (character == this) { return true; }
if (IsKnockedDown || LockHands) { return true; } if (IsKnockedDownOrRagdolled || LockHands) { return true; }
return accessLevel switch return accessLevel switch
{ {
CharacterInventory.AccessLevel.Restricted => false, CharacterInventory.AccessLevel.Restricted => false,
@@ -774,7 +774,7 @@ namespace Barotrauma
{ {
if (eventSet.Faction != location.Faction?.Prefab.Identifier && eventSet.Faction != location.SecondaryFaction?.Prefab.Identifier) { return false; } if (eventSet.Faction != location.Faction?.Prefab.Identifier && eventSet.Faction != location.SecondaryFaction?.Prefab.Identifier) { return false; }
} }
var locationType = location.Type; var locationType = location.GetLocationTypeToDisplay();
bool includeGenericEvents = level.Type == LevelData.LevelType.LocationConnection || !locationType.IgnoreGenericEvents; bool includeGenericEvents = level.Type == LevelData.LevelType.LocationConnection || !locationType.IgnoreGenericEvents;
if (includeGenericEvents && eventSet.LocationTypeIdentifiers == null) { return true; } if (includeGenericEvents && eventSet.LocationTypeIdentifiers == null) { return true; }
return eventSet.LocationTypeIdentifiers != null && eventSet.LocationTypeIdentifiers.Any(identifier => identifier == locationType.Identifier); return eventSet.LocationTypeIdentifiers != null && eventSet.LocationTypeIdentifiers.Any(identifier => identifier == locationType.Identifier);
@@ -22,6 +22,8 @@ namespace Barotrauma
private Submarine enemySub; private Submarine enemySub;
private readonly Dictionary<HumanPrefab, List<StatusEffect>> characterStatusEffects = new Dictionary<HumanPrefab, List<StatusEffect>>();
// Update the last sighting periodically so that the players can find the pirate sub even if they have lost the track of it. // Update the last sighting periodically so that the players can find the pirate sub even if they have lost the track of it.
private readonly float pirateSightingUpdateFrequency = 30; private readonly float pirateSightingUpdateFrequency = 30;
private float pirateSightingUpdateTimer; private float pirateSightingUpdateTimer;
@@ -893,7 +893,7 @@ namespace Barotrauma
var spawnPoint = WayPoint.WayPointList.Find(wp => wp.SpawnType.HasFlag(SpawnType.Submarine) && wp.Submarine == outpost); var spawnPoint = WayPoint.WayPointList.Find(wp => wp.SpawnType.HasFlag(SpawnType.Submarine) && wp.Submarine == outpost);
if (spawnPoint != null) if (spawnPoint != null)
{ {
//pre-determine spawnpoint, just use it directly //pre-determined spawnpoint, just use it directly
sub.SetPosition(spawnPoint.WorldPosition); sub.SetPosition(spawnPoint.WorldPosition);
sub.NeutralizeBallast(); sub.NeutralizeBallast();
sub.EnableMaintainPosition(); sub.EnableMaintainPosition();
@@ -946,6 +946,14 @@ namespace Barotrauma
sub.SetPosition(spawnPos); sub.SetPosition(spawnPos);
myPort.Dock(outPostPort); myPort.Dock(outPostPort);
myPort.Lock(isNetworkMessage: true, applyEffects: false); myPort.Lock(isNetworkMessage: true, applyEffects: false);
foreach (var item in sub.GetItems(alsoFromConnectedSubs: true))
{
//need to refresh position to maintain since the sub was moved to the docking port
if (item.GetComponent<Steering>() is { MaintainPos: true } steering)
{
steering.RefreshPosToMaintain();
}
}
} }
else else
{ {
@@ -89,19 +89,10 @@ namespace Barotrauma.Items.Components
#endif #endif
if (autoPilot) if (autoPilot)
{ {
if (pathFinder == null)
{
pathFinder = new PathFinder(WayPoint.WayPointList, false)
{
GetNodePenalty = GetNodePenalty
};
}
MaintainPos = true; MaintainPos = true;
if (posToMaintain == null) if (posToMaintain == null)
{ {
posToMaintain = controlledSub != null ? RefreshPosToMaintain();
controlledSub.WorldPosition :
item.Submarine == null ? item.WorldPosition : item.Submarine.WorldPosition;
} }
} }
else else
@@ -266,6 +257,24 @@ namespace Barotrauma.Items.Components
return true; return true;
} }
/// <summary>
/// Sets the position the autopilot tries to maintain to the current position of the sub.
/// </summary>
public void RefreshPosToMaintain()
{
posToMaintain = controlledSub != null ?
controlledSub.WorldPosition :
item.Submarine == null ? item.WorldPosition : item.Submarine.WorldPosition;
}
public override void OnMapLoaded()
{
if (MaintainPos)
{
RefreshPosToMaintain();
}
}
public override void Update(float deltaTime, Camera cam) public override void Update(float deltaTime, Camera cam)
{ {
if (!searchedConnectedDockingPort) if (!searchedConnectedDockingPort)
@@ -628,7 +637,10 @@ namespace Barotrauma.Items.Components
if (pathFinder == null) if (pathFinder == null)
{ {
pathFinder = new PathFinder(WayPoint.WayPointList, false); pathFinder = new PathFinder(WayPoint.WayPointList, false)
{
GetNodePenalty = GetNodePenalty
};
} }
Vector2 target; Vector2 target;
@@ -397,6 +397,9 @@ namespace Barotrauma.Items.Components
if (Item.Removed) { return; } if (Item.Removed) { return; }
launchPos = simPosition; launchPos = simPosition;
LaunchSub = item.Submarine; LaunchSub = item.Submarine;
//set the rotation of the projectile again because dropping the projectile in Use
//resets the rotation and moves it to the position of the parent item
Item.SetTransform(simPosition, rotation + (Item.body.Dir * LaunchRotationRadians), findNewHull: false);
if (DeactivationTime > 0) if (DeactivationTime > 0)
{ {
deactivationTimer = DeactivationTime; deactivationTimer = DeactivationTime;
@@ -312,8 +312,7 @@ namespace Barotrauma.Items.Components
(IsActiveConditionals == null || IsActiveConditionals.Count == 0)) (IsActiveConditionals == null || IsActiveConditionals.Count == 0))
{ {
PhysicsBody body = ParentBody ?? item.body; PhysicsBody body = ParentBody ?? item.body;
if ((body == null || !body.Enabled) && if ((body == null || !body.Enabled) && !IsVisibleInInventory())
(item.FindParentInventory(static it => it is ItemInventory { Container.HideItems: true }) != null))
{ {
lightBrightness = 0.0f; lightBrightness = 0.0f;
SetLightSourceState(false, 0.0f); SetLightSourceState(false, 0.0f);
@@ -336,6 +335,24 @@ namespace Barotrauma.Items.Components
} }
} }
/// <summary>
/// Is the item currently in an inventory, and visible in that inventory? E.g. held by a character or on a shelf that shows the contained items.
/// </summary>
/// <returns></returns>
private bool IsVisibleInInventory()
{
if (item.GetRootInventoryOwner() is Character ownerCharacter && item.RootContainer?.GetComponent<Holdable>() is not { IsActive: true })
{
//if the item is in a character inventory, the light should only be visible if the character is holding the item
//(not if it's e.q. inside a wearable item, or in a rifle worn on the back)
return false;
}
else
{
return item.FindParentInventory(static it => it is ItemInventory { Container.HideItems: true }) == null;
}
}
public override void Update(float deltaTime, Camera cam) public override void Update(float deltaTime, Camera cam)
{ {
if (item.AiTarget != null) if (item.AiTarget != null)
@@ -351,20 +368,10 @@ namespace Barotrauma.Items.Components
#endif #endif
bool visibleInContainer; bool isVisibleInInventory = IsVisibleInInventory();
var ownerCharacter = item.GetRootInventoryOwner() as Character; var ownerCharacter = item.GetRootInventoryOwner() as Character;
if (ownerCharacter != null && item.RootContainer?.GetComponent<Holdable>() is not { IsActive: true })
{
//if the item is in a character inventory, the light should only be visible if the character is holding the item
//(not if it's e.q. inside a wearable item, or in a rifle worn on the back)
visibleInContainer = false;
}
else
{
visibleInContainer = item.FindParentInventory(static it => it is ItemInventory { Container.HideItems: true }) == null;
}
if ((item.Container != null && !visibleInContainer && ownerCharacter == null) || if ((item.Container != null && !isVisibleInInventory && ownerCharacter == null) ||
(ownerCharacter != null && ownerCharacter.InvisibleTimer > 0.0f)) (ownerCharacter != null && ownerCharacter.InvisibleTimer > 0.0f))
{ {
lightBrightness = 0.0f; lightBrightness = 0.0f;
@@ -374,7 +381,7 @@ namespace Barotrauma.Items.Components
SetLightSourceTransformProjSpecific(); SetLightSourceTransformProjSpecific();
PhysicsBody body = ParentBody ?? item.body; PhysicsBody body = ParentBody ?? item.body;
if ((body == null || !body.Enabled) && !visibleInContainer) if ((body == null || !body.Enabled) && !isVisibleInInventory)
{ {
lightBrightness = 0.0f; lightBrightness = 0.0f;
SetLightSourceState(false, 0.0f); SetLightSourceState(false, 0.0f);
+17
View File
@@ -1,4 +1,21 @@
------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------
v1.8.7.0
-------------------------------------------------------------------------------------------------------------------------------------------------
- Fixed an AI bug that made bots scared of water, making them seek safety from flooded rooms even when they were wearing diving suits.
- Fixed non-hitscan projectiles registering hits with characters that are behind the weapon, even if the barrel is in front of the character.
- Fixed submarine maintaining an incorrect position (= starting to steer somewhere completely off) when you enable "maintain position" and then enter a new level.
- Fixed autopilot failing to navigate to a destination if it's already on at the start of the round.
- Fixed dedicated server descriptions still sometimes getting truncated.
- Fixed lights shining out from items inside character inventories.
- Fixed inability to access the inventories of other players when they're manually ragdolling.
- Fixed "firing blanks" traitor event requiring you to replace standard coilgun ammo boxes with fake ones, instead of accepting any type of coilgun ammo.
- Fixed switches flipping around when you attach them while facing left.
- Fixed grenade "cooking" hint not showing the correct keybinding (just saying [usekey] instead of the actual keybinding).
- Fixed main menu notifications (changelog, unstable info) staying open if you don't manually close them and e.g. start a new game or go to the sub editor.
- Fixed normal outpost events triggering in outpost that have been abandoned because of Jovian Radiation.
-------------------------------------------------------------------------------------------------------------------------------------------------
v1.8.6.2 v1.8.6.2
------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------