Skip to content

Added targeted object targeted messages #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 74 additions & 2 deletions MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,14 @@ public int ownerClientId

protected int RegisterMessageHandler(string name, Action<int, byte[]> action)
{
int counter = MessageManager.AddIncomingMessageHandler(name, action);
int counter = MessageManager.AddIncomingMessageHandler(name, action, networkId);
registeredMessageHandlers.Add(name, counter);
return counter;
}

protected void DeregisterMessageHandler(string name, int counter)
{
MessageManager.RemoveIncomingMessageHandler(name, counter);
MessageManager.RemoveIncomingMessageHandler(name, counter, networkId);
}

private void OnDestroy()
Expand All @@ -98,6 +98,18 @@ protected void SendToServer(string messageType, string channelName, byte[] data)
}
}

protected void SendToServerTarget(string messageType, string channelName, byte[] data)
{
if (isServer)
{
MessageManager.InvokeTargetedMessageHandler(messageType, data, -1, networkId);
}
else
{
NetworkingManager.singleton.Send(NetworkingManager.singleton.serverClientId, messageType, channelName, data, networkId);
}
}

protected void SendToLocalClient(string messageType, string channelName, byte[] data)
{
if (!isServer)
Expand All @@ -108,6 +120,16 @@ protected void SendToLocalClient(string messageType, string channelName, byte[]
NetworkingManager.singleton.Send(ownerClientId, messageType, channelName, data);
}

protected void SendToLocalClientTarget(string messageType, string channelName, byte[] data)
{
if (!isServer)
{
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
return;
}
NetworkingManager.singleton.Send(ownerClientId, messageType, channelName, data, networkId);
}

protected void SendToNonLocalClients(string messageType, string channelName, byte[] data)
{
if (!isServer)
Expand All @@ -118,6 +140,16 @@ protected void SendToNonLocalClients(string messageType, string channelName, byt
NetworkingManager.singleton.Send(messageType, channelName, data, ownerClientId);
}

protected void SendToNonLocalClientsTarget(string messageType, string channelName, byte[] data)
{
if (!isServer)
{
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
return;
}
NetworkingManager.singleton.Send(messageType, channelName, data, ownerClientId, networkId);
}

protected void SendToClient(int clientId, string messageType, string channelName, byte[] data)
{
if (!isServer)
Expand All @@ -128,6 +160,16 @@ protected void SendToClient(int clientId, string messageType, string channelName
NetworkingManager.singleton.Send(clientId, messageType, channelName, data);
}

protected void SendToClientTarget(int clientId, string messageType, string channelName, byte[] data)
{
if (!isServer)
{
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
return;
}
NetworkingManager.singleton.Send(clientId, messageType, channelName, data, networkId);
}

protected void SendToClients(int[] clientIds, string messageType, string channelName, byte[] data)
{
if (!isServer)
Expand All @@ -138,6 +180,16 @@ protected void SendToClients(int[] clientIds, string messageType, string channel
NetworkingManager.singleton.Send(clientIds, messageType, channelName, data);
}

protected void SendToClientsTarget(int[] clientIds, string messageType, string channelName, byte[] data)
{
if (!isServer)
{
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
return;
}
NetworkingManager.singleton.Send(clientIds, messageType, channelName, data, networkId);
}

protected void SendToClients(List<int> clientIds, string messageType, string channelName, byte[] data)
{
if (!isServer)
Expand All @@ -148,6 +200,16 @@ protected void SendToClients(List<int> clientIds, string messageType, string cha
NetworkingManager.singleton.Send(clientIds, messageType, channelName, data);
}

protected void SendToClientsTarget(List<int> clientIds, string messageType, string channelName, byte[] data)
{
if (!isServer)
{
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
return;
}
NetworkingManager.singleton.Send(clientIds, messageType, channelName, data, networkId);
}

protected void SendToClients(string messageType, string channelName, byte[] data)
{
if (!isServer)
Expand All @@ -158,6 +220,16 @@ protected void SendToClients(string messageType, string channelName, byte[] data
NetworkingManager.singleton.Send(messageType, channelName, data);
}

protected void SendToClientsTarget(string messageType, string channelName, byte[] data)
{
if (!isServer)
{
Debug.LogWarning("MLAPI: Sending messages from client to other clients is not yet supported");
return;
}
NetworkingManager.singleton.Send(messageType, channelName, data, networkId);
}

protected NetworkedObject GetNetworkedObject(uint networkId)
{
return SpawnManager.spawnedObjects[networkId];
Expand Down
91 changes: 64 additions & 27 deletions MLAPI/MonoBehaviours/Core/NetworkingManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ private ConnectionConfig Init(NetworkingConfiguration netConfig)
MessageManager.messageCallbacks = new Dictionary<ushort, Dictionary<int, Action<int, byte[]>>>();
MessageManager.messageHandlerCounter = new Dictionary<ushort, int>();
MessageManager.releasedMessageHandlerCounters = new Dictionary<ushort, Stack<int>>();
MessageManager.targetedMessages = new Dictionary<ushort, Dictionary<uint, List<int>>>();
SpawnManager.spawnedObjects = new Dictionary<uint, NetworkedObject>();
SpawnManager.releasedNetworkObjectIds = new Stack<uint>();
if (NetworkConfig.HandleObjectSpawning)
Expand Down Expand Up @@ -319,6 +320,10 @@ private void HandleIncomingData(int connectonId, byte[] data)
using (BinaryReader reader = new BinaryReader(readStream))
{
ushort messageType = reader.ReadUInt16();
bool targeted = reader.ReadBoolean();
uint targetNetworkId = 0;
if(targeted)
targetNetworkId = reader.ReadUInt32();

//Client tried to send a network message that was not the connection request before he was accepted.
if (isServer && pendingClients.Contains(clientId) && messageType != 0)
Expand All @@ -332,10 +337,22 @@ private void HandleIncomingData(int connectonId, byte[] data)
if (messageType >= 32)
{
//Custom message, invoke all message handlers
foreach (KeyValuePair<int, Action<int, byte[]>> pair in MessageManager.messageCallbacks[messageType])
if(targeted)
{
pair.Value(clientId, incommingData);
}
List<int> handlerIds = MessageManager.targetedMessages[messageType][targetNetworkId];
Debug.Log(handlerIds.Count);
for (int i = 0; i < handlerIds.Count; i++)
{
MessageManager.messageCallbacks[messageType][handlerIds[i]](clientId, incommingData);
}
}
else
{
foreach (KeyValuePair<int, Action<int, byte[]>> pair in MessageManager.messageCallbacks[messageType])
{
pair.Value(clientId, incommingData);
}
}
}
else
{
Expand Down Expand Up @@ -478,12 +495,15 @@ private void HandleIncomingData(int connectonId, byte[] data)
}
}

internal void Send(int clientId, string messageType, string channelName, byte[] data)
internal void Send(int clientId, string messageType, string channelName, byte[] data, uint? networkId = null)
{
if(isHost && clientId == -1)
{
//Host trying to send data to it's own client
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
if (networkId == null)
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
else
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
return;
}
else if(clientId == -1)
Expand All @@ -496,125 +516,139 @@ internal void Send(int clientId, string messageType, string channelName, byte[]
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.Write((ushort)data.Length);
writer.Write(data);
}
//2 bytes for message type and 2 bytes for byte length
int size = data.Length + 4;
byte[] dataToSend = stream.ToArray();
NetworkTransport.Send(hostId, clientId, MessageManager.channels[channelName], dataToSend, dataToSend.Length, out error);
}
}

internal void Send(int[] clientIds, string messageType, string channelName, byte[] data)
internal void Send(int[] clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
{
using (MemoryStream stream = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.Write((ushort)data.Length);
writer.Write(data);
}
//2 bytes for message type and 2 bytes for byte length
int size = data.Length + 4;
byte[] dataToSend = stream.ToArray();
int channel = MessageManager.channels[channelName];
for (int i = 0; i < clientIds.Length; i++)
{
int clientId = clientIds[i];
if (isHost && clientId == -1)
{
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
if (networkId == null)
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
else
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
continue;
}
else if (clientId == -1)
{
//Client trying to send data to host
clientId = serverClientId;
}
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
}
}
}

internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data)
internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
{
using (MemoryStream stream = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.Write((ushort)data.Length);
writer.Write(data);
}
//2 bytes for message type and 2 bytes for byte length
int size = data.Length + 4;
byte[] dataToSend = stream.ToArray();
int channel = MessageManager.channels[channelName];
for (int i = 0; i < clientIds.Count; i++)
{
int clientId = clientIds[i];
if (isHost && clientId == -1)
{
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
if (networkId == null)
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
else
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
continue;
}
else if (clientId == -1)
{
//Client trying to send data to host
clientId = serverClientId;
}
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
}
}
}

internal void Send(string messageType, string channelName, byte[] data)
internal void Send(string messageType, string channelName, byte[] data, uint? networkId = null)
{
using (MemoryStream stream = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.Write((ushort)data.Length);
writer.Write(data);
}
//2 bytes for message type and 2 bytes for byte length
int size = data.Length + 4;
byte[] dataToSend = stream.ToArray();
int channel = MessageManager.channels[channelName];
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
{
int clientId = pair.Key;
if(isHost && pair.Key == -1)
{
MessageManager.InvokeMessageHandlers(messageType, data, pair.Key);
if (networkId == null)
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
else
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
continue;
}
else if (clientId == -1)
{
//Client trying to send data to host
clientId = serverClientId;
}
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);

}
}
}

internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore)
internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore, uint? networkId = null)
{
using (MemoryStream stream = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.Write((ushort)data.Length);
writer.Write(data);
}
//2 bytes for message type and 2 bytes for byte length
int size = data.Length + 4;
byte[] dataToSend = stream.ToArray();
int channel = MessageManager.channels[channelName];
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
Expand All @@ -624,15 +658,18 @@ internal void Send(string messageType, string channelName, byte[] data, int clie
int clientId = pair.Key;
if (isHost && pair.Key == -1)
{
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
if (networkId == null)
MessageManager.InvokeMessageHandlers(messageType, data, clientId);
else
MessageManager.InvokeTargetedMessageHandler(messageType, data, clientId, networkId.Value);
continue;
}
else if (clientId == -1)
{
//Client trying to send data to host
clientId = serverClientId;
}
NetworkTransport.Send(hostId, clientId, channel, dataToSend, size, out error);
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
}
}
}
Expand Down
Loading