From 42ccd01b5a28cf1faabfd4f5980aca80a0b2609b Mon Sep 17 00:00:00 2001 From: JavidPack Date: Tue, 27 Sep 2022 19:51:23 -0600 Subject: [PATCH] v0.6.1, Fix #10 add completion bar to ingame ui --- ItemChecklistClientConfig.cs | 2 +- ItemChecklistUI.cs | 16 ++++- UIElements/UICollectionBar.cs | 130 ++++++++++++++++++++++++++++++++++ build.txt | 2 +- 4 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 UIElements/UICollectionBar.cs diff --git a/ItemChecklistClientConfig.cs b/ItemChecklistClientConfig.cs index fff9fa3..d16f163 100644 --- a/ItemChecklistClientConfig.cs +++ b/ItemChecklistClientConfig.cs @@ -18,7 +18,7 @@ namespace ItemChecklist [Header("Automatic Settings")] // non-player specific stuff: - [DefaultValue(typeof(Vector2), "475, 350")] + [DefaultValue(typeof(Vector2), "475, 370")] [Range(0f, 1920f)] [Label("Item Checklist Size")] [Tooltip("Size of the Item Checklist UI. This will automatically save, no need to adjust")] diff --git a/ItemChecklistUI.cs b/ItemChecklistUI.cs index f7b7bfe..f3223b8 100644 --- a/ItemChecklistUI.cs +++ b/ItemChecklistUI.cs @@ -18,6 +18,7 @@ using Terraria.UI; using UIItemSlot = ItemChecklist.UIElements.UIItemSlot; using Steamworks; using System.Runtime.CompilerServices; +using System.ComponentModel; namespace ItemChecklist { @@ -37,6 +38,7 @@ namespace ItemChecklist internal NewUITextBox itemDescriptionFilter; internal SharedUI sharedUI; public UIGrid checklistGrid; + public UICollectionBar collectionBar; //public static SortModes sortMode = SortModes.TerrariaSort; float spacing = 8f; @@ -80,7 +82,7 @@ namespace ItemChecklist mainPanel.Width.Set(475f, 0f); // + 30 mainPanel.MinWidth.Set(415f, 0f); mainPanel.MaxWidth.Set(884f, 0f); - mainPanel.Height.Set(350, 0f); + mainPanel.Height.Set(370, 0f); mainPanel.MinHeight.Set(263, 0f); mainPanel.MaxHeight.Set(1000, 0f); //mainPanel.BackgroundColor = Color.LightBlue; @@ -187,19 +189,26 @@ namespace ItemChecklist checklistGrid.alternateSort = ItemGridSort; checklistGrid.Top.Pixels = top; checklistGrid.Width.Set(-25f, 1f); - checklistGrid.Height.Set(-top, 1f); + checklistGrid.Height.Set(-top - 24, 1f); checklistGrid.ListPadding = 2f; checklistPanel.Append(checklistGrid); FixedUIScrollbar checklistListScrollbar = new FixedUIScrollbar(); checklistListScrollbar.SetView(100f, 1000f); checklistListScrollbar.Top.Pixels = top; - checklistListScrollbar.Height.Set(-top, 1f); + checklistListScrollbar.Height.Set(-top - 24, 1f); checklistListScrollbar.HAlign = 1f; checklistPanel.Append(checklistListScrollbar); checklistGrid.SetScrollbar(checklistListScrollbar); // Checklistlist populated when the panel is shown: UpdateCheckboxes() + collectionBar = new UICollectionBar() { + Width = new StyleDimension(0f, 1f), + Height = new StyleDimension(15f, 0f), + VAlign = 1f, + }; + + checklistPanel.Append(collectionBar); Append(mainPanel); @@ -338,6 +347,7 @@ namespace ItemChecklist if (!updateNeeded) { return; } updateNeeded = false; checklistGrid.Clear(); + collectionBar.RecalculateBars(); if (buttonsHaveDummyTextures) { diff --git a/UIElements/UICollectionBar.cs b/UIElements/UICollectionBar.cs new file mode 100644 index 0000000..877ac30 --- /dev/null +++ b/UIElements/UICollectionBar.cs @@ -0,0 +1,130 @@ +using System.Collections.Generic; +using System.Linq; +using Terraria.UI; +using Terraria.GameContent.Bestiary; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Terraria.GameContent; +using Terraria; +using Terraria.ModLoader; +using Terraria.ID; + +namespace ItemChecklist.UIElements +{ + // Adapted from Terraria.ModLoader.UI.UIBestiaryBar + class UICollectionBar : UIElement + { + private class UICollectionBarItem + { + internal readonly string Tooltop; + internal readonly int EntryCount; + internal readonly int CompletedCount; + internal readonly Color DrawColor; + + public UICollectionBarItem(string tooltop, int entryCount, int completedCount, Color drawColor) { + Tooltop = tooltop; + EntryCount = entryCount; + CompletedCount = completedCount; + DrawColor = drawColor; + } + } + + private List collectionBarItems; + + public UICollectionBar() { + collectionBarItems = new List(); + + RecalculateBars(); + } + + private readonly Color[] _colors = { + new Color(232, 76, 61),//red + new Color(155, 88, 181),//purple + new Color(27, 188, 155),//aqua + new Color(243, 156, 17),//orange + new Color(45, 204, 112),//green + new Color(241, 196, 15),//yellow + }; + + public void RecalculateBars() { + collectionBarItems.Clear(); + if (Main.gameMenu) + return; + + var ItemChecklistPlayer = Main.LocalPlayer.GetModPlayer(); + + //Add the bestiary total to the bar + int total = ItemChecklistPlayer.totalItemsToFind; + int totalCollected = ItemChecklistPlayer.totalItemsFound; + collectionBarItems.Add(new UICollectionBarItem($"Total: {totalCollected}/{total} ({(float)totalCollected / total * 100f:N2}% Collected)", total, totalCollected, Main.OurFavoriteColor)); + + var data = ItemChecklistPlayer.foundItem.Zip(ContentSamples.ItemsByType.Values); + //.GroupBy(x=>x.Second.ModItem?.Mod.Name ?? "Terraria").ToDictionary(y=>y., x=>x); + var items = data.Where(x => x.Second.ModItem == null).ToList(); + + //Add Terraria's item entries + int collected = items.Count(x => x.First); + collectionBarItems.Add(new UICollectionBarItem($"Terraria: {collected}/{items.Count} ({(float)collected / items.Count * 100f:N2}% Collected)", items.Count, collected, _colors[0])); + + //Add the mod's item entries + for (int i = 0; i < ModLoader.Mods.Length; i++) { + items = data.Where(x => x.Second.ModItem?.Mod == ModLoader.Mods[i]).ToList(); + if (!items.Any()) // No Items added by mod. + continue; + collected = items.Count(x => x.First); + collectionBarItems.Add(new UICollectionBarItem($"{ModLoader.Mods[i].DisplayName}: {collected}/{items.Count} ({(float)collected / items.Count * 100f:N2}% Collected)", items.Count, collected, _colors[i % _colors.Length])); + } + } + + protected override void DrawSelf(SpriteBatch sb) { + int xOffset = 0; + var rectangle = GetDimensions().ToRectangle(); + const int bottomHeight = 3; //The height of the total completion bar + rectangle.Height -= bottomHeight; + + bool drawHover = false; + UICollectionBarItem hoverData = null; + var ItemChecklistPlayer = Main.LocalPlayer.GetModPlayer(); + + //Draw the mod progress bars + for (int i = 1; i < collectionBarItems.Count; i++) { + var barData = collectionBarItems[i]; + + int offset = (int)(rectangle.Width * (barData.EntryCount / (float)ItemChecklistPlayer.totalItemsToFind)); + if (i == collectionBarItems.Count - 1) { + offset = rectangle.Width - xOffset; + } + int width = (int)(offset * (barData.CompletedCount / (float)barData.EntryCount)); + + var drawArea = new Rectangle(rectangle.X + xOffset, rectangle.Y, width, rectangle.Height); + var outlineArea = new Rectangle(rectangle.X + xOffset, rectangle.Y, offset, rectangle.Height); + xOffset += offset; + + sb.Draw(TextureAssets.MagicPixel.Value, outlineArea, barData.DrawColor * 0.3f); + sb.Draw(TextureAssets.MagicPixel.Value, drawArea, barData.DrawColor); + + if (!drawHover && outlineArea.Contains(new Point(Main.mouseX, Main.mouseY))) { + drawHover = true; + hoverData = barData; + } + } + //Draw the bottom progress bar + var bottomData = collectionBarItems[0]; + int bottomWidth = (int)(rectangle.Width * (bottomData.CompletedCount / (float)bottomData.EntryCount)); + var bottomDrawArea = new Rectangle(rectangle.X, rectangle.Bottom, bottomWidth, bottomHeight); + var bottomOutlineArea = new Rectangle(rectangle.X, rectangle.Bottom, rectangle.Width, bottomHeight); + + sb.Draw(TextureAssets.MagicPixel.Value, bottomOutlineArea, bottomData.DrawColor * 0.3f); + sb.Draw(TextureAssets.MagicPixel.Value, bottomDrawArea, bottomData.DrawColor); + + if (!drawHover && bottomOutlineArea.Contains(new Point(Main.mouseX, Main.mouseY))) { + drawHover = true; + hoverData = bottomData; + } + + if (drawHover && hoverData != null) { + Main.instance.MouseText(hoverData.Tooltop, 0, 0); + } + } + } +} diff --git a/build.txt b/build.txt index c027f95..0e79ff6 100644 --- a/build.txt +++ b/build.txt @@ -1,5 +1,5 @@ author = jopojelly -version = 0.6 +version = 0.6.1 displayName = Item Checklist homepage = https://forums.terraria.org/index.php?threads/item-checklist-in-game-100-item-collection-checklist.52786/ hideCode = false