using System; using System.Reflection; using GameNetworkLayer.Shared; using HarmonyLib; using Svelto.Context; using Svelto.ECS; namespace CLre_server.API.MainServer { public class UserVerification { public static UserVerification Instance { get; internal set; } private delegate void DisconnectPlayer_VerificationFailedProto(int playerId, string error); private delegate void DisconnectPlayerProto(int playerId, NetworkDispatcherCode code); private readonly DisconnectPlayer_VerificationFailedProto _disconnectPlayerVerificationFailed; private readonly DisconnectPlayerProto _disconnectPlayer; // This doesn't seem to do actually generate a popup, but it will stop the player from loading in /*public void DisconnectPlayer_VerificationFailed(int playerId, string error) { _disconnectPlayerVerificationFailed(playerId, error); }*/ public void DisconnectPlayer(int playerId, NetworkDispatcherCode code = NetworkDispatcherCode.ModVerificationFail) { _disconnectPlayer(playerId, code); } internal UserVerification(IQueryingEntitiesEngine uvs) { Type uvsType = AccessTools.TypeByName("User.Server.UserVerificationServer"); _disconnectPlayerVerificationFailed = Utility.Reflection.MethodAsDelegate(uvsType, "DisconnectPlayer_VerificationFailed", //parameters: new [] {typeof(int), typeof(string)}, instance: uvs); _disconnectPlayer = Utility.Reflection.MethodAsDelegate(uvsType, "DisconnectPlayer", instance: uvs); } } // This seems to think that __instance is always simply a System.Object (caused by Harmony?), which doesn't work /*[HarmonyPatch] class UserVerificationServer_Constructor_Patch { private static IQueryingEntitiesEngine uvs = null; [HarmonyPrefix] public static void BeforeMethodCall() { } [HarmonyPostfix] public static void AfterMethodCall(IQueryingEntitiesEngine __instance) { uvs = __instance; UserVerification.Instance = new UserVerification(__instance); } [HarmonyTargetMethod] public static MethodBase Target() { return AccessTools.Constructor(AccessTools.TypeByName("User.Server.UserVerificationServer")); } }*/ [HarmonyPatch] class MainGameServer_CreatePlayerDisconnectionSequence_Patch { private static IQueryingEntitiesEngine uvs = null; [HarmonyPrefix] public static void BeforeMethodCall() { } [HarmonyPostfix] public static void AfterMethodCall(IQueryingEntitiesEngine userVerificationEng) { uvs = userVerificationEng; UserVerification.Instance = new UserVerification(userVerificationEng); } [HarmonyTargetMethod] public static MethodBase Target() { return AccessTools.Method("GameServer.GameFramework.MainGameServer:CreatePlayerDisconnectionSequence"); } } }