Merge pull request #48 from TwoTenPvP/custom-transport
Custom transport
This commit is contained in:
commit
5be6a02d19
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
namespace MLAPI.Data
|
||||
{
|
||||
@ -16,7 +15,7 @@ namespace MLAPI.Data
|
||||
/// <summary>
|
||||
/// The Transport QOS type
|
||||
/// </summary>
|
||||
public QosType Type;
|
||||
public ChannelType Type;
|
||||
/// <summary>
|
||||
/// Wheter or not the channel should be encrypted
|
||||
/// </summary>
|
||||
|
@ -1,4 +1,5 @@
|
||||
using MLAPI.NetworkingManagerComponents.Binary;
|
||||
using MLAPI.Data.Transports.UNET;
|
||||
using MLAPI.NetworkingManagerComponents.Binary;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
@ -19,15 +20,7 @@ namespace MLAPI.Data
|
||||
/// <summary>
|
||||
/// The transport hosts the sever uses
|
||||
/// </summary>
|
||||
public List<TransportHost> ServerTransports = new List<TransportHost>()
|
||||
{
|
||||
new TransportHost()
|
||||
{
|
||||
Name = "UDP Socket",
|
||||
Port = 7777,
|
||||
Websockets = false
|
||||
}
|
||||
};
|
||||
public IUDPTransport NetworkTransport = new UnetTransport();
|
||||
/// <summary>
|
||||
/// Channels used by the NetworkedTransport
|
||||
/// </summary>
|
||||
|
17
MLAPI/Data/Transports/ChannelType.cs
Normal file
17
MLAPI/Data/Transports/ChannelType.cs
Normal file
@ -0,0 +1,17 @@
|
||||
namespace MLAPI.Data
|
||||
{
|
||||
public enum ChannelType
|
||||
{
|
||||
Unreliable,
|
||||
UnreliableFragmented,
|
||||
UnreliableSequenced,
|
||||
Reliable,
|
||||
ReliableFragmented,
|
||||
ReliableSequenced,
|
||||
StateUpdate,
|
||||
ReliableStateUpdate,
|
||||
AllCostDelivery,
|
||||
UnreliableFragmentedSequenced,
|
||||
ReliableFragmentedSequenced
|
||||
}
|
||||
}
|
23
MLAPI/Data/Transports/IUDPTransport.cs
Normal file
23
MLAPI/Data/Transports/IUDPTransport.cs
Normal file
@ -0,0 +1,23 @@
|
||||
namespace MLAPI.Data
|
||||
{
|
||||
public interface IUDPTransport
|
||||
{
|
||||
ChannelType InternalChannel { get; }
|
||||
uint ServerNetId { get; }
|
||||
uint HostDummyId { get; }
|
||||
uint InvalidDummyId { get; }
|
||||
void QueueMessageForSending(uint clientId, ref byte[] dataBuffer, int dataSize, int channelId, bool skipQueue, out byte error);
|
||||
void SendQueue(uint clientId, out byte error);
|
||||
NetEventType PollReceive(out uint clientId, out int channelId, ref byte[] data, int bufferSize, out int receivedSize, out byte error);
|
||||
int AddChannel(ChannelType type, object settings);
|
||||
void Connect(string address, int port, object settings, out byte error);
|
||||
void RegisterServerListenSocket(object settings);
|
||||
void DisconnectClient(uint clientId);
|
||||
void DisconnectFromServer();
|
||||
int GetCurrentRTT(uint clientId, out byte error);
|
||||
int GetRemoteDelayTimeMS(uint clientId, int remoteTimestamp, out byte error);
|
||||
int GetNetworkTimestamp();
|
||||
object GetSettings();
|
||||
void Shutdown();
|
||||
}
|
||||
}
|
10
MLAPI/Data/Transports/NetEventType.cs
Normal file
10
MLAPI/Data/Transports/NetEventType.cs
Normal file
@ -0,0 +1,10 @@
|
||||
namespace MLAPI.Data
|
||||
{
|
||||
public enum NetEventType
|
||||
{
|
||||
Data,
|
||||
Connect,
|
||||
Disconnect,
|
||||
Nothing
|
||||
}
|
||||
}
|
@ -1,6 +1,4 @@
|
||||
using MLAPI.MonoBehaviours.Core;
|
||||
|
||||
namespace MLAPI.Data
|
||||
namespace MLAPI.Data.Transports.UNET
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a ClientId structure
|
||||
@ -37,17 +35,6 @@ namespace MLAPI.Data
|
||||
return Meta == 2;
|
||||
}
|
||||
/// <summary>
|
||||
/// Static ServerNetId for comparison
|
||||
/// </summary>
|
||||
/// <value>The server net identifier.</value>
|
||||
public static NetId ServerNetId
|
||||
{
|
||||
get
|
||||
{
|
||||
return new NetId((byte)NetworkingManager.singleton.serverHostId, (ushort)NetworkingManager.singleton.serverConnectionId, false, false);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the netId struct from transport values
|
||||
/// </summary>
|
||||
/// <param name="hostId">Host identifier.</param>
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace MLAPI.Data
|
||||
namespace MLAPI.Data.Transports.UNET
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a Transport host
|
183
MLAPI/Data/Transports/UNET/UnetTransport.cs
Normal file
183
MLAPI/Data/Transports/UNET/UnetTransport.cs
Normal file
@ -0,0 +1,183 @@
|
||||
using MLAPI.MonoBehaviours.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
namespace MLAPI.Data.Transports.UNET
|
||||
{
|
||||
[Serializable]
|
||||
public class UnetTransport : IUDPTransport
|
||||
{
|
||||
public ChannelType InternalChannel { get => ChannelType.ReliableFragmentedSequenced; }
|
||||
|
||||
public uint HostDummyId { get => new NetId(0,0,true,false).GetClientId(); }
|
||||
|
||||
public uint InvalidDummyId { get => new NetId(0, 0, false, true).GetClientId(); }
|
||||
|
||||
public uint ServerNetId { get => new NetId((byte)serverHostId, (ushort)serverConnectionId, false, false).GetClientId(); }
|
||||
|
||||
public int serverConnectionId;
|
||||
public int serverHostId;
|
||||
|
||||
public List<TransportHost> ServerTransports = new List<TransportHost>()
|
||||
{
|
||||
new TransportHost()
|
||||
{
|
||||
Name = "UDP Socket",
|
||||
Port = 7777,
|
||||
Websockets = false
|
||||
}
|
||||
};
|
||||
|
||||
public int Connect(string address, int port, object settings, bool websocket, out byte error)
|
||||
{
|
||||
NetworkTransport.Init();
|
||||
int hostId = NetworkTransport.AddHost((HostTopology)settings);
|
||||
return NetworkTransport.Connect(hostId, address, port, 0, out error);
|
||||
}
|
||||
|
||||
public void DisconnectClient(uint clientId)
|
||||
{
|
||||
NetId netId = new NetId(clientId);
|
||||
if (netId.IsHost() || netId.IsInvalid())
|
||||
return;
|
||||
byte error;
|
||||
NetworkTransport.Disconnect(netId.HostId, netId.ConnectionId, out error);
|
||||
}
|
||||
|
||||
public void DisconnectFromServer()
|
||||
{
|
||||
byte error;
|
||||
NetworkTransport.Disconnect(serverHostId, serverConnectionId, out error);
|
||||
}
|
||||
|
||||
public int GetCurrentRTT(uint clientId, out byte error)
|
||||
{
|
||||
NetId netId = new NetId(clientId);
|
||||
return NetworkTransport.GetCurrentRTT(netId.HostId, netId.ConnectionId, out error);
|
||||
}
|
||||
|
||||
public int GetNetworkTimestamp()
|
||||
{
|
||||
return NetworkTransport.GetNetworkTimestamp();
|
||||
}
|
||||
|
||||
public int GetRemoteDelayTimeMS(uint clientId, int remoteTimestamp, out byte error)
|
||||
{
|
||||
NetId netId = new NetId(clientId);
|
||||
return NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, remoteTimestamp, out error);
|
||||
}
|
||||
|
||||
public NetEventType PollReceive(out uint clientId, out int channelId, ref byte[] data, int bufferSize, out int receivedSize, out byte error)
|
||||
{
|
||||
int hostId;
|
||||
int connectionId;
|
||||
byte err;
|
||||
NetworkEventType eventType = NetworkTransport.Receive(out hostId, out connectionId, out channelId, data, bufferSize, out receivedSize, out err);
|
||||
clientId = new NetId((byte)hostId, (ushort)connectionId, false, false).GetClientId();
|
||||
NetworkError errorType = (NetworkError)err;
|
||||
if (errorType == NetworkError.Timeout)
|
||||
eventType = NetworkEventType.DisconnectEvent; //In UNET. Timeouts are not disconnects. We have to translate that here.
|
||||
error = 0;
|
||||
|
||||
//Translate NetworkEventType to NetEventType
|
||||
switch (eventType)
|
||||
{
|
||||
case NetworkEventType.DataEvent:
|
||||
return NetEventType.Data;
|
||||
case NetworkEventType.ConnectEvent:
|
||||
return NetEventType.Connect;
|
||||
case NetworkEventType.DisconnectEvent:
|
||||
return NetEventType.Disconnect;
|
||||
case NetworkEventType.Nothing:
|
||||
return NetEventType.Nothing;
|
||||
case NetworkEventType.BroadcastEvent:
|
||||
return NetEventType.Nothing;
|
||||
}
|
||||
return NetEventType.Nothing;
|
||||
}
|
||||
|
||||
public void QueueMessageForSending(uint clientId, ref byte[] dataBuffer, int dataSize, int channelId, bool skipqueue, out byte error)
|
||||
{
|
||||
NetId netId = new NetId(clientId);
|
||||
if (netId.IsHost() || netId.IsInvalid())
|
||||
{
|
||||
error = 0;
|
||||
return;
|
||||
}
|
||||
if (skipqueue)
|
||||
NetworkTransport.Send(netId.HostId, netId.ConnectionId, channelId, dataBuffer, dataSize, out error);
|
||||
else
|
||||
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channelId, dataBuffer, dataSize, out error);
|
||||
}
|
||||
|
||||
public void Shutdown()
|
||||
{
|
||||
NetworkTransport.Shutdown();
|
||||
}
|
||||
|
||||
public void SendQueue(uint clientId, out byte error)
|
||||
{
|
||||
NetId netId = new NetId(clientId);
|
||||
NetworkTransport.SendQueuedMessages(netId.HostId, netId.ConnectionId, out error);
|
||||
}
|
||||
|
||||
public void RegisterServerListenSocket(object settings)
|
||||
{
|
||||
HostTopology topology = new HostTopology((ConnectionConfig)settings, NetworkingManager.singleton.NetworkConfig.MaxConnections);
|
||||
for (int i = 0; i < ServerTransports.Count; i++)
|
||||
{
|
||||
if (ServerTransports[i].Websockets)
|
||||
NetworkTransport.AddWebsocketHost(topology, ServerTransports[i].Port);
|
||||
else
|
||||
NetworkTransport.AddHost(topology, ServerTransports[i].Port);
|
||||
}
|
||||
}
|
||||
|
||||
public int AddChannel(ChannelType type, object settings)
|
||||
{
|
||||
ConnectionConfig config = (ConnectionConfig)settings;
|
||||
switch (type)
|
||||
{
|
||||
case ChannelType.Unreliable:
|
||||
return config.AddChannel(QosType.Unreliable);
|
||||
case ChannelType.UnreliableFragmented:
|
||||
return config.AddChannel(QosType.UnreliableFragmented);
|
||||
case ChannelType.UnreliableSequenced:
|
||||
return config.AddChannel(QosType.UnreliableSequenced);
|
||||
case ChannelType.Reliable:
|
||||
return config.AddChannel(QosType.Reliable);
|
||||
case ChannelType.ReliableFragmented:
|
||||
return config.AddChannel(QosType.ReliableFragmented);
|
||||
case ChannelType.ReliableSequenced:
|
||||
return config.AddChannel(QosType.ReliableSequenced);
|
||||
case ChannelType.StateUpdate:
|
||||
return config.AddChannel(QosType.StateUpdate);
|
||||
case ChannelType.ReliableStateUpdate:
|
||||
return config.AddChannel(QosType.ReliableStateUpdate);
|
||||
case ChannelType.AllCostDelivery:
|
||||
return config.AddChannel(QosType.AllCostDelivery);
|
||||
case ChannelType.UnreliableFragmentedSequenced:
|
||||
return config.AddChannel(QosType.UnreliableFragmentedSequenced);
|
||||
case ChannelType.ReliableFragmentedSequenced:
|
||||
return config.AddChannel(QosType.ReliableFragmentedSequenced);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public object GetSettings()
|
||||
{
|
||||
NetworkTransport.Init();
|
||||
return new ConnectionConfig()
|
||||
{
|
||||
SendDelay = 0
|
||||
};
|
||||
}
|
||||
|
||||
public void Connect(string address, int port, object settings, out byte error)
|
||||
{
|
||||
serverHostId = NetworkTransport.AddHost(new HostTopology((ConnectionConfig)settings, 1));
|
||||
serverConnectionId = NetworkTransport.Connect(serverHostId, address, port, 0, out error);
|
||||
}
|
||||
}
|
||||
}
|
@ -72,15 +72,19 @@
|
||||
<Compile Include="Attributes\TargetRpc.cs" />
|
||||
<Compile Include="Data\Cache.cs" />
|
||||
<Compile Include="Data\Channel.cs" />
|
||||
<Compile Include="Data\Transports\ChannelType.cs" />
|
||||
<Compile Include="Data\FieldType.cs" />
|
||||
<Compile Include="Attributes\SyncedVar.cs" />
|
||||
<Compile Include="Data\FixedQueue.cs" />
|
||||
<Compile Include="Data\Transports\IUDPTransport.cs" />
|
||||
<Compile Include="Data\Transports\NetEventType.cs" />
|
||||
<Compile Include="Data\NetworkConfig.cs" />
|
||||
<Compile Include="Data\NetworkedPrefab.cs" />
|
||||
<Compile Include="Data\NetworkPool.cs" />
|
||||
<Compile Include="Data\SyncedVarField.cs" />
|
||||
<Compile Include="Data\TrackedPointData.cs" />
|
||||
<Compile Include="Data\TransportHost.cs" />
|
||||
<Compile Include="Data\Transports\UNET\TransportHost.cs" />
|
||||
<Compile Include="Data\Transports\UNET\UnetTransport.cs" />
|
||||
<Compile Include="GlobalSuppressions.cs" />
|
||||
<Compile Include="MonoBehaviours\Prototyping\NetworkedAnimator.cs" />
|
||||
<Compile Include="MonoBehaviours\Prototyping\NetworkedNavMeshAgent.cs" />
|
||||
@ -105,7 +109,7 @@
|
||||
<Compile Include="NetworkingManagerComponents\Core\NetworkSceneManager.cs" />
|
||||
<Compile Include="NetworkingManagerComponents\Core\SpawnManager.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Data\NetId.cs" />
|
||||
<Compile Include="Data\Transports\UNET\NetId.cs" />
|
||||
<Compile Include="NetworkingManagerComponents\Binary\MessageChunker.cs" />
|
||||
<Compile Include="Data\MessageType.cs" />
|
||||
<Compile Include="NetworkingManagerComponents\Core\InternalMessageHandler.Send.cs" />
|
||||
|
@ -215,7 +215,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
FieldTypeHelper.WriteFieldType(writer, methodParams[i], fieldType);
|
||||
}
|
||||
|
||||
InternalMessageHandler.Send(NetId.ServerNetId.GetClientId(), "MLAPI_COMMAND", "MLAPI_INTERNAL", writer.Finalize(), null);
|
||||
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerNetId, "MLAPI_COMMAND", "MLAPI_INTERNAL", writer.Finalize(), null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -505,7 +505,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(isHost && new NetId(ownerClientId).IsHost()))
|
||||
if (!(isHost && ownerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.HostDummyId))
|
||||
{
|
||||
//It's sync time. This is the target receivers packet.
|
||||
using (BitWriter writer = new BitWriter())
|
||||
@ -606,7 +606,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
Debug.LogWarning("MLAPI: Server can not send messages to server.");
|
||||
return;
|
||||
}
|
||||
InternalMessageHandler.Send(NetId.ServerNetId.GetClientId(), messageType, channelName, data, null);
|
||||
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerNetId, messageType, channelName, data, null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -644,7 +644,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
Debug.LogWarning("MLAPI: Server can not send messages to server.");
|
||||
return;
|
||||
}
|
||||
InternalMessageHandler.Send(NetId.ServerNetId.GetClientId(), messageType, channelName, data, null, networkId, networkedObject.GetOrderIndex(this));
|
||||
InternalMessageHandler.Send(NetworkingManager.singleton.NetworkConfig.NetworkTransport.ServerNetId, messageType, channelName, data, null, networkId, networkedObject.GetOrderIndex(this));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -43,7 +43,25 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
return ownerClientId;
|
||||
}
|
||||
}
|
||||
internal uint ownerClientId = new NetId(0, 0, false, true).GetClientId();
|
||||
private uint? _ownerClientId = null;
|
||||
//internal uint ownerClientId = new NetId(0, 0, false, true).GetClientId();
|
||||
internal uint ownerClientId
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_ownerClientId == null)
|
||||
return NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId;
|
||||
else
|
||||
return _ownerClientId.Value;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value == NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId)
|
||||
_ownerClientId = null;
|
||||
else
|
||||
_ownerClientId = value;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The name of the NetworkedPrefab
|
||||
/// </summary>
|
||||
@ -88,7 +106,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
{
|
||||
get
|
||||
{
|
||||
return isPlayerObject && (OwnerClientId == NetworkingManager.singleton.MyClientId || (new NetId(ownerClientId).IsHost() && NetworkingManager.singleton.isHost));
|
||||
return isPlayerObject && (OwnerClientId == NetworkingManager.singleton.MyClientId || (ownerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.HostDummyId && NetworkingManager.singleton.isHost));
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
@ -98,7 +116,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
{
|
||||
get
|
||||
{
|
||||
return !isPlayerObject && (OwnerClientId == NetworkingManager.singleton.MyClientId || (new NetId(ownerClientId).IsHost() && NetworkingManager.singleton.isHost));
|
||||
return !isPlayerObject && (OwnerClientId == NetworkingManager.singleton.MyClientId || (ownerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.HostDummyId && NetworkingManager.singleton.isHost));
|
||||
}
|
||||
}
|
||||
|
||||
@ -154,7 +172,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
{
|
||||
foreach (KeyValuePair<uint, NetworkedClient> pair in NetworkingManager.singleton.connectedClients)
|
||||
{
|
||||
if (new NetId(pair.Key).IsHost())
|
||||
if (pair.Key == NetworkingManager.singleton.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
continue;
|
||||
if ((previousObservers.Contains(pair.Key) && !newObservers.Contains(pair.Key)) ||
|
||||
(!previousObservers.Contains(pair.Key) && newObservers.Contains(pair.Key)))
|
||||
|
@ -3,7 +3,6 @@ using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using MLAPI.NetworkingManagerComponents.Cryptography;
|
||||
@ -108,8 +107,6 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
|
||||
private bool isListening;
|
||||
private byte[] messageBuffer;
|
||||
internal int serverConnectionId;
|
||||
internal int serverHostId;
|
||||
/// <summary>
|
||||
/// Gets if we are connected as a client
|
||||
/// </summary>
|
||||
@ -209,7 +206,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
}
|
||||
}
|
||||
|
||||
private ConnectionConfig Init(bool server)
|
||||
private object Init(bool server)
|
||||
{
|
||||
networkTime = 0f;
|
||||
lastSendTickTime = 0f;
|
||||
@ -237,6 +234,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
NetworkSceneManager.sceneIndexToString = new Dictionary<uint, string>();
|
||||
NetworkSceneManager.sceneNameToIndex = new Dictionary<string, uint>();
|
||||
InternalMessageHandler.FinalMessageBuffer = new byte[NetworkConfig.MessageBufferSize];
|
||||
object settings = NetworkConfig.NetworkTransport.GetSettings(); //Gets a new "settings" object for the transport currently used.
|
||||
|
||||
if(NetworkConfig.HandleObjectSpawning)
|
||||
{
|
||||
@ -276,44 +274,38 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
}
|
||||
}
|
||||
|
||||
NetworkTransport.Init();
|
||||
ConnectionConfig cConfig = new ConnectionConfig()
|
||||
{
|
||||
SendDelay = 0
|
||||
};
|
||||
|
||||
//MLAPI channels and messageTypes
|
||||
List<Channel> internalChannels = new List<Channel>
|
||||
{
|
||||
new Channel()
|
||||
{
|
||||
Name = "MLAPI_INTERNAL",
|
||||
Type = QosType.ReliableFragmentedSequenced
|
||||
Type = NetworkConfig.NetworkTransport.InternalChannel
|
||||
},
|
||||
new Channel()
|
||||
{
|
||||
Name = "MLAPI_POSITION_UPDATE",
|
||||
Type = QosType.StateUpdate
|
||||
Type = ChannelType.StateUpdate
|
||||
},
|
||||
new Channel()
|
||||
{
|
||||
Name = "MLAPI_ANIMATION_UPDATE",
|
||||
Type = QosType.ReliableSequenced
|
||||
Type = ChannelType.ReliableSequenced
|
||||
},
|
||||
new Channel()
|
||||
{
|
||||
Name = "MLAPI_NAV_AGENT_STATE",
|
||||
Type = QosType.ReliableSequenced
|
||||
Type = ChannelType.ReliableSequenced
|
||||
},
|
||||
new Channel()
|
||||
{
|
||||
Name = "MLAPI_NAV_AGENT_CORRECTION",
|
||||
Type = QosType.StateUpdate
|
||||
Type = ChannelType.StateUpdate
|
||||
},
|
||||
new Channel()
|
||||
{
|
||||
Name = "MLAPI_TIME_SYNC",
|
||||
Type = QosType.Unreliable
|
||||
Type = ChannelType.Unreliable
|
||||
}
|
||||
};
|
||||
|
||||
@ -363,7 +355,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
Debug.LogWarning("MLAPI: Duplicate channel name: " + NetworkConfig.Channels[i].Name);
|
||||
continue;
|
||||
}
|
||||
int channelId = cConfig.AddChannel(internalChannels[i].Type);
|
||||
int channelId = NetworkConfig.NetworkTransport.AddChannel(internalChannels[i].Type, settings);
|
||||
MessageManager.channels.Add(internalChannels[i].Name, channelId);
|
||||
channelNames.Add(internalChannels[i].Name);
|
||||
MessageManager.reverseChannels.Add(channelId, internalChannels[i].Name);
|
||||
@ -445,7 +437,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
Debug.LogWarning("MLAPI: Duplicate channel name: " + NetworkConfig.Channels[i].Name);
|
||||
continue;
|
||||
}
|
||||
int channelId = cConfig.AddChannel(NetworkConfig.Channels[i].Type);
|
||||
int channelId = NetworkConfig.NetworkTransport.AddChannel(NetworkConfig.Channels[i].Type, settings);
|
||||
MessageManager.channels.Add(NetworkConfig.Channels[i].Name, channelId);
|
||||
channelNames.Add(NetworkConfig.Channels[i].Name);
|
||||
MessageManager.reverseChannels.Add(channelId, NetworkConfig.Channels[i].Name);
|
||||
@ -459,7 +451,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
MessageManager.reverseMessageTypes.Add(messageId, messageTypes[i].Name);
|
||||
messageId++;
|
||||
}
|
||||
return cConfig;
|
||||
return settings;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -473,7 +465,6 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
return;
|
||||
}
|
||||
|
||||
ConnectionConfig cConfig = Init(true);
|
||||
if (NetworkConfig.ConnectionApproval)
|
||||
{
|
||||
if (ConnectionApprovalCallback == null)
|
||||
@ -481,15 +472,10 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
Debug.LogWarning("MLAPI: No ConnectionApproval callback defined. Connection approval will timeout");
|
||||
}
|
||||
}
|
||||
HostTopology hostTopology = new HostTopology(cConfig, NetworkConfig.MaxConnections);
|
||||
for (int i = 0; i < NetworkConfig.ServerTransports.Count; i++)
|
||||
{
|
||||
if (NetworkConfig.ServerTransports[i].Websockets)
|
||||
NetworkTransport.AddWebsocketHost(hostTopology, NetworkConfig.ServerTransports[i].Port);
|
||||
else
|
||||
NetworkTransport.AddHost(hostTopology, NetworkConfig.ServerTransports[i].Port);
|
||||
}
|
||||
|
||||
|
||||
object settings = Init(true);
|
||||
NetworkConfig.NetworkTransport.RegisterServerListenSocket(settings);
|
||||
|
||||
_isServer = true;
|
||||
_isClient = false;
|
||||
isListening = true;
|
||||
@ -509,37 +495,12 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
return;
|
||||
}
|
||||
|
||||
ConnectionConfig cConfig = Init(false);
|
||||
HostTopology hostTopology = new HostTopology(cConfig, NetworkConfig.MaxConnections);
|
||||
serverHostId = NetworkTransport.AddHost(hostTopology, 0, null);
|
||||
|
||||
object settings = Init(false);
|
||||
byte error;
|
||||
NetworkConfig.NetworkTransport.Connect(NetworkConfig.ConnectAddress, NetworkConfig.ConnectPort, settings, out error);
|
||||
_isServer = false;
|
||||
_isClient = true;
|
||||
isListening = true;
|
||||
byte error;
|
||||
serverConnectionId = NetworkTransport.Connect(serverHostId, NetworkConfig.ConnectAddress, NetworkConfig.ConnectPort, 0, out error);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Starts a client using Websockets
|
||||
/// </summary>
|
||||
public void StartClientWebsocket()
|
||||
{
|
||||
if (isServer || isClient)
|
||||
{
|
||||
Debug.LogWarning("MLAPI: Cannot start client while an instance is already running");
|
||||
return;
|
||||
}
|
||||
|
||||
ConnectionConfig cConfig = Init(false);
|
||||
HostTopology hostTopology = new HostTopology(cConfig, NetworkConfig.MaxConnections);
|
||||
serverHostId = NetworkTransport.AddWebsocketHost(hostTopology, 0, null);
|
||||
|
||||
_isServer = false;
|
||||
_isClient = true;
|
||||
isListening = true;
|
||||
byte error;
|
||||
serverConnectionId = NetworkTransport.Connect(serverHostId, NetworkConfig.ConnectAddress, NetworkConfig.ConnectPort, 0, out error);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -554,12 +515,11 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
if(!disconnectedIds.Contains(pair.Key))
|
||||
{
|
||||
disconnectedIds.Add(pair.Key);
|
||||
NetId netId = new NetId(pair.Key);
|
||||
if (netId.IsHost())
|
||||
if (pair.Key == NetworkConfig.NetworkTransport.HostDummyId ||
|
||||
pair.Key == NetworkConfig.NetworkTransport.InvalidDummyId)
|
||||
continue;
|
||||
|
||||
byte error;
|
||||
NetworkTransport.Disconnect(netId.HostId, netId.ConnectionId, out error);
|
||||
NetworkConfig.NetworkTransport.DisconnectClient(pair.Key);
|
||||
}
|
||||
}
|
||||
foreach (uint clientId in pendingClients)
|
||||
@ -567,12 +527,10 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
if (!disconnectedIds.Contains(clientId))
|
||||
{
|
||||
disconnectedIds.Add(clientId);
|
||||
NetId netId = new NetId(clientId);
|
||||
if (netId.IsHost())
|
||||
if (clientId == NetworkConfig.NetworkTransport.HostDummyId ||
|
||||
clientId == NetworkConfig.NetworkTransport.InvalidDummyId)
|
||||
continue;
|
||||
|
||||
byte error;
|
||||
NetworkTransport.Disconnect(netId.HostId, netId.ConnectionId, out error);
|
||||
NetworkConfig.NetworkTransport.DisconnectClient(clientId);
|
||||
}
|
||||
}
|
||||
_isServer = false;
|
||||
@ -596,8 +554,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
public void StopClient()
|
||||
{
|
||||
_isClient = false;
|
||||
byte error;
|
||||
NetworkTransport.Disconnect(serverHostId, serverConnectionId, out error);
|
||||
NetworkConfig.NetworkTransport.DisconnectFromServer();
|
||||
Shutdown();
|
||||
}
|
||||
|
||||
@ -612,7 +569,6 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
return;
|
||||
}
|
||||
|
||||
ConnectionConfig cConfig = Init(true);
|
||||
if (NetworkConfig.ConnectionApproval)
|
||||
{
|
||||
if (ConnectionApprovalCallback == null)
|
||||
@ -620,28 +576,22 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
Debug.LogWarning("MLAPI: No ConnectionApproval callback defined. Connection approval will timeout");
|
||||
}
|
||||
}
|
||||
HostTopology hostTopology = new HostTopology(cConfig, NetworkConfig.MaxConnections);
|
||||
for (int i = 0; i < NetworkConfig.ServerTransports.Count; i++)
|
||||
{
|
||||
if (NetworkConfig.ServerTransports[i].Websockets)
|
||||
NetworkTransport.AddWebsocketHost(hostTopology, NetworkConfig.ServerTransports[i].Port);
|
||||
else
|
||||
NetworkTransport.AddHost(hostTopology, NetworkConfig.ServerTransports[i].Port);
|
||||
}
|
||||
object settings = Init(true);
|
||||
NetworkConfig.NetworkTransport.RegisterServerListenSocket(settings);
|
||||
|
||||
_isServer = true;
|
||||
_isClient = true;
|
||||
isListening = true;
|
||||
|
||||
NetId netId = new NetId(0, 0, true, false);
|
||||
connectedClients.Add(netId.GetClientId(), new NetworkedClient()
|
||||
uint hostClientId = NetworkConfig.NetworkTransport.HostDummyId;
|
||||
connectedClients.Add(hostClientId, new NetworkedClient()
|
||||
{
|
||||
ClientId = netId.GetClientId()
|
||||
ClientId = hostClientId
|
||||
});
|
||||
|
||||
if(NetworkConfig.HandleObjectSpawning)
|
||||
if (NetworkConfig.HandleObjectSpawning)
|
||||
{
|
||||
SpawnManager.SpawnPlayerObject(netId.GetClientId(), 0, pos.GetValueOrDefault(), rot.GetValueOrDefault());
|
||||
SpawnManager.SpawnPlayerObject(hostClientId, 0, pos.GetValueOrDefault(), rot.GetValueOrDefault());
|
||||
}
|
||||
|
||||
if (OnServerStarted != null)
|
||||
@ -675,7 +625,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
_isClient = false;
|
||||
_isServer = false;
|
||||
SpawnManager.DestroyNonSceneObjects();
|
||||
NetworkTransport.Shutdown();
|
||||
NetworkConfig.NetworkTransport.Shutdown();
|
||||
}
|
||||
|
||||
private float lastReceiveTickTime;
|
||||
@ -691,57 +641,31 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
{
|
||||
foreach (KeyValuePair<uint, NetworkedClient> pair in connectedClients)
|
||||
{
|
||||
NetId netId = new NetId(pair.Key);
|
||||
if (netId.IsHost() || netId.IsInvalid())
|
||||
continue;
|
||||
|
||||
byte error;
|
||||
NetworkTransport.SendQueuedMessages(netId.HostId, netId.ConnectionId, out error);
|
||||
NetworkConfig.NetworkTransport.SendQueue(pair.Key, out error);
|
||||
}
|
||||
lastSendTickTime = NetworkTime;
|
||||
}
|
||||
if((NetworkTime - lastReceiveTickTime >= (1f / NetworkConfig.ReceiveTickrate)) || NetworkConfig.ReceiveTickrate <= 0)
|
||||
{
|
||||
NetworkEventType eventType;
|
||||
NetEventType eventType;
|
||||
int processedEvents = 0;
|
||||
do
|
||||
{
|
||||
processedEvents++;
|
||||
int hostId;
|
||||
int connectionId;
|
||||
uint clientId;
|
||||
int channelId;
|
||||
int receivedSize;
|
||||
byte error;
|
||||
eventType = NetworkTransport.Receive(out hostId, out connectionId, out channelId, messageBuffer, messageBuffer.Length, out receivedSize, out error);
|
||||
NetId netId = new NetId((byte)hostId, (ushort)connectionId, false, false);
|
||||
NetworkError networkError = (NetworkError)error;
|
||||
if (networkError == NetworkError.Timeout)
|
||||
{
|
||||
//Client timed out.
|
||||
if (isServer)
|
||||
{
|
||||
OnClientDisconnect(netId.GetClientId());
|
||||
return;
|
||||
}
|
||||
else
|
||||
_isClientConnected = false;
|
||||
|
||||
if (OnClientDisconnectCallback != null)
|
||||
OnClientDisconnectCallback.Invoke(netId.GetClientId());
|
||||
}
|
||||
else if (networkError != NetworkError.Ok)
|
||||
{
|
||||
Debug.LogWarning("MLAPI: NetworkTransport receive error: " + networkError.ToString());
|
||||
return;
|
||||
}
|
||||
eventType = NetworkConfig.NetworkTransport.PollReceive(out clientId, out channelId, ref messageBuffer, messageBuffer.Length, out receivedSize, out error);
|
||||
|
||||
switch (eventType)
|
||||
{
|
||||
case NetworkEventType.ConnectEvent:
|
||||
case NetEventType.Connect:
|
||||
if (isServer)
|
||||
{
|
||||
pendingClients.Add(netId.GetClientId());
|
||||
StartCoroutine(ApprovalTimeout(netId.GetClientId()));
|
||||
pendingClients.Add(clientId);
|
||||
StartCoroutine(ApprovalTimeout(clientId));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -762,25 +686,25 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
if (NetworkConfig.ConnectionApproval)
|
||||
writer.WriteByteArray(NetworkConfig.ConnectionData);
|
||||
|
||||
InternalMessageHandler.Send(netId.GetClientId(), "MLAPI_CONNECTION_REQUEST", "MLAPI_INTERNAL", writer.Finalize(), null, null, null, true);
|
||||
InternalMessageHandler.Send(clientId, "MLAPI_CONNECTION_REQUEST", "MLAPI_INTERNAL", writer.Finalize(), null, null, null, true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NetworkEventType.DataEvent:
|
||||
HandleIncomingData(netId.GetClientId(), messageBuffer, channelId);
|
||||
case NetEventType.Data:
|
||||
HandleIncomingData(clientId, messageBuffer, channelId);
|
||||
break;
|
||||
case NetworkEventType.DisconnectEvent:
|
||||
case NetEventType.Disconnect:
|
||||
if (isServer)
|
||||
OnClientDisconnect(netId.GetClientId());
|
||||
OnClientDisconnect(clientId);
|
||||
else
|
||||
_isClientConnected = false;
|
||||
|
||||
if (OnClientDisconnectCallback != null)
|
||||
OnClientDisconnectCallback.Invoke(netId.GetClientId());
|
||||
OnClientDisconnectCallback.Invoke(clientId);
|
||||
break;
|
||||
}
|
||||
// Only do another iteration if: there are no more messages AND (there is no limit to max events or we have processed less than the maximum)
|
||||
} while (eventType != NetworkEventType.Nothing && (NetworkConfig.MaxReceiveEventsPerTickRate <= 0 || processedEvents < NetworkConfig.MaxReceiveEventsPerTickRate));
|
||||
} while (eventType != NetEventType.Nothing && (NetworkConfig.MaxReceiveEventsPerTickRate <= 0 || processedEvents < NetworkConfig.MaxReceiveEventsPerTickRate));
|
||||
lastReceiveTickTime = NetworkTime;
|
||||
}
|
||||
|
||||
@ -1029,12 +953,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects)
|
||||
pair.Value.observers.Remove(clientId);
|
||||
|
||||
NetId netId = new NetId(clientId);
|
||||
if (netId.IsHost() || netId.IsInvalid())
|
||||
return;
|
||||
|
||||
byte error;
|
||||
NetworkTransport.Disconnect(netId.HostId, netId.ConnectionId, out error);
|
||||
NetworkConfig.NetworkTransport.DisconnectClient(clientId);
|
||||
}
|
||||
|
||||
internal void OnClientDisconnect(uint clientId)
|
||||
@ -1074,7 +993,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
using (BitWriter writer = new BitWriter())
|
||||
{
|
||||
writer.WriteFloat(NetworkTime);
|
||||
int timestamp = NetworkTransport.GetNetworkTimestamp();
|
||||
int timestamp = NetworkConfig.NetworkTransport.GetNetworkTimestamp();
|
||||
writer.WriteInt(timestamp);
|
||||
|
||||
byte[] buffer = writer.Finalize();
|
||||
@ -1144,7 +1063,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
}
|
||||
|
||||
writer.WriteFloat(NetworkTime);
|
||||
writer.WriteInt(NetworkTransport.GetNetworkTimestamp());
|
||||
writer.WriteInt(NetworkConfig.NetworkTransport.GetNetworkTimestamp());
|
||||
|
||||
writer.WriteInt(connectedClients.Count - 1);
|
||||
foreach (KeyValuePair<uint, NetworkedClient> item in connectedClients)
|
||||
@ -1228,10 +1147,7 @@ namespace MLAPI.MonoBehaviours.Core
|
||||
if (diffieHellmanPublicKeys.ContainsKey(clientId))
|
||||
diffieHellmanPublicKeys.Remove(clientId);
|
||||
|
||||
NetId netId = new NetId(clientId);
|
||||
|
||||
byte error;
|
||||
NetworkTransport.Disconnect(netId.HostId, netId.ConnectionId, out error);
|
||||
NetworkConfig.NetworkTransport.DisconnectClient(clientId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
using MLAPI.Data;
|
||||
using MLAPI.NetworkingManagerComponents.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
|
@ -107,7 +107,7 @@ namespace MLAPI.MonoBehaviours.Prototyping
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if(isOwner || isLocalPlayer || (new NetId(ownerClientId).IsInvalid() && isServer))
|
||||
if(isOwner || isLocalPlayer || (ownerClientId == NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId && isServer))
|
||||
{
|
||||
//We own the object OR we are server and the object is not owned by anyone OR we are the object.
|
||||
if(NetworkingManager.singleton.NetworkTime - lastSendTime >= timeForLerp && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
|
||||
|
@ -4,7 +4,6 @@ using MLAPI.Data;
|
||||
using MLAPI.MonoBehaviours.Core;
|
||||
using MLAPI.NetworkingManagerComponents.Binary;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
namespace MLAPI.NetworkingManagerComponents.Core
|
||||
{
|
||||
@ -73,10 +72,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
float netTime = reader.ReadFloat();
|
||||
int remoteStamp = reader.ReadInt();
|
||||
byte error;
|
||||
NetId netId = new NetId(clientId);
|
||||
int msDelay = NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, remoteStamp, out error);
|
||||
if ((NetworkError)error != NetworkError.Ok)
|
||||
msDelay = 0;
|
||||
int msDelay = NetworkingManager.singleton.NetworkConfig.NetworkTransport.GetRemoteDelayTimeMS(clientId, remoteStamp, out error);
|
||||
netManager.networkTime = netTime + (msDelay / 1000f);
|
||||
|
||||
netManager.connectedClients.Add(netManager.MyClientId, new NetworkedClient() { ClientId = netManager.MyClientId });
|
||||
@ -391,11 +387,8 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
float netTime = reader.ReadFloat();
|
||||
int timestamp = reader.ReadInt();
|
||||
|
||||
NetId netId = new NetId(clientId);
|
||||
byte error;
|
||||
int msDelay = NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, timestamp, out error);
|
||||
if ((NetworkError)error != NetworkError.Ok)
|
||||
msDelay = 0;
|
||||
int msDelay = NetworkingManager.singleton.NetworkConfig.NetworkTransport.GetRemoteDelayTimeMS(clientId, timestamp, out error);
|
||||
netManager.networkTime = netTime + (msDelay / 1000f);
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
using System.Collections.Generic;
|
||||
using MLAPI.Data;
|
||||
using MLAPI.MonoBehaviours.Core;
|
||||
using MLAPI.NetworkingManagerComponents.Binary;
|
||||
using MLAPI.NetworkingManagerComponents.Cryptography;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
namespace MLAPI.NetworkingManagerComponents.Core
|
||||
{
|
||||
@ -12,8 +12,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
internal static byte[] FinalMessageBuffer;
|
||||
internal static void PassthroughSend(uint targetId, uint sourceId, ushort messageType, int channelId, byte[] data, uint? networkId = null, ushort? orderId = null)
|
||||
{
|
||||
NetId targetNetId = new NetId(targetId);
|
||||
if (netManager.isHost && targetNetId.IsHost())
|
||||
if (netManager.isHost && targetId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Host trying to send data to it's own client
|
||||
Debug.LogWarning("MLAPI: Send method got message aimed at server from the server?");
|
||||
@ -44,30 +43,30 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
writer.Finalize(ref FinalMessageBuffer);
|
||||
|
||||
byte error;
|
||||
NetworkTransport.QueueMessageForSending(targetNetId.HostId, targetNetId.ConnectionId, channelId, FinalMessageBuffer, (int)writer.GetFinalizeSize(), out error);
|
||||
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channelId, false, out error);
|
||||
}
|
||||
}
|
||||
|
||||
//RETURNS IF IT SUCCEDED OR FAILED BECAUSE OF NON-OBSERVER. ANY OTHER FAIL WILL RETURN TRUE
|
||||
internal static bool Send(uint clientId, string messageType, string channelName, byte[] data, uint? fromNetId, uint? networkId = null, ushort? orderId = null, bool skipQueue = false)
|
||||
{
|
||||
NetId netId = new NetId(clientId);
|
||||
if (netManager.isHost && netId.IsHost())
|
||||
uint targetClientId = clientId;
|
||||
if (netManager.isHost && targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Don't invoke the message on our own machine. Instant stack overflow.
|
||||
Debug.LogWarning("MLAPI: Cannot send message to own client");
|
||||
return true;
|
||||
}
|
||||
else if (netId.IsHost())
|
||||
else if (targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Client trying to send data to host
|
||||
netId = NetId.ServerNetId;
|
||||
targetClientId = netManager.NetworkConfig.NetworkTransport.ServerNetId;
|
||||
}
|
||||
//If we respect the observers, and the message is targeted (networkId != null) and the targetedNetworkId isnt observing the receiver. Then we return
|
||||
if (netManager.isServer && fromNetId != null && !SpawnManager.spawnedObjects[fromNetId.Value].observers.Contains(clientId))
|
||||
return false;
|
||||
|
||||
bool isPassthrough = (!netManager.isServer && clientId != NetId.ServerNetId.GetClientId() && netManager.NetworkConfig.AllowPassthroughMessages);
|
||||
bool isPassthrough = (!netManager.isServer && clientId != netManager.NetworkConfig.NetworkTransport.ServerNetId && netManager.NetworkConfig.AllowPassthroughMessages);
|
||||
if (isPassthrough && !netManager.NetworkConfig.PassthroughMessageHashSet.Contains(MessageManager.messageTypes[messageType]))
|
||||
{
|
||||
Debug.LogWarning("MLAPI: The The MessageType " + messageType + " is not registered as an allowed passthrough message type.");
|
||||
@ -106,16 +105,16 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
else
|
||||
writer.WriteByteArray(data);
|
||||
|
||||
byte error;
|
||||
if (isPassthrough)
|
||||
netId = NetId.ServerNetId;
|
||||
targetClientId = netManager.NetworkConfig.NetworkTransport.ServerNetId;
|
||||
|
||||
writer.Finalize(ref FinalMessageBuffer);
|
||||
|
||||
byte error;
|
||||
if (skipQueue)
|
||||
NetworkTransport.Send(netId.HostId, netId.ConnectionId, MessageManager.channels[channelName], FinalMessageBuffer, (int)writer.GetFinalizeSize(), out error);
|
||||
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), MessageManager.channels[channelName], true, out error);
|
||||
else
|
||||
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, MessageManager.channels[channelName], FinalMessageBuffer, (int)writer.GetFinalizeSize(), out error);
|
||||
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), MessageManager.channels[channelName], false, out error);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -149,16 +148,16 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
int channel = MessageManager.channels[channelName];
|
||||
for (int i = 0; i < clientIds.Length; i++)
|
||||
{
|
||||
NetId netId = new NetId(clientIds[i]);
|
||||
if (netManager.isHost && netId.IsHost())
|
||||
uint targetClientId = clientIds[i];
|
||||
if (netManager.isHost && targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Don't invoke the message on our own machine. Instant stack overflow.
|
||||
continue;
|
||||
}
|
||||
else if (netId.IsHost())
|
||||
else if (targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Client trying to send data to host
|
||||
netId = NetId.ServerNetId;
|
||||
targetClientId = netManager.NetworkConfig.NetworkTransport.ServerNetId;
|
||||
}
|
||||
|
||||
//If we respect the observers, and the message is targeted (networkId != null) and the targetedNetworkId isnt observing the receiver. Then we continue
|
||||
@ -168,7 +167,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
writer.Finalize(ref FinalMessageBuffer);
|
||||
|
||||
byte error;
|
||||
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, FinalMessageBuffer, (int)writer.GetFinalizeSize(), out error);
|
||||
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channel, false, out error);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -201,16 +200,16 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
int channel = MessageManager.channels[channelName];
|
||||
for (int i = 0; i < clientIds.Count; i++)
|
||||
{
|
||||
NetId netId = new NetId(clientIds[i]);
|
||||
if (netManager.isHost && netId.IsHost())
|
||||
uint targetClientId = clientIds[i];
|
||||
if (netManager.isHost && targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Don't invoke the message on our own machine. Instant stack overflow.
|
||||
continue;
|
||||
}
|
||||
else if (netId.IsHost())
|
||||
else if (targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Client trying to send data to host
|
||||
netId = NetId.ServerNetId;
|
||||
targetClientId = netManager.NetworkConfig.NetworkTransport.ServerNetId;
|
||||
}
|
||||
|
||||
//If we respect the observers, and the message is targeted (networkId != null) and the targetedNetworkId isnt observing the receiver. Then we continue
|
||||
@ -219,8 +218,8 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
|
||||
writer.Finalize(ref FinalMessageBuffer);
|
||||
|
||||
byte error;
|
||||
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, FinalMessageBuffer, (int)writer.GetFinalizeSize(), out error);
|
||||
byte error;
|
||||
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channel, false, out error);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -258,16 +257,16 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
int channel = MessageManager.channels[channelName];
|
||||
foreach (KeyValuePair<uint, NetworkedClient> pair in netManager.connectedClients)
|
||||
{
|
||||
NetId netId = new NetId(pair.Key);
|
||||
if (netManager.isHost && netId.IsHost())
|
||||
uint targetClientId = pair.Key;
|
||||
if (netManager.isHost && targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Don't invoke the message on our own machine. Instant stack overflow.
|
||||
continue;
|
||||
}
|
||||
else if (netId.IsHost())
|
||||
else if (targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Client trying to send data to host
|
||||
netId = NetId.ServerNetId;
|
||||
targetClientId = netManager.NetworkConfig.NetworkTransport.ServerNetId;
|
||||
}
|
||||
|
||||
//If we respect the observers, and the message is targeted (networkId != null) and the targetedNetworkId isnt observing the receiver. Then we continue
|
||||
@ -280,7 +279,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
writer.Finalize(ref FinalMessageBuffer);
|
||||
|
||||
byte error;
|
||||
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, FinalMessageBuffer, (int)writer.GetFinalizeSize(), out error);
|
||||
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channel, false, out error);
|
||||
}
|
||||
return nonObservedIds;
|
||||
}
|
||||
@ -320,16 +319,16 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
if (pair.Key == clientIdToIgnore)
|
||||
continue;
|
||||
|
||||
NetId netId = new NetId(pair.Key);
|
||||
if (netManager.isHost && netId.IsHost())
|
||||
uint targetClientId = pair.Key;
|
||||
if (netManager.isHost && targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Don't invoke the message on our own machine. Instant stack overflow.
|
||||
continue;
|
||||
}
|
||||
else if (netId.IsHost())
|
||||
else if (targetClientId == netManager.NetworkConfig.NetworkTransport.HostDummyId)
|
||||
{
|
||||
//Client trying to send data to host
|
||||
netId = NetId.ServerNetId;
|
||||
targetClientId = netManager.NetworkConfig.NetworkTransport.ServerNetId;
|
||||
}
|
||||
|
||||
//If we respect the observers, and the message is targeted (networkId != null) and the targetedNetworkId isnt observing the receiver. Then we continue
|
||||
@ -342,7 +341,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
writer.Finalize(ref FinalMessageBuffer);
|
||||
|
||||
byte error;
|
||||
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, FinalMessageBuffer, (int)writer.GetFinalizeSize(), out error);
|
||||
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channel, false, out error);
|
||||
}
|
||||
return nonObservedIds;
|
||||
}
|
||||
|
@ -1,9 +1,7 @@
|
||||
using MLAPI.Data;
|
||||
using MLAPI.MonoBehaviours.Core;
|
||||
using MLAPI.MonoBehaviours.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
namespace MLAPI.NetworkingManagerComponents.Core
|
||||
{
|
||||
@ -62,8 +60,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
Debug.LogWarning("MLAPI: Lag compensation simulations are only to be ran on the server.");
|
||||
return;
|
||||
}
|
||||
NetId netId = new NetId(clientId);
|
||||
float milisecondsDelay = NetworkTransport.GetCurrentRTT(netId.HostId, netId.ConnectionId, out error) / 2f;
|
||||
float milisecondsDelay = NetworkingManager.singleton.NetworkConfig.NetworkTransport.GetCurrentRTT(clientId, out error) / 2f;
|
||||
Simulate(milisecondsDelay * 1000f, action);
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
{
|
||||
NetworkedObject netObject = SpawnManager.spawnedObjects[netId];
|
||||
NetworkingManager.singleton.connectedClients[netObject.OwnerClientId].OwnedObjects.RemoveAll(x => x.NetworkId == netId);
|
||||
netObject.ownerClientId = new NetId(0, 0, false, true).GetClientId();
|
||||
netObject.ownerClientId = NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId;
|
||||
|
||||
using (BitWriter writer = new BitWriter())
|
||||
{
|
||||
@ -250,7 +250,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
|
||||
{
|
||||
if (!spawnedObjects.ContainsKey(networkId) || (netManager != null && !netManager.NetworkConfig.HandleObjectSpawning))
|
||||
return;
|
||||
if (!new NetId(spawnedObjects[networkId].OwnerClientId).IsInvalid() && !spawnedObjects[networkId].isPlayerObject)
|
||||
if (spawnedObjects[networkId].OwnerClientId != NetworkingManager.singleton.NetworkConfig.NetworkTransport.InvalidDummyId && !spawnedObjects[networkId].isPlayerObject)
|
||||
{
|
||||
//Someone owns it.
|
||||
NetworkingManager.singleton.connectedClients[spawnedObjects[networkId].OwnerClientId].OwnedObjects.RemoveAll(x => x.NetworkId == networkId);
|
||||
|
Loading…
x
Reference in New Issue
Block a user