v0.14.6.0

This commit is contained in:
Joonas Rikkonen
2021-06-17 17:54:52 +03:00
parent 3f324b14e8
commit c27e2ea5ab
348 changed files with 13156 additions and 4266 deletions
@@ -10,6 +10,11 @@ namespace Barotrauma.Networking
{
private DateTime despawnTime;
private float shuttleEmptyTimer;
private int pendingRespawnCount, requiredRespawnCount;
private int prevPendingRespawnCount, prevRequiredRespawnCount;
private IEnumerable<Client> GetClientsToRespawn()
{
MultiPlayerCampaign campaign = GameMain.GameSession.GameMode as MultiPlayerCampaign;
@@ -95,10 +100,19 @@ namespace Barotrauma.Networking
RespawnShuttle.Velocity = Vector2.Zero;
}
int clientsToRespawn = GetClientsToRespawn().Count();
pendingRespawnCount = GetClientsToRespawn().Count();
requiredRespawnCount = (int)Math.Max((float)GameMain.Server.ConnectedClients.Count * GameMain.Server.ServerSettings.MinRespawnRatio, 1.0f);
if (pendingRespawnCount != prevPendingRespawnCount ||
requiredRespawnCount != prevRequiredRespawnCount)
{
prevPendingRespawnCount = pendingRespawnCount;
prevRequiredRespawnCount = requiredRespawnCount;
GameMain.Server.CreateEntityEvent(this);
}
if (RespawnCountdownStarted)
{
if (clientsToRespawn == 0)
if (pendingRespawnCount == 0)
{
RespawnCountdownStarted = false;
GameMain.Server.CreateEntityEvent(this);
@@ -106,7 +120,7 @@ namespace Barotrauma.Networking
}
else
{
bool shouldStartCountdown = ShouldStartRespawnCountdown(clientsToRespawn);
bool shouldStartCountdown = ShouldStartRespawnCountdown(pendingRespawnCount);
if (shouldStartCountdown)
{
RespawnCountdownStarted = true;
@@ -167,8 +181,14 @@ namespace Barotrauma.Networking
}
}
partial void UpdateReturningProjSpecific()
partial void UpdateReturningProjSpecific(float deltaTime)
{
//speed up despawning if there's no-one inside the shuttle
if (despawnTime > DateTime.Now + new TimeSpan(0, 0, seconds: 30) && CheckShuttleEmpty(deltaTime))
{
despawnTime = DateTime.Now + new TimeSpan(0, 0, seconds: 30);
}
foreach (Door door in shuttleDoors)
{
if (door.IsOpen) door.TrySetState(false, false, true);
@@ -214,7 +234,7 @@ namespace Barotrauma.Networking
if (!ReturnCountdownStarted)
{
//if there are no living chracters inside, transporting can be stopped immediately
if (!Character.CharacterList.Any(c => c.Submarine == RespawnShuttle && !c.IsDead))
if (CheckShuttleEmpty(deltaTime))
{
ReturnTime = DateTime.Now;
ReturnCountdownStarted = true;
@@ -232,6 +252,10 @@ namespace Barotrauma.Networking
GameMain.Server.CreateEntityEvent(this);
}
}
else if (CheckShuttleEmpty(deltaTime))
{
ReturnTime = DateTime.Now;
}
if (DateTime.Now > ReturnTime)
{
@@ -245,6 +269,19 @@ namespace Barotrauma.Networking
}
}
private bool CheckShuttleEmpty(float deltaTime)
{
if (!Character.CharacterList.Any(c => c.Submarine == RespawnShuttle && !c.IsDead))
{
shuttleEmptyTimer += deltaTime;
}
else
{
shuttleEmptyTimer = 0.0f;
}
return shuttleEmptyTimer > 1.0f;
}
partial void RespawnCharactersProjSpecific(Vector2? shuttlePos)
{
var respawnSub = RespawnShuttle ?? Submarine.MainSub;
@@ -394,7 +431,7 @@ namespace Barotrauma.Networking
else
{
characterData.SpawnInventoryItems(character, character.Inventory);
characterData.ApplyHealthData(character.Info, character);
characterData.ApplyHealthData(character);
character.GiveIdCardTags(mainSubSpawnPoints[i]);
characterData.HasSpawned = true;
}
@@ -427,6 +464,8 @@ namespace Barotrauma.Networking
msg.Write((float)(ReturnTime - DateTime.Now).TotalSeconds);
break;
case State.Waiting:
msg.Write((ushort)pendingRespawnCount);
msg.Write((ushort)requiredRespawnCount);
msg.Write(RespawnCountdownStarted);
msg.Write((float)(RespawnTime - DateTime.Now).TotalSeconds);
break;