From 98416af0afcc67f17623af31869493b79c0a787f Mon Sep 17 00:00:00 2001 From: NIMFER Date: Tue, 25 Oct 2022 23:42:01 +0200 Subject: [PATCH] added fixes from pull #1 --- .../FishBaitTransport/FishBaitTransport.cs | 195 ++++++++++-------- .../FishBaitTransportNATPuncher.cs | 1 + .../FishBaitTransportVariables.cs | 1 + .../Assets/FishBaitFunctionTester.unity | 104 +--------- .../LRM_LoadBalancer/DataContainer.cs | 5 +- .../LRM_LoadBalancer/Endpoint/Endpoint.cs | 9 +- .../Endpoint/EndpointExtra.cs | 14 +- .../LRM_LoadBalancer/Program/Program.cs | 3 + .../RelayHandler/RelayHandlerRoomMethods.cs | 27 ++- .../LRM/Room.cs | 1 + 10 files changed, 164 insertions(+), 196 deletions(-) diff --git a/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransport.cs b/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransport.cs index 6fa7188..77b5b9e 100644 --- a/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransport.cs +++ b/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransport.cs @@ -1,5 +1,6 @@ using FishNet.Managing; using FishNet.Managing.Logging; +using FishNet.Managing.Server; using FishNet.Serializing; using FishNet.Transporting; using FishNet.Utility.Extension; @@ -18,160 +19,180 @@ namespace FishBait [DefaultExecutionOrder(1001)] public partial class FishBaitTransport : Transport { - #region Forward everything to Transport - - - - public override event Action OnClientConnectionState + public override bool Equals(object other) { - add - { - transport.OnClientConnectionState += value; - } - - remove - { - transport.OnClientConnectionState -= value; - } + return base.Equals(other); } - public override event Action OnServerConnectionState + public override string GetClientAddress() { - add - { - transport.OnServerConnectionState += value; - } - - remove - { - transport.OnServerConnectionState -= value; - } - } - - public override event Action OnRemoteConnectionState - { - add - { - transport.OnRemoteConnectionState += value; - } - - remove - { - transport.OnRemoteConnectionState -= value; - } - } - - public override event Action OnClientReceivedData - { - add - { - transport.OnClientReceivedData += value; - } - - remove - { - transport.OnClientReceivedData -= value; - } - } - - public override event Action OnServerReceivedData - { - add - { - transport.OnServerReceivedData += value; - } - - remove - { - transport.OnServerReceivedData -= value; - } + return base.GetClientAddress(); } public override string GetConnectionAddress(int connectionId) { - return transport.GetConnectionAddress(connectionId); + throw new NotImplementedException(); } public override LocalConnectionState GetConnectionState(bool server) { - return transport.GetConnectionState(server); + throw new NotImplementedException(); } public override RemoteConnectionState GetConnectionState(int connectionId) { - return transport.GetConnectionState(connectionId); + throw new NotImplementedException(); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override int GetMaximumClients() + { + return base.GetMaximumClients(); } public override int GetMTU(byte channel) { - return transport.GetMTU(channel); + throw new NotImplementedException(); + } + + public override ushort GetPort() + { + return base.GetPort(); + } + + public override string GetServerBindAddress() + { + return base.GetServerBindAddress(); + } + + public override string GetServerBindAddress(IPAddressType addressType) + { + return base.GetServerBindAddress(addressType); + } + + public override float GetTimeout(bool asServer) + { + return base.GetTimeout(asServer); } public override void HandleClientConnectionState(ClientConnectionStateArgs connectionStateArgs) { - transport.HandleClientConnectionState(connectionStateArgs); + throw new NotImplementedException(); } public override void HandleClientReceivedDataArgs(ClientReceivedDataArgs receivedDataArgs) { - transport.HandleClientReceivedDataArgs(receivedDataArgs); + throw new NotImplementedException(); } public override void HandleRemoteConnectionState(RemoteConnectionStateArgs connectionStateArgs) { - transport.HandleRemoteConnectionState(connectionStateArgs); + throw new NotImplementedException(); } public override void HandleServerConnectionState(ServerConnectionStateArgs connectionStateArgs) { - transport.HandleServerConnectionState(connectionStateArgs); + throw new NotImplementedException(); } public override void HandleServerReceivedDataArgs(ServerReceivedDataArgs receivedDataArgs) { - transport.HandleServerReceivedDataArgs(receivedDataArgs); + throw new NotImplementedException(); + } + + public override void Initialize(NetworkManager networkManager, int transportIndex) + { + base.Initialize(networkManager, transportIndex); + } + + public override bool IsLocalTransport(int connectionid) + { + return base.IsLocalTransport(connectionid); } public override void IterateIncoming(bool server) { - transport.IterateIncoming(server); + throw new NotImplementedException(); } public override void IterateOutgoing(bool server) { - transport.IterateOutgoing(server); + throw new NotImplementedException(); } public override void SendToClient(byte channelId, ArraySegment segment, int connectionId) { - transport.SendToClient(channelId, segment, connectionId); + throw new NotImplementedException(); } public override void SendToServer(byte channelId, ArraySegment segment) { - transport.SendToServer(channelId, segment); + throw new NotImplementedException(); + } + + public override void SetClientAddress(string address) + { + base.SetClientAddress(address); + } + + public override void SetMaximumClients(int value) + { + base.SetMaximumClients(value); + } + + public override void SetPort(ushort port) + { + base.SetPort(port); + } + + public override void SetServerBindAddress(string address) + { + base.SetServerBindAddress(address); + } + + public override void SetServerBindAddress(string address, IPAddressType addressType) + { + base.SetServerBindAddress(address, addressType); + } + + public override void SetTimeout(float value, bool asServer) + { + base.SetTimeout(value, asServer); + } + + public void SetTransportPort(ushort port) + { + transport.SetPort(port); } public override void Shutdown() { - transport.Shutdown(); + throw new NotImplementedException(); } public override bool StartConnection(bool server) { - return transport.StartConnection(server); + throw new NotImplementedException(); } public override bool StopConnection(bool server) { - return transport.StopConnection(server); + throw new NotImplementedException(); } public override bool StopConnection(int connectionId, bool immediately) { - return transport.StopConnection(connectionId, immediately); + throw new NotImplementedException(); + } + + public override string ToString() + { + return base.ToString(); } - #endregion /// Called by Transport when a new client connected to the server. @@ -186,10 +207,14 @@ namespace FishBait public Action OnClientConnected = () => Debug.LogWarning("OnClientConnected called with no handler"); /// Called by Transport when the client disconnected from the server. public Action OnClientDisconnected = () => Debug.LogWarning("OnClientDisconnected called with no handler"); - public void SetTransportPort(ushort port) - { - transport.SetPort(port); - } + + public override event Action OnClientConnectionState; + public override event Action OnServerConnectionState; + public override event Action OnRemoteConnectionState; + public override event Action OnClientReceivedData; + public override event Action OnServerReceivedData; + + } } diff --git a/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransportNATPuncher.cs b/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransportNATPuncher.cs index 69c1237..78703b7 100644 --- a/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransportNATPuncher.cs +++ b/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransportNATPuncher.cs @@ -3,6 +3,7 @@ using System.Net; using System.Collections; using UnityEngine; using FishNet.Transporting; +using FishNet.Transporting.Multipass; namespace FishBait { diff --git a/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransportVariables.cs b/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransportVariables.cs index 9398ce4..c676169 100644 --- a/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransportVariables.cs +++ b/FishBait-UnityProject/Assets/FishBait/FishBaitTransport/FishBaitTransportVariables.cs @@ -4,6 +4,7 @@ using System.Net.Sockets; using UnityEngine.Events; using UnityEngine; using FishNet.Transporting; +using FishNet.Transporting.Multipass; namespace FishBait { diff --git a/FishBait-UnityProject/Assets/FishBaitFunctionTester.unity b/FishBait-UnityProject/Assets/FishBaitFunctionTester.unity index 85b9eb2..e42381c 100644 --- a/FishBait-UnityProject/Assets/FishBaitFunctionTester.unity +++ b/FishBait-UnityProject/Assets/FishBaitFunctionTester.unity @@ -497,7 +497,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1516572637330113619} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1172724428 GameObject: @@ -691,57 +691,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: functionDisplay: {fileID: 278665276} ---- !u!1 &1287384425 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1287384427} - - component: {fileID: 1287384426} - m_Layer: 0 - m_Name: FishBait - Direct Connect - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1287384426 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1287384425} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6f48f002b825cbd45a19bd96d90f9edb, type: 3} - m_Name: - m_EditorClassIdentifier: - _unreliableMTU: 1023 - _ipv4BindAddress: - _ipv6BindAddress: - _port: 7770 - _maximumClients: 4095 - _clientAddress: localhost - _timeout: 15 ---- !u!4 &1287384427 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1287384425} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1516572637330113619} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!224 &905488192866952489 RectTransform: m_ObjectHideFlags: 0 @@ -793,7 +742,6 @@ GameObject: - component: {fileID: 8234759579310384502} - component: {fileID: 1516572637330113630} - component: {fileID: 8234759579310384505} - - component: {fileID: 8234759579310384507} - component: {fileID: 8234759579310384506} m_Layer: 0 m_Name: FishNetworkManager @@ -815,7 +763,6 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 5670112771492132974} - - {fileID: 1287384427} - {fileID: 1094339531} m_Father: {fileID: 0} m_RootOrder: 4 @@ -1383,7 +1330,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 34e4a322dca349547989b14021da4e23, type: 3} m_Name: m_EditorClassIdentifier: - Transport: {fileID: 8234759579310384507} + Transport: {fileID: 8234759579310384506} _latencySimulator: _enabled: 0 _simulateHost: 1 @@ -1399,48 +1346,9 @@ MonoBehaviour: m_GameObject: {fileID: 1516572637330113617} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 21eba6e2b0a7e964eb29db14a4eae4d6, type: 3} + m_Script: {fileID: 11500000, guid: 314b449d3505bd24487ba69b61c2fda5, type: 3} m_Name: m_EditorClassIdentifier: - directConnectTransport: {fileID: 1287384426} - showDebugLogs: 0 ---- !u!114 &8234759579310384507 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1516572637330113617} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 37bf248b7e575fe4592c1ec247b10573, type: 3} - m_Name: - m_EditorClassIdentifier: - transport: {fileID: 1094339530} - serverIP: 129.151.223.167 - serverPort: 7777 - endpointServerPort: 8080 - heartBeatInterval: 3 - connectOnAwake: 1 - authenticationKey: Secret Auth Key - disconnectedFromRelay: - m_PersistentCalls: - m_Calls: [] - connectedToRelay: - m_PersistentCalls: - m_Calls: [] - useNATPunch: 1 - NATPunchtroughPort: 1 - useLoadBalancer: 0 - loadBalancerPort: 7070 - loadBalancerAddress: 127.0.0.1 - serverName: My awesome server! - extraServerData: Map 1 - maxServerPlayers: 10 - isPublicServer: 1 - serverListUpdated: - m_PersistentCalls: - m_Calls: [] - serverStatus: Not Started. - serverId: - region: 1 + GlobalServerActions: 1 + _transports: + - {fileID: 1094339530} diff --git a/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/DataContainer.cs b/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/DataContainer.cs index 70f360b..1ff9ff9 100644 --- a/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/DataContainer.cs +++ b/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/DataContainer.cs @@ -48,13 +48,10 @@ namespace LightReflectiveMirror.LoadBalancing public string serverName; public string serverData; public bool isPublic; - public int currentPlayers { get => clients.Count + 1; } public int maxPlayers; - [JsonIgnore] - public List clients; - public RelayAddress relayInfo; + public int currentPlayers; } public enum LRMRegions { Any, NorthAmerica, SouthAmerica, Europe, Asia, Africa, Oceania } diff --git a/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Endpoint/Endpoint.cs b/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Endpoint/Endpoint.cs index 61a3cce..dfa8797 100644 --- a/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Endpoint/Endpoint.cs +++ b/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Endpoint/Endpoint.cs @@ -90,6 +90,7 @@ namespace LightReflectiveMirror.LoadBalancing Logger.ForceLogMessage("Conflicting Rooms! (That's ok)", ConsoleColor.Yellow); } + Logger.WriteLogMessage($"Try Calling CacheAllServers", ConsoleColor.Cyan); CacheAllServers(); await context.Response.SendResponseAsync(HttpStatusCode.Ok); } @@ -168,12 +169,18 @@ namespace LightReflectiveMirror.LoadBalancing { string region = context.Request.Headers["x-Region"]; - if (int.TryParse(region, out int regionID)) + + if (int.TryParse("Info:" + region, out int regionID)) { + Logger.WriteLogMessage("Send Servers, " + _regionRooms[(LRMRegions)regionID].Count, ConsoleColor.Cyan); + Logger.WriteLogMessage("Send Servers(Cached), " + _cachedRegionRooms[(LRMRegions)regionID], ConsoleColor.Cyan); await context.Response.SendResponseAsync(_cachedRegionRooms[(LRMRegions)regionID]); return; } + Logger.WriteLogMessage("Send Servers, "+_regionRooms[LRMRegions.Any].Count,ConsoleColor.Cyan); + Logger.WriteLogMessage("Send Servers(Cached), " + _cachedRegionRooms[LRMRegions.Any], ConsoleColor.Cyan); + // They didnt submit a region header, just give them all servers as they probably are viewing in browser. await context.Response.SendResponseAsync(_cachedRegionRooms[LRMRegions.Any]); } diff --git a/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Endpoint/EndpointExtra.cs b/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Endpoint/EndpointExtra.cs index 7cce8aa..b035ef7 100644 --- a/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Endpoint/EndpointExtra.cs +++ b/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Endpoint/EndpointExtra.cs @@ -1,4 +1,6 @@ -using Newtonsoft.Json; +using LightReflectiveMirror.Debug; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; @@ -9,8 +11,16 @@ namespace LightReflectiveMirror.LoadBalancing { static void CacheAllServers() { + Logger.WriteLogMessage($"CacheAllServers[{_regionRooms.Count}]", ConsoleColor.Cyan); + foreach (var region in _regionRooms) - _cachedRegionRooms[region.Key] = JsonConvert.SerializeObject(region.Value); + { + Logger.WriteLogMessage($"CacheAllServers[{region.Key}][{region.Value.Count}]", ConsoleColor.Cyan); + + _cachedRegionRooms[region.Key] = JsonConvert.SerializeObject(region.Value,Formatting.Indented); + + Logger.WriteLogMessage($"CacheAllServers[{region.Key}][{region.Value.Count}] {_cachedRegionRooms[region.Key]}", ConsoleColor.Cyan); + } } static void ClearAllServersLists() diff --git a/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Program/Program.cs b/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Program/Program.cs index f07b874..74523f7 100644 --- a/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Program/Program.cs +++ b/LoadBalancerProject-DONT-IMPORT-INTO-UNITY/LRM_LoadBalancer/Program/Program.cs @@ -23,6 +23,8 @@ namespace LightReflectiveMirror.LoadBalancing const string API_PATH = "/api/stats"; readonly string CONFIG_PATH = System.Environment.GetEnvironmentVariable("LRM_LB_CONFIG_PATH") ?? "config.json"; + private Random _cachedRandom = new(); + public static Config conf; public static Program instance; @@ -157,6 +159,7 @@ namespace LightReflectiveMirror.LoadBalancing /// public async Task> RequestServerListFromNode(string serverIP, ushort port) { + Logger.ForceLogMessage($"Request Server List from Node: {serverIP}:{port}", ConsoleColor.Yellow); using (WebClient wc = new WebClient()) { try diff --git a/ServerProject-DONT-IMPORT-INTO-UNITY/LRM/RelayHandler/RelayHandlerRoomMethods.cs b/ServerProject-DONT-IMPORT-INTO-UNITY/LRM/RelayHandler/RelayHandlerRoomMethods.cs index 93f8b5d..536e1c8 100644 --- a/ServerProject-DONT-IMPORT-INTO-UNITY/LRM/RelayHandler/RelayHandlerRoomMethods.cs +++ b/ServerProject-DONT-IMPORT-INTO-UNITY/LRM/RelayHandler/RelayHandlerRoomMethods.cs @@ -13,11 +13,11 @@ namespace LightReflectiveMirror /// The client requesting to create a room /// The maximum amount of players for this room /// The name for the server - /// Weather or not the server should show up on the server list + /// Whether or not the server should show up on the server list /// Extra data the host can include - /// Weather or not, the host is capable of doing direct connections + /// Whether or not, the host is capable of doing direct connections /// The hosts local IP - /// Weather or not, the host is supporting NAT Punch + /// Whether or not, the host is supporting NAT Punch /// The port of the direct connect transport on the host private void CreateRoom(int clientId, int maxPlayers, string serverName, bool isPublic, string serverData, bool useDirectConnect, string hostLocalIP, bool useNatPunch, int port) { @@ -38,7 +38,7 @@ namespace LightReflectiveMirror supportsDirectConnect = hostIP != null && useDirectConnect, port = port, useNATPunch = useNatPunch, - relayInfo = new RelayAddress { address = Program.publicIP, port = Program.conf.TransportPort, endpointPort = Program.conf.EndpointPort } + relayInfo = new RelayAddress { address = Program.publicIP, port = Program.conf.TransportPort, endpointPort = Program.conf.EndpointPort, serverRegion = Program.conf.LoadBalancerRegion } }; rooms.Add(room); @@ -98,7 +98,7 @@ namespace LightReflectiveMirror { sendJoinPos = 0; sendJoinBuffer.WriteByte(ref sendJoinPos, (byte)OpCodes.DirectConnectIP); - Console.WriteLine(Program.instance.NATConnections[clientId].Address.ToString()); + sendJoinBuffer.WriteString(ref sendJoinPos, Program.instance.NATConnections[clientId].Address.ToString()); sendJoinBuffer.WriteInt(ref sendJoinPos, Program.instance.NATConnections[clientId].Port); sendJoinBuffer.WriteBool(ref sendJoinPos, true); @@ -145,6 +145,7 @@ namespace LightReflectiveMirror { for (int i = 0; i < rooms.Count; i++) { + // if host left if (rooms[i].hostId == clientId) { int pos = 0; @@ -167,6 +168,7 @@ namespace LightReflectiveMirror } else { + // if the person that tried to kick wasnt host and it wasnt the client leaving on their own if (requiredHostId != -1 && rooms[i].hostId != requiredHostId) continue; @@ -180,6 +182,19 @@ namespace LightReflectiveMirror Program.transport.ServerSend(rooms[i].hostId, 0, new ArraySegment(sendBuffer, 0, pos)); _sendBuffers.Return(sendBuffer); + + // temporary solution to kicking bug + // this tells the local player that got kicked that he, well, got kicked. + pos = 0; + sendBuffer = _sendBuffers.Rent(1); + + sendBuffer.WriteByte(ref pos, (byte)OpCodes.ServerLeft); + + Program.transport.ServerSend(clientId, 0, new ArraySegment(sendBuffer, 0, pos)); + _sendBuffers.Return(sendBuffer); + + //end temporary solution + Endpoint.RoomsModified(); _cachedClientRooms.Remove(clientId); } @@ -187,4 +202,4 @@ namespace LightReflectiveMirror } } } -} \ No newline at end of file +} diff --git a/ServerProject-DONT-IMPORT-INTO-UNITY/LRM/Room.cs b/ServerProject-DONT-IMPORT-INTO-UNITY/LRM/Room.cs index 6d85aba..1a9717b 100644 --- a/ServerProject-DONT-IMPORT-INTO-UNITY/LRM/Room.cs +++ b/ServerProject-DONT-IMPORT-INTO-UNITY/LRM/Room.cs @@ -39,5 +39,6 @@ namespace LightReflectiveMirror public ushort port; public ushort endpointPort; public string address; + public LRMRegions serverRegion; } }