Unstable 0.17.1.0
This commit is contained in:
@@ -18,6 +18,12 @@ namespace Barotrauma
|
||||
{
|
||||
partial class Level : Entity, IServerSerializable
|
||||
{
|
||||
public enum EventType
|
||||
{
|
||||
SingleDestructibleWall,
|
||||
GlobalDestructibleWall
|
||||
}
|
||||
|
||||
//all entities are disabled after they reach this depth
|
||||
public const int MaxEntityDepth = -300000;
|
||||
public const float ShaftHeight = 1000.0f;
|
||||
@@ -3136,13 +3142,14 @@ namespace Barotrauma
|
||||
UnsyncedExtraWalls[i].Update(deltaTime);
|
||||
}
|
||||
|
||||
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer)
|
||||
#if SERVER
|
||||
if (GameMain.NetworkMember is { IsServer: true })
|
||||
{
|
||||
foreach (LevelWall wall in ExtraWalls)
|
||||
{
|
||||
if (wall is DestructibleLevelWall destructibleWall && destructibleWall.NetworkUpdatePending)
|
||||
if (wall is DestructibleLevelWall { NetworkUpdatePending: true } destructibleWall)
|
||||
{
|
||||
GameMain.NetworkMember.CreateEntityEvent(this, new object[] { destructibleWall });
|
||||
GameMain.NetworkMember.CreateEntityEvent(this, new SingleLevelWallEventData(destructibleWall));
|
||||
destructibleWall.NetworkUpdatePending = false;
|
||||
}
|
||||
}
|
||||
@@ -3151,11 +3158,12 @@ namespace Barotrauma
|
||||
{
|
||||
if (ExtraWalls.Any(w => w.Body.BodyType != BodyType.Static))
|
||||
{
|
||||
GameMain.NetworkMember.CreateEntityEvent(this);
|
||||
GameMain.NetworkMember.CreateEntityEvent(this, new GlobalLevelWallEventData());
|
||||
}
|
||||
networkUpdateTimer = 0.0f;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CLIENT
|
||||
backgroundCreatureManager.Update(deltaTime, cam);
|
||||
@@ -4288,28 +4296,5 @@ namespace Barotrauma
|
||||
|
||||
Loaded = null;
|
||||
}
|
||||
|
||||
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null)
|
||||
{
|
||||
if (extraData != null && extraData.Length > 0 && extraData[0] is DestructibleLevelWall destructibleWall)
|
||||
{
|
||||
int index = ExtraWalls.IndexOf(destructibleWall);
|
||||
msg.Write(false);
|
||||
msg.Write((ushort)(index == -1 ? ushort.MaxValue : index));
|
||||
//write health using one byte
|
||||
msg.Write((byte)MathHelper.Clamp((int)(MathUtils.InverseLerp(0.0f, destructibleWall.MaxHealth, destructibleWall.Damage) * 255.0f), 0, 255));
|
||||
}
|
||||
else
|
||||
{
|
||||
msg.Write(true);
|
||||
foreach (LevelWall levelWall in ExtraWalls)
|
||||
{
|
||||
if (levelWall.Body.BodyType == BodyType.Static) { continue; }
|
||||
msg.Write(levelWall.Body.Position.X);
|
||||
msg.Write(levelWall.Body.Position.Y);
|
||||
msg.WriteRangedSingle(levelWall.MoveState, 0.0f, MathHelper.TwoPi, 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+15
-4
@@ -30,6 +30,16 @@ namespace Barotrauma
|
||||
{
|
||||
}
|
||||
|
||||
private readonly struct EventData : NetEntityEvent.IData
|
||||
{
|
||||
public readonly LevelObject LevelObject;
|
||||
|
||||
public EventData(LevelObject levelObject)
|
||||
{
|
||||
LevelObject = levelObject;
|
||||
}
|
||||
}
|
||||
|
||||
class SpawnPosition
|
||||
{
|
||||
public readonly GraphEdge GraphEdge;
|
||||
@@ -522,12 +532,12 @@ namespace Barotrauma
|
||||
|
||||
foreach (LevelObject obj in updateableObjects)
|
||||
{
|
||||
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer)
|
||||
if (GameMain.NetworkMember is { IsServer: true })
|
||||
{
|
||||
obj.NetworkUpdateTimer -= deltaTime;
|
||||
if (obj.NeedsNetworkSyncing && obj.NetworkUpdateTimer <= 0.0f)
|
||||
{
|
||||
GameMain.NetworkMember.CreateEntityEvent(this, new object[] { obj });
|
||||
GameMain.NetworkMember.CreateEntityEvent(this, new EventData(obj));
|
||||
obj.NeedsNetworkSyncing = false;
|
||||
obj.NetworkUpdateTimer = NetConfig.LevelObjectUpdateInterval;
|
||||
}
|
||||
@@ -607,9 +617,10 @@ namespace Barotrauma
|
||||
|
||||
partial void RemoveProjSpecific();
|
||||
|
||||
public void ServerWrite(IWriteMessage msg, Client c, object[] extraData = null)
|
||||
public void ServerEventWrite(IWriteMessage msg, Client c, NetEntityEvent.IData extraData = null)
|
||||
{
|
||||
LevelObject obj = extraData[0] as LevelObject;
|
||||
if (!(extraData is 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user