// Using Chat Tags is cool, but I can't assign individual code to them. // They are first and foremost just Text, made to look like things. // Word Wrap is possible with UIMessageBox code, but scrollbar is needed? With UIGrid, I could probably do this better public UIRecipePath(CraftPath path) { this.path = path; SetPadding(6); Width.Set(0, 1f); int top = 0; // Craftable // Total Money Cost var totalItemCost = new Dictionary <int, int>(); // Does all the other lines. int count = Traverse(path.root, 0, ref top, totalItemCost); var neededTiles = new HashSet <int>(path.root.GetAllChildrenPreOrder().OfType <CraftPath.RecipeNode>().SelectMany(x => x.recipe.requiredTile)); neededTiles.Remove(-1); var needWater = path.root.GetAllChildrenPreOrder().OfType <CraftPath.RecipeNode>().Any(x => x.recipe.needWater); var needHoney = path.root.GetAllChildrenPreOrder().OfType <CraftPath.RecipeNode>().Any(x => x.recipe.needHoney); var needLava = path.root.GetAllChildrenPreOrder().OfType <CraftPath.RecipeNode>().Any(x => x.recipe.needLava); var missingTiles = neededTiles.Where(x => !Main.LocalPlayer.adjTile[x]); StringBuilder sb = new StringBuilder(); sb.Append("Cost: "); foreach (var data in totalItemCost) { sb.Append(ItemHoverFixTagHandler.GenerateTag(data.Key, data.Value)); } // Maybe have a summary tiles needed if Full Craft implemented var drawTextSnippets = UIMessageBox.WordwrapStringSmart(sb.ToString(), Color.White, Main.fontMouseText, 300, -1); foreach (var textSnippet in drawTextSnippets) { string s = string.Concat(textSnippet.Select(x => x.TextOriginal)); UITextSnippet snippet = new UITextSnippet(s); snippet.Top.Set(top, 0); snippet.Left.Set(0, 0); Append(snippet); top += verticalSpace; count++; } Height.Set(count * verticalSpace + PaddingBottom + PaddingTop, 0f); // TODO: Full Craft Button //var craftButton = new UITextPanel<string>("Craft"); //craftButton.Top.Set(-38, 1f); //craftButton.Left.Set(-63, 1f); //craftButton.OnClick += CraftButton_OnClick; //Append(craftButton); }
private int Traverse(CraftPath.CraftPathNode node, int left, ref int top, Dictionary <int, int> totalItemCost) { int count = 1; StringBuilder sb = new StringBuilder(); var recipeNode = node as CraftPath.RecipeNode; if (recipeNode != null) { sb.Append(ItemHoverFixTagHandler.GenerateTag(recipeNode.recipe.createItem.type, recipeNode.recipe.createItem.stack * recipeNode.multiplier)); sb.Append("<"); for (int i = 0; i < recipeNode.recipe.requiredItem.Length; i++) { Item item = recipeNode.recipe.requiredItem[i]; if (!item.IsAir) { bool check = false; var child = recipeNode.children[i]; if (child is CraftPath.HaveItemNode) { check = true; } string nameOverride = RecipeCatalogueUI.OverrideForGroups(recipeNode.recipe, item.type); sb.Append(ItemHoverFixTagHandler.GenerateTag(item.type, item.stack * recipeNode.multiplier, nameOverride, check)); } } } else { if (node is CraftPath.HaveItemNode) { count--; } else { sb.Append(node.ToUITextString()); } } var haveItemNode = node as CraftPath.HaveItemNode; if (haveItemNode != null) { totalItemCost.Adjust(haveItemNode.itemid, haveItemNode.stack); } var haveItemsNode = node as CraftPath.HaveItemsNode; if (haveItemsNode != null) { foreach (var item in haveItemsNode.listOfItems) { totalItemCost.Adjust(item.Item1, item.Item2); } } if (sb.Length > 0) { var snippet = new UITextSnippet(sb.ToString()); snippet.Top.Set(top, 0); snippet.Left.Set(left, 0); Append(snippet); if (recipeNode != null) { var neededTiles = new HashSet <int>(recipeNode.recipe.requiredTile); neededTiles.Remove(-1); var needWater = recipeNode.recipe.needWater; var needHoney = recipeNode.recipe.needHoney; var needLava = recipeNode.recipe.needLava; UIRecipeInfoRightAligned simpleRecipeInfo = new UIRecipeInfoRightAligned(neededTiles.ToList(), needWater, needHoney, needLava); simpleRecipeInfo.Top.Set(top, 0); simpleRecipeInfo.Left.Set(-30, 1f); Append(simpleRecipeInfo); UICraftButton craftButton = new UICraftButton(recipeNode, recipeNode.recipe); craftButton.Top.Set(top, 0); craftButton.Left.Set(-26, 1f); Append(craftButton); } top += verticalSpace; } if (node.children != null) { foreach (var child in node.children) { if (child != null) { count += Traverse(child, left + HorizontalTab, ref top, totalItemCost); } } } return(count); }