-
Notifications
You must be signed in to change notification settings - Fork 1
/
ModSubInventory.cs
74 lines (61 loc) · 3.08 KB
/
ModSubInventory.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;
using Terraria;
using Terraria.Localization;
using Terraria.ModLoader;
using Terraria.Audio;
using Terraria.ID;
using SpikysLib.Extensions;
namespace BetterInventory;
public readonly record struct Slot(ModSubInventory Inventory, int Index) {
public Item Item(Player player) => Inventory.Items(player)[Index];
public Item GetItem(Player player, Item item, GetItemSettings settings) => Inventory.GetItem(player, item, Index, settings);
public void Focus(Player player) => Inventory.Focus(player, Index);
public void OnSlotChange(Player player) => Inventory.OnSlotChange(player, Index);
}
public abstract class ModSubInventory : ModType, ILocalizedModType {
public bool CanBePrimary { get; internal set; }
public abstract int Context { get; }
public virtual int? MaxStack => null;
public virtual bool Accepts(Item item) => true;
public virtual bool IsPrimaryFor(Item item) => false;
public abstract IList<Item> Items(Player player);
public virtual bool FitsSlot(Player player, Item item, int slot, out IList<Slot> itemsToMove) {
itemsToMove = Array.Empty<Slot>();
return true;
}
public virtual void Focus(Player player, int slot) { }
public virtual void OnSlotChange(Player player, int slot) { }
public virtual Item GetItem(Player player, Item item, GetItemSettings settings) {
if (!Accepts(item)) return item;
IList<Item> items = Items(player);
for (int i = 0; i < items.Count && !item.IsAir; i++) TryStackItem(player, item, i, settings, items);
Recipe.FindRecipes();
return item;
}
public Item GetItem(Player player, Item item, int slot, GetItemSettings settings) {
if (!Accepts(item)) return item;
TryStackItem(player, item, slot, settings, Items(player));
Recipe.FindRecipes();
return item;
}
private void TryStackItem(Player player, Item item, int slot, GetItemSettings settings, IList<Item> items) {
if (!FitsSlot(player, item, slot, out var itemsToMove) || itemsToMove.Count != 0) return;
items[slot] = ItemExtensions.MoveInto(items[slot], item, out int transferred, MaxStack);
if (transferred == 0) return;
SoundEngine.PlaySound(SoundID.Grab);
items[slot].position = player.position;
if (!settings.NoText) PopupText.NewText(PopupTextContext.ItemPickupToVoidContainer, items[slot], transferred, false, settings.LongText);
OnSlotChange(player, slot);
return;
}
public virtual int ComparePositionTo(ModSubInventory other) => 0;
protected sealed override void Register() {
ModTypeLookup<ModSubInventory>.Register(this);
InventoryLoader.Register(this);
Language.GetOrRegister(this.GetLocalizationKey("DisplayName"), PrettyPrintName);
}
public sealed override void SetupContent() => SetStaticDefaults();
public string LocalizationCategory => "SubInventories";
public virtual LocalizedText DisplayName => this.GetLocalization("DisplayName");
}