Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of NoMoreMath v2.1.2
plugins/NoMoreMath/NoMoreMath.dll
Decompiled 4 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.ShrineHalcyonite; using HG; using HG.Reflection; using IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Collections.Generic; using MonoMod.Cil; using MonoMod.RuntimeDetour; using MonoMod.Utils; using NoMoreMath.Config; using NoMoreMath.EffectiveCost; using NoMoreMath.EffectiveHealth; using NoMoreMath.HalcyonBeacon; using NoMoreMath.HalcyonShrine; using NoMoreMath.HoldoutZone; using NoMoreMath.MiscPatches; using NoMoreMath.ModCompatibility; using NoMoreMath.ShrineBlood; using NoMoreMath.ShrineChance; using NoMoreMath.Utils; using On.RoR2; using On.RoR2.UI; using R2API.Utils; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.UI; using TMPro; using Unity; using UnityEngine; using UnityEngine.Networking; [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("NoMoreMath")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyConfiguration("Release")] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: NetworkCompatibility(/*Could not decode attribute arguments.*/)] [assembly: AssemblyTitle("NoMoreMath")] [assembly: AssemblyProduct("NoMoreMath")] [assembly: AssemblyInformationalVersion("1.0.0+42b951f23a4ba7a53b6d3bc2cf96c934839df550")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [Microsoft.CodeAnalysis.Embedded] [CompilerGenerated] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] [Microsoft.CodeAnalysis.Embedded] [CompilerGenerated] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace NoMoreMath { internal static class Log { private static readonly StringBuilder _sharedStringBuilder; private static readonly object _stringBuilderLock; private static readonly int _cachedCallerPathPrefixLength; private static ManualLogSource _logSource; static Log() { _sharedStringBuilder = new StringBuilder(256); _stringBuilderLock = new object(); _cachedCallerPathPrefixLength = getCallerPathPrefixLength("X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\Log.cs"); static int getCallerPathPrefixLength([CallerFilePath] string callerPath = null) { int num = callerPath.LastIndexOf("NoMoreMath\\"); if (num >= 0) { return num + "NoMoreMath\\".Length; } Debug.LogError((object)"[NoMoreMath] Logger failed to determine caller path prefix length"); return 0; } } internal static void Init(ManualLogSource logSource) { _logSource = logSource; } private static string buildCallerLogString(string callerPath, string callerMemberName, int callerLineNumber, object data) { lock (_stringBuilderLock) { return _sharedStringBuilder.Clear().Append(callerPath, _cachedCallerPathPrefixLength, callerPath.Length - _cachedCallerPathPrefixLength).Append(':') .Append(callerLineNumber) .Append(" (") .Append(callerMemberName) .Append("): ") .Append(data) .ToString(); } } [Conditional("DEBUG")] internal static void Debug(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogDebug((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [Conditional("DEBUG")] internal static void Debug_NoCallerPrefix(object data) { _logSource.LogDebug(data); } internal static void Error(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogError((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Error_NoCallerPrefix(object data) { _logSource.LogError(data); } internal static void Fatal(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogFatal((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Fatal_NoCallerPrefix(object data) { _logSource.LogFatal(data); } internal static void Info(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogInfo((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Info_NoCallerPrefix(object data) { _logSource.LogInfo(data); } internal static void Message(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogMessage((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Message_NoCallerPrefix(object data) { _logSource.LogMessage(data); } internal static void Warning(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogWarning((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Warning_NoCallerPrefix(object data) { _logSource.LogWarning(data); } internal static void LogType(LogLevel level, object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) if ((level & 0x20) == 0) { _logSource.Log(level, (object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void LogType_NoCallerPrefix(LogLevel level, object data) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) if ((level & 0x20) == 0) { _logSource.Log(level, data); } } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Gorakh.NoMoreMath", "NoMoreMath", "2.1.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class NoMoreMathPlugin : BaseUnityPlugin { public const string PluginGUID = "Gorakh.NoMoreMath"; public const string PluginAuthor = "Gorakh"; public const string PluginName = "NoMoreMath"; public const string PluginVersion = "2.1.2"; internal static NoMoreMathPlugin Instance { get; private set; } private void Awake() { Stopwatch stopwatch = Stopwatch.StartNew(); Instance = SingletonHelper.Assign<NoMoreMathPlugin>(Instance, this); Log.Init(((BaseUnityPlugin)this).Logger); Configs.Init(((BaseUnityPlugin)this).Config); if (RiskOfOptionsCompat.Enabled) { RiskOfOptionsCompat.Init(); } stopwatch.Stop(); Log.Message_NoCallerPrefix($"Initialized in {stopwatch.Elapsed.TotalMilliseconds:F0}ms"); } private void OnDestroy() { Instance = SingletonHelper.Unassign<NoMoreMathPlugin>(Instance, this); } } } namespace NoMoreMath.Utils { public interface ICachableComponent { int? DictionaryKey { get; set; } } public sealed class ObjectComponentCache<THostComponent, TCachedComponent> where THostComponent : Component where TCachedComponent : MonoBehaviour, ICachableComponent { private readonly Dictionary<int, TCachedComponent> _componentDictionary = new Dictionary<int, TCachedComponent>(); private int getDictionaryKey(THostComponent host) { return ((Object)(object)host).GetInstanceID(); } public bool TryGetComponent(THostComponent host, out TCachedComponent component) { if (!Object.op_Implicit((Object)(object)host)) { component = default(TCachedComponent); return false; } return _componentDictionary.TryGetValue(getDictionaryKey(host), out component); } public TCachedComponent GetOrAddComponent(THostComponent host) { if (!Object.op_Implicit((Object)(object)host)) { return default(TCachedComponent); } int dictionaryKey = getDictionaryKey(host); if (_componentDictionary.TryGetValue(dictionaryKey, out var value)) { return value; } value = ((Component)host).GetComponent<TCachedComponent>(); if (!Object.op_Implicit((Object)(object)value)) { value = ((Component)host).gameObject.AddComponent<TCachedComponent>(); } value.DictionaryKey = dictionaryKey; _componentDictionary.Add(dictionaryKey, value); return value; } public void OnDestroyed(TCachedComponent component) { if (component.DictionaryKey.HasValue) { _componentDictionary.Remove(component.DictionaryKey.Value); } } } public sealed class TrackedValue<T> { public delegate void ValueChangedDelegate(T oldValue, T newValue); private T _value; public IEqualityComparer<T> EqualityComparer { get; set; } public T Value { get { return _value; } set { if (!EqualityComparer.Equals(_value, value)) { T value2 = _value; _value = value; this.OnValueChanged?.Invoke(value2, _value); } } } public event ValueChangedDelegate OnValueChanged; public TrackedValue(T value) : this(value, (IEqualityComparer<T>)EqualityComparer<T>.Default) { } public TrackedValue(T value, IEqualityComparer<T> equalityComparer) { _value = value; EqualityComparer = equalityComparer ?? throw new ArgumentNullException("equalityComparer"); } public bool Push(T value) { if (EqualityComparer.Equals(_value, value)) { return false; } Value = value; return true; } } public sealed class UnityObjectComparer : IEqualityComparer<Object> { public static readonly UnityObjectComparer Instance = new UnityObjectComparer(); private UnityObjectComparer() { } public bool Equals(Object x, Object y) { return x == y; } public int GetHashCode(Object obj) { return ((object)obj).GetHashCode(); } } } namespace NoMoreMath.ShrineChance { internal static class ShrineChanceActivationCountDisplay { private static bool _eventListenerActive; private static bool eventListenerActive { get { return _eventListenerActive; } set { if (_eventListenerActive != value) { _eventListenerActive = value; if (_eventListenerActive) { PurchaseInteractionHooks.ModifyName += PurchaseInteractionHooks_ModifyName; } else { PurchaseInteractionHooks.ModifyName -= PurchaseInteractionHooks_ModifyName; } } } } private static void refreshEventListenerActive() { eventListenerActive = Configs.ShrineChance.EnableActivationCountDisplay.Value; } [SystemInitializer(new Type[] { })] private static void Init() { Configs.ShrineChance.EnableActivationCountDisplay.SettingChanged += DisplayActivationCountEnabled_SettingChanged; refreshEventListenerActive(); } private static void DisplayActivationCountEnabled_SettingChanged(object sender, EventArgs e) { refreshEventListenerActive(); } private static void PurchaseInteractionHooks_ModifyName(PurchaseInteraction purchaseInteraction, CharacterMaster viewer, StringBuilder nameBuilder) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 //IL_0036: Unknown result type (might be due to invalid IL or missing references) ShrineChanceBehavior val = default(ShrineChanceBehavior); if (!Object.op_Implicit((Object)(object)purchaseInteraction) || !Object.op_Implicit((Object)(object)viewer) || purchaseInteraction.cost <= 0 || (int)purchaseInteraction.costType != 1 || !((Component)purchaseInteraction).TryGetComponent<ShrineChanceBehavior>(ref val)) { return; } ShrineChanceConfig shrineChance = Configs.ShrineChance; CostTypeDef costTypeDef = CostTypeCatalog.GetCostTypeDef(purchaseInteraction.costType); int num = purchaseInteraction.cost; int num2 = TeamManager.LongstandingSolitudesInParty(); if (num2 > 0) { num *= 1 + num2; } byte b = 0; uint num3 = viewer.money; if (num3 >= num) { for (b = 0; b <= 10; b++) { uint effectiveCost = (uint)EffectiveCostUtils.GetEffectiveCost(costTypeDef, num, viewer); if (num3 < effectiveCost) { break; } num3 -= effectiveCost; num = (int)((float)num * val.costMultiplierPerPurchase); } } string text = ((b <= 10) ? b.ToString() : "10+"); nameBuilder.EnsureCapacity(nameBuilder.Length + shrineChance.ActivationCountDisplayFormatter.StrippedLength + text.Length + 1); nameBuilder.Append(' '); shrineChance.ActivationCountDisplayFormatter.AppendToStringBuilder(nameBuilder, new TagReplacementStringConfig.ReplacementInfo("{activations}", text)); } } public sealed class ShrineChanceConfig { public readonly ConfigEntry<bool> EnableActivationCountDisplay; public const string ACTIVATION_COUNT_DISPLAY_COUNT_TAG = "{activations}"; public readonly TagReplacementStringConfig ActivationCountDisplayFormatter; public ShrineChanceConfig(in ConfigContext context) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown EnableActivationCountDisplay = context.Bind("Display Activation Count", defaultValue: true, new ConfigDescription("Displays how many activations of a shrine you can afford.", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> configEntry = context.Bind("Shrine Activation Count Display Format", "<size=80%><nobr>({activations} activation(s))</nobr></size>", new ConfigDescription("The format that will be used to display the affordable activations remaining.\r\n\r\nAll instances of '{activations}' (braces included!) will be replaced with the number of times you can purchase the shrine before running out of money.", (AcceptableValueBase)null, Array.Empty<object>())); ActivationCountDisplayFormatter = new TagReplacementStringConfig(configEntry, new string[1] { "{activations}" }); } } } namespace NoMoreMath.ShrineBlood { public sealed class ShrineBloodConfig { public readonly ConfigEntry<bool> EnableGoldGainedDisplay; public const string GOLD_GAINED_DISPLAY_AMOUNT_TAG = "{amount}"; public readonly TagReplacementStringConfig GoldGainedDisplayFormatter; public ShrineBloodConfig(in ConfigContext context) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown EnableGoldGainedDisplay = context.Bind("Display Gold Amount", defaultValue: true, new ConfigDescription("If the amount of money that will be granted from a Blood Shrine is displayed", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> configEntry = context.Bind("Gold Amount Display Format", "(+<style=cShrine>${amount}</style>)", new ConfigDescription("The format that will be used to display the amount of money gained.\r\n\r\nAll instances of '{amount}' (braces included!) will be replaced with the amount of money gained.", (AcceptableValueBase)null, Array.Empty<object>())); GoldGainedDisplayFormatter = new TagReplacementStringConfig(configEntry, new string[1] { "{amount}" }); } } internal static class ShrineBloodGoldGainDisplay { private static bool _eventListenerActive; private static bool eventListenerActive { get { return _eventListenerActive; } set { if (_eventListenerActive != value) { _eventListenerActive = value; if (_eventListenerActive) { PurchaseInteractionHooks.ModifyName += PurchaseInteractionHooks_ModifyName; } else { PurchaseInteractionHooks.ModifyName -= PurchaseInteractionHooks_ModifyName; } } } } private static void refreshEventListenerActive() { eventListenerActive = Configs.ShrineBlood.EnableGoldGainedDisplay.Value; } [SystemInitializer(new Type[] { })] private static void Init() { Configs.ShrineBlood.EnableGoldGainedDisplay.SettingChanged += EnableGoldGainedDisplay_SettingChanged; refreshEventListenerActive(); } private static void EnableGoldGainedDisplay_SettingChanged(object sender, EventArgs e) { refreshEventListenerActive(); } private static void PurchaseInteractionHooks_ModifyName(PurchaseInteraction purchaseInteraction, CharacterMaster viewer, StringBuilder nameBuilder) { if (!Object.op_Implicit((Object)(object)purchaseInteraction) || !Object.op_Implicit((Object)(object)viewer)) { return; } CharacterBody body = viewer.GetBody(); if (Object.op_Implicit((Object)(object)body)) { HealthComponent healthComponent = body.healthComponent; ShrineBloodBehavior val = default(ShrineBloodBehavior); if (Object.op_Implicit((Object)(object)healthComponent) && ((Component)purchaseInteraction).TryGetComponent<ShrineBloodBehavior>(ref val)) { ShrineBloodConfig shrineBlood = Configs.ShrineBlood; string text = ((uint)(healthComponent.fullCombinedHealth * (float)purchaseInteraction.cost / 100f * val.goldToPaidHpRatio)).ToString(); nameBuilder.EnsureCapacity(nameBuilder.Length + shrineBlood.GoldGainedDisplayFormatter.StrippedLength + text.Length + 1); nameBuilder.Append(' '); shrineBlood.GoldGainedDisplayFormatter.AppendToStringBuilder(nameBuilder, new TagReplacementStringConfig.ReplacementInfo("{amount}", text)); } } } } } namespace NoMoreMath.ModCompatibility { internal static class RiskOfOptionsCompat { private const string MOD_GUID = "Gorakh.NoMoreMath"; private const string MOD_NAME = "NoMoreMath"; private static Sprite _iconSprite; public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"); private static void findIconSprite() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) Sprite val = null; FileInfo fileInfo = null; DirectoryInfo directoryInfo = new DirectoryInfo(Path.GetDirectoryName(((BaseUnityPlugin)NoMoreMathPlugin.Instance).Info.Location)); do { FileInfo[] files = directoryInfo.GetFiles("icon.png", SearchOption.TopDirectoryOnly); if (files != null && files.Length != 0) { fileInfo = files[0]; break; } directoryInfo = directoryInfo.Parent; } while (directoryInfo != null && !string.Equals(directoryInfo.Name, "plugins", StringComparison.OrdinalIgnoreCase)); if (fileInfo != null) { Texture2D val2 = new Texture2D(256, 256); ((Object)val2).name = "texNoMoreMathIcon"; if (ImageConversion.LoadImage(val2, File.ReadAllBytes(fileInfo.FullName))) { val = Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), new Vector2(0.5f, 0.5f)); ((Object)val).name = "NoMoreMathIcon"; } } _iconSprite = val; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void Init() { if (!Object.op_Implicit((Object)(object)_iconSprite)) { findIconSprite(); } addEffectiveHealthOptions(Configs.EffectiveHealth); addEffectiveCostOptions(Configs.EffectiveCost); addHoldoutZoneOptions(Configs.HoldoutZone); addHalcyonShrineOptions(Configs.HalcyonShrine); addHalcyonBeaconOptions(Configs.HalcyonBeacon); addShrineChanceOptions(Configs.ShrineChance); addShrineBloodOptions(Configs.ShrineBlood); ModSettingsManager.SetModDescription("Options for NoMoreMath", "Gorakh.NoMoreMath", "NoMoreMath"); if (Object.op_Implicit((Object)(object)_iconSprite)) { ModSettingsManager.SetModIcon(_iconSprite, "Gorakh.NoMoreMath", "NoMoreMath"); } } private static void addOption(BaseOption option) { ModSettingsManager.AddOption(option, "Gorakh.NoMoreMath", "NoMoreMath"); } private static void addEffectiveHealthOptions(EffectiveHealthConfig effectiveHealthConfig) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown addOption((BaseOption)new CheckBoxOption(effectiveHealthConfig.Enabled)); IsDisabledDelegate isDisabled = new IsDisabledDelegate(isDisabledImpl); addOption((BaseOption)new StringInputFieldOption(effectiveHealthConfig.EffectiveHealthDisplayFormat.ConfigEntry, new InputFieldConfig { lineType = (LineType)0, richText = false, submitOn = (SubmitEnum)4, checkIfDisabled = isDisabled })); addDisplayOptions(effectiveHealthConfig.CurrentHealthDisplay); addDisplayOptions(effectiveHealthConfig.MaxHealthDisplay); void addDisplayOptions(EffectiveHealthDisplayConfig displayConfig) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown addOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)displayConfig.HealthDisplayPosition, new ChoiceConfig { checkIfDisabled = isDisabled })); } [MethodImpl(MethodImplOptions.AggressiveInlining)] bool isDisabledImpl() { return !effectiveHealthConfig.Enabled.Value; } } private static void addEffectiveCostOptions(EffectiveCostConfig effectiveCostConfig) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown addOption((BaseOption)new CheckBoxOption(effectiveCostConfig.Enabled)); IsDisabledDelegate checkIfDisabled = new IsDisabledDelegate(isDisabledImpl); addOption((BaseOption)new StringInputFieldOption(effectiveCostConfig.CostDisplayFormat.ConfigEntry, new InputFieldConfig { lineType = (LineType)0, richText = false, submitOn = (SubmitEnum)4, checkIfDisabled = checkIfDisabled })); [MethodImpl(MethodImplOptions.AggressiveInlining)] bool isDisabledImpl() { return !effectiveCostConfig.Enabled.Value; } } private static void addHoldoutZoneOptions(HoldoutZoneConfig holdoutZoneConfig) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown addOption((BaseOption)new CheckBoxOption(holdoutZoneConfig.EnableChargeTimeDisplay)); IsDisabledDelegate checkIfDisabled = new IsDisabledDelegate(chargeTimeIsDisabledImpl); addOption((BaseOption)new StringInputFieldOption(holdoutZoneConfig.TimeRemainingDisplayFormat.ConfigEntry, new InputFieldConfig { lineType = (LineType)0, richText = false, submitOn = (SubmitEnum)4, checkIfDisabled = checkIfDisabled })); [MethodImpl(MethodImplOptions.AggressiveInlining)] bool chargeTimeIsDisabledImpl() { return !holdoutZoneConfig.EnableChargeTimeDisplay.Value; } } private static void addHalcyonShrineOptions(HalcyonShrineConfig halcyonShrineConfig) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown addOption((BaseOption)new CheckBoxOption(halcyonShrineConfig.EnableProgressObjective)); IsDisabledDelegate checkIfDisabled = new IsDisabledDelegate(progressObjectiveIsDisabledImpl); addOption((BaseOption)new StringInputFieldOption(halcyonShrineConfig.ChargeProgressDisplayFormat.ConfigEntry, new InputFieldConfig { lineType = (LineType)0, richText = false, submitOn = (SubmitEnum)4, checkIfDisabled = checkIfDisabled })); [MethodImpl(MethodImplOptions.AggressiveInlining)] bool progressObjectiveIsDisabledImpl() { return !halcyonShrineConfig.EnableProgressObjective.Value; } } private static void addHalcyonBeaconOptions(HalcyonBeaconConfig halcyonBeaconConfig) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown addOption((BaseOption)new CheckBoxOption(halcyonBeaconConfig.EnableTotalCostDisplay)); IsDisabledDelegate checkIfDisabled = new IsDisabledDelegate(totalCostDisplayIsDisabledImpl); addOption((BaseOption)new StringInputFieldOption(halcyonBeaconConfig.TotalCostDisplayFormatter.ConfigEntry, new InputFieldConfig { lineType = (LineType)0, richText = false, submitOn = (SubmitEnum)4, checkIfDisabled = checkIfDisabled })); addOption((BaseOption)new ColorOption(halcyonBeaconConfig.TotalCostAffordableColor, new ColorOptionConfig { checkIfDisabled = checkIfDisabled })); addOption((BaseOption)new ColorOption(halcyonBeaconConfig.TotalCostNotAffordableColor, new ColorOptionConfig { checkIfDisabled = checkIfDisabled })); [MethodImpl(MethodImplOptions.AggressiveInlining)] bool totalCostDisplayIsDisabledImpl() { return !halcyonBeaconConfig.EnableTotalCostDisplay.Value; } } private static void addShrineChanceOptions(ShrineChanceConfig shrineChanceConfig) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown addOption((BaseOption)new CheckBoxOption(shrineChanceConfig.EnableActivationCountDisplay)); IsDisabledDelegate checkIfDisabled = new IsDisabledDelegate(activationCountDisplayIsDisabledImpl); addOption((BaseOption)new StringInputFieldOption(shrineChanceConfig.ActivationCountDisplayFormatter.ConfigEntry, new InputFieldConfig { lineType = (LineType)0, richText = false, submitOn = (SubmitEnum)4, checkIfDisabled = checkIfDisabled })); [MethodImpl(MethodImplOptions.AggressiveInlining)] bool activationCountDisplayIsDisabledImpl() { return !shrineChanceConfig.EnableActivationCountDisplay.Value; } } private static void addShrineBloodOptions(ShrineBloodConfig shrineBloodConfig) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown addOption((BaseOption)new CheckBoxOption(shrineBloodConfig.EnableGoldGainedDisplay)); IsDisabledDelegate checkIfDisabled = new IsDisabledDelegate(goldGainedDisplayIsDisabledImpl); addOption((BaseOption)new StringInputFieldOption(shrineBloodConfig.GoldGainedDisplayFormatter.ConfigEntry, new InputFieldConfig { lineType = (LineType)0, richText = false, submitOn = (SubmitEnum)4, checkIfDisabled = checkIfDisabled })); [MethodImpl(MethodImplOptions.AggressiveInlining)] bool goldGainedDisplayIsDisabledImpl() { return !shrineBloodConfig.EnableGoldGainedDisplay.Value; } } } } namespace NoMoreMath.MiscPatches { internal static class PurchaseInteractionHooks { public delegate void ModifyNameDelegate(PurchaseInteraction purchaseInteraction, CharacterMaster viewer, StringBuilder nameBuilder); [CompilerGenerated] private static class <>O { public static hook_GetDisplayName <0>__PurchaseInteraction_GetDisplayName; public static hook_GetContextString <1>__PurchaseInteraction_GetContextString; } private static readonly StringBuilder _sharedStringBuilder = new StringBuilder(); public static event ModifyNameDelegate ModifyName; [SystemInitializer(new Type[] { })] private static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown object obj = <>O.<0>__PurchaseInteraction_GetDisplayName; if (obj == null) { hook_GetDisplayName val = PurchaseInteraction_GetDisplayName; <>O.<0>__PurchaseInteraction_GetDisplayName = val; obj = (object)val; } PurchaseInteraction.GetDisplayName += (hook_GetDisplayName)obj; object obj2 = <>O.<1>__PurchaseInteraction_GetContextString; if (obj2 == null) { hook_GetContextString val2 = PurchaseInteraction_GetContextString; <>O.<1>__PurchaseInteraction_GetContextString = val2; obj2 = (object)val2; } PurchaseInteraction.GetContextString += (hook_GetContextString)obj2; } private static string tryModifyName(string name, PurchaseInteraction instance, CharacterMaster viewer) { if (PurchaseInteractionHooks.ModifyName == null) { return name; } try { _sharedStringBuilder.Clear(); _sharedStringBuilder.Append(name); PurchaseInteractionHooks.ModifyName(instance, viewer, _sharedStringBuilder); return _sharedStringBuilder.ToString(); } catch (Exception data) { Log.Error_NoCallerPrefix(data); return name; } } private static string PurchaseInteraction_GetDisplayName(orig_GetDisplayName orig, PurchaseInteraction self) { CharacterMaster viewer = null; LocalUser firstLocalUser = LocalUserManager.GetFirstLocalUser(); if (firstLocalUser != null) { viewer = firstLocalUser.cachedMaster; } return tryModifyName(orig.Invoke(self), self, viewer); } private static string PurchaseInteraction_GetContextString(orig_GetContextString orig, PurchaseInteraction self, Interactor activator) { CharacterMaster viewer = null; CharacterBody val = default(CharacterBody); if (Object.op_Implicit((Object)(object)activator) && ((Component)activator).TryGetComponent<CharacterBody>(ref val)) { viewer = val.master; } return tryModifyName(orig.Invoke(self, activator), self, viewer); } } } namespace NoMoreMath.HoldoutZone { public sealed class HoldoutZoneChargeRateProvider : NetworkBehaviour, ICachableComponent { public static readonly ObjectComponentCache<HoldoutZoneController, HoldoutZoneChargeRateProvider> ComponentCache = new ObjectComponentCache<HoldoutZoneController, HoldoutZoneChargeRateProvider>(); private HoldoutZoneController _holdoutZoneController; [SyncVar(hook = "syncChargeRate")] public float ChargeRate; int? ICachableComponent.DictionaryKey { get; set; } public float LastPositiveChargeRate { get; private set; } public float NetworkChargeRate { get { return ChargeRate; } [param: In] set { ref float chargeRate = ref ChargeRate; if (NetworkServer.localClientActive && !((NetworkBehaviour)this).syncVarHookGuard) { ((NetworkBehaviour)this).syncVarHookGuard = true; syncChargeRate(value); ((NetworkBehaviour)this).syncVarHookGuard = false; } ((NetworkBehaviour)this).SetSyncVar<float>(value, ref chargeRate, 1u); } } private void Awake() { _holdoutZoneController = ((Component)this).GetComponent<HoldoutZoneController>(); } public override void OnStartClient() { ((NetworkBehaviour)this).OnStartClient(); syncChargeRate(ChargeRate); } private void OnDestroy() { ComponentCache.OnDestroyed(this); } private void syncChargeRate(float chargeRate) { NetworkChargeRate = chargeRate; if (chargeRate > 0f) { LastPositiveChargeRate = chargeRate; } } private void UNetVersion() { } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { writer.Write(ChargeRate); return true; } bool flag = false; if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(ChargeRate); } if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { ChargeRate = reader.ReadSingle(); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { syncChargeRate(reader.ReadSingle()); } } } internal static class HoldoutZoneChargeRateProviderHooks { [CompilerGenerated] private static class <>O { public static hook_Awake <0>__HoldoutZoneController_Awake; public static Manipulator <1>__HoldoutZoneController_DoUpdate; public static Action<HoldoutZoneController, float> <2>__recordChargeRate; } [SystemInitializer(new Type[] { })] private static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown object obj = <>O.<0>__HoldoutZoneController_Awake; if (obj == null) { hook_Awake val = HoldoutZoneController_Awake; <>O.<0>__HoldoutZoneController_Awake = val; obj = (object)val; } HoldoutZoneController.Awake += (hook_Awake)obj; object obj2 = <>O.<1>__HoldoutZoneController_DoUpdate; if (obj2 == null) { Manipulator val2 = HoldoutZoneController_DoUpdate; <>O.<1>__HoldoutZoneController_DoUpdate = val2; obj2 = (object)val2; } HoldoutZoneController.DoUpdate += (Manipulator)obj2; } private static void HoldoutZoneController_Awake(orig_Awake orig, HoldoutZoneController self) { orig.Invoke(self); HoldoutZoneChargeRateProvider.ComponentCache.GetOrAddComponent(self); } private static void HoldoutZoneController_DoUpdate(ILContext il) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); ILCursor[] array = null; if (!val.TryFindNext(ref array, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdfld<HoldoutZoneController>(x, "calcChargeRate"), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<CalcChargeRateDelegate>(x, "Invoke") })) { Log.Error("Failed to find calcChargeRate invoke", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\HoldoutZone\\HoldoutZoneChargeRateProviderHooks.cs", "HoldoutZoneController_DoUpdate", 33); return; } val.Goto(array[1].Next, (MoveType)0, false); int chargeRateLocalIndex = -1; if (!val.Clone().TryGotoPrev(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdloca(x, ref chargeRateLocalIndex) })) { Log.Error("Failed to find chargeRate local", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\HoldoutZone\\HoldoutZoneChargeRateProviderHooks.cs", "HoldoutZoneController_DoUpdate", 42); return; } if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<HoldoutZoneController>(x, "set_charge") })) { int index = val.Index; val.Index = index + 1; Log.Warning("Failed to find set_charge call, using current position", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\HoldoutZone\\HoldoutZoneChargeRateProviderHooks.cs", "HoldoutZoneController_DoUpdate", 50); } val.Emit(OpCodes.Ldarg_0); val.Emit(OpCodes.Ldloc, chargeRateLocalIndex); val.EmitDelegate<Action<HoldoutZoneController, float>>((Action<HoldoutZoneController, float>)recordChargeRate); static void recordChargeRate(HoldoutZoneController holdoutZoneController, float chargeRate) { if (NetworkServer.active) { HoldoutZoneChargeRateProvider.ComponentCache.GetOrAddComponent(holdoutZoneController).NetworkChargeRate = chargeRate; } } } } internal static class HoldoutZoneChargeTimeDisplayHooks { [CompilerGenerated] private static class <>O { public static hook_GenerateString <0>__ChargeHoldoutZoneObjectiveTracker_GenerateString; } [SystemInitializer(new Type[] { })] private static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__ChargeHoldoutZoneObjectiveTracker_GenerateString; if (obj == null) { hook_GenerateString val = ChargeHoldoutZoneObjectiveTracker_GenerateString; <>O.<0>__ChargeHoldoutZoneObjectiveTracker_GenerateString = val; obj = (object)val; } ChargeHoldoutZoneObjectiveTracker.GenerateString += (hook_GenerateString)obj; } private static string ChargeHoldoutZoneObjectiveTracker_GenerateString(orig_GenerateString orig, ObjectiveTracker _self) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ChargeHoldoutZoneObjectiveTracker val = (ChargeHoldoutZoneObjectiveTracker)_self; string text = orig.Invoke(val); HoldoutZoneConfig holdoutZone = Configs.HoldoutZone; if (holdoutZone.EnableChargeTimeDisplay.Value) { HoldoutZoneController holdoutZoneController = val.holdoutZoneController; float num = 0f; if (HoldoutZoneChargeRateProvider.ComponentCache.TryGetComponent(holdoutZoneController, out var component)) { num = component.LastPositiveChargeRate; } StringBuilder stringBuilder = StringBuilderPool.RentStringBuilder(); string text2 = "N/A"; if (num > 0f) { text2 = ((1f - holdoutZoneController.charge) / num).ToString("F1", CultureInfo.InvariantCulture); } stringBuilder.EnsureCapacity(text.Length + holdoutZone.TimeRemainingDisplayFormat.StrippedLength + text2.Length + 1); stringBuilder.Append(text); stringBuilder.Append(' '); holdoutZone.TimeRemainingDisplayFormat.AppendToStringBuilder(stringBuilder, new TagReplacementStringConfig.ReplacementInfo("{sec}", text2)); text = stringBuilder.ToString(); stringBuilder = StringBuilderPool.ReturnStringBuilder(stringBuilder); } return text; } } public sealed class HoldoutZoneConfig { public readonly ConfigEntry<bool> EnableChargeTimeDisplay; public const string TIME_REMAINING_DISPLAY_SECONDS_TAG = "{sec}"; public readonly TagReplacementStringConfig TimeRemainingDisplayFormat; public HoldoutZoneConfig(in ConfigContext context) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown EnableChargeTimeDisplay = context.Bind("Display Estimated Charge Time", defaultValue: true, new ConfigDescription("If the estimated time remaining to fully charge a holdout zone should be displayed in the Objective panel", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> configEntry = context.Bind("Charge Time Display Format", "<nobr>({sec} s)</nobr>", new ConfigDescription("The format that will be used to display the time remaining.\r\n\r\nAll instances of '{sec}' (braces included!) will be replaced with the time remaining (in seconds)", (AcceptableValueBase)null, Array.Empty<object>())); TimeRemainingDisplayFormat = new TagReplacementStringConfig(configEntry, new string[1] { "{sec}" }); } } } namespace NoMoreMath.HalcyonShrine { public sealed class HalcyonShrineConfig { public readonly ConfigEntry<bool> EnableProgressObjective; public const string CHARGE_PROGRESS_DISPLAY_PROGRESS_TAG = "{percent_complete}"; public const string CHARGE_PROGRESS_DISPLAY_GOLD_DRAINED_TAG = "{money_spent}"; public const string CHARGE_PROGRESS_DISPLAY_GOLD_REQUIRED_TAG = "{money_required}"; public readonly TagReplacementStringConfig ChargeProgressDisplayFormat; public HalcyonShrineConfig(in ConfigContext context) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown EnableProgressObjective = context.Bind("Display Charge Progress", defaultValue: true, new ConfigDescription("If the charge progress of Halcyon Shrines should be displayed in the Objectives panel", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> configEntry = context.Bind("Charge Progress Display Format", "Charge the <style=cHumanObjective>Halcyon Shrine</style> (<style=cShrine>${money_spent}/{money_required}</style>)", new ConfigDescription("The format that will be used to display the charge progress.\r\n\r\nAll instances of '{money_spent}' (braces included!) will be replaced with the amount of money spent on the shrine\r\n\r\nAll instances of '{money_required}' (braces included!) will be replaced with the amount of money required to complete the shrine\r\n\r\nAll instances of '{percent_complete}' (braces included!) will be replaced with the charge percentage (0-100)", (AcceptableValueBase)null, Array.Empty<object>())); ChargeProgressDisplayFormat = new TagReplacementStringConfig(configEntry, new string[3] { "{percent_complete}", "{money_spent}", "{money_required}" }); } } [DisallowMultipleComponent] public sealed class HalcyonShrineObjectiveProvider : NetworkBehaviour { private HalcyoniteShrineInteractable _shrine; [SyncVar] public bool IsActive; [SyncVar] public int TotalGoldDrained = -1; [SyncVar] public int RequiredGoldDrain = -1; public bool NetworkIsActive { get { return IsActive; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<bool>(value, ref IsActive, 1u); } } public int NetworkTotalGoldDrained { get { return TotalGoldDrained; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<int>(value, ref TotalGoldDrained, 2u); } } public int NetworkRequiredGoldDrain { get { return RequiredGoldDrain; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<int>(value, ref RequiredGoldDrain, 4u); } } private void Awake() { _shrine = ((Component)this).GetComponent<HalcyoniteShrineInteractable>(); if (NetworkServer.active) { updateServerVars(); } } private void OnEnable() { ObjectivePanelController.collectObjectiveSources += ObjectivePanelController_collectObjectiveSources; } private void OnDisable() { ObjectivePanelController.collectObjectiveSources -= ObjectivePanelController_collectObjectiveSources; } private void Update() { if (NetworkServer.active) { updateServerVars(); } } [Server] private void updateServerVars() { if (!NetworkServer.active) { Debug.LogWarning((object)"[Server] function 'System.Void NoMoreMath.HalcyonShrine.HalcyonShrineObjectiveProvider::updateServerVars()' called on client"); return; } bool networkIsActive = false; int networkTotalGoldDrained = -1; int networkRequiredGoldDrain = -1; if (Object.op_Implicit((Object)(object)_shrine)) { int num; if (_shrine.interactions > 0 && Object.op_Implicit((Object)(object)_shrine.stateMachine)) { EntityState state = _shrine.stateMachine.state; num = ((!(state is ShrineHalcyoniteMaxQuality) && !(state is ShrineHalcyoniteFinished)) ? 1 : 0); } else { num = 0; } networkIsActive = (byte)num != 0; networkTotalGoldDrained = _shrine.goldDrained; networkRequiredGoldDrain = _shrine.maxGoldCost; } NetworkIsActive = networkIsActive; NetworkTotalGoldDrained = networkTotalGoldDrained; NetworkRequiredGoldDrain = networkRequiredGoldDrain; } private void ObjectivePanelController_collectObjectiveSources(CharacterMaster viewer, List<ObjectiveSourceDescriptor> objectiveSources) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) if (IsActive && Configs.HalcyonShrine.EnableProgressObjective.Value) { objectiveSources.Add(new ObjectiveSourceDescriptor { master = viewer, objectiveType = typeof(HalcyonShrineObjectiveTracker), source = (Object)(object)this }); } } private void UNetVersion() { } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { writer.Write(IsActive); writer.WritePackedUInt32((uint)TotalGoldDrained); writer.WritePackedUInt32((uint)RequiredGoldDrain); return true; } bool flag = false; if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(IsActive); } if ((((NetworkBehaviour)this).syncVarDirtyBits & 2u) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.WritePackedUInt32((uint)TotalGoldDrained); } if ((((NetworkBehaviour)this).syncVarDirtyBits & 4u) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.WritePackedUInt32((uint)RequiredGoldDrain); } if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { IsActive = reader.ReadBoolean(); TotalGoldDrained = (int)reader.ReadPackedUInt32(); RequiredGoldDrain = (int)reader.ReadPackedUInt32(); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { IsActive = reader.ReadBoolean(); } if (((uint)num & 2u) != 0) { TotalGoldDrained = (int)reader.ReadPackedUInt32(); } if (((uint)num & 4u) != 0) { RequiredGoldDrain = (int)reader.ReadPackedUInt32(); } } } internal static class HalcyonShrineObjectiveProviderHooks { [CompilerGenerated] private static class <>O { public static hook_Awake <0>__HalcyoniteShrineInteractable_Awake; } [SystemInitializer(new Type[] { })] private static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__HalcyoniteShrineInteractable_Awake; if (obj == null) { hook_Awake val = HalcyoniteShrineInteractable_Awake; <>O.<0>__HalcyoniteShrineInteractable_Awake = val; obj = (object)val; } HalcyoniteShrineInteractable.Awake += (hook_Awake)obj; } private static void HalcyoniteShrineInteractable_Awake(orig_Awake orig, HalcyoniteShrineInteractable self) { orig.Invoke(self); ((Component)self).gameObject.AddComponent<HalcyonShrineObjectiveProvider>(); } } public sealed class HalcyonShrineObjectiveTracker : ObjectiveTracker { private bool _displayFormatDirty; private int _displayedChargePercent = -1; private int _displayedGoldDrain = -1; private int _displayedRequiredGoldDrain = -1; private HalcyonShrineObjectiveProvider halcyoniteShrine => (HalcyonShrineObjectiveProvider)(object)base.sourceDescriptor.source; public HalcyonShrineObjectiveTracker() { Configs.HalcyonShrine.ChargeProgressDisplayFormat.OnValueChanged += onDisplayFormatChanged; } public override void OnRetired() { ((ObjectiveTracker)this).OnRetired(); Configs.HalcyonShrine.ChargeProgressDisplayFormat.OnValueChanged -= onDisplayFormatChanged; } private void onDisplayFormatChanged() { _displayFormatDirty = true; } private int getChargeDisplayPercent() { return Mathf.Clamp(Mathf.FloorToInt((float)halcyoniteShrine.TotalGoldDrained / (float)halcyoniteShrine.RequiredGoldDrain * 100f), 0, 100); } public override bool IsDirty() { if (!((ObjectiveTracker)this).IsDirty()) { if (Object.op_Implicit((Object)(object)halcyoniteShrine)) { if (!_displayFormatDirty && halcyoniteShrine.TotalGoldDrained == _displayedGoldDrain && halcyoniteShrine.RequiredGoldDrain == _displayedRequiredGoldDrain) { return _displayedChargePercent != getChargeDisplayPercent(); } return true; } return false; } return true; } public override string GenerateString() { _displayedChargePercent = getChargeDisplayPercent(); _displayedGoldDrain = halcyoniteShrine.TotalGoldDrained; _displayedRequiredGoldDrain = halcyoniteShrine.RequiredGoldDrain; _displayFormatDirty = false; string text = _displayedChargePercent.ToString(); string text2 = _displayedGoldDrain.ToString(); string text3 = _displayedRequiredGoldDrain.ToString(); HalcyonShrineConfig halcyonShrine = Configs.HalcyonShrine; StringBuilder stringBuilder = StringBuilderPool.RentStringBuilder(); stringBuilder.EnsureCapacity(halcyonShrine.ChargeProgressDisplayFormat.StrippedLength + text.Length + text2.Length + text3.Length); halcyonShrine.ChargeProgressDisplayFormat.AppendToStringBuilder(stringBuilder, new TagReplacementStringConfig.ReplacementInfo("{percent_complete}", text), new TagReplacementStringConfig.ReplacementInfo("{money_spent}", text2), new TagReplacementStringConfig.ReplacementInfo("{money_required}", text3)); string result = stringBuilder.ToString(); StringBuilderPool.ReturnStringBuilder(stringBuilder); return result; } } } namespace NoMoreMath.HalcyonBeacon { internal readonly struct GoldshoresBeaconCollection : IEquatable<GoldshoresBeaconCollection> { public readonly GameObject[] BeaconObjects; public GoldshoresBeaconCollection(GameObject[] beaconObjects) { BeaconObjects = beaconObjects; } public bool Equals(GoldshoresBeaconCollection other) { return ArrayUtils.SequenceEquals<GameObject, UnityObjectComparer>(BeaconObjects, other.BeaconObjects, UnityObjectComparer.Instance); } } [DisallowMultipleComponent] public sealed class GoldshoresMissionControllerBeaconsProvider : NetworkBehaviour { private GoldshoresMissionController _missionController; [SyncVar(hook = "syncBeacons")] private GoldshoresBeaconCollection _beaconCollection; private readonly List<GameObject> _beaconsList = new List<GameObject>(); private readonly List<PurchaseInteraction> _beaconPurchaseInteractions = new List<PurchaseInteraction>(); public static GoldshoresMissionControllerBeaconsProvider Instance { get; private set; } public ReadOnlyCollection<GameObject> BeaconObjects { get; private set; } public ReadOnlyCollection<PurchaseInteraction> BeaconPurchaseInteractions { get; private set; } public GoldshoresBeaconCollection Network_beaconCollection { get { return _beaconCollection; } [param: In] set { ref GoldshoresBeaconCollection beaconCollection = ref _beaconCollection; if (NetworkServer.localClientActive && !((NetworkBehaviour)this).syncVarHookGuard) { ((NetworkBehaviour)this).syncVarHookGuard = true; syncBeacons(value); ((NetworkBehaviour)this).syncVarHookGuard = false; } ((NetworkBehaviour)this).SetSyncVar<GoldshoresBeaconCollection>(value, ref beaconCollection, 1u); } } private void Awake() { _missionController = ((Component)this).GetComponent<GoldshoresMissionController>(); BeaconObjects = new ReadOnlyCollection<GameObject>(_beaconsList); BeaconPurchaseInteractions = new ReadOnlyCollection<PurchaseInteraction>(_beaconPurchaseInteractions); } private void OnEnable() { Instance = SingletonHelper.Assign<GoldshoresMissionControllerBeaconsProvider>(Instance, this); if (NetworkServer.active) { updateServerVars(); } } private void OnDisable() { Instance = SingletonHelper.Unassign<GoldshoresMissionControllerBeaconsProvider>(Instance, this); } public override void OnStartClient() { ((NetworkBehaviour)this).OnStartClient(); syncBeacons(_beaconCollection); } private void FixedUpdate() { if (NetworkServer.active) { updateServerVars(); } } [Server] private void updateServerVars() { if (!NetworkServer.active) { Debug.LogWarning((object)"[Server] function 'System.Void NoMoreMath.HalcyonBeacon.GoldshoresMissionControllerBeaconsProvider::updateServerVars()' called on client"); return; } GameObject[] beaconObjects = (Object.op_Implicit((Object)(object)_missionController) ? _missionController.beaconInstanceList.ToArray() : Array.Empty<GameObject>()); Network_beaconCollection = new GoldshoresBeaconCollection(beaconObjects); } private void syncBeacons(GoldshoresBeaconCollection beaconCollection) { Network_beaconCollection = beaconCollection; _beaconsList.Clear(); _beaconsList.AddRange(beaconCollection.BeaconObjects); _beaconPurchaseInteractions.Clear(); PurchaseInteraction item = default(PurchaseInteraction); foreach (GameObject beaconObject in BeaconObjects) { if (Object.op_Implicit((Object)(object)beaconObject) && beaconObject.TryGetComponent<PurchaseInteraction>(ref item)) { _beaconPurchaseInteractions.Add(item); } } } public static void TryAddComponent(GoldshoresMissionController missionController) { if (!Object.op_Implicit((Object)(object)missionController)) { Log.Error("Null mission controller instance", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\HalcyonBeacon\\GoldshoresMissionControllerBeaconsProvider.cs", "TryAddComponent", 91); } else if (!Object.op_Implicit((Object)(object)((Component)missionController).GetComponent<NetworkIdentity>())) { Log.Error("Mission controller is missing network identity", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\HalcyonBeacon\\GoldshoresMissionControllerBeaconsProvider.cs", "TryAddComponent", 97); } else { ((Component)missionController).gameObject.AddComponent<GoldshoresMissionControllerBeaconsProvider>(); } } private void UNetVersion() { } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { GeneratedNetworkCode._WriteGoldshoresBeaconCollection_None(writer, _beaconCollection); return true; } bool flag = false; if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } GeneratedNetworkCode._WriteGoldshoresBeaconCollection_None(writer, _beaconCollection); } if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { _beaconCollection = GeneratedNetworkCode._ReadGoldshoresBeaconCollection_None(reader); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { syncBeacons(GeneratedNetworkCode._ReadGoldshoresBeaconCollection_None(reader)); } } } internal static class GoldshoresMissionControllerBeaconsProviderHooks { [CompilerGenerated] private static class <>O { public static hook_Awake <0>__GoldshoresMissionController_Awake; } [SystemInitializer(new Type[] { })] private static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__GoldshoresMissionController_Awake; if (obj == null) { hook_Awake val = GoldshoresMissionController_Awake; <>O.<0>__GoldshoresMissionController_Awake = val; obj = (object)val; } GoldshoresMissionController.Awake += (hook_Awake)obj; } private static void GoldshoresMissionController_Awake(orig_Awake orig, GoldshoresMissionController self) { orig.Invoke(self); GoldshoresMissionControllerBeaconsProvider.TryAddComponent(self); } } public sealed class HalcyonBeaconConfig { public readonly ConfigEntry<bool> EnableTotalCostDisplay; public const string TOTAL_COST_DISPLAY_COST_TAG = "{total_cost}"; public const string TOTAL_COST_DISPLAY_COLOR_TAG = "{color}"; public readonly TagReplacementStringConfig TotalCostDisplayFormatter; public readonly ConfigEntry<Color> TotalCostAffordableColor; public readonly ConfigEntry<Color> TotalCostNotAffordableColor; public HalcyonBeaconConfig(in ConfigContext context) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Expected O, but got Unknown EnableTotalCostDisplay = context.Bind("Display Total Cost", defaultValue: true, new ConfigDescription("If the total cost of all Halcyon Beacons in Gilded Coast should be displayed in the Objective panel", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> configEntry = context.Bind("Total Cost Display Format", "<nobr>(<color={color}>${total_cost}</color>)</nobr>", new ConfigDescription("The format that will be used to display the total cost.\r\n\r\nAll instances of '{total_cost}' (braces included!) will be replaced with the total cost\r\n\r\nAll instances of '{color}' (braces included!) will be replaced with a color code depending on if the total cost is affordable or not", (AcceptableValueBase)null, Array.Empty<object>())); TotalCostDisplayFormatter = new TagReplacementStringConfig(configEntry, new string[2] { "{total_cost}", "{color}" }); TotalCostAffordableColor = context.Bind<Color>("Total Cost Affordable Color", new Color(0f, 1f, 0f), new ConfigDescription("The color used for the '{color}' tag in the display format if the total price can be afforded.", (AcceptableValueBase)null, Array.Empty<object>())); TotalCostNotAffordableColor = context.Bind<Color>("Total Cost Not Affordable Color", new Color(1f, 0f, 0f), new ConfigDescription("The color used for the '{color}' tag in the display format if the total price cannot be afforded.", (AcceptableValueBase)null, Array.Empty<object>())); } } internal static class HalcyonBeaconTotalCostDisplayHooks { [CompilerGenerated] private static class <>O { public static hook_IsDirty <0>__ActivateGoldshoreBeaconTracker_IsDirty; public static hook_GenerateString <1>__ActivateGoldshoreBeaconTracker_GenerateString; } [SystemInitializer(new Type[] { })] private static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown object obj = <>O.<0>__ActivateGoldshoreBeaconTracker_IsDirty; if (obj == null) { hook_IsDirty val = ActivateGoldshoreBeaconTracker_IsDirty; <>O.<0>__ActivateGoldshoreBeaconTracker_IsDirty = val; obj = (object)val; } ActivateGoldshoreBeaconTracker.IsDirty += (hook_IsDirty)obj; object obj2 = <>O.<1>__ActivateGoldshoreBeaconTracker_GenerateString; if (obj2 == null) { hook_GenerateString val2 = ActivateGoldshoreBeaconTracker_GenerateString; <>O.<1>__ActivateGoldshoreBeaconTracker_GenerateString = val2; obj2 = (object)val2; } ActivateGoldshoreBeaconTracker.GenerateString += (hook_GenerateString)obj2; } private static bool ActivateGoldshoreBeaconTracker_IsDirty(orig_IsDirty orig, ActivateGoldshoreBeaconTracker self) { orig.Invoke(self); return true; } private static string ActivateGoldshoreBeaconTracker_GenerateString(orig_GenerateString orig, ActivateGoldshoreBeaconTracker self) { //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Invalid comparison between Unknown and I4 //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) string text = orig.Invoke(self); HalcyonBeaconConfig halcyonBeacon = Configs.HalcyonBeacon; CharacterMaster master = ((ObjectiveTracker)self).sourceDescriptor.master; if (halcyonBeacon.EnableTotalCostDisplay.Value && Object.op_Implicit((Object)(object)GoldshoresMissionControllerBeaconsProvider.Instance) && Object.op_Implicit((Object)(object)master)) { ReadOnlyCollection<PurchaseInteraction> beaconPurchaseInteractions = GoldshoresMissionControllerBeaconsProvider.Instance.BeaconPurchaseInteractions; CostTypeDef costTypeDef = CostTypeCatalog.GetCostTypeDef((CostTypeIndex)1); int count = beaconPurchaseInteractions.Count; int[] array = new int[count]; int num = TeamManager.LongstandingSolitudesInParty(); for (int i = 0; i < count; i++) { PurchaseInteraction val = beaconPurchaseInteractions[i]; if (Object.op_Implicit((Object)(object)val) && val.available && (int)val.costType == 1) { int num2 = val.cost; if (num > 0) { num2 *= 1 + num; } if (num2 > 0) { array[i] = num2; } } } int totalEffectiveCost = EffectiveCostUtils.GetTotalEffectiveCost(costTypeDef, array, master); string text2 = totalEffectiveCost.ToString(); Color32 val2 = Color32.op_Implicit((master.money >= totalEffectiveCost) ? halcyonBeacon.TotalCostAffordableColor.Value : halcyonBeacon.TotalCostNotAffordableColor.Value); string text3 = $"#{val2.r:X2}{val2.g:X2}{val2.b:X2}"; StringBuilder stringBuilder = StringBuilderPool.RentStringBuilder(); stringBuilder.EnsureCapacity(text.Length + halcyonBeacon.TotalCostDisplayFormatter.StrippedLength + text3.Length + text2.Length + 1); stringBuilder.Append(text).Append(' '); halcyonBeacon.TotalCostDisplayFormatter.AppendToStringBuilder(stringBuilder, new TagReplacementStringConfig.ReplacementInfo("{color}", text3), new TagReplacementStringConfig.ReplacementInfo("{total_cost}", text2)); text = stringBuilder.ToString(); stringBuilder = StringBuilderPool.ReturnStringBuilder(stringBuilder); } return text; } } } namespace NoMoreMath.EffectiveHealth { public sealed class EffectiveHealthConfig { public readonly ConfigEntry<bool> Enabled; public const string EFFECTIVE_HEALTH_FORMAT_VALUE_TAG = "{value}"; public readonly TagReplacementStringConfig EffectiveHealthDisplayFormat; public readonly EffectiveHealthDisplayConfig CurrentHealthDisplay; public readonly EffectiveHealthDisplayConfig MaxHealthDisplay; public EffectiveHealthConfig(in ConfigContext context) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown Enabled = context.Bind("Enabled", defaultValue: true, new ConfigDescription("If effective health should be displayed.", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> configEntry = context.Bind("Display Format", "<size=65%>(Eff. {value})</size>", new ConfigDescription("The format that will be used to display effective health.\r\n\r\nAll instances of '{value}' (braces included!) will be replaced with the effective health value", (AcceptableValueBase)null, Array.Empty<object>())); EffectiveHealthDisplayFormat = new TagReplacementStringConfig(configEntry, new string[1] { "{value}" }); ConfigContext context2 = context; context2.NameFormat = "Current Health {0}"; CurrentHealthDisplay = new EffectiveHealthDisplayConfig(in context2, this, EffectiveHealthDisplayConfig.DisplayPosition.BeforeHealth); ConfigContext context3 = context; context3.NameFormat = "Max Health {0}"; MaxHealthDisplay = new EffectiveHealthDisplayConfig(in context3, this, EffectiveHealthDisplayConfig.DisplayPosition.AfterHealth); } } public sealed class EffectiveHealthDisplayConfig { public enum DisplayPosition { None, BeforeHealth, AfterHealth } public readonly EffectiveHealthConfig EffectiveHealthConfig; public readonly ConfigEntry<DisplayPosition> HealthDisplayPosition; public EffectiveHealthDisplayConfig(in ConfigContext context, EffectiveHealthConfig effectiveHealthConfig, DisplayPosition defaultDisplayPosition) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown EffectiveHealthConfig = effectiveHealthConfig; HealthDisplayPosition = context.Bind("Display Position", defaultDisplayPosition, new ConfigDescription("How this effective health should be displayed.\r\n\r\nNone: Effective health is not displayed.\r\n\r\nBeforeHealth: Effective health is displayed to the left of the health value.\r\n\r\nAfterHealth: Effective health is displayed to the right of the health value.", (AcceptableValueBase)null, Array.Empty<object>())); } public bool ShouldDisplay() { if (EffectiveHealthConfig.Enabled.Value) { return HealthDisplayPosition.Value != DisplayPosition.None; } return false; } public string Format(float displayHealth, float displayEffectiveHealth) { string text = displayHealth.ToString(); if (float.IsNaN(displayEffectiveHealth) || !ShouldDisplay()) { return text; } string effectiveHealthString; if (float.IsInfinity(displayEffectiveHealth)) { effectiveHealthString = "<color=#555555>INF.</color>"; } else { effectiveHealthString = displayEffectiveHealth.ToString(); } TagReplacementStringConfig effectiveHealthFormatter = EffectiveHealthConfig.EffectiveHealthDisplayFormat; StringBuilder stringBuilder = StringBuilderPool.RentStringBuilder(); stringBuilder.EnsureCapacity(effectiveHealthFormatter.StrippedLength + effectiveHealthString.Length + text.Length + 1); DisplayPosition value = HealthDisplayPosition.Value; if (value == DisplayPosition.BeforeHealth) { appendEffectiveHealth(); stringBuilder.Append(' '); } stringBuilder.Append(text); if (value == DisplayPosition.AfterHealth) { stringBuilder.Append(' '); appendEffectiveHealth(); } string result = stringBuilder.ToString(); stringBuilder = StringBuilderPool.ReturnStringBuilder(stringBuilder); return result; [MethodImpl(MethodImplOptions.AggressiveInlining)] void appendEffectiveHealth() { effectiveHealthFormatter.AppendToStringBuilder(stringBuilder, new TagReplacementStringConfig.ReplacementInfo("{value}", effectiveHealthString)); } } } [DisallowMultipleComponent] public sealed class EffectiveHealthDisplayController : MonoBehaviour, ICachableComponent { public static readonly ObjectComponentCache<HealthBar, EffectiveHealthDisplayController> ComponentCache = new ObjectComponentCache<HealthBar, EffectiveHealthDisplayController>(); private HealthBar _healthBar; private EffectiveHealthProvider _healthProvider; public readonly EffectiveHealthDisplayData HealthDisplayData = new EffectiveHealthDisplayData(Configs.EffectiveHealth.CurrentHealthDisplay); public readonly EffectiveHealthDisplayData MaxHealthDisplayData = new EffectiveHealthDisplayData(Configs.EffectiveHealth.MaxHealthDisplay); int? ICachableComponent.DictionaryKey { get; set; } public EffectiveHealthProvider HealthProvider { get { HealthComponent val = (Object.op_Implicit((Object)(object)_healthBar) ? _healthBar.source : null); if (!Object.op_Implicit((Object)(object)_healthProvider) || (Object)(object)_healthProvider.HealthComponent != (Object)(object)val) { _healthProvider = (Object.op_Implicit((Object)(object)val) ? ((Component)val).GetComponent<EffectiveHealthProvider>() : null); } return _healthProvider; } } public GameObject SlashRoot { get; private set; } private void Awake() { _healthBar = ((Component)this).GetComponent<HealthBar>(); if (Object.op_Implicit((Object)(object)_healthBar.spriteAsNumberManager)) { Object.Destroy((Object)(object)((Component)_healthBar.spriteAsNumberManager).gameObject); } Transform val = ((Component)this).transform.Find("Slash"); if (Object.op_Implicit((Object)(object)val)) { SlashRoot = ((Component)val).gameObject; } else { Log.Error("Failed to find healthbar SlashRoot", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\EffectiveHealth\\EffectiveHealthDisplayController.cs", "Awake", 55); } } private void OnDestroy() { ComponentCache.OnDestroyed(this); HealthDisplayData?.Dispose(); MaxHealthDisplayData?.Dispose(); } } public sealed class EffectiveHealthDisplayData : IDisposable { public readonly TrackedValue<float> LastDisplayedHealthValue = new TrackedValue<float>(float.NaN); public readonly TrackedValue<float> LastDisplayValue = new TrackedValue<float>(float.NaN); private readonly EffectiveHealthDisplayConfig _displayConfig; public bool IsDirty; public EffectiveHealthDisplayData(EffectiveHealthDisplayConfig displayConfig) { _displayConfig = displayConfig ?? throw new ArgumentNullException("displayConfig"); _displayConfig.EffectiveHealthConfig.Enabled.SettingChanged += onDisplaySettingChanged; _displayConfig.EffectiveHealthConfig.EffectiveHealthDisplayFormat.ConfigEntry.SettingChanged += onDisplaySettingChanged; _displayConfig.HealthDisplayPosition.SettingChanged += onDisplaySettingChanged; } private void onDisplaySettingChanged(object sender, EventArgs e) { IsDirty = true; } public void Dispose() { IsDirty = false; _displayConfig.EffectiveHealthConfig.Enabled.SettingChanged -= onDisplaySettingChanged; _displayConfig.EffectiveHealthConfig.EffectiveHealthDisplayFormat.ConfigEntry.SettingChanged -= onDisplaySettingChanged; _displayConfig.HealthDisplayPosition.SettingChanged -= onDisplaySettingChanged; } public bool ShouldDisplay() { return _displayConfig.ShouldDisplay(); } public string Format(float displayHealth, float displayEffectiveHealth) { return _displayConfig.Format(displayHealth, displayEffectiveHealth); } } internal static class EffectiveHealthDisplayHooks { [CompilerGenerated] private static class <>O { public static hook_UpdateHealthbar <0>__HealthBar_UpdateHealthbar; } [SystemInitializer(new Type[] { })] private static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__HealthBar_UpdateHealthbar; if (obj == null) { hook_UpdateHealthbar val = HealthBar_UpdateHealthbar; <>O.<0>__HealthBar_UpdateHealthbar = val; obj = (object)val; } HealthBar.UpdateHealthbar += (hook_UpdateHealthbar)obj; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool isValidForEffectiveHealthDisplay(HealthBar healthBar) { if (!Object.op_Implicit((Object)(object)healthBar.currentHealthText)) { return Object.op_Implicit((Object)(object)healthBar.fullHealthText); } return true; } private static void HealthBar_UpdateHealthbar(orig_UpdateHealthbar orig, HealthBar self, float deltaTime) { orig.Invoke(self, deltaTime); if (!isValidForEffectiveHealthDisplay(self)) { return; } EffectiveHealthDisplayController orAddComponent = EffectiveHealthDisplayController.ComponentCache.GetOrAddComponent(self); if (!Object.op_Implicit((Object)(object)orAddComponent)) { return; } EffectiveHealthProvider healthProvider = orAddComponent.HealthProvider; if (Object.op_Implicit((Object)(object)healthProvider)) { if (Object.op_Implicit((Object)(object)orAddComponent.SlashRoot)) { orAddComponent.SlashRoot.SetActive(true); } updateEffectiveHealthDisplay(self.currentHealthText, self.displayStringCurrentHealth, orAddComponent.HealthDisplayData, healthProvider.EffectiveHealth); updateEffectiveHealthDisplay(self.fullHealthText, self.displayStringFullHealth, orAddComponent.MaxHealthDisplayData, healthProvider.EffectiveMaxHealth); } static void updateEffectiveHealthDisplay(TextMeshProUGUI healthText, float displayHealth, EffectiveHealthDisplayData displayData, float effectiveHealth) { if (Object.op_Implicit((Object)(object)healthText)) { float num = Mathf.Ceil(effectiveHealth); if (num < 0f || num == displayHealth || !displayData.ShouldDisplay()) { num = float.NaN; } bool num2 = displayData.LastDisplayValue.Push(num); bool flag = displayData.LastDisplayedHealthValue.Push(displayHealth); if (num2 || flag || displayData.IsDirty) { ((TMP_Text)healthText).text = displayData.Format(displayHealth, num); displayData.IsDirty = false; } } } } } [DisallowMultipleComponent] public sealed class EffectiveHealthProvider : NetworkBehaviour { private static BuffIndex[] _invincibilityBuffs = Array.Empty<BuffIndex>(); [SyncVar] private float _adaptiveArmorValue; public HealthComponent HealthComponent { get; private set; } public float AdaptiveArmorValue => _adaptiveArmorValue; public float EffectiveHealth => GetEffectiveHealth(HealthComponent.combinedHealth); public float EffectiveMaxHealth => GetEffectiveHealth(HealthComponent.fullHealth); public float Network_adaptiveArmorValue { get { return _adaptiveArmorValue; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<float>(value, ref _adaptiveArmorValue, 1u); } } [SystemInitializer(new Type[] { typeof(BuffCatalog), typeof(BodyCatalog) })] private static void Init() { List<BuffIndex> invincibilityBuffIndices = new List<BuffIndex>(); addInvincibilityBuffDef(Buffs.HiddenInvincibility, 45); addInvincibilityBuffDef(Buffs.Immune, 46); addInvincibilityBuffDef(Buffs.BearVoidReady, 47); addInvincibilityBuffDef(Buffs.HiddenRejectAllDamage, 48); addInvincibilityBuffDef(Buffs.SojournVehicle, 49); addInvincibilityBuffDef(Buffs.BodyArmor, 50); _invincibilityBuffs = invincibilityBuffIndices.ToArray(); Array.Sort(_invincibilityBuffs); foreach (GameObject allBodyPrefab in BodyCatalog.allBodyPrefabs) { if (Object.op_Implicit((Object)(object)allBodyPrefab.GetComponent<HealthComponent>())) { allBodyPrefab.AddComponent<EffectiveHealthProvider>(); } } void addInvincibilityBuffDef(BuffDef buffDef, [CallerLineNumber] int lineNumber = -1) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)buffDef)) { invincibilityBuffIndices.Add(buffDef.buffIndex); } else { Log.Warning($"Null BuffDef at call {lineNumber}", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\EffectiveHealth\\EffectiveHealthProvider.cs", "Init", 41); } } } private void Awake() { HealthComponent = ((Component)this).GetComponent<HealthComponent>(); } private void Update() { if (NetworkServer.active) { updateAdaptiveArmorServer(); } } [Server] private void updateAdaptiveArmorServer() { if (!NetworkServer.active) { Debug.LogWarning((object)"[Server] function 'System.Void NoMoreMath.EffectiveHealth.EffectiveHealthProvider::updateAdaptiveArmorServer()' called on client"); } else { Network_adaptiveArmorValue = (Object.op_Implicit((Object)(object)HealthComponent) ? HealthComponent.adaptiveArmorValue : 0f); } } public float GetEffectiveHealth(float health) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) if (health < 0f || !Object.op_Implicit((Object)(object)HealthComponent) || !Object.op_Implicit((Object)(object)HealthComponent.body)) { return health; } if (HealthComponent.godMode) { return float.PositiveInfinity; } CharacterBody body = HealthComponent.body; BuffIndex[] invincibilityBuffs = _invincibilityBuffs; foreach (BuffIndex val in invincibilityBuffs) { if (body.HasBuff(val)) { return float.PositiveInfinity; } } float num = 1f; if (body.HasBuff(Buffs.lunarruin)) { num *= 1f + 0.1f * (float)body.GetBuffCount(Buffs.lunarruin); } if (body.HasBuff(Buffs.DeathMark)) { num *= 1.5f; } float num2 = body.armor + _adaptiveArmorValue; float num3 = ((num2 >= 0f) ? (1f - num2 / (num2 + 100f)) : (2f - 100f / (100f - num2))); num *= num3; int buffCount = body.GetBuffCount(Buffs.DroneArmor); if (buffCount > 0) { num *= 1f - (float)buffCount * 0.05f; } if (body.HasBuff(Buffs.DelayedDamageBuff)) { num *= 0.9f; } return health / num; } private void UNetVersion() { } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { writer.Write(_adaptiveArmorValue); return true; } bool flag = false; if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(_adaptiveArmorValue); } if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { _adaptiveArmorValue = reader.ReadSingle(); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { _adaptiveArmorValue = reader.ReadSingle(); } } } } namespace NoMoreMath.EffectiveCost { public sealed class EffectiveCostConfig { public readonly ConfigEntry<bool> Enabled; public const string EFFECTIVE_COST_FORMAT_VALUE_TAG = "{value}"; public readonly TagReplacementStringConfig CostDisplayFormat; public EffectiveCostConfig(in ConfigContext context) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown Enabled = context.Bind("Enabled", defaultValue: true, new ConfigDescription("If effective cost should be shown on interactables", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> configEntry = context.Bind("Display Format", "<size=75%>(Eff. {value})</size>", new ConfigDescription("The format that will be used to display the effective cost.\r\n\r\nAll instances of '{value}' (braces included!) will be replaced with the effective cost value", (AcceptableValueBase)null, Array.Empty<object>())); CostDisplayFormat = new TagReplacementStringConfig(configEntry, new string[1] { "{value}" }); } } internal static class EffectiveCostDisplayHooks { [CompilerGenerated] private static class <>O { public static Manipulator <0>__MoneyCostTypeDef_BuildCostString_Manipulator; public static <>A{00000018}<CostTypeDef, BuildCostStringContext> <1>__postfix; } [SystemInitializer(new Type[] { typeof(CostTypeCatalog) })] private static void Init() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown CostTypeDef costTypeDef = CostTypeCatalog.GetCostTypeDef((CostTypeIndex)1); MethodInfo methodInfo = ((costTypeDef == null) ? null : ((Delegate)(object)costTypeDef.buildCostString)?.Method); if (methodInfo != null) { object obj = <>O.<0>__MoneyCostTypeDef_BuildCostString_Manipulator; if (obj == null) { Manipulator val = MoneyCostTypeDef_BuildCostString_Manipulator; <>O.<0>__MoneyCostTypeDef_BuildCostString_Manipulator = val; obj = (object)val; } new ILHook((MethodBase)methodInfo, (Manipulator)obj); } else { Log.Error("Failed to find BuildCost method for Money cost type", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\EffectiveCost\\EffectiveCostDisplayHooks.cs", "Init", 25); } } private static void MoneyCostTypeDef_BuildCostString_Manipulator(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); ParameterDefinition val2 = null; ParameterDefinition val3 = null; Enumerator<ParameterDefinition> enumerator = ((MethodReference)il.Method).Parameters.GetEnumerator(); try { while (enumerator.MoveNext()) { ParameterDefinition current = enumerator.Current; if (Extensions.Is((MemberReference)(object)((ParameterReference)current).ParameterType, (MemberInfo)typeof(CostTypeDef))) { if (val2 == null) { val2 = current; } } else if (Extensions.Is((MemberReference)(object)((ParameterReference)current).ParameterType, (MemberInfo)typeof(BuildCostStringContext)) && val3 == null) { val3 = current; } } } finally { ((IDisposable)enumerator).Dispose(); } if (val2 == null) { Log.Error("Failed to find CostTypeDef parameter", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\EffectiveCost\\EffectiveCostDisplayHooks.cs", "MoneyCostTypeDef_BuildCostString_Manipulator", 50); return; } if (val3 == null) { Log.Error("Failed to find context parameter", "X:\\Git\\RoR2\\NoMoreMath\\NoMoreMath\\EffectiveCost\\EffectiveCostDisplayHooks.cs", "MoneyCostTypeDef_BuildCostString_Manipulator", 56); return; } while (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchRet(x) })) { val.Emit(OpCodes.Ldarg, val2); val.Emit(OpCodes.Ldarga, val3); val.EmitDelegate<<>A{00000018}<CostTypeDef, BuildCostStringContext>>((<>A{00000018}<CostTypeDef, BuildCostStringContext>)postfix); val.SearchTarget = (SearchTarget)1; } static void postfix(CostTypeDef costTypeDef, in BuildCostStringContext context) { if (costTypeDef != null) { EffectiveCostConfig effectiveCost = Configs.EffectiveCost; if (effectiveCost.Enabled.Value) { LocalUser firstLocalUser = LocalUserManager.GetFirstLocalUser(); if (firstLocalUser != null) { CharacterMaster cachedMaster = firstLocalUser.cachedMaster; if (Object.op_Implicit((Object)(object)cachedMaster)) { int effectiveCost2 = EffectiveCostUtils.GetEffectiveCost(costTypeDef, context.cost, cachedMaster); if (effectiveCost2 != context.cost) { string stringFormatted = Language.GetStringFormatted(costTypeDef.costStringFormatToken, new object[1] { effectiveCost2 }); context.stringBuilder.EnsureCapacity(context.stringBuilder.Length + effectiveCost.CostDisplayFormat.StrippedLength + stringFormatted.Length + 1); context.stringBuilder.Append(' '); effectiveCost.CostDisplayFormat.AppendToStringBuilder(context.stringBuilder, new TagReplacementStringConfig.ReplacementInfo("{value}", stringFormatted)); } } } } } } } } public static class EffectiveCostUtils { public static int GetEffectiveCost(CostTypeDef costType, int cost, CharacterMaster master) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) if (costType == CostTypeCatalog.GetCostTypeDef((CostTypeIndex)1) && Object.op_Implicit((Object)(object)master)) { int num = 0; CharacterBody body = master.GetBody(); if (Object.op_Implicit((Object)(object)body)) { EquipmentSlot equipmentSlot = body.equipmentSlot; if (Object.op_Implicit((Object)(object)equipmentSlot)) { num = equipmentSlot.stock; } } Inventory inventory = master.inventory; if (Object.op_Implicit((Object)(object)inventory) && inventory.currentEquipmentIndex == Equipment.MultiShopCard.equipmentIndex && num > 0 && cost > 0) { int num2 = (int)(0.1f * (float)cost); if (num2 > 0) { cost -= num2; } } } return cost; } public static int GetTotalEffectiveCost(CostTypeDef costType, int[] costs, CharacterMaster master) { if (costs.Length == 0) { return 0; } if (costs.Length == 1) { return GetEffectiveCost(costType, costs[0], master); } int num = int.MinValue; int num2 = -1; for (int i = 0; i < costs.Length; i++) { if (costs[i] > num) { num = costs[i]; num2 = i; } } int num3 = 0; if (num2 >= 0) { num3 += num; } for (int j = 0; j < costs.Length; j++) { if (j != num2) { num3 += GetEffectiveCost(costType, costs[j], master); } } return num3; } } } namespace NoMoreMath.Config { public struct ConfigContext { public ConfigFile File; public string SectionName; public string NameFormat; public readonly string GetFormattedName(string name) { if (!string.IsNullOrEmpty(NameFormat)) { return string.Format(NameFormat, name); } return name; } public readonly ConfigEntry<T> Bind<T>(string name, T defaultValue, ConfigDescription description) { if (File == null) { throw new InvalidOperationException("ConfigFile not set"); } if (string.IsNullOrEmpty(SectionName)) { throw new InvalidOperationException("SectionName not set"); } return File.Bind<T>(SectionName, GetFormattedName(name), defaultValue, description); } } public static class Configs { public static EffectiveHealthConfig EffectiveHealth { get; private set; } public static EffectiveCostConfig EffectiveCost { get; private set; } public static HoldoutZoneConfig HoldoutZone { get; private set; } public static HalcyonShrineConfig HalcyonShrine { get; private set; } public static HalcyonBeaconConfig HalcyonBeacon { get; private set; } public static ShrineChanceConfig ShrineChance { get; private set; } public static ShrineBloodConfig ShrineBlood { get; private set; } internal static void Init(ConfigFile file) { ConfigContext configContext = default(ConfigContext); configContext.File = file; ConfigContext context; ConfigContext configContext2 = (context = configContext); context.SectionName = "Effective Health"; EffectiveHealth = new EffectiveHealthConfig(in context); ConfigContext context2 = configContext2; context2.SectionName = "Effective Cost"; EffectiveCost = new EffectiveCostConfig(in context2); ConfigContext context3 = configContext2; context3.SectionName = "Holdout Zone"; HoldoutZone = new HoldoutZoneConfig(in context3); ConfigContext context4 = configContext2; context4.SectionName = "Halcyon Shrine"; HalcyonShrine = new HalcyonShrineConfig(in context4); ConfigContext context5 = configContext2; context5.SectionName = "Halcyon Beacon"; HalcyonBeacon = new HalcyonBeaconConfig(in context5); ConfigContext context6 = configContext2; context6.SectionName = "Chance Shrine"; ShrineChance = new ShrineChanceConfig(in context6); ConfigContext context7 = configContext2; context7.SectionName = "Blood Shrine"; ShrineBlood = new ShrineBloodConfig(in context7); } } public sealed class TagReplacementStringConfig : IDisposable { private readonly record struct TagInfo(string Tag, int StartIndex); public readonly record struct ReplacementInfo(string Tag, string Value); public readonly ConfigEntry<string> ConfigEntry; private readonly string[] _validTags; private TagInfo[] _cachedTagInfos = Array.Empty<TagInfo>(); public int StrippedLength { get; private set; } public event Action OnValueChanged; public TagReplacementStringConfig(ConfigEntry<string> configEntry, string[] validTags) { ConfigEntry = configEntry; _validTags = validTags; ConfigEntry.SettingChanged += ConfigEntry_SettingChanged; parseConfigValue(); } public void Dispose() { ConfigEntry.SettingChanged -= ConfigEntry_SettingChanged; } private void ConfigEntry_SettingChanged(object sender, EventArgs e) { parseConfigValue(); this.OnValueChanged?.Invoke(); } private void parseConfigValue() { List<TagInfo> list = new List<TagInfo>(_validTags.Length); string value = ConfigEntry.Value; for (int i = 0; i < value.Length; i++) { string[] validTags = _validTags; foreach (string text in validTags) { if (i + text.Length <= value.Length && string.Compare(value, i, text, 0, text.Length, CultureInfo.InvariantCulture, CompareOptions.None) == 0) { list.Add(new TagInfo(text, i)); i += text.Length - 1; break; } } } _cachedTagInfos = list.ToArray(); int num = value.Length; TagInfo[] cachedTagInfos = _cachedTagInfos; foreach (TagInfo tagInfo in cachedTagInfos) { num -= tagInfo.Tag.Length; } StrippedLength = num; } public void AppendToStringBuilder(StringBuilder stringBuilder, params ReplacementInfo[] tagReplacements) { string value = ConfigEntry.Value; if (_cachedTagInfos.Length == 0) { stringBuilder.Append(value); return; } int num = 0; TagInfo[] cachedTagInfos = _cachedTagInfos; for (int i = 0; i < cachedTagInfos.Length; i++) { TagInfo tagInfo = cachedTagInfos[i]; int num2 = tagInfo.StartIndex - num; if (num2 > 0) { stringBuilder.Append(value, num, num2); } num = tagInfo.StartIndex + tagInfo.Tag.Length; for (int j = 0; j < tagReplacements.Length; j++) { ReplacementInfo replacementInfo = tagReplacements[j]; if (string.Equals(replacementInfo.Tag, tagInfo.Tag)) { stringBuilder.Append(replacementInfo.Value); break; } } } int num3 = value.Length - num; if (num3 > 0) { stringBuilder.Append(value, num, num3); } } } } namespace System.Runtime.CompilerServices { internal static class IsExternalInit { } } namespace Unity { [StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] public class GeneratedNetworkCode { public static void _WriteArrayGameObject_None(NetworkWriter writer, GameObject[] value) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown if (value == null) { writer.Write((ushort)0); return; } ushort num = (ushort)value.Length; writer.Write(num); for (ushort num2 = 0; num2 < value.Length; num2++) { writer.Write(value[num2]); } } public static void _WriteGoldshoresBeaconCollection_None(NetworkWriter writer, GoldshoresBeaconCollection value) { _WriteArrayGameObject_None(writer, value.BeaconObjects); } public static GameObject[] _ReadArrayGameObject_None(NetworkReader reader) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) int num = reader.ReadUInt16(); if (num == 0) { return (GameObject[])(object)new GameObject[0]; } GameObject[] array = (GameObject[])(object)new GameObject[num]; for (int i = 0; i < num