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 }); } }
static bool Prefix(InventoryGui __instance, InventoryGrid grid, ItemDrop.ItemData item, int ___m_dragAmount) { if (ZInput.GetButton("JoyLTrigger") || CheckModKey(modKey.Value)) { if (item != null && item.m_stack > 1 && Player.m_localPlayer) { int amount = ___m_dragAmount > 0 ? (item.m_stack - ___m_dragAmount) / 2 + ___m_dragAmount : item.m_stack / 2; //Dbgl($"auto stacking: {amount}/{ item.m_stack } {item?.m_shared.m_name}"); __instance.GetType().GetMethod("SetupDragItem", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { item, grid.GetInventory(), amount }); autoSplitting = true; } return(false); } return(true); }
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_shared.m_name}"); 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 }); } }
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_shared.m_name}"); if (returnResources.Value) { 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) { ItemDrop.ItemData newItem = req.m_resItem.m_itemData.Clone(); newItem.m_stack = recipe.m_amount; if (!Player.m_localPlayer.GetInventory().AddItem(newItem)) { ItemDrop itemDrop = ItemDrop.DropItem(newItem, newItem.m_stack, Player.m_localPlayer.transform.position + Player.m_localPlayer.transform.forward + Player.m_localPlayer.transform.up, Player.m_localPlayer.transform.rotation); itemDrop.GetComponent <Rigidbody>().velocity = (Player.m_localPlayer.transform.forward + Vector3.up) * 5f; } } } } } 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 }); } }
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 }); } }