diff --git a/App.config b/App.config
new file mode 100644
index 0000000..e29e846
--- /dev/null
+++ b/App.config
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BeforeBuild.bat b/BeforeBuild.bat
new file mode 100644
index 0000000..fedf52c
--- /dev/null
+++ b/BeforeBuild.bat
@@ -0,0 +1,27 @@
+@echo off
+setlocal
+
+echo Before Building Action...
+where git >nul 2>nul
+if errorlevel 1 (
+ echo Git is not installed. Using default commit hash.
+ set COMMIT_HASH="NOT SET"
+) else (
+ for /f "tokens=1" %%i in ('git rev-parse --short HEAD') do set COMMIT_HASH=%%i
+)
+
+for /f "usebackq delims=" %%t in (`powershell -Command "(Get-Date -Format 'o')"`) do (
+ set TIMESTAMP=%%t
+)
+
+echo CommitHash="%COMMIT_HASH%"
+echo BuildDate="%TIMESTAMP%"
+
+echo namespace SinmaiAssist { > ..\BuildInfo.cs
+echo public static partial class BuildInfo { >> ..\BuildInfo.cs
+echo public const string CommitHash = "%COMMIT_HASH%"; >> ..\BuildInfo.cs
+echo public const string BuildDate = "%TIMESTAMP%"; >> ..\BuildInfo.cs
+echo } >> ..\BuildInfo.cs
+echo } >> ..\BuildInfo.cs
+
+endlocal
diff --git a/BuildInfo.cs b/BuildInfo.cs
new file mode 100644
index 0000000..022385a
--- /dev/null
+++ b/BuildInfo.cs
@@ -0,0 +1,6 @@
+namespace SinmaiAssist {
+ public static partial class BuildInfo {
+ public const string CommitHash = "";
+ public const string BuildDate = "2025-09-01T20:28:07.9918439+08:00";
+ }
+}
diff --git a/FodyWeavers.xml b/FodyWeavers.xml
new file mode 100644
index 0000000..625c929
--- /dev/null
+++ b/FodyWeavers.xml
@@ -0,0 +1,5 @@
+
+
+ YamlDotNet|EmbedIO
+
+
\ No newline at end of file
diff --git a/FodyWeavers.xsd b/FodyWeavers.xsd
new file mode 100644
index 0000000..968f9b5
--- /dev/null
+++ b/FodyWeavers.xsd
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+ A regular expression matching the assembly names to include in merging.
+
+
+
+
+ A regular expression matching the assembly names to exclude from merging.
+
+
+
+
+ A regular expression matching the resource names to include in merging.
+
+
+
+
+ A regular expression matching the resource names to exclude from merging.
+
+
+
+
+ A switch to control whether the imported types are hidden (made private) or keep their visibility unchanged. Default is 'true'
+
+
+
+
+ A string that is used as prefix for the namespace of the imported types.
+
+
+
+
+ A switch to control whether to import the full assemblies or only the referenced types. Default is 'false'
+
+
+
+
+ A switch to enable compacting of the target assembly by skipping properties, events and unused methods. Default is 'false'
+
+
+
+
+
+ A regular expression matching the assembly names to include in merging.
+
+
+
+
+ A regular expression matching the assembly names to exclude from merging.
+
+
+
+
+ A regular expression matching the resource names to include in merging.
+
+
+
+
+ A regular expression matching the resource names to exclude from merging.
+
+
+
+
+ A switch to control whether the imported types are hidden (made private) or keep their visibility unchanged. Default is 'true'
+
+
+
+
+ A string that is used as prefix for the namespace of the imported types.
+
+
+
+
+ A switch to control whether to import the full assemblies or only the referenced types. Default is 'false'
+
+
+
+
+ A switch to enable compacting of the target assembly by skipping properties, events and unused methods. Default is 'false'
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file
diff --git a/Main.cs b/Main.cs
new file mode 100644
index 0000000..a062c34
--- /dev/null
+++ b/Main.cs
@@ -0,0 +1,359 @@
+using MAI2System;
+using MelonLoader;
+using System;
+using System.Collections;
+using System.IO;
+using System.Reflection;
+using HarmonyLib;
+using SinmaiAssist.Attributes;
+using SinmaiAssist.Cheat;
+using SinmaiAssist.Common;
+using SinmaiAssist.Config;
+using SinmaiAssist.Fix;
+using SinmaiAssist.GUI;
+using SinmaiAssist.Utils;
+using UnityEngine;
+using Path = System.IO.Path;
+
+namespace SinmaiAssist
+{
+ public static partial class BuildInfo
+ {
+ public const string Name = "Sinmai-Assist";
+ public const string Description = "SlimMod Melon Version For Sinmai";
+ public const string Author = "x";
+ public const string Company = "Nya~";
+ public const string Version = "2.0.0";
+ public const string DownloadLink = null;
+ }
+
+ public class SinmaiAssist : MelonMod
+ {
+ private MainGUI _mainGUI;
+ private static bool _isPatchFailed = false;
+ private static ConfigManager _mainConfigManager;
+ private static ConfigManager _keyBindConfigManager;
+ private static WebServer.WebServer _webServer;
+ public static MainConfig MainConfig;
+ public static KeyBindConfig KeyBindConfig;
+ public static string GameID = "Unknown";
+ public static uint GameVersion = 00000;
+
+ public override void OnInitializeMelon()
+ {
+ if(!Directory.Exists($"./{BuildInfo.Name}")) Directory.CreateDirectory($"./{BuildInfo.Name}");
+
+ // 初始化UnityLogger
+ if(File.Exists($"./{BuildInfo.Name}/Unity.log")) File.Delete($"{BuildInfo.Name}/Unity.log");
+ File.WriteAllText($"./{BuildInfo.Name}/Unity.log", "");
+ Application.logMessageReceived += OnLogMessageReceived;
+
+ PrintLogo();
+ _mainGUI = new MainGUI();
+
+ // 加载配置文件
+ try
+ {
+ var keyBindCoverter = new KeyBindConfig.Converter();
+ _mainConfigManager = new ConfigManager($"./{BuildInfo.Name}/config.yml");
+ _keyBindConfigManager = new ConfigManager($"./{BuildInfo.Name}/keybind.yml", keyBindCoverter);
+ MainConfig = _mainConfigManager.GetConfig();
+ KeyBindConfig = _keyBindConfigManager.GetConfig();
+ DummyLoginPanel.DummyUserId = MainConfig.Common.DummyLogin.DefaultUserId.ToString();
+ DebugPanel.UnityLogger = MainConfig.Common.UnityLogger.Enable;
+ MelonLogger.Msg("Config Load Complete.");
+ }
+ catch (Exception e)
+ {
+ MelonLogger.Error($"Error initializing mod config: \n{e}");
+ return;
+ }
+
+ // 初始化WebServer
+ if (MainConfig.ModSetting.WebServer.Enable)
+ {
+ _webServer = new WebServer.WebServer(
+ MainConfig.ModSetting.WebServer.Host,
+ MainConfig.ModSetting.WebServer.Port,
+ MainConfig.ModSetting.WebServer.Token
+ );
+ _webServer.Start();
+ }
+
+ // 输出设备摄像头列表
+ File.Delete($"{BuildInfo.Name}/WebCameraList.txt");
+ WebCamDevice[] devices = WebCamTexture.devices;
+ string CameraList = "\nConnected Web Cameras:\n";
+ for (int i = 0; i < devices.Length; i++)
+ {
+ WebCamDevice webCamDevice = devices[i];
+ CameraList = CameraList + "Name: " + webCamDevice.name + "\n";
+ CameraList += $"ID: {i}\n";
+ WebCamTexture webCamTexture = new WebCamTexture(webCamDevice.name);
+ webCamTexture.Play();
+ CameraList += $"Resolution: {webCamTexture.width}x{webCamTexture.height}\n";
+ CameraList += $"FPS: {webCamTexture.requestedFPS}\n";
+ webCamTexture.Stop();
+ CameraList += "\n";
+ }
+
+ File.AppendAllText($"{BuildInfo.Name}/WebCameraList.txt", CameraList);
+
+ try
+ {
+ GameID = (string)typeof(ConstParameter).GetField("GameIDStr",
+ BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy).GetValue(null);
+ GameVersion = (uint)typeof(ConstParameter).GetField("NowGameVersion",
+ BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy).GetValue(null);
+
+ if (GameVersion < 24000)
+ {
+ MelonLogger.Warning($"Using untested version ({GameVersion}) maybe case some unexcepted problems!");
+ }
+ }
+ catch (Exception e)
+ {
+ MelonLogger.Error("Failed to get GameIDStr and GameVersion");
+ MelonLogger.Error(e);
+ }
+
+ MelonLogger.Msg($"GameInfo: {GameID} {GameVersion} ");
+
+ // 弃用的神秘判断代码
+ // var Codes = new List { 83, 68, 71, 66 };
+ // var str = string.Concat(Codes.Select(code => (char)code));
+
+ if (MainConfig.ModSetting.SafeMode)
+ {
+ MelonLogger.Warning("Safe mode is enabled, Disable all patch");
+ return;
+ }
+
+ // 加载Patch
+ Patch(typeof(HarmonyLibPatch),true);
+
+ // DummyLogin
+ if (MainConfig.Common.DummyLogin.Enable)
+ {
+ if (GameID.Equals("SDGB"))
+ {
+ Patch(typeof(DummyChimeLogin));
+ }
+ else
+ {
+ if (File.Exists("DEVICE/aime.txt"))
+ DummyLoginPanel.DummyLoginCode = File.ReadAllText("DEVICE/aime.txt").Trim();
+ Patch(typeof(DummyAimeLogin));
+ }
+ }
+
+ if (MainConfig.Common.CustomCameraId.Enable)
+ {
+ if (MainConfig.Common.DummyLogin.Enable)
+ {
+ MelonLogger.Warning("DummyLogin enabled, CustomCameraId has been automatically disabled.");
+ }
+ else
+ {
+ Patch(typeof(CustomCameraId));
+ }
+ }
+
+ // Common
+ if (MainConfig.Common.AutoBackupData) Patch(typeof(AutoBackupData));
+ if (MainConfig.Common.InfinityTimer) Patch(typeof(InfinityTimer));
+ if (MainConfig.Common.InfinityTimerLegacy) Patch(typeof(InfinityTimerLegacy));
+ if (MainConfig.Common.DisableBackground) Patch(typeof(DisableBackground));
+ if (MainConfig.Common.DisableMask) Patch(typeof(DisableMask));
+ if (MainConfig.Common.SinglePlayer.Enable) Patch(typeof(SinglePlayer));
+ if (MainConfig.Common.ForceQuickRetry) Patch(typeof(ForceQuickRetry));
+ if (MainConfig.Common.ForwardATouchRegionToButton) Patch(typeof(ForwardATouchRegionToButton));
+ // 存在资源加载问题,现已禁用
+ // if (MainConfig.Common.QuickBoot) Patch(typeof(QuickBoot));
+ if (MainConfig.Common.BlockCoin) Patch(typeof(BlockCoin));
+ if (MainConfig.Common.SkipWarningScreen) Patch(typeof(SkipWarningScreen));
+ if (MainConfig.Common.SkipFade) Patch(typeof(SkipFade));
+ if (MainConfig.Common.NetworkLogger.Enable) Patch(typeof(NetworkLogger));
+ if (MainConfig.Common.CustomVersionText.Enable) Patch(typeof(CustomVersionText));
+ if (MainConfig.Common.IgnoreAnyGameInformation) Patch(typeof(IgnoreAnyGameInformation));
+ if (MainConfig.Common.ChangeDefaultOption) Patch(typeof(ChangeDefaultOption));
+ if (MainConfig.Common.ChangeFadeStyle) Patch(typeof(ChangeFadeStyle));
+ if (MainConfig.Common.ChangeGameSettings.Enable) Patch(typeof(ChangeGameSettings));
+
+ //Fix
+ if (MainConfig.Fix.DisableEnvironmentCheck) Patch(typeof(DisableEnvironmentCheck));
+ if (MainConfig.Fix.DisableEncryption) Patch(typeof(DisableEncryption));
+ if (MainConfig.Fix.DisableReboot) Patch(typeof(DisableReboot));
+ if (MainConfig.Fix.DisableIniClear) Patch(typeof(DisableIniClear));
+ if (MainConfig.Fix.FixDebugInput) Patch(typeof(FixDebugInput));
+ if (MainConfig.Fix.FixCheckAuth) Patch(typeof(FixCheckAuth));
+ if (MainConfig.Fix.ForceAsServer) Patch(typeof(ForceAsServer));
+ if (MainConfig.Fix.SkipCakeHashCheck) Patch(typeof(SkipCakeHashCheck));
+ if (MainConfig.Fix.SkipSpecialNumCheck) Patch(typeof(SkipSpecialNumCheck));
+ if (MainConfig.Fix.SkipVersionCheck) Patch(typeof(SkipVersionCheck));
+ if (MainConfig.Fix.RestoreCertificateValidation) Patch(typeof(RestoreCertificateValidation));
+ if (MainConfig.Fix.RewriteNoteJudgeTiming.Enable) Patch(typeof(RewriteNoteJudgeTiming));
+
+ //Cheat
+ if (MainConfig.Cheat.AutoPlay) Patch(typeof(AutoPlay));
+ if (MainConfig.Cheat.FastSkip) Patch(typeof(FastSkip));
+ if (MainConfig.Cheat.ChartController) Patch(typeof(ChartController));
+ if (MainConfig.Cheat.AllCollection) Patch(typeof(AllCollection));
+ if (MainConfig.Cheat.UnlockMusic) Patch(typeof(UnlockMusic));
+ if (MainConfig.Cheat.UnlockMaster) Patch(typeof(UnlockMaster));
+ if (MainConfig.Cheat.UnlockUtage.Enable) Patch(typeof(UnlockUtage));
+ if (MainConfig.Cheat.UnlockEvent) Patch(typeof(UnlockEvent));
+ if (MainConfig.Cheat.ResetLoginBonusRecord) Patch(typeof(ResetLoginBonusRecord));
+ if (MainConfig.Cheat.ForceCurrentIsBest) Patch(typeof(ForceCurrentIsBest));
+ if (MainConfig.Cheat.SetAllCharacterAsSameAndLock) Patch(typeof(SetAllCharacterAsSameAndLock));
+ if (MainConfig.Cheat.RewriteLoginBonusStamp.Enable) Patch(typeof(RewriteLoginBonusStamp));
+
+ // 默认加载项
+ Patch(typeof(PrintUserData));
+ Patch(typeof(InputManager));
+ Patch(typeof(GameMessageManager));
+
+ if(_isPatchFailed) PatchFailedWarn();
+ MelonLogger.Msg("Loading completed");
+ }
+ public override void OnApplicationQuit()
+ {
+ if (MainConfig.ModSetting.WebServer.Enable && _webServer.IsRunning()) _webServer.Stop();
+ }
+
+ public override void OnGUI()
+ {
+ _mainGUI.OnGUI();
+ if (MainConfig.Common.ShowFPS) ShowFPS.OnGUI();
+ if (MainConfig.ModSetting.ShowInfo) ShowVersionInfo.OnGUI();
+ }
+
+ private void OnLogMessageReceived(string condition, string stackTrace, LogType type)
+ {
+ string logString = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] [{type}] {condition}\n{stackTrace}";
+
+ if (MainConfig.Common.UnityLogger.Enable) File.AppendAllText(Path.Combine($"{BuildInfo.Name}/Unity.log"),logString + "\n");
+ if (MainConfig.Common.UnityLogger.Enable && MainConfig.Common.UnityLogger.PrintToConsole)
+ {
+ switch (type)
+ {
+ case LogType.Error:
+ case LogType.Exception:
+ MelonLogger.Error($"[UnityLogger] [{type}]: {condition}\n{stackTrace}");
+ break;
+ case LogType.Warning:
+ MelonLogger.Warning($"[UnityLogger] [{type}]: {condition}\n{stackTrace}");
+ break;
+ case LogType.Assert:
+ case LogType.Log:
+ default:
+ MelonLogger.Msg($"[UnityLogger] [{type}]: {condition}\n{stackTrace}");
+ break;
+ }
+ }
+ }
+
+ private static bool Patch(Type type, bool noLoggerPrint = false)
+ {
+ try
+ {
+ var enableGameVersion = type.GetCustomAttribute();
+ if (enableGameVersion != null && !enableGameVersion.ShouldEnable())
+ {
+ MelonLogger.Warning(
+ $"Patch: {type} skipped ,Game version need Min {enableGameVersion.MinGameVersion} Max {enableGameVersion.MaxGameVersion}");
+ return false;
+ }
+
+ if (!noLoggerPrint) MelonLogger.Msg($"> Patch: {type}");
+ HarmonyLib.Harmony.CreateAndPatchAll(type);
+ return true;
+ }
+ catch (Exception e)
+ {
+ MelonLogger.Error($"Patch: {type} failed.");
+ MelonLogger.Error(e.Message);
+ MelonLogger.Error(e.Source);
+ MelonLogger.Error(e.TargetSite);
+ MelonLogger.Error(e.InnerException);
+ MelonLogger.Error(e.StackTrace);
+ _isPatchFailed = true;
+ return false;
+ }
+ }
+
+ private static void PrintLogo()
+ {
+ MelonLogger.Msg("\n" +
+ "\r\n _____ _ __ ___ _ ___ _ __ " +
+ "\r\n / ___/(_)___ / |/ /___ _(_) / | __________(_)____/ /_" +
+ "\r\n \\__ \\/ / __ \\/ /|_/ / __ `/ /_____/ /| | / ___/ ___/ / ___/ __/" +
+ "\r\n ___/ / / / / / / / / /_/ / /_____/ ___ |(__ |__ ) (__ ) /_ " +
+ "\r\n/____/_/_/ /_/_/ /_/\\__,_/_/ /_/ |_/____/____/_/____/\\__/ " +
+ "\r\n " +
+ "\r\n=================================================================" +
+ $"\r\n Version: {BuildInfo.Version} ({BuildInfo.CommitHash}) Build Date: {BuildInfo.BuildDate}" +
+ $"\r\n Author: {BuildInfo.Author}");
+ MelonLogger.Warning("\n" +
+ "\r\n=================================================================" +
+ "\r\n这是一个作弊Mod,后果自负,Mod仅限测试使用,禁止用于其他操作!" +
+ "\r\nThis is a cheat mod. Use at your own risk!" +
+ "\r\n这是一个免费的开源Mod项目,禁止倒卖!" +
+ "\r\nThis is a free and open-source mod. Resale is strictly prohibited." +
+ "\r\n如果你花了钱买了这个Mod,那你很愚蠢。" +
+ "\r\nIf you paid for this mod, you are stupid." +
+ "\r\n================================================================="
+ );
+ }
+
+ private static void PatchFailedWarn()
+ {
+ MelonLogger.Warning("\r\n=================================================================" +
+ "\r\nFailed to patch some methods." +
+ "\r\nPlease ensure that you are using an unmodified version of Assembly-CSharp.dll with a version greater than 1.40.0," +
+ "\r\nas modifications or lower versions can cause function mismatches, preventing the required functions from being found." +
+ "\r\nCheck for conflicting mods, or enabled incompatible options." +
+ "\r\nIf you believe this is an error, please report the issue to the mod author." +
+ "\r\n=================================================================");
+ }
+ }
+ public class HarmonyLibPatch
+ {
+ [HarmonyPostfix]
+ [HarmonyPatch("HarmonyLib.PatchTools", "GetPatchMethod")]
+ public static void GetPatchMethod(ref MethodInfo __result)
+ {
+ if (__result != null)
+ {
+ var enableGameVersion = __result.GetCustomAttribute();
+ if (enableGameVersion != null && !enableGameVersion.ShouldEnable())
+ {
+#if DEBUG
+ MelonLogger.Warning($" Patch: {__result.ReflectedType}.{__result.Name} skipped, Game version need Min {enableGameVersion.MinGameVersion} Max {enableGameVersion.MaxGameVersion}");
+#endif
+ __result = null;
+ }
+ }
+ }
+
+ [HarmonyPostfix]
+ [HarmonyPatch("HarmonyLib.PatchTools", "GetPatchMethods")]
+ public static void GetPatchMethods(ref IList __result)
+ {
+ for (int i = 0; i < __result.Count; i++)
+ {
+ var harmonyMethod = Traverse.Create(__result[i]).Field("info").GetValue() as HarmonyMethod;
+ var method = harmonyMethod.method;
+ var enableGameVersion = method.GetCustomAttribute();
+ if (enableGameVersion != null && !enableGameVersion.ShouldEnable())
+ {
+#if DEBUG
+ MelonLogger.Warning($" Patch: {method.ReflectedType}.{method.Name} skipped, Game version need Min {enableGameVersion.MinGameVersion} Max {enableGameVersion.MaxGameVersion}");
+#endif
+ __result.RemoveAt(i);
+ i--;
+ }
+ }
+ }
+ }
+}
diff --git a/PostBuild.bat b/PostBuild.bat
new file mode 100644
index 0000000..0476426
--- /dev/null
+++ b/PostBuild.bat
@@ -0,0 +1,25 @@
+@echo off
+
+where git >nul 2>nul
+if errorlevel 1 (
+ echo Git is not installed. Using default commit hash.
+ set COMMIT_HASH="NOT SET"
+) else (
+ for /f "tokens=1" %%i in ('git rev-parse --short HEAD') do set COMMIT_HASH=%%i
+)
+
+for /f "usebackq delims=" %%t in (`powershell -Command "( Get-Date -Format 'yyyyMMddHHmmss')"`) do (
+ set TIMESTAMP=%%t
+)
+
+echo CommitHash="%COMMIT_HASH%"
+echo BuildDate="%TIMESTAMP%"
+
+copy /y ".\Sinmai-Assist.dll" "..\Out\Mods\"
+@REM copy /y ".\YamlDotNet.dll" "..\Out\UserLibs\"
+copy /y "..\config - zh_CN.yml" "..\Out\Sinmai-Assist\config.yml"
+@REM 7z a -tzip "..\PostBuilds\Sinmai-Assist_%COMMIT_HASH%_%TIMESTAMP%".zip "..\Out\*"
+@REM
+@REM set GamePath="G:\maimai\maimai2024\Package\"
+@REM copy /y ".\Sinmai-Assist.dll" "%GamePath%Mods\"
+@REM copy /y ".\YamlDotNet.dll" "%GamePath%UserLibs\"
\ No newline at end of file
diff --git a/README.md b/README.md
index af250ab..2646af9 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,69 @@
# Sinmai-Assist
+Mods for maimai DX (Sinmai.exe). Patch with MelonLoader.
+This is a cheat Mod, using by your own risk.
+
+> [!WARNING]
+> Please use MelonLoader version 0.6.4 or lower.
+> Higher versions will crash.
+
+## Feature
+- Cheat
+ - Auto Play
+ - Fast Skip
+ - Chart Controller
+ - Unlock Music
+ - Unlock Master
+ - Unlock Event
+ - Unlock Utage
+ - Force Unlock Double Player Utage
+ - Force Current ls Best
+ - Reset Login Bonus Record
+ - Set All Character As Same And Lock
+- Common
+ - Dummy Login
+ - Custom Camera ID
+ - Block Coin
+ - Custom Version Text
+ - Disable Mask
+ - Disable Background
+ - Forward Touch Region To Button
+ - Force Quick Retry
+ - Network Logger
+ - Print User Information
+ - Export User Data
+ - Quick Boot
+ - Show FPS
+ - Single Player Mode
+ - Skip Warning Screen
+ - Skip Fade
+ - Ignore Information
+ - Change Default Option
+ - Change Game Settings
+- Fix
+ - Disable Environment Check(For versions after 1.50)
+ - Disable Encryption
+ - Disable Ini Clear
+ - Disable Reboot
+ - Fix Check Auth
+ - Fix DebugInput
+ - Force As Server
+ - Restore Certificate Validation
+ - Rewrite Judge Timing
+ - Skip Version Check
+ - Skip Cake Hash Check
+ - Skip SpecialNum Check
+
+
+## Development
+
+1. Install [.NET Framework 4.7.2 Developer Pack](https://dotnet.microsoft.com/download/dotnet-framework/net472)
+2. Configure library. (tips: Please use SDGB version library)
+3. Build the solution.
+4. Copy `Sinmai-Assist.dll` to `Mods` folder.
+
+
+## Relevant Links
+
+* [MelonLoader Wiki](https://melonwiki.xyz/#/modders/quickstart)
+* [Harmony Docs](https://harmony.pardeike.net/articles/patching-prefix.html)
diff --git a/Sinmai-Assist.csproj b/Sinmai-Assist.csproj
new file mode 100644
index 0000000..ba7fb1d
--- /dev/null
+++ b/Sinmai-Assist.csproj
@@ -0,0 +1,672 @@
+
+
+
+
+ Release
+ AnyCPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}
+ Library
+ Properties
+ SinmaiAssist
+ Sinmai-Assist
+ v4.7.2
+ 512
+ true
+
+ 12
+
+
+
+
+ false
+ None
+ false
+ Output\
+
+
+ prompt
+ 1
+ true
+ false
+ false
+ x64
+ Auto
+
+
+ false
+
+
+ bin\Debug\
+ DEBUG
+ true
+ true
+ pdbonly
+ false
+
+
+ false
+
+
+ bin\ARM64\Release\
+ true
+ true
+ None
+ ARM64
+ 12
+ prompt
+ false
+
+
+ bin\ARM64\Debug\
+ DEBUG
+ true
+ true
+ pdbonly
+ ARM64
+ 12
+ false
+
+
+ bin\x64\Release\
+ true
+ false
+ None
+ x64
+ 12
+ prompt
+ false
+
+
+ bin\x64\Debug\
+ DEBUG
+ true
+ true
+ pdbonly
+ x64
+ 12
+ false
+
+
+
+ False
+ Libs\0Harmony.dll
+
+
+ Output\Accessibility.dll
+
+
+ ..\150\Sinmai_Data\Managed\AMDaemon.NET.dll
+
+
+ ..\150\Sinmai_Data\Managed\Assembly-CSharp.dll
+
+
+ ..\150\Sinmai_Data\Managed\Assembly-CSharp-firstpass.dll
+
+
+ ..\150\MelonLoader\net35\AssetRipper.VersionUtilities.dll
+
+
+ ..\150\MelonLoader\net35\AssetsTools.NET.dll
+
+
+ ..\150\MelonLoader\net35\bHapticsLib.dll
+
+
+ D:\game\SDGB2025\Package\Sinmai_Data\Managed\ChimeLib.NET.dll
+
+
+ Output\cscompmgd.dll
+
+
+ Output\CustomMarshalers.dll
+
+
+ ..\150\MelonLoader\net35\IndexRange.dll
+
+
+ False
+ ..\150\MelonLoader\net35\MelonLoader.dll
+
+
+ ..\150\MelonLoader\net35\MelonStartScreen.dll
+
+
+ Output\Microsoft.CSharp.dll
+
+
+ ..\150\MelonLoader\net35\Mono.Cecil.dll
+
+
+ ..\150\MelonLoader\net35\Mono.Cecil.Mdb.dll
+
+
+ ..\150\MelonLoader\net35\Mono.Cecil.Pdb.dll
+
+
+ ..\150\MelonLoader\net35\Mono.Cecil.Rocks.dll
+
+
+ ..\150\Sinmai_Data\Managed\Mono.Posix.dll
+
+
+ ..\150\Sinmai_Data\Managed\Mono.Security.dll
+
+
+ ..\150\MelonLoader\net35\MonoMod.RuntimeDetour.dll
+
+
+ ..\150\MelonLoader\net35\MonoMod.Utils.dll
+
+
+ ..\150\Sinmai_Data\Managed\mscorlib.dll
+
+
+ Output\SMDiagnostics.dll
+
+
+ ..\150\Sinmai_Data\Managed\System.dll
+
+
+ Output\System.ComponentModel.Composition.dll
+
+
+ Output\System.ComponentModel.DataAnnotations.dll
+
+
+ ..\150\Sinmai_Data\Managed\System.Configuration.dll
+
+
+ Output\System.Configuration.Install.dll
+
+
+ ..\150\Sinmai_Data\Managed\System.Core.dll
+
+
+ Output\System.Data.dll
+
+
+ Output\System.Data.DataSetExtensions.dll
+
+
+ Output\System.Data.Entity.dll
+
+
+ Output\System.Data.Linq.dll
+
+
+ Output\System.Data.OracleClient.dll
+
+
+ Output\System.Data.Services.dll
+
+
+ Output\System.Data.Services.Client.dll
+
+
+ Output\System.Design.dll
+
+
+ Output\System.DirectoryServices.dll
+
+
+ Output\System.DirectoryServices.Protocols.dll
+
+
+ ..\150\Sinmai_Data\Managed\System.Drawing.dll
+
+
+ Output\System.Drawing.Design.dll
+
+
+ Output\System.EnterpriseServices.dll
+
+
+ Output\System.IdentityModel.dll
+
+
+ Output\System.IdentityModel.Selectors.dll
+
+
+ Output\System.IO.Compression.dll
+
+
+ Output\System.IO.Compression.FileSystem.dll
+
+
+ Output\System.Management.dll
+
+
+ Output\System.Messaging.dll
+
+
+ Output\System.Net.dll
+
+
+ Output\System.Net.Http.dll
+
+
+ Output\System.Net.Http.WebRequest.dll
+
+
+ Output\System.Numerics.dll
+
+
+ Output\System.Reflection.Context.dll
+
+
+ Output\System.Runtime.Caching.dll
+
+
+ Output\System.Runtime.DurableInstancing.dll
+
+
+ Output\System.Runtime.Remoting.dll
+
+
+ Output\System.Runtime.Serialization.dll
+
+
+ Output\System.Runtime.Serialization.Formatters.Soap.dll
+
+
+ ..\150\Sinmai_Data\Managed\System.Security.dll
+
+
+ Output\System.ServiceModel.dll
+
+
+ Output\System.ServiceModel.Activation.dll
+
+
+ Output\System.ServiceModel.Discovery.dll
+
+
+ Output\System.ServiceModel.Internals.dll
+
+
+ Output\System.ServiceModel.Routing.dll
+
+
+ Output\System.ServiceModel.Web.dll
+
+
+ Output\System.ServiceProcess.dll
+
+
+ Output\System.Transactions.dll
+
+
+ Output\System.Web.dll
+
+
+ Output\System.Web.Abstractions.dll
+
+
+ Output\System.Web.ApplicationServices.dll
+
+
+ Output\System.Web.DynamicData.dll
+
+
+ Output\System.Web.Extensions.dll
+
+
+ Output\System.Web.Extensions.Design.dll
+
+
+ Output\System.Web.RegularExpressions.dll
+
+
+ Output\System.Web.Routing.dll
+
+
+ Output\System.Web.Services.dll
+
+
+ Output\System.Windows.Forms.dll
+
+
+ Output\System.Windows.Forms.DataVisualization.dll
+
+
+ Output\System.Xaml.dll
+
+
+ ..\150\Sinmai_Data\Managed\System.Xml.dll
+
+
+ Output\System.Xml.Linq.dll
+
+
+ ..\150\MelonLoader\net35\Tomlet.dll
+
+
+ ..\150\Sinmai_Data\Managed\Unity.Analytics.DataPrivacy.dll
+
+
+ ..\150\Sinmai_Data\Managed\Unity.TextMeshPro.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.AccessibilityModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.AIModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.AnimationModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.ARModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.AssetBundleModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.AudioModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.BaselibModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.ClothModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.ClusterInputModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.ClusterRendererModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.CoreModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.CrashReportingModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.DirectorModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.FileSystemHttpModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.GameCenterModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.GridModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.HotReloadModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.ImageConversionModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.IMGUIModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.InputModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.JSONSerializeModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.LocalizationModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.Networking.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.ParticleSystemModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.PerformanceReportingModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.Physics2DModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.PhysicsModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.ProfilerModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.ScreenCaptureModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.SharedInternalsModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.SpatialTracking.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.SpriteMaskModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.SpriteShapeModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.StreamingModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.StyleSheetsModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.SubstanceModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.TerrainModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.TerrainPhysicsModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.TextCoreModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.TextRenderingModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.TilemapModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.Timeline.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.TimelineModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.TLSModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UI.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UIElementsModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UIModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UmbraModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UNETModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UnityAnalyticsModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UnityConnectModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UnityTestProtocolModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UnityWebRequestModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.VehiclesModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.VFXModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.VideoModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.VRModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.WindModule.dll
+
+
+ ..\150\Sinmai_Data\Managed\UnityEngine.XRModule.dll
+
+
+ ..\150\MelonLoader\net35\ValueTupleBridge.dll
+
+
+ ..\150\MelonLoader\net35\WebSocketDotNet.dll
+
+
+ Output\WindowsBase.dll
+
+
+ ..\150\Sinmai_Data\Managed\zxing.unity.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.2
+
+
+ 6.9.2
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ 1.24.0
+
+
+ 13.0.3
+
+
+ 16.3.0
+
+
+
+
+
+
+
+ $(ProjectDir)PostBuild.bat
+
+
+ $(ProjectDir)BeforeBuild.bat
+
+
\ No newline at end of file
diff --git a/Sinmai-Assist.sln b/Sinmai-Assist.sln
new file mode 100644
index 0000000..ba567df
--- /dev/null
+++ b/Sinmai-Assist.sln
@@ -0,0 +1,37 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.6.33815.320
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sinmai-Assist", "Sinmai-Assist.csproj", "{788BC472-59F7-46F6-B760-65C18BA74389}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|ARM64 = Debug|ARM64
+ Debug|x64 = Debug|x64
+ Release|Any CPU = Release|Any CPU
+ Release|ARM64 = Release|ARM64
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|x64.Build.0 = Debug|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Release|Any CPU.Build.0 = Release|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Release|ARM64.ActiveCfg = Release|x64
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Release|ARM64.Build.0 = Release|x64
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Release|x64.ActiveCfg = Release|Any CPU
+ {788BC472-59F7-46F6-B760-65C18BA74389}.Release|x64.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {DDF15A6C-2A44-4EBE-BD85-F3EE61DCD8BF}
+ EndGlobalSection
+EndGlobal
diff --git a/config - zh_CN.yml b/config - zh_CN.yml
new file mode 100644
index 0000000..44632d2
--- /dev/null
+++ b/config - zh_CN.yml
@@ -0,0 +1,89 @@
+common:
+ autoBackupData: false # 自动备份玩家数据
+ infinityTimer: false # 无限计时器
+ infinityTimerLegacy: false # 无限计时器(传统方案)
+ disableMask: false # 禁用遮罩
+ disableBackground: false # 禁用背景
+ showFPS: false # 显示FPS
+ singlePlayer: # 单人模式
+ enable: false # 是否启用
+ hideSubMonitor: false # 隐藏副屏
+ forceQuickRetry: false # 强制开启Freedom模式的快速重试功能
+ forwardATouchRegionToButton: false # 将触摸区域的操作转发到按钮
+ skipFade: false # 跳过过场动画
+ skipWarningScreen: false # 跳过警告界面
+ quickBoot: false # 快速启动
+ blockCoin: false # 禁用点数消耗
+ ignoreAnyGameInformation: false # 忽略之后所有的游戏公告信息提示
+ changeDefaultOption: false # 覆写游客模式默认设置
+ changeFadeStyle: false # 切换过场动画的样式(例如BUDDiES开启此选项后会使用BUDDiES PLUS的过场动画,BUDDiES PLUS开启此选项后会使用BUDDiES的过场动画)
+ networkLogger: # 网络日志
+ enable: false # 是否启用
+ printToConsole: false # 是否输出到控制台
+ customVersionText: # 自定义版本文本
+ enable: false # 是否启用
+ versionText: "" # 版本文本
+ dummyLogin: # 虚拟登录
+ enable: false # 是否启用
+ defaultUserId: 0 # 默认用户ID
+ customCameraId: # 自定义摄像头ID
+ enable: false # 是否启用
+ chimeCameraId: 0 # Chime摄像头ID
+ leftQrCameraId: 0 # 左侧二维码识别摄像头ID
+ rightQrCameraId: 0 # 右侧二维码识别摄像头ID
+ photoCameraId: 0 # 玩家摄像头ID
+ changeGameSettings: # 覆盖游戏的设置
+ enable: false # 是否启用
+ codeRead: false # 是否启用二维码识别(DX Pass)
+ iconPhoto: false # 是否启用拍摄头像功能
+ uploadPhoto: false # 是否启用拍摄纪念照上传
+ charaSelect: false # 是否启用角色选择界面
+
+cheat:
+ autoPlay: false # 自动游玩
+ fastSkip: false # 快速跳过
+ chartController: false # 铺面控制器(歌曲进度控制)
+ allCollection: false # 解锁全部收藏品
+ unlockEvent: false # 解锁全部活动
+ unlockMusic: false # 解锁全部歌曲
+ unlockMaster: false # 解锁全部歌曲Master和ReMaster难度
+ unlockUtage: # 解锁宴会场
+ enable: false # 是否启用
+ unlockDoublePlayerMusic: false # 强制解锁宴会场双人模式歌曲
+ saveUnlockMusic: false # 保存unlockMusic解锁的歌曲到用户存档
+ saveUnlockMaster: false # 保存unlockMaster解锁的歌曲难度到用户存档
+ resetLoginBonusRecord: false # 重置登录奖励记录
+ forceCurrentIsBest: false # 强制当前游玩成绩为新成绩(可能会对Best50造成改动)
+ setAllCharacterAsSameAndLock: false # 允许你设置5个相同的旅行伙伴并锁定设置(以队长为准)
+ rewriteLoginBonusStamp: # 重写每日登录奖励记录
+ enable: false # 是否启用
+ point: 0 # 登录奖励点数
+
+fix:
+ disableEnvironmentCheck: false # 禁用运行环境检查
+ disableEncryption: false # 禁用加密
+ disableReboot: false # 禁用自动重启
+ disableIniClear: false # 禁止程序清除ini配置文件文件
+ fixDebugInput: false # 修复DebugInput
+ fixCheckAuth: false # 修复CheckAuth
+ forceAsServer: false # 强制以服务器模式运行
+ skipCakeHashCheck: false # 跳过Cake.dll Hash检查
+ skipSpecialNumCheck: false # 跳过特殊数字检查
+ skipVersionCheck: false # 登录时跳过版本检查
+ restoreCertificateValidation: false # 恢复证书验证
+ rewriteNoteJudgeTiming: # 重写覆盖游戏音符判定 (如填10,则游戏内+1.0)
+ enable: false # 是否启用
+ adjustTiming: 0.0 # 音频延迟(单位:ms)
+ judgeTiming: 0.0 # 判定延迟(单位:帧)
+
+modSetting:
+ safeMode: false # 启用安全模式
+ showInfo: false # 显示信息
+ showPanel: false # 显示面板
+ logUnity: false # 显示Unity日志到控制台
+ webServer: # Web服务
+ enable: false # 是否启用
+ host: "0.0.0.0" # 地址
+ port: 8080 # 端口
+ token: "" # token
+ printDebugLog: false # 输出调试日志
diff --git a/config.yml b/config.yml
new file mode 100644
index 0000000..89405da
--- /dev/null
+++ b/config.yml
@@ -0,0 +1,89 @@
+common:
+ autoBackupData: false
+ infinityTimer: false
+ infinityTimerLegacy: false
+ disableMask: false
+ disableBackground: false
+ showFPS: false
+ singlePlayer:
+ enable: false
+ hideSubMonitor: false
+ forceQuickRetry: false
+ forwardATouchRegionToButton: false
+ skipFade: false
+ skipWarningScreen: false
+ quickBoot: false
+ blockCoin: false
+ ignoreAnyGameInformation: false
+ changeDefaultOption: false
+ changeFadeStyle: false
+ networkLogger:
+ enable: false
+ printToConsole: false
+ customVersionText:
+ enable: false
+ versionText: ""
+ dummyLogin:
+ enable: false
+ defaultUserId: 0
+ customCameraId:
+ enable: false
+ chimeCameraId: 0
+ leftQrCameraId: 0
+ rightQrCameraId: 0
+ photoCameraId: 0
+ changeGameSettings:
+ enable: false
+ codeRead: false
+ iconPhoto: false
+ uploadPhoto: false
+ charaSelect: false
+
+cheat:
+ autoPlay: false
+ fastSkip: false
+ chartController: false
+ allCollection: false
+ unlockEvent: false
+ unlockMusic: false
+ unlockMaster: false
+ unlockUtage:
+ enable: false
+ unlockDoublePlayerMusic: false
+ saveUnlockMusic: false
+ saveUnlockMaster: false
+ resetLoginBonusRecord: false
+ forceCurrentIsBest: false
+ setAllCharacterAsSameAndLock: false
+ rewriteLoginBonusStamp:
+ enable: false
+ point: 0
+
+fix:
+ disableEnvironmentCheck: false
+ disableEncryption: false
+ disableReboot: false
+ disableIniClear: false
+ fixDebugInput: false
+ fixCheckAuth: false
+ forceAsServer: false
+ skipCakeHashCheck: false
+ skipSpecialNumCheck: false
+ skipVersionCheck: false
+ restoreCertificateValidation: false
+ rewriteNoteJudgeTiming:
+ enable: false
+ adjustTiming: 0.0
+ judgeTiming: 0.0
+
+modSetting:
+ safeMode: false
+ showInfo: false
+ showPanel: false
+ logUnity: false
+ webServer:
+ enable: false
+ host: "0.0.0.0"
+ port: 8080
+ token: ""
+ printDebugLog: false
diff --git a/packages.config b/packages.config
new file mode 100644
index 0000000..2b5a9a3
--- /dev/null
+++ b/packages.config
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file