using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using LC_GiftBox_Config.libs.ILTools;
using LC_GiftBox_Config.libs.LethalConfigNicerizer;
using LC_GiftBox_Config.libs.Probability;
using LethalConfig;
using LethalConfig.ConfigItems;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyCompany("DBJ")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Configure how the gift box filters and spawns scrap items + store items, and modifies their scrap values")]
[assembly: AssemblyFileVersion("1.0.3.0")]
[assembly: AssemblyInformationalVersion("1.0.3+f6c2fb05bda16495707aecc5165287699ab61fe3")]
[assembly: AssemblyProduct("LC_GiftBox_Config")]
[assembly: AssemblyTitle("com.github.decibillyjoel.lc_giftbox_config")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/DecibillyJoel/LC_GiftBox_Config")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.3.0")]
[module: UnverifiableCode]
[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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[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;
}
}
}
internal static class LCMPluginInfo
{
public const string PLUGIN_GUID = "com.github.decibillyjoel.lc_giftbox_config";
public const string PLUGIN_NAME = "LC_GiftBox_Config";
public const string PLUGIN_TS_TEAM = "DBJ";
public const string PLUGIN_VERSION = "1.0.3";
}
namespace LC_GiftBox_Config
{
[BepInPlugin("com.github.decibillyjoel.lc_giftbox_config", "DBJ.LC_GiftBox_Config", "1.0.3")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public static ManualLogSource PluginLogger = null;
public static ConfigEntry<bool> giftBoxMechanicsDisabled = null;
public static ConfigEntry<int> spawnStoreItemChance = null;
public static ConfigEntry<int> spawnScrapChance = null;
public static ConfigEntry<int> spawnGiftBoxChance = null;
public static ConfigEntry<int> spawnNothingChance = null;
public static ConfigEntry<int> doNothingChance = null;
public static ConfigEntry<int> scrapValueMin = null;
public static ConfigEntry<int> scrapValueMax = null;
public static ConfigEntry<int> scrapValueInfluence = null;
public static ConfigEntry<int> scrapRarityMin = null;
public static ConfigEntry<int> scrapRarityMax = null;
public static ConfigEntry<int> scrapRarityInfluence = null;
public static ConfigEntry<int> scrapValueIsGiftBoxChance = null;
public static ConfigEntry<int> scrapValueAdditionChance = null;
public static ConfigEntry<int> scrapValueAdditionMin = null;
public static ConfigEntry<int> scrapValueAdditionMax = null;
public static ConfigEntry<int> scrapValueMultiplierChance = null;
public static ConfigEntry<int> scrapValueMultiplierMin = null;
public static ConfigEntry<int> scrapValueMultiplierMax = null;
public static ConfigEntry<int> storeItemPriceMin = null;
public static ConfigEntry<int> storeItemPriceMax = null;
public static ConfigEntry<int> storeItemPriceInfluence = null;
internal static readonly Harmony harmony = new Harmony("DBJ.LC_GiftBox_Config");
public static void Log(LogLevel logLevel, string logMessage)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
PluginLogger.Log(logLevel, (object)(logMessage ?? ""));
}
public static void Log(string logMessage)
{
Log((LogLevel)16, logMessage);
}
private void ValidateConfigAndApplyPatches(object? eventSender = null, SettingChangedEventArgs? eventArgs = null)
{
Log((LogLevel)32, "Validating config...");
((BaseUnityPlugin)this).Config.SettingChanged -= ValidateConfigAndApplyPatches;
if (spawnStoreItemChance.Value == 0 && spawnScrapChance.Value == 0 && spawnGiftBoxChance.Value == 0 && spawnNothingChance.Value == 0 && doNothingChance.Value == 0)
{
Log((LogLevel)2, "All [" + ((ConfigEntryBase)spawnScrapChance).Definition.Section + "] config weights are 0! Setting |" + ((ConfigEntryBase)giftBoxMechanicsDisabled).Definition.Key + "| to true...");
giftBoxMechanicsDisabled.Value = true;
}
if (scrapValueMin.Value > scrapValueMax.Value)
{
Log((LogLevel)4, "|" + ((ConfigEntryBase)scrapValueMin).Definition.Key + "| is greater than |" + ((ConfigEntryBase)scrapValueMax).Definition.Key + "! Swapping values...");
ConfigEntry<int> val = scrapValueMin;
ConfigEntry<int> obj = scrapValueMax;
int value = scrapValueMax.Value;
int value2 = scrapValueMin.Value;
val.Value = value;
obj.Value = value2;
}
if (scrapRarityMin.Value > scrapRarityMax.Value)
{
Log((LogLevel)4, "|" + ((ConfigEntryBase)scrapRarityMin).Definition.Key + "| is greater than |" + ((ConfigEntryBase)scrapRarityMax).Definition.Key + "! Swapping values...");
ConfigEntry<int> val = scrapRarityMin;
ConfigEntry<int> obj2 = scrapRarityMax;
int value2 = scrapRarityMax.Value;
int value = scrapRarityMin.Value;
val.Value = value2;
obj2.Value = value;
}
if (scrapValueAdditionMin.Value > scrapValueAdditionMax.Value)
{
Log((LogLevel)4, "|" + ((ConfigEntryBase)scrapValueAdditionMin).Definition.Key + "| is greater than |" + ((ConfigEntryBase)scrapValueAdditionMax).Definition.Key + "! Swapping values...");
ConfigEntry<int> val = scrapValueAdditionMin;
ConfigEntry<int> obj3 = scrapValueAdditionMax;
int value = scrapValueAdditionMax.Value;
int value2 = scrapValueAdditionMin.Value;
val.Value = value;
obj3.Value = value2;
}
if (scrapValueMultiplierMin.Value > scrapValueMultiplierMax.Value)
{
Log((LogLevel)4, "|" + ((ConfigEntryBase)scrapValueMultiplierMin).Definition.Key + "| is greater than |" + ((ConfigEntryBase)scrapValueMultiplierMax).Definition.Key + "! Swapping values...");
ConfigEntry<int> val = scrapValueMultiplierMin;
ConfigEntry<int> obj4 = scrapValueMultiplierMax;
int value2 = scrapValueMultiplierMax.Value;
int value = scrapValueMultiplierMin.Value;
val.Value = value2;
obj4.Value = value;
}
if (storeItemPriceMin.Value > storeItemPriceMax.Value)
{
Log((LogLevel)4, "|" + ((ConfigEntryBase)storeItemPriceMin).Definition.Key + "| is greater than |" + ((ConfigEntryBase)storeItemPriceMax).Definition.Key + "! Swapping values...");
ConfigEntry<int> val = storeItemPriceMin;
ConfigEntry<int> obj5 = storeItemPriceMax;
int value = storeItemPriceMax.Value;
int value2 = storeItemPriceMin.Value;
val.Value = value;
obj5.Value = value2;
}
((BaseUnityPlugin)this).Config.SettingChanged += ValidateConfigAndApplyPatches;
Log((LogLevel)32, "Unpatching...");
harmony.UnpatchSelf();
Log((LogLevel)32, "Patching...");
harmony.PatchAll();
Log((LogLevel)32, "Finished config validation and patching!");
}
private void Awake()
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Expected O, but got Unknown
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Expected O, but got Unknown
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: Expected O, but got Unknown
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Expected O, but got Unknown
//IL_0195: Unknown result type (might be due to invalid IL or missing references)
//IL_019f: Expected O, but got Unknown
//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
//IL_01de: Expected O, but got Unknown
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_021e: Expected O, but got Unknown
//IL_024f: Unknown result type (might be due to invalid IL or missing references)
//IL_0259: Expected O, but got Unknown
//IL_028e: Unknown result type (might be due to invalid IL or missing references)
//IL_0298: Expected O, but got Unknown
//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
//IL_02d8: Expected O, but got Unknown
//IL_0307: Unknown result type (might be due to invalid IL or missing references)
//IL_0311: Expected O, but got Unknown
//IL_0340: Unknown result type (might be due to invalid IL or missing references)
//IL_034a: Expected O, but got Unknown
//IL_0380: Unknown result type (might be due to invalid IL or missing references)
//IL_038a: Expected O, but got Unknown
//IL_03c0: Unknown result type (might be due to invalid IL or missing references)
//IL_03ca: Expected O, but got Unknown
//IL_03f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0403: Expected O, but got Unknown
//IL_0435: Unknown result type (might be due to invalid IL or missing references)
//IL_043f: Expected O, but got Unknown
//IL_0474: Unknown result type (might be due to invalid IL or missing references)
//IL_047e: Expected O, but got Unknown
//IL_04af: Unknown result type (might be due to invalid IL or missing references)
//IL_04b9: Expected O, but got Unknown
//IL_04ee: Unknown result type (might be due to invalid IL or missing references)
//IL_04f8: Expected O, but got Unknown
//IL_052e: Unknown result type (might be due to invalid IL or missing references)
//IL_0538: Expected O, but got Unknown
PluginLogger = ((BaseUnityPlugin)this).Logger;
Log("[v1.0.3] Loading...");
giftBoxMechanicsDisabled = LethalConfigNicerizer.Nicerize<bool>(((BaseUnityPlugin)this).Config.Bind<bool>("Gift Box - Toggle", "Disable modded mechanics", false, new ConfigDescription("Toggle this setting to disable the modded gift box mechanics", (AcceptableValueBase)null, Array.Empty<object>())));
spawnStoreItemChance = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Behavior Selection", "Chance to select a store item (Selection Weight)", 60, new ConfigDescription("The selection weight of a gift box containing a store item. 0 = will not happen, larger selection weight = more likely to happen\n\n[Vanilla Value: 0]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())));
spawnScrapChance = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Behavior Selection", "Chance to select a scrap item (Selection Weight)", 35, new ConfigDescription("The selection weight of a gift box containing a scrap item. 0 = will not happen, larger selection weight = more likely to happen\n\n[Vanilla Value: 100]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())));
spawnGiftBoxChance = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Behavior Selection", "Chance to select another gift box (Selection Weight)", 1, new ConfigDescription("The selection weight of a gift box containing another gift box. 0 = will not happen, larger selection weight = more likely to happen\n\n[Vanilla Value: 0]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())));
spawnNothingChance = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Behavior Selection", "Chance to select no item (Selection Weight)", 4, new ConfigDescription("The selection weight of a gift box being empty. 0 = will not happen, larger selection weight = more likely to happen\n\n[Vanilla Value: 0]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())));
doNothingChance = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Behavior Selection", "Chance to leave gift box unmodified (Selection Weight)", 0, new ConfigDescription("The selection weight of a gift box not being modified by this mod, i.e. so another gift box mod's effects can function instead. 0 = will not happen, larger selection weight = more likely to happen\n\nIf you do not have any other gift box mods that function by transpiling OpenGiftBoxServerRpc(), I recommend leaving this value at 0. Otherwise, I recommend setting their probability values to 100% and this probability value to the weight you'd like to assign to the other mod, so that whenever this mod selects this hands-off behavior, the other mod's functionality will have a 100% chance to occur rather than simply using vanilla behavior", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())));
scrapValueMin = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Selection", "Minimum selectable scrap value", 0, new ConfigDescription("The minimum value required for a scrap item to be selected by the gift box\n\n[Vanilla Value: 0]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, int.MaxValue), Array.Empty<object>())));
scrapValueMax = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Selection", "Maximum selectable scrap value", int.MaxValue, new ConfigDescription("The maximum value required for a scrap item to be selected by the gift box\n\n[Vanilla Value: infinity]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, int.MaxValue), Array.Empty<object>())));
scrapValueInfluence = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Selection", "Scrap value influence percentage (%)", -50, new ConfigDescription("How much influence a scrap item's value has over its selection weight. 0 = scrap item's value does not influence its selection weight, larger influence percentage = high-value scrap items are more likely than low-value scrap items, negative influence percentage = high-value scrap items are less likely than low-value scrap items\n\nEach selectable scrap item is given a selection weight equal to their scrap value raised to the power of this percentage (i.e. 100% = 100 / 100 = 1, so the exponent is 1). e.g. if this percentage is set to 200%, a scrap item with a value of 2 has a selection weight of 4 (2 ^ 200% = 2 ^ 2 = 4), which is four times the selection weight of a scrap item with a value of 1 and therefore a selection weight of 1 (1 ^ 200% = 1 ^ 2 = 1). If this value is negative, then the selection weights are inverted - e.g. -100% results in a scrap item with a value of 2 receiving a selection weight of 0.5 (2 ^ -100% = 2 ^ -1 = 1 / (2 ^ 1) = 1 / 2 = 0.5)\n\n[Vanilla Value: 0%]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1000, 1000), Array.Empty<object>())));
scrapRarityMin = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Selection", "Minimum selectable scrap spawn weight", 0, new ConfigDescription("The minimum spawn weight required for a scrap item to be selected by the gift box\n\n[Vanilla Value: 0]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, int.MaxValue), Array.Empty<object>())));
scrapRarityMax = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Selection", "Maximum selectable scrap spawn weight", int.MaxValue, new ConfigDescription("The maximum value required for a scrap item to be selected by the gift box\n\n[Vanilla Value: infinity]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, int.MaxValue), Array.Empty<object>())));
scrapRarityInfluence = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Selection", "Scrap spawn weight influence percentage (%)", 50, new ConfigDescription("How much influence a scrap item's spawn weight within the current level has over its selection weight. 0 = scrap item's spawn weight does not influence its selection weight, larger influence percentage = common scrap items are more likely than rare scrap items, negative influence percentage = common scrap items are less likely than rare scrap items\n\nEach selectable scrap item is given a selection weight equal to their spawn weight raised to the power of this percentage (i.e. 100% = 100 / 100 = 1, so the exponent is 1). e.g. if this percentage is set to 200%, a scrap item with a spawn weight of 2 has a selection weight of 4 (2 ^ 200% = 2 ^ 2 = 4), which is four times the selection weight of a scrap item with a spawn weight of 1 and therefore a selection weight of 1 (1 ^ 200% = 1 ^ 2 = 1). If this value is negative, then the selection weights are inverted - e.g. -100% results in a scrap item with a spawn weight of 2 receiving a selection weight of 0.5 (2 ^ -100% = 2 ^ -1 = 1 / (2 ^ 1) = 1 / 2 = 0.5)\n\n[Vanilla Value: 100%]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1000, 1000), Array.Empty<object>())));
scrapValueIsGiftBoxChance = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Item Value", "Chance for scrap item to inherit gift box value (%)", 15, new ConfigDescription("The likelihood (% chance) of the selected scrap item having the same scrap value as the gift box itself\n\n[Vanilla Value: 0]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>())));
scrapValueAdditionChance = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Item Value", "Chance for scrap item to receive scrap value addition (%)", 100, new ConfigDescription("The likelihood (% chance) of the selected scrap item receiving an addition to its scrap value (if the scrap item inherits the gift box's scrap value, this addition will not be applied)\n\n[Vanilla Value: 100]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>())));
scrapValueAdditionMin = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Item Value", "Minimum scrap item value addition", 30, new ConfigDescription("The minimum possible value of the multiplier applied to the selected scrap item's scrap value\n\n[Vanilla Value: 25]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1000, 1000), Array.Empty<object>())));
scrapValueAdditionMax = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Item Value", "Maximum scrap item value addition", 60, new ConfigDescription("The maximum possible value of the multiplier applied to the selected scrap item's scrap value\n\n[Vanilla Value: 35]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1000, 1000), Array.Empty<object>())));
scrapValueMultiplierChance = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Item Value", "Chance for scrap item to receive scrap value multiplier (%)", 35, new ConfigDescription("The likelihood (% chance) of the selected scrap item receiving a multiplier to its scrap value (if the scrap item inherits the gift box's scrap value, this multiplier will not be applied)\n\n[Vanilla Value: 0]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>())));
scrapValueMultiplierMin = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Item Value", "Minimum scrap item value multiplier (%)", 120, new ConfigDescription("The minimum possible value of the multiplier applied to the selected scrap item's scrap value\n\n[Vanilla Value: 100%]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())));
scrapValueMultiplierMax = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Scrap Item Value", "Maximum scrap item value multiplier (%)", 150, new ConfigDescription("The maximum possible value of the multiplier applied to the selected scrap item's scrap value\n\n[Vanilla Value: 100%]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())));
storeItemPriceMin = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Store Item Selection", "Minimum selectable store item price", 0, new ConfigDescription("The minimum store item price required for an item to be selected by the gift box\n\n[Vanilla Value: 0]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, int.MaxValue), Array.Empty<object>())));
storeItemPriceMax = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Store Item Selection", "Maximum selectable store item price", int.MaxValue, new ConfigDescription("The maximum store item price required for an item to be selected by the gift box\n\n[Vanilla Value: infinity]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, int.MaxValue), Array.Empty<object>())));
storeItemPriceInfluence = LethalConfigNicerizer.Nicerize<int>(((BaseUnityPlugin)this).Config.Bind<int>("Gift Box - Store Item Selection", "Store item price influence percentage (%)", -100, new ConfigDescription("How much influence a store item's price has over its selection weight. 0 = store item's price does not influence its selection weight, larger influence percentage = expensive store items are more likely than cheap store items, negative influence percentage = expensive store items are less likely than cheap store items\n\nEach selectable store item is given a selection weight equal to their store price raised to the power of this percentage (i.e. 100% = 100 / 100 = 1, so the exponent is 1). e.g. if this percentage is set to 200%, a store item with a price of 2 has a selection weight of 4 (2 ^ 200% = 2 ^ 2 = 4), which is four times the selection weight of a store item with a price of 1 and therefore a selection weight of 1 (1 ^ 200% = 1 ^ 2 = 1). If this value is negative, then the selection weights are inverted - e.g. -100% results in a store item with a price of 2 receiving a selection weight of 0.5 (2 ^ -100% = 2 ^ -1 = 1 / (2 ^ 1) = 1 / 2 = 0.5)\n\n[Vanilla Value: 0%]", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1000, 1000), Array.Empty<object>())));
ValidateConfigAndApplyPatches();
Log("[v1.0.3] Finished loading!");
}
}
}
namespace LC_GiftBox_Config.Patches.GiftBoxItemPatches.GiftBoxItemPatches
{
[HarmonyPatch(typeof(GiftBoxItem))]
internal static class GiftBoxItemPatch
{
internal static List<int> giftboxBehaviors = new List<int>(5) { 0, 0, 0, 0, 0 };
private const int DO_NOTHING = 0;
private const int SPAWN_STORE_ITEM = 1;
private const int SPAWN_SCRAP = 2;
private const int SPAWN_GIFTBOX = 3;
private const int SPAWN_NOTHING = 4;
private const int IGNORE_ITEM_VALUE = -1;
private const int USE_GIFTBOX_VALUE = -2;
internal static Terminal _terminal = null;
internal static Item[] _terminalBuyableItemsList = null;
internal static List<Item> _filteredStoreItems = new List<Item>();
internal static List<double> _filteredStoreItemWeights = new List<double>();
private const int GIFTBOX_ITEM_ID = 152767;
internal static List<SpawnableItemWithRarity> _currentLevelSpawnableScrap = new List<SpawnableItemWithRarity>();
internal static List<SpawnableItemWithRarity> _filteredScrapItems = new List<SpawnableItemWithRarity>();
internal static List<double> _filteredScrapItemWeights = new List<double>();
internal static List<Item> filteredStoreItems
{
get
{
if ((Object)(object)_terminal == (Object)null || !((Behaviour)_terminal).isActiveAndEnabled)
{
_terminal = Object.FindAnyObjectByType<Terminal>();
_terminalBuyableItemsList = null;
}
if (_terminalBuyableItemsList != _terminal.buyableItemsList)
{
_terminalBuyableItemsList = _terminal.buyableItemsList;
_filteredStoreItems.Clear();
}
if (_filteredStoreItems.Count == 0)
{
_filteredStoreItems = _terminalBuyableItemsList.Where((Item item) => item.creditsWorth >= Plugin.storeItemPriceMin.Value && item.creditsWorth <= Plugin.storeItemPriceMax.Value).ToList();
}
return _filteredStoreItems;
}
set
{
if (value == null)
{
_filteredStoreItems.Clear();
}
else
{
_filteredStoreItems = value;
}
}
}
internal static List<double> filteredStoreItemWeights
{
get
{
_ = filteredStoreItems;
if (_filteredStoreItemWeights.Count == 0)
{
_filteredStoreItemWeights = _filteredStoreItems.Select((Item item) => Math.Pow(item.creditsWorth, (double)Plugin.scrapValueInfluence.Value / 100.0)).ToList();
}
return _filteredStoreItemWeights;
}
set
{
if (value == null)
{
_filteredStoreItemWeights.Clear();
}
else
{
_filteredStoreItemWeights = value;
}
}
}
internal static List<SpawnableItemWithRarity> filteredScrapItems
{
get
{
if (_currentLevelSpawnableScrap != RoundManager.Instance.currentLevel.spawnableScrap)
{
_currentLevelSpawnableScrap = RoundManager.Instance.currentLevel.spawnableScrap;
_filteredScrapItems.Clear();
_filteredScrapItemWeights.Clear();
}
if (_filteredScrapItems.Count == 0)
{
_filteredScrapItems = _currentLevelSpawnableScrap.Where((SpawnableItemWithRarity item) => item.spawnableItem.itemId != 152767 && item.spawnableItem.minValue >= Plugin.scrapValueMin.Value && item.spawnableItem.maxValue <= Plugin.scrapValueMax.Value && item.rarity >= Plugin.scrapRarityMin.Value && item.rarity <= Plugin.scrapRarityMax.Value).ToList();
}
return _filteredScrapItems;
}
set
{
if (value == null)
{
_filteredScrapItems.Clear();
}
else
{
_filteredScrapItems = value;
}
}
}
internal static List<double> filteredScrapItemWeights
{
get
{
_ = filteredScrapItems;
if (_filteredScrapItemWeights.Count == 0)
{
_filteredScrapItemWeights = _filteredScrapItems.Select((SpawnableItemWithRarity item) => Math.Pow((double)(item.spawnableItem.minValue + item.spawnableItem.maxValue) / 2.0, (double)Plugin.scrapValueInfluence.Value / 100.0) + Math.Pow(item.rarity, (double)Plugin.scrapRarityInfluence.Value / 100.0)).ToList();
}
return _filteredScrapItemWeights;
}
set
{
if (value == null)
{
_filteredScrapItemWeights.Clear();
}
else
{
_filteredScrapItemWeights = value;
}
}
}
internal static bool InsertObjectInPresentAndScrapValue(GiftBoxItem giftbox, Random giftboxBehaviorSeed, Random valueBehaviorSeed)
{
int randomWeightedIndex = Probability.GetRandomWeightedIndex(giftboxBehaviors, giftboxBehaviorSeed);
giftbox.objectInPresentValue = -1;
switch (randomWeightedIndex)
{
case 0:
return false;
case 1:
{
int randomWeightedIndex3 = Probability.GetRandomWeightedIndex(filteredStoreItemWeights, giftboxBehaviorSeed);
if (randomWeightedIndex3 != -1)
{
giftbox.objectInPresentItem = filteredStoreItems[randomWeightedIndex3];
giftbox.objectInPresent = giftbox.objectInPresentItem.spawnPrefab;
}
break;
}
case 3:
giftbox.objectInPresentItem = ((GrabbableObject)giftbox).itemProperties;
giftbox.objectInPresent = ((GrabbableObject)giftbox).itemProperties.spawnPrefab;
goto case 2;
case 2:
if (randomWeightedIndex == 2)
{
int randomWeightedIndex2 = Probability.GetRandomWeightedIndex(filteredScrapItemWeights, giftboxBehaviorSeed);
if (randomWeightedIndex2 == -1)
{
break;
}
giftbox.objectInPresentItem = filteredScrapItems[randomWeightedIndex2].spawnableItem;
giftbox.objectInPresent = giftbox.objectInPresentItem.spawnPrefab;
}
giftbox.objectInPresentValue = valueBehaviorSeed.Next(giftbox.objectInPresentItem.minValue, giftbox.objectInPresentItem.maxValue);
if (valueBehaviorSeed.Next(0, 100) < Plugin.scrapValueIsGiftBoxChance.Value)
{
giftbox.objectInPresentValue = -2;
break;
}
if (valueBehaviorSeed.Next(0, 100) < Plugin.scrapValueAdditionChance.Value)
{
giftbox.objectInPresentValue += valueBehaviorSeed.Next(Plugin.scrapValueAdditionMin.Value, Plugin.scrapValueAdditionMax.Value + 1);
}
if (valueBehaviorSeed.Next(0, 100) < Plugin.scrapValueMultiplierChance.Value)
{
giftbox.objectInPresentValue = (int)((double)giftbox.objectInPresentValue * ((double)Plugin.scrapValueMultiplierMin.Value + (double)(Plugin.scrapValueMultiplierMax.Value - Plugin.scrapValueMultiplierMin.Value) * valueBehaviorSeed.NextDouble()) / 100.0);
}
giftbox.objectInPresentValue = -Math.Max(0, (int)((float)giftbox.objectInPresentValue * RoundManager.Instance.scrapValueMultiplier)) - 100;
break;
default:
throw new Exception("[Patches.GiftBoxItemPatches.GiftBoxItemPatch.InsertObjectInPresentAndScrapValue] Giftbox Behavior selection failed! This should never happen!");
case 4:
break;
}
return true;
}
[HarmonyPatch("Start")]
[HarmonyTranspiler]
internal static IEnumerable<CodeInstruction> Start(IEnumerable<CodeInstruction> methodIL)
{
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Expected O, but got Unknown
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_012f: Expected O, but got Unknown
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0145: Expected O, but got Unknown
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Expected O, but got Unknown
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
//IL_0171: Expected O, but got Unknown
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Expected O, but got Unknown
if (Plugin.giftBoxMechanicsDisabled.Value)
{
return methodIL;
}
filteredStoreItems = null;
filteredScrapItems = null;
giftboxBehaviors[0] = Plugin.doNothingChance.Value;
giftboxBehaviors[1] = Plugin.spawnStoreItemChance.Value;
giftboxBehaviors[2] = Plugin.spawnScrapChance.Value;
giftboxBehaviors[3] = Plugin.spawnGiftBoxChance.Value;
giftboxBehaviors[4] = Plugin.spawnNothingChance.Value;
List<CodeInstruction> codes = new List<CodeInstruction>(methodIL);
int index = 0;
MethodInfo findValue = typeof(NetworkBehaviour).GetMethod("get_IsServer", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) ?? throw new Exception("[Patches.GiftBoxItemPatches.GiftBoxItemPatch.Start] NetworkBehaviour.get_IsServer() MethodInfo not accessible");
ILTools.FindCodeInstruction(ref index, ref codes, findValue, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.Start] method_get_IsServer not found");
ILTools.FindCodeInstruction(ref index, ref codes, OpCodes.Brfalse, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.Start] OpCodes.Brfalse not found");
MethodInfo methodInfo = typeof(GiftBoxItemPatch).GetMethod("InsertObjectInPresentAndScrapValue", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) ?? throw new Exception("[Patches.GiftBoxItemPatches.GiftBoxItemPatch.Start] GiftBoxItemPatch.InsertObjectInPresentAndScrapValue() MethodInfo not accessible");
codes.Insert(index++, new CodeInstruction(OpCodes.Ldarg_0, (object)null));
codes.Insert(index++, new CodeInstruction(OpCodes.Ldloc_0, (object)null));
codes.Insert(index++, new CodeInstruction(OpCodes.Ldloc_1, (object)null));
codes.Insert(index++, new CodeInstruction(OpCodes.Call, (object)methodInfo));
codes.Insert(index++, new CodeInstruction(OpCodes.Not, (object)null));
codes.Insert(index++, new CodeInstruction(OpCodes.And, (object)null));
return codes.AsEnumerable();
}
internal static bool OverrideOpenGiftBox(GiftBoxItem giftbox)
{
if (giftbox.objectInPresentValue >= 0)
{
return false;
}
switch (giftbox.objectInPresentValue)
{
case -2:
giftbox.objectInPresentValue = ((GrabbableObject)giftbox).scrapValue;
break;
default:
giftbox.objectInPresentValue = -(giftbox.objectInPresentValue + 100);
break;
case -1:
break;
}
SpawnGiftItem(giftbox);
return true;
}
[HarmonyPatch("OpenGiftBoxServerRpc")]
[HarmonyReversePatch(/*Could not decode attribute arguments.*/)]
internal static void SpawnGiftItem(GiftBoxItem giftbox)
{
Transpiler(null, null);
static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> methodIL, ILGenerator generator)
{
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Expected O, but got Unknown
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Expected O, but got Unknown
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Expected O, but got Unknown
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: Expected O, but got Unknown
if (Plugin.giftBoxMechanicsDisabled.Value)
{
return methodIL;
}
List<CodeInstruction> codes = new List<CodeInstruction>(methodIL);
int index = 0;
MethodInfo findValue = typeof(Vector3).GetMethod("get_zero", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) ?? throw new Exception("[Patches.GiftBoxItemPatches.GiftBoxItemPatch.SpawnGiftItem] Vector3.get_zero() MethodInfo not accessible");
ILTools.FindCodeInstruction(ref index, ref codes, findValue, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.SpawnGiftItem] method_get_zero not found");
ILTools.FindCodeInstruction(ref index, ref codes, OpCodes.Ldnull, reverse: true, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.SpawnGiftItem] OpCodes.Ldnull not found");
codes.RemoveRange(0, index);
index = 0;
ILTools.FindCodeInstruction(ref index, ref codes, "Error: There is no object in gift box!", reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.SpawnGiftItem] \"no object\" error message not found");
codes.RemoveRange(index, 2);
ILTools.FindCodeInstruction(ref index, ref codes, 1, instructionIsStore: true, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.SpawnGiftItem] Store Local 1 (num) not found");
ILTools.FindCodeInstruction(ref index, ref codes, 4, instructionIsStore: false, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.SpawnGiftItem] 1st Load Local 4 (component) not found");
Label label = generator.DefineLabel();
codes.Insert(index++, new CodeInstruction(OpCodes.Ldloc_1, (object)null));
codes.Insert(index++, new CodeInstruction(OpCodes.Ldc_I4_0, (object)null));
codes.Insert(index++, new CodeInstruction(OpCodes.Blt, (object)label));
index++;
ILTools.FindCodeInstruction(ref index, ref codes, 4, instructionIsStore: false, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.SpawnGiftItem] 2nd Load Local 4 (component) not found");
codes.Insert(index, new CodeInstruction(OpCodes.Nop, (object)null));
codes[index].labels.Add(label);
return codes;
}
}
[HarmonyPatch("OpenGiftBoxServerRpc")]
[HarmonyTranspiler]
internal static IEnumerable<CodeInstruction> OpenGiftBoxServerRpc(IEnumerable<CodeInstruction> methodIL, ILGenerator generator)
{
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Expected O, but got Unknown
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Expected O, but got Unknown
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_00f9: Expected O, but got Unknown
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Expected O, but got Unknown
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Expected O, but got Unknown
if (Plugin.giftBoxMechanicsDisabled.Value)
{
return methodIL;
}
List<CodeInstruction> codes = new List<CodeInstruction>(methodIL);
int index = 0;
FieldInfo fieldInfo = typeof(NetworkBehaviour).GetField("__rpc_exec_stage", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) ?? throw new Exception("[Patches.GiftBoxItemPatches.GiftBoxItemPatch.OpenGiftBoxServerRpc] NetworkBehaviour.__rpc_exec_stage FieldInfo not accessible");
ILTools.FindCodeInstruction(ref index, ref codes, fieldInfo, instructionIsStore: false, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.OpenGiftBoxServerRpc] 1st field___rpc_exec_stage not found");
index++;
ILTools.FindCodeInstruction(ref index, ref codes, fieldInfo, instructionIsStore: false, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.OpenGiftBoxServerRpc] 2nd field___rpc_exec_stage not found");
ILTools.FindCodeInstruction(ref index, ref codes, OpCodes.Nop, reverse: false, "[Patches.GiftBoxItemPatches.GiftBoxItemPatch.OpenGiftBoxServerRpc] OpCodes.Nop not found");
index++;
Label label = generator.DefineLabel();
MethodInfo methodInfo = typeof(GiftBoxItemPatch).GetMethod("OverrideOpenGiftBox", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) ?? throw new Exception("[Patches.GiftBoxItemPatches.GiftBoxItemPatch.OpenGiftBoxServerRpc] GiftBoxItemPatch.OverrideOpenGiftBox() MethodInfo not accessible");
codes.Insert(index++, new CodeInstruction(OpCodes.Ldarg_0, (object)null));
codes.Insert(index++, new CodeInstruction(OpCodes.Call, (object)methodInfo));
codes.Insert(index++, new CodeInstruction(OpCodes.Brfalse, (object)label));
codes.Insert(index++, new CodeInstruction(OpCodes.Ret, (object)null));
codes.Insert(index, new CodeInstruction(OpCodes.Nop, (object)null));
codes[index].labels.Add(label);
return codes.AsEnumerable();
}
}
}
namespace LC_GiftBox_Config.libs.ReflectionsAccess
{
public static class ReflectionsAccess
{
public static object CallMethod(this object methodHolder, string methodName, params object[] args)
{
MethodInfo methodInfo = methodHolder.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic) ?? throw new ArgumentException($"[libs.ReflectionsAccess.CallMethod] Couldn't call nonpublic method {methodHolder}.{methodName}");
Plugin.Log((LogLevel)32, $"[libs.ReflectionsAccess.CallMethod] Calling nonpublic method {methodHolder}.{methodName}");
return methodInfo.Invoke(methodHolder, args);
}
public static T GetFieldValue<T>(object fieldHolder, string fieldName)
{
FieldInfo fieldInfo = fieldHolder.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic) ?? throw new ArgumentException($"[libs.ReflectionsAccess.GetFieldValue] Field {fieldHolder}.{fieldName} not found!");
T val = (T)fieldInfo.GetValue(fieldHolder);
Plugin.Log((LogLevel)32, $"[libs.ReflectionsAccess.GetFieldValue] Field {fieldHolder}.{fieldName} found, returning {val}");
return val;
}
public static void SetFieldValue(object fieldHolder, string fieldName, object fieldValue)
{
FieldInfo fieldInfo = fieldHolder.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic) ?? throw new ArgumentException($"[libs.ReflectionsAccess.SetFieldValue] Field {fieldHolder}.{fieldName} not found!");
Plugin.Log((LogLevel)32, $"[libs.ReflectionsAccess.SetFieldValue] Field {fieldHolder}.{fieldName} found, assigning to {fieldValue}");
fieldInfo.SetValue(fieldHolder, fieldValue);
}
}
}
namespace LC_GiftBox_Config.libs.Probability
{
public static class Probability
{
public static int GetRandomWeightedIndex(List<double> weights, Random? randomSeed = null)
{
if (weights == null || weights.Count == 0)
{
Plugin.Log((LogLevel)4, "[libs.Probability.GetRandomWeightedIndex] Could not get random weighted index; list is empty or null.");
return -1;
}
if (weights.Any((double weight) => weight < 0.0))
{
Plugin.Log((LogLevel)4, "[libs.Probability.GetRandomWeightedIndex] Could not get random weighted index; list contains negative weights.");
return -1;
}
if (randomSeed == null)
{
randomSeed = new Random();
}
double num = weights.Sum();
if (num <= 0.0)
{
return randomSeed.Next(0, weights.Count);
}
double randomValue = randomSeed.NextDouble() * weights.Sum();
double accumulatedValue = 0.0;
return weights.FindIndex((double weight) => (accumulatedValue += weight) >= randomValue);
}
public static int GetRandomWeightedIndex(List<int> weights, Random? randomSeed = null)
{
if (weights == null || weights.Count == 0)
{
Plugin.Log((LogLevel)4, "[libs.Probability.GetRandomWeightedIndex] Could not get random weighted index; list is empty or null.");
return -1;
}
if (weights.Any((int weight) => weight < 0))
{
Plugin.Log((LogLevel)4, "[libs.Probability.GetRandomWeightedIndex] Could not get random weighted index; list contains negative weights.");
return -1;
}
if (randomSeed == null)
{
randomSeed = new Random();
}
int num = weights.Sum();
if (num <= 0)
{
return randomSeed.Next(0, weights.Count);
}
int randomValue = randomSeed.Next(0, num);
int accumulatedValue = 0;
return weights.FindIndex((int weight) => (accumulatedValue += weight) >= randomValue);
}
}
}
namespace LC_GiftBox_Config.libs.LethalConfigNicerizer
{
internal static class LethalConfigNicerizer
{
internal const string LethalConfig_GUID = "ainavt.lc.lethalconfig";
internal static bool CanHasNicerizationPlease => Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig");
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
internal static ConfigEntry<T> Nicerize<T>(ConfigEntry<T> entry, bool restartRequired = false)
{
if (entry is ConfigEntry<int>)
{
if (CanHasNicerizationPlease)
{
AddConfigItem(entry as ConfigEntry<int>, restartRequired);
}
}
else if (entry is ConfigEntry<float>)
{
if (CanHasNicerizationPlease)
{
AddConfigItem(entry as ConfigEntry<float>, restartRequired);
}
}
else if (entry is ConfigEntry<bool>)
{
if (CanHasNicerizationPlease)
{
AddConfigItem(entry as ConfigEntry<bool>, restartRequired);
}
}
else if (entry is ConfigEntry<string>)
{
if (CanHasNicerizationPlease)
{
AddConfigItem(entry as ConfigEntry<string>, restartRequired);
}
}
else
{
if (!(entry is ConfigEntry<Enum>))
{
throw new ArgumentException($"[libs.LethalConfigNicerizer.Nicerize] Cannot Nicerize ConfigEntry<{typeof(T)}>!");
}
if (CanHasNicerizationPlease)
{
AddConfigItem(entry as ConfigEntry<Enum>, restartRequired);
}
}
return entry;
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
internal static void AddConfigItem(ConfigEntry<int> entry, bool restartRequired = false)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Expected O, but got Unknown
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Expected O, but got Unknown
if (((ConfigEntryBase)entry).Description.AcceptableValues != null)
{
LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(entry, restartRequired));
}
else
{
LethalConfigManager.AddConfigItem((BaseConfigItem)new IntInputFieldConfigItem(entry, restartRequired));
}
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
internal static void AddConfigItem(ConfigEntry<float> entry, bool restartRequired = false)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Expected O, but got Unknown
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Expected O, but got Unknown
if (((ConfigEntryBase)entry).Description.AcceptableValues != null)
{
LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(entry, restartRequired));
}
else
{
LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatInputFieldConfigItem(entry, restartRequired));
}
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
internal static void AddConfigItem(ConfigEntry<bool> entry, bool restartRequired = false)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(entry, restartRequired));
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
internal static void AddConfigItem(ConfigEntry<string> entry, bool restartRequired = false)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Expected O, but got Unknown
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Expected O, but got Unknown
if (((ConfigEntryBase)entry).Description.AcceptableValues != null)
{
LethalConfigManager.AddConfigItem((BaseConfigItem)new TextDropDownConfigItem(entry, restartRequired));
}
else
{
LethalConfigManager.AddConfigItem((BaseConfigItem)new TextInputFieldConfigItem(entry, restartRequired));
}
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
internal static void AddConfigItem(ConfigEntry<Enum> entry, bool restartRequired = false)
{
LethalConfigManager.AddConfigItem((BaseConfigItem)(object)new EnumDropDownConfigItem<Enum>(entry, restartRequired));
}
}
}
namespace LC_GiftBox_Config.libs.ILTools
{
public static class ILTools
{
private static readonly OpCode[] ArgumentedLoadLocalCodeInstructions = new OpCode[2]
{
OpCodes.Ldloc,
OpCodes.Ldloc_S
};
private static readonly OpCode[] ArgumentedStoreLocalCodeInstructions = new OpCode[2]
{
OpCodes.Stloc,
OpCodes.Stloc_S
};
private static readonly OpCode[] ArgumentedIntegerCodeInstructions = new OpCode[3]
{
OpCodes.Ldc_I4,
OpCodes.Ldc_I4_S,
OpCodes.Ldc_I8
};
private static readonly OpCode[] ArgumentedFloatCodeInstructions = new OpCode[2]
{
OpCodes.Ldc_R4,
OpCodes.Ldc_R8
};
public static bool FindCodeInstruction(ref int index, ref List<CodeInstruction> codes, object findValue, bool reverse = false, string? errorMessage = "Not found")
{
index = Math.Clamp(index, 0, codes.Count);
while (index >= 0 && index < codes.Count)
{
if (CheckCodeInstruction(codes[index], findValue))
{
return true;
}
index += ((!reverse) ? 1 : (-1));
}
if (errorMessage != null)
{
throw new Exception($"[libs.ILTools.FindCodeInstruction] [{findValue}] | {errorMessage}");
}
return false;
}
public static bool FindCodeInstruction(ref int index, ref List<CodeInstruction> codes, short localIndex, bool instructionIsStore = false, bool reverse = false, string? errorMessage = "Not found")
{
index = Math.Clamp(index, 0, codes.Count);
while (index >= 0 && index < codes.Count)
{
if (CheckCodeInstruction(codes[index], localIndex, instructionIsStore))
{
return true;
}
index += ((!reverse) ? 1 : (-1));
}
if (errorMessage != null)
{
throw new Exception($"[libs.ILTools.FindCodeInstruction] {{{localIndex}, {instructionIsStore}}}] | {errorMessage}");
}
return false;
}
public static bool FindCodeInstruction(ref int index, ref List<CodeInstruction> codes, FieldInfo fieldInfo, bool instructionIsStore = false, bool reverse = false, string? errorMessage = "Not found")
{
index = Math.Clamp(index, 0, codes.Count);
while (index >= 0 && index < codes.Count)
{
if (CheckCodeInstruction(codes[index], fieldInfo, instructionIsStore))
{
return true;
}
index += ((!reverse) ? 1 : (-1));
}
if (errorMessage != null)
{
throw new Exception($"[libs.ILTools.FindCodeInstruction] {{{fieldInfo}, {instructionIsStore}}}] | {errorMessage}");
}
return false;
}
private static bool CheckCodeInstruction(CodeInstruction code, int localIndex, bool instructionIsStore)
{
if (!instructionIsStore)
{
bool result;
if (ArgumentedLoadLocalCodeInstructions.Contains(code.opcode))
{
LocalBuilder obj = code.operand as LocalBuilder;
result = obj != null && obj.LocalIndex == localIndex;
}
else
{
result = localIndex switch
{
0 => code.opcode == OpCodes.Ldloc_0,
1 => code.opcode == OpCodes.Ldloc_1,
2 => code.opcode == OpCodes.Ldloc_2,
3 => code.opcode == OpCodes.Ldloc_3,
_ => false,
};
}
return result;
}
bool result2;
if (ArgumentedStoreLocalCodeInstructions.Contains(code.opcode))
{
LocalBuilder obj2 = code.operand as LocalBuilder;
result2 = obj2 != null && obj2.LocalIndex == localIndex;
}
else
{
result2 = localIndex switch
{
0 => code.opcode == OpCodes.Stloc_0,
1 => code.opcode == OpCodes.Stloc_1,
2 => code.opcode == OpCodes.Stloc_2,
3 => code.opcode == OpCodes.Stloc_3,
_ => false,
};
}
return result2;
}
private static bool CheckCodeInstruction(CodeInstruction code, FieldInfo fieldInfo, bool instructionIsStore)
{
if (!instructionIsStore)
{
return (code.opcode == OpCodes.Ldfld || code.opcode == OpCodes.Ldsfld) && (FieldInfo)code.operand == fieldInfo;
}
return (code.opcode == OpCodes.Stfld || code.opcode == OpCodes.Stsfld) && (FieldInfo)code.operand == fieldInfo;
}
private static bool CheckCodeInstruction(CodeInstruction code, object findValue)
{
if (findValue == null)
{
throw new ArgumentNullException("CheckCodeInstruction(code, findValue) findValue should not be null; use CheckCodeInstruction(code, OpCodes.Ldnull) if searching for null");
}
if (findValue is byte || findValue is sbyte || findValue is short || findValue is ushort || findValue is int || findValue is uint || findValue is long || findValue is ulong)
{
return CheckIntegerCodeInstruction(code, findValue);
}
if (findValue is float || findValue is double || findValue is decimal)
{
return CheckFloatCodeInstruction(code, findValue);
}
if (findValue is string)
{
if (code.opcode == OpCodes.Ldstr)
{
return code.operand.Equals(findValue);
}
return false;
}
if (findValue is MethodInfo)
{
if (code.opcode == OpCodes.Call || code.opcode == OpCodes.Callvirt)
{
return code.operand == findValue;
}
return false;
}
if (findValue is OpCode)
{
return code.opcode == (OpCode)findValue;
}
if (findValue is FieldInfo)
{
throw new ArgumentException("CheckCodeInstruction(code, findValue) findValue should not be FieldInfo; use CheckCodeInstruction(code, fieldInfo, instructionIsStore) instead");
}
return false;
}
private static bool CheckIntegerCodeInstruction(CodeInstruction code, object findValue)
{
if (ArgumentedIntegerCodeInstructions.Contains(code.opcode))
{
return code.operand == findValue;
}
if (findValue is ulong num && num > 8)
{
return false;
}
long num2 = (long)findValue;
long num3 = num2 - -1;
if ((ulong)num3 <= 9uL)
{
switch (num3)
{
case 1L:
return code.opcode == OpCodes.Ldc_I4_0;
case 2L:
return code.opcode == OpCodes.Ldc_I4_1;
case 3L:
return code.opcode == OpCodes.Ldc_I4_2;
case 4L:
return code.opcode == OpCodes.Ldc_I4_3;
case 5L:
return code.opcode == OpCodes.Ldc_I4_4;
case 6L:
return code.opcode == OpCodes.Ldc_I4_5;
case 7L:
return code.opcode == OpCodes.Ldc_I4_6;
case 8L:
return code.opcode == OpCodes.Ldc_I4_7;
case 9L:
return code.opcode == OpCodes.Ldc_I4_8;
case 0L:
return code.opcode == OpCodes.Ldc_I4_M1;
}
}
return false;
}
private static bool CheckFloatCodeInstruction(CodeInstruction code, object findValue)
{
if (ArgumentedFloatCodeInstructions.Contains(code.opcode))
{
return code.operand == findValue;
}
return false;
}
}
}