From 35c0f731293d6b78f3b5eb11b539aa7ff14c998f Mon Sep 17 00:00:00 2001 From: techiesplash Date: Sun, 15 Jan 2023 13:55:38 -0800 Subject: [PATCH] first commit --- .gitignore | 4 + ...84f5bfc4-1178-4eb2-9ba0-96ef4f71fbdd.vsidx | Bin 0 -> 206593 bytes .vs/Matchmaker/FileContentIndex/read.lock | 0 .vs/Matchmaker/v17/.suo | Bin 0 -> 87040 bytes .vs/ProjectSettings.json | 3 + .vs/VSWorkspaceState.json | 8 + .vs/slnx.sqlite | Bin 0 -> 131072 bytes Client/Client.cs | 471 +++++++++++++ Client/ClientHandle.cs | 122 ++++ Client/ClientSend.cs | 214 ++++++ Client/Packet.cs | 403 +++++++++++ Client/ThreadManager.cs | 119 ++++ Config.cs | 36 + IMGUIMenuDemo.cs | 93 +++ Images/preview.png | Bin 0 -> 157723 bytes LICENSE.md | 22 + LobbyManager.cs | 24 + Matchmaker.cs | 654 ++++++++++++++++++ README.md | 40 ++ ThreadObject.cs | 19 + Visual Scripting/DummyScript_Icon.cs | 7 + Visual Scripting/MatchmakerNode_Address.cs | 42 ++ Visual Scripting/MatchmakerNode_Connect.cs | 39 ++ .../MatchmakerNode_ConnectLobby.cs | 47 ++ Visual Scripting/MatchmakerNode_Disconnect.cs | 37 + .../MatchmakerNode_DisconnectLobby.cs | 37 + ...tchmakerNode_GetAllLobbiesWithAttribute.cs | 77 +++ .../MatchmakerNode_GetAllLobbyIds.cs | 65 ++ .../MatchmakerNode_GetClientAttribute.cs | 76 ++ .../MatchmakerNode_GetLobbyAttribute.cs | 76 ++ .../MatchmakerNode_GetLobbyAttributeDirect.cs | 72 ++ .../MatchmakerNode_GetLobbyByUuid.cs | 65 ++ .../MatchmakerNode_IsClientConnected.cs | 31 + .../MatchmakerNode_IsLobbyConnected.cs | 31 + Visual Scripting/MatchmakerNode_Port.cs | 44 ++ .../MatchmakerNode_SetClientAttribute.cs | 65 ++ .../MatchmakerNode_SetClientObjects.cs | 55 ++ .../MatchmakerNode_SetLobbyAttribute.cs | 65 ++ Visual Scripting/MatchmakerNode_ThisClient.cs | 31 + Visual Scripting/MatchmakerNode_ThisLobby.cs | 35 + Visual Scripting/MirrorNodeHelper.cs | 37 + Visual Scripting/icon.png | Bin 0 -> 12214 bytes 42 files changed, 3266 insertions(+) create mode 100644 .gitignore create mode 100755 .vs/Matchmaker/FileContentIndex/84f5bfc4-1178-4eb2-9ba0-96ef4f71fbdd.vsidx create mode 100755 .vs/Matchmaker/FileContentIndex/read.lock create mode 100755 .vs/Matchmaker/v17/.suo create mode 100755 .vs/ProjectSettings.json create mode 100755 .vs/VSWorkspaceState.json create mode 100755 .vs/slnx.sqlite create mode 100755 Client/Client.cs create mode 100755 Client/ClientHandle.cs create mode 100755 Client/ClientSend.cs create mode 100755 Client/Packet.cs create mode 100755 Client/ThreadManager.cs create mode 100755 Config.cs create mode 100755 IMGUIMenuDemo.cs create mode 100755 Images/preview.png create mode 100755 LICENSE.md create mode 100755 LobbyManager.cs create mode 100755 Matchmaker.cs create mode 100755 README.md create mode 100755 ThreadObject.cs create mode 100755 Visual Scripting/DummyScript_Icon.cs create mode 100755 Visual Scripting/MatchmakerNode_Address.cs create mode 100755 Visual Scripting/MatchmakerNode_Connect.cs create mode 100755 Visual Scripting/MatchmakerNode_ConnectLobby.cs create mode 100755 Visual Scripting/MatchmakerNode_Disconnect.cs create mode 100755 Visual Scripting/MatchmakerNode_DisconnectLobby.cs create mode 100755 Visual Scripting/MatchmakerNode_GetAllLobbiesWithAttribute.cs create mode 100755 Visual Scripting/MatchmakerNode_GetAllLobbyIds.cs create mode 100755 Visual Scripting/MatchmakerNode_GetClientAttribute.cs create mode 100755 Visual Scripting/MatchmakerNode_GetLobbyAttribute.cs create mode 100755 Visual Scripting/MatchmakerNode_GetLobbyAttributeDirect.cs create mode 100755 Visual Scripting/MatchmakerNode_GetLobbyByUuid.cs create mode 100755 Visual Scripting/MatchmakerNode_IsClientConnected.cs create mode 100755 Visual Scripting/MatchmakerNode_IsLobbyConnected.cs create mode 100755 Visual Scripting/MatchmakerNode_Port.cs create mode 100755 Visual Scripting/MatchmakerNode_SetClientAttribute.cs create mode 100755 Visual Scripting/MatchmakerNode_SetClientObjects.cs create mode 100755 Visual Scripting/MatchmakerNode_SetLobbyAttribute.cs create mode 100755 Visual Scripting/MatchmakerNode_ThisClient.cs create mode 100755 Visual Scripting/MatchmakerNode_ThisLobby.cs create mode 100755 Visual Scripting/MirrorNodeHelper.cs create mode 100755 Visual Scripting/icon.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab45420 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.meta +"Visual Scripting"/.meta +Client/.meta +Images/.meta \ No newline at end of file diff --git a/.vs/Matchmaker/FileContentIndex/84f5bfc4-1178-4eb2-9ba0-96ef4f71fbdd.vsidx b/.vs/Matchmaker/FileContentIndex/84f5bfc4-1178-4eb2-9ba0-96ef4f71fbdd.vsidx new file mode 100755 index 0000000000000000000000000000000000000000..ecb27b535e25132352ad1010fca201119869e3bf GIT binary patch literal 206593 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 Y$o27W;QajmU%os4KXoxYdBF?*AM$c;XaE2J literal 0 HcmV?d00001 diff --git a/.vs/Matchmaker/FileContentIndex/read.lock b/.vs/Matchmaker/FileContentIndex/read.lock new file mode 100755 index 0000000..e69de29 diff --git a/.vs/Matchmaker/v17/.suo b/.vs/Matchmaker/v17/.suo new file mode 100755 index 0000000000000000000000000000000000000000..9cf9f50d3924b5286a949adb37abc22383a7335e GIT binary patch literal 87040 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 literal 0 HcmV?d00001 diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100755 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100755 index 0000000..6176ad1 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,8 @@ +{ + "ExpandedNodes": [ + "", + "\\Visual Scripting" + ], + "SelectedNode": "\\Visual Scripting", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100755 index 0000000000000000000000000000000000000000..b0b025b87738296d6a43fee4e6fe1759a6cc9f58 GIT binary patch literal 131072 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 UnnpK8-XL76$i=0VUY{!c2B-?rtpET3 literal 0 HcmV?d00001 diff --git a/Client/Client.cs b/Client/Client.cs new file mode 100755 index 0000000..6fcf41e --- /dev/null +++ b/Client/Client.cs @@ -0,0 +1,471 @@ +/* + * MIT License + * + * Copyright (c) 2020 Tom Weiland + * Copyright (c) 2022 Vincent Dowling + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using Scripts.Matchmaker; +using UnityEngine; + +// ReSharper disable once CheckNamespace +namespace Scripts.CustomServer +{ + ///

+ /// Stores information about the connection. + /// + public class Client : MonoBehaviour + { + public ClientSend.StatusType? lastStatusType; + public int lastReceivedInt; + public ClientHandle.ClientAttrib lastReceivedAttrib; + + public bool welcomeReceived; + private const int DataBufferSize = 4096; + + + /// + /// For editor readability. + /// + public string displayName; + + public string ip = Config.Address; + public int port = 26950; + public int myId; + public Tcp tcp; + public UDP udp; + private bool isConnected; + + /// + /// Checks if it is connected to a server + /// + public bool IsConnected + { + get + { + try + { + if (tcp.socket is { Client: { Connected: true } }) + { + /* pear to the documentation on Poll: + * When passing SelectMode.SelectRead as a parameter to the Poll method it will return + * -either- true if Socket.Listen(Int32) has been called and a connection is pending; + * -or- true if data is available for reading; + * -or- true if the connection has been closed, reset, or terminated; + * otherwise, returns false + */ + + // Detect if listClient disconnected + if (tcp.socket.Client.Poll(0, SelectMode.SelectRead)) + { + byte[] buff = new byte[1]; + if (tcp.socket.Client.Receive(buff, SocketFlags.Peek) == 0) + { + // Client disconnected + return false; + } + else + { + return true; + } + } + + return true; + } + else + { + return false; + } + } + catch + { + return false; + } + } + } + + public void OnDestroy() + { + Disconnect(); + } + + + public class ClientPackets + { + public delegate void PacketHandler(Client server, Packet packet); + + // ReSharper disable once FieldCanBeMadeReadOnly.Global + public Dictionary packetHandlers; + + public ClientPackets(Dictionary packetHandlers) + { + this.packetHandlers = packetHandlers; + packetHandlers.Add(int.MaxValue, ClientHandle.Welcome); + packetHandlers.Add(int.MaxValue - 1, ClientHandle.ServerDisconnect); + packetHandlers.Add(int.MaxValue - 2, ClientHandle.GetClientAttributesReceived); + packetHandlers.Add(int.MaxValue - 3, ClientHandle.StatusReceived); + } + } + + private ClientPackets packets = new(new Dictionary()); + + private void OnApplicationQuit() + { + Disconnect(); // Disconnect when the game is closed + } + + /// Attempts to connect to the server. + public bool ConnectToServer(ClientPackets packetList) + { + welcomeReceived = false; + Debug.Log($"Attempting connection to server with ip={ip} port={port}"); + this.packets = packetList; + tcp = new Tcp(this); + udp = new UDP(this); + + packetList.packetHandlers.TryAdd(int.MaxValue, ClientHandle.Welcome); + packetList.packetHandlers.TryAdd(int.MaxValue - 1, ClientHandle.ServerDisconnect); + packetList.packetHandlers.TryAdd(int.MaxValue - 2, ClientHandle.GetClientAttributesReceived); + packetList.packetHandlers.TryAdd(int.MaxValue - 3, ClientHandle.StatusReceived); + + InitializeClientData(); + + isConnected = true; + tcp.Connect(); // MatchmakerNode_Connect tcp, udp gets connected once tcp is done + + // Wait for a response from the server + var startTime = DateTime.Now.Ticks; + + while (!welcomeReceived && + ((DateTime.Now.Ticks - startTime) < ClientSend.timeOutTime)) + { + } + + // If timed out + if ((DateTime.Now.Ticks - startTime) >= ClientSend.timeOutTime) + { + Debug.LogError($"ConnectToServer: Request timed out!."); + return false; + } + + return true; + } + + /// + /// Subclass to handle TCP networking + /// + public class Tcp + { + public TcpClient socket; + private readonly Client instance; + + private NetworkStream stream; + private Packet receivedData; + private byte[] receiveBuffer; + + public Tcp(Client inst) + { + instance = inst; + } + + /// Attempts to connect to the server via TCP. + public void Connect() + { + socket = new TcpClient + { + ReceiveBufferSize = DataBufferSize, + SendBufferSize = DataBufferSize + }; + + receiveBuffer = new byte[DataBufferSize]; + socket.BeginConnect(instance.ip, instance.port, ConnectCallback, socket); + } + + /// Initializes the newly connected listClient's TCP-related info. + private void ConnectCallback(IAsyncResult result) + { + socket.EndConnect(result); + + if (!socket.Connected) + { + return; + } + + stream = socket.GetStream(); + + receivedData = new Packet(); + + stream.BeginRead(receiveBuffer, 0, DataBufferSize, ReceiveCallback, null); + } + + /// Sends data to the listClient via TCP. + /// The packet to send. + public void SendData(Packet packet) + { + try + { + if (socket != null) + { + stream.BeginWrite(packet.ToArray(), 0, packet.Length(), null, null); // Send data to server + } + } + catch (Exception ex) + { + Debug.Log($"Error sending data to server via TCP: {ex}"); + } + } + + /// Reads incoming data from the stream. + private void ReceiveCallback(IAsyncResult result) + { + Debug.Log("Received TCP data. Preparing to handle..."); + try + { + if (instance.IsConnected) + { + int byteLength = stream.EndRead(result); + if (byteLength <= 0) + { + instance.Disconnect(); + return; + } + + byte[] data = new byte[byteLength]; + Array.Copy(receiveBuffer, data, byteLength); + + receivedData.Reset(HandleData(data)); // Reset receivedData if all data was handled + stream.BeginRead(receiveBuffer, 0, DataBufferSize, ReceiveCallback, null); + } + } + catch (Exception ex) + { + Debug.LogError($"Error in TCP Receive Callback: {ex}"); + Disconnect(); + } + } + + /// Prepares received data to be used by the appropriate packet handler methods. + /// The received data. + private bool HandleData(byte[] data) + { + Debug.Log("Now handling data (TCP)..."); + int packetLength = 0; + + receivedData.SetBytes(data); + + if (receivedData.UnreadLength() >= 4) + { + // If listClient's received data contains a packet + packetLength = receivedData.ReadInt(); + if (packetLength <= 0) + { + // If packet contains no data + return true; // Reset receivedData instance to allow it to be reused + } + } + + while (packetLength > 0 && packetLength <= receivedData.UnreadLength()) + { + if (socket != null) + { + // While packet contains data AND packet data length doesn't exceed the length of the packet we're reading + var packetBytes = receivedData.ReadBytes(packetLength); + // ThreadManager.Start(); + // ThreadManager.ExecuteOnMainThread(() => + // { + using var packet = new Packet(packetBytes); + int packetId = packet.ReadInt(); + Debug.Log($"Received TCP Packet number {packetId}"); + instance.packets.packetHandlers + [packetId](instance, packet); // Call appropriate method to handle the packet + // }); + } + + packetLength = 0; // Reset packet length + if (receivedData.UnreadLength() >= 4) + { + // If listClient's received data contains another packet + packetLength = receivedData.ReadInt(); + if (packetLength <= 0) + { + // If packet contains no data + return true; // Reset receivedData instance to allow it to be reused + } + } + } + + if (packetLength <= 1) + { + return true; // Reset receivedData instance to allow it to be reused + } + + return false; + } + + /// Disconnects from the server and cleans up the TCP connection. + private void Disconnect() + { + instance.Disconnect(); + + stream = null; + receivedData = null; + receiveBuffer = null; + socket = null; + } + } + + /// + /// Subclass to handle UDP networking + /// + public class UDP + { + public UdpClient socket; + private IPEndPoint endPoint; + private readonly Client instance; + + public UDP(Client inst) + { + instance = inst; + endPoint = new IPEndPoint(IPAddress.Parse(instance.ip), instance.port); + } + + /// Attempts to connect to the server via UDP. + /// The port number to bind the UDP socket to. + public void Connect(int localPort) + { + socket = new UdpClient(localPort); + + socket.Connect(endPoint); + socket.BeginReceive(ReceiveCallback, null); + + using Packet packet = new Packet(); + SendData(packet); + } + + /// Sends data to the listClient via UDP. + /// The packet to send. + public void SendData(Packet packet) + { + try + { + packet.InsertInt(instance.myId); // Insert the listClient's ID at the start of the packet + if (socket != null) + { + socket.BeginSend(packet.ToArray(), packet.Length(), null, null); + } + } + catch (Exception ex) + { + Debug.Log($"Error sending data to server via UDP: {ex}"); + } + } + + /// Receives incoming UDP data. + private void ReceiveCallback(IAsyncResult result) + { + Debug.Log("Received UDP data. Preparing to handle..."); + try + { + if (instance.IsConnected) + { + byte[] data = socket.EndReceive(result, ref endPoint); + socket.BeginReceive(ReceiveCallback, null); + + if (data.Length < 4) + { + instance.Disconnect(); + return; + } + + HandleData(data); + } + } + catch (Exception ex) + { + Debug.LogError($"Error in UDP Receive Callback: {ex}"); + Disconnect(); + } + } + + /// Prepares received data to be used by the appropriate packet handler methods. + /// The received data. + private void HandleData(byte[] data) + { + Debug.Log("Now handling data (UDP)..."); + using var packet = new Packet(data); + + var packetLength = packet.ReadInt(); + data = packet.ReadBytes(packetLength); + + + if (packet == null) throw new ArgumentNullException(nameof(packet)); + + // ThreadManager.Start(); + // ThreadManager.ExecuteOnMainThread(() => + // { + using var packet2 = new Packet(data); + var packetId = packet2.ReadInt(); + try + { + instance.packets.packetHandlers + [packetId](instance, packet2); // Call appropriate method to handle the packet + } + catch (Exception e) + { + Debug.LogError($"Error in UDP packet handler {packetId}: {e}"); + throw; + } + + // }); + } + + /// Disconnects from the server and cleans up the UDP connection. + private void Disconnect() + { + instance.Disconnect(); + + endPoint = null; + socket = null; + } + } + + /// Initializes all necessary listClient data. + private void InitializeClientData() + { + } + + /// Disconnects from the server and stops all network traffic. + public void Disconnect() + { + if (!isConnected) return; + isConnected = false; + tcp.socket.Close(); + + udp?.socket?.Close(); + + Debug.Log("Disconnected from server."); + } + } +} \ No newline at end of file diff --git a/Client/ClientHandle.cs b/Client/ClientHandle.cs new file mode 100755 index 0000000..bdfd9e9 --- /dev/null +++ b/Client/ClientHandle.cs @@ -0,0 +1,122 @@ +/* + * MIT License + * + * Copyright (c) 2020 Tom Weiland + * Copyright (c) 2022 Vincent Dowling + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System; +using System.Net; +using Scripts.Matchmaker; +using UnityEngine; + +// ReSharper disable once CheckNamespace +namespace Scripts.CustomServer +{ + public static class ClientHandle + { + public class ClientAttrib + { + // ReSharper disable once MemberCanBePrivate.Global + public int id; + public readonly string name; + public readonly string value; + + public ClientAttrib(int id, string name, string value) + { + this.id = id; + this.name = name; + this.value = value; + } + } + + public static ClientAttrib lastReceivedAttrib; + + public static void GetClientAttributesReceived(Client client, Packet packet) + { + var requestedId = packet.ReadInt(); + var name = packet.ReadString(); + var value = packet.ReadString(); + + Debug.Log("Received object attributes (Obj. ID: " + requestedId.ToString() + "): '" + name + "', '" + + value + "'."); + + lastReceivedAttrib = new ClientAttrib(requestedId, name, value); + } + + public static void Welcome(Client client, Packet packet) + { + var msg = packet.ReadString(); + var myId = packet.ReadInt(); + + var serverAPIVersion = packet.ReadString(); + var serverId = packet.ReadString(); + var gameVersion = packet.ReadString(); + + // Version check + if (serverAPIVersion != Config.MatchmakerAPIVersion) + { + Debug.LogWarning( + $"Client API version mismatch! Server API version is {serverAPIVersion} while Client API version is {Config.MatchmakerAPIVersion}."); + client.Disconnect(); + return; + } + + if (serverId != Config.GameId) + { + Debug.LogWarning($"Client-Server Game ID Mismatch! Server ID is {serverId} while Client Game ID is {Config.GameId}."); + client.Disconnect(); + return; + } + + // Version check + if (gameVersion != Config.GameVersion) + { + Debug.LogWarning( + $"Client game version mismatch! Server game version is {gameVersion} while Client game version is {Config.GameVersion}."); + client.Disconnect(); + return; + } + + client.welcomeReceived = true; + + Debug.Log($"Message from server: {msg}"); + client.myId = myId; + ClientSend.WelcomeReceived(client); + + client.udp.Connect(((IPEndPoint)client.tcp.socket.Client.LocalEndPoint).Port); + client.welcomeReceived = true; + //MatchmakerBehaviour.APIClientPackets.RequestAllLobbyIds(listClient); + } + + public static void ServerDisconnect(Client client, Packet packet) + { + client.Disconnect(); + } + + public static void StatusReceived(Client client, Packet packet) + { + var type = packet.ReadInt(); + Debug.Log($"Status received: {(ClientSend.StatusType)type}"); + client.lastStatusType = (ClientSend.StatusType)type; + } + } +} \ No newline at end of file diff --git a/Client/ClientSend.cs b/Client/ClientSend.cs new file mode 100755 index 0000000..b624f10 --- /dev/null +++ b/Client/ClientSend.cs @@ -0,0 +1,214 @@ +/* + * MIT License + * + * Copyright (c) 2020 Tom Weiland + * Copyright (c) 2022 Vincent Dowling + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System; +using UnityEngine; +using Scripts.Matchmaker; +using DateTime = System.DateTime; + +// ReSharper disable once CheckNamespace +namespace Scripts.CustomServer +{ + public static class ClientSend + { + + + public enum StatusType + { + Ok, + Received, + Fail + } + + // ReSharper disable once FieldCanBeMadeReadOnly.Global + // ReSharper disable once ConvertToConstant.Global + public static float timeOutTime = 30000000; + + // ReSharper disable once MemberCanBePrivate.Global + public static void SendTcpDataNoSync(Client client, Packet packet) + { + packet.WriteLength(); + client.tcp.SendData(packet); + } + + // ReSharper disable once UnusedMember.Global + public static void SendUdpDataNoSync(Client client, Packet packet) + { + packet.WriteLength(); + client.udp.SendData(packet); + } + + public static bool SendTcpData(Client client, Packet packet) + { + if (client.IsConnected) + { + // Send the data + packet.WriteLength(); + client.tcp.SendData(packet); + if (Config.Sync) + { + // Wait for a response from the server + var startTime = DateTime.Now.Ticks; + + client.lastStatusType = null; + + while (client.lastStatusType == null && + ((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + } + + // If timed out + if ((DateTime.Now.Ticks - startTime) < timeOutTime) + { + Debug.LogError($"SendTCPData: Request timed out!."); + return false; + } + + + return client.lastStatusType is StatusType.Ok or StatusType.Received; + } + + return true; + } + else + { + Debug.LogWarning("Attempted to send TCP data through a disconnected Client!"); + return false; + } + } + + // ReSharper disable once UnusedMember.Global + public static bool SendUdpData(Client client, Packet packet) + { + if (client.IsConnected) + { + // Send the data + packet.WriteLength(); + client.udp.SendData(packet); + if (Config.Sync) + { + // Wait for a response from the server + var startTime = DateTime.Now.Ticks; + + client.lastStatusType = null; + + while (client.lastStatusType == null && + ((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + } + + // If timed out + if ((DateTime.Now.Ticks - startTime) < timeOutTime) + { + Debug.LogError($"SendTCPData: Request timed out!."); + return false; + } + + + return client.lastStatusType is StatusType.Ok or StatusType.Received; + } + + return true; + } + // If status received + else + { + Debug.LogWarning("Attempted to send UDP data through a disconnected Client!"); + return false; + } + } + + #region Built-in Packets + + public static void WelcomeReceived(Client client) + { + Debug.Log("Sending 'Welcome Received' message..."); + using var packet = new Packet(int.MaxValue); + + packet.Write(client.myId); + packet.Write(Config.MatchmakerAPIVersion); + packet.Write(Config.GameVersion); + packet.Write(Config.GameId); + + SendTcpData(client, packet); + } + + public static bool SetClientAttribute(Client client, String name, String value) + { + Debug.Log("Sending request to change a Client Attribute..."); + using var packet = new Packet(int.MaxValue - 1); + packet.Write(client.myId); + packet.Write(name); + packet.Write(value); + + if (ClientSend.SendTcpData(client, packet)) + { + return true; + } + + return false; + } + + public static ClientHandle.ClientAttrib GetClientAttribute(Client client, int id, String name) + { + Debug.Log("Sending request to be sent a Client Attribute..."); + using var packet = new Packet(int.MaxValue - 2); + packet.Write(client.myId); + packet.Write(id); + packet.Write(name); + + ClientHandle.lastReceivedAttrib = null; + ClientSend.SendTcpData(client, packet); + + var startTime = DateTime.Now.Ticks; + + while (ClientHandle.lastReceivedAttrib == null && ((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + } + + if (!((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + Debug.LogError("GetClientAttribute: Request timed out!"); + } + + return ClientHandle.lastReceivedAttrib; + } + + /// + /// Respond to the listClient with a status + /// + /// What Client is sending it + /// What status + public static void Status(Client client, StatusType status) + { + using var packet = new Packet(int.MaxValue - 3); + packet.Write((int)status); + + SendTcpDataNoSync(client, packet); + } + + #endregion + } +} \ No newline at end of file diff --git a/Client/Packet.cs b/Client/Packet.cs new file mode 100755 index 0000000..47dfbec --- /dev/null +++ b/Client/Packet.cs @@ -0,0 +1,403 @@ +/* + * MIT License + * + * Copyright (c) 2020 Tom Weiland + * Copyright (c) 2022 Vincent Dowling + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System; +using System.Collections.Generic; +using System.Text; +using UnityEngine; + +// ReSharper disable once CheckNamespace +namespace Scripts.CustomServer +{ + +public sealed class Packet : IDisposable +{ + private List buffer; + private byte[] readableBuffer; + private int readPos; + + /// Creates a new empty packet (without an ID). + public Packet() + { + buffer = new List(); // Initialize buffer + readPos = 0; // Set readPos to 0 + } + + /// Creates a new packet with a given ID. Used for sending. + /// The packet ID. + public Packet(int id) + { + buffer = new List(); // Initialize buffer + readPos = 0; // Set readPos to 0 + + Write(id); // Write packet id to the buffer + } + + /// Creates a packet from which data can be read. Used for receiving. + /// The bytes to add to the packet. + public Packet(byte[] data) + { + buffer = new List(); // Initialize buffer + readPos = 0; // Set readPos to 0 + + SetBytes(data); + } + + #region Functions + /// Sets the packet's content and prepares it to be read. + /// The bytes to add to the packet. + public void SetBytes(byte[] data) + { + Write(data); + readableBuffer = buffer.ToArray(); + } + + /// Inserts the length of the packet's content at the start of the buffer. + public void WriteLength() + { + buffer.InsertRange(0, BitConverter.GetBytes(buffer.Count)); // Insert the byte length of the packet at the very beginning + } + + /// Inserts the given int at the start of the buffer. + /// The int to insert. + public void InsertInt(int value) + { + buffer.InsertRange(0, BitConverter.GetBytes(value)); // Insert the int at the start of the buffer + } + + /// Gets the packet's content in array form. + public byte[] ToArray() + { + readableBuffer = buffer.ToArray(); + return readableBuffer; + } + + /// Gets the length of the packet's content. + public int Length() + { + return buffer.Count; // Return the length of buffer + } + + /// Gets the length of the unread data contained in the packet. + public int UnreadLength() + { + return Length() - readPos; // Return the remaining length (unread) + } + + /// Resets the packet instance to allow it to be reused. + /// Whether or not to reset the packet. + public void Reset(bool shouldReset = true) + { + if (shouldReset) + { + buffer.Clear(); // Clear buffer + readableBuffer = null; + readPos = 0; // Reset readPos + } + else + { + readPos -= 4; // "Unread" the last read int + } + } + #endregion + + #region Write Data + /// Adds a byte to the packet. + /// The byte to add. + public void Write(byte value) + { + buffer.Add(value); + } + /// Adds an array of bytes to the packet. + /// The byte array to add. + // ReSharper disable once MemberCanBePrivate.Global + public void Write(IEnumerable value) + { + buffer.AddRange(value); + } + /// Adds a short to the packet. + /// The short to add. + public void Write(short value) + { + buffer.AddRange(BitConverter.GetBytes(value)); + } + /// Adds an int to the packet. + /// The int to add. + public void Write(int value) + { + buffer.AddRange(BitConverter.GetBytes(value)); + } + /// Adds a long to the packet. + /// The long to add. + public void Write(long value) + { + buffer.AddRange(BitConverter.GetBytes(value)); + } + /// Adds a float to the packet. + /// The float to add. + public void Write(float value) + { + buffer.AddRange(BitConverter.GetBytes(value)); + } + /// Adds a bool to the packet. + /// The bool to add. + public void Write(bool value) + { + buffer.AddRange(BitConverter.GetBytes(value)); + } + /// Adds a string to the packet. + /// The string to add. + public void Write(string value) + { + Write(value.Length); // Add the length of the string to the packet + buffer.AddRange(Encoding.ASCII.GetBytes(value)); // Add the string itself + } + /// Adds a Vector3 to the packet. + /// The Vector3 to add. + public void Write(Vector3 value) + { + Write(value.x); + Write(value.y); + Write(value.z); + } + /// Adds a Quaternion to the packet. + /// The Quaternion to add. + public void Write(Quaternion value) + { + Write(value.x); + Write(value.y); + Write(value.z); + Write(value.w); + } + #endregion + + #region Read Data + /// Reads a byte from the packet. + /// Whether or not to move the buffer's read position. + public byte ReadByte(bool moveReadPos = true) + { + if (buffer.Count > readPos) + { + // If there are unread bytes + var value = readableBuffer[readPos]; // Get the byte at readPos' position + if (moveReadPos) + { + // If _moveReadPos is true + readPos += 1; // Increase readPos by 1 + } + return value; // Return the byte + } + else + { + throw new Exception("Could not read value of type 'byte'!"); + } + } + + /// Reads an array of bytes from the packet. + /// The length of the byte array. + /// Whether or not to move the buffer's read position. + public byte[] ReadBytes(int length, bool moveReadPos = true) + { + if (buffer.Count > readPos) + { + // If there are unread bytes + var value = buffer.GetRange(readPos, length).ToArray(); // Get the bytes at readPos' position with a range of _length + if (moveReadPos) + { + // If _moveReadPos is true + readPos += length; // Increase readPos by _length + } + return value; // Return the bytes + } + else + { + throw new Exception("Could not read value of type 'byte[]'!"); + } + } + + /// Reads a short from the packet. + /// Whether or not to move the buffer's read position. + public short ReadShort(bool moveReadPos = true) + { + if (buffer.Count > readPos) + { + // If there are unread bytes + var value = BitConverter.ToInt16(readableBuffer, readPos); // Convert the bytes to a short + if (moveReadPos) + { + // If _moveReadPos is true and there are unread bytes + readPos += 2; // Increase readPos by 2 + } + return value; // Return the short + } + else + { + throw new Exception("Could not read value of type 'short'!"); + } + } + + /// Reads an int from the packet. + /// Whether or not to move the buffer's read position. + public int ReadInt(bool moveReadPos = true) + { + if (buffer.Count > readPos) + { + // If there are unread bytes + var value = BitConverter.ToInt32(readableBuffer, readPos); // Convert the bytes to an int + if (moveReadPos) + { + // If _moveReadPos is true + readPos += 4; // Increase readPos by 4 + } + return value; // Return the int + } + else + { + throw new Exception("Could not read value of type 'int'!"); + } + } + + /// Reads a long from the packet. + /// Whether or not to move the buffer's read position. + public long ReadLong(bool moveReadPos = true) + { + if (buffer.Count > readPos) + { + // If there are unread bytes + var value = BitConverter.ToInt64(readableBuffer, readPos); // Convert the bytes to a long + if (moveReadPos) + { + // If _moveReadPos is true + readPos += 8; // Increase readPos by 8 + } + return value; // Return the long + } + else + { + throw new Exception("Could not read value of type 'long'!"); + } + } + + /// Reads a float from the packet. + /// Whether or not to move the buffer's read position. + public float ReadFloat(bool moveReadPos = true) + { + if (buffer.Count > readPos) + { + // If there are unread bytes + var value = BitConverter.ToSingle(readableBuffer, readPos); // Convert the bytes to a float + if (moveReadPos) + { + // If _moveReadPos is true + readPos += 4; // Increase readPos by 4 + } + return value; // Return the float + } + else + { + throw new Exception("Could not read value of type 'float'!"); + } + } + + /// Reads a bool from the packet. + /// Whether or not to move the buffer's read position. + public bool ReadBool(bool moveReadPos = true) + { + if (buffer.Count > readPos) + { + // If there are unread bytes + var value = BitConverter.ToBoolean(readableBuffer, readPos); // Convert the bytes to a bool + if (moveReadPos) + { + // If _moveReadPos is true + readPos += 1; // Increase readPos by 1 + } + return value; // Return the bool + } + else + { + throw new Exception("Could not read value of type 'bool'!"); + } + } + + /// Reads a string from the packet. + /// Whether or not to move the buffer's read position. + public string ReadString(bool moveReadPos = true) + { + try + { + var length = ReadInt(); // Get the length of the string + var value = Encoding.ASCII.GetString(readableBuffer, readPos, length); // Convert the bytes to a string + if (moveReadPos && value.Length > 0) + { + // If _moveReadPos is true string is not empty + readPos += length; // Increase readPos by the length of the string + } + return value; // Return the string + } + catch + { + throw new Exception("Could not read value of type 'string'!"); + } + } + + /// Reads a Vector3 from the packet. + /// Whether or not to move the buffer's read position. + public Vector3 ReadVector3(bool moveReadPos = true) + { + return new Vector3(ReadFloat(moveReadPos), ReadFloat(moveReadPos), ReadFloat(moveReadPos)); + } + + /// Reads a Quaternion from the packet. + /// Whether or not to move the buffer's read position. + public Quaternion ReadQuaternion(bool moveReadPos = true) + { + return new Quaternion(ReadFloat(moveReadPos), ReadFloat(moveReadPos), ReadFloat(moveReadPos), ReadFloat(moveReadPos)); + } + #endregion + + private bool disposed; + + private void Dispose(bool disposing) + { + if (disposed) return; + if (disposing) + { + buffer = null; + readableBuffer = null; + readPos = 0; + } + + disposed = true; + } + + public void Dispose() + { + Dispose(true); + // ReSharper disable once GCSuppressFinalizeForTypeWithoutDestructor + GC.SuppressFinalize(this); + } +} +} \ No newline at end of file diff --git a/Client/ThreadManager.cs b/Client/ThreadManager.cs new file mode 100755 index 0000000..24a23f0 --- /dev/null +++ b/Client/ThreadManager.cs @@ -0,0 +1,119 @@ +/* + * MIT License + * + * Copyright (c) 2020 Tom Weiland + * Copyright (c) 2022 Vincent Dowling + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System; +using System.Collections.Generic; +using System.Threading; +using UnityEngine; + +// ReSharper disable once CheckNamespace +namespace Scripts.CustomServer +{ + public static class ThreadManager + { + private static readonly List ActionsForMainThread = new(); + private static readonly List ExecuteCopiedOnMainThread = new(); + private static bool _actionToExecuteOnMainThread; + + private const int TicksPerSec = 40; + private const float MsPerTick = 1000f / TicksPerSec; + private static bool _isRunning; + + private static readonly Thread MainThreadObject = new(MainThread); + + + public static void Start() + { + if (_isRunning) return; + _isRunning = true; + MainThreadObject.Start(); + + } + + public static void Stop() + { + _isRunning = false; + } + + + /// Sets an action to be executed on the main thread. + /// The action to be executed on the main thread. + public static void ExecuteOnMainThread(Action action) + { + if (action == null) + { + Debug.Log("No action to execute on main thread!"); + return; + } + + lock (ActionsForMainThread) + { + ActionsForMainThread.Add(action); + _actionToExecuteOnMainThread = true; + } + } + + + /// Executes all code meant to run on the main thread. NOTE: Call this ONLY from the main thread. + public static void UpdateMain() + { + if (!_actionToExecuteOnMainThread) return; + ExecuteCopiedOnMainThread.Clear(); + lock (ActionsForMainThread) + { + ExecuteCopiedOnMainThread.AddRange(ActionsForMainThread); + ActionsForMainThread.Clear(); + _actionToExecuteOnMainThread = false; + } + + foreach (var t in ExecuteCopiedOnMainThread) + { + t(); + } + } + + + private static void MainThread() + { + Debug.Log($"Main thread started. Running at {TicksPerSec} ticks per second."); + var nextLoop = DateTime.Now; + + while (_isRunning) + { + while (nextLoop < DateTime.Now) + { + UpdateMain(); + + nextLoop = nextLoop.AddMilliseconds(MsPerTick); + + if (nextLoop > DateTime.Now) + { + Thread.Sleep(nextLoop - DateTime.Now); + } + } + } + } + } +} \ No newline at end of file diff --git a/Config.cs b/Config.cs new file mode 100755 index 0000000..ea6c6dd --- /dev/null +++ b/Config.cs @@ -0,0 +1,36 @@ +namespace Scripts.Matchmaker +{ + public static class Config + { + /// + /// This allows you to name the game so your game cannot connect to servers it is not supposed to. + /// + public const string GameId = "My Game Name"; + + /// + /// The version of the matchmaker APII. This must match here and on the server for a connection. + /// + public const string MatchmakerAPIVersion = "1.1.6"; + + /// + /// The version of the game itself. Must match on the server for a connection. + /// Name is also valid, as it is a string. + /// + public const string GameVersion = "0.0.1"; + + /// + /// What port the server will be on (0-65535). The lobby server will use a port two (2) above this. + /// + public const ushort Port = 26950; + + /// + /// What address the server is at. + /// + public const string Address = "192.168.1.204"; + + /// + /// Makes it so it waits for a response from the server every time it sends data. Slow, advise use for debugging. + /// + public const bool Sync = false; + } +} \ No newline at end of file diff --git a/IMGUIMenuDemo.cs b/IMGUIMenuDemo.cs new file mode 100755 index 0000000..914fd2c --- /dev/null +++ b/IMGUIMenuDemo.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Mirror; +using Scripts.CustomServer; +using Scripts.Matchmaker; +using UnityEngine; + +[RequireComponent(typeof(Client))] +public class IMGUIMenuDemo : MonoBehaviour, IMatchmaker +{ + private List ServerList = new(); + + public static bool CreatePublic; + + private string connectText; + + private void Start() + { + IMatchmaker.listClient = gameObject.GetComponent(); + } + + private void Refresh() + { + IMatchmaker.Connect(); + /* var x = IMatchmaker.GetAllLobbyIdsByAttribute("public", "True"); + foreach (var y in x) + { + ServerList.Add(IMatchmaker.GetLobbyAttribute(y, "_auto_ip")); + }*/ + // IMatchmaker.Disconnect(); + } + + private void OnGUI() + { + GUI.Box(new Rect(10, 10, 200, 500), "Connection Manager"); + + connectText = GUI.TextField(new Rect(30, 30, 160, 20), connectText); + + if (GUI.Button(new Rect(30, 60, 160, 20), "Connect")) + { + // Check if it is an IP + NetworkManager.singleton.networkAddress = connectText; + NetworkManager.singleton.StartClient(); + + // Otherwise + IMatchmaker.Connect(); + + var uuidLobby = IMatchmaker.GetLobbyIdByUuid(connectText); + var address = ""; + + if (uuidLobby > 0) + { + NetworkManager.singleton.networkAddress = IMatchmaker.GetLobbyAttribute(uuidLobby, "_auto_uuid"); + IMatchmaker.Disconnect(); + NetworkManager.singleton.StartClient(); + } + else + { + IMatchmaker.Disconnect(); + } + } + + if (GUI.Button(new Rect(30, 100, 160, 20), "Start Host (Public)")) + { + CreatePublic = true; + NetworkManager.singleton.StartHost(); + } + + if (GUI.Button(new Rect(30, 130, 160, 20), "Start Host (Private)")) + { + CreatePublic = false; + NetworkManager.singleton.StartHost(); + } + + if (GUI.Button(new Rect(30, 170, 160, 20), "Refresh")) + { + Refresh(); + } + + int yPos = 200; + + foreach (var x in ServerList) + { + if(GUI.Button(new Rect(30, yPos+=30, 160, 20), x)) + { + NetworkManager.singleton.networkAddress = x; + NetworkManager.singleton.StartClient(); + } + } + + } +} \ No newline at end of file diff --git a/Images/preview.png b/Images/preview.png new file mode 100755 index 0000000000000000000000000000000000000000..13e78ffcf1c564deb78a92fe7d92cd42f1e2ed32 GIT binary patch literal 157723 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 literal 0 HcmV?d00001 diff --git a/LICENSE.md b/LICENSE.md new file mode 100755 index 0000000..b32a8c9 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2020 Tom Weiland +Copyright (c) 2022 Techiesplash + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/LobbyManager.cs b/LobbyManager.cs new file mode 100755 index 0000000..4873ade --- /dev/null +++ b/LobbyManager.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Collections.Generic; +using Mirror; +using Scripts.CustomServer; +using Scripts.Matchmaker; +using UnityEngine; +using UnityEngine.UI; + +[RequireComponent(typeof(Client))] +public class LobbyManager : NetworkBehaviour +{ + public Text text; + + public override void OnStartServer() + { + if (isServer) + { + IMatchmaker.lobbyClient = gameObject.GetComponent(); + IMatchmaker.ConnectLobby(); + IMatchmaker.SetLobbyAttribute("public", IMGUIMenuDemo.CreatePublic.ToString()); + text.text = IMatchmaker.GetLobbyAttributeDirect("_auto_uuid"); + } + } +} diff --git a/Matchmaker.cs b/Matchmaker.cs new file mode 100755 index 0000000..a64f4b2 --- /dev/null +++ b/Matchmaker.cs @@ -0,0 +1,654 @@ +/* + * MIT License + * + * Copyright (c) 2020 Tom Weiland + * Copyright (c) 2022 Vincent Dowling + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +using System; +using System.Collections.Generic; +using System.Threading; +using JetBrains.Annotations; +using Scripts.CustomServer; +using UnityEngine; +using Client = Scripts.CustomServer.Client; + +// ReSharper disable once CheckNamespace +namespace Scripts.Matchmaker +{ + public interface IMatchmaker + { + /************************************************************************************************************** + * Matchmaker Programming Interface - External + **************************************************************************************************************/ + + // Global Variables -------------------------------------------------------------------------------------------- + public static Client listClient; + public static Client lobbyClient; + public static int port = Config.Port; + public static string ip = Config.Address; + public static string GameId = Config.GameId; + + public static readonly Client.ClientPackets apiPackets = new Client.ClientPackets( + new Dictionary() + { + { 10, API.APIPacketHandlers.ReceiveLobbyId }, + { 11, API.APIPacketHandlers.GetLobbyAttributesReceived }, + { 12, API.APIPacketHandlers.FinishedSendingLobbyIds }, + }); + + // API Functions - Connection Management ----------------------------------------------------------------------- + + ///

+ /// MatchmakerNode_Connect the List Client. + /// + public static bool Connect() + { + if (listClient != null) + { + listClient.ip = ip; + listClient.port = port; + listClient.welcomeReceived = false; + if (!listClient.ConnectToServer(apiPackets)) return false; + var startTime = DateTime.Now.Ticks; + + while (listClient.welcomeReceived == false && ((DateTime.Now.Ticks - startTime) < 30000000)) + { + } + + if ((DateTime.Now.Ticks - startTime) < 30000000) return true; + Debug.LogError("Failed to connect to List Server: Connection timed out!"); + } + else + { + Debug.LogError( + "Attempted to connect to the List Server while listClient is null. Please set Matchmaker.listClient first!"); + } + + return false; + } + + /// + /// MatchmakerNode_Connect the Lobby Client. + /// + public static bool ConnectLobby() + { + + lobbyClient.ip = ip; + lobbyClient.port = port + 2; + lobbyClient.welcomeReceived = false; + if (lobbyClient.ConnectToServer(new Client.ClientPackets(new Dictionary()))) + { + var startTime = DateTime.Now.Ticks; + + while (lobbyClient.welcomeReceived == false && ((DateTime.Now.Ticks - startTime) < 30000000)) + { + } + + if ((DateTime.Now.Ticks - startTime) < 30000000) return true; + Debug.LogError("Failed to connect to to Lobby Server: Connection timed out!"); + return false; + } + + return false; + } + + /// + /// Disconnect the List Client. + /// + public static void Disconnect() + { + if (listClient != null) + { + listClient.Disconnect(); + } + else + { + Debug.LogWarning( + "Attempted to disconnect a List Client while listClient is null. Please set Matchmaker.listClient first!"); + } + } + + /// + /// Disconnect the Lobby Client. + /// + public static void DisconnectLobby() + { + Debug.Log("Disconnecting from Lobby server..."); + // SetLobbyAttribute("_auto_uuid", "DISCONNECTED_LOBBY"); + // SetLobbyAttribute("_auto_ip", "DISCONNECTED_LOBBY"); + // SetLobbyAttribute("_auto_port", "DISCONNECTED_LOBBY"); + lobbyClient.Disconnect(); + } + + // API Functions - Client Attributes --------------------------------------------------------------------------- + /// + /// Set an Attribute on the List Client. + /// + /// Name of the Attribute to set + /// Value of the Attribute to set to + public static bool SetClientAttribute(string name, string value) + { + if (listClient != null) + { + if (listClient.IsConnected) + { + if (ClientSend.SetClientAttribute(listClient, name, value)) + { + return true; + } + } + } + else + { + Debug.LogWarning( + "Attempted to set a List Client Attribute while listClient is null. Please set Matchmaker.listClient first!"); + } + + return false; + } + + /// + /// Get a List Client's Attribute. + /// + /// What List Client to find the Attribute in + /// Name of the Attribute to get. + /// The value of the Attribute. Returns null on failure. + public static string GetClientAttribute(int clientId, string name) + { + if (listClient != null) + { + if (listClient.IsConnected) + { + var foo = ClientSend.GetClientAttribute(listClient, clientId, name); + + + // Debug check - Is the received Attributes Name not the same as the requested one? + if (foo.name == name) return foo.value; + Debug.LogError("Requested Attribute Name and Received Attribute Name do not match!"); + return null; + } + } + else + { + Debug.LogWarning( + "Attempted to get a List Client Attribute while listClient is null. Please set Matchmaker.listClient first!"); + } + + + return null; + } + + // API Functions - Lobby Attributes ---------------------------------------------------------------------------- + /// + /// Get a Lobby Client's Attribute straight from the Lobby Server. + /// + /// What Lobby Client to find the Attribute in + /// Name of the Attribute to get. + /// The value of the Attribute. Returns null on failure. + public static string GetLobbyAttributeDirect(string name) + { + if (lobbyClient != null) + { + if (lobbyClient.IsConnected) + { + var foo = ClientSend.GetClientAttribute(lobbyClient, lobbyClient.myId, name); + + + // Debug check - Is the received Attributes Name not the same as the requested one? + if (foo.name == name) return foo.value; + Debug.LogError("Requested Attribute Name and Received Attribute Name do not match!"); + return null; + } + } + else + { + Debug.LogWarning( + "Attempted to get a Lobby Client's Attribute *directly* while lobbyClient is null. Please set Matchmaker.lobbyClient first!"); + } + + return null; + } + + /// + /// Set a Attribute on the Lobby Client. + /// + /// Name of the Attribute to set. + /// What value to set the Attribute to. + public static bool SetLobbyAttribute(string name, string value) + { + if (lobbyClient != null) + { + if (lobbyClient.IsConnected) + { + return ClientSend.SetClientAttribute(lobbyClient, name, value); + } + } + else + { + Debug.LogWarning( + "Attempted to set a Lobby Client Attribute while lobbyClient is null. Please set Matchmaker.lobbyClient first!"); + } + + return false; + } + + /// + /// Get a Lobby Client Attribute by passing through the List Server. + /// + /// What Lobby Client to find the Attribute in + /// Name of the Attribute to get. + /// The value of the Attribute. Returns null on failure. + public static string GetLobbyAttribute(int clientId, string name) + { + if (listClient != null) + { + if (listClient.IsConnected) + { + var foo = API.APIClientPackets.GetLobbyAttribute(listClient, clientId, name); + + if (foo == null) + { + Debug.LogWarning("Received Lobby Attribute is null!"); + return null; + } + + // Debug check - Is the received Attributes Name not the same as the requested one? + if (foo.name == name) return foo.value; + Debug.LogError( + $"Requested Attribute Name {foo.name} and Received Attribute Name {name} do not match!"); + return null; + } + } + else + { + Debug.LogWarning( + "Attempted to get a Lobby Client's Attribute while listClient is null. Please set Matchmaker.listClient first!"); + } + + + return null; + } + + // API Functions - Lobby Discovery ----------------------------------------------------------------------------- + /// + /// Gets a Lobby Client's ID by its UUID. + /// + /// The UUID to find a Lobby Client with. + /// A Lobby Client's ID with matching UUID. + public static int GetLobbyIdByUuid(string uuid) + { + if (listClient != null) + { + if (listClient.IsConnected) + { + API.APIPacketHandlers.lobbyIds.Clear(); + var foo = GetAllLobbyIdsByAttribute("_auto_uuid", uuid); + if(foo.Count > 1) + { + Debug.LogWarning("Found more than one lobby with UUID!"); + } + if (foo.Count <= 0) + { + Debug.LogWarning( + "Failed to find Lobby IDs with matching UUID!"); + return 0; + } + + else + { + return foo[0]; + } + } + } + else + { + Debug.LogWarning( + "Attempted to get a Lobby Client's ID through a UUID while listClient is null. Please set Matchmaker.listClient first!"); + } + + + return 0; + } + + /// + /// Gets all Lobby IDs by matching Attribute + /// + /// The name of the Attribute + /// The value of the Attribute + public static List GetAllLobbyIdsByAttribute(string attribName, string attribValue) + { + API.APIPacketHandlers.lobbyIds.Clear(); + if (listClient != null) + { + if (!listClient.IsConnected) return API.APIPacketHandlers.lobbyIds; + + var foo = API.APIClientPackets.RequestLobbyIdsWithMatchingAttribute(listClient, attribName, attribValue); + if (!foo) + { + Debug.LogWarning( + "Failed to find Lobby IDs with matching Attrbute!"); + + } + return API.APIPacketHandlers.lobbyIds; + } + else + { + Debug.LogWarning( + "Attempted to get all lobby IDs with matching Attribute while listClient is null. Please set Matchmaker.listClient first!"); + } + + + return API.APIPacketHandlers.lobbyIds; + } + + /// + /// Gets a list of the IDs of all connected Lobby Clients. Also calls a callback at Matchmaker.API.lobbyCallback for every ID. + /// + /// List of Lobby Client IDs + [CanBeNull] + public static List GetAllLobbyIds() + { + if (listClient != null) + { + API.APIPacketHandlers.lobbyIds.Clear(); + + Debug.Log("GetAllLobbyIds() called."); + if (listClient.IsConnected) + { + API.APIClientPackets.RequestAllLobbyIds(listClient); + } + + Debug.LogWarning("Attempted to request all Lobby IDs while Client is disconnected!"); + } + else + { + Debug.LogWarning( + "Attempted to get a list of all Lobby IDs while listClient is null. Please set Matchmaker.listClient first!"); + } + + Debug.Log($"Lobby ID list length: {API.APIPacketHandlers.lobbyIds.Count}"); + return API.APIPacketHandlers.lobbyIds; + } + + /************************************************************************************************************** + * Matchmaker Programming Interface - Internal + **************************************************************************************************************/ + /// + /// Contains the internal functionality for the Matchmaker API + /// + public static class API + { + // API Internals - Global Variables ------------------------------------------------------------------------ + public delegate void UserCallbackDelegate(int userId); + + /// + /// Gets called back whenever a Lobby Client ID is received by GetAllLobbyIds(). + /// + public static UserCallbackDelegate lobbyCallback; + + private static readonly List ExecuteOnApiThread = new(); + private static readonly List ExecuteCopiedOnApiThread = new(); + private static bool _actionToExecuteOnApiThread; + + private const int TicksPerSec = 30; + private const float MsPerTick = 1000f / TicksPerSec; + private static bool _isRunning = true; + + private static Thread _apiThread; + + // API Internals - API Thread Manager ---------------------------------------------------------------------- + private static void APIThread(object data) + { + Debug.Log($"MatchmakerBehaviour thread started. Running at {TicksPerSec} ticks per second."); + var nextLoop = DateTime.Now; + + while (_isRunning) + { + while (nextLoop < DateTime.Now) + { + UpdateAPI(); + + nextLoop = nextLoop.AddMilliseconds(MsPerTick); + + if (nextLoop > DateTime.Now) + { + Thread.Sleep(nextLoop - DateTime.Now); + } + } + } + } + + public static void StartThreads() + { + // if (apiThread != null || _isRunning != false) return; + + _isRunning = true; + _apiThread = new Thread(APIThread); + _apiThread.Start(0); + } + + + public static void StopThreads() + { + _isRunning = false; + } + + /// Sets an action to be executed on the main thread. + /// The action to be executed on the main thread. + public static void ExecuteOnAPIThread(Action action) + { + if (action == null) + { + Debug.Log("No action to execute on MatchmakerBehaviour thread!"); + return; + } + + lock (ExecuteOnApiThread) + { + ExecuteOnApiThread.Add(action); + _actionToExecuteOnApiThread = true; + } + } + + + /// + /// Executes all code meant to run on the main thread. NOTE: Call this ONLY from the main thread. + /// + private static void UpdateAPI() + { + if (_actionToExecuteOnApiThread) + { + ExecuteCopiedOnApiThread.Clear(); + lock (ExecuteOnApiThread) + { + ExecuteCopiedOnApiThread.AddRange(ExecuteOnApiThread); + ExecuteOnApiThread.Clear(); + _actionToExecuteOnApiThread = false; + } + + foreach (var t in ExecuteCopiedOnApiThread) + { + t(); + } + } + } + + // API Internals - Packet Handling ------------------------------------------------------------------------- + public static class APIPacketHandlers + { + public static readonly List lobbyIds = new(); + public static bool finishedSendingIds; + public static bool receivedId; + + public static void ReceiveLobbyId(Client client, Packet packet) + { + receivedId = true; + int userId = packet.ReadInt(); + int mod = packet.ReadInt(); + Debug.Log("Received lobby id: " + userId.ToString()); + lobbyIds.Add(userId); + switch (mod) + { + case 0: + { + if (API.lobbyCallback != null) + { + API.lobbyCallback.Invoke(userId); + } + + break; + } + default: + client.lastReceivedInt = userId; + break; + } + } + + + public static void GetLobbyAttributesReceived(Client client, Packet packet) + { + int requestedId = packet.ReadInt(); + string name = packet.ReadString(); + string value = packet.ReadString(); + + Debug.Log("Received lobby attributes (Obj. ID: " + requestedId.ToString() + "): '" + name + "', '" + + value + "'."); + + client.lastReceivedAttrib = new ClientHandle.ClientAttrib(requestedId, name, value); + } + + public static void FinishedSendingLobbyIds(Client client, Packet packet) + { + Debug.Log("Finished receiving Lobby IDs."); + finishedSendingIds = true; + } + } + + // API Internals - Packet Sending -------------------------------------------------------------------------- + public static class APIClientPackets + { + // ReSharper disable once FieldCanBeMadeReadOnly.Global + // ReSharper disable once ConvertToConstant.Global + // ReSharper disable once MemberCanBePrivate.Global + public static long timeOutTime = 300000000; + + public static bool RequestAllLobbyIds(Client client) + { + if (client.IsConnected) + { + APIPacketHandlers.finishedSendingIds = false; + Debug.Log("Getting all the connected lobby IDs..."); + using var packet = new Packet(10); + packet.Write(client.myId); + ClientSend.SendTcpData(client, packet); + + + var startTime = DateTime.Now.Ticks; + + while (!APIPacketHandlers.finishedSendingIds && + ((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + if (!APIPacketHandlers.receivedId) continue; + startTime = DateTime.Now.Ticks; + APIPacketHandlers.receivedId = false; + } + + if (!((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + Debug.LogError( + $"RequestAllLobbyIds: Request timed out! Returning {client.lastReceivedInt}"); + return false; + } + + return true; + } + else + { + Debug.LogWarning("Tried to request all Lobby IDs while the Client is disconnected!"); + return false; + } + } + + + public static bool RequestLobbyIdsWithMatchingAttribute(Client client, string attribName, + string attribValue) + { + Debug.Log("Getting a lobby ID by UUID..."); + + using var packet = new Packet(11); + APIPacketHandlers.finishedSendingIds = false; + + packet.Write(client.myId); + packet.Write(attribName); + packet.Write(attribValue); + + ClientSend.SendTcpData(client, packet); + var startTime = DateTime.Now.Ticks; + + while (!APIPacketHandlers.finishedSendingIds && + ((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + // if (!APIPacketHandlers.receivedId) continue; + // startTime = DateTime.Now.Ticks; + // APIPacketHandlers.receivedId = false; + } + + if (!((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + Debug.LogError( + $"RequestLobbyIdsWithMatchingAttribute: Request timed out!"); + return false; + } + + return true; + } + + public static ClientHandle.ClientAttrib GetLobbyAttribute(Client client, int requestedId, string name) + { + Debug.Log("Getting a lobby attribute..."); + using var packet = new Packet(12); + packet.Write(client.myId); + packet.Write(requestedId); + packet.Write(name); + + ClientSend.SendTcpData(client, packet); + var startTime = DateTime.Now.Ticks; + + client.lastReceivedAttrib = null; + + while (client.lastReceivedAttrib == null && + ((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + } + + if (!((DateTime.Now.Ticks - startTime) < timeOutTime)) + { + Debug.LogError($"GetLobbyAttribute: Request timed out!."); + } + + return client.lastReceivedAttrib; + } + } + } + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100755 index 0000000..9c20fd0 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +
+ +# Matchmaker-API - Unity3D Client +
+ +![Unity](https://img.shields.io/badge/unity-%23000000.svg?style=for-the-badge&logo=unity&logoColor=white) +![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black) +![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white) +![macOS](https://img.shields.io/badge/mac%20os-000000?style=for-the-badge&logo=macos&logoColor=F0F0F0) + + +![GitHub forks](https://img.shields.io/github/forks/Techiesplash/Matchmaker-API-Client-Unity3d) +![GitHub repo size](https://img.shields.io/github/repo-size/Techiesplash/Matchmaker-API-Client-Unity3d) +![GitHub all releases](https://img.shields.io/github/downloads/Techiesplash/Matchmaker-API-Client-Unity3d/total) +![GitHub issues](https://img.shields.io/github/issues/Techiesplash/Matchmaker-API-Client-Unity3d) + +![GitHub](https://img.shields.io/github/license/Techiesplash/Matchmaker-API-Client-Unity3d) +![GitHub release (latest by date)](https://img.shields.io/github/v/release/Techiesplash/Matchmaker-API-Client-Unity3d) + +

Introduction

+This is a project for implementing a Matchmaker API into Unity3D. +
+It can be expanded with custom packets as needed. +
+
+It depends on another project to be used in Unity. https://github.com/Techiesplash/Matchmaker-API-Server +

+This project is built upon MIT-Licensed code by Tom Weiland meant for a tutorial series. +Please check out his work: https://github.com/tom-weiland/tcp-udp-networking +
+ +![UVS Preview](./Images/preview.png) + +

Setup

+To start, you can either download this project as a .ZIP file and place the files in your project, +or you can click on your Project files in Unity Editor and use Import > Custom Package and import a package from Releases. +

+This includes Visual Scripting support. If you want to use this feature, ensure VIsual Scripting is enabled in Project Settings > Visual Scripting. You may also need to regenerate the nodes in Project Settings > Visual Scripting > Regenerate Nodes. +

+

Anyone is free to use, copy, modify, merge, publish, distribute, sublicense, or and/or sell copies of the software.

diff --git a/ThreadObject.cs b/ThreadObject.cs new file mode 100755 index 0000000..6331e8e --- /dev/null +++ b/ThreadObject.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using Scripts.CustomServer; + +public class ThreadObject : MonoBehaviour +{ + // Start is called before the first frame update + void Start() + { + ThreadManager.Start(); + } + + // Update is called once per frame + void Update() + { + ThreadManager.UpdateMain(); + } +} diff --git a/Visual Scripting/DummyScript_Icon.cs b/Visual Scripting/DummyScript_Icon.cs new file mode 100755 index 0000000..98126f7 --- /dev/null +++ b/Visual Scripting/DummyScript_Icon.cs @@ -0,0 +1,7 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DummyScript_Icon : MonoBehaviour +{ +} diff --git a/Visual Scripting/MatchmakerNode_Address.cs b/Visual Scripting/MatchmakerNode_Address.cs new file mode 100755 index 0000000..fea94cc --- /dev/null +++ b/Visual Scripting/MatchmakerNode_Address.cs @@ -0,0 +1,42 @@ +using Unity.VisualScripting; + +// ReSharper disable once CheckNamespace +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("Matchmaking Server Address")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_Address : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputTrigger;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput set; + + [DoNotSerialize] // No need to serialize ports + public ValueOutput get; + + + private bool state; + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + IMatchmaker.ip = flow.GetValue(set); + return outputTrigger; + }); + //Making the ControlOutput port visible and setting its key. + outputTrigger = ControlOutput(""); + + set = ValueInput("set"); + get = ValueOutput("get", (flow) => IMatchmaker.ip); + Succession(inputTrigger, outputTrigger); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_Connect.cs b/Visual Scripting/MatchmakerNode_Connect.cs new file mode 100755 index 0000000..a36438a --- /dev/null +++ b/Visual Scripting/MatchmakerNode_Connect.cs @@ -0,0 +1,39 @@ + +using Scripts.Matchmaker; +using Unity.VisualScripting; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("Connect to List Server")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_Connect : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnSuccess; //Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnFail; //Adding the ControlOutput port variable. + + private bool resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", + (flow) => { return IMatchmaker.Connect() ? outputOnSuccess : outputOnFail; }); + //Making the ControlOutput port visible and setting its key. + outputOnSuccess = ControlOutput("onSuccess"); + outputOnFail = ControlOutput("onFail"); + + Succession(inputTrigger, outputOnSuccess); + Succession(inputTrigger, outputOnFail); + + } + } + +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_ConnectLobby.cs b/Visual Scripting/MatchmakerNode_ConnectLobby.cs new file mode 100755 index 0000000..ca3125a --- /dev/null +++ b/Visual Scripting/MatchmakerNode_ConnectLobby.cs @@ -0,0 +1,47 @@ +using System.Collections; +using System.Collections.Generic; +using Scripts.Matchmaker; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("Connect to Lobby Server")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_ConnectLobby : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnSuccess; //Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnFail; //Adding the ControlOutput port variable. + + private bool resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + if (IMatchmaker.ConnectLobby()) + { + return outputOnSuccess; + } + + return outputOnFail; + }); + //Making the ControlOutput port visible and setting its key. + outputOnSuccess = ControlOutput("onSuccess"); + outputOnFail = ControlOutput("onFail"); + + Succession(inputTrigger, outputOnSuccess); + Succession(inputTrigger, outputOnFail); + + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_Disconnect.cs b/Visual Scripting/MatchmakerNode_Disconnect.cs new file mode 100755 index 0000000..1f3b1bc --- /dev/null +++ b/Visual Scripting/MatchmakerNode_Disconnect.cs @@ -0,0 +1,37 @@ +using Unity.VisualScripting; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("Disconnect from List Server")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_Disconnect : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputTrigger;//Adding the ControlOutput port variable. + + + private bool resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + IMatchmaker.Disconnect(); + + return outputTrigger; + }); + //Making the ControlOutput port visible and setting its key. + outputTrigger = ControlOutput(""); + + Succession(inputTrigger, outputTrigger); + + } + } + +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_DisconnectLobby.cs b/Visual Scripting/MatchmakerNode_DisconnectLobby.cs new file mode 100755 index 0000000..e3671e7 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_DisconnectLobby.cs @@ -0,0 +1,37 @@ +using Unity.VisualScripting; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("Disconnect from Lobby Server")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_DisconnectLobby : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputTrigger;//Adding the ControlOutput port variable. + + + private bool resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + IMatchmaker.DisconnectLobby(); + + return outputTrigger; + }); + //Making the ControlOutput port visible and setting its key. + outputTrigger = ControlOutput(""); + + Succession(inputTrigger, outputTrigger); + + } + } + +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_GetAllLobbiesWithAttribute.cs b/Visual Scripting/MatchmakerNode_GetAllLobbiesWithAttribute.cs new file mode 100755 index 0000000..19ba457 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_GetAllLobbiesWithAttribute.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using Mirror; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Get All Lobby IDs with Attribute")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_GetAllLobbiesWithAttribute : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputIfSome;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputIfNone;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueOutput idList; + + [DoNotSerialize] // No need to serialize ports + public ValueInput attribName; + + [DoNotSerialize] // No need to serialize ports + public ValueInput attribValue; + + public List resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + try + { + resultValue = IMatchmaker.GetAllLobbyIdsByAttribute(flow.GetValue(attribName), + flow.GetValue(attribValue)); +; if (resultValue is { Count: > 0 }) + { + return outputIfSome; + } + + return outputIfNone; + } + catch (Exception ex) + { + Debug.LogError($"Error in Get All Lobby IDs node: {ex}"); + } + + return outputIfNone; + }); + //Making the ControlOutput port visible and setting its key. + outputIfNone = ControlOutput("ifNone"); + + outputIfSome = ControlOutput("ifSome"); + + idList = ValueOutput>("result", (flow) => resultValue); + + attribName = ValueInput("attributeName"); + + attribValue = ValueInput("attributeValue"); + + + Succession(inputTrigger, outputIfSome); + Succession(inputTrigger, outputIfNone); + + Assignment(inputTrigger, idList); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_GetAllLobbyIds.cs b/Visual Scripting/MatchmakerNode_GetAllLobbyIds.cs new file mode 100755 index 0000000..7635466 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_GetAllLobbyIds.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using Mirror; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Get All Lobby IDs")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_GetAllLobbyIds : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputIfSome;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputIfNone;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueOutput idList; + + public List resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + try + { + resultValue = IMatchmaker.GetAllLobbyIds(); + if (resultValue is { Count: > 0 }) + { + return outputIfSome; + } + + return outputIfNone; + } + catch (Exception ex) + { + Debug.LogError($"Error in Get All Lobby IDs node: {ex}"); + } + + return outputIfNone; + }); + //Making the ControlOutput port visible and setting its key. + outputIfNone = ControlOutput("ifNone"); + + outputIfSome = ControlOutput("ifSome"); + + idList = ValueOutput>("result", (flow) => resultValue); + + Succession(inputTrigger, outputIfSome); + Succession(inputTrigger, outputIfNone); + + Assignment(inputTrigger, idList); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_GetClientAttribute.cs b/Visual Scripting/MatchmakerNode_GetClientAttribute.cs new file mode 100755 index 0000000..e02fd0d --- /dev/null +++ b/Visual Scripting/MatchmakerNode_GetClientAttribute.cs @@ -0,0 +1,76 @@ +using System; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Get Client Attribute")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_GetClientAttribute : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnSuccess;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnFail;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput lobbyId; + + [DoNotSerialize] // No need to serialize ports + public ValueInput name; + + [DoNotSerialize] // No need to serialize ports + public ValueOutput value; + + private string resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + try + { + resultValue = + IMatchmaker.GetLobbyAttribute(flow.GetValue(lobbyId), flow.GetValue(name)); + + if (resultValue != null) + { + return outputOnSuccess; + } + + resultValue = ""; + } + catch (Exception ex) + { + Debug.LogError($"Error in Get Lobby Attribute node: {ex}"); + } + + resultValue = ""; + return outputOnFail; + }); + //Making the ControlOutput port visible and setting its key. + outputOnSuccess = ControlOutput("onSuccess"); + + outputOnFail = ControlOutput("onFail"); + + value = ValueOutput("value", (flow) => resultValue); + + name = ValueInput("Name", ""); + + lobbyId = ValueInput("clientId"); + + + Succession(inputTrigger, outputOnFail); + Succession(inputTrigger, outputOnSuccess); + + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_GetLobbyAttribute.cs b/Visual Scripting/MatchmakerNode_GetLobbyAttribute.cs new file mode 100755 index 0000000..612f6c2 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_GetLobbyAttribute.cs @@ -0,0 +1,76 @@ +using System; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Get Lobby Attribute")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_GetLobbyAttribute : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnSuccess;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnFail;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput clientId; + + [DoNotSerialize] // No need to serialize ports + public ValueInput name; + + [DoNotSerialize] // No need to serialize ports + public ValueOutput value; + + private string resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + try + { + resultValue = + IMatchmaker.GetClientAttribute(flow.GetValue(clientId), flow.GetValue(name)); + + if (resultValue != null) + { + return outputOnSuccess; + } + + resultValue = ""; + } + catch (Exception ex) + { + Debug.LogError($"Error in Get Client Attribute node: {ex}"); + } + + resultValue = ""; + return outputOnFail; + }); + //Making the ControlOutput port visible and setting its key. + outputOnSuccess = ControlOutput("onSuccess"); + + outputOnFail = ControlOutput("onFail"); + + value = ValueOutput("value", (flow) => resultValue); + + name = ValueInput("Name", ""); + + clientId = ValueInput("lobbyId"); + + + Succession(inputTrigger, outputOnFail); + Succession(inputTrigger, outputOnSuccess); + + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_GetLobbyAttributeDirect.cs b/Visual Scripting/MatchmakerNode_GetLobbyAttributeDirect.cs new file mode 100755 index 0000000..8cf7795 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_GetLobbyAttributeDirect.cs @@ -0,0 +1,72 @@ +using System; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Get Lobby Attribute Directly")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_GetLobbyAttributeDirect : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnSuccess;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnFail;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput id; + + [DoNotSerialize] // No need to serialize ports + public ValueInput name; + + [DoNotSerialize] // No need to serialize ports + public ValueOutput value; + + private string resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + try + { + resultValue = + IMatchmaker.GetLobbyAttributeDirect(flow.GetValue(name)); + + if (resultValue != null) + { + return outputOnSuccess; + } + } + catch (Exception ex) + { + Debug.LogError($"Error in Get Lobby Attribute Direct node: {ex}"); + } + + return outputOnFail; + }); + //Making the ControlOutput port visible and setting its key. + outputOnSuccess = ControlOutput("onSuccess"); + + outputOnFail = ControlOutput("onFail"); + + id = ValueInput("lobbyId"); + + name = ValueInput("Name", ""); + + value = ValueOutput("Value", (flow) => resultValue); + + Succession(inputTrigger, outputOnFail); + Succession(inputTrigger, outputOnSuccess); + + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_GetLobbyByUuid.cs b/Visual Scripting/MatchmakerNode_GetLobbyByUuid.cs new file mode 100755 index 0000000..2b584f1 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_GetLobbyByUuid.cs @@ -0,0 +1,65 @@ +using System; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Get Lobby By UUID")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_GetLobbyByUuid : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnSuccess;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnFail;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput uuid; + + [DoNotSerialize] // No need to serialize ports + public ValueOutput id; + + public int resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + try + { + resultValue = IMatchmaker.GetLobbyIdByUuid(flow.GetValue(uuid).ToUpper()); + if (resultValue > 0) + { + return outputOnSuccess; + } + } + catch (Exception ex) + { + Debug.LogError($"Error in Get Lobby By Uuid node: {ex}"); + } + + return outputOnFail; + }); + //Making the ControlOutput port visible and setting its key. + outputOnSuccess = ControlOutput("onSuccess"); + + outputOnFail = ControlOutput("onFail"); + + uuid = ValueInput("uuid", ""); + id = ValueOutput("result", (flow) => resultValue); + + Succession(inputTrigger, outputOnFail); + Succession(inputTrigger, outputOnSuccess); + + Assignment(inputTrigger, id); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_IsClientConnected.cs b/Visual Scripting/MatchmakerNode_IsClientConnected.cs new file mode 100755 index 0000000..84bcd12 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_IsClientConnected.cs @@ -0,0 +1,31 @@ +using Mirror; +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("Is Client Connected")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_IsClientConnected : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports + public ValueOutput get; + + protected override void Definition() + { + get = ValueOutput("get", (flow) => + { + if (IMatchmaker.listClient == null) + { + Debug.LogError("Error in Is Client Connected node: listClient is null!"); + return false; + } + + return IMatchmaker.listClient.IsConnected; + }); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_IsLobbyConnected.cs b/Visual Scripting/MatchmakerNode_IsLobbyConnected.cs new file mode 100755 index 0000000..3e417dd --- /dev/null +++ b/Visual Scripting/MatchmakerNode_IsLobbyConnected.cs @@ -0,0 +1,31 @@ +using Mirror; +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("Is Lobby Connected")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_IsLobbyConnected : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports + public ValueOutput get; + + protected override void Definition() + { + get = ValueOutput("get", (flow) => + { + if (IMatchmaker.lobbyClient == null) + { + Debug.LogError("Error in Is Lobby Connected node: listClient is null!"); + return false; + } + + return IMatchmaker.lobbyClient.IsConnected; + }); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_Port.cs b/Visual Scripting/MatchmakerNode_Port.cs new file mode 100755 index 0000000..1d6942a --- /dev/null +++ b/Visual Scripting/MatchmakerNode_Port.cs @@ -0,0 +1,44 @@ +using Mirror; +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("Matchmaking Server Port")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_Port : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputTrigger;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput set; + + [DoNotSerialize] // No need to serialize ports + public ValueOutput get; + + + private bool state; + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + IMatchmaker.port = flow.GetValue(set); + return outputTrigger; + }); + //Making the ControlOutput port visible and setting its key. + outputTrigger = ControlOutput(""); + + set = ValueInput("set"); + get = ValueOutput("get", (flow) => IMatchmaker.port); + Succession(inputTrigger, outputTrigger); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_SetClientAttribute.cs b/Visual Scripting/MatchmakerNode_SetClientAttribute.cs new file mode 100755 index 0000000..e30e801 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_SetClientAttribute.cs @@ -0,0 +1,65 @@ +using System; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Set Client Attribute")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_SetClientAttribute : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnSuccess;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnFail;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput name; + + [DoNotSerialize] // No need to serialize ports + public ValueInput value; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + try + { + var result = + IMatchmaker.SetClientAttribute(flow.GetValue(name), flow.GetValue(value)); + + if (result) + { + return outputOnSuccess; + } + } + catch (Exception ex) + { + Debug.LogError($"Error in Set Client Attribute node: {ex}"); + } + + return outputOnFail; + }); + //Making the ControlOutput port visible and setting its key. + outputOnSuccess = ControlOutput("oOnSuccess"); + + outputOnFail = ControlOutput("onFail"); + + name = ValueInput("Name", ""); + + value = ValueInput("value", ""); + + Succession(inputTrigger, outputOnFail); + Succession(inputTrigger, outputOnSuccess); + + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_SetClientObjects.cs b/Visual Scripting/MatchmakerNode_SetClientObjects.cs new file mode 100755 index 0000000..14a2872 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_SetClientObjects.cs @@ -0,0 +1,55 @@ +using Mirror; +using Scripts.CustomServer; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Set Client Objects")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_SetClientObjects : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputTrigger;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput listclient; + + [DoNotSerialize] // No need to serialize ports + public ValueInput lobbyclient; + + private bool resultValue; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + if (flow.GetValue(listclient) != null) + { + IMatchmaker.listClient = flow.GetValue(listclient); + } + if (flow.GetValue(lobbyclient) != null) + { + IMatchmaker.lobbyClient = flow.GetValue(lobbyclient); + } + + return outputTrigger; + }); + //Making the ControlOutput port visible and setting its key. + outputTrigger = ControlOutput(""); + + listclient = ValueInput("listClient", null); + + lobbyclient = ValueInput("lobbyClient", null); + + Succession(inputTrigger, outputTrigger); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_SetLobbyAttribute.cs b/Visual Scripting/MatchmakerNode_SetLobbyAttribute.cs new file mode 100755 index 0000000..e3e74da --- /dev/null +++ b/Visual Scripting/MatchmakerNode_SetLobbyAttribute.cs @@ -0,0 +1,65 @@ +using System; +using Unity.VisualScripting; +using UnityEngine; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + + [UnitTitle("Set Lobby Attribute")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_SetLobbyAttribute : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports. + public ControlInput inputTrigger; //Adding the ControlInput port variable + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnSuccess;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports. + public ControlOutput outputOnFail;//Adding the ControlOutput port variable. + + [DoNotSerialize] // No need to serialize ports + public ValueInput name; + + [DoNotSerialize] // No need to serialize ports + public ValueInput value; + + protected override void Definition() + { + //Making the ControlInput port visible, setting its key and running the anonymous action method to pass the flow to the outputTrigger port. + inputTrigger = ControlInput("", (flow) => + { + try + { + var result = + IMatchmaker.SetLobbyAttribute(flow.GetValue(name), flow.GetValue(value)); + + if (result) + { + return outputOnSuccess; + } + } + catch (Exception ex) + { + Debug.LogError($"Error in Set Client Attribute node: {ex}"); + } + + return outputOnFail; + }); + //Making the ControlOutput port visible and setting its key. + outputOnSuccess = ControlOutput("oOnSuccess"); + + outputOnFail = ControlOutput("onFail"); + + name = ValueInput("Name", ""); + + value = ValueInput("value", ""); + + Succession(inputTrigger, outputOnFail); + Succession(inputTrigger, outputOnSuccess); + + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_ThisClient.cs b/Visual Scripting/MatchmakerNode_ThisClient.cs new file mode 100755 index 0000000..b65dbfa --- /dev/null +++ b/Visual Scripting/MatchmakerNode_ThisClient.cs @@ -0,0 +1,31 @@ +using Mirror; +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("This Client's ID")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_ThisClient : Unit, IMatchmaker + { + [DoNotSerialize] // No need to serialize ports + public ValueOutput get; + + protected override void Definition() + { + get = ValueOutput("get", (flow) => + { + if (IMatchmaker.listClient == null) + { + Debug.LogError("Error in This Client's ID node: listClient is null!"); + return 0; + } + + return IMatchmaker.listClient.myId; + }); + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MatchmakerNode_ThisLobby.cs b/Visual Scripting/MatchmakerNode_ThisLobby.cs new file mode 100755 index 0000000..0c7c5d6 --- /dev/null +++ b/Visual Scripting/MatchmakerNode_ThisLobby.cs @@ -0,0 +1,35 @@ +using Mirror; +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Scripts.Matchmaker.Visual_Scripting +{ + [UnitTitle("This Lobby's ID")] + [UnitSubtitle("Matchmaker API")] + [UnitCategory("Matchmaking")] + [TypeIcon(typeof(DummyScript_Icon))] + public class MatchmakerNode_ThisLobby : Unit, IMatchmaker + { + + + [DoNotSerialize] // No need to serialize ports + public ValueOutput get; + + + private bool state; + protected override void Definition() + { + get = ValueOutput("get", (flow) => + { + if (IMatchmaker.lobbyClient == null) + { + Debug.LogError("Error in This Lobby's ID node: lobbyClient is null!"); + return 0; + } + return IMatchmaker.lobbyClient.myId; + }); + + } + } +} \ No newline at end of file diff --git a/Visual Scripting/MirrorNodeHelper.cs b/Visual Scripting/MirrorNodeHelper.cs new file mode 100755 index 0000000..ecf1a12 --- /dev/null +++ b/Visual Scripting/MirrorNodeHelper.cs @@ -0,0 +1,37 @@ +using Mirror; +using UnityEngine; + +// ReSharper disable once CheckNamespace +namespace Scripts.Matchmaker +{ + public class MirrorNodeHelper : NetworkBehaviour + { + [Client] + public GameObject SpawnObject(GameObject iG, Vector3 iPos, Quaternion iRot, Transform iParent, Vector3 iScale) + { + + SpawnObjectCmd(NetworkManager.singleton.spawnPrefabs.IndexOf(iG), iPos, iRot, iParent, iScale); + return GameObject.FindGameObjectWithTag("MirNodeHelperSpawned"); + } + + [Command(requiresAuthority = false)] + void SpawnObjectCmd(int iG, Vector3 iPos, Quaternion iRot, Transform iParent, Vector3 iScale) + { + GameObject go; + Debug.Log("Creating object..."); + if (iParent != null) + { + go = Instantiate(NetworkManager.singleton.spawnPrefabs[iG], iPos, iRot, iParent); + } + else + { + go = Instantiate(NetworkManager.singleton.spawnPrefabs[iG], iPos, iRot, iParent); + } + + go.transform.localScale = iScale; + go.gameObject.tag = "MirNodeHelperSpawned"; + NetworkServer.Spawn(go); + + } + } +} \ No newline at end of file diff --git a/Visual Scripting/icon.png b/Visual Scripting/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..a76d7c7ed047fe09c800ca60a597a80011314f52 GIT binary patch literal 12214 zcmeHscU05c(sl^FMS2YodXYfrEnw(H=^#oqkN}|uLhk_-kX{4eeZuaYyH}unP+C6nY~x`+DT?6`t&qhGynjA-q1kD zg7_qyT~rjr`@<`BMF0SILzvZ-01IR=1nckXit$220z$E92s#Ag3IK%6Hy2*@2e)VG z{(5}V5vWJ`2%O^TOZnudhLUW5)|JWg=4fdCZ7W$>3clSHz~a&JFZ*v7epXk9!Kd`w5?h$)_;R2%D#B z=5~90BYe^0`#*l}OeHO`8+DWulzv2(ooblhtmljWMm_N1ao5+&-O=%(j`e$E-OqY1 zR7qEBygOAMdiU#{(LvDaD9gGbf9TVD2T$=8(G!)Wd~hc@N(vB%YGS=g|F^pg8O8nE z>!$D0>U(fTHM_qf%g;i?(dwKE%R<3rL8L)&Q=z#&yLufvYMC|ci-(!t#L$o|JW3b zw%Ov(y2b7P3K`G+a=+u*8XFESb@^$MU;jbZYl~F%x{9CZ6MCiD=_!*`p?c9B)c(5T zGu-Rlyzsi&wl5$s7pW+1O>+Hdpwmgu6OZc*5kC@Hzp<9bj(UsXj$a^ALJPrW!^|tb z(HDN1J2G=h-fXa~V19L^+Ap~(Eo5L?#!SiP=(NN1KB_o|!EgK7XuJ*u!PY?d$|r>Z zE+F1Z$Q}D3vnU@0$zf7b;=~#0`PfcZ9vRS&l|I&43hFv{J2NRu(%OG&3UXD2{e9J2 zJ^IuvBdN+O)s?p#ZwL=x9(hoJ@SC=3tgWZT;hQ6Yig{T0Z!6?)g0{%`wr~ zd{td_H)^1A+Q(mM*?(vDjZgQwpyyuG>CPT|1KZNoWYc>A*G>prd$Y$oESgx0962U7 z2N0@Df}AD5>SYA2iay#zWnX=gRoFjUSLKZ+r(oPs{1umi!eCr=MQTM$tJkLh|P}HSf%E~OV?8o;bj9?3Y!;d$$KW5HF?FG(uIIH*i+Uz!{ zy1toq^Q}DKeoI*NA8DtEHe?Odt-5D#_Y|;lyZPZ&y~3l9A&0w4b=xMRwME%3!-J;S z&oRCVA0sU6Xf7&8Ir+{Ge~wJ>IlsBs;6NI6?z%S9@kZLbdh_)iDBtG@2PEHE5J`$%1^h>xp1U?y}(Hz4u-z#{ls;7!EKJFa2WMaTJq`Yzc$705v{XFF~fRjT< zdrCybZHcC8u18a(l5e{Ffmc2*g!mNaz{c8ZWY^et))X1M0w<#G78!&tLZ99+WsIJw za4Rx>7|h!To3EH0lUu0!W&g#gu26mUym0VVRS6}zkC7N{P2G^I{V6ICzNIOnSe!a- z@k*n*d-HDD9}-5z4N0hulkYC1$P5Tk;rYDfQIh^MEP~^Q8cf&rhTb z2455C8>;m81c7=D%=3mkRH}zRLUGXe1UEfm zl*46JtJ2b6Jg-pKEN3$keCR?2rP=a~G$M}xR$|$2tE+P6Piq?o2+`pTr}JXf$2Mn&fa$7I6YrYl2+9g}Ke@Lvivxm2zXijB%p&co;n$3mW zy1;Aj-Jp4%?G*DD@Hh4q(^aicdc#$t(CZ1P8%8992yd*%O01Se{|y7+ zw~-2F#?`s2jtYjg<8BV3B_n9aQsAjw{jL&7GMr(wRDffA@j6xHhc@mahWvn3GB2gp zda&Ul*~QwdcP2^W`pM@^g-CA2kTLE{h3CzXa`=rgN`ogg%4?^73cFa*S6W^# zXdg9#Zp^gt1~LOk!kR=`>8EK0%+=zHq!Q+pM2+60KH#dPOr_1s_cJCn+HJ)uy9WMj zFrOt+^jSNkItmQW$R|#olmLkTdMa<$3OR;pMVU8c$^_zFp?uDZOpUqy_I>FZmWZLg zUh@83&1=9UU4G!c=A6n_y(2O%GG5&(ns<1dB+r#3?woB!Q!mEjd|@oS=`)uwb2n}^ zpY>aaQRVAPfx{=`?yR9b*BSY7fQ7_{K+OvO+VR{Df3(!?dxwiILfuUl5lXi%#^)~b zB>3f-xtV*21#{tNmuRb2eP8B$)(k6Nd)Adtwje(+b^X=ag|NWoCw__@&e_9HS1VOZ zukj+eGt}bs zm+oYKDw@i^u%&Esm}1sKh;cnb3{UT(>NrY_RKv`?G8qW3DT1~><>%`9Ie55-S|8SWA`v(Ib1882$lFP(K6g0MT0 zPS(^l+wX)u3Qnq3lQTea-+hUx$Vk_)P)vtY@NSFR1l>(hcCd6#$~-)eES zmio0PEHcOXuhO(lkY!u?a3pw#b^QF`?B8t{STA5X`tgnxs?nSjp1qBD2nVg*0Dq4DLbv%i$i+O8%A@Yh#tM#sBeaTeKy zm?{8sRn?21cgS~Ik1d@!3och~S6@#s;}->Pmzz)YFt2LKPqt9`TwAyHI4Mp}vH51x zOtQZ`_omfjSg(5MB_8SB67|e00fhe$UYY~LhS62@^HDDiKa9Q$; z<->_AIaZdR2iZcmw~O>^wOg^dYCRktkK+nf92asMnzeOFUS*fyjI2V<#&}nfdhnDA zrpURsFWp3%NqH#?)Vq4G$xuFiyptc6U+F8la7zHyqv~X3%lZ*4bM{zKE3>It!!a8N03RJ z!b?j10AUD%Q}KXZN9}JE>PztlRvbQXEV=xJE^Ce5M4QN>Z0o$R^~-7@rIJ0WZvw{rqU`R-QwA;Z4#9wM)8o04{Py-N!4vv>BpO^= zB-B*a234!_Rywd(JRzC*C>;v^U+v$Zp6vw+$7$bKE|+aSu5q8xp~BKl)sW#>jLP?E zf@Slx2aGo~gq=lFS>Wlt{M3<^&YRsr5+|9TYZW(N#*k&7oE-}uTPMel5aZP%=CPl7L&cjQ|=3s3Ld)e2fbpR37f$MWG;T`Vn^zI|IX}}X#*8AZUuk4&jBx}ujY^d;!zM?$DDWl zGePC$U3lIQsJ=UISS;6)F{VmDo92}W&Lfgxcaa@%YwUpnUH_Z?$2E2O!hsdcFZhoXeR~zNBDKw*{Sm;O(s-q~NUo$mVa4i@*#>b`XQr>Oj^(uKER0zu* zQ${j39lEpWv9|KR~Q z)hEyn#bS{q_yp!7y_gfO>%%+>glF2VUuF86 zI4V41#%-*;#bnF3-q{ll zOg&4n20$21Yi5B;7|jQ|Y4_VEb=TU+s}A1W&%llc2?CttLOdeLQaRSN*h&nQs1ZBV zD)WAAg&=W&zIB{bjp*Es2lgSauO92zf?y68-B<=wo;fP>hkha#rpZeoizgAZr7g)c zPl!TA73qrwY}`H0s-(Q1HTbAyx zh#9@m%-529la16mEpYCTPM0A$Jfb*MQtX@WQ+uA=6UuNPH6*W~Z`$O31)>)8B&|#; z-0Z}dI=JV{^{fS*tkZ=9(A75{Sg1GRL%gNOB{Q!1Hiz5v^63`heI8@+xO?$kOdj3z z_o{drNN1EvvX5la$}`?B_`a2@)&w>RoM_4{GiN?;3Y#v-(=rLaAV^i0R;LQumqB{d zQO@)`xC7F4J9T$#`82i`4i-tlPvmV&tDUo+*CVENtwJ&4JKPgDjlMGL`F4z#h<>WO z-gE_M1(N?-!?^NoMNdFiubnSIVbymlNVR9kC1;MAkvT=(UO#6dd#qY)?3s2gfQn(`2 zWChaQ8bo!VCEu&Ak$DF4U$~Y$40%F%e0OT*Irpuou&%T`yy~lBtxFL)?}0YU+`Qk8 zDL$L#TuW1blU7Ds2#}!wZYelWYFvSFz=3?81{BoNCFfW_D+{y3*c!exuj4e+Dr%j( z@m85S__v0XYo0D-Ul)4XW*=vubDj1tV?Ei}Ri$=GW*hNx_u;`BmkDk94k$)BcOZ67 zI}Be*Ntt^&fuYcyqbuj`uGR-ui;4-1@P^=VjB3>&`*%RQNJOWGf-B56T`T+Bmn^eL zXT|Id#ND|~O6PPKV6UDWc1QhPi8U6wpd4Zvw?bw-Pm%;T1Zi-2Q+pch_OR#clh!na zjVd&y8e-4U4cAz#VCF#vBJhsq_4kw$ZQ+7-Op2sgnfDKrZ;V$*#$gxtU)M2C6mNsS zv8ig-c0F6l$s2-34**HtjLl9*H_LqJSO|3*Kr;)S))nD%y06kw9)9K1uLIf zv#tBna#_UZ+CDf@ySFN|gJLA=QI0_NrKy|I>l6x%z`J4T_*W$}J|iq>@vB=e_F095 z3_&+iX`l264l!oAZ>yt#Bq@lI8<^f=-J9s4HDOBeR7b~izQu9dv){PlNZ7&ZDN8u^mY z)J(rm^pP_1A(#R#)D(fs;q;QX57((l0MMvVtbx$w&JJ&xP2vbS0g5IAmQOl-)li|ce5$3(P7|V?ngPJxMvz$c z;$*{*bj`DT(a+iRvU%Uc{1LJm+Z8!YAgc_S)z2DIlc$$wrG7J}C3cgifST0!3bZ+o zA|V2!`)wkbQ6^0z)HaiHP68J~?hv4ROS8`=*ZI&$T;yEIMtt7`LyAFa*ymxhc#LQ! z4RyNKLASx`u3W;eZIeR2wrCeBeC zKFU!gWT&*&XkM9M(6j8@n28Zlpt z0#9G*?yVHoLBH!Y-Sg1oZ?_<#vLR+<dP}nfTRq$>m1*wSFud$t*FwLi=|xygZQ}ag+$dCChH-Hr z&1_0);-kk8Ho9pqDt$sPy}1AF^`Kq~+vx4Q+@g2SsQ9uAmZek77_;Uk4h!l zH~DLxndIqnc`mKVUyWo7ejlO;wRG+gYzfquxiuLG+lo!jK7cv?7j z;mOo7hA(V!Iuat*0^oE-qYabr&90#6RjbUyP2*I(BHBmkIL&vf7<_SsLNY)n=N5yN zynMG%r7XVEpMEtERxF z520!~iDavkgOWsp<}Uq^pzDo)qR%`)r3*nL2cYAr55CpEvgeC32JKpo+q|2e==W z-ME*CpM9~$aFd4YSgqovZp~U-{VE3H#MzAyb5LcLj6Xb=%h&AJtd@k0S+<=!uny7P z1ETJ|x{~3ZWIL%Az}`BSaW`B|qV0>2C+{vTj#Zrz-*!WSy5;UH0JvUFGioG9*&$NF z(tESwu6qW1>?k<%iJ&`Bvx>ZeQYE~3{&H;+Bc{2;gf#Ggmio}6**bIVJ^Ob~o-LD! z9;(|>LY?HLE)%o+X%=@*KYO|>+FpON$XGHd5;uv0*mSTKD1ul0TL#6s3LxLaZ^u{; z*!%9JEK@{f6m#kf4MZ{OEu;_hIDE){tT70>j2XVr$H zx@Gq9*b=s-Rl9IjDGS7lU{BgBDkrb+TisEFpGI(2Jpw3y`p5K1M-bQ){+&Dv7(LeSCa$ViAfWOAn)utv0uxY8^34>zPtMHSvPTZ zUEn$k5IpYaaGp7w_qEnYXV8lQGnm`$-o|F%*k=eT&!__aFeTJynTuv$!wN(Q^&ck- zXSG&mOl-5czPST7%&%Ihl!{PI4HF;=nPh2iX}Dx9x@^}j!Dh5;KD?`a-c*=Kzc#rA z=TauOoXrBGIoTCxsN%jv?*%*YZCi<=r*rBf|K@q^JC{@& zC5KN4LT#Z zxjj7=#67FJ)U|M?3iW9--(^c~c`LvM9$sMo;9b!-zdtx@x(V^GZ$ zT>{R+-rY`8)3ku)l69hD`^){2)-+3N>=Qy)eG;+fr@$V_#EJ_NYm$+FU- z2IR^ho>i)Pm4Vf7T7soi>prV(AdK%MR)pU0W^(z8E%uYk9lI!{$7kgOPg{>e_gVobj2mYeee0}-3119d;H?f45C}gZfUf`1)mhcp8a>u@{DZ{jynkhT zUO(|rm7WVjJWah~d`Z>C*INpS@^wZ_g?M9$r>y`0{6Yv8>EekFfHKG-yu*g|FXvh`g{FO2jwD-_Ck9TRdGbGGXHR? zZ)j}xFN-q@+%VqQ-&RDj|DhRxas4-0|A_5O@;jZs2SPOe7w$i_|H}QhGEvLeSXIZ@ zCGadfLmhR2Gyke6Ul$BY_4g}G0i`I1gsDJfRA4Bmyt9lf6e){xfvPCWsVF0nC>KRn znZH39`rrbPJ}&4pC?dENhKM8M?5v_9Fff7$;m6g zWd8W?9ICDQBfQJq1dh)}X<7bIGSXsf6suLzY_k&}n25Cem{z?_w2<>eF=(2CB# zp-?WWdcOYNNMboL-bgpJG}g!Mx8RI$RZTNPbpcr^*uO{2ypRE|L<4n!OBkQPkbeuT zFy3g(0OT2)GKz`{N=hp7^0Ep_a*8r4|5mz;_Qw%B@eET2CMEX=?paw>iOCR&MV|F3 z5#YB4F&9;Be>5_{*Wb$5*GpaCEF{R8bE1J-5(+scchOSnmE7zY^cA+G5<@k z1iPcpc!Ck>4yX(Jn{YMP^ zN6P>0uK#az(foVEgZ3f*3koJ~XCB-^pn0gkjgqls_SSc9uL0DzYH z>>>da+~FV&QU(|r>r%d@0kQB(G~jxu006QvLmf@4kold(VV`mY1HwG+%dhT_4+L~` zACV{psK0bbb(P6S6w9-Eb-^o=!!?S>=DO{2(LV1|k6_0Pxx|J?5XXQKVykQ&9F` z3;eqR^6cZa=2vu>8(w*YKbY6@eJJ{!bJ3@L;13ap}Uf^LvUjvj*TA)x|e0YFM{Ob-bq@skm7cK%zN7xDB<-=fT9Zlve;`AY}lah)0YnBTHG< zIlf#xLqcuv)-om77(epd{3``Y35>>D6{wUgjDJjA|15UsvE&Xbd%D1rb^}qi%QdkC zBiGl4%q*4BP(sA9UUxtFK7IQjL9u6of$*`oDay{8Tb~26XF_1T(BC*hJK<+_gAqtr z%KjWCAn=s-(Hl}W)s@>c8y^*UkDv_>ypP7o2jw9%yEZyMmR30CXc8zTdl<f39}Ca@I=D--w*{@+08aNYZ!)D}HE!pNI*l@3Vu{5-&<9 z1BMzpbwl}u!9!AyW$pL$Bihx#sWDc1KuSmkk!GPE?3v4#NhWy>Z(M{c-vr{xKnMt) zl)->V4ik|aG7ve%Bsn!W2Jx2xu~^h#BWfYF-{Q1}&|xUpKZ!hnZd=^%I~?(6h5w@V zr1=@+w;yqRAPeAN(RDgX$iv{YU|KE^!v39GEt)UA=nv4ScYUIwnx%EeSO3@H#OF0iHrlNh=ayl01k?2uQ|6;vAAIMGj0N3h6shnofSjWE!_fWVxup5|k(w zCS@x&LMst86ylcIQ>uta6ToZl#C+5RCd>nm;>kdUM$^*DBCi1|D&d)Di=m;eiB6r? Hwb=gw=NW$U literal 0 HcmV?d00001