Build 1.1.4.0
This commit is contained in:
+40
-19
@@ -235,9 +235,22 @@ namespace Barotrauma
|
||||
SpawnPosition spawnPosition = ToolBox.SelectWeightedRandom(suitableSpawnPositions[prefab], spawnPositionWeights[prefab], Rand.RandSync.ServerAndClient);
|
||||
if (spawnPosition == null && prefab.SpawnPos != LevelObjectPrefab.SpawnPosType.None) { continue; }
|
||||
PlaceObject(prefab, spawnPosition, level, cave);
|
||||
if (prefab.MaxCount < amount)
|
||||
if (amount > prefab.MaxCount && objects.Count > prefab.MaxCount)
|
||||
{
|
||||
if (objects.Count(o => o.Prefab == prefab && o.ParentCave == cave) >= prefab.MaxCount)
|
||||
bool maxReached = false;
|
||||
int objectCount = 0;
|
||||
for (int j = 0; j < objects.Count; j++)
|
||||
{
|
||||
if (objects[j].Prefab == prefab && objects[j].ParentCave == cave)
|
||||
{
|
||||
objectCount++;
|
||||
if (objectCount >= prefab.MaxCount)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (objectCount >= prefab.MaxCount)
|
||||
{
|
||||
availablePrefabs.Remove(prefab);
|
||||
}
|
||||
@@ -350,8 +363,8 @@ namespace Barotrauma
|
||||
|
||||
private void AddObject(LevelObject newObject, Level level)
|
||||
{
|
||||
if (newObject.Triggers != null)
|
||||
{
|
||||
if (newObject.Triggers != null)
|
||||
{
|
||||
foreach (LevelTrigger trigger in newObject.Triggers)
|
||||
{
|
||||
trigger.OnTriggered += (levelTrigger, obj) =>
|
||||
@@ -360,7 +373,7 @@ namespace Barotrauma
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var spriteCorners = new List<Vector2>
|
||||
{
|
||||
Vector2.Zero, Vector2.Zero, Vector2.Zero, Vector2.Zero
|
||||
@@ -393,11 +406,11 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
|
||||
float minX = spriteCorners.Min(c => c.X) - newObject.Position.Z;
|
||||
float maxX = spriteCorners.Max(c => c.X) + newObject.Position.Z;
|
||||
float minX = spriteCorners.Min(c => c.X) - newObject.Position.Z / 10000.0f;
|
||||
float maxX = spriteCorners.Max(c => c.X) + newObject.Position.Z / 10000.0f;
|
||||
|
||||
float minY = spriteCorners.Min(c => c.Y) - newObject.Position.Z - level.BottomPos;
|
||||
float maxY = spriteCorners.Max(c => c.Y) + newObject.Position.Z - level.BottomPos;
|
||||
float minY = spriteCorners.Min(c => c.Y) - newObject.Position.Z / 10000.0f - level.BottomPos;
|
||||
float maxY = spriteCorners.Max(c => c.Y) + newObject.Position.Z / 10000.0f - level.BottomPos;
|
||||
|
||||
if (newObject.Triggers != null)
|
||||
{
|
||||
@@ -436,11 +449,11 @@ namespace Barotrauma
|
||||
|
||||
int xStart = (int)Math.Floor(minX / GridSize);
|
||||
int xEnd = (int)Math.Floor(maxX / GridSize);
|
||||
if (xEnd < 0 || xStart >= objectGrid.GetLength(0)) return;
|
||||
if (xEnd < 0 || xStart >= objectGrid.GetLength(0)) { return; }
|
||||
|
||||
int yStart = (int)Math.Floor(minY / GridSize);
|
||||
int yEnd = (int)Math.Floor(maxY / GridSize);
|
||||
if (yEnd < 0 || yStart >= objectGrid.GetLength(1)) return;
|
||||
if (yEnd < 0 || yStart >= objectGrid.GetLength(1)) { return; }
|
||||
|
||||
xStart = Math.Max(xStart, 0);
|
||||
xEnd = Math.Min(xEnd, objectGrid.GetLength(0) - 1);
|
||||
@@ -451,13 +464,21 @@ namespace Barotrauma
|
||||
{
|
||||
for (int y = yStart; y <= yEnd; y++)
|
||||
{
|
||||
if (objectGrid[x, y] == null) objectGrid[x, y] = new List<LevelObject>();
|
||||
objectGrid[x, y].Add(newObject);
|
||||
var list = objectGrid[x, y];
|
||||
if (objectGrid[x, y] == null) { list = objectGrid[x, y] = new List<LevelObject>(); }
|
||||
|
||||
//insertion sort in ascending order (= prefer rendering objects in front)
|
||||
int drawOrderIndex = 0;
|
||||
while (drawOrderIndex < list.Count && list[drawOrderIndex].Position.Z < newObject.Position.Z)
|
||||
{
|
||||
drawOrderIndex++;
|
||||
}
|
||||
list.Insert(drawOrderIndex, newObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Microsoft.Xna.Framework.Point GetGridIndices(Vector2 worldPosition)
|
||||
public static Microsoft.Xna.Framework.Point GetGridIndices(Vector2 worldPosition)
|
||||
{
|
||||
return new Microsoft.Xna.Framework.Point(
|
||||
(int)Math.Floor(worldPosition.X / GridSize),
|
||||
@@ -500,7 +521,7 @@ namespace Barotrauma
|
||||
return objectsInRange;
|
||||
}
|
||||
|
||||
private List<SpawnPosition> GetAvailableSpawnPositions(IEnumerable<VoronoiCell> cells, LevelObjectPrefab.SpawnPosType spawnPosType, bool checkFlags = true)
|
||||
private static List<SpawnPosition> GetAvailableSpawnPositions(IEnumerable<VoronoiCell> cells, LevelObjectPrefab.SpawnPosType spawnPosType, bool checkFlags = true)
|
||||
{
|
||||
List<LevelObjectPrefab.SpawnPosType> spawnPosTypes = new List<LevelObjectPrefab.SpawnPosType>(4);
|
||||
List<SpawnPosition> availableSpawnPositions = new List<SpawnPosition>();
|
||||
@@ -593,12 +614,12 @@ namespace Barotrauma
|
||||
if (obj == triggeredObject || obj.Triggers == null) { continue; }
|
||||
foreach (LevelTrigger otherTrigger in obj.Triggers)
|
||||
{
|
||||
otherTrigger.OtherTriggered(triggeredObject, trigger);
|
||||
otherTrigger.OtherTriggered(trigger, triggerer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private LevelObjectPrefab GetRandomPrefab(Level level, IList<LevelObjectPrefab> availablePrefabs)
|
||||
private static LevelObjectPrefab GetRandomPrefab(Level level, IList<LevelObjectPrefab> availablePrefabs)
|
||||
{
|
||||
if (availablePrefabs.Sum(p => p.GetCommonness(level.LevelData)) <= 0.0f) { return null; }
|
||||
return ToolBox.SelectWeightedRandom(
|
||||
@@ -606,7 +627,7 @@ namespace Barotrauma
|
||||
availablePrefabs.Select(p => p.GetCommonness(level.LevelData)).ToList(), Rand.RandSync.ServerAndClient);
|
||||
}
|
||||
|
||||
private LevelObjectPrefab GetRandomPrefab(CaveGenerationParams caveParams, IList<LevelObjectPrefab> availablePrefabs, bool requireCaveSpecificOverride)
|
||||
private static LevelObjectPrefab GetRandomPrefab(CaveGenerationParams caveParams, IList<LevelObjectPrefab> availablePrefabs, bool requireCaveSpecificOverride)
|
||||
{
|
||||
if (availablePrefabs.Sum(p => p.GetCommonness(caveParams, requireCaveSpecificOverride)) <= 0.0f) { return null; }
|
||||
return ToolBox.SelectWeightedRandom(
|
||||
@@ -634,7 +655,7 @@ namespace Barotrauma
|
||||
|
||||
public void ServerEventWrite(IWriteMessage msg, Client c, NetEntityEvent.IData extraData = null)
|
||||
{
|
||||
if (!(extraData is EventData eventData)) { throw new Exception($"Malformed LevelObjectManager event: expected {nameof(LevelObjectManager)}.{nameof(EventData)}"); }
|
||||
if (extraData is not EventData eventData) { throw new Exception($"Malformed LevelObjectManager event: expected {nameof(LevelObjectManager)}.{nameof(EventData)}"); }
|
||||
LevelObject obj = eventData.LevelObject;
|
||||
msg.WriteRangedInteger(objects.IndexOf(obj), 0, objects.Count);
|
||||
obj.ServerWrite(msg, c);
|
||||
|
||||
+3
-3
@@ -129,7 +129,7 @@ namespace Barotrauma
|
||||
private set;
|
||||
}
|
||||
|
||||
[Serialize("0.0,1.0", IsPropertySaveable.Yes), Editable]
|
||||
[Serialize("0.0,1.0", IsPropertySaveable.Yes, description: "The sprite depth of the object (min, max). Values of 0 or less make the object render in front of walls, values larger than 0 make it render behind walls with a parallax effect."), Editable]
|
||||
public Vector2 DepthRange
|
||||
{
|
||||
get;
|
||||
@@ -273,14 +273,14 @@ namespace Barotrauma
|
||||
private set;
|
||||
}
|
||||
|
||||
[Serialize(false, IsPropertySaveable.Yes), Editable]
|
||||
[Serialize(false, IsPropertySaveable.Yes, description: "Should the object disappear if the object is destroyed? Only relevant if TakeLevelWallDamage is true."), Editable]
|
||||
public bool HideWhenBroken
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
[Serialize(100.0f, IsPropertySaveable.Yes), Editable]
|
||||
[Serialize(100.0f, IsPropertySaveable.Yes, description: "Amount of health the object has. Only relevant if TakeLevelWallDamage is true."), Editable]
|
||||
public float Health
|
||||
{
|
||||
get;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Barotrauma.Networking;
|
||||
using Barotrauma.Extensions;
|
||||
using Barotrauma.Networking;
|
||||
using FarseerPhysics;
|
||||
using FarseerPhysics.Dynamics;
|
||||
using FarseerPhysics.Dynamics.Contacts;
|
||||
@@ -215,7 +216,7 @@ namespace Barotrauma
|
||||
PhysicsBody.FarseerBody.SetIsSensor(element.GetAttributeBool("sensor", true));
|
||||
PhysicsBody.FarseerBody.BodyType = BodyType.Static;
|
||||
|
||||
ColliderRadius = ConvertUnits.ToDisplayUnits(Math.Max(Math.Max(PhysicsBody.radius, PhysicsBody.width / 2.0f), PhysicsBody.height / 2.0f));
|
||||
ColliderRadius = ConvertUnits.ToDisplayUnits(Math.Max(Math.Max(PhysicsBody.Radius, PhysicsBody.Width / 2.0f), PhysicsBody.Height / 2.0f));
|
||||
|
||||
PhysicsBody.SetTransform(ConvertUnits.ToSimUnits(position), rotation);
|
||||
}
|
||||
@@ -470,7 +471,7 @@ namespace Barotrauma
|
||||
/// <summary>
|
||||
/// Another trigger was triggered, check if this one should react to it
|
||||
/// </summary>
|
||||
public void OtherTriggered(LevelObject levelObject, LevelTrigger otherTrigger)
|
||||
public void OtherTriggered(LevelTrigger otherTrigger, Entity triggerer)
|
||||
{
|
||||
if (!triggeredBy.HasFlag(TriggererType.OtherTrigger) || stayTriggeredDelay <= 0.0f) { return; }
|
||||
|
||||
@@ -486,7 +487,16 @@ namespace Barotrauma
|
||||
triggeredTimer = stayTriggeredDelay;
|
||||
if (!wasAlreadyTriggered)
|
||||
{
|
||||
OnTriggered?.Invoke(this, null);
|
||||
if (!IsTriggeredByEntity(triggerer, triggeredBy, mustBeOutside: true)) { return; }
|
||||
if (!triggerers.Contains(triggerer))
|
||||
{
|
||||
if (!IsTriggered)
|
||||
{
|
||||
OnTriggered?.Invoke(this, triggerer);
|
||||
}
|
||||
TriggererPosition[triggerer] = triggerer.WorldPosition;
|
||||
triggerers.Add(triggerer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -658,6 +668,10 @@ namespace Barotrauma
|
||||
{
|
||||
effect.Apply(effect.type, deltaTime, triggerer, item.AllPropertyObjects, position);
|
||||
}
|
||||
else if (triggerer is Submarine sub)
|
||||
{
|
||||
effect.Apply(effect.type, deltaTime, sub, Array.Empty<ISerializableEntity>(), position);
|
||||
}
|
||||
if (effect.HasTargetType(StatusEffect.TargetType.NearbyItems) || effect.HasTargetType(StatusEffect.TargetType.NearbyCharacters))
|
||||
{
|
||||
targets.Clear();
|
||||
@@ -747,7 +761,7 @@ namespace Barotrauma
|
||||
Vector2 baseVel = GetWaterFlowVelocity();
|
||||
if (baseVel.LengthSquared() < 0.1f) return Vector2.Zero;
|
||||
|
||||
float triggerSize = ConvertUnits.ToDisplayUnits(Math.Max(Math.Max(PhysicsBody.radius, PhysicsBody.width / 2.0f), PhysicsBody.height / 2.0f));
|
||||
float triggerSize = ConvertUnits.ToDisplayUnits(Math.Max(Math.Max(PhysicsBody.Radius, PhysicsBody.Width / 2.0f), PhysicsBody.Height / 2.0f));
|
||||
float dist = Vector2.Distance(viewPosition, WorldPosition);
|
||||
if (dist > triggerSize) return Vector2.Zero;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user