mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-13 02:30:44 -05:00
Exit if the user has deleted the BepInEx/plugins/spt
folder (!109)
Added as a check in the PrePatch, because while users delete `BepInEx/plugins/spt` often, it would be uncommon for them to also delete the prepatcher No idea why there's a second commit in this PR, it doesn't actually change anything. Just Git Things™ Co-authored-by: Terkoiz <terkoiz@spt.dev> Co-authored-by: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com> Reviewed-on: SPT-AKI/Modules#109 Co-authored-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com> Co-committed-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
This commit is contained in:
parent
91bc0ed1e0
commit
efa7a175c3
@ -16,7 +16,7 @@ namespace Aki.Core.Utils
|
|||||||
var v1 = Registry.LocalMachine.OpenSubKey(c0, false).GetValue("InstallLocation");
|
var v1 = Registry.LocalMachine.OpenSubKey(c0, false).GetValue("InstallLocation");
|
||||||
var v2 = (v1 != null) ? v1.ToString() : string.Empty;
|
var v2 = (v1 != null) ? v1.ToString() : string.Empty;
|
||||||
var v3 = new DirectoryInfo(v2);
|
var v3 = new DirectoryInfo(v2);
|
||||||
|
|
||||||
var v4 = new FileSystemInfo[]
|
var v4 = new FileSystemInfo[]
|
||||||
{
|
{
|
||||||
v3,
|
v3,
|
||||||
@ -55,4 +55,4 @@ namespace Aki.Core.Utils
|
|||||||
return File.Exists(a) ? new FileInfo(a) : null;
|
return File.Exists(a) ? new FileInfo(a) : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,4 +1,8 @@
|
|||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using BepInEx.Logging;
|
||||||
using Mono.Cecil;
|
using Mono.Cecil;
|
||||||
|
|
||||||
namespace Aki.PrePatch
|
namespace Aki.PrePatch
|
||||||
@ -10,8 +14,22 @@ namespace Aki.PrePatch
|
|||||||
public static int sptUsecValue = 49;
|
public static int sptUsecValue = 49;
|
||||||
public static int sptBearValue = 50;
|
public static int sptBearValue = 50;
|
||||||
|
|
||||||
|
private static string _sptPluginFolder = "plugins/spt";
|
||||||
|
|
||||||
public static void Patch(ref AssemblyDefinition assembly)
|
public static void Patch(ref AssemblyDefinition assembly)
|
||||||
{
|
{
|
||||||
|
// Make sure the user hasn't deleted the SPT plugins folder
|
||||||
|
string assemblyFolder = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
|
||||||
|
string sptPluginPath = Path.GetFullPath(Path.Combine(assemblyFolder, "..", _sptPluginFolder));
|
||||||
|
if (!ValidateSpt(sptPluginPath))
|
||||||
|
{
|
||||||
|
string message = $"'{sptPluginPath}' or required plugin files not found.\n\n" +
|
||||||
|
"Please re-install SPT. Exiting.";
|
||||||
|
MessageBoxHelper.Show(message, "[SPT-AKI] Missing Core Files", MessageBoxHelper.MessageBoxType.OK);
|
||||||
|
Environment.Exit(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var botEnums = assembly.MainModule.GetType("EFT.WildSpawnType");
|
var botEnums = assembly.MainModule.GetType("EFT.WildSpawnType");
|
||||||
|
|
||||||
var sptUsec = new FieldDefinition("sptUsec",
|
var sptUsec = new FieldDefinition("sptUsec",
|
||||||
@ -27,5 +45,31 @@ namespace Aki.PrePatch
|
|||||||
botEnums.Fields.Add(sptUsec);
|
botEnums.Fields.Add(sptUsec);
|
||||||
botEnums.Fields.Add(sptBear);
|
botEnums.Fields.Add(sptBear);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool ValidateSpt(string sptPluginPath)
|
||||||
|
{
|
||||||
|
ManualLogSource logger = Logger.CreateLogSource(nameof(AkiBotsPrePatcher));
|
||||||
|
|
||||||
|
// Validate that the SPT plugin path exists
|
||||||
|
if (!Directory.Exists(sptPluginPath))
|
||||||
|
{
|
||||||
|
logger.LogError($"'{sptPluginPath}' directory not found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate that the folder exists, and contains our plugins
|
||||||
|
string[] sptPlugins = new string[] { "aki-core.dll", "aki-custom.dll", "aki-singleplayer.dll" };
|
||||||
|
string[] foundPlugins = Directory.GetFiles(sptPluginPath).Select(x => Path.GetFileName(x)).ToArray();
|
||||||
|
|
||||||
|
foreach (string plugin in sptPlugins)
|
||||||
|
{
|
||||||
|
if (!foundPlugins.Contains(plugin))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
56
project/Aki.PrePatch/MessageBoxHelper.cs
Normal file
56
project/Aki.PrePatch/MessageBoxHelper.cs
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Aki.PrePatch
|
||||||
|
{
|
||||||
|
internal class MessageBoxHelper
|
||||||
|
{
|
||||||
|
public enum MessageBoxType : uint
|
||||||
|
{
|
||||||
|
ABORTRETRYIGNORE = (uint)(0x00000002L | 0x00000010L),
|
||||||
|
CANCELTRYCONTINUE = (uint)(0x00000006L | 0x00000030L),
|
||||||
|
HELP = (uint)(0x00004000L | 0x00000040L),
|
||||||
|
OK = (uint)(0x00000000L | 0x00000040L),
|
||||||
|
OKCANCEL = (uint)(0x00000001L | 0x00000040L),
|
||||||
|
RETRYCANCEL = (uint)0x00000005L,
|
||||||
|
YESNO = (uint)(0x00000004L | 0x00000040L),
|
||||||
|
YESNOCANCEL = (uint)(0x00000003L | 0x00000040L),
|
||||||
|
DEFAULT = (uint)(0x00000000L | 0x00000010L)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MessageBoxResult
|
||||||
|
{
|
||||||
|
ERROR = -1,
|
||||||
|
OK = 1,
|
||||||
|
CANCEL = 2,
|
||||||
|
ABORT = 3,
|
||||||
|
RETRY = 4,
|
||||||
|
IGNORE = 5,
|
||||||
|
YES = 6,
|
||||||
|
NO = 7,
|
||||||
|
TRY_AGAIN = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern IntPtr GetActiveWindow();
|
||||||
|
[DllImport("user32.dll", SetLastError = true)]
|
||||||
|
static extern int MessageBox(IntPtr hwnd, String lpText, String lpCaption, uint uType);
|
||||||
|
|
||||||
|
public static IntPtr GetWindowHandle()
|
||||||
|
{
|
||||||
|
return GetActiveWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MessageBoxResult Show(string text, string caption, MessageBoxType type = MessageBoxType.DEFAULT)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return (MessageBoxResult)MessageBox(GetWindowHandle(), text, caption, (uint)type); ;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
return MessageBoxResult.ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user