diff --git a/project/Aki.Core/AkiCorePlugin.cs b/project/Aki.Core/AkiCorePlugin.cs
index eaacee0..5973e10 100644
--- a/project/Aki.Core/AkiCorePlugin.cs
+++ b/project/Aki.Core/AkiCorePlugin.cs
@@ -1,15 +1,25 @@
using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
using Aki.Common;
using Aki.Core.Patches;
using BepInEx;
+using BepInEx.Bootstrap;
+using UnityEngine;
namespace Aki.Core
{
[BepInPlugin("com.spt-aki.core", "AKI.Core", AkiPluginInfo.PLUGIN_VERSION)]
class AkiCorePlugin : BaseUnityPlugin
{
+ // Temp static logger field, remove along with plugin whitelisting before release
+ private static BepInEx.Logging.ManualLogSource _logger;
+
public void Awake()
{
+ _logger = Logger;
+
Logger.LogInfo("Loading: Aki.Core");
try
@@ -21,6 +31,7 @@ namespace Aki.Core
new UnityWebRequestPatch().Enable();
new WebSocketPatch().Enable();
new TransportPrefixPatch().Enable();
+ new PreventClientModsPatch().Enable();
}
catch (Exception ex)
{
@@ -31,5 +42,41 @@ namespace Aki.Core
Logger.LogInfo("Completed: Aki.Core");
}
+
+ ///
+ /// See for explanation on why this is needed.
+ /// Yes, I know this is jank but it's temporary and will be removed before release :)
+ ///
+ internal static void CheckForNonWhitelistedPlugins()
+ {
+ var whitelistedPlugins = new HashSet
+ {
+ "com.spt-aki.core",
+ "com.spt-aki.custom",
+ "com.spt-aki.debugging",
+ "com.spt-aki.singleplayer",
+ "com.bepis.bepinex.configurationmanager",
+ "com.terkoiz.freecam",
+ "com.sinai.unityexplorer",
+ "com.cwx.debuggingtool-dxyz",
+ "com.cwx.debuggingtool",
+ "xyz.drakia.botdebug",
+ "com.kobrakon.camunsnap",
+ "RuntimeUnityEditor"
+ };
+
+ var disallowedPlugins = Chainloader.PluginInfos.Values.Select(pi => pi.Metadata.GUID).Except(whitelistedPlugins).ToArray();
+ if (disallowedPlugins.Any())
+ {
+ _logger.LogError($"One or more non-whitelisted plugins were detected. Mods are not allowed in BleedingEdge builds of SPT. Illegal plugins:\n{string.Join("\n", disallowedPlugins)}");
+
+ // Delay game shutdown by a little bit, since logging sometimes doesn't have enough time to write to file
+ Task.Run(() =>
+ {
+ Task.Delay(500);
+ Application.Quit(0);
+ });
+ }
+ }
}
}
diff --git a/project/Aki.Core/Patches/PreventClientModsPatch.cs b/project/Aki.Core/Patches/PreventClientModsPatch.cs
new file mode 100644
index 0000000..60090a8
--- /dev/null
+++ b/project/Aki.Core/Patches/PreventClientModsPatch.cs
@@ -0,0 +1,24 @@
+using System.Reflection;
+using Aki.Reflection.Patching;
+using EFT;
+using HarmonyLib;
+
+namespace Aki.Core.Patches
+{
+ ///
+ /// Prevents loading of non-whitelisted client mods to minimize the amount of false issue reports being made during the public BE phase
+ ///
+ public class PreventClientModsPatch : ModulePatch
+ {
+ protected override MethodBase GetTargetMethod()
+ {
+ return AccessTools.Method(typeof(TarkovApplication), nameof(TarkovApplication.method_20));
+ }
+
+ [PatchPrefix]
+ private static void Prefix()
+ {
+ AkiCorePlugin.CheckForNonWhitelistedPlugins();
+ }
+ }
+}
\ No newline at end of file