From 195ffaca5492eb4362e479894615725c326d1998 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Wed, 24 Jul 2024 16:16:02 +0200 Subject: Add support for /give syntax to /firm buttons --- .../features/inventory/buttons/InventoryButton.kt | 27 ++++++++++++++++++++-- .../firmament/gui/button_editor_fragment.xml | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/moe/nea/firmament/features/inventory/buttons/InventoryButton.kt b/src/main/kotlin/moe/nea/firmament/features/inventory/buttons/InventoryButton.kt index 51993af..ae9c7f2 100644 --- a/src/main/kotlin/moe/nea/firmament/features/inventory/buttons/InventoryButton.kt +++ b/src/main/kotlin/moe/nea/firmament/features/inventory/buttons/InventoryButton.kt @@ -7,17 +7,22 @@ package moe.nea.firmament.features.inventory.buttons +import com.mojang.brigadier.StringReader import me.shedaniel.math.Dimension import me.shedaniel.math.Point import me.shedaniel.math.Rectangle import kotlinx.serialization.Serializable import net.minecraft.client.gui.DrawContext +import net.minecraft.command.CommandRegistryAccess +import net.minecraft.command.argument.ItemStackArgumentType import net.minecraft.item.ItemStack +import net.minecraft.resource.featuretoggle.FeatureFlags import net.minecraft.util.Identifier import moe.nea.firmament.repo.ItemCache.asItemStack import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.MC import moe.nea.firmament.util.SkyblockId +import moe.nea.firmament.util.memoize @Serializable data class InventoryButton( @@ -29,9 +34,27 @@ data class InventoryButton( var command: String? = "", ) { companion object { + val itemStackParser by lazy { + ItemStackArgumentType.itemStack(CommandRegistryAccess.of(MC.defaultRegistries, + FeatureFlags.VANILLA_FEATURES)) + } val dimensions = Dimension(18, 18) - fun getItemForName(icon: String): ItemStack { - return RepoManager.getNEUItem(SkyblockId(icon)).asItemStack(idHint = SkyblockId(icon)) + val getItemForName = ::getItemForName0.memoize(1024) + fun getItemForName0(icon: String): ItemStack { + val repoItem = RepoManager.getNEUItem(SkyblockId(icon)) + var itemStack = repoItem.asItemStack(idHint = SkyblockId(icon)) + if (repoItem == null) { + val giveSyntaxItem = if (icon.startsWith("/give") || icon.startsWith("give")) + icon.split(" ", limit = 3).getOrNull(2) ?: icon + else icon + val componentItem = + runCatching { + itemStackParser.parse(StringReader(giveSyntaxItem)).createStack(1, false) + }.getOrNull() + if (componentItem != null) + itemStack = componentItem + } + return itemStack } } diff --git a/src/main/resources/assets/firmament/gui/button_editor_fragment.xml b/src/main/resources/assets/firmament/gui/button_editor_fragment.xml index 1cf3df2..067b986 100644 --- a/src/main/resources/assets/firmament/gui/button_editor_fragment.xml +++ b/src/main/resources/assets/firmament/gui/button_editor_fragment.xml @@ -13,7 +13,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - + -- cgit