v0.11.0.9

This commit is contained in:
Joonas Rikkonen
2020-12-09 16:34:16 +02:00
parent bbf06f0984
commit f433a7ba10
325 changed files with 13947 additions and 3652 deletions
@@ -30,9 +30,9 @@ namespace Barotrauma
return other.SteamID == SteamID && other.ClientEndPoint == ClientEndPoint;
}
public void SpawnInventoryItems(CharacterInfo characterInfo, Inventory inventory)
public void SpawnInventoryItems(Character character, Inventory inventory)
{
characterInfo.SpawnInventoryItems(inventory, itemData);
character.SpawnInventoryItems(inventory, itemData);
}
public void ApplyHealthData(CharacterInfo characterInfo, Character character)
@@ -1,6 +1,6 @@
namespace Barotrauma
{
partial class MissionMode : GameMode
abstract partial class MissionMode : GameMode
{
public override void ShowStartMessage()
{
@@ -216,6 +216,9 @@ namespace Barotrauma
characterData.ForEach(cd => cd.HasSpawned = false);
petsElement = new XElement("pets");
PetBehavior.SavePets(petsElement);
//remove all items that are in someone's inventory
foreach (Character c in Character.CharacterList)
{
@@ -237,9 +240,6 @@ namespace Barotrauma
c.Inventory.DeleteAllItems();
}
petsElement = new XElement("pets");
PetBehavior.SavePets(petsElement);
yield return CoroutineStatus.Running;
if (leavingSub != Submarine.MainSub && !leavingSub.DockedTo.Contains(Submarine.MainSub))
@@ -0,0 +1,119 @@
#nullable enable
using System.Collections.Generic;
using System.Linq;
using Barotrauma.Networking;
namespace Barotrauma
{
internal partial class ReadyCheck
{
private static List<Client> ActivePlayers => GameMain.Server.ConnectedClients.Where(c => c != null && !c.Spectating && c.InGame).ToList();
public void InitializeReadyCheck(string author, Client? sender = null)
{
foreach (Client client in ActivePlayers)
{
if (client != null && !client.Spectating)
{
IWriteMessage msg = new WriteOnlyMessage();
msg.Write((byte) ServerPacketHeader.READY_CHECK);
msg.Write((byte) ReadyCheckState.Start);
msg.Write(endTime);
msg.Write(author);
if (sender != null)
{
msg.Write(true);
msg.Write(sender.ID);
}
else
{
msg.Write(false);
}
msg.Write((ushort) ActivePlayers.Count);
foreach (byte clientId in Clients.Keys)
{
msg.Write(clientId);
}
GameMain.Server.ServerPeer.Send(msg, client.Connection, DeliveryMethod.Reliable);
}
}
}
private void UpdateReadyCheck(byte otherClient, ReadyStatus state)
{
if (Clients.All(pair => pair.Value != ReadyStatus.Unanswered))
{
EndReadyCheck();
return;
}
foreach (Client client in ActivePlayers)
{
IWriteMessage msg = new WriteOnlyMessage();
msg.Write((byte) ServerPacketHeader.READY_CHECK);
msg.Write((byte) ReadyCheckState.Update);
msg.Write(time); // sync time
msg.Write((byte) state);
msg.Write(otherClient);
GameMain.Server.ServerPeer.Send(msg, client.Connection, DeliveryMethod.Reliable);
}
}
partial void EndReadyCheck()
{
if (IsFinished) { return; }
IsFinished = true;
foreach (Client client in ActivePlayers)
{
if (client != null && !client.Spectating)
{
IWriteMessage msg = new WriteOnlyMessage();
msg.Write((byte) ServerPacketHeader.READY_CHECK);
msg.Write((byte) ReadyCheckState.End);
msg.Write((ushort) Clients.Count);
foreach (var (id, state) in Clients)
{
msg.Write(id);
msg.Write((byte) state);
}
GameMain.Server.ServerPeer.Send(msg, client.Connection, DeliveryMethod.Reliable);
}
}
}
public static void ServerRead(IReadMessage inc, Client client)
{
ReadyCheckState state = (ReadyCheckState) inc.ReadByte();
ReadyCheck? readyCheck = GameMain.GameSession?.CrewManager?.ActiveReadyCheck;
switch (state)
{
case ReadyCheckState.Start when readyCheck == null:
StartReadyCheck(client.Name, client);
break;
case ReadyCheckState.Update when readyCheck != null:
ReadyStatus status = (ReadyStatus) inc.ReadByte();
if (!readyCheck.Clients.ContainsKey(client.ID)) { return; }
readyCheck.Clients[client.ID] = status;
readyCheck.UpdateReadyCheck(client.ID, status);
break;
}
}
public static void StartReadyCheck(string author, Client? sender = null)
{
if (GameMain.GameSession?.CrewManager == null || GameMain.GameSession.CrewManager.ActiveReadyCheck != null) { return; }
List<Client> connectedClients = GameMain.Server.ConnectedClients;
ReadyCheck newReadyCheck = new ReadyCheck(connectedClients.Where(c => !c.Spectating).Select(c => c.ID).ToList(), 30);
GameMain.GameSession.CrewManager.ActiveReadyCheck = newReadyCheck;
newReadyCheck.InitializeReadyCheck(author, sender);
}
}
}