CLre/CLre_server/API/MainServer/Server.cs

223 lines
No EOL
7.3 KiB
C#

using System;
using System.Reflection;
using GameNetworkLayer.Shared;
using GameServer;
using HarmonyLib;
using NetworkFramework.Server;
using Svelto.Context;
using User.Server;
namespace CLre_server.API.MainServer
{
public class Server
{
// static
private static Server _instance = null;
public static Server Instance
{
get
{
if (_instance == null) Init();
return _instance;
}
}
internal static void Init()
{
if (_instance == null) _instance = new Server();
}
// instance events
public event EventHandler<StartingEventArgs> InitStart
{
add => MainGameServer_Constructor_Patch.preConstructor += value;
remove => MainGameServer_Constructor_Patch.preConstructor -= value;
}
public event EventHandler<StartedEventArgs> InitComplete
{
add => ServerReadyEngine.serverEngineReady += value;
remove => ServerReadyEngine.serverEngineReady -= value;
}
public event EventHandler<StartedEventArgs> FrameworkReady
{
add => ServerReadyEngine.serverFrameworkReady += value;
remove => ServerReadyEngine.serverFrameworkReady -= value;
}
public event EventHandler<StopEventArgs> FrameworkExit
{
add => ServerReadyEngine.serverFrameworkDestroyed += value;
remove => ServerReadyEngine.serverFrameworkDestroyed -= value;
}
public event EventHandler<StartedEventArgs> Connected
{
add => PhotonNetwork_ConnectUsingSettings_Patch.postConnect += value;
remove => PhotonNetwork_ConnectUsingSettings_Patch.postConnect -= value;
}
public event EventHandler<PlayerConnectArgs> PlayerConnect
{
add => MainGameServer_SetupContainer_Patch.playerConnected += value;
remove => MainGameServer_SetupContainer_Patch.playerConnected -= value;
}
public event EventHandler<PlayerConnectArgs> PlayerDisconnect
{
add => MainGameServer_SetupContainer_Patch.playerDisconnected += value;
remove => MainGameServer_SetupContainer_Patch.playerDisconnected -= value;
}
// properties
public GameServerSettings GameServerSettings
{
get => MainGameServer_SetupMods_Patch._gameServerSettings;
set
{
MainGameServer_SetupMods_Patch._gameServerSettings = value;
Traverse.Create(MainGameServer_Constructor_Patch.mgs).Field<GameServerSettings>("_gameServerSettings").Value = value;
}
}
public AccountIdServerNode[] Players
{
get => _serverDatabaseQueryEngine.GetConnectedAccounts();
}
// fields
private ServerDatabaseQueryEngine _serverDatabaseQueryEngine;
private ServerReadyEngine _serverReadyEngine;
private Server()
{
_serverReadyEngine = new ServerReadyEngine();
_serverDatabaseQueryEngine = new ServerDatabaseQueryEngine();
}
}
[HarmonyPatch]
class MainGameServer_SetupMods_Patch
{
internal static GameServerSettings _gameServerSettings;
[HarmonyPostfix]
public static void AfterMethodCall(GameServerSettings ____gameServerSettings)
{
#if DEBUG
Utility.Logging.MetaLog("Got GameServerSettings");
#endif
_gameServerSettings = ____gameServerSettings;
}
[HarmonyTargetMethod]
public static MethodBase Target()
{
return AccessTools.Method("GameServer.GameFramework.MainGameServer:SetupMods");
}
}
[HarmonyPatch]
class MainGameServer_Constructor_Patch
{
internal static ICompositionRoot mgs = null;
internal static event EventHandler<StartingEventArgs> preConstructor;
internal static event EventHandler<StartingEventArgs> postConstructor;
[HarmonyPrefix]
public static void BeforeMethodCall()
{
if (preConstructor != null) preConstructor(null, default(StartingEventArgs));
}
[HarmonyPostfix]
public static void AfterMethodCall(ICompositionRoot __instance)
{
mgs = __instance;
if (postConstructor != null) postConstructor(__instance, default(StartingEventArgs));
}
[HarmonyTargetMethod]
public static MethodBase Target()
{
return AccessTools.Constructor(AccessTools.TypeByName("GameServer.GameFramework.MainGameServer"));
}
}
[HarmonyPatch(typeof(PhotonNetwork), "ConnectUsingSettings")]
class PhotonNetwork_ConnectUsingSettings_Patch
{
internal static event EventHandler<StartedEventArgs> preConnect;
internal static event EventHandler<StartedEventArgs> postConnect;
[HarmonyPostfix]
public static void AfterMethodCall(string gameVersion)
{
if (postConnect != null) postConnect(null, new StartedEventArgs
{
photonVersion = gameVersion,
photonRegion = PhotonNetwork.CloudRegion,
worldName = MainGameServer_SetupMods_Patch._gameServerSettings.GetWorldName(),
gameGuid = MainGameServer_SetupMods_Patch._gameServerSettings.GetGameGuid(),
});
}
[HarmonyPrefix]
public static void BeforeMethodCall(string gameVersion)
{
if (preConnect != null) preConnect(null, new StartedEventArgs
{
photonVersion = gameVersion,
photonRegion = PhotonNetwork.CloudRegion,
worldName = MainGameServer_SetupMods_Patch._gameServerSettings.GetWorldName(),
gameGuid = MainGameServer_SetupMods_Patch._gameServerSettings.GetGameGuid(),
});
}
}
[HarmonyPatch(typeof(GameServer.GameFramework.MainGameServer), "SetupContainer")]
class MainGameServer_SetupContainer_Patch
{
internal static event EventHandler<PlayerConnectArgs> playerConnected;
internal static event EventHandler<PlayerConnectArgs> playerDisconnected;
private static GameServer.GameFramework.MainGameServer mgs = null;
[HarmonyPostfix]
public static void AfterMethodCall(GameServer.GameFramework.MainGameServer __instance, ref IPlayerConnectedCallbacks ____playerConnectedCallbacks)
{
mgs = __instance;
____playerConnectedCallbacks.OnPlayerConnected += OnConnect;
____playerConnectedCallbacks.OnPlayerDisconnected += OnDisconnect;
}
public static void OnConnect(int playerId)
{
Synergy.Clients.RegisterClient(playerId);
if (playerConnected != null) playerConnected(mgs, new PlayerConnectArgs
{
PlayerId = playerId,
});
}
public static void OnDisconnect(int playerId)
{
Synergy.Clients.RemoveClient(playerId);
if (playerDisconnected != null) playerDisconnected(mgs, new PlayerConnectArgs
{
PlayerId = playerId,
});
}
}
}