(fdc49c8c) Unstable 0.9.7.1
This commit is contained in:
@@ -6,8 +6,8 @@
|
||||
karmadecaythreshold="50"
|
||||
karmaincrease="0.05"
|
||||
karmaincreasethreshold="50"
|
||||
structurerepairkarmaincrease="0.05"
|
||||
structuredamagekarmadecrease="0.08"
|
||||
structurerepairkarmaincrease="0.01"
|
||||
structuredamagekarmadecrease="0.05"
|
||||
itemrepairkarmaincrease="0.03"
|
||||
reactoroverheatkarmadecrease="0.5"
|
||||
reactormeltdownkarmadecrease="30"
|
||||
@@ -29,8 +29,8 @@
|
||||
karmadecaythreshold="50"
|
||||
karmaincrease="0.04"
|
||||
karmaincreasethreshold="45"
|
||||
structurerepairkarmaincrease="0.05"
|
||||
structuredamagekarmadecrease="0.15"
|
||||
structurerepairkarmaincrease="0.01"
|
||||
structuredamagekarmadecrease="0.2"
|
||||
itemrepairkarmaincrease="0.03"
|
||||
reactoroverheatkarmadecrease="1.0"
|
||||
reactormeltdownkarmadecrease="35"
|
||||
@@ -52,8 +52,8 @@
|
||||
karmadecaythreshold="50"
|
||||
karmaincrease="0.05"
|
||||
karmaincreasethreshold="50"
|
||||
structurerepairkarmaincrease="0.05"
|
||||
structuredamagekarmadecrease="0.08"
|
||||
structurerepairkarmaincrease="0.01"
|
||||
structuredamagekarmadecrease="0.05"
|
||||
itemrepairkarmaincrease="0.03"
|
||||
reactoroverheatkarmadecrease="0.5"
|
||||
reactormeltdownkarmadecrease="30"
|
||||
|
||||
@@ -1271,16 +1271,42 @@ namespace Barotrauma
|
||||
|
||||
if (attackResult.Damage > 0.0f)
|
||||
{
|
||||
bool canAttack = attacker.Submarine == Character.Submarine && canAttackCharacters || attacker.Submarine != null && canAttackSub;
|
||||
if (Character.Params.AI.AttackWhenProvoked)
|
||||
{
|
||||
if (attacker.Submarine == Character.Submarine && canAttackCharacters || attacker.Submarine != null && canAttackSub)
|
||||
if (canAttack)
|
||||
{
|
||||
ChangeTargetState(attacker, AIState.Attack, 100);
|
||||
}
|
||||
}
|
||||
else if (!AIParams.HasTag(attacker.SpeciesName))
|
||||
{
|
||||
ChangeTargetState(attacker, AIState.Flee, 100);
|
||||
if (attacker.AIController is EnemyAIController enemyAI)
|
||||
{
|
||||
if (enemyAI.CombatStrength > CombatStrength)
|
||||
{
|
||||
if (!AIParams.HasTag("stronger"))
|
||||
{
|
||||
ChangeTargetState(attacker, AIState.Escape, 100);
|
||||
}
|
||||
}
|
||||
else if (enemyAI.CombatStrength < CombatStrength)
|
||||
{
|
||||
if (!AIParams.HasTag("weaker"))
|
||||
{
|
||||
ChangeTargetState(attacker, canAttack ? AIState.Attack : AIState.Escape, 100);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Equal strength
|
||||
ChangeTargetState(attacker, canAttack ? AIState.Attack : AIState.Escape, 100);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ChangeTargetState(attacker, AIState.Escape, 100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1850,7 +1876,7 @@ namespace Barotrauma
|
||||
SetStateResetTimer();
|
||||
ChangeParams(target.SpeciesName);
|
||||
// Target also items, because if we are blind and the target doesn't move, we can only perceive the target when it uses items
|
||||
if (state == AIState.Attack || state == AIState.Flee)
|
||||
if (state == AIState.Attack || state == AIState.Escape)
|
||||
{
|
||||
ChangeParams("weapon");
|
||||
ChangeParams("tool");
|
||||
|
||||
+8
@@ -100,6 +100,14 @@ namespace Barotrauma
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (targetItem == null || targetItem.Removed)
|
||||
{
|
||||
#if DEBUG
|
||||
DebugConsole.NewMessage($"{character.Name}: Target null or removed. Aborting.", Color.Red);
|
||||
#endif
|
||||
Abandon = true;
|
||||
return;
|
||||
}
|
||||
if (character.IsItemTakenBySomeoneElse(targetItem))
|
||||
{
|
||||
#if DEBUG
|
||||
|
||||
@@ -2307,6 +2307,7 @@ namespace Barotrauma
|
||||
public bool CanHearCharacter(Character speaker)
|
||||
{
|
||||
if (speaker == null || speaker.SpeechImpediment > 100.0f) { return false; }
|
||||
if (speaker == this) { return true; }
|
||||
ChatMessageType messageType = ChatMessage.CanUseRadio(speaker) && ChatMessage.CanUseRadio(this) ?
|
||||
ChatMessageType.Radio :
|
||||
ChatMessageType.Default;
|
||||
@@ -2321,8 +2322,16 @@ namespace Barotrauma
|
||||
if (!CanHearCharacter(orderGiver)) { return; }
|
||||
}
|
||||
|
||||
HumanAIController humanAI = AIController as HumanAIController;
|
||||
humanAI?.SetOrder(order, orderOption, orderGiver, speak);
|
||||
if (AIController is HumanAIController humanAI)
|
||||
{
|
||||
humanAI.SetOrder(order, orderOption, orderGiver, speak);
|
||||
}
|
||||
#if CLIENT
|
||||
else
|
||||
{
|
||||
GameMain.GameSession?.CrewManager?.DisplayCharacterOrder(this, order, orderOption);
|
||||
}
|
||||
#endif
|
||||
|
||||
CurrentOrder = order;
|
||||
}
|
||||
|
||||
@@ -260,10 +260,6 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
|
||||
#if CLIENT
|
||||
private Sprite jobIcon;
|
||||
#endif
|
||||
|
||||
private List<WearableSprite> attachmentSprites;
|
||||
public List<WearableSprite> AttachmentSprites
|
||||
{
|
||||
@@ -421,9 +417,6 @@ namespace Barotrauma
|
||||
CalculateHeadSpriteRange();
|
||||
Head.HeadSpriteId = GetRandomHeadID();
|
||||
Job = (jobPrefab == null) ? Job.Random(Rand.RandSync.Server) : new Job(jobPrefab, variant);
|
||||
#if CLIENT
|
||||
jobIcon = Job.Prefab.Icon;
|
||||
#endif
|
||||
|
||||
if (!string.IsNullOrEmpty(name))
|
||||
{
|
||||
|
||||
+23
-2
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Xml.Linq;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
@@ -167,8 +168,8 @@ namespace Barotrauma
|
||||
MaxSpeedMultiplier = element.GetAttributeFloat("maxspeedmultiplier", 1.0f);
|
||||
MaxSpeedMultiplier = Math.Max(MinSpeedMultiplier, MaxSpeedMultiplier);
|
||||
|
||||
MinBuffMultiplier = element.GetAttributeFloat("minmultiplier", 1.0f);
|
||||
MaxBuffMultiplier = element.GetAttributeFloat("maxmultiplier", 1.0f);
|
||||
MinBuffMultiplier = element.GetAttributeFloat("minbuffmultiplier", 1.0f);
|
||||
MaxBuffMultiplier = element.GetAttributeFloat("maxbuffmultiplier", 1.0f);
|
||||
MaxBuffMultiplier = Math.Max(MinBuffMultiplier, MaxBuffMultiplier);
|
||||
|
||||
DialogFlag = element.GetAttributeString("dialogflag", "");
|
||||
@@ -218,6 +219,12 @@ namespace Barotrauma
|
||||
|
||||
public string FilePath { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Unique identifier that's generated by hashing the prefab's string identifier.
|
||||
/// Used to reduce the amount of bytes needed to write affliction data into network messages in multiplayer.
|
||||
/// </summary>
|
||||
public uint UIntIdentifier;
|
||||
|
||||
// Arbitrary string that is used to identify the type of the affliction.
|
||||
public readonly string AfflictionType;
|
||||
|
||||
@@ -453,6 +460,20 @@ namespace Barotrauma
|
||||
Prefabs.Add(prefab, isOverride);
|
||||
}
|
||||
}
|
||||
|
||||
using MD5 md5 = MD5.Create();
|
||||
foreach (AfflictionPrefab prefab in Prefabs)
|
||||
{
|
||||
prefab.UIntIdentifier = ToolBox.StringToUInt32Hash(prefab.Identifier, md5);
|
||||
|
||||
//it's theoretically possible for two different values to generate the same hash, but the probability is astronomically small
|
||||
var collision = Prefabs.Find(p => p != prefab && p.UIntIdentifier == prefab.UIntIdentifier);
|
||||
if (collision != null)
|
||||
{
|
||||
DebugConsole.ThrowError("Hashing collision when generating uint identifiers for Afflictions: " + prefab.Identifier + " has the same identifier as " + collision.Identifier + " (" + prefab.UIntIdentifier + ")");
|
||||
collision.UIntIdentifier++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveByFile(string filePath)
|
||||
|
||||
@@ -840,7 +840,7 @@ namespace Barotrauma
|
||||
msg.Write((byte)activeAfflictions.Count);
|
||||
foreach (Affliction affliction in activeAfflictions)
|
||||
{
|
||||
msg.Write(affliction.Prefab.Identifier);
|
||||
msg.Write(affliction.Prefab.UIntIdentifier);
|
||||
msg.WriteRangedSingle(
|
||||
MathHelper.Clamp(affliction.Strength, 0.0f, affliction.Prefab.MaxStrength),
|
||||
0.0f, affliction.Prefab.MaxStrength, 8);
|
||||
@@ -860,7 +860,7 @@ namespace Barotrauma
|
||||
foreach (var limbAffliction in limbAfflictions)
|
||||
{
|
||||
msg.WriteRangedInteger(limbHealths.IndexOf(limbAffliction.First), 0, limbHealths.Count - 1);
|
||||
msg.Write(limbAffliction.Second.Prefab.Identifier);
|
||||
msg.Write(limbAffliction.Second.Prefab.UIntIdentifier);
|
||||
msg.WriteRangedSingle(
|
||||
MathHelper.Clamp(limbAffliction.Second.Strength, 0.0f, limbAffliction.Second.Prefab.MaxStrength),
|
||||
0.0f, limbAffliction.Second.Prefab.MaxStrength, 8);
|
||||
|
||||
@@ -195,7 +195,7 @@ namespace Barotrauma
|
||||
}
|
||||
if (space > 0)
|
||||
{
|
||||
new GUIFrame(new RectTransform(new Point(editor.EditorBox.Rect.Width, space), editor.EditorBox.Content.RectTransform), style: null, color: ParamsEditor.Color)
|
||||
new GUIFrame(new RectTransform(new Point(editor.EditorBox.Rect.Width, (int)(space * GUI.yScale)), editor.EditorBox.Content.RectTransform), style: null, color: ParamsEditor.Color)
|
||||
{
|
||||
CanBeFocused = false
|
||||
};
|
||||
@@ -464,7 +464,7 @@ namespace Barotrauma
|
||||
private bool TryAddTarget(XElement targetElement, out TargetParams target)
|
||||
{
|
||||
string tag = targetElement.GetAttributeString("tag", null);
|
||||
if (!HasTag(tag))
|
||||
if (HasTag(tag))
|
||||
{
|
||||
target = null;
|
||||
DebugConsole.ThrowError($"Multiple targets with the same tag ('{tag}') defined! Only the first will be used!");
|
||||
@@ -498,7 +498,7 @@ namespace Barotrauma
|
||||
public bool HasTag(string tag)
|
||||
{
|
||||
if (tag == null) { return false; }
|
||||
return targets.None(t => t.Tag.Equals(tag, StringComparison.OrdinalIgnoreCase));
|
||||
return targets.Any(t => t.Tag.Equals(tag, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
public bool RemoveTarget(TargetParams target) => RemoveSubParam(target, targets);
|
||||
|
||||
@@ -121,12 +121,14 @@ namespace Barotrauma
|
||||
{
|
||||
if (md5Hash == null)
|
||||
{
|
||||
md5Hash = Md5Hash.FetchFromCache(Path);
|
||||
//TODO: before re-enabling content package hash caching, make sure the hash gets recalculated when any file in the content package changes, not just when the filelist.xml changes.
|
||||
/*md5Hash = Md5Hash.FetchFromCache(Path);
|
||||
if (md5Hash == null)
|
||||
{
|
||||
CalculateHash();
|
||||
md5Hash.SaveToCache(Path);
|
||||
}
|
||||
}*/
|
||||
CalculateHash();
|
||||
}
|
||||
return md5Hash;
|
||||
}
|
||||
|
||||
@@ -1118,45 +1118,9 @@ namespace Barotrauma
|
||||
commands.Sort((c1, c2) => c1.names[0].CompareTo(c2.names[0]));
|
||||
}
|
||||
|
||||
private static string[] SplitCommand(string command)
|
||||
{
|
||||
command = command.Trim();
|
||||
|
||||
List<string> commands = new List<string>();
|
||||
int escape = 0;
|
||||
bool inQuotes = false;
|
||||
string piece = "";
|
||||
|
||||
for (int i = 0; i < command.Length; i++)
|
||||
{
|
||||
if (command[i] == '\\')
|
||||
{
|
||||
if (escape == 0) escape = 2;
|
||||
else piece += '\\';
|
||||
}
|
||||
else if (command[i] == '"')
|
||||
{
|
||||
if (escape == 0) inQuotes = !inQuotes;
|
||||
else piece += '"';
|
||||
}
|
||||
else if (command[i] == ' ' && !inQuotes)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(piece)) commands.Add(piece);
|
||||
piece = "";
|
||||
}
|
||||
else if (escape == 0) piece += command[i];
|
||||
|
||||
if (escape > 0) escape--;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(piece)) commands.Add(piece); //add final piece
|
||||
|
||||
return commands.ToArray();
|
||||
}
|
||||
|
||||
public static string AutoComplete(string command, int increment = 1)
|
||||
{
|
||||
string[] splitCommand = SplitCommand(command);
|
||||
string[] splitCommand = ToolBox.SplitCommand(command);
|
||||
string[] args = splitCommand.Skip(1).ToArray();
|
||||
|
||||
//if an argument is given or the last character is a space, attempt to autocomplete the argument
|
||||
@@ -1245,7 +1209,7 @@ namespace Barotrauma
|
||||
|
||||
if (string.IsNullOrWhiteSpace(command) || command == "\\" || command == "\n") { return; }
|
||||
|
||||
string[] splitCommand = SplitCommand(command);
|
||||
string[] splitCommand = ToolBox.SplitCommand(command);
|
||||
if (splitCommand.Length == 0)
|
||||
{
|
||||
ThrowError("Failed to execute command \"" + command + "\"!");
|
||||
|
||||
@@ -370,7 +370,7 @@ namespace Barotrauma
|
||||
|
||||
if (!selectedEvents.ContainsKey(eventSet))
|
||||
{
|
||||
DebugConsole.ThrowError("Error in EventManager.Update: pending event set \"" + eventSet.DebugIdentifier + "\" not present in selected event sets.");
|
||||
//no events selected from this event set
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -405,9 +405,24 @@ namespace Barotrauma.Items.Components
|
||||
{
|
||||
if (User != null && User.Removed) { User = null; return false; }
|
||||
if (IgnoredBodies.Contains(target.Body)) { return false; }
|
||||
if (target.Body.UserData is Submarine submarine)
|
||||
if (target.Body.UserData is Submarine sub)
|
||||
{
|
||||
return !Hitscan;
|
||||
Vector2 dir = item.body.LinearVelocity.LengthSquared() < 0.001f ?
|
||||
contact.Manifold.LocalNormal : Vector2.Normalize(item.body.LinearVelocity);
|
||||
|
||||
//do a raycast in the sub's coordinate space to see if it hit a structure
|
||||
var wallBody = Submarine.PickBody(
|
||||
item.body.SimPosition - ConvertUnits.ToSimUnits(sub.Position) - dir,
|
||||
item.body.SimPosition - ConvertUnits.ToSimUnits(sub.Position) + dir,
|
||||
collisionCategory: Physics.CollisionWall);
|
||||
if (wallBody?.FixtureList?.First() != null && wallBody.UserData is Structure structure)
|
||||
{
|
||||
target = wallBody.FixtureList.First();
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (target.Body.UserData is Limb limb)
|
||||
{
|
||||
|
||||
@@ -1369,7 +1369,7 @@ namespace Barotrauma
|
||||
container = container.Container;
|
||||
}
|
||||
}
|
||||
if (hasWaterStatusEffects && condition <= 0.0f)
|
||||
if (hasWaterStatusEffects && condition > 0.0f)
|
||||
{
|
||||
ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime);
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@ namespace Barotrauma
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(line)) { continue; }
|
||||
string[] parts = line.Split('|');
|
||||
if (parts.Length < 3) { continue; }
|
||||
|
||||
string path = parts[0].CleanUpPath();
|
||||
string hashStr = parts[1];
|
||||
long timeLong = long.Parse(parts[2]);
|
||||
@@ -32,7 +34,7 @@ namespace Barotrauma
|
||||
Md5Hash hash = new Md5Hash(hashStr);
|
||||
DateTime time = DateTime.FromBinary(timeLong);
|
||||
|
||||
if (File.GetLastWriteTime(path) == time)
|
||||
if (File.GetLastWriteTime(path) == time && !cache.ContainsKey(path))
|
||||
{
|
||||
cache.Add(path, new Tuple<Md5Hash, long>(hash, timeLong));
|
||||
}
|
||||
@@ -72,22 +74,22 @@ namespace Barotrauma
|
||||
|
||||
public void SaveToCache(string filename, long? time = null)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(filename))
|
||||
if (string.IsNullOrWhiteSpace(filename)) { return; }
|
||||
|
||||
lock (cache)
|
||||
{
|
||||
lock (cache)
|
||||
filename = filename.CleanUpPath();
|
||||
Tuple<Md5Hash, long> cacheVal = new Tuple<Md5Hash, long>(this, time ?? File.GetLastWriteTime(filename).ToBinary());
|
||||
if (cache.ContainsKey(filename))
|
||||
{
|
||||
Tuple<Md5Hash, long> cacheVal = new Tuple<Md5Hash, long>(this, time ?? File.GetLastWriteTime(filename).ToBinary());
|
||||
if (cache.ContainsKey(filename))
|
||||
{
|
||||
cache[filename] = cacheVal;
|
||||
}
|
||||
else
|
||||
{
|
||||
cache.Add(filename, cacheVal);
|
||||
}
|
||||
SaveCache();
|
||||
cache[filename] = cacheVal;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cache.Add(filename, cacheVal);
|
||||
}
|
||||
SaveCache();
|
||||
}
|
||||
}
|
||||
|
||||
public static Md5Hash FetchFromCache(string filename)
|
||||
|
||||
+2
-2
@@ -46,10 +46,10 @@ namespace Barotrauma.Networking
|
||||
//the length of the data is written as a byte, so the data needs to be less than 255 bytes long
|
||||
if (tempEventBuffer.LengthBytes > 255)
|
||||
{
|
||||
DebugConsole.ThrowError("Too much data in network event for entity \"" + e.Entity.ToString() + "\" (" + tempEventBuffer.LengthBytes + " bytes");
|
||||
DebugConsole.ThrowError("Too much data in network event for entity \"" + e.Entity.ToString() + "\" (" + tempEventBuffer.LengthBytes + " bytes, event ID " + e.ID + ")");
|
||||
GameAnalyticsManager.AddErrorEventOnce("NetEntityEventManager.Write:TooLong" + e.Entity.ToString(),
|
||||
GameAnalyticsSDK.Net.EGAErrorSeverity.Error,
|
||||
"Too much data in network event for entity \"" + e.Entity.ToString() + "\" (" + tempEventBuffer.LengthBytes + " bytes");
|
||||
"Too much data in network event for entity \"" + e.Entity.ToString() + "\" (" + tempEventBuffer.LengthBytes + " bytes, event ID " + e.ID + ")");
|
||||
|
||||
//write an empty event to prevent breaking the event syncing
|
||||
tempBuffer.Write(Entity.NullEntityID);
|
||||
|
||||
@@ -490,59 +490,40 @@ namespace Barotrauma
|
||||
return retVal;
|
||||
}
|
||||
|
||||
public static string ParseQuotedArgument(string[] arguments, int startIndex, out int endIndex)
|
||||
public static string[] SplitCommand(string command)
|
||||
{
|
||||
#if WINDOWS
|
||||
endIndex = startIndex + 1;
|
||||
return arguments[startIndex];
|
||||
#else
|
||||
string retVal = "";
|
||||
int currIndex = startIndex;
|
||||
bool escaped = false;
|
||||
if (arguments[startIndex][0] != '\"')
|
||||
command = command.Trim();
|
||||
|
||||
List<string> commands = new List<string>();
|
||||
int escape = 0;
|
||||
bool inQuotes = false;
|
||||
string piece = "";
|
||||
|
||||
for (int i = 0; i < command.Length; i++)
|
||||
{
|
||||
endIndex = startIndex+1;
|
||||
return UnescapeCharacters(arguments[startIndex]);
|
||||
}
|
||||
while (currIndex < arguments.Length)
|
||||
{
|
||||
for (int i = currIndex == startIndex ? 1 : 0; i < arguments[currIndex].Length ;i++)
|
||||
if (command[i] == '\\')
|
||||
{
|
||||
if (!escaped)
|
||||
{
|
||||
if (arguments[currIndex][i] == '\\')
|
||||
{
|
||||
escaped = true;
|
||||
}
|
||||
else if (arguments[currIndex][i] == '\"')
|
||||
{
|
||||
endIndex = currIndex+1;
|
||||
return UnescapeCharacters(retVal);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
escaped = false;
|
||||
}
|
||||
retVal += arguments[currIndex][i];
|
||||
if (escape == 0) escape = 2;
|
||||
else piece += '\\';
|
||||
}
|
||||
retVal += " ";
|
||||
currIndex++;
|
||||
else if (command[i] == '"')
|
||||
{
|
||||
if (escape == 0) inQuotes = !inQuotes;
|
||||
else piece += '"';
|
||||
}
|
||||
else if (command[i] == ' ' && !inQuotes)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(piece)) commands.Add(piece);
|
||||
piece = "";
|
||||
}
|
||||
else if (escape == 0) piece += command[i];
|
||||
|
||||
if (escape > 0) escape--;
|
||||
}
|
||||
|
||||
endIndex = arguments.Length;
|
||||
return retVal;
|
||||
#endif
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(piece)) commands.Add(piece); //add final piece
|
||||
|
||||
public static string[] MergeArguments(string[] arguments)
|
||||
{
|
||||
List<string> mergedArgs = new List<string>();
|
||||
for (int i = 0; i < arguments.Length;)
|
||||
{
|
||||
mergedArgs.Add(ParseQuotedArgument(arguments, i, out i));
|
||||
}
|
||||
return mergedArgs.ToArray();
|
||||
return commands.ToArray();
|
||||
}
|
||||
|
||||
public static void OpenFileWithShell(string filename)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,63 +1,8 @@
|
||||
---------------------------------------------------------------------------------------------------------
|
||||
v0.9.708.0
|
||||
v0.9.7.1
|
||||
---------------------------------------------------------------------------------------------------------
|
||||
|
||||
- Minor UI improvements.
|
||||
- Reverted "improved the way clients initialize rounds to prevent timeouts if loading the round takes too long". There were a couple of oversights in the logic that caused issues such as combat missions not starting and campaign failing to start after the first completed round.
|
||||
- Fixed EventManager intensity being calculated incorrectly in multiplayer, causing monster spawns to be more sparse in multiplayer than in singleplayer.
|
||||
- Updated tutorial videos.
|
||||
- Increased duffel bag capacity to 20 to make sure it can hold all the items in a character's inventory (+ a couple more).
|
||||
- Fixed "Commando" security officer variant spawning without an SMG magazine.
|
||||
- Potential fix to crashes in "Body.SetTransformIgnoreContacts".
|
||||
- Fixed bots spawned with the "spawn" console command being unable to communicate via headsets after the first round in the single player campaign.
|
||||
- Fixed engine's AI target changing it's range too rapidly when the engine's force changes rapidly, causing monsters to often lose track of the sub after just spotting it.
|
||||
- Do not allow steering input on the nav terminal while command interface is enabled.
|
||||
- Fixed lobby command (which switches to the single player lobby) being usable in multiplayer.
|
||||
- Prevented chat message popups (the individual messages that popup when the chatbox is hidden) from getting cursor focus and blocking turret usage.
|
||||
- Made reactor's fuel rod panel a little larger.
|
||||
|
||||
---------------------------------------------------------------------------------------------------------
|
||||
v0.9.707.0
|
||||
---------------------------------------------------------------------------------------------------------
|
||||
|
||||
- Whoops, fixed crashing in multiplayer due to CrewManager attempting to access the single player chatbox.
|
||||
|
||||
---------------------------------------------------------------------------------------------------------
|
||||
v0.9.706.0
|
||||
---------------------------------------------------------------------------------------------------------
|
||||
|
||||
- Reverted back to the old inventory UI (with updated graphics) for now.
|
||||
- Miscellaneous UI layout fixes and improvements.
|
||||
- Visual improvements to the health interface.
|
||||
- Fixed bots spawned using console commands not getting assigned the correct team id on their headsets, causing them to be disabled in the command interface.
|
||||
- Fixed team ids of character's headsets resetting after the first campaign round, preventing them from communicating via radio with the players/bots who are playing their first round.
|
||||
- Fixed collider tunneling when client is slow to send inputs. Caused characters to occasionally noclip through walls when the connection or framerate is poor.
|
||||
- Improved the way clients initialize rounds to prevent timeouts if loading the round takes too long.
|
||||
- Fixed enemy team being visible in the command UI in combat missions.
|
||||
- Adjusted repair times to better suit current skill balance.
|
||||
- Medical item balancing.
|
||||
- Command button is hidden when it cannot be used.
|
||||
- Added a button to give orders to crew members directly.
|
||||
- Don't close item UI when opening crew list with keybind.
|
||||
- Allow toggling crew list with keybind in spectator and freecam modes.
|
||||
- Fixed command UI hotkey navigation triggering inventory hotkey in the last step.
|
||||
- Fixed command UI being immediately re-enabled after giving an order in clickless mode.
|
||||
- Fixed sonar beacon UI overlapping with the chatbox.
|
||||
- Fixed nav terminal's docking button overlapping with the chatbox.
|
||||
- Marked "editsubs" a cheat command.
|
||||
- Fixed cursor getting stuck to the dragging or hand state if dragging/highlighting a wire is interrupted by any other reason than letting go of the left mouse button (electrocution, getting killed, ending the round...)
|
||||
- Improved server lobby scaling when switching resolutions.
|
||||
- Fixed some server-side console commands not sending anything back to the client executing them, making it seem as if the command did nothing (botcount, botspawnmode, killdisconnectedtimer, togglekarma).
|
||||
- Fixed progress bars having a bunch of dead space at the beginning and end (causing battery/repair sliders to appear empty when below ~5%, and full when above ~95%).
|
||||
- Fixed CustomInterface crashing the game when selected if it contains no buttons/tickboxes.
|
||||
- Fixed a couple of unfair ruin traps (rooms with coil/sensor placement that makes it impossible to pass through without getting zapped).
|
||||
- Fixed tutorial video scaling when opened more than once.
|
||||
- Lock portrait area, health bar, affliction icons and report buttons when using a turret.
|
||||
- Fixed lower docking port ladder on Typhon 2.
|
||||
- Safeguards to prevent EventManager from crashing the game due to missing EventManagerSettings (#2066).
|
||||
- Some safeguards and extra error logging for case where the world field of a physics body seems to be null when dropping an item (#2252).
|
||||
- Fixed a rare crash with the message "Compare() method returns inconsistent results" when autoplacing items in the sub.
|
||||
- Fixed mechanic tutorial getting softlocked if the player never has an oxygen tank (or aluminium) and sodium in their inventory at the same time. I.e. if they deconstruct the oxygen tanks first and put the aluminium in the fabricator, and then get the sodium and put it in the fabricator.
|
||||
- Fixed crashing when attempting to publish Workshop items.
|
||||
|
||||
---------------------------------------------------------------------------------------------------------
|
||||
v0.9.7.0
|
||||
@@ -224,6 +169,7 @@ Multiplayer:
|
||||
- Fixed a bunch of bugs that caused "missing entity" errors. However, there are many different reasons the error can occur, so even though we have not run into the issue anymore during out testing rounds, there is still a chance it may occur in some situations.
|
||||
- Fixed inventory items occasionally getting mixed up in the multiplayer campaign.
|
||||
- Fixed a bug that caused clients to get disconnected with an "invalid object header" error when a character has a large amount of different afflictions.
|
||||
- Fixed collider tunneling when client is slow to send inputs. Caused characters to occasionally noclip through walls when the connection or framerate is poor.
|
||||
- Fixed server owner occasionally timing out if loading the round takes too long.
|
||||
- Fixed server owner's character occasionally being killed due to round start timeouts.
|
||||
- Fixed players not getting notified in any way when their connection to the server has timed out, allowing them to keep playing without being able to interact with anything.
|
||||
@@ -243,6 +189,7 @@ Multiplayer:
|
||||
- Increased default killdisconnectedtime to 2 minutes.
|
||||
- Player cap can be adjusted in the server settings.
|
||||
- Made "showseed" console command usable by clients.
|
||||
- Fixed lobby command (which switches to the single player lobby) being usable in multiplayer.
|
||||
|
||||
Bugfixes:
|
||||
- Fixes to render order oddities (structures with a depth > 0.5 always rendering behind all items, inconsistent render order between sub editor and in-game). Now structures with a depth of >= 0.9 are always behind everything (and visible through the LOS effect), and item's sprite depth is capped to 0.9.
|
||||
@@ -250,6 +197,7 @@ Bugfixes:
|
||||
- Fixed Kastrull flooding when the drone undocks.
|
||||
- Fixed ballast pumps deteriorating in Kastrull's drone despite being unreachable by the players.
|
||||
- Fixed sonar transducers consuming no power.
|
||||
- Fixed EventManager intensity being calculated incorrectly in multiplayer, causing monster spawns to be more sparse in multiplayer than in singleplayer.
|
||||
- Fixed autopilot overshooting and compensating too heavily when attempting to maintain position, causing it to never fully stop on the target position.
|
||||
- Fixed charactes being unable to get through multi-layer walls from inside the sub (for example the walls above Humpback's command room).
|
||||
- Fixed plasma cutter not cutting through holes in walls.
|
||||
@@ -298,6 +246,8 @@ Bugfixes:
|
||||
- Fixed engine sound range being up to 20 times larger than it should be.
|
||||
- Fixed monsters occasionally being able to attack through walls.
|
||||
- Fixed alarm buzzer not returning to the original rotation when the alarm stops.
|
||||
- Fixed a couple of unfair ruin traps (rooms with coil/sensor placement that makes it impossible to pass through without getting zapped).
|
||||
- Fixed mechanic tutorial getting softlocked if the player never has an oxygen tank (or aluminium) and sodium in their inventory at the same time. I.e. if they deconstruct the oxygen tanks first and put the aluminium in the fabricator, and then get the sodium and put it in the fabricator.
|
||||
|
||||
---------------------------------------------------------------------------------------------------------
|
||||
v0.9.6.0
|
||||
|
||||
Reference in New Issue
Block a user