aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/impl/v1/FirmamentAPIImpl.kt
blob: 3ca4778cb3ffb751a10577cc4d6cf5cef28e1256 (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
package moe.nea.firmament.impl.v1

import java.util.Collections
import java.util.Optional
import net.fabricmc.loader.api.FabricLoader
import kotlin.jvm.optionals.getOrNull
import net.minecraft.world.item.ItemStack
import moe.nea.firmament.Firmament
import moe.nea.firmament.api.v1.FirmamentAPI
import moe.nea.firmament.api.v1.FirmamentExtension
import moe.nea.firmament.api.v1.FirmamentItemWidget
import moe.nea.firmament.features.items.recipes.ItemList
import moe.nea.firmament.repo.ExpensiveItemCacheApi
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.intoOptional

object FirmamentAPIImpl : FirmamentAPI() {
	@JvmField
	val INSTANCE: FirmamentAPI = FirmamentAPIImpl

	private val _extensions = mutableListOf<FirmamentExtension>()
	override fun getExtensions(): List<FirmamentExtension> {
		return Collections.unmodifiableList(_extensions)
	}

	@OptIn(ExpensiveItemCacheApi::class)
	override fun getHoveredItemWidget(): Optional<FirmamentItemWidget> {
		val mouse = MC.instance.mouseHandler
		val window = MC.window
		val xpos = mouse.getScaledXPos(window)
		val ypos = mouse.getScaledYPos(window)
		val widget = MC.screen
			?.getChildAt(xpos, ypos)
			?.getOrNull()
		if (widget is FirmamentItemWidget) return widget.intoOptional()
		val itemListStack = ItemList.findStackUnder(xpos.toInt(), ypos.toInt())
		if (itemListStack != null)
			return object : FirmamentItemWidget {
				override fun getPlacement(): FirmamentItemWidget.Placement {
					return FirmamentItemWidget.Placement.ITEM_LIST
				}

				override fun getItemStack(): ItemStack {
					return itemListStack.second.asImmutableItemStack()
				}

				override fun getSkyBlockId(): String {
					return itemListStack.second.skyblockId.neuItem
				}

			}.intoOptional()
		return Optional.empty()
	}

	fun loadExtensions() {
		for (container in FabricLoader.getInstance()
			.getEntrypointContainers("firmament:v1", FirmamentExtension::class.java)) {
			Firmament.logger.info("Loading extension ${container.entrypoint} from ${container.provider.metadata.name}")
			loadExtension(container.entrypoint)
		}
		extensions.forEach { it.onLoad() }
	}

	fun loadExtension(entrypoint: FirmamentExtension) {
		_extensions.add(entrypoint)
	}
}