Esempio n. 1
0
            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 });
                }
            }
Esempio n. 2
0
 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);
 }
Esempio n. 3
0
 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 });
     }
 }
Esempio n. 4
0
            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 });
                }
            }
Esempio n. 5
0
            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 });
                }
            }