From 16359ea873dc1c57b49102d23d945cef721e51d0 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 13 Jun 2019 11:46:43 +0300 Subject: [PATCH] (537240172) Fixed RuinGenerator using unsynced random when doing connections between ruin entities. I don't think there are any assemblies atm that use this type of connections, but if there were, the connections might've differed between clients/server. --- .../Source/Characters/Character.cs | 76 +++++++++++++++++-- .../Source/Map/Levels/Ruins/RuinGenerator.cs | 4 +- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index 084862f7f..c54f18253 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -894,6 +894,75 @@ namespace Barotrauma return configFile; } + private static IEnumerable characterConfigFiles; + private static IEnumerable CharacterConfigFiles + { +#if SERVER + if (GameMain.Server != null && IsRemotePlayer) + { + if (characterConfigFiles == null) + { + case InputType.Left: + return !(dequeuedInput.HasFlag(InputNetFlags.Left)) && (prevDequeuedInput.HasFlag(InputNetFlags.Left)); + case InputType.Right: + return !(dequeuedInput.HasFlag(InputNetFlags.Right)) && (prevDequeuedInput.HasFlag(InputNetFlags.Right)); + case InputType.Up: + return !(dequeuedInput.HasFlag(InputNetFlags.Up)) && (prevDequeuedInput.HasFlag(InputNetFlags.Up)); + case InputType.Down: + return !(dequeuedInput.HasFlag(InputNetFlags.Down)) && (prevDequeuedInput.HasFlag(InputNetFlags.Down)); + case InputType.Run: + return !(dequeuedInput.HasFlag(InputNetFlags.Run)) && (prevDequeuedInput.HasFlag(InputNetFlags.Run)); + case InputType.Crouch: + return !(dequeuedInput.HasFlag(InputNetFlags.Crouch)) && (prevDequeuedInput.HasFlag(InputNetFlags.Crouch)); + case InputType.Select: + return dequeuedInput.HasFlag(InputNetFlags.Select); //TODO: clean up the way this input is registered + case InputType.Deselect: + return dequeuedInput.HasFlag(InputNetFlags.Deselect); + case InputType.Health: + return dequeuedInput.HasFlag(InputNetFlags.Health); + case InputType.Grab: + return dequeuedInput.HasFlag(InputNetFlags.Grab); + case InputType.Use: + return !(dequeuedInput.HasFlag(InputNetFlags.Use)) && (prevDequeuedInput.HasFlag(InputNetFlags.Use)); + case InputType.Shoot: + return !(dequeuedInput.HasFlag(InputNetFlags.Shoot)) && (prevDequeuedInput.HasFlag(InputNetFlags.Shoot)); + case InputType.Ragdoll: + return !(dequeuedInput.HasFlag(InputNetFlags.Ragdoll)) && (prevDequeuedInput.HasFlag(InputNetFlags.Ragdoll)); + default: + return false; + } + return characterConfigFiles; + } + } + + /// + /// Searches for a character config file from all currently selected content packages, + /// or from a specific package if the contentPackage parameter is given. + /// + public static string GetConfigFile(string speciesName, ContentPackage contentPackage = null) + { + string configFile = null; + if (contentPackage == null) + { + configFile = GameMain.Instance.GetFilesOfType(ContentType.Character) + .FirstOrDefault(c => Path.GetFileName(c).ToLowerInvariant() == $"{speciesName.ToLowerInvariant()}.xml"); + } + else + { + configFile = contentPackage.GetFilesOfType(ContentType.Character)? + .FirstOrDefault(c => Path.GetFileName(c).ToLowerInvariant() == $"{speciesName.ToLowerInvariant()}.xml"); + } +#endif + + if (configFile == null) + { + DebugConsole.ThrowError($"Couldn't find a config file for {speciesName} from the selected content packages!"); + DebugConsole.ThrowError($"(The config file must end with \"{speciesName}.xml\")"); + return string.Empty; + } + return configFile; + } + private static IEnumerable characterConfigFiles; private static IEnumerable CharacterConfigFiles { @@ -1466,13 +1535,6 @@ namespace Barotrauma ResetSpeedMultiplier(); // Reset, items will set the value before the next update - var rightFoot = AnimController.GetLimb(LimbType.RightFoot); - if (rightFoot != null) - { - float footAfflictionStrength = CharacterHealth.GetAfflictionStrength("damage", rightFoot, true); - speed *= MathHelper.Lerp(1.0f, 0.4f, MathHelper.Clamp(footAfflictionStrength / 80.0f, 0.0f, 1.0f)); - } - return speed; } diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/Ruins/RuinGenerator.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/Ruins/RuinGenerator.cs index 86a73d3c2..70813cd69 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Levels/Ruins/RuinGenerator.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/Ruins/RuinGenerator.cs @@ -1022,12 +1022,12 @@ namespace Barotrauma.RuinGeneration { targetEntity = ruinEntities.GetRandom(e => e.Room == targetRoom && - e.Entity.prefab?.Identifier == connection.TargetEntityIdentifier)?.Entity; + e.Entity.prefab?.Identifier == connection.TargetEntityIdentifier, Rand.RandSync.Server)?.Entity; } } else { - targetEntity = ruinEntities.GetRandom(e => e.Entity.prefab?.Identifier == connection.TargetEntityIdentifier)?.Entity; + targetEntity = ruinEntities.GetRandom(e => e.Entity.prefab?.Identifier == connection.TargetEntityIdentifier, Rand.RandSync.Server)?.Entity; } if (targetEntity == null) continue;