Decompiled source of shop prices modifier v1.0.1

shopprices.dll

Decompiled a day ago
using 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.1")]
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 = (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, 15);
			float num3 = HealthPackPlayerInfluence.Value * (float)(count - 1);
			num3 = Mathf.Max(num3, -0.9f);
			num += num * num3;
			float num4 = (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, 15);
			float num3 = (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;

	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
		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>("Global Random 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>("Global Random 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>()));
		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);
		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") + "] | 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.1";
}