Decompiled source of CurrencyAsToken v1.0.0

Zichen-CurrencyAsToken-1.0.0.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("Zichen-CurrencyAsToken-1.0.0")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+dff5f013f23b0205a5fe7be5bc4fa74a5d2c84c3")]
[assembly: AssemblyProduct("Zichen-CurrencyAsToken-1.0.0")]
[assembly: AssemblyTitle("Zichen-CurrencyAsToken-1.0.0")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public enum DisplayLanguage
{
	中文,
	English
}
namespace Zichen_CurrencyAsToken
{
	[BepInPlugin("zichen.currencyastoken", "CurrencyAsToken", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		public const string PluginGuid = "zichen.currencyastoken";

		public const string PluginName = "CurrencyAsToken";

		public const string PluginVersion = "1.0.0";

		public static Plugin Instance;

		private Harmony harmony;

		private static ConfigEntry<bool> _cfgModEnabled;

		private static ConfigEntry<DisplayLanguage> _cfgDisplayLanguage;

		private static ConfigEntry<int> _cfgBaseCost;

		private static ConfigEntry<int> _cfgCostIncrement;

		private static ConfigEntry<int> _cfgMaxCost;

		private static ConfigEntry<int> _cfgCommonWeight;

		private static ConfigEntry<int> _cfgUncommonWeight;

		private static ConfigEntry<int> _cfgRareWeight;

		private static ConfigEntry<int> _cfgUltraRareWeight;

		private const int CurrencyPullRarityMarker = 1000;

		private static int _currencyPullPlayerViewId = -1;

		private static float _currencyPullPlayerExpireTime;

		private static string _lastSyncedHostSettingsSignature = string.Empty;

		private const string PullCountDictKey = "zichenCurrencyAsTokenPullCount";

		private static Dictionary<string, int> pullCountDict = new Dictionary<string, int>();

		private const string RoomPropEnabled = "zct_enabled";

		private const string RoomPropLanguage = "zct_lang";

		private const string RoomPropBaseCost = "zct_base";

		private const string RoomPropCostIncrement = "zct_inc";

		private const string RoomPropMaxCost = "zct_max";

		private const string RoomPropCommonWeight = "zct_common";

		private const string RoomPropUncommonWeight = "zct_uncommon";

		private const string RoomPropRareWeight = "zct_rare";

		private const string RoomPropUltraRareWeight = "zct_ultra";

		private const string RoomPropPullCount = "zct_pullcount";

		private static readonly FieldInfo CosmeticTokensField = AccessTools.Field(typeof(MetaManager), "cosmeticTokens");

		private static readonly FieldInfo InfoTextTriggerActiveField = AccessTools.Field(typeof(InfoTextTrigger), "active");

		private static readonly FieldInfo DodField = AccessTools.Field(typeof(StatsManager), "dictionaryOfDictionaries");

		private static readonly MethodInfo SaveFileSaveMethod = AccessTools.Method(typeof(StatsManager), "SaveFileSave", (Type[])null, (Type[])null);

		private static readonly MethodInfo InteractSetMethod = AccessTools.Method(typeof(CosmeticShopMachine), "InteractSet", (Type[])null, (Type[])null);

		private const float PullInteractDistance = 3f;

		public static bool IsStaticModEnabled()
		{
			if (_cfgModEnabled != null)
			{
				return _cfgModEnabled.Value;
			}
			return false;
		}

		private void Awake()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			Instance = this;
			DetachFromManager();
			ResetConfigIfVersionChanged();
			BindConfig();
			harmony = new Harmony("zichen.currencyastoken");
			ApplyHarmonyPatches();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"CurrencyAsToken v1.0.0 loaded.");
		}

		private void Update()
		{
			SyncHostRoomSettingsIfNeeded();
			if (IsStaticModEnabled())
			{
				SemiFunc.RunIsShop();
			}
		}

		private static int GetCosmeticTokenCount()
		{
			if ((Object)(object)MetaManager.instance == (Object)null)
			{
				return 0;
			}
			return (CosmeticTokensField?.GetValue(MetaManager.instance) as List<int>)?.Count ?? 0;
		}

		private static bool IsInfoTextTriggerActive(InfoTextTrigger trigger)
		{
			if ((Object)(object)trigger == (Object)null)
			{
				return false;
			}
			return (bool)(InfoTextTriggerActiveField?.GetValue(trigger) ?? ((object)false));
		}

		private static bool IsLocalPlayerNearMachine(CosmeticShopMachine machine)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			PlayerAvatar val = SemiFunc.PlayerGetLocal();
			if ((Object)(object)val == (Object)null || (Object)(object)machine == (Object)null)
			{
				return false;
			}
			return Vector3.Distance(((Component)val).transform.position, ((Component)machine).transform.position) <= 3f;
		}

		private static void MarkCurrencyPullPlayer(PlayerAvatar player)
		{
			_currencyPullPlayerViewId = (((Object)(object)player != (Object)null && (Object)(object)player.photonView != (Object)null) ? player.photonView.ViewID : (-1));
			_currencyPullPlayerExpireTime = Time.unscaledTime + 8f;
		}

		private static void ClearCurrencyPullPlayer()
		{
			_currencyPullPlayerViewId = -1;
			_currencyPullPlayerExpireTime = 0f;
		}

		private static bool IsCurrentLocalCurrencyPull(PlayerAvatar interactingPlayer)
		{
			if (_currencyPullPlayerViewId < 0)
			{
				return false;
			}
			if (Time.unscaledTime > _currencyPullPlayerExpireTime)
			{
				ClearCurrencyPullPlayer();
				return false;
			}
			PlayerAvatar val = SemiFunc.PlayerGetLocal();
			if ((Object)(object)val == (Object)null || (Object)(object)interactingPlayer == (Object)null || (Object)(object)val.photonView == (Object)null || (Object)(object)interactingPlayer.photonView == (Object)null)
			{
				return false;
			}
			if (val.photonView.ViewID == _currencyPullPlayerViewId)
			{
				return interactingPlayer.photonView.ViewID == _currencyPullPlayerViewId;
			}
			return false;
		}

		private static bool TryGetPullInputDown()
		{
			if ((Object)(object)InputManager.instance == (Object)null)
			{
				return false;
			}
			return SemiFunc.InputDown((InputKey)2);
		}

		private static bool IsHostAuthoritativeContext()
		{
			if (SemiFunc.IsMultiplayer())
			{
				return PhotonNetwork.InRoom;
			}
			return false;
		}

		private static bool TryGetRoomBool(string key, bool fallback)
		{
			if (!IsHostAuthoritativeContext() || PhotonNetwork.CurrentRoom == null)
			{
				return fallback;
			}
			if (((Dictionary<object, object>)(object)((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties).TryGetValue((object)key, out object value) && value is bool)
			{
				return (bool)value;
			}
			return fallback;
		}

		private static int TryGetRoomInt(string key, int fallback)
		{
			if (!IsHostAuthoritativeContext() || PhotonNetwork.CurrentRoom == null)
			{
				return fallback;
			}
			if (((Dictionary<object, object>)(object)((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties).TryGetValue((object)key, out object value) && value is int)
			{
				return (int)value;
			}
			return fallback;
		}

		private static DisplayLanguage GetEffectiveDisplayLanguage()
		{
			if (IsHostAuthoritativeContext())
			{
				return (DisplayLanguage)TryGetRoomInt("zct_lang", (int)_cfgDisplayLanguage.Value);
			}
			return _cfgDisplayLanguage.Value;
		}

		private static bool IsEffectiveModEnabled()
		{
			if (SemiFunc.IsMultiplayer())
			{
				if (!PhotonNetwork.InRoom)
				{
					return false;
				}
				if (PhotonNetwork.IsMasterClient)
				{
					return IsStaticModEnabled();
				}
				return TryGetRoomBool("zct_enabled", fallback: false);
			}
			return IsStaticModEnabled();
		}

		private static int GetEffectiveBaseCost()
		{
			if (!IsHostAuthoritativeContext())
			{
				return _cfgBaseCost.Value;
			}
			return TryGetRoomInt("zct_base", _cfgBaseCost.Value);
		}

		private static int GetEffectiveCostIncrement()
		{
			if (!IsHostAuthoritativeContext())
			{
				return _cfgCostIncrement.Value;
			}
			return TryGetRoomInt("zct_inc", _cfgCostIncrement.Value);
		}

		private static int GetEffectiveMaxCost()
		{
			if (!IsHostAuthoritativeContext())
			{
				return _cfgMaxCost.Value;
			}
			return TryGetRoomInt("zct_max", _cfgMaxCost.Value);
		}

		private static int GetEffectiveCommonWeight()
		{
			if (!IsHostAuthoritativeContext())
			{
				return _cfgCommonWeight.Value;
			}
			return TryGetRoomInt("zct_common", _cfgCommonWeight.Value);
		}

		private static int GetEffectiveUncommonWeight()
		{
			if (!IsHostAuthoritativeContext())
			{
				return _cfgUncommonWeight.Value;
			}
			return TryGetRoomInt("zct_uncommon", _cfgUncommonWeight.Value);
		}

		private static int GetEffectiveRareWeight()
		{
			if (!IsHostAuthoritativeContext())
			{
				return _cfgRareWeight.Value;
			}
			return TryGetRoomInt("zct_rare", _cfgRareWeight.Value);
		}

		private static int GetEffectiveUltraRareWeight()
		{
			if (!IsHostAuthoritativeContext())
			{
				return _cfgUltraRareWeight.Value;
			}
			return TryGetRoomInt("zct_ultra", _cfgUltraRareWeight.Value);
		}

		private static void SyncHostRoomSettingsIfNeeded()
		{
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Expected O, but got Unknown
			if (SemiFunc.IsMultiplayer() && PhotonNetwork.InRoom && PhotonNetwork.IsMasterClient && PhotonNetwork.CurrentRoom != null)
			{
				string text = string.Join("|", IsStaticModEnabled(), (int)_cfgDisplayLanguage.Value, _cfgBaseCost.Value, _cfgCostIncrement.Value, _cfgMaxCost.Value, _cfgCommonWeight.Value, _cfgUncommonWeight.Value, _cfgRareWeight.Value, _cfgUltraRareWeight.Value, GetPullCount());
				if (!(text == _lastSyncedHostSettingsSignature))
				{
					Hashtable val = new Hashtable
					{
						[(object)"zct_enabled"] = IsStaticModEnabled(),
						[(object)"zct_lang"] = (int)_cfgDisplayLanguage.Value,
						[(object)"zct_base"] = _cfgBaseCost.Value,
						[(object)"zct_inc"] = _cfgCostIncrement.Value,
						[(object)"zct_max"] = _cfgMaxCost.Value,
						[(object)"zct_common"] = _cfgCommonWeight.Value,
						[(object)"zct_uncommon"] = _cfgUncommonWeight.Value,
						[(object)"zct_rare"] = _cfgRareWeight.Value,
						[(object)"zct_ultra"] = _cfgUltraRareWeight.Value,
						[(object)"zct_pullcount"] = GetPullCount()
					};
					PhotonNetwork.CurrentRoom.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
					_lastSyncedHostSettingsSignature = text;
				}
			}
		}

		private void BindConfig()
		{
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Expected O, but got Unknown
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Expected O, but got Unknown
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Expected O, but got Unknown
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Expected O, but got Unknown
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Expected O, but got Unknown
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Expected O, but got Unknown
			((BaseUnityPlugin)this).Config.Bind<string>("模组信息", "模组名称", "金币代替代币", (ConfigDescription)null);
			((BaseUnityPlugin)this).Config.Bind<string>("模组信息", "模组版本号", "1.0.0", (ConfigDescription)null);
			_cfgModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("A.全局设置", "模组启用", true, "总开关。关闭后金币代替代币功能完全失效。");
			_cfgDisplayLanguage = ((BaseUnityPlugin)this).Config.Bind<DisplayLanguage>("A.全局设置", "语言/Language", DisplayLanguage.中文, "公开文档和配置说明语言切换。仅该项保留中英并列格式。");
			_cfgBaseCost = ((BaseUnityPlugin)this).Config.Bind<int>("B.抽奖设置", "基础花费/K", 10, new ConfigDescription("首次金币抽奖花费,范围 10-100 K。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 100), Array.Empty<object>()));
			_cfgCostIncrement = ((BaseUnityPlugin)this).Config.Bind<int>("B.抽奖设置", "每次递增/K", 1, new ConfigDescription("每次金币抽奖后增加的花费,范围 0-10 K。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
			_cfgMaxCost = ((BaseUnityPlugin)this).Config.Bind<int>("B.抽奖设置", "最大花费/K", 20, new ConfigDescription("单次金币抽奖花费上限,范围 10-100 K。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 100), Array.Empty<object>()));
			_cfgCommonWeight = ((BaseUnityPlugin)this).Config.Bind<int>("B.抽奖设置", "普通中奖概率/%", 50, new ConfigDescription("普通奖励的概率参数,范围 0-100%。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			_cfgUncommonWeight = ((BaseUnityPlugin)this).Config.Bind<int>("B.抽奖设置", "稀有中奖概率/%", 30, new ConfigDescription("稀有奖励的概率参数,范围 0-100%。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			_cfgRareWeight = ((BaseUnityPlugin)this).Config.Bind<int>("B.抽奖设置", "珍贵中奖概率/%", 15, new ConfigDescription("珍贵奖励的概率参数,范围 0-100%。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			_cfgUltraRareWeight = ((BaseUnityPlugin)this).Config.Bind<int>("B.抽奖设置", "超稀有中奖概率/%", 5, new ConfigDescription("超稀有奖励的概率参数,范围 0-100%。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
		}

		private void ApplyHarmonyPatches()
		{
			PatchPrefix(typeof(CosmeticShopMachine), "InfoTextTriggerLogic", "InfoTextTriggerLogicPrefix");
			PatchPrefix(typeof(CosmeticShopMachine), "RewardSet", "RewardSetPrefix");
			PatchPrefix(typeof(CosmeticShopMachine), "InteractClientRPC", "InteractClientRPCPrefix");
			PatchPostfix(typeof(CosmeticShopMachine), "StateIdle", "StateIdlePostfix");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"CurrencyAsToken Harmony patches applied.");
		}

		private void PatchPrefix(Type type, string method, string patch)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			try
			{
				MethodInfo methodInfo = AccessTools.Method(type, method, (Type[])null, (Type[])null);
				MethodInfo methodInfo2 = AccessTools.Method(typeof(Plugin), patch, (Type[])null, (Type[])null);
				if (methodInfo != null && methodInfo2 != null)
				{
					harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)("Patch target not found: " + type.Name + "." + method));
				}
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failed to patch " + type.Name + "." + method + ": " + ex.Message));
			}
		}

		private void PatchPostfix(Type type, string method, string patch)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			try
			{
				MethodInfo methodInfo = AccessTools.Method(type, method, (Type[])null, (Type[])null);
				MethodInfo methodInfo2 = AccessTools.Method(typeof(Plugin), patch, (Type[])null, (Type[])null);
				if (methodInfo != null && methodInfo2 != null)
				{
					harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)("Patch target not found: " + type.Name + "." + method));
				}
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failed to patch " + type.Name + "." + method + ": " + ex.Message));
			}
		}

		private static void StateIdlePostfix(CosmeticShopMachine __instance, State ___stateCurrent, PlayerAvatar ___interactingPlayer, InfoTextTrigger ___infoTextTrigger)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			if (!IsEffectiveModEnabled() || !SemiFunc.RunIsShop() || GetCosmeticTokenCount() > 0 || (int)___stateCurrent != 0 || (Object)(object)___interactingPlayer != (Object)null || (!IsInfoTextTriggerActive(___infoTextTrigger) && !IsLocalPlayerNearMachine(__instance)) || (Object)(object)InputManager.instance == (Object)null || !TryGetPullInputDown())
			{
				return;
			}
			int costForNextPull = GetCostForNextPull();
			int num = SemiFunc.StatGetRunCurrency();
			if (num < costForNextPull)
			{
				return;
			}
			PlayerAvatar val = SemiFunc.PlayerGetLocal();
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				int randomRarity = GetRandomRarity();
				SemiFunc.StatSetRunCurrency(num - costForNextPull);
				IncrementPullCount();
				CurrencyUI instance = CurrencyUI.instance;
				if (instance != null)
				{
					instance.FetchCurrency();
				}
				MarkCurrencyPullPlayer(val);
				InteractSetMethod.Invoke(__instance, new object[2] { val, randomRarity });
				SaveProgressIfPossible();
				SyncHostRoomSettingsIfNeeded();
			}
			else
			{
				MarkCurrencyPullPlayer(val);
				((Component)__instance).GetComponent<PhotonView>().RPC("InteractClientRPC", (RpcTarget)2, new object[1] { 1000 });
			}
		}

		private static bool InfoTextTriggerLogicPrefix(CosmeticShopMachine __instance, State ___stateCurrent, InfoTextTrigger ___infoTextTrigger)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			if (!IsEffectiveModEnabled())
			{
				return true;
			}
			if ((int)___stateCurrent != 0)
			{
				return true;
			}
			if ((Object)(object)MetaManager.instance == (Object)null)
			{
				return true;
			}
			if (GetCosmeticTokenCount() > 0)
			{
				return true;
			}
			if (SemiFunc.RunIsShop() && IsLocalPlayerNearMachine(__instance))
			{
				if (___infoTextTrigger != null)
				{
					___infoTextTrigger.Disable(0.2f);
				}
				int costForNextPull = GetCostForNextPull();
				int num = SemiFunc.StatGetRunCurrency();
				string costText = "$" + SemiFunc.DollarGetString(costForNextPull) + "K";
				string text = BuildCurrencyPullPrompt(GetEffectiveDisplayLanguage() == DisplayLanguage.中文, num >= costForNextPull, costText);
				if ((Object)(object)ItemInfoUI.instance != (Object)null)
				{
					ItemInfoUI.instance.ItemInfoText((ItemAttributes)null, text, false);
				}
				return false;
			}
			return true;
		}

		private static bool RewardSetPrefix(CosmeticShopMachine __instance, State ___stateCurrent, PlayerAvatar ___interactingPlayer, CosmeticAsset ___interactingCosmeticAsset)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Invalid comparison between Unknown and I4
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Invalid comparison between Unknown and I4
			if (!IsEffectiveModEnabled())
			{
				return true;
			}
			if (!IsCurrentLocalCurrencyPull(___interactingPlayer))
			{
				return true;
			}
			ClearCurrencyPullPlayer();
			if ((Object)(object)___interactingPlayer != (Object)(object)SemiFunc.PlayerGetLocal())
			{
				return false;
			}
			if ((int)___stateCurrent == 5)
			{
				return true;
			}
			if ((int)___stateCurrent == 8)
			{
				if ((Object)(object)___interactingCosmeticAsset != (Object)null)
				{
					MetaManager.instance.CosmeticUnlock(___interactingCosmeticAsset);
				}
				return false;
			}
			return true;
		}

		private static bool InteractClientRPCPrefix(CosmeticShopMachine __instance, ref int _rarity, PhotonMessageInfo _info)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			if (_rarity < 1000)
			{
				return true;
			}
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				return false;
			}
			if (!IsStaticModEnabled())
			{
				return false;
			}
			int randomRarity = GetRandomRarity();
			PlayerAvatar val = null;
			foreach (PlayerAvatar item in SemiFunc.PlayerGetList())
			{
				if ((Object)(object)item != (Object)null && (Object)(object)item.photonView != (Object)null && _info.Sender == item.photonView.Owner)
				{
					val = item;
					break;
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			int costForNextPull = GetCostForNextPull();
			int num = SemiFunc.StatGetRunCurrency();
			if (num < costForNextPull)
			{
				return false;
			}
			SemiFunc.StatSetRunCurrency(num - costForNextPull);
			IncrementPullCount();
			CurrencyUI instance = CurrencyUI.instance;
			if (instance != null)
			{
				instance.FetchCurrency();
			}
			SaveProgressIfPossible();
			_rarity = randomRarity;
			SyncHostRoomSettingsIfNeeded();
			return true;
		}

		private static int GetCostForNextPull()
		{
			return Mathf.Min(GetEffectiveBaseCost() + GetEffectiveCostIncrement() * GetPullCount(), GetEffectiveMaxCost());
		}

		private static int GetRandomRarity()
		{
			int effectiveCommonWeight = GetEffectiveCommonWeight();
			int effectiveUncommonWeight = GetEffectiveUncommonWeight();
			int effectiveRareWeight = GetEffectiveRareWeight();
			int effectiveUltraRareWeight = GetEffectiveUltraRareWeight();
			int num = effectiveCommonWeight + effectiveUncommonWeight + effectiveRareWeight + effectiveUltraRareWeight;
			if (num <= 0)
			{
				num = 1;
			}
			int num2 = Random.Range(0, num);
			int num3 = 0;
			num3 += effectiveCommonWeight;
			if (num2 < num3)
			{
				return 0;
			}
			num3 += effectiveUncommonWeight;
			if (num2 < num3)
			{
				return 1;
			}
			num3 += effectiveRareWeight;
			if (num2 < num3)
			{
				return 2;
			}
			return 3;
		}

		private static void EnsurePullCountDictRegistered()
		{
			if ((Object)(object)StatsManager.instance == (Object)null)
			{
				return;
			}
			try
			{
				if (DodField?.GetValue(StatsManager.instance) is SortedDictionary<string, Dictionary<string, int>> sortedDictionary)
				{
					if (sortedDictionary.ContainsKey("zichenCurrencyAsTokenPullCount"))
					{
						pullCountDict = sortedDictionary["zichenCurrencyAsTokenPullCount"];
						return;
					}
					pullCountDict = new Dictionary<string, int>();
					sortedDictionary.Add("zichenCurrencyAsTokenPullCount", pullCountDict);
				}
			}
			catch (Exception ex)
			{
				Debug.LogWarning((object)("[CurrencyAsToken] Failed to register pull count dict: " + ex.Message));
			}
		}

		private static int GetPullCount()
		{
			if (IsHostAuthoritativeContext() && !PhotonNetwork.IsMasterClient)
			{
				return Mathf.Max(0, TryGetRoomInt("zct_pullcount", 0));
			}
			EnsurePullCountDictRegistered();
			if (pullCountDict.TryGetValue("pullCount", out var value))
			{
				return value;
			}
			return 0;
		}

		private static void IncrementPullCount()
		{
			EnsurePullCountDictRegistered();
			int value;
			int num = (pullCountDict.TryGetValue("pullCount", out value) ? value : 0);
			pullCountDict["pullCount"] = num + 1;
		}

		private static string BuildCurrencyPullPrompt(bool useChinese, bool canAfford, string costText)
		{
			if (useChinese)
			{
				if (!canAfford)
				{
					return "需要 " + costText + " 才能花费金币抽奖,按 <color=#fff><u><b>[E]</b></u></color>";
				}
				return "按 <color=#fff><u><b>[E]</b></u></color> 花费金币抽奖(" + costText + ")";
			}
			if (!canAfford)
			{
				return "Need " + costText + " to spend currency and pull. Press <color=#fff><u><b>[E]</b></u></color>";
			}
			return "Press <color=#fff><u><b>[E]</b></u></color> to spend currency and pull (" + costText + ")";
		}

		private static void SaveProgressIfPossible()
		{
			try
			{
				if (!((Object)(object)StatsManager.instance == (Object)null) && SemiFunc.IsMasterClientOrSingleplayer())
				{
					SaveFileSaveMethod?.Invoke(StatsManager.instance, null);
				}
			}
			catch (Exception ex)
			{
				Debug.LogWarning((object)("[CurrencyAsToken] Failed to save progress after currency pull: " + ex.Message));
			}
		}

		private void ResetConfigIfVersionChanged()
		{
			try
			{
				string configFilePath = ((BaseUnityPlugin)this).Config.ConfigFilePath;
				string text = ReadConfigPluginVersion(configFilePath);
				if (!string.IsNullOrWhiteSpace(text) && !(text == "1.0.0"))
				{
					((BaseUnityPlugin)this).Config.Clear();
					if (File.Exists(configFilePath))
					{
						File.Delete(configFilePath);
					}
					((BaseUnityPlugin)this).Config.Reload();
					((BaseUnityPlugin)this).Logger.LogWarning((object)"Config version changed. Old config was reset to defaults.");
				}
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Failed to reset config by version: " + ex.Message));
			}
		}

		private static string ReadConfigPluginVersion(string configPath)
		{
			if (!File.Exists(configPath))
			{
				return null;
			}
			Match match = Regex.Match(File.ReadAllText(configPath), "(?m)^模组版本号\\s*=\\s*(.+?)\\s*$");
			if (!match.Success)
			{
				return null;
			}
			return match.Groups[1].Value.Trim();
		}

		private void DetachFromManager()
		{
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
		}
	}
}