NLDClient-yudde/ProjectNLD/Assets/ThirdParty/AntiCheatToolkit/Runtime/Scripts/Common/ContainerHolder.cs

63 lines
2.3 KiB
C#

#region copyright
// ------------------------------------------------------
// Copyright (C) Dmitriy Yukhanov [https://codestage.net]
// ------------------------------------------------------
#endregion
using UnityEngine;
namespace CodeStage.AntiCheat.Common
{
internal static class ContainerHolder
{
public const string ContainerName = "Anti-Cheat Toolkit";
private static GameObject container;
private static bool containerSet;
// making sure it will reset the container even if domain reload is disabled
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void SubsystemRegistration()
{
containerSet = false;
container = null;
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
private static void AfterAssembliesLoaded() => AssertNoContainerExists(nameof(RuntimeInitializeLoadType.AfterAssembliesLoaded));
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
private static void BeforeSplashScreen() => AssertNoContainerExists(nameof(RuntimeInitializeLoadType.BeforeSplashScreen));
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void BeforeSceneLoad() => AssertNoContainerExists(nameof(RuntimeInitializeLoadType.BeforeSceneLoad));
private static void AssertNoContainerExists(string phaseName)
{
if (!containerSet)
return;
Debug.LogError($"[ACTk] {nameof(ContainerHolder)}: container created too early ({phaseName})!\n" +
$"It should be created only after {nameof(RuntimeInitializeLoadType)}.{nameof(RuntimeInitializeLoadType.AfterSceneLoad)} / Awake phase to avoid state corruption!\n" +
$"Make sure to avoid accessing ACTk APIs before {nameof(RuntimeInitializeLoadType)}.{nameof(RuntimeInitializeLoadType.AfterSceneLoad)} / Awake");
}
public static T AddContainerComponent<T>() where T : KeepAliveBehaviour<T>
{
if (container == null)
container = new GameObject(ContainerName);
containerSet = true;
return container.AddComponent<T>();
}
public static void TrySetContainer(GameObject gameObject)
{
if (container == null && gameObject.name == ContainerName)
{
container = gameObject;
containerSet = true;
}
}
}
}