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); }
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); }
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); }
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 } } }
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); } }
protected sealed override void Register() { ModTypeLookup <GlobalRecipe> .Register(this); RecipeHooks.Add(this); }
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; } }
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; } }