Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of shop prices modifier v1.0.2
shopprices.dll
Decompiled 4 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("shopprice2")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("shopprice2")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("2367ad22-5cd7-4c6e-84f5-442fa9408d56")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace ShopPriceModifier; [BepInPlugin("ShopPriceModifier", "ShopPriceModifier", "1.0.3")] public class ShopPriceModifier : BaseUnityPlugin { public static class PricePatches { public static void ModifyUpgradePricePrefix(float _value, Item item, ref float __result, ref bool __runOriginal, ShopManager __instance) { float num = _value; int count = GameDirector.instance.PlayerList.Count; float num2 = UpgradePlayerInfluence.Value * (float)(count - 1); num2 = Mathf.Max(num2, -0.9f); num += num * num2; float num3 = (CustomBaseIncreaseEnable.Value ? CustomUpgradeValueIncrease.Value : ((float)_UpgradeValueIncrease.GetValue(__instance))); num += num * num3 * (float)StatsManager.instance.GetItemsUpgradesPurchased(((Object)item).name); float globalRandomMultiplier = GetGlobalRandomMultiplier(); float num4 = UpgradeBaseMultiplier.Value + globalRandomMultiplier - 1f; num4 = Mathf.Max(num4, 0.1f); num *= num4; num = Mathf.Ceil(num); num = (__result = Mathf.Max(num, 1f)); __runOriginal = false; string text = ((num2 > 0f) ? $"涨{num2 * 100f:F1}%" : ((num2 < 0f) ? $"降{Math.Abs(num2) * 100f:F1}%" : "无调整")); string text2 = (GlobalPriceRandomEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)"); LogDebug($"[升级物品:{((Object)item).name}] 基础值:{_value:F2} | 玩家数:{count}({text})→ " + $"总倍率(基础{UpgradeBaseMultiplier.Value:F2} + {text2} - 1)={num4:F2} → 最终价:{num:F2}"); } public static void ModifyHealthPackPricePrefix(float _value, ref float __result, ref bool __runOriginal, ShopManager __instance) { float num = _value; int count = GameDirector.instance.PlayerList.Count; int num2 = Mathf.Min(RunManager.instance.levelsCompleted, MaxLevelLimit.Value); float num3 = HealthPackPlayerInfluence.Value * (float)(count - 1); num3 = Mathf.Max(num3, -0.9f); num += num * num3; float num4 = (CustomBaseIncreaseEnable.Value ? CustomHealthPackValueIncrease.Value : ((float)_HealthPackValueIncrease.GetValue(__instance))); num += num * num4 * (float)num2; float globalRandomMultiplier = GetGlobalRandomMultiplier(); float num5 = HealthPackBaseMultiplier.Value + globalRandomMultiplier - 1f; num5 = Mathf.Max(num5, 0.1f); num *= num5; num = Mathf.Ceil(num); num = (__result = Mathf.Max(num, 1f)); __runOriginal = false; string text = ((num3 > 0f) ? $"涨{num3 * 100f:F1}%" : ((num3 < 0f) ? $"降{Math.Abs(num3) * 100f:F1}%" : "无调整")); string text2 = (GlobalPriceRandomEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)"); LogDebug($"[医疗包] 基础值:{_value:F2} | 玩家数:{count}({text})| 通关数:{num2} → " + $"总倍率(基础{HealthPackBaseMultiplier.Value:F2} + {text2} - 1)={num5:F2} → 最终价:{num:F2}"); } public static void ModifyCrystalPricePrefix(float _value, ref float __result, ref bool __runOriginal, ShopManager __instance) { float num = _value; int num2 = Mathf.Min(RunManager.instance.levelsCompleted, MaxLevelLimit.Value); float num3 = (CustomBaseIncreaseEnable.Value ? CustomCrystalValueIncrease.Value : ((float)_CrystalValueIncrease.GetValue(__instance))); num += num * num3 * (float)num2; float globalRandomMultiplier = GetGlobalRandomMultiplier(); float num4 = CrystalBaseMultiplier.Value + globalRandomMultiplier - 1f; num4 = Mathf.Max(num4, 0.1f); num *= num4; num = Mathf.Ceil(num); num = (__result = Mathf.Max(num, 1f)); __runOriginal = false; string text = (GlobalPriceRandomEnable.Value ? $"随机倍率:{globalRandomMultiplier:F2}" : "无随机倍率(1.0)"); LogDebug($"[能量水晶] 基础值:{_value:F2} | 通关数:{num2} → " + $"总倍率(基础{CrystalBaseMultiplier.Value:F2} + {text} - 1)={num4:F2} → 最终价:{num:F2}"); } } internal static ManualLogSource Log; internal static ConfigEntry<float> UpgradeBaseMultiplier; internal static ConfigEntry<float> UpgradePlayerInfluence; internal static ConfigEntry<float> HealthPackBaseMultiplier; internal static ConfigEntry<float> HealthPackPlayerInfluence; internal static ConfigEntry<float> CrystalBaseMultiplier; internal static ConfigEntry<bool> GlobalPriceRandomEnable; internal static ConfigEntry<float> GlobalRandomMinMultiplier; internal static ConfigEntry<float> GlobalRandomMaxMultiplier; internal static ConfigEntry<bool> LoggingEnable; internal static ConfigEntry<int> MaxLevelLimit; internal static ConfigEntry<bool> CustomBaseIncreaseEnable; internal static ConfigEntry<float> CustomUpgradeValueIncrease; internal static ConfigEntry<float> CustomHealthPackValueIncrease; internal static ConfigEntry<float> CustomCrystalValueIncrease; private static Random _random = new Random(); private static readonly FieldInfo _UpgradeValueIncrease = AccessTools.Field(typeof(ShopManager), "upgradeValueIncrease"); private static readonly FieldInfo _HealthPackValueIncrease = AccessTools.Field(typeof(ShopManager), "healthPackValueIncrease"); private static readonly FieldInfo _CrystalValueIncrease = AccessTools.Field(typeof(ShopManager), "crystalValueIncrease"); private void Awake() { Log = ((BaseUnityPlugin)this).Logger; InitConfig(); ApplyPatches(); } private void InitConfig() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Expected O, but got Unknown //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_019b: 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 //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Expected O, but got Unknown //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Expected O, but got Unknown //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Expected O, but got Unknown //IL_02b6: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Expected O, but got Unknown //IL_02ea: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Expected O, but got Unknown //IL_031b: Unknown result type (might be due to invalid IL or missing references) //IL_0325: Expected O, but got Unknown UpgradeBaseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Upgrade Item Price Settings", "BaseMultiplier", 1f, new ConfigDescription("Upgrade item base price multiplier (0.01~10, 0.5=50% off, 1=original price)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 10f), Array.Empty<object>())); UpgradePlayerInfluence = ((BaseUnityPlugin)this).Config.Bind<float>("Upgrade Item Price Settings", "PlayerInfluence", 0.1f, new ConfigDescription("Upgrade item player count influence (-0.1~1, 0.1=+10% per player, -0.05=-5% per player)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-0.1f, 1f), Array.Empty<object>())); HealthPackBaseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Health Pack Price Settings", "BaseMultiplier", 1f, new ConfigDescription("Health pack base price multiplier (0.01~10, 0.5=50% off, 1=original price)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 10f), Array.Empty<object>())); HealthPackPlayerInfluence = ((BaseUnityPlugin)this).Config.Bind<float>("Health Pack Price Settings", "PlayerInfluence", 0.1f, new ConfigDescription("Health pack player count influence (-0.1~1, 0.1=+10% per player, -0.05=-5% per player)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-0.1f, 1f), Array.Empty<object>())); CrystalBaseMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Energy Crystal Price Settings", "BaseMultiplier", 1f, new ConfigDescription("Energy crystal base price multiplier (0.01~10, 0.5=50% off, 1=original price)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 10f), Array.Empty<object>())); GlobalPriceRandomEnable = ((BaseUnityPlugin)this).Config.Bind<bool>("Random Price Settings", "RandomEnable", false, new ConfigDescription("Whether to enable random price fluctuation for all goods (global switch)", (AcceptableValueBase)(object)new AcceptableValueRange<bool>(false, true), Array.Empty<object>())); GlobalRandomMinMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Random Price Settings", "RandomMinMultiplier", 0.8f, new ConfigDescription("Random minimum multiplier (0.1~2, default 0.8)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 2f), Array.Empty<object>())); GlobalRandomMaxMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Random Price Settings", "RandomMaxMultiplier", 1.2f, new ConfigDescription("Random maximum multiplier (0.1~2, default 1.2)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 2f), Array.Empty<object>())); CustomBaseIncreaseEnable = ((BaseUnityPlugin)this).Config.Bind<bool>("Not recommended to modify", "EnableCustomBaseIncrease", false, new ConfigDescription("Whether to enable custom base increase values (override game's original upgrade/healthpack/crystal value increase)", (AcceptableValueBase)(object)new AcceptableValueRange<bool>(false, true), Array.Empty<object>())); CustomUpgradeValueIncrease = ((BaseUnityPlugin)this).Config.Bind<float>("Not recommended to modify", "UpgradeValueOwnedIncrease", 0.5f, new ConfigDescription("The base value of upgraded items increases with the number of purchases (0.1~1, default 0.5)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 1f), Array.Empty<object>())); CustomHealthPackValueIncrease = ((BaseUnityPlugin)this).Config.Bind<float>("Not recommended to modify", "HealthPackValueLevelIncrease", 0.05f, new ConfigDescription("The base amount of health Pack increases with each level (0.01~0.1, default 0.05)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 0.1f), Array.Empty<object>())); CustomCrystalValueIncrease = ((BaseUnityPlugin)this).Config.Bind<float>("Not recommended to modify", "CrystalValueLevelIncrease", 0.2f, new ConfigDescription("The base amount of energy crystals increases with each level (0.01~0.5, default 0.01)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 0.5f), Array.Empty<object>())); MaxLevelLimit = ((BaseUnityPlugin)this).Config.Bind<int>("Not recommended to modify", "MaxLevelLimit", 15, new ConfigDescription("Maximum level limit for price calculation (15~50, default 15)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(15, 50), Array.Empty<object>())); LoggingEnable = ((BaseUnityPlugin)this).Config.Bind<bool>("Logging Settings", "EnableDebugLogging", false, new ConfigDescription("Whether to enable debug log output (print price calculation details for each item when enabled)", (AcceptableValueBase)(object)new AcceptableValueRange<bool>(false, true), Array.Empty<object>())); UpgradeBaseMultiplier.Value = Mathf.Clamp(UpgradeBaseMultiplier.Value, 0.01f, 10f); UpgradePlayerInfluence.Value = Mathf.Clamp(UpgradePlayerInfluence.Value, -0.1f, 1f); HealthPackBaseMultiplier.Value = Mathf.Clamp(HealthPackBaseMultiplier.Value, 0.01f, 10f); HealthPackPlayerInfluence.Value = Mathf.Clamp(HealthPackPlayerInfluence.Value, -0.1f, 1f); CrystalBaseMultiplier.Value = Mathf.Clamp(CrystalBaseMultiplier.Value, 0.01f, 10f); GlobalRandomMinMultiplier.Value = Mathf.Clamp(GlobalRandomMinMultiplier.Value, 0.1f, 2f); GlobalRandomMaxMultiplier.Value = Mathf.Clamp(GlobalRandomMaxMultiplier.Value, 0.1f, 2f); MaxLevelLimit.Value = Mathf.Clamp(MaxLevelLimit.Value, 15, 50); CustomUpgradeValueIncrease.Value = Mathf.Clamp(CustomUpgradeValueIncrease.Value, 0.1f, 1f); CustomHealthPackValueIncrease.Value = Mathf.Clamp(CustomHealthPackValueIncrease.Value, 0.01f, 0.1f); CustomCrystalValueIncrease.Value = Mathf.Clamp(CustomCrystalValueIncrease.Value, 0.01f, 0.5f); if (GlobalRandomMinMultiplier.Value > GlobalRandomMaxMultiplier.Value) { GlobalRandomMinMultiplier.Value = GlobalRandomMaxMultiplier.Value; } Log.LogInfo((object)("Configuration loaded successfully → " + $"Upgrade Items[Multiplier:{UpgradeBaseMultiplier.Value}, Player Influence:{UpgradePlayerInfluence.Value * 100f}%/player] | " + $"Health Packs[Multiplier:{HealthPackBaseMultiplier.Value}, Player Influence:{HealthPackPlayerInfluence.Value * 100f}%/player] | " + $"Energy Crystals[Multiplier:{CrystalBaseMultiplier.Value}] | " + "Random Price[" + (GlobalPriceRandomEnable.Value ? $"Enabled({GlobalRandomMinMultiplier.Value}~{GlobalRandomMaxMultiplier.Value})" : "Disabled") + "] | " + $"Max Level Limit:{MaxLevelLimit.Value} | " + "Custom Base Increase[" + (CustomBaseIncreaseEnable.Value ? $"Enabled(Upgrade:{CustomUpgradeValueIncrease.Value}, HealthPack:{CustomHealthPackValueIncrease.Value}, Crystal:{CustomCrystalValueIncrease.Value})" : "Disabled") + "] | Debug Log[" + (LoggingEnable.Value ? "Enabled" : "Disabled") + "]")); } private void ApplyPatches() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown try { Harmony val = new Harmony("ShopPriceModifier"); val.Patch((MethodBase)typeof(ShopManager).GetMethod("UpgradeValueGet"), new HarmonyMethod(typeof(PricePatches).GetMethod("ModifyUpgradePricePrefix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)typeof(ShopManager).GetMethod("HealthPackValueGet"), new HarmonyMethod(typeof(PricePatches).GetMethod("ModifyHealthPackPricePrefix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)typeof(ShopManager).GetMethod("CrystalValueGet"), new HarmonyMethod(typeof(PricePatches).GetMethod("ModifyCrystalPricePrefix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Log.LogInfo((object)"加载成功!"); } catch (Exception ex) { Log.LogError((object)("插件加载失败:" + ex.Message + "\n" + ex.StackTrace)); } } internal static float GetGlobalRandomMultiplier() { if (!GlobalPriceRandomEnable.Value) { return 1f; } return (float)(_random.NextDouble() * (double)(GlobalRandomMaxMultiplier.Value - GlobalRandomMinMultiplier.Value) + (double)GlobalRandomMinMultiplier.Value); } internal static void LogDebug(string message) { if (LoggingEnable.Value) { Log.LogDebug((object)message); } } } public static class PluginInfo { public const string GUID = "ShopPriceModifier"; public const string Name = "ShopPriceModifier"; public const string Version = "1.0.3"; }