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 local game root")] [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.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("6.0.0.0")] [module: UnverifiableCode] [BepInPlugin("whiteline7.rpkp_translation_patcher", "RPKP_Translation_Patcher", "6.0.0")] public class RPKP_Translation_Patcher : BaseUnityPlugin { private enum ActiveProtocol { Install, Delete, None } private ConfigEntry cfg_ActiveProtocol; private static readonly string[] TargetFiles = new string[3] { "Game.tsv", "HUD.tsv", "Menu.tsv" }; private void Awake() { cfg_ActiveProtocol = ((BaseUnityPlugin)this).Config.Bind("General", "Active Protocol", ActiveProtocol.Install, "Install: 번역본을 로컬 파일 위치에 설치합니다. 한번 설치되면 바닐라에서 실행하여도 게임은 한글로 실행됩니다.\nDelete: 설치된 번역본을 제거합니다. 게임을 영어로 되돌리려면 반드시 이를 사용하여 번역본을 제거해야 합니다.(가능하다면 직접 하셔도 됩니다)\nNone: 플러그인을 비활성화합니다. 아무것도 하지 않습니다."); if (cfg_ActiveProtocol.Value == ActiveProtocol.None) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Active Protocol이 None이므로 작동하지 않습니다."); return; } try { if (cfg_ActiveProtocol.Value == ActiveProtocol.Install) { CopyLocalizationFiles(); } else if (cfg_ActiveProtocol.Value == ActiveProtocol.Delete) { DeleteLocalizationFiles(); } } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.LogError((object)$"RPKP_Translation_Patcher Error: {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)); } } }