rebase to origin/unstable-tests

This commit is contained in:
Oiltanker
2022-04-19 22:39:05 +03:00
18 changed files with 199 additions and 60 deletions
@@ -312,7 +312,7 @@ namespace Barotrauma
public void DrawForeground(SpriteBatch spriteBatch) public void DrawForeground(SpriteBatch spriteBatch)
{ {
if (Character is null || GameMain.IsSingleplayer) { return; } if (Character is null || !(GameMain.GameSession?.Campaign is MultiPlayerCampaign)) { return; }
const int million = 1000000; const int million = 1000000;
int xfraction = (int)(HUDLayoutSettings.BottomRightInfoArea.Width * 0.2f); int xfraction = (int)(HUDLayoutSettings.BottomRightInfoArea.Width * 0.2f);
int yoffset = GUI.IntScale(6); int yoffset = GUI.IntScale(6);
@@ -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.10.0</Version> <Version>0.17.11.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.10.0</Version> <Version>0.17.11.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.10.0</Version> <Version>0.17.11.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.10.0</Version> <Version>0.17.11.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.10.0</Version> <Version>0.17.11.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.10.0</Version> <Version>0.17.11.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>
+94 -31
View File
@@ -1,5 +1,9 @@
local allPackages = ContentPackageManager.AllPackages local LUA_MOD_REQUIRE_PATH = "/Lua/?.lua"
local localPackages = ContentPackageManager.LocalPackages local LUA_MOD_AUTORUN_PATH = "/Lua/Autorun"
local LUA_MOD_FORCEDAUTORUN_PATH = "/Lua/ForcedAutorun"
local allPackages = ContentPackageManager.AllPackages
local localPackages = ContentPackageManager.LocalPackages
local enabledPackages = ContentPackageManager.EnabledPackages.All local enabledPackages = ContentPackageManager.EnabledPackages.All
local function EndsWith(str, suffix) local function EndsWith(str, suffix)
@@ -30,52 +34,111 @@ local function RunFolder(folder, rootFolder, package)
end end
end end
local function assertTypes(expectedTypes, ...)
local args = table.pack(...)
assert(
#args == #expectedTypes,
string.format(
"Assertion failed: incorrect number of args\n\texpected = %s\n\tgot = %s",
#expectedTypes,
#args
)
)
for i = 1, #args do
local arg = args[i]
local expectedType = expectedTypes[i]
assert(
type(arg) == expectedType,
string.format(
"Assertion failed: incorrect argument type (arg #%d)\n\texpected = %s\n\tgot = %s",
i,
expectedType,
type(arg)
)
)
end
end
for contentPackage in enabledPackages do local function ExecutionQueue()
if contentPackage then local queue = {}
local d = contentPackage.Path:gsub("\\", "/") local function processQueueFIFO()
d = d:gsub("/filelist.xml", "") while queue[1] ~= nil do
RunFolder(
table.unpack(
table.remove(queue)
)
)
end
end
local function queueExecutionFIFO(...)
assertTypes(
{ 'string', 'string', 'userdata' },
...
)
table.insert(
queue,
table.pack(...)
)
end
return queueExecutionFIFO, processQueueFIFO
end
table.insert(package.path, (d .. "/Lua/?.lua")) local queueAutorun, processAutorun = ExecutionQueue()
local queueForcedAutorun, processForcedAutorun = ExecutionQueue()
if File.DirectoryExists(d .. "/Lua/Autorun") then local function processPackages(packages, fn)
RunFolder(d .. "/Lua/Autorun", d, contentPackage) for pkg in packages do
if pkg then
local pkgPath = pkg.Path
:gsub("\\", "/")
:gsub("/filelist.xml", "")
fn(pkg, pkgPath)
end end
end end
end end
processPackages(
enabledPackages,
function(pkg, pkgPath)
table.insert(package.path, pkgPath .. LUA_MOD_REQUIRE_PATH)
local autorunPath = pkgPath .. LUA_MOD_AUTORUN_PATH
if File.DirectoryExists(autorunPath) then
queueAutorun(autorunPath, pkgPath, pkg)
end
end
)
-- we don't want to execute workshop ForcedAutorun if we have a local Package -- we don't want to execute workshop ForcedAutorun if we have a local Package
local executedLocalPackages = {} local executedLocalPackages = {}
for contentPackage in localPackages do processPackages(
if contentPackage then localPackages,
local d = contentPackage.Path:gsub("\\", "/") function(pkg, pkgPath)
d = d:gsub("/filelist.xml", "") table.insert(package.path, pkgPath .. LUA_MOD_REQUIRE_PATH)
local forcedAutorunPath = pkgPath .. LUA_MOD_FORCEDAUTORUN_PATH
table.insert(package.path, (d .. "/Lua/?.lua")) if File.DirectoryExists(forcedAutorunPath) then
queueForcedAutorun(forcedAutorunPath, pkgPath, pkg)
if File.DirectoryExists(d .. "/Lua/ForcedAutorun") then executedLocalPackages[pkg.Name] = true
RunFolder(d .. "/Lua/ForcedAutorun", d, contentPackage)
executedLocalPackages[contentPackage.Name] = true
end end
end end
end )
for contentPackage in allPackages do processPackages(
if contentPackage and executedLocalPackages[contentPackage.Name] == nil then allPackages,
local d = contentPackage.Path:gsub("\\", "/") function(pkg, pkgPath)
d = d:gsub("/filelist.xml", "") if not executedLocalPackages[pkg.Name] then
table.insert(package.path, pkgPath .. LUA_MOD_REQUIRE_PATH)
table.insert(package.path, (d .. "/Lua/?.lua")) local forcedAutorunPath = pkgPath .. LUA_MOD_FORCEDAUTORUN_PATH
if File.DirectoryExists(forcedAutorunPath) then
if File.DirectoryExists(d .. "/Lua/ForcedAutorun") then queueForcedAutorun(forcedAutorunPath, pkgPath, pkg)
RunFolder(d .. "/Lua/ForcedAutorun", d, contentPackage) end
end end
end end
end )
setmodulepaths(package.path) setmodulepaths(package.path)
processAutorun()
processForcedAutorun()
Hook.Add("stop", "luaSetup.stop", function () Hook.Add("stop", "luaSetup.stop", function ()
print("Stopping Lua...") print("Stopping Lua...")
@@ -341,7 +341,7 @@ namespace Barotrauma
if (levelData.HasBeaconStation && !levelData.IsBeaconActive) if (levelData.HasBeaconStation && !levelData.IsBeaconActive)
{ {
var beaconMissionPrefabs = MissionPrefab.Prefabs.Where(m => m.Tags.Any(t => t.Equals("beaconnoreward", StringComparison.OrdinalIgnoreCase))); var beaconMissionPrefabs = MissionPrefab.Prefabs.Where(m => m.Tags.Any(t => t.Equals("beaconnoreward", StringComparison.OrdinalIgnoreCase))).OrderBy(m => m.UintIdentifier);
if (beaconMissionPrefabs.Any()) if (beaconMissionPrefabs.Any())
{ {
Random rand = new MTRandom(ToolBox.StringToInt(levelData.Seed)); Random rand = new MTRandom(ToolBox.StringToInt(levelData.Seed));
@@ -354,7 +354,7 @@ namespace Barotrauma
} }
if (levelData.HasHuntingGrounds) if (levelData.HasHuntingGrounds)
{ {
var huntingGroundsMissionPrefabs = MissionPrefab.Prefabs.Where(m => m.Tags.Any(t => t.Equals("huntinggrounds", StringComparison.OrdinalIgnoreCase))); var huntingGroundsMissionPrefabs = MissionPrefab.Prefabs.Where(m => m.Tags.Any(t => t.Equals("huntinggrounds", StringComparison.OrdinalIgnoreCase))).OrderBy(m => m.UintIdentifier);
if (!huntingGroundsMissionPrefabs.Any()) if (!huntingGroundsMissionPrefabs.Any())
{ {
DebugConsole.AddWarning("Could not find a hunting grounds mission for the level. No mission with the tag \"huntinggrounds\" found."); DebugConsole.AddWarning("Could not find a hunting grounds mission for the level. No mission with the tag \"huntinggrounds\" found.");
@@ -397,11 +397,6 @@ namespace Barotrauma.Items.Components
//Only add valid connections //Only add valid connections
if (otherC.Grid != grid && (otherC.Grid == null || !Grids.ContainsKey(otherC.Grid.ID)) && ValidPowerConnection(c, otherC)) if (otherC.Grid != grid && (otherC.Grid == null || !Grids.ContainsKey(otherC.Grid.ID)) && ValidPowerConnection(c, otherC))
{ {
if (otherC.Item.Condition <= 0.0f)
{
continue;
}
otherC.Grid = grid; //Assigning ID early prevents unncessary adding to stack otherC.Grid = grid; //Assigning ID early prevents unncessary adding to stack
probeStack.Push(otherC); probeStack.Push(otherC);
} }
@@ -665,7 +660,10 @@ namespace Barotrauma.Items.Components
public static bool ValidPowerConnection(Connection conn1, Connection conn2) public static bool ValidPowerConnection(Connection conn1, Connection conn2)
{ {
return conn1.IsPower && conn2.IsPower && (conn1.Item.HasTag("junctionbox") || conn2.Item.HasTag("junctionbox") || conn1.Item.HasTag("dock") || conn2.Item.HasTag("dock") || conn1.IsOutput != conn2.IsOutput); return
conn1.IsPower && conn2.IsPower &&
conn1.Item.Condition > 0.0f && conn2.Item.Condition > 0.0f &&
(conn1.Item.HasTag("junctionbox") || conn2.Item.HasTag("junctionbox") || conn1.Item.HasTag("dock") || conn2.Item.HasTag("dock") || conn1.IsOutput != conn2.IsOutput);
} }
/// <summary> /// <summary>
@@ -141,7 +141,7 @@ namespace Barotrauma.Items.Components
ApplyStatusEffects(ActionType.OnActive, deltaTime, null); ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
if (Voltage > OverloadVoltage && CanBeOverloaded) if (Voltage > OverloadVoltage && CanBeOverloaded && item.Repairables.Any())
{ {
item.Condition = 0.0f; item.Condition = 0.0f;
} }
@@ -957,7 +957,18 @@ namespace Barotrauma
public PriceInfo GetPriceInfo(Location.StoreInfo store) public PriceInfo GetPriceInfo(Location.StoreInfo store)
{ {
if (!store.Identifier.IsEmpty && StorePrices != null && StorePrices.TryGetValue(store.Identifier, out var storePriceInfo)) if (store == null)
{
string message = $"Tried to get price info for \"{Identifier}\" with a null store parameter!\n{Environment.StackTrace.CleanupStackTrace()}";
#if DEBUG
DebugConsole.ShowError(message);
#else
DebugConsole.AddWarning(message);
GameAnalyticsManager.AddErrorEventOnce("ItemPrefab.GetPriceInfo:StoreParameterNull", GameAnalyticsManager.ErrorSeverity.Error, message);
#endif
return null;
}
else if (!store.Identifier.IsEmpty && StorePrices != null && StorePrices.TryGetValue(store.Identifier, out var storePriceInfo))
{ {
return storePriceInfo; return storePriceInfo;
} }
@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using MoonSharp.Interpreter;
namespace Barotrauma
{
class LuaRequire {
private Script lua { get; set; }
private Dictionary<Tuple<string, Table>, DynValue> LoadedModules { get; set; }
private bool GetExistingReturnValue(Tuple<string, Table> key, ref DynValue returnValue) {
return LoadedModules.TryGetValue(key, out returnValue);
}
private void ExecuteModule(Tuple<string, Table> key, ref DynValue returnValue) {
string moduleName = key.Item1;
Table globalContext = key.Item2;
returnValue = lua.Call(lua.RequireModule(moduleName, globalContext));
LoadedModules[key] = returnValue;
}
// Lua modules that have been previously loaded by require() will
// not be loaded again; instead, their initial return value is
// preserved and returned again on subsequent attempts.
public DynValue Require(string moduleName, Table globalContext) {
DynValue returnValue = DynValue.Nil;
var key = new Tuple<string, Table>(moduleName, globalContext);
if (GetExistingReturnValue(key, ref returnValue)) return returnValue;
ExecuteModule(key, ref returnValue);
return returnValue;
}
public LuaRequire(Script lua) {
this.lua = lua;
LoadedModules = new Dictionary<Tuple<string, Table>, DynValue>();
}
}
}
@@ -46,6 +46,7 @@ namespace Barotrauma
public LuaCsHook Hook { get; private set; } public LuaCsHook Hook { get; private set; }
public LuaCsNetworking Networking { get; private set; } public LuaCsNetworking Networking { get; private set; }
public LuaCsModStore ModStore { get; private set; } public LuaCsModStore ModStore { get; private set; }
private LuaRequire require { get; set; }
public CsScriptLoader CsScriptLoader { get; private set; } public CsScriptLoader CsScriptLoader { get; private set; }
public CsLua Lua { get; private set; } public CsLua Lua { get; private set; }
@@ -71,9 +72,9 @@ namespace Barotrauma
} }
public static ContentPackage GetPackage(Identifier name) public static ContentPackage GetPackage(Identifier name, bool fallbackToAll = true)
{ {
foreach (ContentPackage package in ContentPackageManager.LocalPackages) foreach (ContentPackage package in ContentPackageManager.EnabledPackages.All)
{ {
if (package.NameMatches(name)) if (package.NameMatches(name))
{ {
@@ -81,11 +82,22 @@ namespace Barotrauma
} }
} }
foreach (ContentPackage package in ContentPackageManager.AllPackages) if (fallbackToAll)
{ {
if (package.NameMatches(name)) foreach (ContentPackage package in ContentPackageManager.LocalPackages)
{ {
return package; if (package.NameMatches(name))
{
return package;
}
}
foreach (ContentPackage package in ContentPackageManager.AllPackages)
{
if (package.NameMatches(name))
{
return package;
}
} }
} }
@@ -264,22 +276,18 @@ namespace Barotrauma
return null; return null;
} }
public DynValue Require(string moduleName, Table globalContexts)
private DynValue Require(string modname, Table globalContext)
{ {
try try
{ {
return lua.Call(lua.RequireModule(modname, globalContext)); return require.Require(moduleName, globalContexts);
} }
catch (Exception e) catch (Exception e)
{ {
HandleException(e); HandleException(e);
} }
return null; return null;
} }
public object CallLuaFunction(object function, params object[] arguments) public object CallLuaFunction(object function, params object[] arguments)
{ {
try try
@@ -362,6 +370,8 @@ namespace Barotrauma
Lua = new CsLua(this); Lua = new CsLua(this);
CsScript = new CsScriptRunner(this); CsScript = new CsScriptRunner(this);
require = new LuaRequire(lua);
Game = new LuaGame(); Game = new LuaGame();
Networking = new LuaCsNetworking(); Networking = new LuaCsNetworking();
Hook.Initialize(); Hook.Initialize();
@@ -153,7 +153,10 @@ namespace Barotrauma
{ {
Name = TextManager.GetWithVariable("wreckeditemformat", "[name]", Name); Name = TextManager.GetWithVariable("wreckeditemformat", "[name]", Name);
} }
Name = Name.Fallback(OriginalName); if (!string.IsNullOrEmpty(OriginalName))
{
Name = Name.Fallback(OriginalName);
}
var tags = new HashSet<Identifier>(); var tags = new HashSet<Identifier>();
string joinedTags = element.GetAttributeString("tags", ""); string joinedTags = element.GetAttributeString("tags", "");
@@ -1229,6 +1229,7 @@ namespace Barotrauma
{ {
if (!connectedSubs.Contains(item.Submarine)) { continue; } if (!connectedSubs.Contains(item.Submarine)) { continue; }
if (!item.HasTag("cargocontainer")) { continue; } if (!item.HasTag("cargocontainer")) { continue; }
if (item.NonInteractable || item.HiddenInGame) { continue; }
var itemContainer = item.GetComponent<ItemContainer>(); var itemContainer = item.GetComponent<ItemContainer>();
if (itemContainer == null) { continue; } if (itemContainer == null) { continue; }
int emptySlots = 0; int emptySlots = 0;
+12
View File
@@ -1,3 +1,15 @@
---------------------------------------------------------------------------------------------------------
v0.17.11.0
---------------------------------------------------------------------------------------------------------
Fixes:
- Fixed occasional crash when talking to an outpost merchant.
- Fixed cargo missions putting cargo in non-interactable and hidden-in-game containers.
- Don't show wallet info on character portrait in other multiplayer game modes than the campaign.
- Fixed certainstructure names not showing up properly in the submarine editor in languages other than English.
- Fixed relays that have "can be overloaded" set to true breaking when overloaded (should never happen because relays can't be repaired).
- Fixed occasional mission mismatch errors in multiplayer when there's a hunting grounds or beacon mission in the level.
--------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------
v0.17.10.0 v0.17.10.0
--------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------
Binary file not shown.