ReliableMessage improvements & bugfixes
This commit is contained in:
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("0.2.2.0")]
|
[assembly: AssemblyVersion("0.0.0.1")]
|
||||||
[assembly: AssemblyFileVersion("0.2.2.0")]
|
[assembly: AssemblyFileVersion("0.0.0.1")]
|
||||||
|
|||||||
@@ -1107,9 +1107,11 @@ namespace Barotrauma
|
|||||||
GetInputState(InputType.Up) ||
|
GetInputState(InputType.Up) ||
|
||||||
GetInputState(InputType.Down) ||
|
GetInputState(InputType.Down) ||
|
||||||
GetInputState(InputType.ActionHeld) ||
|
GetInputState(InputType.ActionHeld) ||
|
||||||
GetInputState(InputType.SecondaryHeld));
|
GetInputState(InputType.SecondaryHeld)) || LargeUpdateTimer <= 0;
|
||||||
|
|
||||||
message.Write(hasInputs || LargeUpdateTimer <= 0);
|
message.Write(hasInputs);
|
||||||
|
|
||||||
|
if (!hasInputs) return true;
|
||||||
|
|
||||||
message.Write((float)NetTime.Now);
|
message.Write((float)NetTime.Now);
|
||||||
|
|
||||||
@@ -1118,7 +1120,9 @@ namespace Barotrauma
|
|||||||
//message.WriteRangedSingle(MathHelper.Clamp(AnimController.TargetMovement.Y, -10.0f, 10.0f), -10.0f, 10.0f, 8);
|
//message.WriteRangedSingle(MathHelper.Clamp(AnimController.TargetMovement.Y, -10.0f, 10.0f), -10.0f, 10.0f, 8);
|
||||||
|
|
||||||
message.Write(keys[(int)InputType.ActionHeld].Dequeue);
|
message.Write(keys[(int)InputType.ActionHeld].Dequeue);
|
||||||
message.Write(keys[(int)InputType.SecondaryHeld].Dequeue);
|
|
||||||
|
bool secondaryHeld = keys[(int)InputType.SecondaryHeld].Dequeue;
|
||||||
|
message.Write(secondaryHeld);
|
||||||
|
|
||||||
message.Write(keys[(int)InputType.Left].Dequeue);
|
message.Write(keys[(int)InputType.Left].Dequeue);
|
||||||
message.Write(keys[(int)InputType.Right].Dequeue);
|
message.Write(keys[(int)InputType.Right].Dequeue);
|
||||||
@@ -1128,8 +1132,15 @@ namespace Barotrauma
|
|||||||
|
|
||||||
message.Write(keys[(int)InputType.Run].Dequeue);
|
message.Write(keys[(int)InputType.Run].Dequeue);
|
||||||
|
|
||||||
message.Write(cursorPosition.X);
|
if (secondaryHeld)
|
||||||
message.Write(cursorPosition.Y);
|
{
|
||||||
|
message.Write(cursorPosition.X);
|
||||||
|
message.Write(cursorPosition.Y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message.Write(AnimController.Dir > 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
message.Write(LargeUpdateTimer <= 0);
|
message.Write(LargeUpdateTimer <= 0);
|
||||||
|
|
||||||
@@ -1271,21 +1282,36 @@ namespace Barotrauma
|
|||||||
|
|
||||||
keys[(int)InputType.Run].State = runState;
|
keys[(int)InputType.Run].State = runState;
|
||||||
|
|
||||||
|
float dir = 1.0f;
|
||||||
bool isLargeUpdate;
|
bool isLargeUpdate;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
cursorPos = new Vector2(
|
if (secondaryKeyState)
|
||||||
message.ReadFloat(),
|
{
|
||||||
message.ReadFloat());
|
cursorPos = new Vector2(
|
||||||
|
message.ReadFloat(),
|
||||||
|
message.ReadFloat());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dir = message.ReadBoolean() ? 1.0f : -1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
isLargeUpdate = message.ReadBoolean();
|
isLargeUpdate = message.ReadBoolean();
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (secondaryKeyState)
|
||||||
cursorPosition = cursorPos;
|
{
|
||||||
|
cursorPosition = cursorPos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cursorPos = Position + new Vector2(1000.0f, 0.0f) * dir;
|
||||||
|
}
|
||||||
|
|
||||||
if (isLargeUpdate)
|
if (isLargeUpdate)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -238,8 +238,6 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
public override void Update(float deltaTime, Camera cam)
|
public override void Update(float deltaTime, Camera cam)
|
||||||
{
|
{
|
||||||
convexHull.Enabled = true;
|
|
||||||
if (convexHull2 != null) convexHull2.Enabled = true;
|
|
||||||
if (!isStuck)
|
if (!isStuck)
|
||||||
{
|
{
|
||||||
OpenState += deltaTime * ((isOpen) ? 2.0f : -2.0f);
|
OpenState += deltaTime * ((isOpen) ? 2.0f : -2.0f);
|
||||||
@@ -253,8 +251,6 @@ namespace Barotrauma.Items.Components
|
|||||||
public override void UpdateBroken(float deltaTime, Camera cam)
|
public override void UpdateBroken(float deltaTime, Camera cam)
|
||||||
{
|
{
|
||||||
body.Enabled = false;
|
body.Enabled = false;
|
||||||
convexHull.Enabled = false;
|
|
||||||
if (convexHull2 != null) convexHull2.Enabled = false;
|
|
||||||
|
|
||||||
linkedGap.Open = 1.0f;
|
linkedGap.Open = 1.0f;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
updateInterval = new TimeSpan(0, 0, 0, 0, 100);
|
updateInterval = new TimeSpan(0, 0, 0, 0, 150);
|
||||||
|
|
||||||
// Set timer to tick every 50ms
|
// Set timer to tick every 50ms
|
||||||
//update = new System.Timers.Timer(50);
|
//update = new System.Timers.Timer(50);
|
||||||
@@ -302,7 +302,7 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
base.Update(deltaTime);
|
base.Update(deltaTime);
|
||||||
|
|
||||||
if (!connected || updateTimer > DateTime.Now) return;
|
if (!connected) return;
|
||||||
|
|
||||||
if (client.ConnectionStatus == NetConnectionStatus.Disconnected)
|
if (client.ConnectionStatus == NetConnectionStatus.Disconnected)
|
||||||
{
|
{
|
||||||
@@ -323,6 +323,21 @@ namespace Barotrauma.Networking
|
|||||||
reconnectBox = null;
|
reconnectBox = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CheckServerMessages();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
DebugConsole.ThrowError("Error while receiving message from server", e);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
reliableChannel.Update(deltaTime);
|
||||||
|
|
||||||
|
if (updateTimer > DateTime.Now) return;
|
||||||
|
|
||||||
if (myCharacter != null)
|
if (myCharacter != null)
|
||||||
{
|
{
|
||||||
if (myCharacter.IsDead)
|
if (myCharacter.IsDead)
|
||||||
@@ -336,8 +351,6 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reliableChannel.Update(deltaTime);
|
|
||||||
|
|
||||||
foreach (NetworkEvent networkEvent in NetworkEvent.events)
|
foreach (NetworkEvent networkEvent in NetworkEvent.events)
|
||||||
{
|
{
|
||||||
NetOutgoingMessage message = client.CreateMessage();
|
NetOutgoingMessage message = client.CreateMessage();
|
||||||
@@ -353,11 +366,10 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
NetworkEvent.events.Clear();
|
NetworkEvent.events.Clear();
|
||||||
|
|
||||||
try
|
if (PlayerInput.KeyDown(Microsoft.Xna.Framework.Input.Keys.B))
|
||||||
{
|
{
|
||||||
CheckServerMessages();
|
SendChatMessage("asdfsdaf");
|
||||||
}
|
}
|
||||||
catch { }
|
|
||||||
|
|
||||||
// Update current time
|
// Update current time
|
||||||
updateTimer = DateTime.Now + updateInterval;
|
updateTimer = DateTime.Now + updateInterval;
|
||||||
|
|||||||
@@ -65,8 +65,8 @@ namespace Barotrauma.Networking
|
|||||||
netStats = new NetStats();
|
netStats = new NetStats();
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
config.SimulatedLoss = 0.2f;
|
config.SimulatedLoss = 0.05f;
|
||||||
config.SimulatedRandomLatency = 0.6f;
|
config.SimulatedRandomLatency = 0.3f;
|
||||||
config.SimulatedDuplicatesChance = 0.05f;
|
config.SimulatedDuplicatesChance = 0.05f;
|
||||||
config.SimulatedMinimumLatency = 0.1f;
|
config.SimulatedMinimumLatency = 0.1f;
|
||||||
#endif
|
#endif
|
||||||
@@ -618,14 +618,12 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
if (NetworkEvent.events.Count == 0) return;
|
if (NetworkEvent.events.Count == 0) return;
|
||||||
|
|
||||||
List<NetConnection> recipients = new List<NetConnection>();
|
List<Client> recipients = connectedClients.FindAll(c => c.character != null);
|
||||||
foreach (Client c in connectedClients)
|
|
||||||
{
|
|
||||||
if (c.character == null) continue;
|
|
||||||
//if (networkEvent.Type == NetworkEventType.UpdateEntity &&
|
|
||||||
// Vector2.Distance(e.SimPosition, c.character.SimPosition) > NetConfig.UpdateEntityDistance) continue;
|
|
||||||
|
|
||||||
recipients.Add(c.Connection);
|
List<NetConnection> recipientConnections = new List<NetConnection>();
|
||||||
|
foreach (Client c in recipients)
|
||||||
|
{
|
||||||
|
recipientConnections.Add(c.Connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recipients.Count == 0) return;
|
if (recipients.Count == 0) return;
|
||||||
@@ -635,16 +633,37 @@ namespace Barotrauma.Networking
|
|||||||
Entity e = Entity.FindEntityByID(networkEvent.ID);
|
Entity e = Entity.FindEntityByID(networkEvent.ID);
|
||||||
if (e == null) continue;
|
if (e == null) continue;
|
||||||
|
|
||||||
NetOutgoingMessage message = server.CreateMessage();
|
if (networkEvent.IsImportant)
|
||||||
message.Write((byte)PacketTypes.NetworkEvent);
|
|
||||||
//if (!networkEvent.IsClient) continue;
|
|
||||||
|
|
||||||
networkEvent.FillData(message);
|
|
||||||
|
|
||||||
if (server.ConnectionsCount>0)
|
|
||||||
{
|
{
|
||||||
server.SendMessage(message, recipients,
|
foreach (Client c in recipients)
|
||||||
(networkEvent.IsImportant) ? NetDeliveryMethod.Unreliable : NetDeliveryMethod.ReliableUnordered, 0);
|
{
|
||||||
|
ReliableMessage reliableMessage = c.ReliableChannel.CreateMessage();
|
||||||
|
reliableMessage.InnerMessage.Write((byte)PacketTypes.NetworkEvent);
|
||||||
|
|
||||||
|
if (!networkEvent.FillData(reliableMessage.InnerMessage))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
c.ReliableChannel.SendMessage(reliableMessage, c.Connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NetOutgoingMessage message = server.CreateMessage();
|
||||||
|
message.Write((byte)PacketTypes.NetworkEvent);
|
||||||
|
//if (!networkEvent.IsClient) continue;
|
||||||
|
|
||||||
|
if (!networkEvent.FillData(message))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server.ConnectionsCount>0)
|
||||||
|
{
|
||||||
|
server.SendMessage(message, recipientConnections,
|
||||||
|
(networkEvent.IsImportant) ? NetDeliveryMethod.Unreliable : NetDeliveryMethod.ReliableUnordered, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NetworkEvent.events.Clear();
|
NetworkEvent.events.Clear();
|
||||||
|
|||||||
@@ -22,5 +22,10 @@ namespace Barotrauma.Networking
|
|||||||
public const float AllowedRagdollDistance = 0.1f;
|
public const float AllowedRagdollDistance = 0.1f;
|
||||||
|
|
||||||
public const float DeleteDisconnectedTime = 10.0f;
|
public const float DeleteDisconnectedTime = 10.0f;
|
||||||
|
|
||||||
|
public const float AckInterval = 0.2f;
|
||||||
|
public const float RerequestInterval = 0.2f;
|
||||||
|
|
||||||
|
public const int ResendAttempts = 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,8 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
private Graph[] graphs;
|
private Graph[] graphs;
|
||||||
|
|
||||||
private Queue<float>[] valueQueue;
|
private float[] totalValue;
|
||||||
|
private float[] lastValue;
|
||||||
private float[] lastValues;
|
|
||||||
|
|
||||||
const float UpdateInterval = 1.0f;
|
const float UpdateInterval = 1.0f;
|
||||||
float updateTimer;
|
float updateTimer;
|
||||||
@@ -29,23 +28,21 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
graphs = new Graph[3];
|
graphs = new Graph[3];
|
||||||
|
|
||||||
valueQueue = new Queue<float>[3];
|
totalValue = new float[3];
|
||||||
|
lastValue = new float[3];
|
||||||
for (int i = 0; i < 3; i++ )
|
for (int i = 0; i < 3; i++ )
|
||||||
{
|
{
|
||||||
valueQueue[i] = new Queue<float>();
|
|
||||||
graphs[i] = new Graph();
|
graphs[i] = new Graph();
|
||||||
}
|
}
|
||||||
|
|
||||||
lastValues = new float[3];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddValue(NetStatType statType, float value)
|
public void AddValue(NetStatType statType, float value)
|
||||||
{
|
{
|
||||||
float valueChange = value - lastValues[(int)statType];
|
float valueChange = value - lastValue[(int)statType];
|
||||||
|
|
||||||
valueQueue[(int)statType].Enqueue(valueChange);
|
totalValue[(int)statType] += valueChange;
|
||||||
|
|
||||||
lastValues[(int)statType] = value;
|
lastValue[(int)statType] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(float deltaTime)
|
public void Update(float deltaTime)
|
||||||
@@ -56,17 +53,12 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
for (int i = 0; i<3; i++)
|
for (int i = 0; i<3; i++)
|
||||||
{
|
{
|
||||||
int valueCount = valueQueue[i].Count;
|
|
||||||
float totalValue = 0.0f;
|
|
||||||
while (valueQueue[i].Count>1)
|
|
||||||
{
|
|
||||||
totalValue += valueQueue[i].Dequeue();
|
|
||||||
}
|
|
||||||
|
|
||||||
graphs[i].Update(valueCount==0 ? 0.0f : totalValue/valueCount);
|
graphs[i].Update(totalValue[i] * 10.0f);
|
||||||
|
totalValue[i] = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateTimer = UpdateInterval;
|
updateTimer = UpdateInterval/10.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Draw(SpriteBatch spriteBatch, Rectangle rect)
|
public void Draw(SpriteBatch spriteBatch, Rectangle rect)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
|
|
||||||
internal class ReliableSender
|
internal class ReliableSender
|
||||||
{
|
{
|
||||||
private List<ReliableMessage> messageBuffer;
|
private Dictionary<ushort, ReliableMessage> messageBuffer;
|
||||||
|
|
||||||
private ushort messageCount;
|
private ushort messageCount;
|
||||||
|
|
||||||
@@ -66,11 +66,15 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
|
|
||||||
private float ackTimer;
|
private float ackTimer;
|
||||||
|
|
||||||
|
private float ackInterval;
|
||||||
|
|
||||||
public ReliableSender(NetPeer sender)
|
public ReliableSender(NetPeer sender)
|
||||||
{
|
{
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
|
|
||||||
messageBuffer = new List<ReliableMessage>();
|
messageCount = ushort.MaxValue - 5;
|
||||||
|
|
||||||
|
messageBuffer = new Dictionary<ushort, ReliableMessage>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReliableMessage CreateMessage()
|
public ReliableMessage CreateMessage()
|
||||||
@@ -81,14 +85,42 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
NetOutgoingMessage message = sender.CreateMessage();
|
NetOutgoingMessage message = sender.CreateMessage();
|
||||||
|
|
||||||
var reliableMessage = new ReliableMessage(message, messageCount);
|
var reliableMessage = new ReliableMessage(message, messageCount);
|
||||||
messageBuffer.Add(reliableMessage);
|
messageBuffer.Add(reliableMessage.ID, reliableMessage);
|
||||||
|
|
||||||
message.Write((byte)PacketTypes.ReliableMessage);
|
message.Write((byte)PacketTypes.ReliableMessage);
|
||||||
message.Write(messageCount);
|
message.Write(messageCount);
|
||||||
|
|
||||||
while (messageBuffer.Count>100)
|
int bufferSize=100;
|
||||||
|
if (messageBuffer.Count>bufferSize)
|
||||||
{
|
{
|
||||||
messageBuffer.RemoveAt(0);
|
|
||||||
|
int end = messageCount-bufferSize;
|
||||||
|
int start = end - (messageBuffer.Count - bufferSize);
|
||||||
|
|
||||||
|
if (start<=0)
|
||||||
|
{
|
||||||
|
int wrappedStart = start + ushort.MaxValue;
|
||||||
|
if (wrappedStart==0) wrappedStart = ushort.MaxValue;
|
||||||
|
int wrappedEnd = end + ushort.MaxValue;
|
||||||
|
if (wrappedEnd==0) wrappedEnd = ushort.MaxValue;
|
||||||
|
|
||||||
|
for (ushort i = (ushort)wrappedStart; i <= (ushort)wrappedEnd; i++)
|
||||||
|
{
|
||||||
|
messageBuffer.Remove(i);
|
||||||
|
if (i == ushort.MaxValue) break;
|
||||||
|
Debug.WriteLine("removing message " + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ushort i = (ushort)Math.Max(start,1); i <= (ushort)Math.Max(end,1); i++)
|
||||||
|
{
|
||||||
|
messageBuffer.Remove(i);
|
||||||
|
if (i == ushort.MaxValue) break;
|
||||||
|
Debug.WriteLine("removing message " + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return reliableMessage;
|
return reliableMessage;
|
||||||
@@ -98,6 +130,9 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
|
|
||||||
public void SendMessage(ReliableMessage message, NetConnection connection)
|
public void SendMessage(ReliableMessage message, NetConnection connection)
|
||||||
{
|
{
|
||||||
|
ackInterval = 0.0f;
|
||||||
|
ackTimer = connection.AverageRoundtripTime;
|
||||||
|
|
||||||
message.SaveInnerMessage();
|
message.SaveInnerMessage();
|
||||||
|
|
||||||
sender.SendMessage(message.InnerMessage, connection, NetDeliveryMethod.Unreliable, 0);
|
sender.SendMessage(message.InnerMessage, connection, NetDeliveryMethod.Unreliable, 0);
|
||||||
@@ -105,14 +140,6 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
recipient = connection;
|
recipient = connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetOutgoingMessage msg = server.CreateMessage();
|
|
||||||
//reliableSender.CreateMessage(msg);
|
|
||||||
//msg.Write((byte)PacketTypes.Chatmessage);
|
|
||||||
//msg.Write((byte)type);
|
|
||||||
//msg.Write(message);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void HandleResendRequest(NetIncomingMessage inc)
|
public void HandleResendRequest(NetIncomingMessage inc)
|
||||||
{
|
{
|
||||||
ushort messageId = inc.ReadUInt16();
|
ushort messageId = inc.ReadUInt16();
|
||||||
@@ -124,15 +151,16 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
|
|
||||||
private void ResendMessage(ushort messageId, NetConnection connection)
|
private void ResendMessage(ushort messageId, NetConnection connection)
|
||||||
{
|
{
|
||||||
ReliableMessage message = messageBuffer.Find(m => m.ID == messageId);
|
ReliableMessage message;
|
||||||
if (message == null) return;
|
if (!messageBuffer.TryGetValue(messageId, out message)) return;
|
||||||
|
|
||||||
Debug.WriteLine("resending " + messageId);
|
Debug.WriteLine("resending " + messageId);
|
||||||
|
|
||||||
|
|
||||||
NetOutgoingMessage resendMessage = sender.CreateMessage();
|
NetOutgoingMessage resendMessage = sender.CreateMessage();
|
||||||
message.RestoreInnerMessage(resendMessage);
|
message.RestoreInnerMessage(resendMessage);
|
||||||
|
|
||||||
|
ackTimer = connection.AverageRoundtripTime;
|
||||||
|
|
||||||
sender.SendMessage(resendMessage, connection, NetDeliveryMethod.Unreliable);
|
sender.SendMessage(resendMessage, connection, NetDeliveryMethod.Unreliable);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +180,8 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
|
|
||||||
sender.SendMessage(message, recipient, NetDeliveryMethod.Unreliable);
|
sender.SendMessage(message, recipient, NetDeliveryMethod.Unreliable);
|
||||||
|
|
||||||
ackTimer = Math.Max(recipient.AverageRoundtripTime, 1.0f);
|
ackTimer = Math.Max(recipient.AverageRoundtripTime, NetConfig.AckInterval+ackInterval);
|
||||||
|
ackInterval += 0.1f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,6 +189,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
{
|
{
|
||||||
ushort lastMessageID;
|
ushort lastMessageID;
|
||||||
|
|
||||||
|
Queue<ushort> missingMessageIds;
|
||||||
Dictionary<ushort, MissingMessage> missingMessages;
|
Dictionary<ushort, MissingMessage> missingMessages;
|
||||||
|
|
||||||
private NetPeer receiver;
|
private NetPeer receiver;
|
||||||
@@ -170,37 +200,48 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
{
|
{
|
||||||
this.receiver = receiver;
|
this.receiver = receiver;
|
||||||
|
|
||||||
|
lastMessageID = ushort.MaxValue - 5;
|
||||||
|
|
||||||
missingMessages = new Dictionary<ushort,MissingMessage>();
|
missingMessages = new Dictionary<ushort,MissingMessage>();
|
||||||
|
missingMessageIds = new Queue<ushort>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(float deltaTime)
|
public void Update(float deltaTime)
|
||||||
{
|
{
|
||||||
foreach (var message in missingMessages.Where(m => m.Value.ResendRequestsSent>10).ToList())
|
foreach (var message in missingMessages.Where(m => m.Value.ResendRequestsSent > NetConfig.ResendAttempts).ToList())
|
||||||
{
|
{
|
||||||
missingMessages.Remove(message.Key);
|
missingMessages.Remove(message.Key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bufferSize = 20;
|
||||||
|
|
||||||
|
while (missingMessageIds.Count>bufferSize)
|
||||||
|
{
|
||||||
|
ushort id = missingMessageIds.Dequeue();
|
||||||
|
|
||||||
|
missingMessages.Remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (KeyValuePair<ushort, MissingMessage> valuePair in missingMessages)
|
foreach (KeyValuePair<ushort, MissingMessage> valuePair in missingMessages)
|
||||||
{
|
{
|
||||||
MissingMessage missingMessage = valuePair.Value;
|
MissingMessage missingMessage = valuePair.Value;
|
||||||
|
|
||||||
missingMessage.ResendTimer -= deltaTime;
|
missingMessage.ResendTimer -= deltaTime;
|
||||||
|
|
||||||
if (missingMessage.ResendRequestsSent==0
|
if (missingMessage.ResendTimer > 0.0f) continue;
|
||||||
|| missingMessage.ResendTimer<0.0f)
|
|
||||||
{
|
|
||||||
Debug.WriteLine("rerequest "+missingMessage.ID+" (try #"+missingMessage.ResendRequestsSent+")");
|
|
||||||
|
|
||||||
NetOutgoingMessage resendRequest = receiver.CreateMessage();
|
Debug.WriteLine("rerequest "+missingMessage.ID+" (try #"+missingMessage.ResendRequestsSent+")");
|
||||||
resendRequest.Write((byte)PacketTypes.ResendRequest);
|
|
||||||
resendRequest.Write(missingMessage.ID);
|
|
||||||
|
|
||||||
receiver.SendMessage(resendRequest, recipient, NetDeliveryMethod.Unreliable);
|
NetOutgoingMessage resendRequest = receiver.CreateMessage();
|
||||||
|
resendRequest.Write((byte)PacketTypes.ResendRequest);
|
||||||
|
resendRequest.Write(missingMessage.ID);
|
||||||
|
|
||||||
|
receiver.SendMessage(resendRequest, recipient, NetDeliveryMethod.Unreliable);
|
||||||
|
|
||||||
|
|
||||||
missingMessage.ResendTimer = Math.Max(recipient.AverageRoundtripTime, 0.2f);
|
missingMessage.ResendTimer = Math.Max(recipient.AverageRoundtripTime, NetConfig.RerequestInterval);
|
||||||
missingMessage.ResendRequestsSent++;
|
missingMessage.ResendRequestsSent++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -217,23 +258,15 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
if (Math.Abs((int)lastMessageID - (int)id) > ushort.MaxValue / 2)
|
if (Math.Abs((int)lastMessageID - (int)id) > ushort.MaxValue / 2)
|
||||||
{
|
{
|
||||||
//id wrapped around and we missed some messages in between, rerequest them
|
//id wrapped around and we missed some messages in between, rerequest them
|
||||||
if (lastMessageID<=ushort.MaxValue && id>1)
|
if (lastMessageID>ushort.MaxValue/2 && id>=1)
|
||||||
{
|
{
|
||||||
for (ushort i = (ushort)(Math.Min(lastMessageID, (ushort)(ushort.MaxValue-1)) + 1); i < ushort.MaxValue; i++)
|
for (ushort i = (ushort)(Math.Min(lastMessageID, (ushort)(ushort.MaxValue-1)) + 1); i < ushort.MaxValue; i++)
|
||||||
{
|
{
|
||||||
//message already marked as missed, continue
|
QueueMissingMessage(i);
|
||||||
if (missingMessages.ContainsKey((i))) continue;
|
|
||||||
|
|
||||||
Debug.WriteLine("added " + i + " to missed");
|
|
||||||
missingMessages.Add(i, new MissingMessage((ushort)i));
|
|
||||||
}
|
}
|
||||||
for (ushort i = 1; i < id; i++)
|
for (ushort i = 1; i < id; i++)
|
||||||
{
|
{
|
||||||
//message already marked as missed, continue
|
QueueMissingMessage(i);
|
||||||
if (missingMessages.ContainsKey((i))) continue;
|
|
||||||
|
|
||||||
Debug.WriteLine("added " + i + " to missed");
|
|
||||||
missingMessages.Add(i, new MissingMessage((ushort)i));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lastMessageID = id;
|
lastMessageID = id;
|
||||||
@@ -246,11 +279,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (missingMessages.ContainsKey(id))
|
RemoveMissingMessage(id);
|
||||||
{
|
|
||||||
Debug.WriteLine("remove " + id + " from missed");
|
|
||||||
missingMessages.Remove(id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -259,11 +288,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
{
|
{
|
||||||
for (ushort i = (ushort)(lastMessageID+1); i < id; i++ )
|
for (ushort i = (ushort)(lastMessageID+1); i < id; i++ )
|
||||||
{
|
{
|
||||||
//message already marked as missed, continue
|
QueueMissingMessage(i);
|
||||||
if (missingMessages.ContainsKey((i))) continue;
|
|
||||||
|
|
||||||
Debug.WriteLine("added "+i+" to missed");
|
|
||||||
missingMessages.Add(i, new MissingMessage((ushort)i));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -275,11 +300,7 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (missingMessages.ContainsKey(id))
|
RemoveMissingMessage(id);
|
||||||
{
|
|
||||||
Debug.WriteLine("remove "+id+" from missed");
|
|
||||||
missingMessages.Remove(id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lastMessageID = Math.Max(lastMessageID, id);
|
lastMessageID = Math.Max(lastMessageID, id);
|
||||||
@@ -288,21 +309,39 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void QueueMissingMessage(ushort id)
|
||||||
|
{
|
||||||
|
//message already marked as missed, continue
|
||||||
|
if (missingMessages.ContainsKey(id)) return;
|
||||||
|
|
||||||
|
Debug.WriteLine("added " + id + " to missed");
|
||||||
|
missingMessages.Add(id, new MissingMessage(id));
|
||||||
|
|
||||||
|
missingMessageIds.Enqueue(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveMissingMessage(ushort id)
|
||||||
|
{
|
||||||
|
if (!missingMessages.ContainsKey(id)) return;
|
||||||
|
|
||||||
|
Debug.WriteLine("remove " + id + " from missed");
|
||||||
|
missingMessages.Remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
public void HandleAckMessage(NetIncomingMessage inc)
|
public void HandleAckMessage(NetIncomingMessage inc)
|
||||||
{
|
{
|
||||||
int messageId = inc.ReadUInt16();
|
ushort messageId = inc.ReadUInt16();
|
||||||
|
|
||||||
recipient = inc.SenderConnection;
|
recipient = inc.SenderConnection;
|
||||||
|
|
||||||
//id matches, all good
|
//id matches, all good
|
||||||
if (messageId == lastMessageID)
|
if (messageId == lastMessageID)
|
||||||
{
|
{
|
||||||
|
|
||||||
Debug.WriteLine("Received ack message: " + messageId + ", all good");
|
Debug.WriteLine("Received ack message: " + messageId + ", all good");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastMessageID > messageId)
|
if (lastMessageID > messageId && Math.Abs((int)lastMessageID - (int)messageId) < ushort.MaxValue / 2)
|
||||||
{
|
{
|
||||||
//shouldn't happen: we have somehow received messages that the other end hasn't sent
|
//shouldn't happen: we have somehow received messages that the other end hasn't sent
|
||||||
Debug.WriteLine("Reliable message error - recipient last sent: " + messageId + " (current count " + lastMessageID + ")");
|
Debug.WriteLine("Reliable message error - recipient last sent: " + messageId + " (current count " + lastMessageID + ")");
|
||||||
@@ -315,11 +354,12 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
{
|
{
|
||||||
for (ushort i = (ushort)Math.Min((int)lastMessageID + 1, ushort.MaxValue); i <= ushort.MaxValue; i++)
|
for (ushort i = (ushort)Math.Min((int)lastMessageID + 1, ushort.MaxValue); i <= ushort.MaxValue; i++)
|
||||||
{
|
{
|
||||||
|
if (i == ushort.MaxValue && lastMessageID == ushort.MaxValue) break;
|
||||||
if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i));
|
if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i));
|
||||||
|
if (i == ushort.MaxValue) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ushort i = 1; i <= messageId; i++)
|
for (ushort i = 1; i < messageId; i++)
|
||||||
{
|
{
|
||||||
if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i));
|
if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i));
|
||||||
}
|
}
|
||||||
@@ -328,22 +368,12 @@ namespace Barotrauma.Networking.ReliableMessages
|
|||||||
{
|
{
|
||||||
for (ushort i = (ushort)Math.Min((int)lastMessageID+1, ushort.MaxValue); i <= messageId; i++)
|
for (ushort i = (ushort)Math.Min((int)lastMessageID+1, ushort.MaxValue); i <= messageId; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i));
|
if (!missingMessages.ContainsKey(i)) missingMessages.Add(i, new MissingMessage(i));
|
||||||
|
if (i == ushort.MaxValue) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lastMessageID = messageId;
|
||||||
|
|
||||||
// Debug.WriteLine("received recent request for msg id " + messageId);
|
|
||||||
|
|
||||||
//ReliableMessage message = messageBuffer.Find(m => m.ID == messageId);
|
|
||||||
//if (message == null) return;
|
|
||||||
|
|
||||||
//NetOutgoingMessage resendMessage = sender.CreateMessage();
|
|
||||||
//message.RestoreInnerMessage(resendMessage);
|
|
||||||
|
|
||||||
//sender.SendMessage(resendMessage, inc.SenderConnection, NetDeliveryMethod.Unreliable);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -389,7 +389,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
GUI.Draw((float)deltaTime, spriteBatch, null);
|
GUI.Draw((float)deltaTime, spriteBatch, null);
|
||||||
|
|
||||||
spriteBatch.DrawString(GUI.Font, "Barotrauma v"+GameMain.Version, new Vector2(10, GameMain.GraphicsHeight-20), Color.White);
|
spriteBatch.DrawString(GUI.Font, "Barotrauma chat lag test build", new Vector2(10, GameMain.GraphicsHeight-20), Color.White);
|
||||||
|
|
||||||
spriteBatch.End();
|
spriteBatch.End();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using FarseerPhysics;
|
|||||||
using FarseerPhysics.Dynamics;
|
using FarseerPhysics.Dynamics;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Barotrauma.Sounds;
|
using Barotrauma.Sounds;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
@@ -41,7 +42,14 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (oggSound == null)
|
if (oggSound == null)
|
||||||
{
|
{
|
||||||
oggSound = OggSound.Load(file);
|
try
|
||||||
|
{
|
||||||
|
oggSound = OggSound.Load(file);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Failed to load sound "+file+"!", e);
|
||||||
|
}
|
||||||
ALHelper.Check();
|
ALHelper.Check();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user