Build 0.17.15.0

This commit is contained in:
Markus Isberg
2022-04-27 23:32:17 +09:00
parent 6e38444fc4
commit 15d18e6ff6
19 changed files with 91 additions and 43 deletions
@@ -56,10 +56,9 @@ namespace Barotrauma.Items.Components
ContentXElement spriteElement = limbElement.GetChildElement("sprite"); ContentXElement spriteElement = limbElement.GetChildElement("sprite");
if (spriteElement == null) { continue; } if (spriteElement == null) { continue; }
string spritePath = spriteElement.GetAttribute("texture").Value; ContentPath contentPath = spriteElement.GetAttributeContentPath("texture");
spritePath = characterInfo.ReplaceVars(spritePath);
string spritePath = characterInfo.ReplaceVars(contentPath.Value);
string fileName = Path.GetFileNameWithoutExtension(spritePath); string fileName = Path.GetFileNameWithoutExtension(spritePath);
//go through the files in the directory to find a matching sprite //go through the files in the directory to find a matching sprite
@@ -40,7 +40,7 @@ namespace Barotrauma
visibleSubs.Clear(); visibleSubs.Clear();
foreach (Submarine sub in Loaded) foreach (Submarine sub in Loaded)
{ {
if (sub.WorldPosition.Y < Level.MaxEntityDepth) { continue; } if (Level.Loaded != null && sub.WorldPosition.Y < Level.MaxEntityDepth) { continue; }
int margin = 500; int margin = 500;
Rectangle worldBorders = new Rectangle( Rectangle worldBorders = new Rectangle(
@@ -807,7 +807,7 @@ namespace Barotrauma
float balanceContainerWidth = GameMain.IsSingleplayer ? 1 : 1 / 3f; float balanceContainerWidth = GameMain.IsSingleplayer ? 1 : 1 / 3f;
var rt = new RectTransform(new Vector2(balanceContainerWidth, 1.0f), parent.RectTransform) var rt = new RectTransform(new Vector2(balanceContainerWidth, 1.0f), parent.RectTransform)
{ {
MaxSize = new Point(120, int.MaxValue) MaxSize = new Point(GUI.IntScale(GUI.AdjustForTextScale(120)), int.MaxValue)
}; };
var balanceContainer = new GUILayoutGroup(rt, childAnchor: Anchor.TopRight) var balanceContainer = new GUILayoutGroup(rt, childAnchor: Anchor.TopRight)
{ {
@@ -73,11 +73,11 @@ namespace Barotrauma.Steam
{ {
if (!SteamManager.IsInitialized) { return; } if (!SteamManager.IsInitialized) { return; }
uint numSubscribedMods = Steamworks.SteamUGC.NumSubscribedItems; uint numSubscribedMods = SteamManager.GetNumSubscribedItems();
if (numSubscribedMods == memSubscribedModCount) { return; } if (numSubscribedMods == memSubscribedModCount) { return; }
memSubscribedModCount = numSubscribedMods; memSubscribedModCount = numSubscribedMods;
var subscribedIds = Steamworks.SteamUGC.GetSubscribedItems().ToHashSet(); var subscribedIds = SteamManager.GetSubscribedItems().ToHashSet();
var installedIds = ContentPackageManager.WorkshopPackages.Select(p => p.SteamWorkshopId).ToHashSet(); var installedIds = ContentPackageManager.WorkshopPackages.Select(p => p.SteamWorkshopId).ToHashSet();
foreach (var id in subscribedIds.Where(id2 => !installedIds.Contains(id2))) foreach (var id in subscribedIds.Where(id2 => !installedIds.Contains(id2)))
{ {
@@ -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>0.17.14.0</Version> <Version>0.17.15.0</Version>
<Copyright>Copyright © FakeFish 2018-2022</Copyright> <Copyright>Copyright © FakeFish 2018-2022</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>0.17.14.0</Version> <Version>0.17.15.0</Version>
<Copyright>Copyright © FakeFish 2018-2022</Copyright> <Copyright>Copyright © FakeFish 2018-2022</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>0.17.14.0</Version> <Version>0.17.15.0</Version>
<Copyright>Copyright © FakeFish 2018-2022</Copyright> <Copyright>Copyright © FakeFish 2018-2022</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>0.17.14.0</Version> <Version>0.17.15.0</Version>
<Copyright>Copyright © FakeFish 2018-2022</Copyright> <Copyright>Copyright © FakeFish 2018-2022</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>0.17.14.0</Version> <Version>0.17.15.0</Version>
<Copyright>Copyright © FakeFish 2018-2022</Copyright> <Copyright>Copyright © FakeFish 2018-2022</Copyright>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<AssemblyName>DedicatedServer</AssemblyName> <AssemblyName>DedicatedServer</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>0.17.14.0</Version> <Version>0.17.15.0</Version>
<Copyright>Copyright © FakeFish 2018-2022</Copyright> <Copyright>Copyright © FakeFish 2018-2022</Copyright>
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
<AssemblyName>DedicatedServer</AssemblyName> <AssemblyName>DedicatedServer</AssemblyName>
@@ -57,8 +57,6 @@ namespace Barotrauma
private readonly int speakerIndex; private readonly int speakerIndex;
private readonly ImmutableHashSet<Identifier> allowedSpeakerTags; private readonly ImmutableHashSet<Identifier> allowedSpeakerTags;
private readonly bool requireNextLine; private readonly bool requireNextLine;
// used primarily for team1 characters interacting with escorted personnel (TODO: not used anywhere)
private readonly bool requireSight;
public NPCConversation(XElement element) public NPCConversation(XElement element)
{ {
@@ -75,7 +73,6 @@ namespace Barotrauma
Responses = element.Elements().Select(s => new NPCConversation(s)).ToImmutableArray(); Responses = element.Elements().Select(s => new NPCConversation(s)).ToImmutableArray();
requireNextLine = element.GetAttributeBool("requirenextline", false); requireNextLine = element.GetAttributeBool("requirenextline", false);
requireSight = element.GetAttributeBool("requiresight", false);
} }
private static List<Identifier> GetCurrentFlags(Character speaker) private static List<Identifier> GetCurrentFlags(Character speaker)
@@ -162,23 +159,38 @@ namespace Barotrauma
return currentFlags; return currentFlags;
} }
private static List<NPCConversation> previousConversations = new List<NPCConversation>(); private static readonly List<NPCConversation> previousConversations = new List<NPCConversation>();
public static List<Pair<Character, string>> CreateRandom(List<Character> availableSpeakers) public static List<(Character speaker, string line)> CreateRandom(List<Character> availableSpeakers)
{ {
Dictionary<int, Character> assignedSpeakers = new Dictionary<int, Character>(); Dictionary<int, Character> assignedSpeakers = new Dictionary<int, Character>();
List<Pair<Character, string>> lines = new List<Pair<Character, string>>(); List<(Character speaker, string line)> lines = new List<(Character speaker, string line)>();
var language = GameSettings.CurrentConfig.Language;
if (language != TextManager.DefaultLanguage && !NPCConversationCollection.Collections.ContainsKey(language))
{
DebugConsole.AddWarning($"Could not find NPC conversations for the language \"{language}\". Using \"{TextManager.DefaultLanguage}\" instead..");
language = TextManager.DefaultLanguage;
}
CreateConversation(availableSpeakers, assignedSpeakers, null, lines, CreateConversation(availableSpeakers, assignedSpeakers, null, lines,
availableConversations: NPCConversationCollection.Collections[GameSettings.CurrentConfig.Language].SelectMany(cc => cc.Conversations).ToList()); availableConversations: NPCConversationCollection.Collections[language].SelectMany(cc => cc.Conversations).ToList());
return lines; return lines;
} }
public static List<Pair<Character, string>> CreateRandom(List<Character> availableSpeakers, IEnumerable<Identifier> requiredFlags) public static List<(Character speaker, string line)> CreateRandom(List<Character> availableSpeakers, IEnumerable<Identifier> requiredFlags)
{ {
Dictionary<int, Character> assignedSpeakers = new Dictionary<int, Character>(); Dictionary<int, Character> assignedSpeakers = new Dictionary<int, Character>();
List<Pair<Character, string>> lines = new List<Pair<Character, string>>(); List<(Character speaker, string line)> lines = new List<(Character speaker, string line)>();
var availableConversations = NPCConversationCollection.Collections[GameSettings.CurrentConfig.Language]
var language = GameSettings.CurrentConfig.Language;
if (language != TextManager.DefaultLanguage && !NPCConversationCollection.Collections.ContainsKey(language))
{
DebugConsole.AddWarning($"Could not find NPC conversations for the language \"{language}\". Using \"{TextManager.DefaultLanguage}\" instead..");
language = TextManager.DefaultLanguage;
}
var availableConversations = NPCConversationCollection.Collections[language]
.SelectMany(cc => cc.Conversations.Where(c => requiredFlags.All(f => c.Flags.Contains(f)))).ToList(); .SelectMany(cc => cc.Conversations.Where(c => requiredFlags.All(f => c.Flags.Contains(f)))).ToList();
if (availableConversations.Count > 0) if (availableConversations.Count > 0)
{ {
@@ -191,7 +203,7 @@ namespace Barotrauma
List<Character> availableSpeakers, List<Character> availableSpeakers,
Dictionary<int, Character> assignedSpeakers, Dictionary<int, Character> assignedSpeakers,
NPCConversation baseConversation, NPCConversation baseConversation,
IList<Pair<Character, string>> lineList, IList<(Character speaker, string line)> lineList,
IList<NPCConversation> availableConversations, IList<NPCConversation> availableConversations,
bool ignoreFlags = false) bool ignoreFlags = false)
{ {
@@ -271,7 +283,7 @@ namespace Barotrauma
previousConversations.Insert(0, selectedConversation); previousConversations.Insert(0, selectedConversation);
if (previousConversations.Count > MaxPreviousConversations) previousConversations.RemoveAt(MaxPreviousConversations); if (previousConversations.Count > MaxPreviousConversations) previousConversations.RemoveAt(MaxPreviousConversations);
} }
lineList.Add(new Pair<Character, string>(speaker, selectedConversation.Line)); lineList.Add((speaker, selectedConversation.Line));
CreateConversation(availableSpeakers, assignedSpeakers, selectedConversation, lineList, availableConversations); CreateConversation(availableSpeakers, assignedSpeakers, selectedConversation, lineList, availableConversations);
} }
@@ -2729,12 +2729,15 @@ namespace Barotrauma
if (!Enabled) { return; } if (!Enabled) { return; }
if (Level.Loaded != null && WorldPosition.Y < Level.MaxEntityDepth || if (Level.Loaded != null)
(Submarine != null && Submarine.WorldPosition.Y < Level.MaxEntityDepth))
{ {
Enabled = false; if (WorldPosition.Y < Level.MaxEntityDepth ||
Kill(CauseOfDeathType.Pressure, null); (Submarine != null && Submarine.WorldPosition.Y < Level.MaxEntityDepth))
return; {
Enabled = false;
Kill(CauseOfDeathType.Pressure, null);
return;
}
} }
ApplyStatusEffects(ActionType.Always, deltaTime); ApplyStatusEffects(ActionType.Always, deltaTime);
@@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Xml.Linq; using System.Xml.Linq;
namespace Barotrauma namespace Barotrauma
@@ -12,7 +11,7 @@ namespace Barotrauma
public readonly List<string> AllowedDialogTags; public readonly List<string> AllowedDialogTags;
private float commonness; private readonly float commonness;
public float Commonness public float Commonness
{ {
get { return commonness; } get { return commonness; }
@@ -20,12 +19,22 @@ namespace Barotrauma
public static IEnumerable<NPCPersonalityTrait> GetAll(LanguageIdentifier language) public static IEnumerable<NPCPersonalityTrait> GetAll(LanguageIdentifier language)
{ {
if (language != TextManager.DefaultLanguage && !NPCConversationCollection.Collections.ContainsKey(language))
{
DebugConsole.AddWarning($"Could not find NPC personality traits for the language \"{language}\". Using \"{TextManager.DefaultLanguage}\" instead..");
language = TextManager.DefaultLanguage;
}
return NPCConversationCollection.Collections[language] return NPCConversationCollection.Collections[language]
.SelectMany(cc => cc.PersonalityTraits.Values); .SelectMany(cc => cc.PersonalityTraits.Values);
} }
public static NPCPersonalityTrait Get(LanguageIdentifier language, Identifier traitName) public static NPCPersonalityTrait Get(LanguageIdentifier language, Identifier traitName)
{ {
if (language != TextManager.DefaultLanguage && !NPCConversationCollection.Collections.ContainsKey(language))
{
DebugConsole.AddWarning($"Could not find NPC personality traits for the language \"{language}\". Using \"{TextManager.DefaultLanguage}\" instead..");
language = TextManager.DefaultLanguage;
}
return NPCConversationCollection.Collections[language] return NPCConversationCollection.Collections[language]
.FirstOrDefault(cc => cc.PersonalityTraits.ContainsKey(traitName)) .FirstOrDefault(cc => cc.PersonalityTraits.ContainsKey(traitName))
.PersonalityTraits[traitName]; .PersonalityTraits[traitName];
@@ -13,7 +13,7 @@ namespace Barotrauma
const float ConversationIntervalMax = 180.0f; const float ConversationIntervalMax = 180.0f;
const float ConversationIntervalMultiplierMultiplayer = 5.0f; const float ConversationIntervalMultiplierMultiplayer = 5.0f;
private float conversationTimer, conversationLineTimer; private float conversationTimer, conversationLineTimer;
private readonly List<Pair<Character, string>> pendingConversationLines = new List<Pair<Character, string>>(); private readonly List<(Character speaker, string line)> pendingConversationLines = new List<(Character speaker, string line)>();
public const int MaxCrewSize = 16; public const int MaxCrewSize = 16;
@@ -339,7 +339,7 @@ namespace Barotrauma
#region Dialog #region Dialog
public void AddConversation(List<Pair<Character, string>> conversationLines) public void AddConversation(List<(Character speaker, string line)> conversationLines)
{ {
if (conversationLines == null || conversationLines.Count == 0) { return; } if (conversationLines == null || conversationLines.Count == 0) { return; }
pendingConversationLines.AddRange(conversationLines); pendingConversationLines.AddRange(conversationLines);
@@ -428,16 +428,16 @@ namespace Barotrauma
if (conversationLineTimer <= 0.0f) if (conversationLineTimer <= 0.0f)
{ {
//speaker of the next line can't speak, interrupt the conversation //speaker of the next line can't speak, interrupt the conversation
if (pendingConversationLines[0].First.SpeechImpediment >= 100.0f) if (pendingConversationLines[0].speaker.SpeechImpediment >= 100.0f)
{ {
pendingConversationLines.Clear(); pendingConversationLines.Clear();
return; return;
} }
pendingConversationLines[0].First.Speak(pendingConversationLines[0].Second, null); pendingConversationLines[0].speaker.Speak(pendingConversationLines[0].line, null);
if (pendingConversationLines.Count > 1) if (pendingConversationLines.Count > 1)
{ {
conversationLineTimer = MathHelper.Clamp(pendingConversationLines[0].Second.Length * 0.1f, 1.0f, 5.0f); conversationLineTimer = MathHelper.Clamp(pendingConversationLines[0].line.Length * 0.1f, 1.0f, 5.0f);
} }
pendingConversationLines.RemoveAt(0); pendingConversationLines.RemoveAt(0);
} }
@@ -1789,7 +1789,7 @@ namespace Barotrauma
if (Math.Abs(body.LinearVelocity.X) > 0.01f || Math.Abs(body.LinearVelocity.Y) > 0.01f || transformDirty) if (Math.Abs(body.LinearVelocity.X) > 0.01f || Math.Abs(body.LinearVelocity.Y) > 0.01f || transformDirty)
{ {
UpdateTransform(); UpdateTransform();
if (CurrentHull == null && body.SimPosition.Y < ConvertUnits.ToSimUnits(Level.MaxEntityDepth)) if (CurrentHull == null && Level.Loaded != null && body.SimPosition.Y < ConvertUnits.ToSimUnits(Level.MaxEntityDepth))
{ {
Spawner?.AddItemToRemoveQueue(this); Spawner?.AddItemToRemoveQueue(this);
return; return;
@@ -8,10 +8,7 @@ using Microsoft.Xna.Framework;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Xml.Linq;
using Barotrauma.IO;
using Voronoi2; using Voronoi2;
namespace Barotrauma namespace Barotrauma
@@ -25,7 +22,7 @@ namespace Barotrauma
} }
//all entities are disabled after they reach this depth //all entities are disabled after they reach this depth
public const int MaxEntityDepth = -300000; public const int MaxEntityDepth = -1000000;
public const float ShaftHeight = 1000.0f; public const float ShaftHeight = 1000.0f;
/// <summary> /// <summary>
/// The level generator won't try to adjust the width of the main path above this limit. /// The level generator won't try to adjust the width of the main path above this limit.
@@ -1,3 +1,4 @@
using Steamworks.Data;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -74,6 +75,24 @@ namespace Barotrauma.Steam
return Steamworks.SteamClient.Name; return Steamworks.SteamClient.Name;
} }
public static uint GetNumSubscribedItems()
{
if (!IsInitialized || !Steamworks.SteamClient.IsValid)
{
return 0;
}
return Steamworks.SteamUGC.NumSubscribedItems;
}
public static PublishedFileId[] GetSubscribedItems()
{
if (!IsInitialized || !Steamworks.SteamClient.IsValid)
{
return new PublishedFileId[0];
}
return Steamworks.SteamUGC.GetSubscribedItems();
}
public static bool UnlockAchievement(string achievementIdentifier) => public static bool UnlockAchievement(string achievementIdentifier) =>
UnlockAchievement(achievementIdentifier.ToIdentifier()); UnlockAchievement(achievementIdentifier.ToIdentifier());
@@ -80,7 +80,7 @@ namespace Barotrauma
#if DEBUG #if DEBUG
if (!lStr.IsNullOrEmpty() && lStr.Contains("‖")) if (!lStr.IsNullOrEmpty() && lStr.Contains("‖"))
{ {
if (Debugger.IsAttached) { Debugger.Break(); } //if (Debugger.IsAttached) { Debugger.Break(); }
} }
#endif #endif
return Plain(lStr ?? string.Empty); return Plain(lStr ?? string.Empty);
@@ -1,3 +1,12 @@
---------------------------------------------------------------------------------------------------------
v0.17.15.0
---------------------------------------------------------------------------------------------------------
Fixes:
- Fixed crashing if a custom language doesn't configure NPC personality traits or conversations.
- Fixed crashing when you try to disguise as someone else when using a mod that overrides the vanilla human config.
- Fixed characters getting instakilled if you dive too deep in the sub editor test mode.
--------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------
v0.17.14.0 v0.17.14.0
--------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------