diff --git a/.vs/Subsurface_Solution/v14/.suo b/.vs/Subsurface_Solution/v14/.suo index fab9934e5..a395e4ba0 100644 Binary files a/.vs/Subsurface_Solution/v14/.suo and b/.vs/Subsurface_Solution/v14/.suo differ diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 8b149cc8d..abfc37b62 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -373,7 +373,7 @@ namespace Barotrauma.Networking } } - var message = ComposeNetworkEventMessage(true); + var message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableChannel); if (message != null) { ReliableMessage reliableMessage = reliableChannel.CreateMessage(); @@ -383,9 +383,12 @@ namespace Barotrauma.Networking reliableChannel.SendMessage(reliableMessage, client.ServerConnection); } - message = ComposeNetworkEventMessage(false); + message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.Unreliable); if (message != null) client.SendMessage(message, NetDeliveryMethod.Unreliable); - + + message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLindgren); + if (message != null) client.SendMessage(message, NetDeliveryMethod.ReliableUnordered); + //foreach (NetworkEvent networkEvent in NetworkEvent.Events) //{ // if (networkEvent.IsImportant) diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 1a4f3374c..f6fdbd56c 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -632,7 +632,7 @@ namespace Barotrauma.Networking foreach (Client c in recipients) { - var message = ComposeNetworkEventMessage(true, c.Connection); + var message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableChannel, c.Connection); if (message != null) { ReliableMessage reliableMessage = c.ReliableChannel.CreateMessage(); @@ -642,7 +642,13 @@ namespace Barotrauma.Networking c.ReliableChannel.SendMessage(reliableMessage, c.Connection); } - message = ComposeNetworkEventMessage(false, c.Connection); + message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.ReliableLindgren, c.Connection); + if (message!=null) + { + server.SendMessage(message, c.Connection, NetDeliveryMethod.ReliableUnordered); + } + + message = ComposeNetworkEventMessage(NetworkEventDeliveryMethod.Unreliable, c.Connection); if (message != null) { server.SendMessage(message, c.Connection, NetDeliveryMethod.Unreliable, 0); diff --git a/Subsurface/Source/Networking/NetworkEvent.cs b/Subsurface/Source/Networking/NetworkEvent.cs index 17e22e8d7..c2cea2427 100644 --- a/Subsurface/Source/Networking/NetworkEvent.cs +++ b/Subsurface/Source/Networking/NetworkEvent.cs @@ -4,6 +4,13 @@ using System; namespace Barotrauma.Networking { + enum NetworkEventDeliveryMethod + { + Unreliable = 0, + ReliableChannel = 1, + ReliableLindgren = 2 + } + enum NetworkEventType { EntityUpdate = 0, @@ -28,27 +35,27 @@ namespace Barotrauma.Networking { public static List Events = new List(); - private static bool[] isImportant; + private static NetworkEventDeliveryMethod[] deliveryMethod; private static bool[] overridePrevious; static NetworkEvent() { - isImportant = new bool[Enum.GetNames(typeof(NetworkEventType)).Length]; - isImportant[(int)NetworkEventType.ImportantEntityUpdate] = true; - isImportant[(int)NetworkEventType.ImportantComponentUpdate] = true; - isImportant[(int)NetworkEventType.KillCharacter] = true; - isImportant[(int)NetworkEventType.SelectCharacter] = true; + deliveryMethod = new NetworkEventDeliveryMethod[Enum.GetNames(typeof(NetworkEventType)).Length]; + deliveryMethod[(int)NetworkEventType.ImportantEntityUpdate] = NetworkEventDeliveryMethod.ReliableChannel; + deliveryMethod[(int)NetworkEventType.ImportantComponentUpdate] = NetworkEventDeliveryMethod.ReliableChannel; + deliveryMethod[(int)NetworkEventType.KillCharacter] = NetworkEventDeliveryMethod.ReliableLindgren; + deliveryMethod[(int)NetworkEventType.SelectCharacter] = NetworkEventDeliveryMethod.ReliableChannel; - isImportant[(int)NetworkEventType.ImportantComponentUpdate] = true; - isImportant[(int)NetworkEventType.PickItem] = true; - isImportant[(int)NetworkEventType.DropItem] = true; - isImportant[(int)NetworkEventType.InventoryUpdate] = true; - isImportant[(int)NetworkEventType.ItemFixed] = true; + deliveryMethod[(int)NetworkEventType.ImportantComponentUpdate] = NetworkEventDeliveryMethod.ReliableChannel; + deliveryMethod[(int)NetworkEventType.PickItem] = NetworkEventDeliveryMethod.ReliableChannel; + deliveryMethod[(int)NetworkEventType.DropItem] = NetworkEventDeliveryMethod.ReliableChannel; + deliveryMethod[(int)NetworkEventType.InventoryUpdate] = NetworkEventDeliveryMethod.ReliableChannel; + deliveryMethod[(int)NetworkEventType.ItemFixed] = NetworkEventDeliveryMethod.ReliableLindgren; - isImportant[(int)NetworkEventType.UpdateProperty] = true; - isImportant[(int)NetworkEventType.WallDamage] = true; + deliveryMethod[(int)NetworkEventType.UpdateProperty] = NetworkEventDeliveryMethod.ReliableChannel; + deliveryMethod[(int)NetworkEventType.WallDamage] = NetworkEventDeliveryMethod.ReliableChannel; - overridePrevious = new bool[isImportant.Length]; + overridePrevious = new bool[deliveryMethod.Length]; for (int i = 0; i < overridePrevious.Length; i++ ) { overridePrevious[i] = true; @@ -82,9 +89,9 @@ namespace Barotrauma.Networking get { return isClientEvent; } } - public bool IsImportant + public NetworkEventDeliveryMethod DeliveryMethod { - get { return isImportant[(int)eventType]; } + get { return deliveryMethod[(int)eventType]; } } public NetworkEventType Type diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index bad6b2348..fb47c8bd2 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -126,11 +126,11 @@ namespace Barotrauma.Networking Voting = new Voting(); } - protected NetOutgoingMessage ComposeNetworkEventMessage(bool isImportant, NetConnection excludedConnection = null) + protected NetOutgoingMessage ComposeNetworkEventMessage(NetworkEventDeliveryMethod deliveryMethod, NetConnection excludedConnection = null) { if (netPeer == null) return null; - var events = NetworkEvent.Events.FindAll(e => e.IsImportant == isImportant); + var events = NetworkEvent.Events.FindAll(e => e.DeliveryMethod == deliveryMethod); if (events.Count == 0) return null; List msgBytes = new List();