using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using FMOD; using FMODUnity; using HarmonyLib; using Microsoft.CodeAnalysis; using Mirror; using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.Settings; using UnityEngine.Localization.Tables; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("NightWolfHawk")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+71efdebfbc8b9be62fa68a9147899d0dc6f137b0")] [assembly: AssemblyProduct("NightWolfHawk")] [assembly: AssemblyTitle("NightWolfHawk")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace NightWolfHawk { public static class NightWolfHawkRules { public static float WeightForFiftyPercentChance(float existingPoolWeight) { return Math.Max(0f, existingPoolWeight); } public static bool ShouldRequestStartingItem(bool debugEnabled, bool alreadyRequested) { if (debugEnabled) { return !alreadyRequested; } return false; } public static bool ShouldDistractRecipient(bool isSender, bool isReady) { return !isSender && isReady; } public static bool ShouldSelfTarget(int opponentCount, bool debugEnabled) { if (debugEnabled) { return opponentCount == 0; } return false; } public static bool ShouldConsumeItem(int connectedPlayerCount, bool infiniteSoloUses) { if (infiniteSoloUses) { return connectedPlayerCount > 1; } return true; } } [BepInPlugin("com.shadowforce.sbg.nightwolfhawk", "Night Wolf Hawk", "0.7.5")] public sealed class Plugin : BaseUnityPlugin { private enum ScreenEdge { Bottom, Top, Left, Right } [HarmonyPatch(typeof(BNetworkManager), "OnStartClient")] private static class NetworkRegistrationPatch { private static void Postfix() { RegisterNetworkMessages(); } } [HarmonyPatch(typeof(ItemCollection), "Initialize")] private static class ItemCollectionPatch { private static readonly FieldInfo ItemsField = AccessTools.Field(typeof(ItemCollection), "items"); private static readonly FieldInfo ItemDataField = AccessTools.Field(typeof(ItemCollection), "allItemData"); private static void Postfix(ItemCollection __instance) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Expected I4, but got Unknown Dictionary dictionary = (Dictionary)ItemDataField.GetValue(__instance); if (dictionary.ContainsKey(Item) || !dictionary.TryGetValue((ItemType)4, out var value)) { return; } ItemData val = new ItemData(); PropertyInfo[] properties = typeof(ItemData).GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.CanRead && propertyInfo.CanWrite) { propertyInfo.SetValue(val, propertyInfo.GetValue(value)); } } AccessTools.Property(typeof(ItemData), "Type").SetValue(val, Item); AccessTools.Property(typeof(ItemData), "MaxUses").SetValue(val, 1); AccessTools.Property(typeof(ItemData), "Icon").SetValue(val, Instance?._icon); val.Initialize(); ItemData[] array = (ItemData[])ItemsField.GetValue(__instance); Array.Resize(ref array, array.Length + 1); array[^1] = val; ItemsField.SetValue(__instance, array); dictionary[Item] = val; Log.LogInfo((object)$"[Night Wolf Hawk] Registered item type {(int)Item}."); } } [HarmonyPatch(typeof(ItemSpawnerSettings), "ResetRuntimeData")] private static class ItemSpawnerPatch { private static readonly FieldInfo SpawnChancesField = AccessTools.Field(typeof(ItemPool), "spawnChances"); private static readonly FieldInfo TotalWeightField = AccessTools.Field(typeof(ItemPool), "totalSpawnChanceWeight"); private static void Postfix(ItemSpawnerSettings __instance) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)__instance.AheadOfBallItemPool == (Object)null)) { SpawnWeights[0] = Inject(__instance.AheadOfBallItemPool); for (int i = 0; i < __instance.ItemPools.Count && i + 1 < SpawnWeights.Length; i++) { SpawnWeights[i + 1] = Inject(__instance.ItemPools[i].pool); } Log.LogInfo((object)"[Night Wolf Hawk] Added to regular item pools (50% each; mobility: 0%)."); } } private static float Inject(ItemPool pool) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_0043: 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_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)pool == (Object)null) { return 0f; } ItemSpawnChance[] array = ((ItemSpawnChance[])SpawnChancesField.GetValue(pool)) ?? Array.Empty(); ItemSpawnChance[] array2 = array; foreach (ItemSpawnChance val in array2) { if (val.item == Item) { return val.spawnChanceWeight; } } float num = 0f; array2 = array; foreach (ItemSpawnChance val2 in array2) { num += val2.spawnChanceWeight; } float num2 = NightWolfHawkRules.WeightForFiftyPercentChance(num); if (num2 <= 0f) { return 0f; } ItemSpawnChance[] array3 = (ItemSpawnChance[])(object)new ItemSpawnChance[array.Length + 1]; Array.Copy(array, array3, array.Length); array3[^1] = new ItemSpawnChance { item = Item, spawnChanceWeight = num2 }; SpawnChancesField.SetValue(pool, array3); TotalWeightField.SetValue(pool, num + num2); return num2; } } [HarmonyPatch(typeof(MatchSetupRules), "GetWeight")] private static class MatchSetupWeightPatch { private static void Postfix(int poolIndex, ItemType itemType, ref float __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (itemType == Item && poolIndex >= 0 && poolIndex < SpawnWeights.Length) { __result = SpawnWeights[poolIndex]; } } } [HarmonyPatch(typeof(MatchSetupRules), "GetDefaultWeight")] private static class MatchSetupDefaultWeightPatch { private static void Postfix(int poolIndex, ItemType itemType, ref float __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (itemType == Item && poolIndex >= 0 && poolIndex < SpawnWeights.Length) { __result = SpawnWeights[poolIndex]; } } } [HarmonyPatch(typeof(MatchSetupRules), "GetDefaultItemFactor")] private static class MatchSetupDefaultFactorPatch { private static void Postfix(int poolIndex, ItemType itemType, ref float __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (itemType == Item) { __result = ((poolIndex >= 0 && poolIndex < SpawnWeights.Length) ? 0.5f : 0f); } } } [HarmonyPatch] private static class MatchSetupCustomWeightChangedPatch { private static readonly MethodInfo UpdateTotalWeightMethod = AccessTools.Method(typeof(MatchSetupRules), "UpdateTotalWeightForPool", (Type[])null, (Type[])null); private static MethodBase TargetMethod() { return AccessTools.Method(typeof(MatchSetupRules), "OnSpawnChanceWeightsChangedInItemPool", new Type[1] { typeof(ItemPoolId) }, (Type[])null); } private static bool Prefix(MatchSetupRules __instance, ItemPoolId itemPoolId) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (itemPoolId.itemType != Item) { return true; } UpdateTotalWeightMethod.Invoke(__instance, new object[1] { itemPoolId.itemPoolIndex }); return false; } } [HarmonyPatch(typeof(MatchSetupRules), "Update")] private static class MatchSetupUpdatePatch { private static readonly FieldInfo CurrentItemPoolDirtyField = AccessTools.Field(typeof(MatchSetupRules), "currentItemPoolDirty"); private static readonly MethodInfo GetCurrentItemPoolMethod = AccessTools.Method(typeof(MatchSetupRules), "GetCurrentItemPool", (Type[])null, (Type[])null); private static readonly FieldInfo CurrentItemPoolIndexField = AccessTools.Field(typeof(MatchSetupRules), "currentItemPoolIndex"); private static readonly FieldInfo SpawnChanceWeightsField = AccessTools.Field(typeof(MatchSetupRules), "spawnChanceWeights"); private static readonly FieldInfo SpawnChanceSlidersField = AccessTools.Field(typeof(MatchSetupRules), "spawnChanceSliders"); private static bool Prefix(MatchSetupRules __instance) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008c: 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_0096: 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: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Expected I4, but got Unknown //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011a: 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_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) if (!MatchSetupMenu.IsActive) { return false; } if (!(bool)CurrentItemPoolDirtyField.GetValue(__instance)) { return false; } ItemPool val = (ItemPool)GetCurrentItemPoolMethod.Invoke(__instance, null); int num = (int)CurrentItemPoolIndexField.GetValue(__instance); IDictionary dictionary = (IDictionary)SpawnChanceWeightsField.GetValue(__instance); List list = (List)SpawnChanceSlidersField.GetValue(__instance); int[] itemOrderLookup = __instance.itemOrderLookup; float num2 = 0f; ItemSpawnChance[] spawnChances = val.SpawnChances; foreach (ItemSpawnChance val2 in spawnChances) { ItemPoolId key = ItemPoolId.Get(num, val2.item); if (dictionary.ContainsKey(key)) { num2 += dictionary[key]; } } spawnChances = val.SpawnChances; foreach (ItemSpawnChance val3 in spawnChances) { if (val3.item == Item) { continue; } int num3 = val3.item - 1; if (num3 >= 0 && num3 < itemOrderLookup.Length) { int num4 = itemOrderLookup[num3]; if (num4 >= 0 && num4 < list.Count) { ItemPoolId key2 = ItemPoolId.Get(num, val3.item); float num5 = ((num2 > float.Epsilon && dictionary.ContainsKey(key2)) ? (dictionary[key2] / num2) : 0f); list[num4].SetValueText($"{num5 * 100f:0.#}%"); } } } CurrentItemPoolDirtyField.SetValue(__instance, false); return false; } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] private static class ItemNamePatch { private static bool Prefix(ItemData __instance, ref string __result) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (__instance.Type != Item) { return true; } __result = "Night Wolf Hawk"; return false; } } [HarmonyPatch(typeof(PlayerInventory), "ServerTryAddItem")] private static class AddItemPatch { private static readonly FieldInfo SlotsField = AccessTools.Field(typeof(PlayerInventory), "slots"); private static bool Prefix(PlayerInventory __instance, ItemType itemToAdd, int remainingUses, ref bool __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (itemToAdd != Item) { return true; } int index = default(int); if (!NetworkServer.active || !__instance.HasSpaceForItem(ref index)) { __result = false; return false; } ((IList)SlotsField.GetValue(__instance))[index] = new InventorySlot(Item, Math.Max(1, remainingUses)); __result = true; return false; } } [HarmonyPatch(typeof(PlayerInventory), "GetEffectivelyEquippedItem")] private static class EquippedItemPatch { private static void Postfix(PlayerInventory __instance, bool ignoreEquipmentHiding, ref ItemType __result) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) if (!ignoreEquipmentHiding && __instance.GetEffectivelyEquippedItem(true) == Item) { __result = (ItemType)4; } } } [HarmonyPatch(typeof(PlayerInventory), "TryUseItem")] private static class UseItemPatch { private static bool Prefix(PlayerInventory __instance, ref bool shouldEatInput, ref bool __result) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) if (__instance.GetEffectivelyEquippedItem(true) != Item) { return true; } if (!NetworkClient.active || !NetworkClient.ready || __instance.EquippedItemIndex < 0) { __result = false; return false; } NetworkClient.Send(new NightWolfHawkUseRequest { SlotIndex = __instance.EquippedItemIndex }, 0); shouldEatInput = true; __result = true; return false; } } public const string PluginGuid = "com.shadowforce.sbg.nightwolfhawk"; public const string PluginName = "Night Wolf Hawk"; public const string PluginVersion = "0.7.5"; public const string ItemName = "Night Wolf Hawk"; public static readonly ItemType Item = (ItemType)220; internal static Plugin? Instance; internal static ManualLogSource Log = null; internal static ConfigEntry GrantStartingItem = null; internal static ConfigEntry SelfTargetWhenAlone = null; internal static ConfigEntry AutoUseWhenAlone = null; internal static ConfigEntry InfiniteUsesWhenAlone = null; private Harmony? _harmony; private PlayerInventory? _announcedInventory; private bool _itemNameRegistered; private Texture2D? _image; private Sprite? _icon; private readonly List _sounds = new List(); private float _distractionStartedAt = float.NegativeInfinity; private float _distractionDuration; private ScreenEdge _screenEdge; private const float SlideInSeconds = 0.45f; private const float SlideOutSeconds = 0.55f; private const float MinimumVisibleSeconds = 3.5f; private const float BottomCrop = 36f; private static readonly float[] SpawnWeights = new float[5]; private string AssetDirectory => Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "assets"); private void Awake() { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; GrantStartingItem = ((BaseUnityPlugin)this).Config.Bind("Testing", "GrantStartingItem", false, "Add Night Wolf Hawk to your inventory when joining for testing."); SelfTargetWhenAlone = ((BaseUnityPlugin)this).Config.Bind("Testing", "SelfTargetWhenAlone", false, "Echo the distraction to the user when no opponents are connected."); AutoUseWhenAlone = ((BaseUnityPlugin)this).Config.Bind("Testing", "AutoUseWhenAlone", false, "Automatically use Night Wolf Hawk after joining a solo session."); InfiniteUsesWhenAlone = ((BaseUnityPlugin)this).Config.Bind("Testing", "InfiniteUsesWhenAlone", true, "Do not consume Night Wolf Hawk when it is used in a solo session."); LoadImage(); LoadSounds(); _harmony = new Harmony("com.shadowforce.sbg.nightwolfhawk"); _harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Night Wolf Hawk 0.7.5 loaded (no Issa dependency)."); } private void OnDestroy() { Harmony? harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } if ((Object)(object)_icon != (Object)null) { Object.Destroy((Object)(object)_icon); } if ((Object)(object)_image != (Object)null) { Object.Destroy((Object)(object)_image); } if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } private void Update() { if (!_itemNameRegistered) { _itemNameRegistered = TryRegisterItemName(); } if (!NetworkClient.active || !NetworkClient.ready) { _announcedInventory = null; return; } PlayerInventory localPlayerInventory = GameManager.LocalPlayerInventory; if (!((Object)(object)localPlayerInventory == (Object)null) && NightWolfHawkRules.ShouldRequestStartingItem(GrantStartingItem.Value, (Object)(object)localPlayerInventory == (Object)(object)_announcedInventory)) { _announcedInventory = localPlayerInventory; NetworkClient.Send(default(NightWolfHawkReadyMessage), 0); if (AutoUseWhenAlone.Value && NetworkServer.active && NetworkServer.connections.Count <= 1) { ((MonoBehaviour)this).StartCoroutine(AutoUse(localPlayerInventory)); } } } private bool TryRegisterItemName() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected I4, but got Unknown try { StringTable table = ((LocalizedDatabase)(object)LocalizationSettings.StringDatabase).GetTable(TableReference.op_Implicit("Data"), (Locale)null); if ((Object)(object)table == (Object)null) { return false; } ((DetailedLocalizationTable)(object)table).AddEntry($"ITEM_{(int)Item}", "Night Wolf Hawk"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Night Wolf Hawk] Registered friendly item name 'Night Wolf Hawk'."); return true; } catch { return false; } } private IEnumerator AutoUse(PlayerInventory inventory) { yield return (object)new WaitForSecondsRealtime(1f); IList list = (IList)AccessTools.Field(typeof(PlayerInventory), "slots").GetValue(inventory); for (int i = 0; i < list.Count; i++) { if (list[i].itemType == Item) { NetworkClient.Send(new NightWolfHawkUseRequest { SlotIndex = i }, 0); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Night Wolf Hawk] Solo auto-use test requested."); yield break; } } ((BaseUnityPlugin)this).Logger.LogWarning((object)"[Night Wolf Hawk] Solo auto-use could not find the item."); } private string ChooseSoundFileName() { if (_sounds.Count != 0) { return Path.GetFileName(_sounds[Random.Range(0, _sounds.Count)]); } return string.Empty; } internal void ShowDistraction(string soundFileName) { string text = _sounds.Find((string path) => string.Equals(Path.GetFileName(path), soundFileName, StringComparison.OrdinalIgnoreCase)); float num = 0f; if (text != null) { num = PlaySound(text); } else if (!string.IsNullOrEmpty(soundFileName)) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[Night Wolf Hawk] Server selected missing sound " + soundFileName + ".")); } _screenEdge = (ScreenEdge)Random.Range(0, 4); _distractionStartedAt = Time.unscaledTime; _distractionDuration = Mathf.Max(3.5f, num + 0.55f); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Night Wolf Hawk] Opponent distraction shown from {_screenEdge} using {soundFileName}."); } private float PlaySound(string path) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0055: 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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) System coreSystem = RuntimeManager.CoreSystem; Sound val2 = default(Sound); RESULT val = ((System)(ref coreSystem)).createSound(path, (MODE)16392, ref val2); if ((int)val != 0) { ((BaseUnityPlugin)this).Logger.LogWarning((object)$"[Night Wolf Hawk] FMOD could not open {Path.GetFileName(path)}: {val}."); return 0f; } uint num = default(uint); ((Sound)(ref val2)).getLength(ref num, (TIMEUNIT)1); coreSystem = RuntimeManager.CoreSystem; Channel channel = default(Channel); val = ((System)(ref coreSystem)).playSound(val2, default(ChannelGroup), true, ref channel); if ((int)val != 0) { ((Sound)(ref val2)).release(); ((BaseUnityPlugin)this).Logger.LogWarning((object)$"[Night Wolf Hawk] FMOD could not play {Path.GetFileName(path)}: {val}."); return 0f; } ((Channel)(ref channel)).setVolume(GetGameSfxVolume()); ((Channel)(ref channel)).setPaused(false); float num2 = (float)num / 1000f; ((MonoBehaviour)this).StartCoroutine(MaintainSound(val2, channel, num2 + 0.25f)); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Night Wolf Hawk] FMOD playing {Path.GetFileName(path)} ({num2:0.0}s)."); return num2; } private static float GetGameSfxVolume() { return Mathf.Clamp01(GameSettings.All.Audio.MasterVolume * GameSettings.All.Audio.SfxVolume); } private static IEnumerator MaintainSound(Sound sound, Channel channel, float duration) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) float endTime = Time.unscaledTime + duration; while (Time.unscaledTime < endTime) { ((Channel)(ref channel)).setVolume(GetGameSfxVolume()); yield return null; } ((Sound)(ref sound)).release(); } private void OnGUI() { //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_image == (Object)null) { return; } float num = Time.unscaledTime - _distractionStartedAt; if (!(num < 0f) && !(num >= _distractionDuration)) { float num2 = Mathf.Min(340f, (float)Screen.width * 0.22f); float num3 = num2 * (float)((Texture)_image).height / (float)((Texture)_image).width; float progress = 1f; if (num < 0.45f) { progress = Mathf.SmoothStep(0f, 1f, num / 0.45f); } else if (num > _distractionDuration - 0.55f) { progress = 1f - Mathf.SmoothStep(0f, 1f, (num - (_distractionDuration - 0.55f)) / 0.55f); } Vector2 imageCenter = GetImageCenter(_screenEdge, progress, num2, num3); float num4 = _screenEdge switch { ScreenEdge.Top => 180f, ScreenEdge.Left => 90f, ScreenEdge.Right => -90f, _ => 0f, }; float num5 = 1f + 0.035f * Mathf.Abs(Mathf.Sin(num * 8f)); float num6 = num4 + 1.75f * Mathf.Sin(num * 11f); num2 *= num5; num3 *= num5; Matrix4x4 matrix = GUI.matrix; GUIUtility.RotateAroundPivot(num6, imageCenter); GUI.DrawTexture(new Rect(imageCenter.x - num2 / 2f, imageCenter.y - num3 / 2f, num2, num3), (Texture)(object)_image, (ScaleMode)2, true); GUI.matrix = matrix; } } private static Vector2 GetImageCenter(ScreenEdge edge, float progress, float width, float height) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: 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_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) return (Vector2)(edge switch { ScreenEdge.Top => new Vector2((float)Screen.width - width / 2f - 18f, Mathf.Lerp((0f - height) / 2f, height / 2f - 36f, progress)), ScreenEdge.Left => new Vector2(Mathf.Lerp((0f - height) / 2f, height / 2f - 36f, progress), (float)Screen.height - width / 2f - 18f), ScreenEdge.Right => new Vector2(Mathf.Lerp((float)Screen.width + height / 2f, (float)Screen.width - height / 2f + 36f, progress), (float)Screen.height - width / 2f - 18f), _ => new Vector2((float)Screen.width - width / 2f - 18f, Mathf.Lerp((float)Screen.height + height / 2f, (float)Screen.height - height / 2f + 36f, progress)), }); } private void LoadImage() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) string text = Path.Combine(AssetDirectory, "night-wolf-hawk-person.png"); if (!File.Exists(text)) { ((BaseUnityPlugin)this).Logger.LogError((object)("[Night Wolf Hawk] Missing image: " + text)); return; } _image = new Texture2D(2, 2, (TextureFormat)4, false) { name = "Night Wolf Hawk", filterMode = (FilterMode)1, wrapMode = (TextureWrapMode)1 }; if (!ImageConversion.LoadImage(_image, File.ReadAllBytes(text), true)) { Object.Destroy((Object)(object)_image); _image = null; ((BaseUnityPlugin)this).Logger.LogError((object)("[Night Wolf Hawk] Could not decode image: " + text)); } else { _icon = Sprite.Create(_image, new Rect(0f, 0f, (float)((Texture)_image).width, (float)((Texture)_image).height), new Vector2(0.5f, 0.5f), 100f); ((Object)_icon).name = "Night Wolf Hawk Inventory Icon"; ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Night Wolf Hawk] Loaded image {((Texture)_image).width}x{((Texture)_image).height}."); } } private void LoadSounds() { if (Directory.Exists(AssetDirectory)) { string[] files = Directory.GetFiles(AssetDirectory, "*.mp3"); foreach (string item in files) { _sounds.Add(item); } if (_sounds.Count == 0) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[Night Wolf Hawk] No MP3 sounds were found."); } else { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[Night Wolf Hawk] Found {_sounds.Count} MP3 sound(s)."); } } } private static void RegisterNetworkMessages() { Writer.write = delegate { }; Reader.read = (NetworkReader _) => default(NightWolfHawkReadyMessage); Writer.write = delegate(NetworkWriter writer, NightWolfHawkUseRequest message) { NetworkWriterExtensions.WriteInt(writer, message.SlotIndex); }; Reader.read = (NetworkReader reader) => new NightWolfHawkUseRequest { SlotIndex = NetworkReaderExtensions.ReadInt(reader) }; Writer.write = delegate(NetworkWriter writer, NightWolfHawkDistractionMessage message) { NetworkWriterExtensions.WriteString(writer, message.SoundFileName); }; Reader.read = (NetworkReader reader) => new NightWolfHawkDistractionMessage { SoundFileName = NetworkReaderExtensions.ReadString(reader) }; NetworkClient.RegisterHandler((Action)delegate(NightWolfHawkDistractionMessage message) { Instance?.ShowDistraction(message.SoundFileName); }, true); if (NetworkServer.active) { NetworkServer.RegisterHandler((Action)ServerGrantItem, true); NetworkServer.RegisterHandler((Action)ServerUseItem, true); } Log.LogInfo((object)"[Night Wolf Hawk] Network messages registered."); } private static void ServerGrantItem(NetworkConnectionToClient connection, NightWolfHawkReadyMessage _) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) NetworkIdentity identity = ((NetworkConnection)connection).identity; PlayerInventory val = ((identity != null) ? ((Component)identity).GetComponent() : null); if ((Object)(object)val == (Object)null) { Log.LogWarning((object)"[Night Wolf Hawk] Could not find the joining player's inventory."); } else { Log.LogInfo((object)(val.ServerTryAddItem(Item, 1) ? "[Night Wolf Hawk] Added to a player's starting inventory." : "[Night Wolf Hawk] A player's inventory was full.")); } } private static void ServerUseItem(NetworkConnectionToClient sender, NightWolfHawkUseRequest message) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) NetworkIdentity identity = ((NetworkConnection)sender).identity; PlayerInventory val = ((identity != null) ? ((Component)identity).GetComponent() : null); if ((Object)(object)val == (Object)null) { return; } IList list = (IList)AccessTools.Field(typeof(PlayerInventory), "slots").GetValue(val); if (message.SlotIndex < 0 || message.SlotIndex >= list.Count || list[message.SlotIndex].itemType != Item) { Log.LogWarning((object)"[Night Wolf Hawk] Rejected an invalid use request."); return; } bool flag = NightWolfHawkRules.ShouldConsumeItem(NetworkServer.connections.Count, InfiniteUsesWhenAlone.Value); if (flag) { list[message.SlotIndex] = InventorySlot.Empty; } string text = Instance?.ChooseSoundFileName() ?? string.Empty; NightWolfHawkDistractionMessage nightWolfHawkDistractionMessage = new NightWolfHawkDistractionMessage { SoundFileName = text }; int num = 0; foreach (NetworkConnectionToClient value in NetworkServer.connections.Values) { if (value != null && NightWolfHawkRules.ShouldDistractRecipient(value == sender, ((NetworkConnection)value).isReady)) { ((NetworkConnection)value).Send(nightWolfHawkDistractionMessage, 0); num++; } } bool flag2 = NightWolfHawkRules.ShouldSelfTarget(num, SelfTargetWhenAlone.Value); if (flag2) { ((NetworkConnection)sender).Send(nightWolfHawkDistractionMessage, 0); } Log.LogInfo((object)$"[Night Wolf Hawk] Used {text}; distracted {num} opponent(s); solo self-test={flag2}; item consumed={flag}."); } } [StructLayout(LayoutKind.Sequential, Size = 1)] public struct NightWolfHawkReadyMessage : NetworkMessage { } public struct NightWolfHawkUseRequest : NetworkMessage { public int SlotIndex; } public struct NightWolfHawkDistractionMessage : NetworkMessage { public string SoundFileName; } }