using System; using System.Collections; 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.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Collections; using Unity.Netcode; using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.Settings; using UnityEngine.Localization.Tables; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.UIElements; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("ItemAPI")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ItemAPI")] [assembly: AssemblyTitle("ItemAPI")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ItemAPI { [BepInPlugin("com.mattcy.itemapi", "ItemAPI", "1.0.0")] public class ItemAPIPlugin : BaseUnityPlugin { internal static ManualLogSource Log; private static ItemAPIPlugin _instance; private void Awake() { _instance = this; Log = ((BaseUnityPlugin)this).Logger; ItemAPI.Init(((BaseUnityPlugin)this).Logger); Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); } private void Update() { ItemAPI.OnUpdate(); } } public class ItemAPI { public enum RoomsToSpawn { ALL, Kitchen, LivingRoom, DiningRoom, Bedroom, Bathroom, Sauna, DefaultRoom, ArtRoom, KidsRoom, HallwayRoom } private class PlayerState { public readonly List InHotbar = new List(); public readonly Dictionary TrackedItemDurability = new Dictionary(); public float LeftClickHoldTimer = 0f; public bool HasSentLeftHoldTrue = false; } [HarmonyPatch(typeof(NetworkManager), "StartHost")] internal static class NetworkManagerInitializationPatch { [CompilerGenerated] private static class <>O { public static HandleNamedMessageDelegate <0>__ReceiveDurabilityRequestOnServer; public static HandleNamedMessageDelegate <1>__ReceiveSpawnRequest; public static HandleNamedMessageDelegate <2>__ReceiveInventoryItemRequest; } private static void Postfix(NetworkManager __instance) { //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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown if (!((Object)(object)__instance == (Object)null) && __instance.CustomMessagingManager != null && (__instance.IsServer || __instance.IsHost)) { CustomMessagingManager customMessagingManager = __instance.CustomMessagingManager; object obj = <>O.<0>__ReceiveDurabilityRequestOnServer; if (obj == null) { HandleNamedMessageDelegate val = ReceiveDurabilityRequestOnServer; <>O.<0>__ReceiveDurabilityRequestOnServer = val; obj = (object)val; } customMessagingManager.RegisterNamedMessageHandler("RequestConsumeDurability", (HandleNamedMessageDelegate)obj); CustomMessagingManager customMessagingManager2 = __instance.CustomMessagingManager; object obj2 = <>O.<1>__ReceiveSpawnRequest; if (obj2 == null) { HandleNamedMessageDelegate val2 = ReceiveSpawnRequest; <>O.<1>__ReceiveSpawnRequest = val2; obj2 = (object)val2; } customMessagingManager2.RegisterNamedMessageHandler("ModdedRequestItemSpawn", (HandleNamedMessageDelegate)obj2); CustomMessagingManager customMessagingManager3 = __instance.CustomMessagingManager; object obj3 = <>O.<2>__ReceiveInventoryItemRequest; if (obj3 == null) { HandleNamedMessageDelegate val3 = ReceiveInventoryItemRequest; <>O.<2>__ReceiveInventoryItemRequest = val3; obj3 = (object)val3; } customMessagingManager3.RegisterNamedMessageHandler("ModdedRequestInventoryItem", (HandleNamedMessageDelegate)obj3); } } } public static class NetworkSpawner { public unsafe static void RequestSpawn(string itemName, Vector3 position, string? uniqueId) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) lastUniqueId = uniqueId ?? ""; if ((Object)(object)NetworkManager.Singleton == (Object)null) { return; } if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost) { ExecuteSpawn(itemName, position, uniqueId); return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(128, (Allocator)2, -1); try { ((FastBufferWriter)(ref val)).WriteValueSafe(itemName, false); ((FastBufferWriter)(ref val)).WriteValueSafe(ref position); ((FastBufferWriter)(ref val)).WriteValueSafe(uniqueId ?? "", false); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("ModdedRequestItemSpawn", 0uL, val, (NetworkDelivery)3); } finally { ((IDisposable)(*(FastBufferWriter*)(&val))/*cast due to .constrained prefix*/).Dispose(); } } public static void ExecuteSpawn(string itemName, Vector3 position, string UniqueId) { //IL_00db: 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_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) NetworkManager singleton = NetworkManager.Singleton; object obj; if (singleton == null) { obj = null; } else { NetworkConfig networkConfig = singleton.NetworkConfig; if (networkConfig == null) { obj = null; } else { NetworkPrefabs prefabs = networkConfig.Prefabs; obj = ((prefabs != null) ? prefabs.Prefabs : null); } } if (obj == null) { return; } GameObject val = ((IEnumerable)NetworkManager.Singleton.NetworkConfig.Prefabs.Prefabs).FirstOrDefault((Func)((NetworkPrefab p) => (Object)(object)p.Prefab != (Object)null && ((Object)p.Prefab).name.Equals(itemName, StringComparison.OrdinalIgnoreCase)))?.Prefab; if ((Object)(object)val == (Object)null) { try { GetAllItems().SpawnItemInstance(itemName, position); return; } catch { try { AiDirector val2 = Object.FindFirstObjectByType(); if ((Object)(object)val2 == (Object)null) { return; } PlayerNetworking localPlayer = GetLocalPlayer(); if (!((Object)(object)localPlayer == (Object)null)) { val2.SpawnEnemy(itemName, position); return; } } catch { return; } } } GameObject val3 = Object.Instantiate(val, position, Quaternion.identity); NetworkObject component = val3.GetComponent(); if ((Object)(object)component != (Object)null) { component.Spawn(false); onItemSpawnedViaRequest(val3, UniqueId); } else { Object.Destroy((Object)(object)val3); } } } [HarmonyPatch] internal static class OnSpawnedPrivatePatch { [HarmonyTargetMethod] private static MethodBase TargetMethod() { Type nestedType = typeof(AiDirector).GetNestedType("RuntimeEntityCollection", BindingFlags.Public | BindingFlags.NonPublic); if (nestedType == null) { return null; } return nestedType.GetMethod("OnSpawned", BindingFlags.Instance | BindingFlags.NonPublic); } [HarmonyPostfix] private static void Postfix(object __instance, object instance) { if (instance == null) { return; } PropertyInfo property = instance.GetType().GetProperty("gameObject", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null) { object? value = property.GetValue(instance); GameObject val = (GameObject)((value is GameObject) ? value : null); if ((Object)(object)val != (Object)null) { onEnnemySpawnedViaRequest(val, lastUniqueId); } } } } [HarmonyPatch(typeof(NetworkBehaviour), "OnNetworkSpawn")] internal static class PlayerNetworkingSpawnPatch { private static void Postfix(NetworkBehaviour __instance) { PlayerNetworking val = (PlayerNetworking)(object)((__instance is PlayerNetworking) ? __instance : null); if (!((Object)(object)val == (Object)null)) { playersById[((NetworkBehaviour)val).OwnerClientId] = val; if (((NetworkBehaviour)val).IsLocalPlayer) { localPlayer = val; } } } } [HarmonyPatch(typeof(NetworkBehaviour), "OnNetworkDespawn")] internal static class PlayerNetworkingDespawnPatch { private static void Postfix(NetworkBehaviour __instance) { PlayerNetworking val = (PlayerNetworking)(object)((__instance is PlayerNetworking) ? __instance : null); if ((Object)(object)val == (Object)null) { return; } ulong ownerClientId = ((NetworkBehaviour)val).OwnerClientId; playersById.Remove(ownerClientId); itemsEquipped.Remove(ownerClientId); slotItemName.Remove(ownerClientId); if (_slotVisual.TryGetValue(ownerClientId, out var value)) { for (int i = 0; i < value.Length; i++) { if ((Object)(object)value[i] != (Object)null) { Object.Destroy((Object)(object)value[i]); } } _slotVisual.Remove(ownerClientId); } if ((Object)(object)localPlayer == (Object)(object)val) { localPlayer = null; } } } [HarmonyPatch] internal static class EquipmentSlotTrackingPatch { [HarmonyTargetMethod] private static MethodBase TargetMethod() { return AccessTools.Method(typeof(EquipmentController), "g__UpdateHandlerState|32_0", (Type[])null, (Type[])null); } [HarmonyPrefix] private static void Prefix(EquipmentController __instance, int inventorySlotIndex, Action activationFunction) { //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) int slotType = GetSlotType(activationFunction); if (slotType == -1) { return; } PlayerNetworking component = ((Component)__instance).GetComponent(); if ((Object)(object)component == (Object)null) { return; } string newItemName = null; if (inventorySlotIndex != -1) { InventoryItem itemInSlot = ((InventoryBase)component.Inventory).GetItemInSlot(inventorySlotIndex); if (((InventoryItem)(ref itemInSlot)).IsValidItem && (Object)(object)AllItems != (Object)null && ((InventoryItem)(ref itemInSlot)).ItemIndex >= 0 && ((InventoryItem)(ref itemInSlot)).ItemIndex < AllItems.items.Length) { ItemData obj = AllItems.items[((InventoryItem)(ref itemInSlot)).ItemIndex]; newItemName = ((obj != null) ? ((Object)obj).name : null); } } UpdateSlotTracking(component, slotType, newItemName); } private static int GetSlotType(Action activationFunction) { return activationFunction.Method.Name switch { "SetHandEquipment" => 0, "SetWearedEquipment" => 1, "SetOtherWearedEquipment" => 2, _ => -1, }; } private static void UpdateSlotTracking(PlayerNetworking player, int slotType, string newItemName) { ulong ownerClientId = ((NetworkBehaviour)player).OwnerClientId; if (!slotItemName.TryGetValue(ownerClientId, out var value)) { value = new string[3]; slotItemName[ownerClientId] = value; } string text = value[slotType]; if (text == newItemName) { return; } if (!_slotVisual.TryGetValue(ownerClientId, out var value2)) { value2 = (GameObject[])(object)new GameObject[3]; _slotVisual[ownerClientId] = value2; } if (!itemsEquipped.TryGetValue(ownerClientId, out var value3)) { value3 = new HashSet(); itemsEquipped[ownerClientId] = value3; } if (!string.IsNullOrEmpty(text)) { value3.Remove(text); if ((Object)(object)value2[slotType] != (Object)null) { Object.Destroy((Object)(object)value2[slotType]); value2[slotType] = null; } if (RegisteredEquipment.TryGetValue(text, out var value4)) { value4.OnUnequip(player); } } if (!string.IsNullOrEmpty(newItemName)) { value3.Add(newItemName); if (RegisteredEquipment.TryGetValue(newItemName, out var value5)) { GameObject val = null; if ((Object)(object)value5.Prefab != (Object)null) { val = Object.Instantiate(value5.Prefab, ((Component)player).transform, false); ((Object)val).name = $"CustomItemVisual_{ownerClientId}_{slotType}"; value2[slotType] = val; } value5.OnEquip(val ?? ((Component)player).gameObject, player); } } value[slotType] = newItemName; } } [HarmonyPatch(typeof(InventoryBase), "OnNetworkSpawn")] internal static class InventoryOnNetworkSpawnPatch { private static void Postfix(InventoryBase __instance) { AllItems = __instance.BoundItems; RegisterItems(AllItems); RebuildItemNameIndex(); } } [HarmonyPatch(typeof(GnomiumDeposit), "OnNetworkSpawn")] internal static class GnomiumDepositOnNetworkSpawnPatch { private static void Postfix(GnomiumDeposit __instance) { ((MonoBehaviour)__instance).StartCoroutine(RegisterRecipesCoroutine(__instance)); } } [HarmonyPatch(typeof(ItemInstance), "OnNetworkSpawn")] internal static class ItemInstanceStartPatch { private static void Postfix(ItemInstance __instance) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)__instance == (Object)null) && RegisteredEquipmentByIndex.TryGetValue(__instance.InstanceData.itemIndex, out var value)) { ApplyWorldVisuals(__instance, value); } } } [HarmonyPatch(typeof(ItemInstance), "OnDropped")] internal static class ItemInstanceOnDroppedPatch { [HarmonyPostfix] private static void Postfix(ItemInstance __instance, Vector3 velocity, InventoryBase droppedFrom) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)droppedFrom == (Object)null) { return; } PlayerNetworking val = ((IEnumerable)playersById.Values).FirstOrDefault((Func)((PlayerNetworking p) => (Object)(object)p.Inventory == (Object)(object)droppedFrom)); if (!((Object)(object)val == (Object)null)) { int itemIndex = __instance.InstanceData.itemIndex; if (RegisteredEquipmentByIndex.TryGetValue(itemIndex, out var value)) { value.OnLost(val); } } } } [HarmonyPatch(typeof(ItemInstance), "OnInstanceDataChange")] internal static class ItemInstanceOnInstanceDataChangePatch { private static void Postfix(ItemInstance __instance) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)__instance == (Object)null) && RegisteredEquipmentByIndex.TryGetValue(__instance.InstanceData.itemIndex, out var value)) { ApplyWorldVisuals(__instance, value); } } } [HarmonyPatch(typeof(ItemInstance), "Interact")] internal static class ItemInstanceInteract { private static void Postfix(ItemInstance __instance, PlayerNetworking player) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) int itemIndex = __instance.InstanceData.itemIndex; if (RegisteredEquipmentByIndex.TryGetValue(itemIndex, out var value)) { value.OnPickup(player); } } } [HarmonyPatch(typeof(CabinetDrawer), "OnCabinetOpen")] public static class Patch_CabinetDrawer_OnCabinetOpen { [HarmonyPrefix] public static void Prefix(CabinetDrawer __instance) { //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_0062: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) if (!((NetworkBehaviour)__instance).IsServer) { return; } Traverse val = Traverse.Create((object)__instance); if (val.Field("wasInit").GetValue()) { return; } RoomManager instance = RoomManager.Instance; if ((Object)(object)instance == (Object)null) { return; } Vector3 position = ((Component)__instance).transform.position; RoomTriggerListener val2 = default(RoomTriggerListener); if (!instance.TryGetRoomEnvelopingPoint(position, ref val2)) { return; } string roomName = ((Object)((Component)val2).gameObject).name; SpawnRectangle[] value = val.Field("spawnAreas").GetValue(); Random random = new Random(); foreach (KeyValuePair item in RegisteredEquipmentByIndex) { Equipment value2 = item.Value; if (value2.SpawnChance.HasValue && value2.RoomsToSpawn != null && value2.RoomsToSpawn.Length != 0 && (value2.RoomsToSpawn.Contains(RoomsToSpawn.ALL) || value2.RoomsToSpawn.Any((RoomsToSpawn r) => roomName.Contains(r.ToString()))) && !(random.NextDouble() * 100.0 >= (double)value2.SpawnChance.Value)) { Vector3 position2 = position; if (value != null && value.Length != 0) { SpawnRectangle val3 = value[random.Next(0, value.Length)]; Vector3 randomPoint = val3.GetRandomPoint(random); position2 = ((Component)__instance).transform.TransformPoint(randomPoint); } RequestSpawn(value2.Name, position2, "Spawn" + value2.Name); } } } } public abstract class Equipment { public abstract string Name { get; } public abstract string Description { get; } public abstract EquipmentType ItemType { get; } public virtual Sprite Icon { get; set; } public virtual GameObject Prefab { get; set; } public virtual int? maxDurability { get; set; } public virtual int? maxStackSize { get; set; } public virtual Vector3? DroppedSize { get; set; } = null; public virtual Vector3? DroppedOffset { get; set; } = null; public virtual RoomsToSpawn[] RoomsToSpawn { get; set; } = null; public virtual float? SpawnChance { get; set; } = null; public int ItemIndex { get; internal set; } public virtual void OnEquip(GameObject visualObject, PlayerNetworking player) { } public virtual void OnUnequip(PlayerNetworking player) { } public virtual void OnLeftClick(bool isHolding, PlayerNetworking player) { } public virtual void OnLost(PlayerNetworking player) { } public virtual void OnBreak(PlayerNetworking player) { } public virtual void OnDurabilityChange(float Durability, PlayerNetworking player) { } public virtual void OnPickup(PlayerNetworking player) { } } public readonly struct CraftingCost { public readonly ResourceTypes? ResourceType; public readonly ItemData Item; public readonly int Amount; private CraftingCost(ResourceTypes? resourceType, ItemData item, int amount) { ResourceType = resourceType; Item = item; Amount = amount; } public static implicit operator CraftingCost((ResourceTypes Resource, int Amount) tuple) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return new CraftingCost(tuple.Resource, null, tuple.Amount); } public static implicit operator CraftingCost((ItemData Item, int Amount) tuple) { return new CraftingCost(null, tuple.Item, tuple.Amount); } } public abstract class CraftingRecipe { public virtual bool TakeItemFromInventory { get; set; } public virtual int? itemAmount { get; set; } public abstract Equipment Equipment { get; } public abstract CraftingCost[] CostTable { get; } } [HarmonyPatch(typeof(CraftinPanelControl), "UpdateCraftingPreview")] public static class CraftinPanelControlPatch { private static readonly FieldInfo craftingPanelDataField = AccessTools.Field(typeof(CraftinPanelControl), "craftingPanelData"); private static readonly FieldInfo currentCraftingRecipeIndexField = AccessTools.Field(typeof(CraftinPanelControl), "currentCraftingRecipeIndex"); private static readonly FieldInfo craftingCostElementParentField = AccessTools.Field(typeof(CraftinPanelControl), "craftingCostElementParent"); private static readonly FieldInfo craftTargetInventoryField = AccessTools.Field(typeof(CraftinPanelControl), "craftTargetInventory"); [HarmonyPostfix] public static void Postfix(CraftinPanelControl __instance) { //IL_0216: Unknown result type (might be due to invalid IL or missing references) object? value = craftingPanelDataField.GetValue(__instance); CraftingPanelData val = (CraftingPanelData)((value is CraftingPanelData) ? value : null); if (val == null) { return; } int num = (int)currentCraftingRecipeIndexField.GetValue(__instance); if (num < 0 || num >= val.equipmentCraftingRecipes.Count) { return; } Recipe val2 = val.equipmentCraftingRecipes[num]; ItemData itemData = default(ItemData); ref ItemData reference = ref itemData; CraftableItemBase craftResult = val2.CraftResult; reference = (ItemData)(object)((craftResult is ItemData) ? craftResult : null); if ((Object)(object)itemData == (Object)null) { return; } CraftingRecipe craftingRecipe = RegisteredRecipesList.FirstOrDefault((CraftingRecipe r) => r.Equipment != null && r.Equipment.Name.Equals(((CraftableItemBase)itemData).Name, StringComparison.OrdinalIgnoreCase)); if (craftingRecipe == null || !craftingRecipe.TakeItemFromInventory) { return; } object? value2 = craftingCostElementParentField.GetValue(__instance); VisualElement val3 = (VisualElement)((value2 is VisualElement) ? value2 : null); object? value3 = craftTargetInventoryField.GetValue(__instance); InventoryBase val4 = (InventoryBase)((value3 is InventoryBase) ? value3 : null); if (val3 == null || (Object)(object)val4 == (Object)null) { return; } HashSet hashSet = new HashSet(from c in craftingRecipe.CostTable where (Object)(object)c.Item != (Object)null && !IsResourceOrDepositableCost(c) select ((Object)c.Item).name, StringComparer.OrdinalIgnoreCase); for (int num2 = 0; num2 < val2.cost.Length; num2++) { if (val2.cost[num2].amount > 0 && !((Object)(object)val2.cost[num2].item == (Object)null) && hashSet.Contains(((Object)val2.cost[num2].item).name)) { VisualElement obj = val3[num2]; ItemDisplayView val5 = (ItemDisplayView)(object)((obj is ItemDisplayView) ? obj : null); if (val5 != null) { int itemIndex = GetItemIndex(((Object)val2.cost[num2].item).name); int num3 = CountItemInInventory(val4, itemIndex); ((VisualElement)val5).style.display = StyleEnum.op_Implicit((DisplayStyle)0); val5.Bind(val2.cost[num2].item, num3, val2.cost[num2].amount, "Items"); } } } } } [HarmonyPatch(typeof(PlayerController), "UpdateInventoryCraftingContext")] public static class UpdateInventoryCraftingContextPatch { [HarmonyPostfix] public static void Postfix(CraftingPanelData craftingPanelData, Recipe recipe, InventoryBase resourceInventory, InventoryBase targetInventory) { ItemData itemData = default(ItemData); ref ItemData reference = ref itemData; CraftableItemBase craftResult = recipe.CraftResult; reference = (ItemData)(object)((craftResult is ItemData) ? craftResult : null); if ((Object)(object)itemData == (Object)null) { return; } CraftingRecipe craftingRecipe = RegisteredRecipesList.FirstOrDefault((CraftingRecipe r) => r.Equipment != null && r.Equipment.Name.Equals(((CraftableItemBase)itemData).Name, StringComparison.OrdinalIgnoreCase)); if (craftingRecipe == null || !craftingRecipe.TakeItemFromInventory) { return; } bool flag = true; CraftingCost[] costTable = craftingRecipe.CostTable; for (int num = 0; num < costTable.Length; num++) { CraftingCost cost = costTable[num]; int ownedCountForCost = GetOwnedCountForCost(cost, targetInventory, resourceInventory); if (ownedCountForCost < cost.Amount) { flag = false; break; } } if (flag && !targetInventory.CanFitItem(itemData)) { craftingPanelData.canCraftCurrentItem = false; craftingPanelData.craftingInfo = "Inventory full"; } else { craftingPanelData.canCraftCurrentItem = flag; craftingPanelData.craftingInfo = (flag ? "" : "Can't afford"); } } } [HarmonyPatch(typeof(CraftingRecipes), "TryCraftItem")] public static class TryCraftItemPatch { [HarmonyPrefix] public static bool Prefix(Recipe recipe, InventoryBase craftedItemTargetInventory, InventoryBase resourceSourceInventory, HomeManager homeManager, ref bool craftEvenIfMissingResources, ref bool __result, out bool __state) { __state = false; if (craftEvenIfMissingResources) { return true; } ItemData itemData = default(ItemData); ref ItemData reference = ref itemData; CraftableItemBase craftResult = recipe.CraftResult; reference = (ItemData)(object)((craftResult is ItemData) ? craftResult : null); if ((Object)(object)itemData == (Object)null) { return true; } CraftingRecipe craftingRecipe = RegisteredRecipesList.FirstOrDefault((CraftingRecipe r) => r.Equipment != null && r.Equipment.Name.Equals(((CraftableItemBase)itemData).Name, StringComparison.OrdinalIgnoreCase)); if (craftingRecipe == null || !craftingRecipe.TakeItemFromInventory) { return true; } bool flag = true; CraftingCost[] costTable = craftingRecipe.CostTable; for (int num = 0; num < costTable.Length; num++) { CraftingCost cost = costTable[num]; int ownedCountForCost = GetOwnedCountForCost(cost, craftedItemTargetInventory, resourceSourceInventory); if (ownedCountForCost < cost.Amount) { flag = false; break; } } if (!flag) { __result = false; return false; } __state = true; craftEvenIfMissingResources = true; return true; } [HarmonyPostfix] public static void Postfix(Recipe recipe, InventoryBase craftedItemTargetInventory, InventoryBase resourceSourceInventory, HomeManager homeManager, bool craftEvenIfMissingResources, ref bool __result) { if (!__result) { return; } ItemData itemData = default(ItemData); ref ItemData reference = ref itemData; CraftableItemBase craftResult = recipe.CraftResult; reference = (ItemData)(object)((craftResult is ItemData) ? craftResult : null); if ((Object)(object)itemData == (Object)null) { return; } CraftingRecipe craftingRecipe = RegisteredRecipesList.FirstOrDefault((CraftingRecipe r) => r.Equipment != null && r.Equipment.Name.Equals(((CraftableItemBase)itemData).Name, StringComparison.OrdinalIgnoreCase)); if (craftingRecipe == null) { return; } CraftingCost[] costTable = craftingRecipe.CostTable; for (int num = 0; num < costTable.Length; num++) { CraftingCost cost = costTable[num]; if (IsResourceOrDepositableCost(cost) || (Object)(object)cost.Item == (Object)null) { continue; } string name = ((Object)cost.Item).name; if (!craftedItemTargetInventory.TryRemoveItem(name, cost.Amount)) { PlayerNetworking localPlayer = GetLocalPlayer(); if (localPlayer != null) { ((InventoryBase)localPlayer.Inventory).TryRemoveItem(name, cost.Amount); } } } if (craftingRecipe.itemAmount.HasValue) { int num2 = craftingRecipe.itemAmount.Value - 1; if (num2 > 0) { craftedItemTargetInventory.TryAddItem(craftingRecipe.Equipment.Name, num2); } } } } private static ManualLogSource logger; public static Dictionary RegisteredEquipment = new Dictionary(); public static Dictionary RegisteredEquipmentByIndex = new Dictionary(); private static List registeredAssemblies = new List(); private static AllItems AllItems; private static bool isInitialized = false; private static Dictionary _spriteCache = new Dictionary(); private static Dictionary _bundleCache = new Dictionary(); private static readonly FieldInfo RecipeItemField = AccessTools.Field(typeof(Recipe), "item"); private static string VisualRootName = "CustomItemWorldVisual"; private static bool itemRegistered = false; private static readonly Dictionary playersById = new Dictionary(); private static PlayerNetworking localPlayer; private static readonly Dictionary slotItemName = new Dictionary(); private static readonly Dictionary _slotVisual = new Dictionary(); private static readonly Dictionary> itemsEquipped = new Dictionary>(); private static readonly Dictionary itemNameToIndex = new Dictionary(StringComparer.OrdinalIgnoreCase); public static Action onItemSpawnedViaRequest = delegate { }; public static Action onEnnemySpawnedViaRequest = delegate { }; private static readonly PlayerState playerState = new PlayerState(); private static string lastUniqueId = ""; private static readonly List RegisteredRecipesList = new List(); public static void Init(ManualLogSource source) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) logger = source; Assembly callingAssembly = Assembly.GetCallingAssembly(); if (!registeredAssemblies.Contains(callingAssembly)) { registeredAssemblies.Add(callingAssembly); } if (!isInitialized) { isInitialized = true; new Harmony("ItemAPI_Core").PatchAll(typeof(ItemAPI).Assembly); AsyncOperationHandle initializationOperation = LocalizationSettings.InitializationOperation; initializationOperation.Completed += OnLocalizationInitialized; LogInfo("ItemAPI Initialized."); } } public static void ReceiveSpawnRequest(ulong senderClientId, FastBufferReader reader) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Singleton.IsServer) { string itemName = default(string); ((FastBufferReader)(ref reader)).ReadValueSafe(ref itemName, false); Vector3 position = default(Vector3); ((FastBufferReader)(ref reader)).ReadValueSafe(ref position); string uniqueId = default(string); ((FastBufferReader)(ref reader)).ReadValueSafe(ref uniqueId, false); NetworkSpawner.ExecuteSpawn(itemName, position, uniqueId); } } public static void ReceiveInventoryItemRequest(ulong senderClientId, FastBufferReader reader) { //IL_0025: 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) if (NetworkManager.Singleton.IsServer) { string itemName = default(string); ((FastBufferReader)(ref reader)).ReadValueSafe(ref itemName, false); int count = default(int); ((FastBufferReader)(ref reader)).ReadValueSafe(ref count, default(ForPrimitives)); ExecuteGiveInventoryItem(senderClientId, itemName, count); } } public unsafe static void RequestInventoryItem(string itemName, int count) { //IL_0065: 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_0083: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)NetworkManager.Singleton == (Object)null) { return; } if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost) { ExecuteGiveInventoryItem(NetworkManager.Singleton.LocalClientId, itemName, count); return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(64, (Allocator)2, -1); try { ((FastBufferWriter)(ref val)).WriteValueSafe(itemName, false); ((FastBufferWriter)(ref val)).WriteValueSafe(ref count, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("ModdedRequestInventoryItem", 0uL, val, (NetworkDelivery)3); } finally { ((IDisposable)(*(FastBufferWriter*)(&val))/*cast due to .constrained prefix*/).Dispose(); } } public static void ExecuteGiveInventoryItem(ulong clientId, string itemName, int count) { if (playersById.TryGetValue(clientId, out var value) && !((Object)(object)value.Inventory == (Object)null)) { ((InventoryBase)value.Inventory).TryAddItem(itemName, count); } } public unsafe static void ConsumeItemDurability(int index, int amount) { //IL_005a: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)NetworkManager.Singleton == (Object)null) { return; } if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost) { ApplyDurabilityDamage(NetworkManager.Singleton.LocalClientId, index, amount); return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(8, (Allocator)2, -1); try { ((FastBufferWriter)(ref val)).WriteValueSafe(ref index, default(ForPrimitives)); ((FastBufferWriter)(ref val)).WriteValueSafe(ref amount, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("RequestConsumeDurability", 0uL, val, (NetworkDelivery)3); } finally { ((IDisposable)(*(FastBufferWriter*)(&val))/*cast due to .constrained prefix*/).Dispose(); } } private static void ReceiveDurabilityRequestOnServer(ulong senderClientId, FastBufferReader reader) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) int index = default(int); ((FastBufferReader)(ref reader)).ReadValueSafe(ref index, default(ForPrimitives)); int amount = default(int); ((FastBufferReader)(ref reader)).ReadValueSafe(ref amount, default(ForPrimitives)); ApplyDurabilityDamage(senderClientId, index, amount); } public static void ApplyDurabilityDamage(ulong clientId, int index, int amount) { //IL_0047: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0111: 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_00b6: 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) if (!playersById.TryGetValue(clientId, out var value)) { return; } PlayerInventory inventory = value.Inventory; if (((inventory != null) ? ((InventoryBase)inventory).Contents : null) == null) { return; } NetworkList contents = ((InventoryBase)value.Inventory).Contents; for (int i = 0; i < contents.Count; i++) { InventoryItem val = contents[i]; if (!((InventoryItem)(ref val)).IsValidItem || ((InventoryItem)(ref val)).ItemIndex != index) { continue; } if (!RegisteredEquipmentByIndex.TryGetValue(index, out var value2)) { break; } if (val.data.durability <= (float)amount) { if (((InventoryItem)(ref val)).ItemCount > 1) { InventoryItem val2 = val; ushort itemCount = ((InventoryItem)(ref val2)).ItemCount; ((InventoryItem)(ref val2)).ItemCount = (ushort)(itemCount - 1); contents[i] = val2; } else { contents.RemoveAt(i); } value2.OnBreak(value); } else { val.data.durability -= amount; contents[i] = val; value2.OnDurabilityChange(val.data.durability, value); } break; } } public static void OnUpdate() { if (isInitialized && !((Object)(object)NetworkManager.Singleton == (Object)null) && !((Object)(object)localPlayer == (Object)null) && !((Object)(object)localPlayer.Inventory == (Object)null)) { ProcessLocalPlayerMechanics(localPlayer); } } private static void ProcessLocalPlayerMechanics(PlayerNetworking player) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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) PlayerState playerState = ItemAPI.playerState; for (int i = 0; i < ((InventoryBase)player.Inventory).SlotCount; i++) { InventoryItem itemInSlot = ((InventoryBase)player.Inventory).GetItemInSlot(i); if (((InventoryItem)(ref itemInSlot)).IsValidItem && RegisteredEquipmentByIndex.TryGetValue(((InventoryItem)(ref itemInSlot)).ItemIndex, out var value)) { if (!playerState.InHotbar.Contains(((InventoryItem)(ref itemInSlot)).ItemIndex)) { playerState.InHotbar.Add(((InventoryItem)(ref itemInSlot)).ItemIndex); } float durability = itemInSlot.data.durability; if (playerState.TrackedItemDurability.TryGetValue(((InventoryItem)(ref itemInSlot)).ItemIndex, out var value2) && durability != value2) { value.OnDurabilityChange(durability, player); } playerState.TrackedItemDurability[((InventoryItem)(ref itemInSlot)).ItemIndex] = durability; } } if (!slotItemName.TryGetValue(((NetworkBehaviour)player).OwnerClientId, out var value3) || (value3[0] == null && value3[1] == null && value3[2] == null)) { return; } if (Input.GetMouseButton(0)) { playerState.LeftClickHoldTimer += Time.deltaTime; if (playerState.LeftClickHoldTimer >= 0.2f && !playerState.HasSentLeftHoldTrue) { LeftClick(isHolding: true, player, value3); playerState.HasSentLeftHoldTrue = true; } } if (Input.GetMouseButtonUp(0)) { if (!playerState.HasSentLeftHoldTrue) { LeftClick(isHolding: false, player, value3); } playerState.LeftClickHoldTimer = 0f; playerState.HasSentLeftHoldTrue = false; } } private static void LeftClick(bool isHolding, PlayerNetworking player, string[] slots) { for (int i = 0; i < slots.Length; i++) { if (slots[i] != null && RegisteredEquipment.TryGetValue(slots[i], out var value)) { value.OnLeftClick(isHolding, player); } } } public static bool isItemEquipped(string Name) { return (Object)(object)localPlayer != (Object)null && isItemEquipped(((NetworkBehaviour)localPlayer).OwnerClientId, Name); } public static bool isItemEquipped(ulong clientId, string Name) { HashSet value; return itemsEquipped.TryGetValue(clientId, out value) && value.Contains(Name); } public static IReadOnlyCollection GetEquippedItems(ulong clientId) { IReadOnlyCollection result; if (!itemsEquipped.TryGetValue(clientId, out var value)) { IReadOnlyCollection readOnlyCollection = (IReadOnlyCollection)(object)Array.Empty(); result = readOnlyCollection; } else { IReadOnlyCollection readOnlyCollection = value; result = readOnlyCollection; } return result; } public static IReadOnlyCollection GetEquippedItems() { IReadOnlyCollection result; if (!((Object)(object)localPlayer != (Object)null)) { IReadOnlyCollection readOnlyCollection = (IReadOnlyCollection)(object)Array.Empty(); result = readOnlyCollection; } else { result = GetEquippedItems(((NetworkBehaviour)localPlayer).OwnerClientId); } return result; } public static GameObject LoadGameObject(string bundleName, string prefabName) { if (!_bundleCache.TryGetValue(bundleName, out var value)) { Assembly callingAssembly = Assembly.GetCallingAssembly(); using Stream stream = callingAssembly.GetManifestResourceStream(bundleName); if (stream == null) { ManualLogSource obj = logger; if (obj != null) { obj.LogError((object)("Could not find embedded bundle resource: " + bundleName + " in assembly " + callingAssembly.GetName().Name)); } return null; } value = AssetBundle.LoadFromStream(stream); if ((Object)(object)value == (Object)null) { ManualLogSource obj2 = logger; if (obj2 != null) { obj2.LogError((object)("Failed to load AssetBundle from stream: " + bundleName)); } return null; } _bundleCache[bundleName] = value; } GameObject val = value.LoadAsset(prefabName); if ((Object)(object)val == (Object)null) { ManualLogSource obj3 = logger; if (obj3 != null) { obj3.LogError((object)("Could not find prefab '" + prefabName + "' inside bundle '" + bundleName + "'")); } return null; } return val; } public static void LogEmbeddedResources(Assembly assembly) { string[] manifestResourceNames = assembly.GetManifestResourceNames(); if (manifestResourceNames.Length == 0) { ManualLogSource obj = logger; if (obj != null) { obj.LogInfo((object)("[" + assembly.GetName().Name + "] No embedded resources found.")); } return; } string[] array = manifestResourceNames; foreach (string text in array) { ManualLogSource obj2 = logger; if (obj2 != null) { obj2.LogInfo((object)("[" + assembly.GetName().Name + "] Embedded resource: " + text)); } } } public static List GetAllPlayers() { return new List(playersById.Values); } public static PlayerNetworking GetLocalPlayer() { return localPlayer; } public static AllItems GetAllItems() { return AllItems ?? null; } public static Transform FindChildRecursive(Transform parent, string name) { if (((Object)parent).name == name) { return parent; } for (int i = 0; i < parent.childCount; i++) { Transform val = FindChildRecursive(parent.GetChild(i), name); if ((Object)(object)val != (Object)null) { return val; } } return null; } public static int GetItemIndex(string name) { if (string.IsNullOrEmpty(name)) { return -1; } if (RegisteredEquipment.TryGetValue(name, out var value)) { return value.ItemIndex; } if (itemNameToIndex.TryGetValue(name, out var value2)) { return value2; } LogInfo("Equipment not found: " + name); return -1; } public static ItemData GetItemData(string name) { return ((IEnumerable)AllItems.items).FirstOrDefault((Func)((ItemData item) => ((Object)item).name.Equals(name, StringComparison.OrdinalIgnoreCase))); } public static InventoryItem GetItemInInventory(int index) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_0095: 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_004f: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_0092: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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) PlayerNetworking obj = localPlayer; object obj2; if (obj == null) { obj2 = null; } else { PlayerInventory inventory = obj.Inventory; obj2 = ((inventory != null) ? ((InventoryBase)inventory).Contents : null); } if (obj2 == null) { return default(InventoryItem); } NetworkList contents = ((InventoryBase)localPlayer.Inventory).Contents; for (int i = 0; i < contents.Count; i++) { InventoryItem result = contents[i]; if (((InventoryItem)(ref result)).IsValidItem && ((InventoryItem)(ref result)).ItemIndex == index) { return result; } } return default(InventoryItem); } public static bool HasItemInInventory(int index) { //IL_0040: 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) PlayerNetworking obj = localPlayer; object obj2; if (obj == null) { obj2 = null; } else { PlayerInventory inventory = obj.Inventory; obj2 = ((inventory != null) ? ((InventoryBase)inventory).Contents : null); } if (obj2 == null) { return false; } NetworkList contents = ((InventoryBase)localPlayer.Inventory).Contents; for (int i = 0; i < contents.Count; i++) { InventoryItem val = contents[i]; if (((InventoryItem)(ref val)).IsValidItem && ((InventoryItem)(ref val)).ItemIndex == index) { return true; } } return false; } public static void RegisterEquipment(int index, Equipment equipment) { equipment.ItemIndex = index; RegisteredEquipmentByIndex[index] = equipment; } public static void RequestSpawn(string itemName, Vector3 position, string? uniqueId) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) NetworkSpawner.RequestSpawn(itemName, position, uniqueId ?? ""); } private static void LogInfo(string mess) { ManualLogSource obj = logger; if (obj != null) { obj.LogInfo((object)mess); } } private static void OnLocalizationInitialized(AsyncOperationHandle handle) { LoadItemsNames(); } private static void LoadItemsNames() { //IL_0086: 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_00b0: 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_00bb: Unknown result type (might be due to invalid IL or missing references) List equipmentTypes = new List(); foreach (Assembly registeredAssembly in registeredAssemblies) { equipmentTypes.AddRange(from t in registeredAssembly.GetTypes() where t.IsSubclassOf(typeof(Equipment)) && !t.IsAbstract select t); } AsyncOperationHandle tableAsync = ((LocalizedDatabase)(object)LocalizationSettings.StringDatabase).GetTableAsync(TableReference.op_Implicit("Items"), (Locale)null); tableAsync.Completed += delegate(AsyncOperationHandle handle) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 if ((int)handle.Status != 1) { return; } StringTable result = handle.Result; foreach (Type item in equipmentTypes) { Equipment equipment = (Equipment)Activator.CreateInstance(item); ((DetailedLocalizationTable)(object)result).AddEntry(equipment.Name, equipment.Name); } }; AsyncOperationHandle tableAsync2 = ((LocalizedDatabase)(object)LocalizationSettings.StringDatabase).GetTableAsync(TableReference.op_Implicit("Items Descriptions"), (Locale)null); tableAsync2.Completed += delegate(AsyncOperationHandle handle) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 if ((int)handle.Status != 1) { return; } StringTable result = handle.Result; foreach (Type item2 in equipmentTypes) { Equipment equipment = (Equipment)Activator.CreateInstance(item2); ((DetailedLocalizationTable)(object)result).AddEntry(equipment.Description, equipment.Description); } }; } private static void RebuildItemNameIndex() { itemNameToIndex.Clear(); if (AllItems?.items == null) { return; } for (int i = 0; i < AllItems.items.Length; i++) { if ((Object)(object)AllItems.items[i] != (Object)null) { itemNameToIndex[((Object)AllItems.items[i]).name] = i; } } } private static void ApplyWorldVisuals(ItemInstance itemInstance, Equipment equipment) { //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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_0160: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: 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_016c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)equipment.Prefab == (Object)null) { return; } Transform transform = ((Component)itemInstance).transform; Transform val = FindExistingVisual(transform); HideDefaultVisualsAndColliders(transform, val); if ((Object)(object)val != (Object)null) { val.localScale = (equipment.DroppedSize.HasValue ? equipment.DroppedSize.Value : Vector3.one); val.localPosition = (equipment.DroppedOffset.HasValue ? equipment.DroppedOffset.Value : Vector3.zero); if (!equipment.DroppedSize.HasValue && !equipment.DroppedOffset.HasValue) { SetupVisualTransform(val); } EnableColliders(val); return; } GameObject val2 = Object.Instantiate(equipment.Prefab, transform, false); ((Object)val2).name = VisualRootName; SetLayerRecursively(val2, ((Component)transform).gameObject.layer); Transform transform2 = val2.transform; transform2.localScale = (equipment.DroppedSize.HasValue ? equipment.DroppedSize.Value : Vector3.one); transform2.localPosition = (equipment.DroppedOffset.HasValue ? equipment.DroppedOffset.Value : Vector3.zero); transform2.localRotation = Quaternion.identity; if (!equipment.DroppedSize.HasValue && !equipment.DroppedOffset.HasValue) { SetupVisualTransform(transform2); } EnableColliders(transform2); } private static void SetLayerRecursively(GameObject obj, int layer) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown obj.layer = layer; foreach (Transform item in obj.transform) { Transform val = item; SetLayerRecursively(((Component)val).gameObject, layer); } } private static void HideDefaultVisualsAndColliders(Transform root, Transform existingVisual) { Renderer[] componentsInChildren = ((Component)root).GetComponentsInChildren(true); foreach (Renderer val in componentsInChildren) { if (!((Object)(object)val == (Object)null) && !IsInsideVisual(((Component)val).transform, existingVisual)) { val.enabled = false; } } Collider[] componentsInChildren2 = ((Component)root).GetComponentsInChildren(true); foreach (Collider val2 in componentsInChildren2) { if (!((Object)(object)val2 == (Object)null) && !IsInsideVisual(((Component)val2).transform, existingVisual)) { val2.enabled = false; } } } private static void EnableColliders(Transform visual) { Collider[] componentsInChildren = ((Component)visual).GetComponentsInChildren(true); if (componentsInChildren.Length != 0) { for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].enabled = true; } } else { AddBoxCollider(visual); } } private static void AddBoxCollider(Transform visual) { //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_0055: 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_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: 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) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: 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) Renderer[] componentsInChildren = ((Component)visual).GetComponentsInChildren(true); if (componentsInChildren.Length == 0) { ManualLogSource obj = logger; if (obj != null) { obj.LogWarning((object)("No renderers found under '" + ((Object)visual).name + "' to generate a collider from.")); } return; } Bounds bounds = componentsInChildren[0].bounds; for (int i = 1; i < componentsInChildren.Length; i++) { ((Bounds)(ref bounds)).Encapsulate(componentsInChildren[i].bounds); } Vector3 center = visual.InverseTransformPoint(((Bounds)(ref bounds)).center); Vector3 val = visual.InverseTransformVector(((Bounds)(ref bounds)).size); ((Vector3)(ref val))..ctor(Mathf.Abs(val.x), Mathf.Abs(val.y), Mathf.Abs(val.z)); BoxCollider val2 = ((Component)visual).gameObject.AddComponent(); val2.center = center; val2.size = val; } private static void SetupVisualTransform(Transform visual) { //IL_0002: 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_001a: Unknown result type (might be due to invalid IL or missing references) visual.localPosition = Vector3.zero; visual.localRotation = Quaternion.identity; visual.localScale = Vector3.one; } private static bool IsInsideVisual(Transform candidate, Transform existingVisual) { if ((Object)(object)existingVisual == (Object)null) { return false; } return (Object)(object)candidate == (Object)(object)existingVisual || candidate.IsChildOf(existingVisual); } private static Transform FindExistingVisual(Transform root) { Transform[] componentsInChildren = ((Component)root).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { if ((Object)(object)componentsInChildren[i] != (Object)(object)root && ((Object)componentsInChildren[i]).name == VisualRootName) { return componentsInChildren[i]; } } return null; } private static ItemData CreateItem(string name, string description, Sprite icon, EquipmentType itemType, int? maxDura, int? maxStackSize, GameObject prefab, AllItems allItems) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) ItemData val = ScriptableObject.CreateInstance(); ((Object)val).name = name; ((CraftableItemBase)val).icon = icon ?? ((CraftableItemBase)allItems.items[0]).icon; ((CraftableItemBase)val).localizedName = new LocalizedString(TableReference.op_Implicit("Items"), TableEntryReference.op_Implicit(name)); ((CraftableItemBase)val).localizedDesc = new LocalizedString(TableReference.op_Implicit("Items Descriptions"), TableEntryReference.op_Implicit(description)); val.description = description; val.equipmentType = itemType; val.maxStackSize = maxStackSize ?? 1; val.usageType = (UsageType)0; val.durabilityLoss = (EquipmentDurabilityLossType)2; val.maxDurability = maxDura ?? 100; val.prefab = allItems.defaultPrefab; val.dontAllowEquipTogetherWith = (ItemData[])(object)new ItemData[0]; ((Object)val).hideFlags = (HideFlags)32; return val; } private static void RegisterItems(AllItems allItems) { //IL_00d0: Unknown result type (might be due to invalid IL or missing references) List list = new List(); foreach (Assembly registeredAssembly in registeredAssemblies) { list.AddRange(from t in registeredAssembly.GetTypes() where t.IsSubclassOf(typeof(Equipment)) && !t.IsAbstract select t); } List list2 = new List(); Dictionary dictionary = new Dictionary(); foreach (Type item in list) { Equipment equipment = (Equipment)Activator.CreateInstance(item); if (!((Object)(object)FindExisting(allItems, equipment.Name) != (Object)null)) { ItemData val = CreateItem(equipment.Name, equipment.Description, equipment.Icon, equipment.ItemType, equipment.maxDurability, equipment.maxStackSize, equipment.Prefab, allItems); list2.Add(val); dictionary.Add(val, equipment); if (!RegisteredEquipment.ContainsKey(equipment.Name)) { RegisteredEquipment.Add(equipment.Name, equipment); } } } if (list2.Count <= 0) { return; } int num = allItems.items.Length; Array.Resize(ref allItems.items, num + list2.Count); for (int num2 = 0; num2 < list2.Count; num2++) { int num3 = num + num2; allItems.items[num3] = list2[num2]; if (dictionary.TryGetValue(list2[num2], out var value) && !RegisteredEquipmentByIndex.ContainsKey(num3)) { RegisterEquipment(num3, value); } LogInfo("Registered item: " + ((Object)list2[num2]).name + " Item Index: " + num3); } itemRegistered = true; } private static ItemData FindExisting(AllItems allItems, string itemName) { ItemData[] items = allItems.items; foreach (ItemData val in items) { if ((Object)(object)val != (Object)null && ((Object)val).name == itemName) { return val; } } return null; } public static Sprite LoadSpriteFromEmbedded(string resourcePath) { return LoadSpriteFromEmbedded(resourcePath, Assembly.GetCallingAssembly()); } public static Sprite LoadSpriteFromEmbedded(string resourcePath, Assembly assembly) { //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) if (_spriteCache.TryGetValue(resourcePath, out var value)) { return value; } using Stream stream = assembly.GetManifestResourceStream(resourcePath); if (stream == null) { ManualLogSource obj = logger; if (obj != null) { obj.LogError((object)("Could not find embedded resource: " + resourcePath + " in assembly " + assembly.GetName().Name)); } return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, array); Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f); _spriteCache[resourcePath] = val2; return val2; } public static void AddRecipe(CraftingRecipe recipe) { if (recipe != null && !RegisteredRecipesList.Contains(recipe)) { RegisteredRecipesList.Add(recipe); } } private static bool HasRecipe(CraftingRecipes recipes, ItemData result) { Recipe[] recipes2 = recipes.recipes; foreach (Recipe val in recipes2) { if (val != null && (Object)(object)val.CraftResult == (Object)(object)result) { return true; } } return false; } private static int CountItemInInventory(InventoryBase inventory, int itemIndex) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) int num = 0; foreach (InventoryItem inventoryItem in inventory.GetInventoryItems()) { InventoryItem current = inventoryItem; if (((InventoryItem)(ref current)).IsValidItem && current.data.itemIndex == itemIndex) { num += ((InventoryItem)(ref current)).ItemCount; } } return num; } private static bool IsResourceOrDepositableCost(CraftingCost cost) { if (cost.ResourceType.HasValue) { return true; } if ((Object)(object)cost.Item != (Object)null && ((Object)cost.Item).name.Equals("Gnomium", StringComparison.OrdinalIgnoreCase)) { return true; } return false; } private static int GetOwnedCountForCost(CraftingCost cost, InventoryBase targetInventory, InventoryBase resourceInventory) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected I4, but got Unknown if (cost.ResourceType.HasValue) { string resourceName = ResourceStorage.GetResourceName((int)cost.ResourceType.Value); return resourceInventory.GetItemCount(resourceName); } if ((Object)(object)cost.Item == (Object)null) { return 0; } if (((Object)cost.Item).name.Equals("Gnomium", StringComparison.OrdinalIgnoreCase)) { return resourceInventory.GetItemCount(((Object)cost.Item).name); } int itemIndex = GetItemIndex(((Object)cost.Item).name); return CountItemInInventory(targetInventory, itemIndex); } private static IEnumerator RegisterRecipesCoroutine(GnomiumDeposit gnomiumDeposit) { while (!itemRegistered) { yield return (object)new WaitForEndOfFrame(); } if ((Object)(object)gnomiumDeposit == (Object)null || (Object)(object)gnomiumDeposit.Recipes == (Object)null || (Object)(object)gnomiumDeposit.ResourceInventory == (Object)null) { yield break; } foreach (Assembly assembly in registeredAssemblies) { IEnumerable recipeTypes = from t in assembly.GetTypes() where t.IsSubclassOf(typeof(CraftingRecipe)) && !t.IsAbstract select t; foreach (Type type in recipeTypes) { if (!RegisteredRecipesList.Any((CraftingRecipe r) => r.GetType() == type)) { CraftingRecipe recipeInstance = (CraftingRecipe)Activator.CreateInstance(type); RegisteredRecipesList.Add(recipeInstance); } } } int num2 = default(int); foreach (CraftingRecipe customRecipe in RegisteredRecipesList) { if (customRecipe.Equipment == null) { continue; } ItemData resultItem = FindExisting(gnomiumDeposit.ResourceInventory.BoundItems, customRecipe.Equipment.Name); if ((Object)(object)resultItem == (Object)null || HasRecipe(gnomiumDeposit.Recipes, resultItem)) { continue; } List costs = new List(); CraftingCost[] costTable = customRecipe.CostTable; for (int num = 0; num < costTable.Length; num++) { CraftingCost costEntry = costTable[num]; ItemData ingredientItem; if (costEntry.ResourceType.HasValue) { string resourceName = ResourceStorage.GetResourceName((int)costEntry.ResourceType.Value); ingredientItem = gnomiumDeposit.ResourceInventory.BoundItems.GetItem(resourceName, ref num2); } else { ingredientItem = costEntry.Item; } if ((Object)(object)ingredientItem != (Object)null) { costs.Add(new ItemCost { item = ingredientItem, amount = costEntry.Amount }); } else { LogInfo("Could not resolve cost ingredient for recipe: " + customRecipe.Equipment.Name); } } if (costs.Count != 0) { Recipe recipe = new Recipe { craftResultType = (CraftResultType)0, cost = costs.ToArray() }; RecipeItemField?.SetValue(recipe, resultItem); Array.Resize(ref gnomiumDeposit.Recipes.recipes, gnomiumDeposit.Recipes.recipes.Length + 1); gnomiumDeposit.Recipes.recipes[gnomiumDeposit.Recipes.recipes.Length - 1] = recipe; LogInfo("Registered custom recipe for item: " + customRecipe.Equipment.Name); } } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "ItemAPI"; public const string PLUGIN_NAME = "ItemAPI"; public const string PLUGIN_VERSION = "1.0.0"; } }