Decompiled source of KFontPatcher v1.0.2

plugins/KFontPatcher.dll

Decompiled 9 months ago
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("KFontPatcher")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("KFontPatcher")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("93d10828-2361-4866-8bc0-d1839e945127")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
[BepInPlugin("Whiteline.kfontpatcher", "KFontPatcher", "1.0.2")]
public class KFontPatcher : BaseUnityPlugin
{
	private ConfigEntry<string> cfg_SourceFileName;

	private ConfigEntry<bool> cfg_OverwriteIfDifferent;

	private ConfigEntry<bool> cfg_AttemptEmbedExtraction;

	private void Awake()
	{
		cfg_SourceFileName = ((BaseUnityPlugin)this).Config.Bind<string>("Dev", "SourceFileName", "Kfont", "패처 DLL과 같은 폴더에 있는 에셋/폰트 파일명(확장자 없이 사용 가능). 예: Kfont");
		cfg_OverwriteIfDifferent = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "OverwriteIfDifferent", true, "이미 대상 파일이 있을 때 덮어쓸지 여부");
		cfg_AttemptEmbedExtraction = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AttemptEmbedExtraction", true, "DLL 내부 임베디드 리소스를 추출 시도할지 여부");
		try
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"KFontPatcher: 폰트 자동 설정을 시작합니다");
			CopyBundleToTarget();
		}
		catch (Exception arg)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)$"KFontPatcher 예외: {arg}");
		}
	}

	private void CopyBundleToTarget()
	{
		string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
		string text = cfg_SourceFileName.Value ?? "Kfont";
		string text2 = FindSourceFile(directoryName, text);
		if (text2 == null && cfg_AttemptEmbedExtraction.Value)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)("폰트 파일을 찾을 수 없음: '" + text + "'. 임베디드 리소스 추출 시도..."));
			if (TryExtractEmbeddedResourceAny(directoryName, text))
			{
				text2 = FindSourceFile(directoryName, text);
				((BaseUnityPlugin)this).Logger.LogInfo((object)"임베디드 리소스에서 파일을 추출했습니다.");
			}
		}
		if (text2 == null)
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)("최종적으로도 소스 파일을 찾지 못함: " + text + " (DLL과 같은 폴더에 있어야 함)"));
			return;
		}
		string directoryName2 = Path.GetDirectoryName(Application.dataPath);
		if (string.IsNullOrEmpty(directoryName2))
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"게임 루트를 찾을 수 없음. Application.dataPath 확인 필요.");
			return;
		}
		string text3 = Path.Combine(directoryName2, "RPKP폰트", "FontBundles");
		string text4 = Path.Combine(text3, Path.GetFileName(text2));
		try
		{
			if (!Directory.Exists(text3))
			{
				Directory.CreateDirectory(text3);
				((BaseUnityPlugin)this).Logger.LogInfo((object)("대상 폴더가 스팀 로컬파일에 존재하지 않습니다, 폴더를 새로 생성합니다: " + text3));
			}
		}
		catch (Exception arg)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)$"대상 디렉토리 생성 실패: {text3}. 예외: {arg}");
			return;
		}
		bool flag = true;
		if (File.Exists(text4))
		{
			if (!cfg_OverwriteIfDifferent.Value)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)("대상 파일이 이미 있으며 OverwriteIfDifferent 설정이 False 이므로 복사를 생략합니다: " + text4));
				return;
			}
			FileInfo fileInfo = new FileInfo(text2);
			FileInfo fileInfo2 = new FileInfo(text4);
			if (fileInfo.Length == fileInfo2.Length)
			{
				flag = false;
				((BaseUnityPlugin)this).Logger.LogInfo((object)("출처와 대상 파일의 크기가 동일합니다. 덮어쓰지 않습니다: " + text4));
			}
		}
		if (!flag)
		{
			return;
		}
		try
		{
			File.Copy(text2, text4, overwrite: true);
			((BaseUnityPlugin)this).Logger.LogInfo((object)("에셋/폰트 파일을 성공적으로 복사했습니다! " + text2 + " -> " + text4));
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"폰트가 이제 막 적용되었습니다!!! 안정적인 적용을 위해 게임을 재시작하세요!!!\r\n재시작하지 않으면 글자의 크기나 위치가 잘못 배치됩니다!!!");
		}
		catch (Exception arg2)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)$"파일 복사 실패: {arg2}");
		}
	}

	private string FindSourceFile(string asmDir, string sourceName)
	{
		string text = Path.Combine(asmDir, sourceName);
		if (File.Exists(text))
		{
			return text;
		}
		string[] array = (from f in Directory.GetFiles(asmDir)
			where string.Equals(Path.GetFileNameWithoutExtension(f), sourceName, StringComparison.OrdinalIgnoreCase)
			select f).ToArray();
		if (array.Length != 0)
		{
			return array[0];
		}
		return null;
	}

	private bool TryExtractEmbeddedResourceAny(string outputDir, string fileNameWithoutExt)
	{
		Assembly executingAssembly = Assembly.GetExecutingAssembly();
		string[] manifestResourceNames = executingAssembly.GetManifestResourceNames();
		if (manifestResourceNames == null || manifestResourceNames.Length == 0)
		{
			return false;
		}
		string[] array = manifestResourceNames.Where((string r) => Path.GetFileNameWithoutExtension(r).Equals(fileNameWithoutExt, StringComparison.OrdinalIgnoreCase)).ToArray();
		if (array.Length == 0)
		{
			return false;
		}
		try
		{
			string text = array[0];
			using (Stream stream = executingAssembly.GetManifestResourceStream(text))
			{
				if (stream == null)
				{
					return false;
				}
				using FileStream destination = new FileStream(Path.Combine(outputDir, Path.GetFileName(text)), FileMode.Create, FileAccess.Write);
				stream.CopyTo(destination);
			}
			return true;
		}
		catch (Exception arg)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)$"임베디드 리소스 추출 실패: {arg}");
			return false;
		}
	}
}