aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/ledger/modules/ChestDetection.kt
blob: 48c040a1a6c506d6c8bf17915731cb64727f11f0 (plain)
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
package moe.nea.ledger.modules

import moe.nea.ledger.ItemChange
import moe.nea.ledger.ItemId
import moe.nea.ledger.ItemIdProvider
import moe.nea.ledger.getDisplayNameU
import moe.nea.ledger.getInternalId
import moe.nea.ledger.getLore
import moe.nea.ledger.unformattedString
import moe.nea.ledger.utils.Inject
import net.minecraft.init.Blocks
import net.minecraft.inventory.Slot
import net.minecraft.item.Item
import java.time.Instant

abstract class ChestDetection {
	data class ChestCost(
		val diff: List<ItemChange>,
		val timestamp: Instant,
	)

	@Inject
	lateinit var itemIdProvider: ItemIdProvider
	fun scrapeChestReward(rewardSlot: Slot): ChestCost? {
		val inventory = rewardSlot.inventory
		if (!inventory.displayName.unformattedText.unformattedString()
				.endsWith(" Chest")
		) return null
		val rewardStack = rewardSlot.stack ?: return null
		val name = rewardStack.getDisplayNameU()
		if (name != "§aOpen Reward Chest") return null
		val lore = rewardStack.getLore()
		val cost = itemIdProvider.findCostItemsFromSpan(lore)
		val gain = (9..18)
			.mapNotNull { inventory.getStackInSlot(it) }
			.filter { it.item != Item.getItemFromBlock(Blocks.stained_glass_pane) }
			.map {
				it.getInternalId()?.withStackSize(it.stackSize)
					?: itemIdProvider.findStackableItemByName(it.displayName)
					?: ItemId.NIL.withStackSize(it.stackSize)
			}
		return ChestCost(
			cost.map { ItemChange.lose(it.first, it.second) } + gain.map { ItemChange.gain(it.first, it.second) },
			Instant.now()
		)
	}

}