using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("RPKP_Translation_Patcher")] [assembly: AssemblyDescription("install the translation files to game Localizations folder")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("RPKP_Translation_Patcher")] [assembly: AssemblyCopyright("© 2025 whiteline7. All rights reserved")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("c11d5261-0297-408e-9daf-7e1efa0a779a")] [assembly: AssemblyFileVersion("6.2.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("6.2.0.0")] [module: UnverifiableCode] [BepInPlugin("whiteline7.rpkp_translation_patcher", "RPKP_Translation_Patcher", "6.0.0")] public class RPKP_Translation_Patcher : BaseUnityPlugin { private ConfigEntry cfg_DeleteProtocol; private static readonly string[] TargetFiles = new string[3] { "Game.tsv", "HUD.tsv", "Menu.tsv" }; private bool _installedThisSession; private bool _cleanedUp; private void Awake() { cfg_DeleteProtocol = ((BaseUnityPlugin)this).Config.Bind("General", "DeleteProtocol", true, "true: 게임을 종료하면 설치한 번역 파일을 제거합니다.\nfalse: 게임을 종료해도 번역 파일을 남깁니다. 이러면 스팀에서 게임을 실행해도 대부분이 한글로 나옵니다."); try { CopyLocalizationFiles(); _installedThisSession = true; AppDomain.CurrentDomain.ProcessExit += OnProcessExit; } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.LogError((object)$"RPKP_Translation_Patcher Error: {arg}"); } } private void OnApplicationQuit() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[RPKP] OnApplicationQuit 감지됨."); CleanupOnExit(); } private void OnProcessExit(object sender, EventArgs e) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[RPKP] AppDomain.ProcessExit 감지됨."); CleanupOnExit(); } private void CleanupOnExit() { if (_cleanedUp || !_installedThisSession) { return; } _cleanedUp = true; if (!cfg_DeleteProtocol.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"DeleteProtocol이 false이므로 번역 파일을 남겨둡니다."); return; } try { DeleteLocalizationFiles(); } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.LogError((object)$"RPKP_Translation_Patcher 종료 정리 중 오류: {arg}"); } } private void CopyLocalizationFiles() { string location = Assembly.GetExecutingAssembly().Location; if (string.IsNullOrEmpty(location)) { ((BaseUnityPlugin)this).Logger.LogError((object)"어셈블리 위치를 가져올 수 없습니다."); return; } string directoryName = Path.GetDirectoryName(location); if (string.IsNullOrEmpty(directoryName)) { ((BaseUnityPlugin)this).Logger.LogError((object)"어셈블리 디렉토리를 가져올 수 없습니다."); return; } string dataPath = Application.dataPath; if (string.IsNullOrEmpty(dataPath)) { ((BaseUnityPlugin)this).Logger.LogError((object)"Application.dataPath 가 비어 있습니다."); return; } string directoryName2 = Path.GetDirectoryName(dataPath); if (string.IsNullOrEmpty(directoryName2)) { ((BaseUnityPlugin)this).Logger.LogError((object)"게임 루트를 찾을 수 없습니다."); return; } string text = Path.Combine(directoryName2, "REPO_Data", "StreamingAssets", "Localizations"); Directory.CreateDirectory(text); string[] targetFiles = TargetFiles; foreach (string text2 in targetFiles) { string text3 = Path.Combine(directoryName, text2); string destFileName = Path.Combine(text, text2); if (!File.Exists(text3)) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("파일을 찾지 못했습니다: " + text2)); continue; } File.Copy(text3, destFileName, overwrite: true); ((BaseUnityPlugin)this).Logger.LogInfo((object)("설치 완료: " + text2)); } } private void DeleteLocalizationFiles() { string dataPath = Application.dataPath; if (string.IsNullOrEmpty(dataPath)) { ((BaseUnityPlugin)this).Logger.LogError((object)"Application.dataPath 가 비어 있습니다."); return; } string directoryName = Path.GetDirectoryName(dataPath); if (string.IsNullOrEmpty(directoryName)) { ((BaseUnityPlugin)this).Logger.LogError((object)"게임 루트를 찾을 수 없습니다."); return; } string path = Path.Combine(directoryName, "REPO_Data", "StreamingAssets", "Localizations"); string[] targetFiles = TargetFiles; foreach (string text in targetFiles) { string path2 = Path.Combine(path, text); if (!File.Exists(path2)) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("제거할 파일이 없습니다: " + text)); continue; } File.Delete(path2); ((BaseUnityPlugin)this).Logger.LogInfo((object)("제거 완료: " + text)); } } }