using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using RoR2;
using UnityEngine;
[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("DropItemAddition")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("DropItemAddition")]
[assembly: AssemblyTitle("DropItemAddition")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace ShrineClamper.Utils
{
public static class ListHandlers
{
public static List<ItemDef> ItemDefList { get; }
}
}
namespace DropItemAddition
{
[BepInPlugin("thebugreport.dropItemAddition", "DropItemAddition", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
internal static ManualLogSource Log;
private Harmony _harmony;
private void Awake()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Expected O, but got Unknown
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Expected O, but got Unknown
Log = ((BaseUnityPlugin)this).Logger;
_harmony = new Harmony("thebugreport.dropItemAddition");
try
{
MethodInfo methodInfo = AccessTools.Method("Dropitem.Give:Give_Item", new Type[2]
{
typeof(NetworkUser),
typeof(string[])
}, (Type[])null);
if (methodInfo == null)
{
Log.LogError((object)"Failed to find Dropitem.Give.Give_Item(NetworkUser, string[]). Is Dropitem loaded?");
return;
}
_harmony.Patch((MethodBase)methodInfo, new HarmonyMethod(typeof(GiveItemPatch), "Prefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
Log.LogInfo((object)"Patched Dropitem.Give.Give_Item successfully.");
}
catch (Exception arg)
{
Log.LogError((object)$"Error patching Dropitem.Give.Give_Item: {arg}");
}
}
private void OnDestroy()
{
try
{
Harmony harmony = _harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
}
catch (Exception arg)
{
ManualLogSource log = Log;
if (log != null)
{
log.LogError((object)$"Error unpatching: {arg}");
}
}
}
}
public static class GiveItemPatch
{
public static bool Prefix(NetworkUser sender, string[] args, ref string __result)
{
ManualLogSource log = Plugin.Log;
if (log != null)
{
log.LogInfo((object)string.Format("[GivePatch] Intercepted Give_Item from '{0}' with {1} arg(s).", sender?.userName ?? "null", (args != null) ? args.Length : 0));
}
__result = DropReplacement.GiveItem(sender, args);
return false;
}
}
internal static class DropReplacement
{
public static string GiveItem(NetworkUser sender, string[] args)
{
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
//IL_0147: Invalid comparison between Unknown and I4
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Invalid comparison between Unknown and I4
//IL_028b: Unknown result type (might be due to invalid IL or missing references)
//IL_0292: Unknown result type (might be due to invalid IL or missing references)
//IL_0294: Unknown result type (might be due to invalid IL or missing references)
//IL_0299: Unknown result type (might be due to invalid IL or missing references)
//IL_02a6: 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)
//IL_02b2: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Invalid comparison between Unknown and I4
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
//IL_02dd: Unknown result type (might be due to invalid IL or missing references)
//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
//IL_01cf: Invalid comparison between Unknown and I4
//IL_0168: 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_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Invalid comparison between Unknown and I4
//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
//IL_01de: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0209: Unknown result type (might be due to invalid IL or missing references)
//IL_020c: Unknown result type (might be due to invalid IL or missing references)
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
//IL_0303: Unknown result type (might be due to invalid IL or missing references)
//IL_030a: Unknown result type (might be due to invalid IL or missing references)
//IL_030f: Unknown result type (might be due to invalid IL or missing references)
//IL_0225: Unknown result type (might be due to invalid IL or missing references)
//IL_032b: Unknown result type (might be due to invalid IL or missing references)
//IL_0335: Unknown result type (might be due to invalid IL or missing references)
//IL_0349: Unknown result type (might be due to invalid IL or missing references)
//IL_034e: Unknown result type (might be due to invalid IL or missing references)
//IL_036c: Unknown result type (might be due to invalid IL or missing references)
//IL_0371: Unknown result type (might be due to invalid IL or missing references)
//IL_0372: Unknown result type (might be due to invalid IL or missing references)
//IL_0379: Unknown result type (might be due to invalid IL or missing references)
//IL_0384: Unknown result type (might be due to invalid IL or missing references)
//IL_0385: Unknown result type (might be due to invalid IL or missing references)
//IL_0388: Unknown result type (might be due to invalid IL or missing references)
//IL_038e: Expected I4, but got Unknown
//IL_0390: Expected O, but got Unknown
//IL_024a: Unknown result type (might be due to invalid IL or missing references)
if (!DI.Users_CheckUserPerms(sender, out var text))
{
return text;
}
Inventory inventory = sender.master.inventory;
PlayerCharacterMasterController val = DI.StringParsers_GetNetUserFromString(args[1]);
if (!Object.op_Implicit((Object)(object)val))
{
return "<color=#FF8282>Could not find specified </color>player<color=#FF8282> '<color=#ff4646>" + args[1] + "</color>'</color>";
}
Inventory inventory2 = val.master.inventory;
if (!Object.op_Implicit((Object)(object)inventory) || !Object.op_Implicit((Object)(object)inventory2))
{
return "<color=#ff4646>ERROR: null inventory</color>";
}
if ((Object)(object)inventory == (Object)(object)inventory2)
{
return "<color=#FF8282>Target can not be the sender</color>";
}
string name;
if (Object.op_Implicit((Object)(object)val.networkUser))
{
name = val.networkUser.userName;
}
else
{
if (!DI.Config_DropFromDisconnected())
{
return "<color=#FF8282>Giving to disconnected players is disabled</color>";
}
DI.Users_TryGetCachedName(val, out name);
}
name = "<color=#AAE6F0>" + name + "</color>";
string text2 = "<color=#AAE6F0>" + sender.masterController.GetDisplayName() + "</color>";
if (Object.op_Implicit((Object)(object)val.networkUser) && DI.Users_IsLocked(val.networkUser))
{
return "<color=#FF8282>" + name + " has their inventory locked, failed to give item</color>";
}
EquipmentIndex val2 = (EquipmentIndex)(-1);
ItemIndex val3 = (ItemIndex)(-1);
if (args[0].ToLower() == "e" || args[0].ToLower() == "equip" || args[0].ToLower() == "equipment")
{
val2 = inventory.GetEquipmentIndex();
if ((int)val2 == -1)
{
return "<color=#FF8282>Sender does not have an </color><color=#ff7d00>equipment</color>";
}
}
else
{
val3 = DI.StringParsers_FindItemInInventroy(args[0], inventory);
}
if ((int)val3 == -1)
{
if ((int)val2 == -1)
{
val2 = inventory.GetEquipmentIndex();
if ((int)val2 == -1 || !DI.StringParsers_ReformatString(Language.GetString(EquipmentCatalog.GetEquipmentDef(val2).nameToken)).Contains(DI.StringParsers_ReformatString(args[0])))
{
return "<color=#FF8282>Could not find item '<color=#ff4646>" + args[0] + "</color>' in " + text2 + "<color=#AAE6F0>'s</color> inventory</color>";
}
}
if ((int)inventory2.GetEquipmentIndex() != -1)
{
return "<color=#FF8282>Target already has an equipment</color>";
}
PickupIndex val4 = PickupCatalog.FindPickupIndex(val2);
string text3 = Util.GenerateColoredString(Language.GetString(EquipmentCatalog.GetEquipmentDef(val2).nameToken), Color32.op_Implicit(PickupCatalog.GetPickupDef(val4).baseColor));
if (val2 != inventory.GetEquipmentIndex())
{
return "<color=#FF8282>Sender does not have </color><color=#ff4646>" + text3 + "</color>";
}
if (DI.Drop_IsBlacklisted(EquipmentCatalog.GetEquipmentDef(val2), !DI.Config_ApplyAllowToGive()))
{
return text3 + "<color=#FF8282> is not dropable</color>";
}
inventory2.SetEquipmentIndex(val2);
inventory.SetEquipmentIndex((EquipmentIndex)(-1));
return "<color=#96EBAA>" + text2 + " gave " + text3 + " to </color>" + name;
}
ItemDef itemDef = ItemCatalog.GetItemDef(val3);
PickupIndex val5 = PickupCatalog.FindPickupIndex(val3);
string text4 = Util.GenerateColoredString(Language.GetString(itemDef.nameToken), Color32.op_Implicit(PickupCatalog.GetPickupDef(val5).baseColor));
if (DI.Drop_IsBlacklisted(itemDef, !DI.Config_ApplyAllowToGive(), isItem: true))
{
return text4 + "<color=#FF8282> is not dropable</color>";
}
int num = inventory.GetItemCount(val3);
if (num == 0)
{
return "<color=#FF8282>Sender does not have </color>" + text4;
}
if (num > 1)
{
text4 += Util.GenerateColoredString("s", Color32.op_Implicit(PickupCatalog.GetPickupDef(val5).baseColor));
}
if (num > 30)
{
num = 30;
}
inventory2.GiveItem(val3, num);
inventory.RemoveItem(val3, num);
Vector3 corePosition = sender.master.GetBody().corePosition;
GameObject gameObject = ((Component)val.master.GetBody()).gameObject;
GameObject obj = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/OrbEffects/ItemTransferOrbEffect");
EffectData val6 = new EffectData
{
origin = corePosition,
genericFloat = 1f,
genericUInt = (uint)(val3 + 1)
};
val6.SetNetworkedObjectReference(gameObject);
EffectManager.SpawnEffect(obj, val6, true);
return string.Format("{0}{1} gave {2} {3} to </color>{4}", "<color=#96EBAA>", text2, num, text4, name);
}
}
internal static class DI
{
private static Type _tUsers;
private static Type _tConfig;
private static Type _tStringParsers;
private static Type _tDrop;
private static MethodInfo _miCheckUserPerms;
private static FieldInfo _fiCachedPlayerNames;
private static FieldInfo _fiLockedUserIds;
private static FieldInfo _fiApplyAllowToGive;
private static FieldInfo _fiDropFromDisconnected;
private static PropertyInfo _piConfigValue;
private static MethodInfo _miGetNetUserFromString;
private static MethodInfo _miFindItemInInventroy;
private static MethodInfo _miReformatString;
private static MethodInfo _miIsBlacklistedItem;
private static MethodInfo _miIsBlacklistedEquip;
private static Type TUsers => _tUsers ?? (_tUsers = AccessTools.TypeByName("Dropitem.Users"));
private static Type TConfig => _tConfig ?? (_tConfig = AccessTools.TypeByName("Dropitem.Config"));
private static Type TStringParsers => _tStringParsers ?? (_tStringParsers = AccessTools.TypeByName("Dropitem.StringParsers"));
private static Type TDrop => _tDrop ?? (_tDrop = AccessTools.TypeByName("Dropitem.Drop"));
public static bool Users_CheckUserPerms(NetworkUser sender, out string text)
{
text = null;
if ((object)_miCheckUserPerms == null)
{
_miCheckUserPerms = AccessTools.Method(TUsers, "CheckUserPerms", new Type[2]
{
typeof(NetworkUser),
typeof(string).MakeByRefType()
}, (Type[])null);
}
if (_miCheckUserPerms == null)
{
return true;
}
object[] array = new object[2] { sender, null };
bool result = (bool)_miCheckUserPerms.Invoke(null, array);
text = (string)array[1];
return result;
}
public static bool Users_TryGetCachedName(PlayerCharacterMasterController pcmc, out string name)
{
name = null;
if ((object)_fiCachedPlayerNames == null)
{
_fiCachedPlayerNames = AccessTools.Field(TUsers, "cachedPlayerNames");
}
object obj = _fiCachedPlayerNames?.GetValue(null);
if (obj == null || (Object)(object)pcmc == (Object)null)
{
return false;
}
MethodInfo method = obj.GetType().GetMethod("TryGetValue");
object[] array = new object[2] { pcmc, null };
bool flag = (bool)method.Invoke(obj, array);
name = (flag ? ((string)array[1]) : null);
return flag;
}
public static bool Users_IsLocked(NetworkUser target)
{
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)target == (Object)null)
{
return false;
}
if ((object)_fiLockedUserIds == null)
{
_fiLockedUserIds = AccessTools.Field(TUsers, "lockedUserIds");
}
object obj = _fiLockedUserIds?.GetValue(null);
if (obj == null)
{
return false;
}
return (bool)obj.GetType().GetMethod("Contains").Invoke(obj, new object[1] { target.id });
}
private static bool GetConfigBool(ref FieldInfo field, string fieldName)
{
if ((object)field == null)
{
field = AccessTools.Field(TConfig, fieldName);
}
object obj = field?.GetValue(null);
if (obj == null)
{
return false;
}
if ((object)_piConfigValue == null)
{
_piConfigValue = obj.GetType().GetProperty("Value");
}
return (bool)(_piConfigValue?.GetValue(obj) ?? ((object)false));
}
public static bool Config_ApplyAllowToGive()
{
return GetConfigBool(ref _fiApplyAllowToGive, "applyAllowToGive");
}
public static bool Config_DropFromDisconnected()
{
return GetConfigBool(ref _fiDropFromDisconnected, "dropFromDisconnected");
}
public static PlayerCharacterMasterController StringParsers_GetNetUserFromString(string s)
{
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Expected O, but got Unknown
if ((object)_miGetNetUserFromString == null)
{
_miGetNetUserFromString = AccessTools.Method(TStringParsers, "GetNetUserFromString", new Type[1] { typeof(string) }, (Type[])null);
}
return (PlayerCharacterMasterController)(_miGetNetUserFromString?.Invoke(null, new object[1] { s }));
}
public static ItemIndex StringParsers_FindItemInInventroy(string s, Inventory inv)
{
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
if ((object)_miFindItemInInventroy == null)
{
_miFindItemInInventroy = AccessTools.Method(TStringParsers, "FindItemInInventroy", new Type[2]
{
typeof(string),
typeof(Inventory)
}, (Type[])null);
}
if (!(_miFindItemInInventroy != null))
{
return (ItemIndex)(-1);
}
return (ItemIndex)_miFindItemInInventroy.Invoke(null, new object[2] { s, inv });
}
public static string StringParsers_ReformatString(string s)
{
if ((object)_miReformatString == null)
{
_miReformatString = AccessTools.Method(TStringParsers, "ReformatString", new Type[1] { typeof(string) }, (Type[])null);
}
return (string)_miReformatString?.Invoke(null, new object[1] { s });
}
public static bool Drop_IsBlacklisted(ItemDef itemDef, bool invertAllow, bool isItem, bool defaultArg = false)
{
if ((object)_miIsBlacklistedItem == null)
{
_miIsBlacklistedItem = AccessTools.Method(TDrop, "IsBlacklisted", new Type[4]
{
typeof(ItemDef),
typeof(bool),
typeof(bool),
typeof(bool)
}, (Type[])null);
}
if (_miIsBlacklistedItem == null)
{
return false;
}
return (bool)_miIsBlacklistedItem.Invoke(null, new object[4] { itemDef, invertAllow, true, defaultArg });
}
public static bool Drop_IsBlacklisted(EquipmentDef equipDef, bool invertAllow, bool defaultArg = false)
{
if ((object)_miIsBlacklistedEquip == null)
{
_miIsBlacklistedEquip = AccessTools.Method(TDrop, "IsBlacklisted", new Type[3]
{
typeof(EquipmentDef),
typeof(bool),
typeof(bool)
}, (Type[])null);
}
if (_miIsBlacklistedEquip == null)
{
return false;
}
return (bool)_miIsBlacklistedEquip.Invoke(null, new object[3] { equipDef, invertAllow, false });
}
}
}