Decompiled source of FruitTreeIgnoreSeason v1.0.0

BepInEx/plugins/FruitTreeIgnoreSeason.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using FruitTreeIgnoreSeason.Localization;
using HarmonyLib;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("FruitTreeIgnoreSeason")]
[assembly: AssemblyDescription("FruitTreeIgnoreSeason mod for Old Market Simulator by Ice Box Studio")]
[assembly: AssemblyCompany("Ice Box Studio")]
[assembly: AssemblyProduct("FruitTreeIgnoreSeason")]
[assembly: AssemblyCopyright("Copyright © 2025 Ice Box Studio")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("A3C8F8F1-9B0E-4B8E-9FAB-347D0B6D5231")]
[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")]
namespace FruitTreeIgnoreSeason
{
	[BepInPlugin("IceBoxStudio.FruitTreeIgnoreSeason", "FruitTreeIgnoreSeason", "1.0.0")]
	public class FruitTreeIgnoreSeason : BaseUnityPlugin
	{
		private static FruitTreeIgnoreSeason _instance;

		private Harmony _harmony;

		private bool patchesApplied;

		public static FruitTreeIgnoreSeason Instance => _instance;

		internal static ManualLogSource Logger { get; private set; }

		private void Awake()
		{
			_instance = this;
			Logger = ((BaseUnityPlugin)this).Logger;
			try
			{
				Logger.LogInfo((object)"=============================================");
				Logger.LogInfo((object)("FruitTreeIgnoreSeason " + LocalizationManager.Instance.GetLocalizedText("plugin.initializing")));
				Logger.LogInfo((object)(LocalizationManager.Instance.GetLocalizedText("plugin.author_prefix") + "Ice Box Studio(https://steamcommunity.com/id/ibox666/)"));
				ApplyPatches();
				Logger.LogInfo((object)("FruitTreeIgnoreSeason " + LocalizationManager.Instance.GetLocalizedText("plugin.initialized")));
				Logger.LogInfo((object)"=============================================");
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("FruitTreeIgnoreSeason 初始化错误: " + ex.Message + "\n" + ex.StackTrace));
			}
		}

		private void ApplyPatches()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (!patchesApplied)
			{
				try
				{
					_harmony = new Harmony("IceBoxStudio.FruitTreeIgnoreSeason");
					_harmony.PatchAll();
					patchesApplied = true;
					return;
				}
				catch (Exception ex)
				{
					Logger.LogError((object)("FruitTreeIgnoreSeason 应用补丁错误: " + ex.Message + "\n" + ex.StackTrace));
					return;
				}
			}
			Logger.LogInfo((object)LocalizationManager.Instance.GetLocalizedText("plugin.patches_skipped"));
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "IceBoxStudio.FruitTreeIgnoreSeason";

		public const string PLUGIN_NAME = "FruitTreeIgnoreSeason";

		public const string PLUGIN_VERSION = "1.0.0";

		public const string PLUGIN_AUTHOR = "Ice Box Studio";

		public const string PLUGIN_DESCRIPTION = "让果树忽略季节进行生长和结果。";
	}
}
namespace FruitTreeIgnoreSeason.Patches
{
	[HarmonyPatch(typeof(BlockTree))]
	public static class FruitTreeSeasonPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("OnDayChanged")]
		private static bool OnDayChanged_Prefix(BlockTree __instance, NetworkVariable<bool> ___isWatered, NetworkVariable<int> ___dayCounter, TreeSO ___treeSO, int ___beeSpawnChance)
		{
			if (!((NetworkBehaviour)__instance).IsServer)
			{
				return false;
			}
			if (((NetworkBehaviour)__instance).IsServer && ___isWatered.Value)
			{
				int value = ___dayCounter.Value;
				___dayCounter.Value = value + 1;
			}
			___isWatered.Value = false;
			if (Random.Range(0f, 100f) <= (float)___beeSpawnChance && ___dayCounter.Value >= ___treeSO.daysToFullGrowth)
			{
				AccessTools.Method(typeof(BlockTree), "SpawnBeeHive", (Type[])null, (Type[])null)?.Invoke(__instance, null);
			}
			return false;
		}
	}
}
namespace FruitTreeIgnoreSeason.Localization
{
	public static class LocalizationHelper
	{
		public static Dictionary<string, string> GetDefaultTranslations(string language)
		{
			Dictionary<string, string> dictionary = new Dictionary<string, string>();
			switch (language)
			{
			case "zh":
				dictionary.Add("plugin.initializing", "开始初始化...");
				dictionary.Add("plugin.author_prefix", "作者:");
				dictionary.Add("plugin.initialized", "初始化成功!");
				dictionary.Add("plugin.patches_skipped", "补丁已应用,跳过...");
				dictionary.Add("plugin.language_fallback", "不支持的语言 {0},使用英语作为备用。");
				break;
			case "zh-Hant":
				dictionary.Add("plugin.initializing", "開始初始化...");
				dictionary.Add("plugin.author_prefix", "作者:");
				dictionary.Add("plugin.initialized", "初始化成功!");
				dictionary.Add("plugin.patches_skipped", "補丁已應用,跳過...");
				dictionary.Add("plugin.language_fallback", "不支持的語言 {0},使用英語作為備用。");
				break;
			case "en":
				dictionary.Add("plugin.initializing", "is initializing...");
				dictionary.Add("plugin.author_prefix", "Author: ");
				dictionary.Add("plugin.initialized", "initialized successfully!");
				dictionary.Add("plugin.patches_skipped", "Patches already applied, skipping...");
				dictionary.Add("plugin.language_fallback", "Unsupported language {0}, using English as fallback.");
				break;
			case "fr":
				dictionary.Add("plugin.initializing", "initialisation...");
				dictionary.Add("plugin.author_prefix", "Auteur : ");
				dictionary.Add("plugin.initialized", "initialisé avec succès !");
				dictionary.Add("plugin.patches_skipped", "Correctifs déjà appliqués, ignoré...");
				dictionary.Add("plugin.language_fallback", "Langue non supportée {0}, utilisation de l'anglais par défaut.");
				break;
			case "de":
				dictionary.Add("plugin.initializing", "wird initialisiert...");
				dictionary.Add("plugin.author_prefix", "Autor: ");
				dictionary.Add("plugin.initialized", "erfolgreich initialisiert!");
				dictionary.Add("plugin.patches_skipped", "Patches bereits angewendet, überspringe...");
				dictionary.Add("plugin.language_fallback", "Nicht unterstützte Sprache {0}, verwende Englisch als Fallback.");
				break;
			case "ja":
				dictionary.Add("plugin.initializing", "初期化中...");
				dictionary.Add("plugin.author_prefix", "作者:");
				dictionary.Add("plugin.initialized", "初期化に成功しました!");
				dictionary.Add("plugin.patches_skipped", "パッチは既に適用されています。スキップします...");
				dictionary.Add("plugin.language_fallback", "サポートされていない言語 {0} です。フォールバックとして英語を使用します。");
				break;
			case "ko":
				dictionary.Add("plugin.initializing", "초기화 중...");
				dictionary.Add("plugin.author_prefix", "작성자: ");
				dictionary.Add("plugin.initialized", "초기화 성공!");
				dictionary.Add("plugin.patches_skipped", "패치가 이미 적용되었습니다. 건너뛰는 중...");
				dictionary.Add("plugin.language_fallback", "지원되지 않는 언어 {0}, 영어를 기본값으로 사용합니다.");
				break;
			case "pt":
				dictionary.Add("plugin.initializing", "inicializando...");
				dictionary.Add("plugin.author_prefix", "Autor: ");
				dictionary.Add("plugin.initialized", "inicializado com sucesso!");
				dictionary.Add("plugin.patches_skipped", "Patches já aplicados, pulando...");
				dictionary.Add("plugin.language_fallback", "Idioma não suportado {0}, usando inglês como fallback.");
				break;
			case "ru":
				dictionary.Add("plugin.initializing", "инициализация...");
				dictionary.Add("plugin.author_prefix", "Автор: ");
				dictionary.Add("plugin.initialized", "инициализация прошла успешно!");
				dictionary.Add("plugin.patches_skipped", "Патчи уже применены, пропуск...");
				dictionary.Add("plugin.language_fallback", "Неподдерживаемый язык {0}, используется английский язык.");
				break;
			case "es":
				dictionary.Add("plugin.initializing", "inicializando...");
				dictionary.Add("plugin.author_prefix", "Autor: ");
				dictionary.Add("plugin.initialized", "¡inicializado con éxito!");
				dictionary.Add("plugin.patches_skipped", "Parches ya aplicados, omitiendo...");
				dictionary.Add("plugin.language_fallback", "Idioma no soportado {0}, usando inglés como alternativa.");
				break;
			case "tr":
				dictionary.Add("plugin.initializing", "başlatılıyor...");
				dictionary.Add("plugin.author_prefix", "Yazar: ");
				dictionary.Add("plugin.initialized", "başarıyla başlatıldı!");
				dictionary.Add("plugin.patches_skipped", "Yamalar zaten uygulandı, atlanıyor...");
				dictionary.Add("plugin.language_fallback", "Desteklenmeyen dil {0}, yedek olarak İngilizce kullanılıyor.");
				break;
			case "uk":
				dictionary.Add("plugin.initializing", "ініціалізація...");
				dictionary.Add("plugin.author_prefix", "Автор: ");
				dictionary.Add("plugin.initialized", "ініціалізація пройшла успішно!");
				dictionary.Add("plugin.patches_skipped", "Патчі вже застосовані, пропуск...");
				dictionary.Add("plugin.language_fallback", "Непідтримувана мова {0}, використовується англійська мова.");
				break;
			}
			return dictionary;
		}
	}
	public class LocalizationManager
	{
		private static LocalizationManager _instance;

		private readonly Dictionary<string, Dictionary<string, string>> _localizations = new Dictionary<string, Dictionary<string, string>>();

		private string _currentLocale = "zh";

		public static readonly string[] SupportedLanguages = new string[12]
		{
			"zh", "zh-Hant", "en", "fr", "de", "ja", "ko", "pt", "ru", "es",
			"tr", "uk"
		};

		public static LocalizationManager Instance => _instance ?? (_instance = new LocalizationManager());

		private LocalizationManager()
		{
			Initialize();
		}

		public void Initialize()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)LocalizationSettings.SelectedLocale != (Object)null)
			{
				LocaleIdentifier identifier = LocalizationSettings.SelectedLocale.Identifier;
				_currentLocale = ((LocaleIdentifier)(ref identifier)).Code;
			}
			string[] supportedLanguages = SupportedLanguages;
			foreach (string text in supportedLanguages)
			{
				Dictionary<string, string> defaultTranslations = LocalizationHelper.GetDefaultTranslations(text);
				if (defaultTranslations != null && defaultTranslations.Count > 0)
				{
					_localizations[text] = defaultTranslations;
				}
			}
			LocalizationSettings.SelectedLocaleChanged += OnGameLanguageChanged;
		}

		private void OnGameLanguageChanged(Locale locale)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)locale != (Object)null)
			{
				LocaleIdentifier identifier = locale.Identifier;
				string code = ((LocaleIdentifier)(ref identifier)).Code;
				if (_localizations.ContainsKey(code))
				{
					_currentLocale = code;
					return;
				}
				_currentLocale = "en";
				FruitTreeIgnoreSeason.Logger.LogInfo((object)GetLocalizedText("plugin.language_fallback", code));
			}
		}

		public string GetLocalizedText(string key, params object[] args)
		{
			if (string.IsNullOrEmpty(_currentLocale) || !_localizations.ContainsKey(_currentLocale))
			{
				_currentLocale = "en";
			}
			if (_localizations.ContainsKey(_currentLocale) && _localizations[_currentLocale].TryGetValue(key, out var value))
			{
				if (args.Length == 0)
				{
					return value;
				}
				return string.Format(value, args);
			}
			if (_currentLocale != "en" && _localizations.ContainsKey("en") && _localizations["en"].TryGetValue(key, out var value2))
			{
				if (args.Length == 0)
				{
					return value2;
				}
				return string.Format(value2, args);
			}
			if (_localizations.ContainsKey("zh") && _localizations["zh"].TryGetValue(key, out var value3))
			{
				if (args.Length == 0)
				{
					return value3;
				}
				return string.Format(value3, args);
			}
			return key;
		}
	}
}