blob: cca02e117ce12d1a5401b0ef42fce03681d00472 (
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.di.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()
)
}
}
|