(5d67aa3f5) Merge remote-tracking branch 'origin/dev' into enemy-ai
This commit is contained in:
@@ -1,14 +1,13 @@
|
|||||||
using Barotrauma.Networking;
|
using Barotrauma.Networking;
|
||||||
using Barotrauma.Particles;
|
using Barotrauma.Particles;
|
||||||
using Barotrauma.Sounds;
|
using Barotrauma.Sounds;
|
||||||
|
using Lidgren.Network;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
using Microsoft.Xna.Framework.Input;
|
using Microsoft.Xna.Framework.Input;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Microsoft.Xna.Framework.Input;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Lidgren.Network;
|
|
||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
@@ -19,6 +18,8 @@ namespace Barotrauma
|
|||||||
private List<Decal> decals = new List<Decal>();
|
private List<Decal> decals = new List<Decal>();
|
||||||
|
|
||||||
private float serverUpdateDelay;
|
private float serverUpdateDelay;
|
||||||
|
private float remoteWaterVolume, remoteOxygenPercentage;
|
||||||
|
private List<Vector3> remoteFireSources;
|
||||||
|
|
||||||
private bool networkUpdatePending;
|
private bool networkUpdatePending;
|
||||||
private float networkUpdateTimer;
|
private float networkUpdateTimer;
|
||||||
@@ -139,6 +140,10 @@ namespace Barotrauma
|
|||||||
partial void UpdateProjSpecific(float deltaTime, Camera cam)
|
partial void UpdateProjSpecific(float deltaTime, Camera cam)
|
||||||
{
|
{
|
||||||
serverUpdateDelay -= deltaTime;
|
serverUpdateDelay -= deltaTime;
|
||||||
|
if (serverUpdateDelay <= 0.0f)
|
||||||
|
{
|
||||||
|
ApplyRemoteState();
|
||||||
|
}
|
||||||
|
|
||||||
if (networkUpdatePending)
|
if (networkUpdatePending)
|
||||||
{
|
{
|
||||||
@@ -547,18 +552,18 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public void ClientRead(ServerNetObject type, NetBuffer message, float sendingTime)
|
public void ClientRead(ServerNetObject type, NetBuffer message, float sendingTime)
|
||||||
{
|
{
|
||||||
float newWaterVolume = message.ReadRangedSingle(0.0f, 1.5f, 8) * Volume;
|
remoteWaterVolume = message.ReadRangedSingle(0.0f, 1.5f, 8) * Volume;
|
||||||
float newOxygenPercentage = message.ReadRangedSingle(0.0f, 100.0f, 8);
|
remoteOxygenPercentage = message.ReadRangedSingle(0.0f, 100.0f, 8);
|
||||||
|
|
||||||
bool hasFireSources = message.ReadBoolean();
|
bool hasFireSources = message.ReadBoolean();
|
||||||
int fireSourceCount = 0;
|
int fireSourceCount = 0;
|
||||||
List<Vector3> newFireSources = new List<Vector3>();
|
remoteFireSources = new List<Vector3>();
|
||||||
if (hasFireSources)
|
if (hasFireSources)
|
||||||
{
|
{
|
||||||
fireSourceCount = message.ReadRangedInteger(0, 16);
|
fireSourceCount = message.ReadRangedInteger(0, 16);
|
||||||
for (int i = 0; i < fireSourceCount; i++)
|
for (int i = 0; i < fireSourceCount; i++)
|
||||||
{
|
{
|
||||||
newFireSources.Add(new Vector3(
|
remoteFireSources.Add(new Vector3(
|
||||||
MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f),
|
MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f),
|
||||||
MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f),
|
MathHelper.Clamp(message.ReadRangedSingle(0.0f, 1.0f, 8), 0.05f, 0.95f),
|
||||||
message.ReadRangedSingle(0.0f, 1.0f, 8)));
|
message.ReadRangedSingle(0.0f, 1.0f, 8)));
|
||||||
@@ -567,41 +572,6 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (serverUpdateDelay > 0.0f) { return; }
|
if (serverUpdateDelay > 0.0f) { return; }
|
||||||
|
|
||||||
WaterVolume = newWaterVolume;
|
|
||||||
OxygenPercentage = newOxygenPercentage;
|
|
||||||
|
|
||||||
for (int i = 0; i < fireSourceCount; i++)
|
|
||||||
{
|
|
||||||
Vector2 pos = new Vector2(
|
|
||||||
rect.X + rect.Width * newFireSources[i].X,
|
|
||||||
rect.Y - rect.Height + (rect.Height * newFireSources[i].Y));
|
|
||||||
float size = newFireSources[i].Z * rect.Width;
|
|
||||||
|
|
||||||
var newFire = i < FireSources.Count ?
|
|
||||||
FireSources[i] :
|
|
||||||
new FireSource(Submarine == null ? pos : pos + Submarine.Position, null, true);
|
|
||||||
newFire.Position = pos;
|
|
||||||
newFire.Size = new Vector2(size, newFire.Size.Y);
|
|
||||||
|
|
||||||
//ignore if the fire wasn't added to this room (invalid position)?
|
|
||||||
if (!FireSources.Contains(newFire))
|
|
||||||
{
|
|
||||||
newFire.Remove();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = FireSources.Count - 1; i >= fireSourceCount; i--)
|
|
||||||
{
|
|
||||||
FireSources[i].Remove();
|
|
||||||
if (i < FireSources.Count)
|
|
||||||
{
|
|
||||||
FireSources.RemoveAt(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (serverUpdateDelay > 0.0f) { return; }
|
|
||||||
|
|
||||||
ApplyRemoteState();
|
ApplyRemoteState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,16 @@ namespace Barotrauma
|
|||||||
partial void UpdateProjSpecific(float deltaTime, Camera cam)
|
partial void UpdateProjSpecific(float deltaTime, Camera cam)
|
||||||
{
|
{
|
||||||
if (IdFreed) { return; }
|
if (IdFreed) { return; }
|
||||||
|
|
||||||
|
//don't create updates if all clients are very far from the hull
|
||||||
|
float hullUpdateDistanceSqr = NetConfig.HullUpdateDistance * NetConfig.HullUpdateDistance;
|
||||||
|
if (!GameMain.Server.ConnectedClients.Any(c =>
|
||||||
|
c.Character != null &&
|
||||||
|
Vector2.DistanceSquared(c.Character.WorldPosition, WorldPosition) < hullUpdateDistanceSqr))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//update client hulls if the amount of water has changed by >10%
|
//update client hulls if the amount of water has changed by >10%
|
||||||
//or if oxygen percentage has changed by 5%
|
//or if oxygen percentage has changed by 5%
|
||||||
if (Math.Abs(lastSentVolume - waterVolume) > Volume * 0.1f ||
|
if (Math.Abs(lastSentVolume - waterVolume) > Volume * 0.1f ||
|
||||||
@@ -31,8 +41,8 @@ namespace Barotrauma
|
|||||||
GameMain.NetworkMember.CreateEntityEvent(this);
|
GameMain.NetworkMember.CreateEntityEvent(this);
|
||||||
lastSentVolume = waterVolume;
|
lastSentVolume = waterVolume;
|
||||||
lastSentOxygen = OxygenPercentage;
|
lastSentOxygen = OxygenPercentage;
|
||||||
sendUpdateTimer = NetworkUpdateInterval;
|
sendUpdateTimer = NetConfig.HullUpdateInterval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -332,7 +332,8 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (NetEntityEvent entityEvent in sentEvents)
|
//too many events for one packet
|
||||||
|
if (eventsToSync.Count > 200)
|
||||||
{
|
{
|
||||||
msg.Write((byte)ServerNetObject.ENTITY_EVENT_INITIAL);
|
msg.Write((byte)ServerNetObject.ENTITY_EVENT_INITIAL);
|
||||||
msg.Write(client.UnreceivedEntityEventCount);
|
msg.Write(client.UnreceivedEntityEventCount);
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ namespace Barotrauma
|
|||||||
DockingPort myPort = null, outPostPort = null;
|
DockingPort myPort = null, outPostPort = null;
|
||||||
foreach (DockingPort port in DockingPort.List)
|
foreach (DockingPort port in DockingPort.List)
|
||||||
{
|
{
|
||||||
if (port.IsHorizontal) { continue; }
|
if (port.IsHorizontal || port.Docked) { continue; }
|
||||||
if (port.Item.Submarine == level.StartOutpost)
|
if (port.Item.Submarine == level.StartOutpost)
|
||||||
{
|
{
|
||||||
outPostPort = port;
|
outPostPort = port;
|
||||||
|
|||||||
@@ -175,12 +175,11 @@ namespace Barotrauma
|
|||||||
LimitSize();
|
LimitSize();
|
||||||
|
|
||||||
UpdateProjSpecific(growModifier);
|
UpdateProjSpecific(growModifier);
|
||||||
|
|
||||||
#if CLIENT
|
if (size.X < 1.0f && (GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer))
|
||||||
if (GameMain.Client != null) return;
|
{
|
||||||
#endif
|
Remove();
|
||||||
|
}
|
||||||
if (size.X < 1.0f) Remove();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
partial void UpdateProjSpecific(float growModifier);
|
partial void UpdateProjSpecific(float growModifier);
|
||||||
@@ -293,10 +292,6 @@ namespace Barotrauma
|
|||||||
//evaporate some of the water
|
//evaporate some of the water
|
||||||
hull.WaterVolume -= extinguishAmount;
|
hull.WaterVolume -= extinguishAmount;
|
||||||
|
|
||||||
#if CLIENT
|
|
||||||
if (GameMain.Client != null) return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (size.X < 1.0f && (GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer))
|
if (size.X < 1.0f && (GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer))
|
||||||
{
|
{
|
||||||
Remove();
|
Remove();
|
||||||
@@ -325,12 +320,11 @@ namespace Barotrauma
|
|||||||
size.X -= extinguishAmount;
|
size.X -= extinguishAmount;
|
||||||
|
|
||||||
hull.WaterVolume -= extinguishAmount;
|
hull.WaterVolume -= extinguishAmount;
|
||||||
|
|
||||||
#if CLIENT
|
if (size.X < 1.0f && (GameMain.NetworkMember == null || GameMain.NetworkMember.IsServer))
|
||||||
if (GameMain.Client != null) return;
|
{
|
||||||
#endif
|
Remove();
|
||||||
|
}
|
||||||
if (size.X < 1.0f) Remove();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Extinguish(float deltaTime, float amount, Vector2 worldPosition)
|
public void Extinguish(float deltaTime, float amount, Vector2 worldPosition)
|
||||||
|
|||||||
@@ -1522,14 +1522,40 @@ namespace Barotrauma
|
|||||||
outpost.MakeOutpost();
|
outpost.MakeOutpost();
|
||||||
|
|
||||||
Point? minSize = null;
|
Point? minSize = null;
|
||||||
|
DockingPort subPort = null;
|
||||||
if (Submarine.MainSub != null)
|
if (Submarine.MainSub != null)
|
||||||
{
|
{
|
||||||
Point subSize = Submarine.MainSub.GetDockedBorders().Size;
|
Point subSize = Submarine.MainSub.GetDockedBorders().Size;
|
||||||
Point outpostSize = outpost.GetDockedBorders().Size;
|
Point outpostSize = outpost.GetDockedBorders().Size;
|
||||||
minSize = new Point(Math.Max(subSize.X, outpostSize.X), subSize.Y + outpostSize.Y);
|
minSize = new Point(Math.Max(subSize.X, outpostSize.X), subSize.Y + outpostSize.Y);
|
||||||
|
|
||||||
|
float closestDistance = float.MaxValue;
|
||||||
|
foreach (DockingPort port in DockingPort.List)
|
||||||
|
{
|
||||||
|
if (port.IsHorizontal || port.Docked) { continue; }
|
||||||
|
if (port.Item.Submarine != Submarine.MainSub) { continue; }
|
||||||
|
//the submarine port has to be at the top of the sub
|
||||||
|
if (port.Item.WorldPosition.Y < Submarine.MainSub.WorldPosition.Y) { continue; }
|
||||||
|
float dist = Math.Abs(port.Item.WorldPosition.X - Submarine.MainSub.WorldPosition.X);
|
||||||
|
if (dist < closestDistance)
|
||||||
|
{
|
||||||
|
subPort = port;
|
||||||
|
closestDistance = dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
outpost.SetPosition(outpost.FindSpawnPos(i == 0 ? StartPosition : EndPosition, minSize));
|
float subDockingPortOffset = subPort == null ? 0.0f : subPort.Item.WorldPosition.X - Submarine.MainSub.WorldPosition.X;
|
||||||
|
//don't try to compensate if the port is very far from the sub's center of mass
|
||||||
|
if (Math.Abs(subDockingPortOffset) > 2000.0f)
|
||||||
|
{
|
||||||
|
subDockingPortOffset = MathHelper.Clamp(subDockingPortOffset, -2000.0f, 2000.0f);
|
||||||
|
string warningMsg = "Docking port very far from the sub's center of mass (submarine: " + Submarine.MainSub.Name + ", dist: " + subDockingPortOffset + "). The level generator may not be able to place the outpost so that docking is possible.";
|
||||||
|
DebugConsole.NewMessage(warningMsg, Color.Orange);
|
||||||
|
GameAnalyticsManager.AddErrorEventOnce("Lever.CreateOutposts:DockingPortVeryFar" + Submarine.MainSub.Name, GameAnalyticsSDK.Net.EGAErrorSeverity.Warning, warningMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
outpost.SetPosition(outpost.FindSpawnPos(i == 0 ? StartPosition : EndPosition, minSize, subDockingPortOffset));
|
||||||
if ((i == 0) == !Mirrored)
|
if ((i == 0) == !Mirrored)
|
||||||
{
|
{
|
||||||
StartOutpost = outpost;
|
StartOutpost = outpost;
|
||||||
|
|||||||
@@ -432,12 +432,16 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (ForceFluctuationStrength > 0.0f)
|
if (ForceFluctuationStrength > 0.0f)
|
||||||
{
|
{
|
||||||
forceFluctuationTimer += deltaTime;
|
//no need for force fluctuation (or network updates) if the trigger limits velocity and there are no triggerers
|
||||||
if (forceFluctuationTimer > ForceFluctuationInterval)
|
if (forceMode != TriggerForceMode.LimitVelocity || triggerers.Any())
|
||||||
{
|
{
|
||||||
NeedsNetworkSyncing = true;
|
forceFluctuationTimer += deltaTime;
|
||||||
currentForceFluctuation = Rand.Range(1.0f - ForceFluctuationStrength, 1.0f);
|
if (forceFluctuationTimer > ForceFluctuationInterval)
|
||||||
forceFluctuationTimer = 0.0f;
|
{
|
||||||
|
NeedsNetworkSyncing = true;
|
||||||
|
currentForceFluctuation = Rand.Range(1.0f - ForceFluctuationStrength, 1.0f);
|
||||||
|
forceFluctuationTimer = 0.0f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -494,7 +494,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector2 FindSpawnPos(Vector2 spawnPos, Point? submarineSize = null)
|
public Vector2 FindSpawnPos(Vector2 spawnPos, Point? submarineSize = null, float subDockingPortOffset = 0.0f)
|
||||||
{
|
{
|
||||||
Rectangle dockedBorders = GetDockedBorders();
|
Rectangle dockedBorders = GetDockedBorders();
|
||||||
Vector2 diffFromDockedBorders =
|
Vector2 diffFromDockedBorders =
|
||||||
@@ -542,17 +542,17 @@ namespace Barotrauma
|
|||||||
else if (minX < 0)
|
else if (minX < 0)
|
||||||
{
|
{
|
||||||
//no wall found at the left side, spawn to the left from the right-side wall
|
//no wall found at the left side, spawn to the left from the right-side wall
|
||||||
spawnPos.X = maxX - minWidth - 100.0f;
|
spawnPos.X = maxX - minWidth - 100.0f + subDockingPortOffset;
|
||||||
}
|
}
|
||||||
else if (maxX > Level.Loaded.Size.X)
|
else if (maxX > Level.Loaded.Size.X)
|
||||||
{
|
{
|
||||||
//no wall found at right side, spawn to the right from the left-side wall
|
//no wall found at right side, spawn to the right from the left-side wall
|
||||||
spawnPos.X = minX + minWidth + 100.0f;
|
spawnPos.X = minX + minWidth + 100.0f + subDockingPortOffset;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//walls found at both sides, use their midpoint
|
//walls found at both sides, use their midpoint
|
||||||
spawnPos.X = (minX + maxX) / 2;
|
spawnPos.X = (minX + maxX) / 2 + subDockingPortOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
spawnPos.Y = Math.Min(spawnPos.Y, Level.Loaded.Size.Y - dockedBorders.Height / 2 - 10);
|
spawnPos.Y = Math.Min(spawnPos.Y, Level.Loaded.Size.Y - dockedBorders.Height / 2 - 10);
|
||||||
|
|||||||
@@ -35,8 +35,9 @@ namespace Barotrauma.Networking
|
|||||||
public const float DeleteDisconnectedTime = 20.0f;
|
public const float DeleteDisconnectedTime = 20.0f;
|
||||||
|
|
||||||
public const float ItemConditionUpdateInterval = 0.15f;
|
public const float ItemConditionUpdateInterval = 0.15f;
|
||||||
|
|
||||||
public const float LevelObjectUpdateInterval = 0.5f;
|
public const float LevelObjectUpdateInterval = 0.5f;
|
||||||
|
public const float HullUpdateInterval = 0.5f;
|
||||||
|
public const float HullUpdateDistance = 20000.0f;
|
||||||
|
|
||||||
public const int MaxEventPacketsPerUpdate = 4;
|
public const int MaxEventPacketsPerUpdate = 4;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user