Setting ragdoll position without limbs going through walls, rotating entire ragdoll, using combined network messages client->server, fixed fabricators
This commit is contained in:
@@ -75,6 +75,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
// Create new client, with previously created configs
|
||||
client = new NetClient(config);
|
||||
netPeer = client;
|
||||
reliableChannel = new ReliableChannel(client);
|
||||
|
||||
NetOutgoingMessage outmsg = client.CreateMessage();
|
||||
@@ -358,33 +359,46 @@ namespace Barotrauma.Networking
|
||||
myCharacter.CreateUpdateNetworkEvent(true);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (NetworkEvent networkEvent in NetworkEvent.events)
|
||||
|
||||
var message = ComposeNetworkEventMessage(true);
|
||||
if (message != null)
|
||||
{
|
||||
if (networkEvent.IsImportant)
|
||||
{
|
||||
ReliableMessage reliableMessage = reliableChannel.CreateMessage();
|
||||
reliableMessage.InnerMessage.Write((byte)PacketTypes.NetworkEvent);
|
||||
ReliableMessage reliableMessage = reliableChannel.CreateMessage();
|
||||
message.Position = 0;
|
||||
reliableMessage.InnerMessage.Write(message.ReadBytes(message.LengthBytes));
|
||||
|
||||
if (networkEvent.FillData(reliableMessage.InnerMessage))
|
||||
{
|
||||
reliableChannel.SendMessage(reliableMessage, client.ServerConnection);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NetOutgoingMessage message = client.CreateMessage();
|
||||
message.Write((byte)PacketTypes.NetworkEvent);
|
||||
|
||||
|
||||
if (networkEvent.FillData(message))
|
||||
{
|
||||
client.SendMessage(message, NetDeliveryMethod.Unreliable);
|
||||
}
|
||||
}
|
||||
reliableChannel.SendMessage(reliableMessage, client.ServerConnection);
|
||||
}
|
||||
|
||||
message = ComposeNetworkEventMessage(false);
|
||||
if (message != null) client.SendMessage(message, NetDeliveryMethod.Unreliable);
|
||||
|
||||
//foreach (NetworkEvent networkEvent in NetworkEvent.Events)
|
||||
//{
|
||||
// if (networkEvent.IsImportant)
|
||||
// {
|
||||
// ReliableMessage reliableMessage = reliableChannel.CreateMessage();
|
||||
// reliableMessage.InnerMessage.Write((byte)PacketTypes.NetworkEvent);
|
||||
|
||||
// if (networkEvent.FillData(reliableMessage.InnerMessage))
|
||||
// {
|
||||
// reliableChannel.SendMessage(reliableMessage, client.ServerConnection);
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// NetOutgoingMessage message = client.CreateMessage();
|
||||
// message.Write((byte)PacketTypes.NetworkEvent);
|
||||
|
||||
|
||||
// if (networkEvent.FillData(message))
|
||||
// {
|
||||
// client.SendMessage(message, NetDeliveryMethod.Unreliable);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
NetworkEvent.events.Clear();
|
||||
NetworkEvent.Events.Clear();
|
||||
|
||||
// Update current time
|
||||
updateTimer = DateTime.Now + updateInterval;
|
||||
@@ -475,33 +489,8 @@ namespace Barotrauma.Networking
|
||||
//read the data from the message and update client state accordingly
|
||||
if (!gameStarted) break;
|
||||
|
||||
byte msgCount = inc.ReadByte();
|
||||
|
||||
long currPos = inc.PositionInBytes;
|
||||
|
||||
System.Diagnostics.Debug.WriteLine("msgcount: " + msgCount + " startpos: " + inc.PositionInBytes);
|
||||
for (int i = 0; i < msgCount; i++ )
|
||||
{
|
||||
|
||||
byte msgLength = inc.ReadByte();
|
||||
|
||||
System.Diagnostics.Debug.WriteLine("msglength: "+msgLength);
|
||||
try
|
||||
{
|
||||
NetworkEvent.ReadData(inc);
|
||||
}
|
||||
catch
|
||||
{
|
||||
int afghj = 1;
|
||||
}
|
||||
//+1 because msgLength is one additional byte
|
||||
currPos += msgLength+1;
|
||||
inc.Position = currPos*8;
|
||||
|
||||
System.Diagnostics.Debug.WriteLine("currpos: " + currPos);
|
||||
}
|
||||
|
||||
|
||||
NetworkEvent.ReadMessage(inc);
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.UpdateNetLobby:
|
||||
if (gameStarted) continue;
|
||||
@@ -800,7 +789,7 @@ namespace Barotrauma.Networking
|
||||
case 2:
|
||||
msg.Write((byte)PacketTypes.NetworkEvent);
|
||||
msg.Write((byte)NetworkEventType.ComponentUpdate);
|
||||
msg.Write((int)Item.itemList[Rand.Int(Item.itemList.Count)].ID);
|
||||
msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID);
|
||||
msg.Write(Rand.Int(8));
|
||||
break;
|
||||
case 3:
|
||||
|
||||
@@ -74,6 +74,7 @@ namespace Barotrauma.Networking
|
||||
try
|
||||
{
|
||||
server = new NetServer(config);
|
||||
netPeer = server;
|
||||
server.Start();
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -282,7 +283,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
foreach (Character c in Character.CharacterList)
|
||||
{
|
||||
if (c as AICharacter == null) continue;
|
||||
if (c as AICharacter == null || c.IsDead) continue;
|
||||
|
||||
if (c.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) continue;
|
||||
|
||||
@@ -312,6 +313,13 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
if (gameStarted) new NetworkEvent(Submarine.Loaded.ID, false);
|
||||
|
||||
foreach (Character c in Character.CharacterList)
|
||||
{
|
||||
if (c as AICharacter != null || c.IsDead) continue;
|
||||
|
||||
new NetworkEvent(NetworkEventType.ImportantEntityUpdate, c.ID, false);
|
||||
}
|
||||
|
||||
sparseUpdateTimer = DateTime.Now + sparseUpdateInterval;
|
||||
}
|
||||
|
||||
@@ -433,34 +441,34 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
case (byte)PacketTypes.NetworkEvent:
|
||||
if (!gameStarted) break;
|
||||
if (!NetworkEvent.ReadData(inc)) break;
|
||||
NetworkEvent.ReadMessage(inc, true);
|
||||
|
||||
List<Client> recipients = connectedClients.FindAll(c => c.Connection != inc.SenderConnection && c.inGame);
|
||||
if (recipients.Count == 0) break;
|
||||
//List<Client> recipients = connectedClients.FindAll(c => c.Connection != inc.SenderConnection && c.inGame);
|
||||
//if (recipients.Count == 0) break;
|
||||
|
||||
if (isReliable)
|
||||
{
|
||||
Debug.WriteLine("receiver reliable networkevent");
|
||||
foreach (Client c in recipients)
|
||||
{
|
||||
var reliableMessage = c.ReliableChannel.CreateMessage();
|
||||
inc.Position = 8+16;
|
||||
byte[] messageBytes = inc.ReadBytes(inc.LengthBytes-3);
|
||||
reliableMessage.InnerMessage.Write(messageBytes);
|
||||
//if (isReliable)
|
||||
//{
|
||||
// Debug.WriteLine("receiver reliable networkevent");
|
||||
// foreach (Client c in recipients)
|
||||
// {
|
||||
// var reliableMessage = c.ReliableChannel.CreateMessage();
|
||||
// inc.Position = 8+16;
|
||||
// byte[] messageBytes = inc.ReadBytes(inc.LengthBytes-3);
|
||||
// reliableMessage.InnerMessage.Write(messageBytes);
|
||||
|
||||
c.ReliableChannel.SendMessage(reliableMessage, c.Connection);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
outmsg = server.CreateMessage();
|
||||
outmsg.Write(inc);
|
||||
// c.ReliableChannel.SendMessage(reliableMessage, c.Connection);
|
||||
// }
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// outmsg = server.CreateMessage();
|
||||
// outmsg.Write(inc);
|
||||
|
||||
List<NetConnection> recipientConnections = new List<NetConnection>();
|
||||
foreach (Client c in recipients) recipientConnections.Add(c.Connection);
|
||||
// List<NetConnection> recipientConnections = new List<NetConnection>();
|
||||
// foreach (Client c in recipients) recipientConnections.Add(c.Connection);
|
||||
|
||||
server.SendMessage(outmsg, recipientConnections, inc.DeliveryMethod, 0);
|
||||
}
|
||||
// server.SendMessage(outmsg, recipientConnections, inc.DeliveryMethod, 0);
|
||||
//}
|
||||
|
||||
break;
|
||||
case (byte)PacketTypes.Chatmessage:
|
||||
@@ -624,7 +632,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
private void SendNetworkEvents()
|
||||
{
|
||||
if (NetworkEvent.events.Count == 0) return;
|
||||
if (NetworkEvent.Events.Count == 0) return;
|
||||
|
||||
List<Client> recipients = connectedClients.FindAll(c => c.character != null);
|
||||
|
||||
@@ -636,55 +644,85 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (recipients.Count == 0) return;
|
||||
|
||||
for (int i = 0; i<2; i++)
|
||||
//foreach (Client c in recipients)
|
||||
//{
|
||||
|
||||
// for (int i = 0; i < 2; i++)
|
||||
// {
|
||||
// bool important = i == 0;
|
||||
|
||||
// var events = NetworkEvent.Events.FindAll(e => e.IsImportant == important && e.SenderConnection != c.Connection);
|
||||
// if (events.Count == 0) continue;
|
||||
|
||||
// List<byte[]> msgBytes = new List<byte[]>();
|
||||
|
||||
// int totalLength = 1;
|
||||
|
||||
// foreach (NetworkEvent unreliableEvent in events)
|
||||
// {
|
||||
// NetBuffer tempMessage = new NetBuffer();// server.CreateMessage();
|
||||
// if (!unreliableEvent.FillData(tempMessage)) continue;
|
||||
// tempMessage.WritePadBits();
|
||||
|
||||
// tempMessage.Position = 0;
|
||||
// msgBytes.Add(tempMessage.ReadBytes(tempMessage.LengthBytes));
|
||||
|
||||
// //one extra byte for writing the length
|
||||
// totalLength += 1 + tempMessage.LengthBytes;
|
||||
// }
|
||||
|
||||
// //NetOutgoingMessage combinedMessage = null;
|
||||
// //reliableMessage = null;
|
||||
// if (important)
|
||||
// {
|
||||
// ReliableMessage reliableMessage = c.ReliableChannel.CreateMessage();
|
||||
|
||||
// reliableMessage.InnerMessage.Write((byte)msgBytes.Count);
|
||||
// foreach (byte[] msgData in msgBytes)
|
||||
// {
|
||||
// if (msgData.Length > 255) DebugConsole.ThrowError("too large networkevent (" + msgData.Length + " bytes)");
|
||||
|
||||
// reliableMessage.InnerMessage.Write((byte)msgData.Length);
|
||||
// reliableMessage.InnerMessage.Write(msgData);
|
||||
// }
|
||||
|
||||
// c.ReliableChannel.SendMessage(reliableMessage, c.Connection);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// var combinedMessage = server.CreateMessage(totalLength);
|
||||
|
||||
// combinedMessage.Write((byte)msgBytes.Count);
|
||||
// foreach (byte[] msgData in msgBytes)
|
||||
// {
|
||||
// if (msgData.Length > 255) DebugConsole.ThrowError("too large networkevent (" + msgData.Length + " bytes)");
|
||||
|
||||
// combinedMessage.Write((byte)msgData.Length);
|
||||
// combinedMessage.Write(msgData);
|
||||
// }
|
||||
|
||||
// server.SendMessage(combinedMessage, c.Connection, NetDeliveryMethod.Unreliable, 0);
|
||||
// }
|
||||
|
||||
// }
|
||||
//}
|
||||
foreach (Client c in recipients)
|
||||
{
|
||||
bool important = i==0;
|
||||
|
||||
var unreliableEvents = NetworkEvent.events.FindAll(e => e.IsImportant == important);
|
||||
if (unreliableEvents.Count == 0) continue;
|
||||
|
||||
NetOutgoingMessage message = server.CreateMessage();
|
||||
message.Write((byte)PacketTypes.NetworkEvent);
|
||||
|
||||
List<byte[]> msgBytes = new List<byte[]>();
|
||||
|
||||
foreach (NetworkEvent unreliableEvent in unreliableEvents)
|
||||
var message = ComposeNetworkEventMessage(true, c.Connection);
|
||||
if (message != null)
|
||||
{
|
||||
NetBuffer tempMessage = new NetBuffer();// server.CreateMessage();
|
||||
if (!unreliableEvent.FillData(tempMessage)) continue;
|
||||
tempMessage.WritePadBits();
|
||||
ReliableMessage reliableMessage = c.ReliableChannel.CreateMessage();
|
||||
message.Position = 0;
|
||||
reliableMessage.InnerMessage.Write(message.ReadBytes(message.LengthBytes));
|
||||
|
||||
tempMessage.Position = 0;
|
||||
msgBytes.Add(tempMessage.ReadBytes(tempMessage.LengthBytes));
|
||||
c.ReliableChannel.SendMessage(reliableMessage, c.Connection);
|
||||
}
|
||||
|
||||
message.Write((byte)msgBytes.Count);
|
||||
foreach (byte[] msgData in msgBytes)
|
||||
message = ComposeNetworkEventMessage(false, c.Connection);
|
||||
if (message != null)
|
||||
{
|
||||
if (msgData.Length > 255) DebugConsole.ThrowError("too large networkevent ("+msgData.Length+" bytes)");
|
||||
|
||||
message.Write((byte)msgData.Length);
|
||||
message.Write(msgData);
|
||||
}
|
||||
|
||||
if (important)
|
||||
{
|
||||
foreach (Client c in recipients)
|
||||
{
|
||||
ReliableMessage reliableMessage = c.ReliableChannel.CreateMessage();
|
||||
message.Position = 0;
|
||||
reliableMessage.InnerMessage.Write(message.ReadBytes(message.LengthBytes));
|
||||
|
||||
c.ReliableChannel.SendMessage(reliableMessage, c.Connection);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (server.ConnectionsCount>0)
|
||||
{
|
||||
server.SendMessage(message, recipientConnections, NetDeliveryMethod.Unreliable, 0);
|
||||
}
|
||||
}
|
||||
server.SendMessage(message, c.Connection, NetDeliveryMethod.Unreliable, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -720,7 +758,7 @@ namespace Barotrauma.Networking
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
NetworkEvent.events.Clear();
|
||||
NetworkEvent.Events.Clear();
|
||||
}
|
||||
|
||||
|
||||
@@ -1372,7 +1410,7 @@ namespace Barotrauma.Networking
|
||||
case 1:
|
||||
msg.Write((byte)PacketTypes.NetworkEvent);
|
||||
msg.Write((byte)NetworkEventType.ComponentUpdate);
|
||||
msg.Write((int)Item.itemList[Rand.Int(Item.itemList.Count)].ID);
|
||||
msg.Write((int)Item.ItemList[Rand.Int(Item.ItemList.Count)].ID);
|
||||
msg.Write(Rand.Int(8));
|
||||
break;
|
||||
case 2:
|
||||
|
||||
@@ -109,7 +109,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
public float Average()
|
||||
{
|
||||
return values.Average();
|
||||
return values.Length == 0 ? 0.0f : values.Average();
|
||||
}
|
||||
|
||||
public void Update(float newValue)
|
||||
@@ -133,11 +133,13 @@ namespace Barotrauma.Networking
|
||||
graphMaxVal = (float)maxVal;
|
||||
}
|
||||
|
||||
GUI.DrawRectangle(spriteBatch, rect, Color.White);
|
||||
|
||||
if (values.Length == 0) return;
|
||||
|
||||
float lineWidth = (float)rect.Width / (float)(values.Length - 2);
|
||||
float yScale = (float)rect.Height / graphMaxVal;
|
||||
|
||||
GUI.DrawRectangle(spriteBatch, rect, Color.White);
|
||||
|
||||
Vector2 prevPoint = new Vector2(rect.Right, rect.Bottom - (values[1] + (values[0] - values[1]) * xOffset) * yScale);
|
||||
|
||||
float currX = rect.Right - ((xOffset - 1.0f) * lineWidth);
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
class NetworkEvent
|
||||
{
|
||||
public static List<NetworkEvent> events = new List<NetworkEvent>();
|
||||
public static List<NetworkEvent> Events = new List<NetworkEvent>();
|
||||
|
||||
private static bool[] isImportant;
|
||||
private static bool[] overridePrevious;
|
||||
@@ -68,6 +68,8 @@ namespace Barotrauma.Networking
|
||||
|
||||
private object data;
|
||||
|
||||
public NetConnection SenderConnection;
|
||||
|
||||
//private NetOutgoingMessage message;
|
||||
|
||||
public ushort ID
|
||||
@@ -110,7 +112,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
if (overridePrevious[(int)type])
|
||||
{
|
||||
if (events.Find(e => e.id == id && e.eventType == type) != null) return;
|
||||
if (Events.Find(e => e.id == id && e.eventType == type) != null) return;
|
||||
}
|
||||
|
||||
this.id = id;
|
||||
@@ -118,7 +120,7 @@ namespace Barotrauma.Networking
|
||||
|
||||
this.data = data;
|
||||
|
||||
events.Add(this);
|
||||
Events.Add(this);
|
||||
}
|
||||
|
||||
public bool FillData(NetBuffer message)
|
||||
@@ -147,7 +149,31 @@ namespace Barotrauma.Networking
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool ReadData(NetIncomingMessage message)
|
||||
public static void ReadMessage(NetIncomingMessage message, bool resend=false)
|
||||
{
|
||||
byte msgCount = message.ReadByte();
|
||||
long currPos = message.PositionInBytes;
|
||||
|
||||
for (int i = 0; i < msgCount; i++)
|
||||
{
|
||||
|
||||
byte msgLength = message.ReadByte();
|
||||
|
||||
try
|
||||
{
|
||||
NetworkEvent.ReadData(message, resend);
|
||||
}
|
||||
catch
|
||||
{
|
||||
int afghj = 1;
|
||||
}
|
||||
//+1 because msgLength is one additional byte
|
||||
currPos += msgLength + 1;
|
||||
message.Position = currPos * 8;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool ReadData(NetIncomingMessage message, bool resend=false)
|
||||
{
|
||||
NetworkEventType eventType;
|
||||
ushort id;
|
||||
@@ -175,9 +201,11 @@ namespace Barotrauma.Networking
|
||||
return false;
|
||||
}
|
||||
|
||||
object data;
|
||||
|
||||
try
|
||||
{
|
||||
e.ReadNetworkData(eventType, message);
|
||||
e.ReadNetworkData(eventType, message, out data);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
@@ -187,6 +215,12 @@ namespace Barotrauma.Networking
|
||||
return false;
|
||||
}
|
||||
|
||||
if (resend)
|
||||
{
|
||||
var resendEvent = new NetworkEvent(eventType, id, false, data);
|
||||
resendEvent.SenderConnection = message.SenderConnection;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using System.Collections.Generic;
|
||||
using Lidgren.Network;
|
||||
|
||||
namespace Barotrauma.Networking
|
||||
{
|
||||
@@ -41,7 +42,9 @@ namespace Barotrauma.Networking
|
||||
{
|
||||
|
||||
protected static Color[] messageColor = { Color.White, Color.Red, Color.LightBlue, Color.LightGreen };
|
||||
|
||||
|
||||
protected NetPeer netPeer;
|
||||
|
||||
protected string name;
|
||||
|
||||
protected TimeSpan updateInterval;
|
||||
@@ -120,6 +123,44 @@ namespace Barotrauma.Networking
|
||||
Voting = new Voting();
|
||||
}
|
||||
|
||||
protected NetOutgoingMessage ComposeNetworkEventMessage(bool isImportant, NetConnection excludedConnection = null)
|
||||
{
|
||||
if (netPeer == null) return null;
|
||||
|
||||
var events = NetworkEvent.Events.FindAll(e => e.IsImportant == isImportant);
|
||||
if (events.Count == 0) return null;
|
||||
|
||||
List<byte[]> msgBytes = new List<byte[]>();
|
||||
|
||||
foreach (NetworkEvent networkEvent in events)
|
||||
{
|
||||
if (excludedConnection != null && networkEvent.SenderConnection == excludedConnection) continue;
|
||||
|
||||
NetBuffer tempMessage = new NetBuffer();// server.CreateMessage();
|
||||
if (!networkEvent.FillData(tempMessage)) continue;
|
||||
tempMessage.WritePadBits();
|
||||
|
||||
tempMessage.Position = 0;
|
||||
msgBytes.Add(tempMessage.ReadBytes(tempMessage.LengthBytes));
|
||||
}
|
||||
|
||||
if (msgBytes.Count == 0) return null;
|
||||
|
||||
NetOutgoingMessage message = netPeer.CreateMessage();
|
||||
message.Write((byte)PacketTypes.NetworkEvent);
|
||||
|
||||
message.Write((byte)msgBytes.Count);
|
||||
foreach (byte[] msgData in msgBytes)
|
||||
{
|
||||
if (msgData.Length > 255) DebugConsole.ThrowError("too large networkevent (" + msgData.Length + " bytes)");
|
||||
|
||||
message.Write((byte)msgData.Length);
|
||||
message.Write(msgData);
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
protected void CreateCrewFrame(List<Character> crew)
|
||||
{
|
||||
int width = 600, height = 400;
|
||||
|
||||
Reference in New Issue
Block a user