package moe.nea.firmament.features.debug.itemeditor import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import kotlin.io.path.createParentDirectories import kotlin.io.path.exists import kotlin.io.path.readText import kotlin.io.path.relativeTo import kotlin.io.path.writeText import net.minecraft.item.ItemStack import net.minecraft.item.Items import net.minecraft.text.Text import moe.nea.firmament.Firmament import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HandledScreenKeyPressedEvent import moe.nea.firmament.features.debug.ExportedTestConstantMeta import moe.nea.firmament.features.debug.PowerUserTools import moe.nea.firmament.repo.RepoDownloadManager import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.MC import moe.nea.firmament.util.SkyblockId import moe.nea.firmament.util.focusedItemStack import moe.nea.firmament.util.mc.SNbtFormatter.Companion.toPrettyString import moe.nea.firmament.util.mc.displayNameAccordingToNbt import moe.nea.firmament.util.mc.loreAccordingToNbt import moe.nea.firmament.util.setSkyBlockId import moe.nea.firmament.util.skyBlockId import moe.nea.firmament.util.tr object ItemExporter { fun exportItem(itemStack: ItemStack): Text { val exporter = LegacyItemExporter.createExporter(itemStack) val json = exporter.exportJson() val jsonFormatted = Firmament.twoSpaceJson.encodeToString(json) val fileName = json.jsonObject["internalname"]!!.jsonPrimitive.content val itemFile = RepoDownloadManager.repoSavedLocation.resolve("items").resolve("${fileName}.json") itemFile.createParentDirectories() itemFile.writeText(jsonFormatted) val overlayFile = RepoDownloadManager.repoSavedLocation.resolve("itemsOverlay") .resolve(ExportedTestConstantMeta.current.dataVersion.toString()) .resolve("${fileName}.snbt") overlayFile.createParentDirectories() overlayFile.writeText(exporter.exportModernSnbt().toPrettyString()) return tr( "firmament.repoexport.success", "Exported item to ${itemFile.relativeTo(RepoDownloadManager.repoSavedLocation)}${ exporter.warnings.joinToString( "" ) { "\nWarning: $it" } }" ) } fun pathFor(skyBlockId: SkyblockId) = RepoManager.neuRepo.baseFolder.resolve("items/${skyBlockId.neuItem}.json") fun isExported(skyblockId: SkyblockId) = pathFor(skyblockId).exists() fun ensureExported(itemStack: ItemStack) { if (!isExported(itemStack.skyBlockId ?: return)) exportItem(itemStack) } fun appendRecipe(skyblockId: SkyblockId, recipe: JsonObject) { val oldJson = Firmament.json.decodeFromString(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))) } @Subscribe fun onKeyBind(event: HandledScreenKeyPressedEvent) { if (event.matches(PowerUserTools.TConfig.exportItemStackToRepo)) { val itemStack = event.screen.focusedItemStack ?: return PowerUserTools.lastCopiedStack = (itemStack to exportItem(itemStack)) } } fun exportStub(skyblockId: SkyblockId, title: String) { exportItem(ItemStack(Items.PLAYER_HEAD).also { it.displayNameAccordingToNbt = Text.literal(title) it.loreAccordingToNbt = listOf(Text.literal("")) it.setSkyBlockId(skyblockId) }) MC.sendChat(tr("firmament.repo.export.stub", "Exported a stub item for $skyblockId")) } }