Merge branch 'master' of https://github.com/Regalis11/Barotrauma into develop

This commit is contained in:
EvilFactory
2023-10-19 12:18:30 -03:00
613 changed files with 22122 additions and 11481 deletions
@@ -12,7 +12,7 @@ namespace Barotrauma
{
abstract partial class MapEntity : Entity, ISpatialEntity
{
public static List<MapEntity> mapEntityList = new List<MapEntity>();
public readonly static List<MapEntity> MapEntityList = new List<MapEntity>();
public readonly MapEntityPrefab Prefab;
@@ -86,8 +86,8 @@ namespace Barotrauma
{
get { return isHighlighted || ExternalHighlight; }
set
{
if (value != IsHighlighted)
{
if (value != isHighlighted)
{
isHighlighted = value;
CheckIsHighlighted();
@@ -535,32 +535,32 @@ namespace Barotrauma
{
if (Sprite == null)
{
mapEntityList.Add(this);
MapEntityList.Add(this);
return;
}
int i = 0;
while (i < mapEntityList.Count)
while (i < MapEntityList.Count)
{
i++;
if (mapEntityList[i - 1]?.Prefab == Prefab)
if (MapEntityList[i - 1]?.Prefab == Prefab)
{
mapEntityList.Insert(i, this);
MapEntityList.Insert(i, this);
return;
}
}
#if CLIENT
i = 0;
while (i < mapEntityList.Count)
while (i < MapEntityList.Count)
{
i++;
Sprite existingSprite = mapEntityList[i - 1].Sprite;
Sprite existingSprite = MapEntityList[i - 1].Sprite;
if (existingSprite == null) { continue; }
if (existingSprite.Texture == this.Sprite.Texture) { break; }
}
#endif
mapEntityList.Insert(i, this);
MapEntityList.Insert(i, this);
}
/// <summary>
@@ -570,7 +570,7 @@ namespace Barotrauma
{
base.Remove();
mapEntityList.Remove(this);
MapEntityList.Remove(this);
if (aiTarget != null) aiTarget.Remove();
}
@@ -579,7 +579,7 @@ namespace Barotrauma
{
base.Remove();
mapEntityList.Remove(this);
MapEntityList.Remove(this);
#if CLIENT
Submarine.ForceRemoveFromVisibleEntities(this);
@@ -653,6 +653,7 @@ namespace Barotrauma
sw.Restart();
#endif
Item.UpdatePendingConditionUpdates(deltaTime);
if (mapEntityUpdateTick % MapEntityUpdateInterval == 0)
{
foreach (Item item in Item.ItemList)
@@ -719,6 +720,20 @@ namespace Barotrauma
{
IdRemap idRemap = new IdRemap(parentElement, idOffset);
bool containsHiddenContainers = false;
bool hiddenContainerCreated = false;
MTRandom hiddenContainerRNG = new MTRandom(ToolBox.StringToInt(submarine.Info.Name));
foreach (var element in parentElement.Elements())
{
if (element.NameAsIdentifier() != "Item") { continue; }
var tags = element.GetAttributeIdentifierArray("tags", Array.Empty<Identifier>());
if (tags.Contains(Tags.HiddenItemContainer))
{
containsHiddenContainers = true;
break;
}
}
List<MapEntity> entities = new List<MapEntity>();
foreach (var element in parentElement.Elements())
{
@@ -743,10 +758,11 @@ namespace Barotrauma
continue;
}
Identifier identifier = element.GetAttributeIdentifier("identifier", "");
Identifier replacementIdentifier = Identifier.Empty;
if (t == typeof(Structure))
{
string name = element.Attribute("name").Value;
Identifier identifier = element.GetAttributeIdentifier("identifier", "");
StructurePrefab structurePrefab = Structure.FindPrefab(name, identifier);
if (structurePrefab == null)
{
@@ -757,6 +773,20 @@ namespace Barotrauma
}
}
}
else if (t == typeof(Item) && !containsHiddenContainers && identifier == "vent" &&
submarine.Info.Type == SubmarineType.Player && !submarine.Info.HasTag(SubmarineTag.Shuttle))
{
if (!hiddenContainerCreated)
{
DebugConsole.AddWarning($"There are no hidden containers such as loose vents or loose panels in the submarine \"{submarine.Info.Name}\". Certain traitor events require these to function properly. Converting one of the vents to a loose vent...");
}
if (!hiddenContainerCreated || hiddenContainerRNG.NextDouble() < 0.2)
{
replacementIdentifier = "loosevent".ToIdentifier();
containsHiddenContainers = true;
hiddenContainerCreated = true;
}
}
try
{
@@ -771,7 +801,12 @@ namespace Barotrauma
}
else
{
object newEntity = loadMethod.Invoke(t, new object[] { element.FromPackage(null), submarine, idRemap });
var newElement = element.FromPackage(null);
if (!replacementIdentifier.IsEmpty)
{
newElement.SetAttributeValue("identifier", replacementIdentifier.ToString());
}
object newEntity = loadMethod.Invoke(t, new object[] { newElement, submarine, idRemap });
if (newEntity != null)
{
entities.Add((MapEntity)newEntity);
@@ -804,9 +839,9 @@ namespace Barotrauma
for (int i = 0; i < entities.Count; i++)
{
if (entities[i].mapLoadedCalled || entities[i].Removed) { continue; }
if (entities[i] is LinkedSubmarine)
if (entities[i] is LinkedSubmarine sub)
{
linkedSubs.Add((LinkedSubmarine)entities[i]);
linkedSubs.Add(sub);
continue;
}
@@ -825,6 +860,35 @@ namespace Barotrauma
{
linkedSub.OnMapLoaded();
}
CreateDroppedStacks(entities);
}
private static void CreateDroppedStacks(List<MapEntity> entities)
{
const float MaxDist = 10.0f;
List<Item> itemsInStack = new List<Item>();
for (int i = 0; i < entities.Count; i++)
{
if (entities[i] is not Item item1 || item1.Prefab.MaxStackSize <= 1 || item1.body is not { Enabled: true }) { continue; }
itemsInStack.Clear();
itemsInStack.Add(item1);
for (int j = i + 1; j < entities.Count; j++)
{
if (entities[j] is not Item item2) { continue; }
if (item1.Prefab != item2.Prefab) { continue; }
if (item2.body is not { Enabled: true }) { continue; }
if (item2.DroppedStack.Any()) { continue; }
if (Math.Abs(item1.Position.X - item2.Position.X) > MaxDist) { continue; }
if (Math.Abs(item1.Position.Y - item2.Position.Y) > MaxDist) { continue; }
itemsInStack.Add(item2);
}
if (itemsInStack.Count > 1)
{
item1.CreateDroppedStack(itemsInStack, allowClientExecute: true);
DebugConsole.Log($"Merged x{itemsInStack.Count} of {item1.Name} into a dropped stack.");
}
}
}
public static void InitializeLoadedLinks(IEnumerable<MapEntity> entities)