static void Postfix(InventoryGui __instance, ItemDrop.ItemData ___m_dragItem, Inventory ___m_dragInventory, int ___m_dragAmount, ref GameObject ___m_dragGo) { if (Input.GetKeyDown(m_hotkey.Value) && ___m_dragItem != null && ___m_dragInventory.ContainsItem(___m_dragItem)) { Dbgl($"Discarding {___m_dragAmount}/{___m_dragItem.m_stack} {___m_dragItem.m_dropPrefab.name}"); if (returnResources.Value > 0) { Recipe recipe = ObjectDB.instance.GetRecipe(___m_dragItem); if (recipe != null) { for (int i = 0; i < ___m_dragAmount; i++) { foreach (Piece.Requirement req in recipe.m_resources) { int quality = ___m_dragItem.m_quality; for (int j = quality; j > 0; j--) { GameObject prefab = ObjectDB.instance.m_items.FirstOrDefault(item => item.GetComponent <ItemDrop>().m_itemData.m_shared.m_name == req.m_resItem.m_itemData.m_shared.m_name); ItemDrop.ItemData newItem = prefab.GetComponent <ItemDrop>().m_itemData; int numToAdd = Mathf.RoundToInt(req.GetAmount(j) * returnResources.Value); Dbgl($"Returning {numToAdd}/{req.GetAmount(j)} {prefab.name}"); while (numToAdd > 0) { int stack = Mathf.Min(req.m_resItem.m_itemData.m_shared.m_maxStackSize, numToAdd); numToAdd -= stack; if (Player.m_localPlayer.GetInventory().AddItem(prefab.name, stack, req.m_resItem.m_itemData.m_quality, req.m_resItem.m_itemData.m_variant, Player.m_localPlayer.GetPlayerID(), Player.m_localPlayer.GetPlayerName()) == null) { ItemDrop component = Instantiate(prefab, Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward + Player.m_localPlayer.transform.up, Player.m_localPlayer.transform.rotation).GetComponent <ItemDrop>(); component.m_itemData = newItem.Clone(); component.m_itemData.m_dropPrefab = prefab; component.m_itemData.m_stack = stack; Traverse.Create(component).Method("Save").GetValue(); } } } } } } } if (___m_dragAmount == ___m_dragItem.m_stack) { ___m_dragInventory.RemoveItem(___m_dragItem); } else { ___m_dragInventory.RemoveItem(___m_dragItem, ___m_dragAmount); } Destroy(___m_dragGo); ___m_dragGo = null; __instance.GetType().GetMethod("UpdateCraftingPanel", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { false }); } }
// Token: 0x06000689 RID: 1673 RVA: 0x00036990 File Offset: 0x00034B90 private void AddItemToList(List <ItemDrop.ItemData> toDrop, DropTable.DropData data) { ItemDrop.ItemData itemData = data.m_item.GetComponent <ItemDrop>().m_itemData; ItemDrop.ItemData itemData2 = itemData.Clone(); itemData2.m_dropPrefab = data.m_item; int min = Mathf.Max(1, data.m_stackMin); int num = Mathf.Min(itemData.m_shared.m_maxStackSize, data.m_stackMax); itemData2.m_stack = UnityEngine.Random.Range(min, num + 1); toDrop.Add(itemData2); }
// Token: 0x060006DD RID: 1757 RVA: 0x00038B18 File Offset: 0x00036D18 public static ItemDrop DropItem(ItemDrop.ItemData item, int amount, Vector3 position, Quaternion rotation) { ItemDrop component = UnityEngine.Object.Instantiate <GameObject>(item.m_dropPrefab, position, rotation).GetComponent <ItemDrop>(); component.m_itemData = item.Clone(); if (amount > 0) { component.m_itemData.m_stack = amount; } component.Save(); return(component); }
// Token: 0x0600068F RID: 1679 RVA: 0x00036C30 File Offset: 0x00034E30 private bool AddItem(ItemDrop.ItemData item, int amount, int x, int y) { amount = Mathf.Min(amount, item.m_stack); if (x < 0 || y < 0 || x >= this.m_width || y >= this.m_height) { return(false); } ItemDrop.ItemData itemAt = this.GetItemAt(x, y); bool result; if (itemAt != null) { if (itemAt.m_shared.m_name != item.m_shared.m_name || (itemAt.m_shared.m_maxQuality > 1 && itemAt.m_quality != item.m_quality)) { return(false); } int num = itemAt.m_shared.m_maxStackSize - itemAt.m_stack; if (num <= 0) { return(false); } int num2 = Mathf.Min(num, amount); itemAt.m_stack += num2; item.m_stack -= num2; result = (num2 == amount); ZLog.Log(string.Concat(new object[] { "Added to stack", itemAt.m_stack, " ", item.m_stack })); } else { ItemDrop.ItemData itemData = item.Clone(); itemData.m_stack = amount; itemData.m_gridPos = new Vector2i(x, y); this.m_inventory.Add(itemData); item.m_stack -= amount; result = true; } this.Changed(); return(result); }
static bool DropItem(ref ItemDrop __result, ref ItemDrop.ItemData item, ref int amount, ref Vector3 position, ref Quaternion rotation) { ItemDrop component = UnityEngine.Object.Instantiate(item.m_dropPrefab, position, rotation).GetComponent <ItemDrop>(); component.m_itemData = item.Clone(); if (item is TyrData) { var otherData = (TyrData)item; var thisData = (TyrData)component.m_itemData; thisData.Copy(otherData); component.m_itemData = thisData; } if (amount > 0) { component.m_itemData.m_stack = amount; } component.Save(); __result = component; return(false); }
private bool AddItem(ItemDrop.ItemData item, int amount, int x, int y) { amount = Mathf.Min(amount, item.m_stack); if (x < 0 || y < 0 || (x >= this.m_width || y >= this.m_height)) { return(false); } ItemDrop.ItemData itemAt = this.GetItemAt(x, y); bool flag; if (itemAt != null) { if (itemAt.m_shared.m_name != item.m_shared.m_name || itemAt.m_shared.m_maxQuality > 1 && itemAt.m_quality != item.m_quality) { return(false); } int a = itemAt.m_shared.m_maxStackSize - itemAt.m_stack; if (a <= 0) { return(false); } int num = Mathf.Min(a, amount); itemAt.m_stack += num; item.m_stack -= num; flag = num == amount; ZLog.Log((object)("Added to stack" + (object)itemAt.m_stack + " " + (object)item.m_stack)); } else { ItemDrop.ItemData itemData = item.Clone(); itemData.m_stack = amount; itemData.m_gridPos = new Vector2i(x, y); this.m_inventory.Add(itemData); item.m_stack -= amount; flag = true; } this.Changed(); return(flag); }
static void Postfix(InventoryGui __instance, ItemDrop.ItemData ___m_dragItem, Inventory ___m_dragInventory, int ___m_dragAmount, ref GameObject ___m_dragGo) { if (Input.GetKeyDown(m_hotkey.Value) && ___m_dragItem != null && ___m_dragInventory.ContainsItem(___m_dragItem)) { Dbgl($"Discarding {___m_dragAmount}/{___m_dragItem.m_stack} {___m_dragItem.m_dropPrefab.name}"); if (returnResources.Value > 0) { Recipe recipe = ObjectDB.instance.GetRecipe(___m_dragItem); if (recipe != null && (returnUnknownResources.Value || Player.m_localPlayer.IsRecipeKnown(___m_dragItem.m_shared.m_name))) { Dbgl($"Recipe stack: {recipe.m_amount} num of stacks: {___m_dragAmount / recipe.m_amount}"); var reqs = recipe.m_resources.ToList(); bool isMagic = false; bool cancel = false; if (epicLootAssembly != null) { isMagic = (bool)epicLootAssembly.GetType("EpicLoot.ItemDataExtensions").GetMethod("IsMagic", BindingFlags.Public | BindingFlags.Static).Invoke(null, new[] { ___m_dragItem }); } if (isMagic) { int rarity = (int)epicLootAssembly.GetType("EpicLoot.ItemDataExtensions").GetMethod("GetRarity", BindingFlags.Public | BindingFlags.Static).Invoke(null, new[] { ___m_dragItem }); List <KeyValuePair <ItemDrop, int> > magicReqs = (List <KeyValuePair <ItemDrop, int> >)epicLootAssembly.GetType("EpicLoot.Crafting.EnchantTabController").GetMethod("GetEnchantCosts", BindingFlags.Public | BindingFlags.Static).Invoke(null, new object[] { ___m_dragItem, rarity }); foreach (var kvp in magicReqs) { if (!returnUnknownResources.Value && ((ObjectDB.instance.GetRecipe(kvp.Key.m_itemData) && !Player.m_localPlayer.IsRecipeKnown(kvp.Key.m_itemData.m_shared.m_name)) || !Traverse.Create(Player.m_localPlayer).Field("m_knownMaterial").GetValue <HashSet <string> >().Contains(kvp.Key.m_itemData.m_shared.m_name))) { Player.m_localPlayer.Message(MessageHud.MessageType.Center, "You don't know all the recipes for this item's materials."); return; } reqs.Add(new Piece.Requirement() { m_amount = kvp.Value, m_resItem = kvp.Key }); } } if (!cancel && ___m_dragAmount / recipe.m_amount > 0) { for (int i = 0; i < ___m_dragAmount / recipe.m_amount; i++) { foreach (Piece.Requirement req in reqs) { int quality = ___m_dragItem.m_quality; for (int j = quality; j > 0; j--) { GameObject prefab = ObjectDB.instance.m_items.FirstOrDefault(item => item.GetComponent <ItemDrop>().m_itemData.m_shared.m_name == req.m_resItem.m_itemData.m_shared.m_name); ItemDrop.ItemData newItem = prefab.GetComponent <ItemDrop>().m_itemData; int numToAdd = Mathf.RoundToInt(req.GetAmount(j) * returnResources.Value); Dbgl($"Returning {numToAdd}/{req.GetAmount(j)} {prefab.name}"); while (numToAdd > 0) { int stack = Mathf.Min(req.m_resItem.m_itemData.m_shared.m_maxStackSize, numToAdd); numToAdd -= stack; if (Player.m_localPlayer.GetInventory().AddItem(prefab.name, stack, req.m_resItem.m_itemData.m_quality, req.m_resItem.m_itemData.m_variant, 0, "") == null) { ItemDrop component = Instantiate(prefab, Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward + Player.m_localPlayer.transform.up, Player.m_localPlayer.transform.rotation).GetComponent <ItemDrop>(); component.m_itemData = newItem.Clone(); component.m_itemData.m_dropPrefab = prefab; component.m_itemData.m_stack = stack; Traverse.Create(component).Method("Save").GetValue(); } } } } } } } } if (___m_dragAmount == ___m_dragItem.m_stack) { Player.m_localPlayer.RemoveFromEquipQueue(___m_dragItem); Player.m_localPlayer.UnequipItem(___m_dragItem, false); ___m_dragInventory.RemoveItem(___m_dragItem); } else { ___m_dragInventory.RemoveItem(___m_dragItem, ___m_dragAmount); } Destroy(___m_dragGo); ___m_dragGo = null; __instance.GetType().GetMethod("UpdateCraftingPanel", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { false }); } }
private static void PullResources(Player player, Piece.Requirement[] resources, int qualityLevel) { Inventory pInventory = Player.m_localPlayer.GetInventory(); List <Container> nearbyContainers = GetNearbyContainers(Player.m_localPlayer.transform.position); foreach (Piece.Requirement requirement in resources) { if (requirement.m_resItem) { int totalRequirement = requirement.GetAmount(qualityLevel); if (totalRequirement <= 0) { continue; } string reqName = requirement.m_resItem.m_itemData.m_shared.m_name; int totalAmount = pInventory.CountItems(reqName); Dbgl($"have {totalAmount}/{totalRequirement} {reqName} in player inventory"); if (totalAmount < totalRequirement) { foreach (Container c in nearbyContainers) { Inventory cInventory = c.GetInventory(); int thisAmount = Mathf.Min(cInventory.CountItems(reqName), totalRequirement - totalAmount); Dbgl($"Container at {c.transform.position} has {cInventory.CountItems(reqName)}"); if (thisAmount == 0) { continue; } for (int i = 0; i < cInventory.GetAllItems().Count; i++) { ItemDrop.ItemData item = cInventory.GetItem(i); if (item.m_shared.m_name == reqName) { Dbgl($"Got stack of {item.m_stack} {reqName}"); int stackAmount = Mathf.Min(item.m_stack, totalRequirement - totalAmount); if (!pInventory.HaveEmptySlot()) { stackAmount = Math.Min(Traverse.Create(pInventory).Method("FindFreeStackSpace", new object[] { item.m_shared.m_name }).GetValue <int>(), stackAmount); } Dbgl($"Sending {stackAmount} {reqName} to player"); ItemDrop.ItemData sendItem = item.Clone(); sendItem.m_stack = stackAmount; pInventory.AddItem(sendItem); if (stackAmount == item.m_stack) { cInventory.RemoveItem(item); } else { item.m_stack -= stackAmount; } totalAmount += stackAmount; Dbgl($"total amount is now {totalAmount}/{totalRequirement} {reqName}"); if (totalAmount >= totalRequirement) { break; } } } c.GetType().GetMethod("Save", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c, new object[] { }); cInventory.GetType().GetMethod("Changed", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(cInventory, new object[] { }); if (totalAmount >= totalRequirement) { Dbgl($"pulled enough {reqName}"); break; } } } } if (pulledMessage.Value?.Length > 0) { player.Message(MessageHud.MessageType.Center, pulledMessage.Value, 0, null); } } }