示例#1
0
        public bool IsAvailable(Recipe recipe)
        {
            if (PossibleCraftCache.TryGetValue(recipe, out bool craftable) && !craftable)
            {
                return(false);
            }
            if (!RecipeHooks.RecipeAvailable(recipe))
            {
                return(false);
            }
            if (recipe.requiredTile.TakeWhile(tile => tile != -1).Any(tile => !CraftingSource.AdjTile[tile]))
            {
                return(false);
            }

            if (recipe.needWater && !CraftingSource.AdjWater &&
                !CraftingSource.AdjTile[172])
            {
                return(false);
            }
            if (recipe.needHoney && !CraftingSource.AdjHoney)
            {
                return(false);
            }
            if (recipe.needLava && !CraftingSource.AdjLava)
            {
                return(false);
            }
            if (recipe.needSnowBiome && !CraftingSource.ZoneSnow)
            {
                return(false);
            }

            return(true);
        }
示例#2
0
        public override void Click(UIMouseEvent evt)
        {
            base.Click(evt);
            for (int i = 0; i < recipeNode.multiplier; i++)
            {
                Recipe.FindRecipes();
                if (AbleToCraft())
                {
                    //Main.CraftItem(recipe);
                    Item result = recipe.createItem.Clone();
                    result.Prefix(-1);
                    // Consumes the items. Does not actually check required items or tiles.
                    recipe.Create();
                    // TODO: Alternate recipe.Create that takes from all sources.
                    result.position = Main.LocalPlayer.Center - result.Size;                     // needed for ItemText

                    RecipeHooks.OnCraft(result, recipe);
                    ItemLoader.OnCraft(result, recipe);

                    Item itemIfNoSpace = Main.LocalPlayer.GetItem(Main.myPlayer, result, false, false);
                    if (itemIfNoSpace.stack > 0)
                    {
                        Main.LocalPlayer.QuickSpawnClonedItem(itemIfNoSpace, itemIfNoSpace.stack);
                    }
                }
                else
                {
                    //Main.NewText("Oops, I couldn't actually craft that for you.");
                }
            }
        }
        private bool TryMakeRecipe(Recipe recipe, TransferAssemblerTileEntity entity)
        {
            bool alchemy;

            if (!SearchStation(recipe, entity.Position.X, entity.Position.Y, out alchemy))
            {
                entity.Status = TransferAssemblerTileEntity.StatusKind.MissingStation;
                return(false);
            }

            for (int i = 0; i < Recipe.maxRequirements && !recipe.requiredItem[i].IsAir; i++)
            {
                if (!inventory.TryTakeIngredient(recipe, recipe.requiredItem[i]))
                {
                    entity.Status          = TransferAssemblerTileEntity.StatusKind.MissingItem;
                    entity.MissingItemType = recipe.requiredItem[i].type;
                    return(false);
                }
            }

            Item clone = recipe.createItem.Clone();

            if (!clone.IsAir)
            {
                //these can potentially cause issues in some cases, might have to remove them
                RecipeHooks.OnCraft(clone, recipe);
                ItemLoader.OnCraft(clone, recipe);
            }

            entity.stock  = clone;
            entity.Status = TransferAssemblerTileEntity.StatusKind.Success;
            inventory.Commit(alchemy);

            return(true);
        }
示例#4
0
        public static void CraftItem(this Terraria.Recipe r)
        {
            int stack = Main.mouseItem.stack;

            Main.mouseItem        = r.createItem.Clone();
            Main.mouseItem.stack += stack;
            if (stack <= 0)
            {
                Main.mouseItem.Prefix(-1);
            }
            Main.mouseItem.position.X = Main.player[Main.myPlayer].position.X + Main.player[Main.myPlayer].width / 2f - Main.mouseItem.width / 2f;
            Main.mouseItem.position.Y = Main.player[Main.myPlayer].position.Y + Main.player[Main.myPlayer].height / 2f - Main.mouseItem.height / 2f;
            ItemText.NewText(Main.mouseItem, r.createItem.stack);
            r.ApiCreate();
            if (Main.mouseItem.type <= ItemID.None && r.createItem.type <= 0)
            {
                return;
            }
            RecipeHooks.OnCraft(Main.mouseItem, r);
            ItemLoader.OnCraft(Main.mouseItem, r);
            //Main.PlaySound(7);
            SoundManager.PlaySound(Sounds.Grass);
        }
示例#5
0
        public override void OnCraft(Item item)
        {
            List <KeyValuePair <int, int> > keyValuePairs = RecipeInfo.TrueUsedItems.ToList();

            foreach (KeyValuePair <int, int> keyValuePair in keyValuePairs.Where(keyValuePair => keyValuePair.Value < 0))
            {
                Main.LocalPlayer.QuickSpawnItem(keyValuePair.Key, -keyValuePair.Value);
            }

            List <KeyValuePair <Recipe, int> > recipes = RecipeInfo.RecipeUsed.ToList();

            for (int i = 0; i < recipes.Count; i++)
            {
                Recipe recipe       = recipes[i].Key;
                int    timesCrafted = recipes[i].Value;

                Item targetItem;
                if (i == 0)
                {
                    targetItem = item;
                }
                else
                {
                    targetItem = new Item();
                    targetItem.SetDefaults(recipe.createItem.type);
                    targetItem.stack = recipe.createItem.stack;
                }

                for (int j = 0; j < timesCrafted; j++)
                {
                    RecipeHooks.OnCraft(targetItem, recipe);
                    ItemLoader.OnCraft(targetItem, recipe);

                    //This still doesn't take into account any OnCraft editing intermediate recipe result
                }
            }
        }
示例#6
0
        private void TryCraft()
        {
            List <Item> availableItems = storageItems.Where(item => !blockStorageItems.Contains(new ItemData(item))).Select(item => item.Clone()).ToList();
            List <Item> toWithdraw     = new List <Item>(selectedRecipe.requiredItem.Length);

            foreach (Item item in selectedRecipe.requiredItem)
            {
                if (item.type == 0)
                {
                    break;
                }

                int       stack     = item.stack;
                ModRecipe modRecipe = selectedRecipe as ModRecipe;
                if (modRecipe != null)
                {
                    stack = modRecipe.ConsumeItem(item.type, item.stack);
                }

                if (selectedRecipe.alchemy && alchemyTable)
                {
                    int save = 0;
                    for (int j = 0; j < stack; j++)
                    {
                        if (Main.rand.Next(3) == 0)
                        {
                            save++;
                        }
                    }
                    stack -= save;
                }

                if (stack <= 0)
                {
                    continue;
                }

                foreach (Item tryItem in availableItems)
                {
                    if (item.type == tryItem.type || RecipeGroupMatch(selectedRecipe, item.type, tryItem.type))
                    {
                        if (tryItem.stack > stack)
                        {
                            Item temp = tryItem.Clone();
                            temp.stack = stack;
                            toWithdraw.Add(temp);
                            tryItem.stack -= stack;
                            stack          = 0;
                        }
                        else
                        {
                            toWithdraw.Add(tryItem.Clone());
                            stack        -= tryItem.stack;
                            tryItem.stack = 0;
                            tryItem.type  = 0;
                        }
                    }
                }
            }

            Item resultItem = selectedRecipe.createItem.Clone();

            resultItem.Prefix(-1);

            RecipeHooks.OnCraft(resultItem, selectedRecipe);
            ItemLoader.OnCraft(resultItem, selectedRecipe);

            if (Main.netMode == NetmodeID.SinglePlayer)
            {
                foreach (Item item in DoCraft(heart, toWithdraw, resultItem))
                {
                    Main.player[Main.myPlayer].QuickSpawnClonedItem(item, item.stack);
                }
            }
            else if (Main.netMode == NetmodeID.MultiplayerClient)
            {
                NetHelper.SendCraftRequest(heart.ID, toWithdraw, resultItem);
            }
        }
示例#7
0
        protected sealed override void Register()
        {
            ModTypeLookup <GlobalRecipe> .Register(this);

            RecipeHooks.Add(this);
        }
示例#8
0
        public static void FindRecipes()
        {
            if (Main.netMode == NetmodeID.Server)
            {
                return;
            }

            int   num  = Main.availableRecipe[Main.focusRecipe];
            float num2 = Main.availableRecipeY[Main.focusRecipe];

            for (int i = 0; i < Recipe.maxRecipes; i++)
            {
                Main.availableRecipe[i] = 0;
            }

            Main.numAvailableRecipes = 0;

            bool flag = Main.guideItem.type > 0 && Main.guideItem.stack > 0 && Main.guideItem.Name != "";

            if (flag)
            {
                for (int j = 0; j < Recipe.maxRecipes; j++)
                {
                    if (Main.recipe[j].createItem.type == 0)
                    {
                        break;
                    }
                    int num3 = 0;
                    while (num3 < Recipe.maxRequirements && Main.recipe[j].requiredItem[num3].type != 0)
                    {
                        if (Main.guideItem.IsTheSameAs(Main.recipe[j].requiredItem[num3]) || Main.recipe[j].useWood(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) || Main.recipe[j].useSand(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) || Main.recipe[j].useIronBar(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) || Main.recipe[j].useFragment(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) || Main.recipe[j].AcceptedByItemGroups(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) || Main.recipe[j].usePressurePlate(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type))
                        {
                            Main.availableRecipe[Main.numAvailableRecipes] = j;
                            Main.numAvailableRecipes++;
                            break;
                        }
                        num3++;
                    }
                }
            }
            else
            {
                Dictionary <int, int> dictionary = new Dictionary <int, int>();
                Item   item = null;
                Item[] inv  = Main.player[Main.myPlayer].inventory;
                for (int k = 0; k < inv.Length; k++)
                {
                    item = inv[k];
                    if (item.stack > 0)
                    {
                        if (dictionary.ContainsKey(item.netID))
                        {
                            Dictionary <int, int> dictionary2;
                            int netID;
                            (dictionary2 = dictionary)[netID = item.netID] = dictionary2[netID] + item.stack;
                        }
                        else
                        {
                            dictionary[item.netID] = item.stack;
                        }
                    }
                }
                if (Main.player[Main.myPlayer].active)
                {
                    K2Player k2player = Main.player[Main.myPlayer].GetModPlayer <K2Player>();
                    for (int j = 0; j <= k2player.inventory.unlocked; j += 1)
                    {
                        if (j != k2player.inventory.ActivePage)
                        {
                            foreach (Item i in k2player.inventory.page[j].item)
                            {
                                if (dictionary.ContainsKey(i.netID))
                                {
                                    Dictionary <int, int> dictionary2;
                                    int netID;
                                    (dictionary2 = dictionary)[netID = i.netID] = dictionary2[netID] + i.stack;
                                }
                                else
                                {
                                    dictionary[i.netID] = i.stack;
                                }
                            }
                        }
                    }
                }
                Item[] array = new Item[0];
                if (Main.player[Main.myPlayer].chest != -1)
                {
                    if (Main.player[Main.myPlayer].chest > -1)
                    {
                        array = Main.chest[Main.player[Main.myPlayer].chest].item;
                    }
                    else if (Main.player[Main.myPlayer].chest == -2)
                    {
                        array = Main.player[Main.myPlayer].bank.item;
                    }
                    else if (Main.player[Main.myPlayer].chest == -3)
                    {
                        array = Main.player[Main.myPlayer].bank2.item;
                    }
                    else if (Main.player[Main.myPlayer].chest == -4)
                    {
                        array = Main.player[Main.myPlayer].bank3.item;
                    }
                    for (int l = 0; l < 40; l++)
                    {
                        item = array[l];
                        if (item.stack > 0)
                        {
                            if (dictionary.ContainsKey(item.netID))
                            {
                                Dictionary <int, int> dictionary3;
                                int netID2;
                                (dictionary3 = dictionary)[netID2 = item.netID] = dictionary3[netID2] + item.stack;
                            }
                            else
                            {
                                dictionary[item.netID] = item.stack;
                            }
                        }
                    }
                }
                int num4 = 0;
                while (num4 < Recipe.maxRecipes && Main.recipe[num4].createItem.type != 0)
                {
                    bool flag2 = true;
                    if (flag2)
                    {
                        int num5 = 0;
                        while (num5 < Recipe.maxRequirements && Main.recipe[num4].requiredTile[num5] != -1)
                        {
                            if (!Main.player[Main.myPlayer].adjTile[Main.recipe[num4].requiredTile[num5]])
                            {
                                flag2 = false;
                                break;
                            }
                            num5++;
                        }
                    }
                    if (flag2)
                    {
                        for (int m = 0; m < Recipe.maxRequirements; m++)
                        {
                            item = Main.recipe[num4].requiredItem[m];
                            if (item.type == 0)
                            {
                                break;
                            }
                            int  num6  = item.stack;
                            bool flag3 = false;
                            foreach (int current in dictionary.Keys)
                            {
                                if (Main.recipe[num4].useWood(current, item.type) || Main.recipe[num4].useSand(current, item.type) || Main.recipe[num4].useIronBar(current, item.type) || Main.recipe[num4].useFragment(current, item.type) || Main.recipe[num4].AcceptedByItemGroups(current, item.type) || Main.recipe[num4].usePressurePlate(current, item.type))
                                {
                                    num6 -= dictionary[current];
                                    flag3 = true;
                                }
                            }
                            if (!flag3 && dictionary.ContainsKey(item.netID))
                            {
                                num6 -= dictionary[item.netID];
                            }
                            if (num6 > 0)
                            {
                                flag2 = false;
                                break;
                            }
                        }
                    }
                    if (flag2)
                    {
                        bool flag4 = !Main.recipe[num4].needWater || Main.player[Main.myPlayer].adjWater || Main.player[Main.myPlayer].adjTile[172];
                        bool flag5 = !Main.recipe[num4].needHoney || Main.recipe[num4].needHoney == Main.player[Main.myPlayer].adjHoney;
                        bool flag6 = !Main.recipe[num4].needLava || Main.recipe[num4].needLava == Main.player[Main.myPlayer].adjLava;
                        bool flag7 = !Main.recipe[num4].needSnowBiome || Main.player[Main.myPlayer].ZoneSnow;
                        if (!flag4 || !flag5 || !flag6 || !flag7)
                        {
                            flag2 = false;
                        }
                    }
                    if (flag2 && RecipeHooks.RecipeAvailable(Main.recipe[num4]))
                    {
                        Main.availableRecipe[Main.numAvailableRecipes] = num4;
                        Main.numAvailableRecipes++;
                    }
                    num4++;
                }
            }
            for (int n = 0; n < Main.numAvailableRecipes; n++)
            {
                if (num == Main.availableRecipe[n])
                {
                    Main.focusRecipe = n;
                    break;
                }
            }
            if (Main.focusRecipe >= Main.numAvailableRecipes)
            {
                Main.focusRecipe = Main.numAvailableRecipes - 1;
            }
            if (Main.focusRecipe < 0)
            {
                Main.focusRecipe = 0;
            }
            float num7 = Main.availableRecipeY[Main.focusRecipe] - num2;

            for (int num8 = 0; num8 < Recipe.maxRecipes; num8++)
            {
                Main.availableRecipeY[num8] -= num7;
            }
        }
示例#9
0
        public static void FindRecipes()
        {
            if (Main.netMode == NetmodeID.Server)
            {
                return;
            }
            int   num  = Main.availableRecipe[Main.focusRecipe];
            float num2 = Main.availableRecipeY[Main.focusRecipe];

            for (int i = 0; i < Terraria.Recipe.maxRecipes; i++)
            {
                Main.availableRecipe[i] = 0;
            }
            Main.numAvailableRecipes = 0;
            bool flag = Main.guideItem.type > 0 && Main.guideItem.stack > 0 && Main.guideItem.Name != "";

            if (flag)
            {
                for (int j = 0; j < Terraria.Recipe.maxRecipes; j++)
                {
                    if (Main.recipe[j].createItem.type == ItemID.None)
                    {
                        break;
                    }
                    int num3 = 0;
                    while (num3 < Terraria.Recipe.maxRequirements && Main.recipe[j].requiredItem[num3].type != 0)
                    {
                        if (Main.guideItem.IsTheSameAs(Main.recipe[j].requiredItem[num3]) ||
                            Main.recipe[j].useWood(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) ||
                            Main.recipe[j].useSand(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) ||
                            Main.recipe[j].useIronBar(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) ||
                            Main.recipe[j].useFragment(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) ||
                            Main.recipe[j].AcceptedByItemGroups(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type) ||
                            Main.recipe[j].usePressurePlate(Main.guideItem.type, Main.recipe[j].requiredItem[num3].type))
                        {
                            Main.availableRecipe[Main.numAvailableRecipes] = j;
                            Main.numAvailableRecipes++;
                            break;
                        }

                        num3++;
                    }
                }
            }
            else
            {
                Dictionary <int, int> dictionary = new Dictionary <int, int>();
                Item   item;
                Item[] inv = Main.player[Main.myPlayer].inventory;
                foreach (Item t in inv)
                {
                    item = t;
                    if (item.stack <= 0)
                    {
                        continue;
                    }
                    if (dictionary.ContainsKey(item.netID))
                    {
                        Dictionary <int, int> dictionary2;
                        int netId;
                        (dictionary2 = dictionary)[netId = item.netID] = dictionary2[netId] + item.stack;
                    }
                    else
                    {
                        dictionary[item.netID] = item.stack;
                    }
                }

                if (Main.player[Main.myPlayer].active)
                {
                    PlayerCharacter character = Main.player[Main.myPlayer].GetModPlayer <PlayerCharacter>();
                    for (int inventoryPage = 0; inventoryPage < character.Inventories.Length; inventoryPage += 1)
                    {
                        if (inventoryPage != character.ActiveInvPage)
                        {
                            foreach (Item inventorySlot in character.Inventories[inventoryPage])
                            {
                                if (dictionary.ContainsKey(inventorySlot.netID))
                                {
                                    Dictionary <int, int> dictionary2;
                                    int netId;
                                    (dictionary2 = dictionary)[netId = inventorySlot.netID] = dictionary2[netId] + inventorySlot.stack;
                                }
                                else
                                {
                                    dictionary[inventorySlot.netID] = inventorySlot.stack;
                                }
                            }
                        }
                    }
                }

                Item[] array = new Item[0];
                if (Main.player[Main.myPlayer].chest != -1)
                {
                    if (Main.player[Main.myPlayer].chest > -1)
                    {
                        array = Main.chest[Main.player[Main.myPlayer].chest].item;
                    }
                    else
                    {
                        switch (Main.player[Main.myPlayer].chest)
                        {
                        //Inventory Bank Main I
                        case -2:
                            array = Main.player[Main.myPlayer].bank.item;
                            break;

                        //Inventory Bank Page II
                        case -3:
                            array = Main.player[Main.myPlayer].bank2.item;
                            break;

                        //Inventory Bank Page III
                        case -4:
                            array = Main.player[Main.myPlayer].bank3.item;
                            break;
                        }
                    }

                    for (int inventorySlot = 0; inventorySlot < 40; inventorySlot++)
                    {
                        item = array[inventorySlot];
                        if (item.stack <= 0)
                        {
                            continue;
                        }
                        if (dictionary.ContainsKey(item.netID))
                        {
                            Dictionary <int, int> dictionary3;
                            int netId2;
                            //todo, Ok, no idea what this code is doing, will need to figure it out
                            (dictionary3 = dictionary)[netId2 = item.netID] = dictionary3[netId2] + item.stack;
                        }
                        else
                        {
                            dictionary[item.netID] = item.stack;
                        }
                    }
                }

                int num4 = 0;
                while (num4 < Terraria.Recipe.maxRecipes && Main.recipe[num4].createItem.type != ItemID.None)
                {
                    bool flag2 = true;
                    if (flag2)
                    {
                        int num5 = 0;
                        while (num5 < Terraria.Recipe.maxRequirements && Main.recipe[num4].requiredTile[num5] != -1)
                        {
                            if (!Main.player[Main.myPlayer].adjTile[Main.recipe[num4].requiredTile[num5]])
                            {
                                flag2 = false;
                                break;
                            }

                            num5++;
                        }
                    }

                    if (flag2)
                    {
                        for (int m = 0; m < Terraria.Recipe.maxRequirements; m++)
                        {
                            item = Main.recipe[num4].requiredItem[m];
                            if (item.type == ItemID.None)
                            {
                                break;
                            }
                            int  num6  = item.stack;
                            bool flag3 = false;
                            foreach (int current in dictionary.Keys.Where(current =>
                                                                          Main.recipe[num4].useWood(current, item.type) || Main.recipe[num4].useSand(current, item.type) ||
                                                                          Main.recipe[num4].useIronBar(current, item.type) || Main.recipe[num4].useFragment(current, item.type) ||
                                                                          Main.recipe[num4].AcceptedByItemGroups(current, item.type) || Main.recipe[num4].usePressurePlate(current, item.type)))
                            {
                                num6 -= dictionary[current];
                                flag3 = true;
                            }

                            if (!flag3 && dictionary.ContainsKey(item.netID))
                            {
                                num6 -= dictionary[item.netID];
                            }

                            if (num6 <= 0)
                            {
                                continue;
                            }
                            flag2 = false;
                            break;
                        }
                    }

                    if (flag2)
                    {
                        bool flag4 = !Main.recipe[num4].needWater || Main.player[Main.myPlayer].adjWater || Main.player[Main.myPlayer].adjTile[172];
                        bool flag5 = !Main.recipe[num4].needHoney || Main.recipe[num4].needHoney == Main.player[Main.myPlayer].adjHoney;
                        bool flag6 = !Main.recipe[num4].needLava || Main.recipe[num4].needLava == Main.player[Main.myPlayer].adjLava;
                        bool flag7 = !Main.recipe[num4].needSnowBiome || Main.player[Main.myPlayer].ZoneSnow;
                        if (!flag4 || !flag5 || !flag6 || !flag7)
                        {
                            flag2 = false;
                        }
                    }

                    if (flag2 && RecipeHooks.RecipeAvailable(Main.recipe[num4]))
                    {
                        Main.availableRecipe[Main.numAvailableRecipes] = num4;
                        Main.numAvailableRecipes++;
                    }

                    num4++;
                }
            }

            for (int n = 0; n < Main.numAvailableRecipes; n++)
            {
                if (num != Main.availableRecipe[n])
                {
                    continue;
                }
                Main.focusRecipe = n;
                break;
            }

            if (Main.focusRecipe >= Main.numAvailableRecipes)
            {
                Main.focusRecipe = Main.numAvailableRecipes - 1;
            }
            if (Main.focusRecipe < 0)
            {
                Main.focusRecipe = 0;
            }
            float num7 = Main.availableRecipeY[Main.focusRecipe] - num2;

            for (int num8 = 0; num8 < Terraria.Recipe.maxRecipes; num8++)
            {
                Main.availableRecipeY[num8] -= num7;
            }
        }