diff --git a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs
index 4b910e119..bcf031886 100644
--- a/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs
+++ b/Barotrauma/BarotraumaClient/Source/Networking/GameClient.cs
@@ -2047,13 +2047,15 @@ namespace Barotrauma.Networking
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
}
- public void SetupNewCampaign(Submarine sub, string savePath, string mapSeed)
+ public void SetupNewCampaign(Submarine sub, string saveName, string mapSeed)
{
+ saveName = Path.GetFileNameWithoutExtension(saveName);
+
NetOutgoingMessage msg = client.CreateMessage();
msg.Write((byte)ClientPacketHeader.CAMPAIGN_SETUP_INFO);
msg.Write(true); msg.WritePadBits();
- msg.Write(savePath);
+ msg.Write(saveName);
msg.Write(mapSeed);
msg.Write(sub.Name);
msg.Write(sub.MD5Hash.Hash);
diff --git a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs
index 586e28a2e..6dbaf7cb0 100644
--- a/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs
+++ b/Barotrauma/BarotraumaServer/Source/Networking/GameServer.cs
@@ -728,7 +728,7 @@ namespace Barotrauma.Networking
bool isNew = inc.ReadBoolean(); inc.ReadPadBits();
if (isNew)
{
- string savePath = inc.ReadString();
+ string saveName = inc.ReadString();
string seed = inc.ReadString();
string subName = inc.ReadString();
string subHash = inc.ReadString();
@@ -743,7 +743,11 @@ namespace Barotrauma.Networking
}
else
{
- if (connectedClient.HasPermission(ClientPermissions.SelectMode)) MultiPlayerCampaign.StartNewCampaign(savePath, matchingSub.FilePath, seed);
+ string localSavePath = SaveUtil.CreateSavePath(SaveUtil.SaveType.Multiplayer, saveName);
+ if (connectedClient.HasPermission(ClientPermissions.SelectMode))
+ {
+ MultiPlayerCampaign.StartNewCampaign(localSavePath, matchingSub.FilePath, seed);
+ }
}
}
else
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
index 7ed8245bc..1b90f1a0d 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
@@ -840,7 +840,15 @@ namespace Barotrauma
{
if (string.IsNullOrEmpty(humanConfigFile))
{
- humanConfigFile = GetConfigFile("Human");
+ humanConfigFile = GameMain.Instance.GetFilesOfType(ContentType.Character)?
+ .FirstOrDefault(c => Path.GetFileName(c).ToLowerInvariant() == "human.xml");
+
+ if (humanConfigFile == null)
+ {
+ DebugConsole.ThrowError($"Couldn't find a human config file from the selected content packages!");
+ DebugConsole.ThrowError($"(The config file must end with \"human.xml\")");
+ return string.Empty;
+ }
}
return humanConfigFile;
}
@@ -859,6 +867,74 @@ namespace Barotrauma
}
}
+ ///
+ /// 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");
+ }
+
+ 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
+ {
+#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;
+ }
+ }
+
public static string GetConfigFile(string speciesName, ContentPackage contentPackage = null)
{
string configFile = null;
@@ -872,6 +948,7 @@ namespace Barotrauma
configFile = contentPackage.GetFilesOfType(ContentType.Character)?
.FirstOrDefault(c => Path.GetFileName(c).ToLowerInvariant() == $"{speciesName.ToLowerInvariant()}.xml");
}
+#endif
if (configFile == null)
{
@@ -1128,6 +1205,13 @@ 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;
}