aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament/rei/FirmamentReiPlugin.kt
blob: b5853363322e23310c895d7128d04eb8ff8f7ac2 (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
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package moe.nea.firmament.rei

import me.shedaniel.rei.api.client.plugins.REIClientPlugin
import me.shedaniel.rei.api.client.registry.category.CategoryRegistry
import me.shedaniel.rei.api.client.registry.display.DisplayRegistry
import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry
import me.shedaniel.rei.api.client.registry.entry.EntryRegistry
import me.shedaniel.rei.api.client.registry.screen.ExclusionZones
import me.shedaniel.rei.api.client.registry.screen.OverlayDecider
import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry
import me.shedaniel.rei.api.client.registry.transfer.TransferHandler
import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry
import me.shedaniel.rei.api.common.entry.EntryStack
import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes
import net.minecraft.client.gui.screen.Screen
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen
import net.minecraft.client.gui.screen.ingame.HandledScreen
import net.minecraft.item.ItemStack
import net.minecraft.text.Text
import net.minecraft.util.ActionResult
import net.minecraft.util.Identifier
import moe.nea.firmament.events.HandledScreenPushREIEvent
import moe.nea.firmament.features.inventory.CraftingOverlay
import moe.nea.firmament.features.inventory.storageoverlay.StorageOverlayScreen
import moe.nea.firmament.rei.recipes.SBCraftingRecipe
import moe.nea.firmament.rei.recipes.SBEssenceUpgradeRecipe
import moe.nea.firmament.rei.recipes.SBForgeRecipe
import moe.nea.firmament.rei.recipes.SBKatRecipe
import moe.nea.firmament.rei.recipes.SBMobDropRecipe
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.SkyblockId
import moe.nea.firmament.util.skyblockId
import moe.nea.firmament.util.unformattedString


class FirmamentReiPlugin : REIClientPlugin {

    companion object {
        fun EntryStack<SBItemStack>.asItemEntry(): EntryStack<ItemStack> {
            return EntryStack.of(VanillaEntryTypes.ITEM, value.asImmutableItemStack())
        }

        val SKYBLOCK_ITEM_TYPE_ID = Identifier.of("firmament", "skyblockitems")
    }

    override fun registerTransferHandlers(registry: TransferHandlerRegistry) {
        registry.register(TransferHandler { context ->
            val screen = context.containerScreen
            val display = context.display
            if (display !is SBCraftingRecipe || screen !is GenericContainerScreen || screen.title?.unformattedString != "Craft Item") {
                return@TransferHandler TransferHandler.Result.createNotApplicable()
            }
            if (context.isActuallyCrafting)
                CraftingOverlay.setOverlay(screen, display)
            return@TransferHandler TransferHandler.Result.createSuccessful().blocksFurtherHandling(true)
        })
    }

    override fun registerEntryTypes(registry: EntryTypeRegistry) {
        registry.register(SKYBLOCK_ITEM_TYPE_ID, SBItemEntryDefinition)
    }

    override fun registerCategories(registry: CategoryRegistry) {
        registry.add(SBCraftingRecipe.Category)
        registry.add(SBForgeRecipe.Category)
        registry.add(SBMobDropRecipe.Category)
        registry.add(SBKatRecipe.Category)
        registry.add(SBEssenceUpgradeRecipe.Category)
    }

    override fun registerExclusionZones(zones: ExclusionZones) {
        zones.register(HandledScreen::class.java) { HandledScreenPushREIEvent.publish(HandledScreenPushREIEvent(it)).rectangles }
        zones.register(StorageOverlayScreen::class.java) { it.getBounds() }
    }

    override fun registerDisplays(registry: DisplayRegistry) {
        registry.registerDisplayGenerator(
            SBCraftingRecipe.Category.catIdentifier,
            SkyblockCraftingRecipeDynamicGenerator)
        registry.registerDisplayGenerator(
            SBForgeRecipe.Category.categoryIdentifier,
            SkyblockForgeRecipeDynamicGenerator)
        registry.registerDisplayGenerator(
            SBMobDropRecipe.Category.categoryIdentifier,
            SkyblockMobDropRecipeDynamicGenerator)
        registry.registerDisplayGenerator(
            SBKatRecipe.Category.categoryIdentifier,
            SkyblockKatRecipeDynamicGenerator)
        registry.registerDisplayGenerator(
            SBEssenceUpgradeRecipe.Category.categoryIdentifier,
            SkyblockEssenceRecipeDynamicGenerator
        )
    }

    override fun registerCollapsibleEntries(registry: CollapsibleEntryRegistry) {
        if (!RepoManager.Config.disableItemGroups)
            RepoManager.neuRepo.constants.parents.parents
                .forEach { (parent, children) ->
                    registry.group(
                        SkyblockId(parent).identifier,
                        Text.literal(RepoManager.getNEUItem(SkyblockId(parent))?.displayName ?: parent),
                        (children + parent).map { SBItemEntryDefinition.getEntry(SkyblockId(it)) })
                }
    }

    override fun registerScreens(registry: ScreenRegistry) {
        registry.registerDecider(object : OverlayDecider {
            override fun <R : Screen?> isHandingScreen(screen: Class<R>?): Boolean {
                return screen == StorageOverlayScreen::class.java
            }

            override fun <R : Screen?> shouldScreenBeOverlaid(screen: R): ActionResult {
                return ActionResult.SUCCESS
            }
        })
        registry.registerFocusedStack(SkyblockItemIdFocusedStackProvider)
    }

    override fun registerEntries(registry: EntryRegistry) {
        registry.removeEntryIf { true }
        RepoManager.neuRepo.items?.items?.values?.forEach { neuItem ->
            registry.addEntry(SBItemEntryDefinition.getEntry(neuItem.skyblockId))
        }
    }
}