Пример #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 });
                }
            }
Пример #2
0
    // 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);
    }
Пример #3
0
    // 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);
    }
Пример #4
0
    // 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);
    }
Пример #5
0
        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);
        }
Пример #6
0
    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);
    }
Пример #7
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 });
                }
            }
Пример #8
0
        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);
                }
            }
        }