terraria-source-code/GameContent/UI/Elements/UIDynamicItemCollection.cs
2021-10-26 12:45:26 -04:00

176 lines
6.3 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.UI.Elements.UIDynamicItemCollection
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using Terraria.GameInput;
using Terraria.ID;
using Terraria.UI;
using Terraria.UI.Gamepad;
namespace Terraria.GameContent.UI.Elements
{
public class UIDynamicItemCollection : UIElement
{
private List<int> _itemIdsAvailableToShow = new List<int>();
private List<int> _itemIdsToLoadTexturesFor = new List<int>();
private int _itemsPerLine;
private const int sizePerEntryX = 44;
private const int sizePerEntryY = 44;
private List<SnapPoint> _dummySnapPoints = new List<SnapPoint>();
public UIDynamicItemCollection()
{
this.Width = new StyleDimension(0.0f, 1f);
this.HAlign = 0.5f;
this.UpdateSize();
}
protected override void DrawSelf(SpriteBatch spriteBatch)
{
Main.inventoryScale = 0.8461539f;
int startX;
int startY;
int startItemIndex;
int endItemIndex;
this.GetGridParameters(out startX, out startY, out startItemIndex, out endItemIndex);
int itemsPerLine = this._itemsPerLine;
for (int index = startItemIndex; index < endItemIndex; ++index)
{
int key = this._itemIdsAvailableToShow[index];
Rectangle itemSlotHitbox = this.GetItemSlotHitbox(startX, startY, startItemIndex, index);
Item inv = ContentSamples.ItemsByType[key];
int context = 29;
if (TextureAssets.Item[key].State == null)
--itemsPerLine;
bool flag = false;
if (this.IsMouseHovering && itemSlotHitbox.Contains(Main.MouseScreen.ToPoint()) && !PlayerInput.IgnoreMouseInterface)
{
Main.LocalPlayer.mouseInterface = true;
ItemSlot.OverrideHover(ref inv, context);
ItemSlot.LeftClick(ref inv, context);
ItemSlot.RightClick(ref inv, context);
ItemSlot.MouseHover(ref inv, context);
flag = true;
}
UILinkPointNavigator.Shortcuts.CREATIVE_ItemSlotShouldHighlightAsSelected = flag;
ItemSlot.Draw(spriteBatch, ref inv, context, itemSlotHitbox.TopLeft());
if (itemsPerLine <= 0)
break;
}
while (this._itemIdsToLoadTexturesFor.Count > 0 && itemsPerLine > 0)
{
int i = this._itemIdsToLoadTexturesFor[0];
this._itemIdsToLoadTexturesFor.RemoveAt(0);
if (TextureAssets.Item[i].State == null)
{
Main.instance.LoadItem(i);
itemsPerLine -= 4;
}
}
}
private Rectangle GetItemSlotHitbox(
int startX,
int startY,
int startItemIndex,
int i)
{
int num1 = i - startItemIndex;
int num2 = num1 % this._itemsPerLine;
int num3 = num1 / this._itemsPerLine;
return new Rectangle(startX + num2 * 44, startY + num3 * 44, 44, 44);
}
private void GetGridParameters(
out int startX,
out int startY,
out int startItemIndex,
out int endItemIndex)
{
Rectangle rectangle = this.GetDimensions().ToRectangle();
Rectangle viewCullingArea = this.Parent.GetViewCullingArea();
int x = rectangle.Center.X;
startX = x - (int) ((double) (44 * this._itemsPerLine) * 0.5);
startY = rectangle.Top;
startItemIndex = 0;
endItemIndex = this._itemIdsAvailableToShow.Count;
int num1 = (Math.Min(viewCullingArea.Top, rectangle.Top) - viewCullingArea.Top) / 44;
startY += -num1 * 44;
startItemIndex += -num1 * this._itemsPerLine;
int num2 = (int) Math.Ceiling((double) viewCullingArea.Height / 44.0) * this._itemsPerLine;
if (endItemIndex <= num2 + startItemIndex + this._itemsPerLine)
return;
endItemIndex = num2 + startItemIndex + this._itemsPerLine;
}
public override void Recalculate()
{
base.Recalculate();
this.UpdateSize();
}
public override void Update(GameTime gameTime)
{
base.Update(gameTime);
if (!this.IsMouseHovering)
return;
Main.LocalPlayer.mouseInterface = true;
}
public void SetContentsToShow(List<int> itemIdsToShow)
{
this._itemIdsAvailableToShow.Clear();
this._itemIdsToLoadTexturesFor.Clear();
this._itemIdsAvailableToShow.AddRange((IEnumerable<int>) itemIdsToShow);
this._itemIdsToLoadTexturesFor.AddRange((IEnumerable<int>) itemIdsToShow);
this.UpdateSize();
}
public int GetItemsPerLine() => this._itemsPerLine;
public override List<SnapPoint> GetSnapPoints()
{
List<SnapPoint> snapPointList = new List<SnapPoint>();
int startX;
int startY;
int startItemIndex;
int endItemIndex;
this.GetGridParameters(out startX, out startY, out startItemIndex, out endItemIndex);
int itemsPerLine = this._itemsPerLine;
Rectangle viewCullingArea = this.Parent.GetViewCullingArea();
int num1 = endItemIndex - startItemIndex;
while (this._dummySnapPoints.Count < num1)
this._dummySnapPoints.Add(new SnapPoint("CreativeInfinitesSlot", 0, Vector2.Zero, Vector2.Zero));
int num2 = 0;
Vector2 vector2 = this.GetDimensions().Position();
for (int i = startItemIndex; i < endItemIndex; ++i)
{
Point center = this.GetItemSlotHitbox(startX, startY, startItemIndex, i).Center;
if (viewCullingArea.Contains(center))
{
SnapPoint dummySnapPoint = this._dummySnapPoints[num2];
dummySnapPoint.ThisIsAHackThatChangesTheSnapPointsInfo(Vector2.Zero, center.ToVector2() - vector2, num2);
dummySnapPoint.Calculate((UIElement) this);
++num2;
snapPointList.Add(dummySnapPoint);
}
}
foreach (UIElement element in this.Elements)
snapPointList.AddRange((IEnumerable<SnapPoint>) element.GetSnapPoints());
return snapPointList;
}
public void UpdateSize()
{
int num = this.GetDimensions().ToRectangle().Width / 44;
this._itemsPerLine = num;
this.MinHeight.Set((float) (44 * (int) Math.Ceiling((double) this._itemIdsAvailableToShow.Count / (double) num)), 0.0f);
}
}
}