diff options
| author | Linnea Gräf <nea@nea.moe> | 2025-06-22 22:45:16 +0200 |
|---|---|---|
| committer | Linnea Gräf <nea@nea.moe> | 2025-06-22 22:45:16 +0200 |
| commit | 1ab9094bde904b9671acf29c700e3c98d503c8fe (patch) | |
| tree | ea0c2dc731a46a65a30748be01720c096ab3f83d /src/main/kotlin/features/debug | |
| parent | fbc44e21393758ddf92397446d8e19f3f39a7317 (diff) | |
| download | Firmament-1ab9094bde904b9671acf29c700e3c98d503c8fe.tar.gz Firmament-1ab9094bde904b9671acf29c700e3c98d503c8fe.tar.bz2 Firmament-1ab9094bde904b9671acf29c700e3c98d503c8fe.zip | |
feat: Add npc location exporter
Diffstat (limited to 'src/main/kotlin/features/debug')
5 files changed, 79 insertions, 9 deletions
diff --git a/src/main/kotlin/features/debug/PowerUserTools.kt b/src/main/kotlin/features/debug/PowerUserTools.kt index 03be15e..7c1df3f 100644 --- a/src/main/kotlin/features/debug/PowerUserTools.kt +++ b/src/main/kotlin/features/debug/PowerUserTools.kt @@ -58,6 +58,7 @@ object PowerUserTools : FirmamentFeature { val copyTitle by keyBindingWithDefaultUnbound("copy-title") val exportItemStackToRepo by keyBindingWithDefaultUnbound("export-item-stack") val exportUIRecipes by keyBindingWithDefaultUnbound("export-recipe") + val exportNpcLocation by keyBindingWithDefaultUnbound("export-npc-location") } override val config diff --git a/src/main/kotlin/features/debug/itemeditor/ExportRecipe.kt b/src/main/kotlin/features/debug/itemeditor/ExportRecipe.kt index 9306c84..588aba1 100644 --- a/src/main/kotlin/features/debug/itemeditor/ExportRecipe.kt +++ b/src/main/kotlin/features/debug/itemeditor/ExportRecipe.kt @@ -1,19 +1,27 @@ package moe.nea.firmament.features.debug.itemeditor +import kotlinx.coroutines.launch import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive +import net.minecraft.client.network.ClientPlayerEntity +import net.minecraft.entity.decoration.ArmorStandEntity +import moe.nea.firmament.Firmament import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HandledScreenKeyPressedEvent +import moe.nea.firmament.events.WorldKeyboardEvent import moe.nea.firmament.features.debug.PowerUserTools import moe.nea.firmament.repo.ItemNameLookup import moe.nea.firmament.util.MC +import moe.nea.firmament.util.SBData import moe.nea.firmament.util.SHORT_NUMBER_FORMAT import moe.nea.firmament.util.SkyblockId +import moe.nea.firmament.util.async.waitForTextInput import moe.nea.firmament.util.ifDropLast import moe.nea.firmament.util.mc.ScreenUtil.getSlotByIndex import moe.nea.firmament.util.mc.displayNameAccordingToNbt import moe.nea.firmament.util.mc.loreAccordingToNbt +import moe.nea.firmament.util.mc.setSkullOwner import moe.nea.firmament.util.parseShortNumber import moe.nea.firmament.util.red import moe.nea.firmament.util.removeColorCodes @@ -32,11 +40,47 @@ object ExportRecipe { val x = it % 3 val y = it / 3 - (xNames[x].toString() + yNames[y]) to x + y * 9 + 10 + (yNames[y].toString() + xNames[x].toString()) to x + y * 9 + 10 } val resultSlot = 25 @Subscribe + fun exportNpcLocation(event: WorldKeyboardEvent) { + if (!event.matches(PowerUserTools.TConfig.exportNpcLocation)) { + return + } + val entity = MC.instance.targetedEntity + if (entity == null) { + MC.sendChat(tr("firmament.repo.export.npc.noentity", "Could not find entity to export")) + return + } + Firmament.coroutineScope.launch { + val guessName = entity.world.getEntitiesByClass( + ArmorStandEntity::class.java, + entity.boundingBox.expand(0.1), + { !it.name.string.contains("CLICK") }) + .firstOrNull()?.customName?.string + ?: "" + val reply = waitForTextInput("$guessName (NPC)", "Export stub") + val id = generateName(reply) + ItemExporter.exportStub(id, reply) { + val playerEntity = entity as? ClientPlayerEntity + val textureUrl = playerEntity?.skinTextures?.textureUrl + if (textureUrl != null) + it.setSkullOwner(playerEntity.uuid, textureUrl) + } + ItemExporter.modifyJson(id) { + val mutJson = it.toMutableMap() + mutJson["island"] = JsonPrimitive(SBData.skyblockLocation?.locrawMode ?: "unknown") + mutJson["x"] = JsonPrimitive(entity.blockX) + mutJson["y"] = JsonPrimitive(entity.blockY) + mutJson["z"] = JsonPrimitive(entity.blockZ) + JsonObject(mutJson) + } + } + } + + @Subscribe fun onRecipeKeyBind(event: HandledScreenKeyPressedEvent) { if (!event.matches(PowerUserTools.TConfig.exportUIRecipes)) { return @@ -138,7 +182,7 @@ object ExportRecipe { } fun generateName(name: String): SkyblockId { - return SkyblockId(name.uppercase().replace(" ", "_")) + return SkyblockId(name.uppercase().replace(" ", "_").replace("(", "").replace(")", "")) } fun findStackableItemByName(name: String, fallbackToGenerated: Boolean = false): Pair<SkyblockId, Double>? { diff --git a/src/main/kotlin/features/debug/itemeditor/ItemExporter.kt b/src/main/kotlin/features/debug/itemeditor/ItemExporter.kt index fd411c9..d497ad2 100644 --- a/src/main/kotlin/features/debug/itemeditor/ItemExporter.kt +++ b/src/main/kotlin/features/debug/itemeditor/ItemExporter.kt @@ -65,13 +65,20 @@ object ItemExporter { exportItem(itemStack) } - fun appendRecipe(skyblockId: SkyblockId, recipe: JsonObject) { + fun modifyJson(skyblockId: SkyblockId, modify: (JsonObject) -> JsonObject) { val oldJson = Firmament.json.decodeFromString<JsonObject>(pathFor(skyblockId).readText()) - val mutableJson = oldJson.toMutableMap() - val recipes = ((mutableJson["recipes"] as JsonArray?) ?: listOf()).toMutableList() - recipes.add(recipe) - mutableJson["recipes"] = JsonArray(recipes) - pathFor(skyblockId).writeText(Firmament.twoSpaceJson.encodeToString(JsonObject(mutableJson))) + val newJson = modify(oldJson) + pathFor(skyblockId).writeText(Firmament.twoSpaceJson.encodeToString(JsonObject(newJson))) + } + + fun appendRecipe(skyblockId: SkyblockId, recipe: JsonObject) { + modifyJson(skyblockId) { oldJson -> + val mutableJson = oldJson.toMutableMap() + val recipes = ((mutableJson["recipes"] as JsonArray?) ?: listOf()).toMutableList() + recipes.add(recipe) + mutableJson["recipes"] = JsonArray(recipes) + JsonObject(mutableJson) + } } @Subscribe @@ -82,7 +89,7 @@ object ItemExporter { } } - fun exportStub(skyblockId: SkyblockId, title: String) { + fun exportStub(skyblockId: SkyblockId, title: String, extra: (ItemStack) -> Unit = {}) { exportItem(ItemStack(Items.PLAYER_HEAD).also { it.displayNameAccordingToNbt = Text.literal(title) it.loreAccordingToNbt = listOf(Text.literal("")) diff --git a/src/main/kotlin/features/debug/itemeditor/LegacyItemExporter.kt b/src/main/kotlin/features/debug/itemeditor/LegacyItemExporter.kt index fbb778a..7f7bfbd 100644 --- a/src/main/kotlin/features/debug/itemeditor/LegacyItemExporter.kt +++ b/src/main/kotlin/features/debug/itemeditor/LegacyItemExporter.kt @@ -35,6 +35,9 @@ import moe.nea.firmament.util.transformEachRecursively import moe.nea.firmament.util.unformattedString class LegacyItemExporter private constructor(var itemStack: ItemStack) { + init { + require(!itemStack.isEmpty) + } var lore = itemStack.loreAccordingToNbt var name = itemStack.displayNameAccordingToNbt val extraAttribs = itemStack.extraAttributes.copy() diff --git a/src/main/kotlin/features/debug/itemeditor/PromptScreen.kt b/src/main/kotlin/features/debug/itemeditor/PromptScreen.kt new file mode 100644 index 0000000..187b70b --- /dev/null +++ b/src/main/kotlin/features/debug/itemeditor/PromptScreen.kt @@ -0,0 +1,15 @@ +package moe.nea.firmament.features.debug.itemeditor + +import io.github.notenoughupdates.moulconfig.gui.CloseEventListener +import io.github.notenoughupdates.moulconfig.gui.GuiComponentWrapper +import io.github.notenoughupdates.moulconfig.gui.GuiContext +import io.github.notenoughupdates.moulconfig.gui.component.CenterComponent +import io.github.notenoughupdates.moulconfig.gui.component.ColumnComponent +import io.github.notenoughupdates.moulconfig.gui.component.PanelComponent +import io.github.notenoughupdates.moulconfig.gui.component.TextComponent +import io.github.notenoughupdates.moulconfig.gui.component.TextFieldComponent +import io.github.notenoughupdates.moulconfig.observer.GetSetter +import kotlin.reflect.KMutableProperty0 +import moe.nea.firmament.gui.FirmButtonComponent +import moe.nea.firmament.util.MoulConfigUtils + |
