v0.19.8.0

This commit is contained in:
Juan Pablo Arce
2022-09-28 21:30:52 -03:00
parent fec8131243
commit 3ca584f2fc
152 changed files with 1931 additions and 1071 deletions
@@ -2932,7 +2932,7 @@ namespace Barotrauma
}
/// <param name="rotation">Used by clients to set the rotation for the resources</param>
public List<Item> GenerateMissionResources(ItemPrefab prefab, int requiredAmount, PositionType positionType, out float rotation)
public List<Item> GenerateMissionResources(ItemPrefab prefab, int requiredAmount, PositionType positionType, out float rotation, IEnumerable<Cave> targetCaves = null)
{
var allValidLocations = GetAllValidClusterLocations();
var placedResources = new List<Item>();
@@ -2995,6 +2995,12 @@ namespace Barotrauma
DebugConsole.ThrowError($"Unexpected PositionType (\"{positionType}\") for mineral mission resources: mineral spawning might not work as expected.");
}
if (targetCaves != null && targetCaves.Any())
{
// If resources are placed inside a cave, make sure all of them are placed inside the same one
allValidLocations.RemoveAll(l => targetCaves.None(c => c.Area.Contains(l.EdgeCenter)));
}
var poi = PositionsOfInterest.GetRandom(p => p.PositionType == positionType, randSync: Rand.RandSync.ServerAndClient);
Vector2 poiPos = poi.Position.ToVector2();
allValidLocations.Sort((x, y) => Vector2.DistanceSquared(poiPos, x.EdgeCenter)
@@ -3002,7 +3008,10 @@ namespace Barotrauma
float maxResourceOverlap = 0.4f;
var selectedLocation = allValidLocations.FirstOrDefault(l =>
Vector2.Distance(l.Edge.Point1, l.Edge.Point2) is float edgeLength &&
!l.Edge.OutsideLevel &&
requiredAmount <= (int)Math.Floor(edgeLength / ((1.0f - maxResourceOverlap) * prefab.Size.X)));
if (selectedLocation.Edge == null)
{
//couldn't find a long enough edge, find the largest one
@@ -3028,10 +3037,10 @@ namespace Barotrauma
static bool IsOnMainPath(ClusterLocation location) => location.Edge.NextToMainPath;
static bool IsOnSidePath(ClusterLocation location) => location.Edge.NextToSidePath;
static bool IsInCave(ClusterLocation location) => location.Edge.NextToCave;
bool IsInAbyssCave(ClusterLocation location) => location.EdgeCenter.Y > AbyssArea.Bottom;
bool IsInAbyssCave(ClusterLocation location) => location.EdgeCenter.Y < AbyssStart;
void RemoveInvalidLocations(Predicate<ClusterLocation> match)
{
allValidLocations.RemoveAll(match);
allValidLocations.RemoveAll(l => !match(l));
}
}
@@ -281,6 +281,10 @@ namespace Barotrauma
IdRemap parentRemap = new IdRemap(Submarine.Info.SubmarineElement, Submarine.IdOffset);
sub = Submarine.Load(info, false, parentRemap);
sub.Info.SubmarineClass = Submarine.Info.SubmarineClass;
if (Submarine.Info.IsOutpost && Submarine.TeamID == CharacterTeamType.FriendlyNPC)
{
sub.TeamID = CharacterTeamType.FriendlyNPC;
}
IdRemap childRemap = new IdRemap(saveElement, sub.IdOffset);
@@ -700,7 +700,7 @@ namespace Barotrauma
#endif
}
public MissionPrefab UnlockMissionByIdentifier(Identifier identifier)
public Mission UnlockMissionByIdentifier(Identifier identifier)
{
if (AvailableMissions.Any(m => m.Prefab.Identifier == identifier)) { return null; }
@@ -721,17 +721,17 @@ namespace Barotrauma
#if CLIENT
GameMain.GameSession?.Campaign?.CampaignUI?.RefreshLocationInfo();
#endif
return missionPrefab;
return mission;
}
return null;
}
public MissionPrefab UnlockMissionByTag(Identifier tag)
public Mission UnlockMissionByTag(Identifier tag)
{
var matchingMissions = MissionPrefab.Prefabs.Where(mp => mp.Tags.Any(t => t == tag));
if (!matchingMissions.Any())
{
DebugConsole.ThrowError($"Failed to unlock a mission with the tag \"{tag}\": no matching missions not found.");
DebugConsole.ThrowError($"Failed to unlock a mission with the tag \"{tag}\": no matching missions found.");
}
else
{
@@ -754,7 +754,7 @@ namespace Barotrauma
#if CLIENT
GameMain.GameSession?.Campaign?.CampaignUI?.RefreshLocationInfo();
#endif
return missionPrefab;
return mission;
}
else
{
@@ -462,6 +462,13 @@ namespace Barotrauma
}
}
//make sure the connections are in the same order on the locations and the Connections list
//otherwise their order will change when loading the game (as they're added to the locations in the same order they're loaded)
foreach (var location in Locations)
{
location.Connections.Sort((c1, c2) => Connections.IndexOf(c1).CompareTo(Connections.IndexOf(c2)));
}
for (int i = Connections.Count - 1; i >= 0; i--)
{
i = Math.Min(i, Connections.Count - 1);
@@ -1234,7 +1234,7 @@ namespace Barotrauma
public List<(ItemContainer container, int freeSlots)> GetCargoContainers()
{
List<(ItemContainer container, int freeSlots)> containers = new List<(ItemContainer container, int freeSlots)>();
var connectedSubs = GetConnectedSubs();
var connectedSubs = GetConnectedSubs().Where(sub => sub.Info?.Type == Info.Type);
foreach (Item item in Item.ItemList.ToList())
{
if (!connectedSubs.Contains(item.Submarine)) { continue; }
@@ -447,11 +447,13 @@ namespace Barotrauma
private Vector2 CalculateBuoyancy()
{
if (Submarine.LockY) { return Vector2.Zero; }
float waterVolume = 0.0f;
float volume = 0.0f;
foreach (Hull hull in Hull.HullList)
{
if (hull.Submarine != submarine) continue;
if (hull.Submarine != submarine) { continue; }
waterVolume += hull.WaterVolume;
volume += hull.Volume;