Even More Modifiers  1.0.0.0
A mod for rolling various bonus stats on items
GuiSoulforgeTab.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using Loot.Ext;
5 using Loot.Soulforging;
6 using Loot.UI.Common;
8 using Microsoft.Xna.Framework;
9 using Terraria;
10 using Terraria.GameContent.UI.Elements;
11 using Terraria.ModLoader;
12 using Terraria.UI;
13 
14 namespace Loot.UI.Tabs.Soulforging
15 {
16  internal class GuiSoulforgeTab : GuiTab
17  {
18  public override string Header => "Soulforging";
19  public override int GetPageHeight()
20  {
21  return 400;
22  }
23 
24  private GuiSoulgauge Soulgauge;
25  private GuiInteractableItemButton ItemButton;
26  private GuiImageButton CraftButton;
27  private GuiInteractableItemButton SoulButton;
28 
29  private GuiArrowButton ArrowLeft;
30  private GuiArrowButton ArrowRight;
31  private UIText Paginator;
32 
33  private int CurrentPage = 1;
34  private int MaxPages = 1;
35  private const int MAX_ROWS_PER_PAGE = 7;
36  private bool ShouldUpdate = true;
37 
38  public override void OnInitialize()
39  {
40  base.OnInitialize();
41 
42  Soulgauge = new GuiSoulgauge();
43  Soulgauge.OnInitialize();
44  TabFrame.Append(Soulgauge);
45 
46  ItemButton = new GuiInteractableItemButton(
47  GuiButton.ButtonType.Parchment,
48  hintTexture: ModContent.GetTexture("Terraria/Item_24"),
49  hintText: "Place an item here"
50  );
51  ItemButton.Top.Pixels = Soulgauge.Height.Pixels / 4f;
52  ItemButton.RightOf(Soulgauge);
53  ItemButton.Left.Pixels += ItemButton.Width.Pixels - GuiTab.PADDING * 1.5f;
54  TabFrame.Append(ItemButton);
55 
56  CraftButton = new GuiImageButton(GuiButton.ButtonType.None, ModContent.GetTexture("Terraria/UI/Craft_Toggle_3"));
57  CraftButton.Top.Pixels = ItemButton.Top.Pixels;
58  CraftButton.RightOf(ItemButton);
59  TabFrame.Append(CraftButton);
60 
61  SoulButton = new GuiInteractableItemButton(
62  GuiButton.ButtonType.Parchment,
63  hintTexture: Assets.Textures.PlaceholderTexture,
64  hintText: "Place a soul here"
65  );
66  SoulButton.Top.Pixels = ItemButton.Top.Pixels;
67  SoulButton.RightOf(CraftButton);
68  TabFrame.Append(SoulButton);
69 
70  ArrowLeft = new GuiArrowButton(GuiArrowButton.ArrowDirection.LEFT)
71  {
72  HoverText = "Previous",
73  Top = new StyleDimension(24, 1.0f)
74  };
75  ArrowLeft.WhenClicked += (evt, element, btn) =>
76  {
77  CurrentPage--;
78  ShouldUpdate = true;
79  };
80  ArrowRight = new GuiArrowButton(GuiArrowButton.ArrowDirection.RIGHT)
81  {
82  HoverText = "Next",
83  Left = new StyleDimension(-15, 0f),
84  Top = new StyleDimension(24, 1.0f)
85  }.RightOf(ArrowLeft);
86  ArrowRight.WhenClicked += (evt, element, btn) =>
87  {
88  CurrentPage++;
89  ShouldUpdate = true;
90  };
91  TabFrame.Append(ArrowLeft);
92  TabFrame.Append(ArrowRight);
93 
94  Paginator = new UIText("1/1")
95  {
96  Top = new StyleDimension(24, 1.0f)
97  }.LeftOf(ArrowLeft);
98  Paginator.Left.Pixels = -(ArrowLeft.Width.Pixels - 25) / 2f;
99  TabFrame.Append(Paginator);
100  }
101 
102  public override void Update(GameTime gameTime)
103  {
104  base.Update(gameTime);
105  if (ShouldUpdate)
106  {
107  CalculateRubeRows();
108  UpdateActiveRows();
109  ShouldUpdate = false;
110  }
111  }
112 
113  public List<Item> GetAvailableCubes()
114  {
115  return Cubes.Where(item => item.stack > 0).ToList();
116  }
117 
118  private List<Item> Cubes = new List<Item>();
119  private List<CubeCraftRow> CubeRows = new List<CubeCraftRow>();
120  private List<CubeCraftRow> ActiveRows = new List<CubeCraftRow>();
121 
122  private void CalculateRubeRows()
123  {
124  ActiveRows.ForEach(x => TabFrame.RemoveChild(x));
125  CubeRows.Clear();
126 
127  var world = ModContent.GetInstance<LootEssenceWorld>();
128  var count = world.UnlockedCubes.Count;
129  MaxPages = (int)Math.Ceiling(count / (float)MAX_ROWS_PER_PAGE);
130  ArrowRight.CanBeClicked = MaxPages > 1 && CurrentPage != MaxPages;
131  ArrowLeft.CanBeClicked = MaxPages > 1 && CurrentPage != 1;
132  Paginator.SetText($"{CurrentPage}/{MaxPages}");
133 
134  foreach (var cube in world.UnlockedCubes)
135  {
136  var row = new CubeCraftRow(cube);
137  row.Activate();
138  row.UpdateText();
139  CubeRows.Add(row);
140  row.OnCubeUpdate += item =>
141  {
142  Cubes.First(x => x.type == item.type).stack = item.stack;
143  };
144 
145  if (Cubes.All(item => item.type != cube))
146  {
147  var item = new Item();
148  item.SetDefaults(cube);
149  item.stack = 0;
150  Cubes.Add(item);
151  }
152  else
153  {
154  row.Cube = Cubes.First(x => x.type == cube);
155  row.CubeButton.ChangeItem(0, row.Cube);
156  }
157  }
158  }
159 
160  private void UpdateActiveRows()
161  {
162  ActiveRows.Clear();
163  UIElement previous = Soulgauge;
164 
165  foreach (var row in CubeRows.Skip((CurrentPage - 1) * MAX_ROWS_PER_PAGE).Take(MAX_ROWS_PER_PAGE).ToList())
166  {
167  row.Cube = Cubes.First(item => item.type == row.Type);
168  row.Below(previous);
169  TabFrame.Append(row);
170  ActiveRows.Add(row);
171  previous = row;
172  }
173  }
174 
175  public override void OnShow()
176  {
177  base.OnShow();
178  ShouldUpdate = true;
179  }
180 
181  public override void GiveBackItems()
182  {
183  CubeRows.ForEach(row =>
184  {
185  if (!row.CubeButton.Item.IsAir)
186  {
187  row.CubeButton.Item.noGrabDelay = 0;
188  Main.LocalPlayer.GetItem(Main.myPlayer, row.CubeButton.Item.Clone());
189  row.CubeButton.Item.TurnToAir();
190  row.Cube.TurnToAir();
191  }
192  });
193  }
194  }
195 }