added fixes from pull #1

This commit is contained in:
NIMFER 2022-10-25 23:42:01 +02:00
parent 1957cf2bfb
commit 98416af0af
10 changed files with 164 additions and 196 deletions

View file

@ -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<ClientConnectionStateArgs> OnClientConnectionState
public override bool Equals(object other)
{
add
{
transport.OnClientConnectionState += value;
}
remove
{
transport.OnClientConnectionState -= value;
}
return base.Equals(other);
}
public override event Action<ServerConnectionStateArgs> OnServerConnectionState
public override string GetClientAddress()
{
add
{
transport.OnServerConnectionState += value;
}
remove
{
transport.OnServerConnectionState -= value;
}
}
public override event Action<RemoteConnectionStateArgs> OnRemoteConnectionState
{
add
{
transport.OnRemoteConnectionState += value;
}
remove
{
transport.OnRemoteConnectionState -= value;
}
}
public override event Action<ClientReceivedDataArgs> OnClientReceivedData
{
add
{
transport.OnClientReceivedData += value;
}
remove
{
transport.OnClientReceivedData -= value;
}
}
public override event Action<ServerReceivedDataArgs> 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<byte> segment, int connectionId)
{
transport.SendToClient(channelId, segment, connectionId);
throw new NotImplementedException();
}
public override void SendToServer(byte channelId, ArraySegment<byte> 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
/// <summary>Called by Transport when a new client connected to the server.</summary>
@ -186,10 +207,14 @@ namespace FishBait
public Action OnClientConnected = () => Debug.LogWarning("OnClientConnected called with no handler");
/// <summary>Called by Transport when the client disconnected from the server.</summary>
public Action OnClientDisconnected = () => Debug.LogWarning("OnClientDisconnected called with no handler");
public void SetTransportPort(ushort port)
{
transport.SetPort(port);
}
public override event Action<ClientConnectionStateArgs> OnClientConnectionState;
public override event Action<ServerConnectionStateArgs> OnServerConnectionState;
public override event Action<RemoteConnectionStateArgs> OnRemoteConnectionState;
public override event Action<ClientReceivedDataArgs> OnClientReceivedData;
public override event Action<ServerReceivedDataArgs> OnServerReceivedData;
}
}

View file

@ -3,6 +3,7 @@ using System.Net;
using System.Collections;
using UnityEngine;
using FishNet.Transporting;
using FishNet.Transporting.Multipass;
namespace FishBait
{

View file

@ -4,6 +4,7 @@ using System.Net.Sockets;
using UnityEngine.Events;
using UnityEngine;
using FishNet.Transporting;
using FishNet.Transporting.Multipass;
namespace FishBait
{

View file

@ -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}

View file

@ -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<int> clients;
public RelayAddress relayInfo;
public int currentPlayers;
}
public enum LRMRegions { Any, NorthAmerica, SouthAmerica, Europe, Asia, Africa, Oceania }

View file

@ -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]);
}

View file

@ -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()

View file

@ -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
/// <returns></returns>
public async Task<List<Room>> RequestServerListFromNode(string serverIP, ushort port)
{
Logger.ForceLogMessage($"Request Server List from Node: {serverIP}:{port}", ConsoleColor.Yellow);
using (WebClient wc = new WebClient())
{
try

View file

@ -13,11 +13,11 @@ namespace LightReflectiveMirror
/// <param name="clientId">The client requesting to create a room</param>
/// <param name="maxPlayers">The maximum amount of players for this room</param>
/// <param name="serverName">The name for the server</param>
/// <param name="isPublic">Weather or not the server should show up on the server list</param>
/// <param name="isPublic">Whether or not the server should show up on the server list</param>
/// <param name="serverData">Extra data the host can include</param>
/// <param name="useDirectConnect">Weather or not, the host is capable of doing direct connections</param>
/// <param name="useDirectConnect">Whether or not, the host is capable of doing direct connections</param>
/// <param name="hostLocalIP">The hosts local IP</param>
/// <param name="useNatPunch">Weather or not, the host is supporting NAT Punch</param>
/// <param name="useNatPunch">Whether or not, the host is supporting NAT Punch</param>
/// <param name="port">The port of the direct connect transport on the host</param>
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<byte>(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<byte>(sendBuffer, 0, pos));
_sendBuffers.Return(sendBuffer);
//end temporary solution
Endpoint.RoomsModified();
_cachedClientRooms.Remove(clientId);
}
@ -187,4 +202,4 @@ namespace LightReflectiveMirror
}
}
}
}
}

View file

@ -39,5 +39,6 @@ namespace LightReflectiveMirror
public ushort port;
public ushort endpointPort;
public string address;
public LRMRegions serverRegion;
}
}