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;
}
}
}