From 195ffaca5492eb4362e479894615725c326d1998 Mon Sep 17 00:00:00 2001
From: Linnea Gräf <nea@nea.moe>
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(-)

(limited to 'src')

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
                 <ItemStack value="@getItemIcon"/>
                 <Text text="Icon"/>
             </Row>
-            <Hover lines="Put your display item in here.;Can be any SkyBlock item id.">
+            <Hover lines="Put your display item in here.;Can be any SkyBlock item id.;;Alternatively you can paste in a /give command">
                 <TextField value="@icon" width="180"/>
             </Hover>
             <Text text="Command"/>
-- 
cgit