using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EnderBag.Networking;
using Microsoft.CodeAnalysis;
using On.RoR2;
using On.RoR2.Artifacts;
using R2API;
using R2API.Utils;
using RoR2;
using UnityEngine;
using UnityEngine.Networking;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("EnderBag")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+a5ab786cec30e2bef4339eb8ac409eac7469cc28")]
[assembly: AssemblyProduct("EnderBag")]
[assembly: AssemblyTitle("EnderBag")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace EnderBag
{
internal static class Assets
{
internal static GameObject EnderBagPrefab;
internal static Sprite EnderBagIcon;
internal static ItemDef EnderBagItem;
private const string ModPrefix = "@EnderBag:";
internal static void Init()
{
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EnderBag.enderbag"))
{
AssetBundle val = AssetBundle.LoadFromStream(stream);
EnderBagPrefab = val.LoadAsset<GameObject>("Assets/Import/enderbag/enderbag.prefab");
EnderBagIcon = val.LoadAsset<Sprite>("Assets/Import/enderbag_icon/ender_bag_icon.png");
}
EnderBagAsRedTierItem();
AddLanguageTokens();
}
private static void EnderBagAsRedTierItem()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Expected O, but got Unknown
ItemDef val = new ItemDef();
((Object)val).name = "EnderBag";
val.deprecatedTier = (ItemTier)2;
val.pickupModelPrefab = EnderBagPrefab;
val.pickupIconSprite = EnderBagIcon;
val.nameToken = "ENDERBAG_NAME";
val.pickupToken = "ENDERBAG_PICKUP";
val.descriptionToken = "ENDERBAG_DESC";
val.loreToken = "ENDERBAG_LORE";
val.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 };
EnderBagItem = val;
ItemDisplayRule[] array = (ItemDisplayRule[])(object)new ItemDisplayRule[0];
CustomItem val2 = new CustomItem(EnderBagItem, array);
ItemAPI.Add(val2);
}
private static void AddLanguageTokens()
{
LanguageAPI.Add("ENDERBAG_NAME", "Ender Bag");
LanguageAPI.Add("ENDERBAG_PICKUP", "Chance to share picked-up items with teammates.");
LanguageAPI.Add("ENDERBAG_DESC", $"Picking up an item has a <style=cIsUtility>15%</style> <style=cStack>(+10% per stack)</style> chance to send it to allies holding an <style=cIsUtility>Ender Bag</style>. \nItems are shared between players that possess this item. \nStored items may return to you at random after multiple pickups if no allies are eligible.\nTotal Chance: <style=cIsUtility>{EnderBag.ItemShareChance}%</style>");
LanguageAPI.Add("ENDERBAG_LORE", "A velvet pouch stitched with strands of spatial thread, its interior infinitely larger than its shell. \\n\\nDiscovered sealed in an obsidian vault behind the Fourth Altar, it whispers across dimensions when opened. The Archivists believe it once belonged to a long-dead courier who could never decide *what* to carry or *who* to trust.\\n\\nNow, it seems, neither choice matters.\"");
}
}
public static class Blacklist
{
private static ItemMask _cachedAvailableItems = new ItemMask();
private static ItemMask _items = new ItemMask();
private static EquipmentMask _equipment = new EquipmentMask();
private static readonly List<PickupIndex> _availableTier1DropList = new List<PickupIndex>();
private static readonly List<PickupIndex> _availableTier2DropList = new List<PickupIndex>();
private static readonly List<PickupIndex> _availableTier3DropList = new List<PickupIndex>();
private static readonly List<PickupIndex> _availableLunarDropList = new List<PickupIndex>();
private static readonly List<PickupIndex> _availableBossDropList = new List<PickupIndex>();
private static readonly List<PickupIndex> _availableVoidDropList = new List<PickupIndex>();
public static List<PickupIndex> AvailableTier1DropList => Get(_availableTier1DropList);
public static List<PickupIndex> AvailableTier2DropList => Get(_availableTier2DropList);
public static List<PickupIndex> AvailableTier3DropList => Get(_availableTier3DropList);
public static List<PickupIndex> AvailableLunarDropList => Get(_availableLunarDropList);
public static List<PickupIndex> AvailableBossDropList => Get(_availableBossDropList);
public static List<PickupIndex> AvailableVoidDropList => Get(_availableVoidDropList);
private static void LoadBlackListItems()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Invalid comparison between Unknown and I4
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
_items = new ItemMask();
string[] array = EnderBag.ItemBlacklist.Value.Split(',');
foreach (string text in array)
{
ItemIndex val = ItemCatalog.FindItemIndex(text);
if ((int)val != -1)
{
_items.Add(val);
}
}
}
private static void LoadBlackListEquipment()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Invalid comparison between Unknown and I4
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
_equipment = new EquipmentMask();
string[] array = EnderBag.EquipmentBlacklist.Value.Split(',');
foreach (string text in array)
{
EquipmentIndex val = EquipmentCatalog.FindEquipmentIndex(text);
if ((int)val != -1)
{
_equipment.Add(val);
}
}
}
public static bool HasItem(ItemIndex itemIndex)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
ValidateItemCache();
return _items.Contains(itemIndex);
}
public static bool HasEquipment(EquipmentIndex equipmentIndex)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
ValidateItemCache();
return _equipment.Contains(equipmentIndex);
}
public static void Recalculate()
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Expected O, but got Unknown
_cachedAvailableItems = new ItemMask();
}
private static void ValidateItemCache()
{
if ((Object)(object)Run.instance == (Object)null)
{
Recalculate();
}
else
{
if (((object)_cachedAvailableItems).Equals((object?)Run.instance.availableItems))
{
return;
}
_cachedAvailableItems = Run.instance.availableItems;
LoadBlackListItems();
LoadBlackListEquipment();
IEnumerable<PickupIndex> item = new List<PickupIndex>().Concat(Run.instance.availableVoidTier1DropList).Concat(Run.instance.availableVoidTier2DropList).Concat(Run.instance.availableVoidTier3DropList)
.Concat(Run.instance.availableVoidBossDropList);
(List<PickupIndex>, IEnumerable<PickupIndex>)[] array = new(List<PickupIndex>, IEnumerable<PickupIndex>)[6]
{
(_availableTier1DropList, Run.instance.availableTier1DropList),
(_availableTier2DropList, Run.instance.availableTier2DropList),
(_availableTier3DropList, Run.instance.availableTier3DropList),
(_availableLunarDropList, Run.instance.availableLunarItemDropList),
(_availableBossDropList, Run.instance.availableBossDropList),
(_availableVoidDropList, item)
};
(List<PickupIndex>, IEnumerable<PickupIndex>)[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
var (list, source) = array2[i];
list.Clear();
list.AddRange(source.Where(delegate(PickupIndex pickupIndex)
{
//IL_0001: 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)
PickupDef pickupDef = PickupCatalog.GetPickupDef(pickupIndex);
return pickupDef != null && !_items.Contains(pickupDef.itemIndex);
}));
}
}
}
private static List<PickupIndex> Get(List<PickupIndex> list)
{
ValidateItemCache();
return list;
}
}
public static class ChatHandler
{
public delegate void SendPickupMessageDelegate(CharacterMaster master, PickupIndex pickupIndex);
[CompilerGenerated]
private static class <>O
{
public static hook_SendPlayerConnectedMessage <0>__SendIntroMessage;
}
private const string GrayColor = "7e91af";
private const string RedColor = "ed4c40";
private const string LinkColor = "5cb1ed";
private const string ErrorColor = "ff0000";
private const string NotSharingColor = "f07d6e";
private static readonly string[] PlayerColors = new string[8] { "f23030", "2083fc", "f1f41a", "4dc344", "f27b0c", "3cdede", "db46bd", "9400ea" };
public static readonly SendPickupMessageDelegate SendPickupMessage = (SendPickupMessageDelegate)Delegate.CreateDelegate(typeof(SendPickupMessageDelegate), typeof(GenericPickupController).GetMethod("SendPickupMessage", BindingFlags.Static | BindingFlags.Public) ?? throw new MissingMethodException("Unable to find SendPickupMessage"));
public static void UnHook()
{
//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_001c: Expected O, but got Unknown
object obj = <>O.<0>__SendIntroMessage;
if (obj == null)
{
hook_SendPlayerConnectedMessage val = SendIntroMessage;
<>O.<0>__SendIntroMessage = val;
obj = (object)val;
}
Chat.SendPlayerConnectedMessage -= (hook_SendPlayerConnectedMessage)obj;
}
public static void Hook()
{
//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_001c: Expected O, but got Unknown
object obj = <>O.<0>__SendIntroMessage;
if (obj == null)
{
hook_SendPlayerConnectedMessage val = SendIntroMessage;
<>O.<0>__SendIntroMessage = val;
obj = (object)val;
}
Chat.SendPlayerConnectedMessage += (hook_SendPlayerConnectedMessage)obj;
}
public static void SendIntroMessage(orig_SendPlayerConnectedMessage orig, NetworkUser user)
{
}
public static void SendRichPickupMessage(CharacterMaster player, PickupDef pickupDef)
{
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: 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_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: 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)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0109: Expected O, but got Unknown
//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_0243: Unknown result type (might be due to invalid IL or missing references)
//IL_0248: Unknown result type (might be due to invalid IL or missing references)
//IL_0255: Expected O, but got Unknown
//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
//IL_01be: Expected O, but got Unknown
CharacterBody val = (player.hasBody ? player.GetBody() : null);
if (!GeneralHooks.IsMultiplayer() || (Object)(object)val == (Object)null)
{
SendPickupMessage(player, pickupDef.pickupIndex);
return;
}
Color baseColor = pickupDef.baseColor;
string @string = Language.GetString(pickupDef.nameToken);
string playerColor = GetPlayerColor(player.playerCharacterMasterController);
int itemCount = player.inventory.GetItemCount(pickupDef.itemIndex);
if (pickupDef.coinValue != 0)
{
string baseToken = "<color=#" + playerColor + ">" + val.GetUserName() + "</color> <color=#7e91af>picked up</color> <color=#" + ColorUtility.ToHtmlStringRGB(baseColor) + ">" + string.Format("{0} ({1})</color> <color=#{2}>for themselves.</color>", string.IsNullOrEmpty(@string) ? "???" : @string, pickupDef.coinValue, "7e91af");
Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
{
baseToken = baseToken
});
}
else if (Blacklist.HasItem(pickupDef.itemIndex) || !ShareItem.IsValidItemPickup(pickupDef.pickupIndex))
{
string baseToken2 = "<color=#" + playerColor + ">" + val.GetUserName() + "</color> <color=#7e91af>picked up</color> <color=#" + ColorUtility.ToHtmlStringRGB(baseColor) + ">" + string.Format("{0} ({1})</color> <color=#{2}>for themselves. </color>", string.IsNullOrEmpty(@string) ? "???" : @string, itemCount, "7e91af") + "<color=#f07d6e>(Item Set to NOT be Shared)</color>";
Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
{
baseToken = baseToken2
});
}
else
{
string baseToken3 = "<color=#" + playerColor + ">" + val.GetUserName() + "</color> <color=#7e91af>picked up</color> <color=#" + ColorUtility.ToHtmlStringRGB(baseColor) + ">" + string.Format("{0} ({1})</color> <color=#{2}>for themselves</color>", string.IsNullOrEmpty(@string) ? "???" : @string, itemCount, "7e91af") + ItemPickupFormatter(val) + "<color=#7e91af>.</color>";
Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
{
baseToken = baseToken3
});
}
}
public static void SendRichCauldronMessage(CharacterMaster player, PickupIndex index)
{
//IL_003d: 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_006b: 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_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: 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_00f6: Expected O, but got Unknown
CharacterBody val = (player.hasBody ? player.GetBody() : null);
if (!GeneralHooks.IsMultiplayer() || (Object)(object)val == (Object)null)
{
SendPickupMessage(player, index);
return;
}
PickupDef pickupDef = PickupCatalog.GetPickupDef(index);
Color baseColor = pickupDef.baseColor;
string @string = Language.GetString(pickupDef.nameToken);
string playerColor = GetPlayerColor(player.playerCharacterMasterController);
int itemCount = player.inventory.GetItemCount(pickupDef.itemIndex);
string baseToken = "<color=#" + playerColor + ">" + val.GetUserName() + "</color> <color=#7e91af>traded for</color> <color=#" + ColorUtility.ToHtmlStringRGB(baseColor) + ">" + string.Format("{0} ({1})</color><color=#{2}>.</color>", string.IsNullOrEmpty(@string) ? "???" : @string, itemCount, "7e91af");
Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
{
baseToken = baseToken
});
}
public static void SendRichRandomizedPickupMessage(CharacterMaster origPlayer, PickupDef origPickup, Dictionary<CharacterMaster, PickupDef> pickupIndices)
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
//IL_01b5: Expected O, but got Unknown
if (!GeneralHooks.IsMultiplayer())
{
SendPickupMessage(origPlayer, origPickup.pickupIndex);
return;
}
if (pickupIndices.Count == 1)
{
SendRichPickupMessage(origPlayer, origPickup);
return;
}
int num = pickupIndices.Count;
string text = "";
foreach (KeyValuePair<CharacterMaster, PickupDef> pickupIndex in pickupIndices)
{
Color baseColor = pickupIndex.Value.baseColor;
string @string = Language.GetString(pickupIndex.Value.nameToken);
string playerColor = GetPlayerColor(pickupIndex.Key.playerCharacterMasterController);
int itemCount = pickupIndex.Key.playerCharacterMasterController.master.inventory.GetItemCount(pickupIndex.Value.itemIndex);
if (num != pickupIndices.Count)
{
if (num > 1)
{
text += "<color=#7e91af>,</color> ";
}
else if (num == 1)
{
text += "<color=#7e91af>, and</color> ";
}
}
num--;
text = text + "<color=#" + playerColor + ">" + pickupIndex.Key.playerCharacterMasterController.GetDisplayName() + "</color> <color=#7e91af>got</color> <color=#" + ColorUtility.ToHtmlStringRGB(baseColor) + ">" + string.Format("{0} ({1})</color>", string.IsNullOrEmpty(@string) ? "???" : @string, itemCount);
}
Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
{
baseToken = text
});
}
private static string ItemPickupFormatter(CharacterBody body)
{
int num = GetEligiblePlayers(body);
if (num < 1)
{
return " <color=#7e91af>and no-one else</color>";
}
if (num == 1)
{
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
CharacterMaster master = instance.master;
if (!master.hasBody || (Object)(object)master.GetBody() == (Object)(object)body)
{
continue;
}
string playerColor = GetPlayerColor(instance);
return " <color=#7e91af>and</color> <color=#" + playerColor + ">" + instance.GetDisplayName() + "</color>";
}
return "<color=#ff0000>???</color>";
}
string text = "";
foreach (PlayerCharacterMasterController instance2 in PlayerCharacterMasterController.instances)
{
CharacterMaster master2 = instance2.master;
if (master2.hasBody && !((Object)(object)master2.GetBody() == (Object)(object)body) && !master2.IsDeadAndOutOfLivesServer())
{
string playerColor2 = GetPlayerColor(instance2);
if (num > 1)
{
text += "<color=#7e91af>,</color> ";
}
else if (num == 1)
{
text += "<color=#7e91af>, and</color> ";
}
num--;
text = text + "<color=#" + playerColor2 + ">" + instance2.GetDisplayName() + "</color>";
}
}
return text;
}
private static string GetPlayerColor(PlayerCharacterMasterController controllerMaster)
{
int num = PlayerCharacterMasterController.instances.IndexOf(controllerMaster);
return PlayerColors[num % 8];
}
private static int GetEligiblePlayers(CharacterBody body)
{
int result = 0;
foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
{
CharacterMaster master = instance.master;
if (Object.op_Implicit((Object)(object)master.inventory) && !((Object)(object)master.GetBody() == (Object)(object)body))
{
}
}
return result;
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[R2APISubmoduleDependency(new string[] { "ItemAPI", "LanguageAPI" })]
[BepInPlugin("com.DylanDerEchte.EnderbagItem", "EnderBag", "0.1.0")]
[Obsolete]
public class EnderBag : BaseUnityPlugin
{
public static bool WhiteItemsShared;
public static bool OverrideMultiplayerCheck;
public static bool GreenItemsShared;
public static bool RedItemsShared;
public static bool LunarItemsShared;
public static bool BossItemsShared;
public static bool VoidItemsShared = true;
private static bool _previouslyEnabled = false;
private static bool _modEnabled = false;
public static double ItemShareChance = 0.0;
public static ConfigEntry<string> ItemBlacklist;
public static ConfigEntry<string> EquipmentBlacklist;
public static ConfigEntry<short> NetworkMessageType;
private const string ModVer = "0.1.0";
private const string ModName = "EnderBag";
public const string ModGuid = "com.DylanDerEchte.EnderbagItem";
internal static ManualLogSource Logger;
private void InitConfig()
{
NetworkMessageType = ((BaseUnityPlugin)this).Config.Bind<short>("Settings", "NetworkMessageType", (short)1021, "The identifier for network message for this mod. Must be unique across all mods.");
}
private void LoadHooks()
{
GeneralHooks.Hook();
ShareItem.Hook();
ChatHandler.Hook();
_previouslyEnabled = true;
}
public static void UpdateEnderBagDescription()
{
string text = $"Picking up an item has a <style=cIsUtility>10%</style> <style=cStack>(+10% per stack)</style> chance to send it to allies holding an <style=cIsUtility>Ender Bag</style>. \nItems are shared between players that possess this item. \nStored items may return to you at random after multiple pickups if no allies are eligible.\nTotal Chance: <style=cIsUtility>{ItemShareChance}%</style>";
LanguageAPI.Add("ENDERBAG_DESC", text);
}
public void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
Assets.Init();
}
public EnderBag()
{
InitConfig();
LoadHooks();
}
}
public static class GeneralHooks
{
[CompilerGenerated]
private static class <>O
{
public static hook_DropRewards <0>__BossGroup_DropRewards;
public static hook_PlaceTeleporter <1>__InteractibleCreditOverride;
public static hook_OnPrePopulateSceneServer <2>__SetSacrificeOffset;
public static hook_GetExpAdjustedDropChancePercent <3>__GetExpAdjustedDropChancePercent;
}
private static int _sacrificeOffset = 1;
private static int _bossItems = 1;
private static List<string> NoInteractibleOverrideScenes = new List<string> { "MAP_BAZAAR_TITLE", "MAP_ARENA_TITLE", "MAP_LIMBO_TITLE", "MAP_MYSTERYSPACE_TITLE" };
internal static void Hook()
{
//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_001c: Expected O, but got Unknown
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Expected O, but got Unknown
//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_005e: 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_007f: Expected O, but got Unknown
object obj = <>O.<0>__BossGroup_DropRewards;
if (obj == null)
{
hook_DropRewards val = BossGroup_DropRewards;
<>O.<0>__BossGroup_DropRewards = val;
obj = (object)val;
}
BossGroup.DropRewards += (hook_DropRewards)obj;
object obj2 = <>O.<1>__InteractibleCreditOverride;
if (obj2 == null)
{
hook_PlaceTeleporter val2 = InteractibleCreditOverride;
<>O.<1>__InteractibleCreditOverride = val2;
obj2 = (object)val2;
}
SceneDirector.PlaceTeleporter += (hook_PlaceTeleporter)obj2;
object obj3 = <>O.<2>__SetSacrificeOffset;
if (obj3 == null)
{
hook_OnPrePopulateSceneServer val3 = SetSacrificeOffset;
<>O.<2>__SetSacrificeOffset = val3;
obj3 = (object)val3;
}
SacrificeArtifactManager.OnPrePopulateSceneServer += (hook_OnPrePopulateSceneServer)obj3;
object obj4 = <>O.<3>__GetExpAdjustedDropChancePercent;
if (obj4 == null)
{
hook_GetExpAdjustedDropChancePercent val4 = GetExpAdjustedDropChancePercent;
<>O.<3>__GetExpAdjustedDropChancePercent = val4;
obj4 = (object)val4;
}
Util.GetExpAdjustedDropChancePercent += (hook_GetExpAdjustedDropChancePercent)obj4;
}
internal static void UnHook()
{
//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_001c: Expected O, but got Unknown
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Expected O, but got Unknown
//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_005e: Expected O, but got Unknown
object obj = <>O.<0>__BossGroup_DropRewards;
if (obj == null)
{
hook_DropRewards val = BossGroup_DropRewards;
<>O.<0>__BossGroup_DropRewards = val;
obj = (object)val;
}
BossGroup.DropRewards -= (hook_DropRewards)obj;
object obj2 = <>O.<1>__InteractibleCreditOverride;
if (obj2 == null)
{
hook_PlaceTeleporter val2 = InteractibleCreditOverride;
<>O.<1>__InteractibleCreditOverride = val2;
obj2 = (object)val2;
}
SceneDirector.PlaceTeleporter -= (hook_PlaceTeleporter)obj2;
object obj3 = <>O.<3>__GetExpAdjustedDropChancePercent;
if (obj3 == null)
{
hook_GetExpAdjustedDropChancePercent val3 = GetExpAdjustedDropChancePercent;
<>O.<3>__GetExpAdjustedDropChancePercent = val3;
obj3 = (object)val3;
}
Util.GetExpAdjustedDropChancePercent -= (hook_GetExpAdjustedDropChancePercent)obj3;
}
private static void BossGroup_DropRewards(orig_DropRewards orig, BossGroup group)
{
group.scaleRewardsByPlayerCount = false;
group.bonusRewardCount += _bossItems - 1;
orig.Invoke(group);
}
private static void SetSacrificeOffset(orig_OnPrePopulateSceneServer orig, SceneDirector sceneDirector)
{
_sacrificeOffset = 2;
orig.Invoke(sceneDirector);
}
public static bool IsMultiplayer()
{
return PlayerCharacterMasterController.instances.Count > 1;
}
private static void InteractibleCreditOverride(orig_PlaceTeleporter orig, SceneDirector self)
{
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
orig.Invoke(self);
Debug.Log((object)SceneInfo.instance.sceneDef.nameToken);
int num = 200;
ClassicStageInfo component = ((Component)SceneInfo.instance).GetComponent<ClassicStageInfo>();
if (Object.op_Implicit((Object)(object)component))
{
num = component.sceneDirectorInteractibleCredits;
int num2 = Math.Min(Run.instance.participatingPlayerCount, 8);
float num3 = (float)(0.95 + (double)num2 * 0.05);
num3 *= (float)Math.Max(1.0 + 0.1 * (double)Math.Min(Run.instance.participatingPlayerCount * 2 - Run.instance.stageClearCount - 2, 3), 1.0);
num = (int)((float)num / num3);
if (component.bonusInteractibleCreditObjects != null)
{
BonusInteractibleCreditObject[] bonusInteractibleCreditObjects = component.bonusInteractibleCreditObjects;
foreach (BonusInteractibleCreditObject val in bonusInteractibleCreditObjects)
{
if (val.objectThatGrantsPointsIfEnabled.activeSelf)
{
num += val.points / num2;
}
}
}
}
_sacrificeOffset = 1;
}
private static float GetExpAdjustedDropChancePercent(orig_GetExpAdjustedDropChancePercent orig, float baseChancePercent, GameObject characterBodyObject)
{
baseChancePercent /= (float)PlayerCharacterMasterController.instances.Count;
return orig.Invoke(baseChancePercent, characterBodyObject);
}
}
public static class ShareItem
{
[CompilerGenerated]
private static class <>O
{
public static hook_AttemptGrant <0>__OnGrantItem;
}
public static event Func<GenericPickupController, CharacterBody, bool> AdditionalPickupValidityChecks;
public static void UnHook()
{
//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_001c: Expected O, but got Unknown
object obj = <>O.<0>__OnGrantItem;
if (obj == null)
{
hook_AttemptGrant val = OnGrantItem;
<>O.<0>__OnGrantItem = val;
obj = (object)val;
}
GenericPickupController.AttemptGrant -= (hook_AttemptGrant)obj;
}
public static void Hook()
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Expected O, but got Unknown
Debug.LogError((object)"ENDERBAG: Hooking AttemptGrant");
object obj = <>O.<0>__OnGrantItem;
if (obj == null)
{
hook_AttemptGrant val = OnGrantItem;
<>O.<0>__OnGrantItem = val;
obj = (object)val;
}
GenericPickupController.AttemptGrant += (hook_AttemptGrant)obj;
}
private static void OnGrantItem(orig_AttemptGrant orig, GenericPickupController self, CharacterBody body)
{
//IL_0013: 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_006f: 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_02ad: Unknown result type (might be due to invalid IL or missing references)
Debug.Log((object)"ENDERBAG: AttemptGrant called");
PickupDef pickupDef = PickupCatalog.GetPickupDef(self.pickupIndex);
Debug.Log((object)"ENDERBAG: 1AttemptGrant called");
ItemDef itemDef = ItemCatalog.GetItemDef(pickupDef.itemIndex);
Debug.Log((object)"ENDERBAG: 2AttemptGrant called");
Dictionary<CharacterMaster, PickupDef> dictionary = new Dictionary<CharacterMaster, PickupDef>();
object obj = ((body != null) ? body.master : null);
if (obj == null)
{
Inventory inventory = body.inventory;
obj = ((inventory != null) ? ((Component)inventory).GetComponent<CharacterMaster>() : null);
}
CharacterMaster master = (CharacterMaster)obj;
if (IsValidItemPickup(self.pickupIndex) && IsValidPickupObject(self, body))
{
Debug.LogError((object)"ENDERBAG: 3AttemptGrant called");
EnderBag.ItemShareChance = 15f + (10f * (float)body.inventory.GetItemCount(Assets.EnderBagItem) - 10f);
Debug.Log((object)$"ENDERBAG: ItemShareChance: {EnderBag.ItemShareChance}");
Debug.Log((object)$"ENDERBAG: AttemptGrant called for {((Object)itemDef).name} with pickupIndex {self.pickupIndex} and itemCount {body.inventory.GetItemCount(Assets.EnderBagItem)}");
bool flag = PlayerCharacterMasterController.instances.Select((PlayerCharacterMasterController p) => p.master).Any((CharacterMaster player) => (Object)(object)player != (Object)(object)master && player.inventory.GetItemCount(Assets.EnderBagItem) > 0);
Debug.Log((object)NetworkServer.active);
if (NetworkHandler.IsMultiplayerLobby())
{
float num = Random.Range(0f, 100f);
Debug.Log((object)$"Random Value: {num}, ItemShareChance: {EnderBag.ItemShareChance}");
if ((double)num > EnderBag.ItemShareChance)
{
Debug.Log((object)"Skipping item sharing due to chance logic.");
orig.Invoke(self, body);
return;
}
Debug.Log((object)("Giving item " + ((Object)itemDef).name + " to "));
HandleGiveItem(master, pickupDef);
}
if (!flag)
{
Debug.Log((object)"No other player has the EnderBag item. Skipping sharing logic.");
orig.Invoke(self, body);
return;
}
foreach (CharacterMaster item in PlayerCharacterMasterController.instances.Select((PlayerCharacterMasterController p) => p.master))
{
if (item.IsDeadAndOutOfLivesServer())
{
continue;
}
if ((Object)(object)item.inventory == (Object)(object)body.inventory)
{
if (!((NetworkBehaviour)item).isLocalPlayer)
{
NetworkHandler.SendItemPickupMessage(((NetworkBehaviour)item.playerCharacterMasterController.networkUser).connectionToClient.connectionId, pickupDef.pickupIndex);
}
continue;
}
float num2 = Random.Range(0f, 100f);
Debug.Log((object)$"Random Value: {num2}, ItemShareChance: {EnderBag.ItemShareChance}");
if ((double)num2 > EnderBag.ItemShareChance)
{
Debug.Log((object)"Skipping item sharing due to chance logic.");
continue;
}
Debug.Log((object)("Giving item " + ((Object)itemDef).name + " to "));
HandleGiveItem(item, pickupDef);
}
}
orig.Invoke(self, body);
}
public static bool IsValidItemPickup(PickupIndex pickup)
{
//IL_0001: 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)
//IL_0012: Invalid comparison between Unknown and I4
//IL_0023: 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_0048: 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_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Expected I4, but got Unknown
PickupDef pickupDef = PickupCatalog.GetPickupDef(pickup);
if (pickupDef != null && (int)pickupDef.itemIndex != -1)
{
ItemDef itemDef = ItemCatalog.GetItemDef(pickupDef.itemIndex);
if ((Object)(object)itemDef == (Object)(object)Assets.EnderBagItem)
{
return false;
}
ItemTier tier = itemDef.tier;
ItemTier val = tier;
return (int)val switch
{
0 => true,
1 => true,
2 => true,
3 => false,
4 => true,
6 => false,
7 => false,
8 => false,
9 => false,
10 => true,
_ => false,
};
}
return false;
}
public static bool IsValidPickupObject(GenericPickupController pickup, CharacterBody picker)
{
if (ShareItem.AdditionalPickupValidityChecks == null)
{
return true;
}
bool flag = true;
Delegate[] invocationList = ShareItem.AdditionalPickupValidityChecks.GetInvocationList();
for (int i = 0; i < invocationList.Length; i++)
{
Func<GenericPickupController, CharacterBody, bool> func = (Func<GenericPickupController, CharacterBody, bool>)invocationList[i];
flag &= func(pickup, picker);
}
return flag;
}
private static PickupIndex? GetRandomItemOfTier(ItemTier tier, PickupIndex orDefault)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: 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_0004: 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_0033: Expected I4, but got Unknown
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: 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)
switch ((int)tier)
{
case 0:
return PickRandomOf<PickupIndex>((IList<PickupIndex>)Blacklist.AvailableTier1DropList);
case 1:
return PickRandomOf<PickupIndex>((IList<PickupIndex>)Blacklist.AvailableTier2DropList);
case 2:
return PickRandomOf<PickupIndex>((IList<PickupIndex>)Blacklist.AvailableTier3DropList);
default:
{
PickupDef pickupDef = PickupCatalog.GetPickupDef(orDefault);
if (Blacklist.HasItem(pickupDef.itemIndex))
{
return null;
}
return orDefault;
}
}
}
private static T? PickRandomOf<T>(IList<T> collection) where T : struct
{
return (collection.Count > 0) ? new T?(collection[Random.Range(0, collection.Count)]) : null;
}
private static void HandleGiveItem(CharacterMaster characterMaster, PickupDef pickupDef)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
Debug.Log((object)$"Giving item {pickupDef.itemIndex} to ");
characterMaster.inventory.GiveItem(pickupDef.itemIndex, 1);
NetworkUser networkUser = characterMaster.playerCharacterMasterController.networkUser;
if (!((networkUser == null) ? null : ((NetworkBehaviour)networkUser).connectionToClient?.connectionId).HasValue)
{
}
}
public static void HandleRichMessageUnlockAndNotification(CharacterMaster characterMaster, PickupIndex pickupIndex)
{
//IL_0045: 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_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
if (!((NetworkBehaviour)characterMaster).isLocalPlayer)
{
return;
}
PlayerCharacterMasterController playerCharacterMasterController = characterMaster.playerCharacterMasterController;
if (playerCharacterMasterController != null)
{
NetworkUser networkUser = playerCharacterMasterController.networkUser;
if (networkUser != null)
{
LocalUser localUser = networkUser.localUser;
if (localUser != null)
{
localUser.userProfile.DiscoverPickup(pickupIndex);
}
}
}
if (characterMaster.inventory.GetItemCount(PickupCatalog.GetPickupDef(pickupIndex).itemIndex) <= 1)
{
CharacterMasterNotificationQueue.PushPickupNotification(characterMaster, pickupIndex);
}
}
}
}
namespace EnderBag.Networking
{
public class ItemPickupMessage : MessageBase
{
public PickupIndex PickupIndex { get; private set; }
public ItemPickupMessage()
{
}
public ItemPickupMessage(PickupIndex pickupIndex)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
PickupIndex = pickupIndex;
}
public override void Serialize(NetworkWriter writer)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
NetworkExtensions.Write(writer, PickupIndex);
}
public override void Deserialize(NetworkReader reader)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
PickupIndex = NetworkExtensions.ReadPickupIndex(reader);
}
}
public static class NetworkHandler
{
[CompilerGenerated]
private static class <>O
{
public static NetworkMessageDelegate <0>__ItemPickupHandler;
}
public static bool IsMultiplayerLobby()
{
return RoR2Application.isInSinglePlayer;
}
public static void RegisterHandlers()
{
//IL_0050: 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_005b: Expected O, but got Unknown
NetworkClient val = NetworkManager.singleton?.client;
if (val != null && !val.handlers.ContainsKey(EnderBag.NetworkMessageType.Value))
{
short value = EnderBag.NetworkMessageType.Value;
object obj = <>O.<0>__ItemPickupHandler;
if (obj == null)
{
NetworkMessageDelegate val2 = ItemPickupHandler;
<>O.<0>__ItemPickupHandler = val2;
obj = (object)val2;
}
val.RegisterHandler(value, (NetworkMessageDelegate)obj);
}
}
public static void SendItemPickupMessage(int connectionId, PickupIndex pickupIndex)
{
}
private static void ItemPickupHandler(NetworkMessage networkMessage)
{
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
ItemPickupMessage itemPickupMessage = networkMessage.ReadMessage<ItemPickupMessage>();
PlayerCharacterMasterController val = ((IEnumerable<PlayerCharacterMasterController>)PlayerCharacterMasterController.instances).FirstOrDefault((Func<PlayerCharacterMasterController, bool>)((PlayerCharacterMasterController x) => ((NetworkBehaviour)x.networkUser).isLocalPlayer));
if (!((Object)(object)val == (Object)null))
{
PickupIndex pickupIndex = itemPickupMessage.PickupIndex;
if (((PickupIndex)(ref pickupIndex)).isValid)
{
ShareItem.HandleRichMessageUnlockAndNotification(val.master, itemPickupMessage.PickupIndex);
}
}
}
}
}