From 255e4f5899642e099e7ec7b1a7fe1e0c32ebbc20 Mon Sep 17 00:00:00 2001 From: nea Date: Sat, 9 Sep 2023 03:37:29 +0200 Subject: Add tools for copying id, texture id and nbt data --- .../mixins/accessor/AccessorHandledScreen.java | 2 +- .../moe/nea/firmament/features/FeatureManager.kt | 2 + .../firmament/features/debug/DeveloperFeatures.kt | 2 +- .../nea/firmament/features/debug/PowerUserTools.kt | 94 +++++++++ .../firmament/features/inventory/SlotLocking.kt | 2 +- .../rei/SkyblockItemIdFocusedStackProvider.kt | 2 +- .../moe/nea/firmament/util/ClipboardUtils.kt | 28 +++ src/main/kotlin/moe/nea/firmament/util/MC.kt | 1 + .../resources/assets/firmament/lang/en_us.json | 231 +++++++++++---------- 9 files changed, 250 insertions(+), 114 deletions(-) create mode 100644 src/main/kotlin/moe/nea/firmament/features/debug/PowerUserTools.kt create mode 100644 src/main/kotlin/moe/nea/firmament/util/ClipboardUtils.kt (limited to 'src') diff --git a/src/main/java/moe/nea/firmament/mixins/accessor/AccessorHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/accessor/AccessorHandledScreen.java index b3c9787..c42f819 100644 --- a/src/main/java/moe/nea/firmament/mixins/accessor/AccessorHandledScreen.java +++ b/src/main/java/moe/nea/firmament/mixins/accessor/AccessorHandledScreen.java @@ -16,5 +16,5 @@ import org.spongepowered.asm.mixin.gen.Accessor; public interface AccessorHandledScreen { @Accessor("focusedSlot") @Nullable - Slot getFocusedSlot_NEU(); + Slot getFocusedSlot_Firmament(); } diff --git a/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt b/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt index 781237e..ba665e4 100644 --- a/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt +++ b/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt @@ -13,6 +13,7 @@ import moe.nea.firmament.features.chat.ChatLinks import moe.nea.firmament.features.debug.DebugView import moe.nea.firmament.features.debug.DeveloperFeatures import moe.nea.firmament.features.debug.MinorTrolling +import moe.nea.firmament.features.debug.PowerUserTools import moe.nea.firmament.features.fixes.Fixes import moe.nea.firmament.features.inventory.CraftingOverlay import moe.nea.firmament.features.inventory.PriceData @@ -48,6 +49,7 @@ object FeatureManager : DataHolder(serializer(), "feature loadFeature(SlotLocking) loadFeature(StorageOverlay) loadFeature(CraftingOverlay) + loadFeature(PowerUserTools) loadFeature(ChatLinks) loadFeature(SaveCursorPosition) loadFeature(CustomSkyBlockTextures) diff --git a/src/main/kotlin/moe/nea/firmament/features/debug/DeveloperFeatures.kt b/src/main/kotlin/moe/nea/firmament/features/debug/DeveloperFeatures.kt index 20d1358..e045fa8 100644 --- a/src/main/kotlin/moe/nea/firmament/features/debug/DeveloperFeatures.kt +++ b/src/main/kotlin/moe/nea/firmament/features/debug/DeveloperFeatures.kt @@ -68,7 +68,7 @@ object DeveloperFeatures : FirmamentFeature { HandledScreenKeyPressedEvent.subscribe { if (it.matches(IKeyBinding.ofKeyCode(GLFW.GLFW_KEY_K))) { it.screen as AccessorHandledScreen - val focussedSlot = it.screen.focusedSlot_NEU ?: return@subscribe + val focussedSlot = it.screen.focusedSlot_Firmament ?: return@subscribe val item = focussedSlot.stack ?: return@subscribe val ident = item.skyBlockId?.identifier.toString() MinecraftClient.getInstance().inGameHud.chatHud.addMessage( diff --git a/src/main/kotlin/moe/nea/firmament/features/debug/PowerUserTools.kt b/src/main/kotlin/moe/nea/firmament/features/debug/PowerUserTools.kt new file mode 100644 index 0000000..398042d --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/features/debug/PowerUserTools.kt @@ -0,0 +1,94 @@ +/* + * SPDX-FileCopyrightText: 2023 Linnea Gräf + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package moe.nea.firmament.features.debug + +import net.minecraft.item.ItemStack +import net.minecraft.text.Text +import moe.nea.firmament.events.CustomItemModelEvent +import moe.nea.firmament.events.HandledScreenKeyPressedEvent +import moe.nea.firmament.events.ItemTooltipEvent +import moe.nea.firmament.events.ScreenOpenEvent +import moe.nea.firmament.events.TickEvent +import moe.nea.firmament.features.FirmamentFeature +import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.mixins.accessor.AccessorHandledScreen +import moe.nea.firmament.util.ClipboardUtils +import moe.nea.firmament.util.skyBlockId + +object PowerUserTools : FirmamentFeature { + override val identifier: String + get() = "power-user" + + object TConfig : ManagedConfig(identifier) { + val showItemIds by toggle("show-item-id") { false } + val copyItemId by keyBindingWithDefaultUnbound("copy-item-id") + val copyTexturePackId by keyBindingWithDefaultUnbound("copy-texture-pack-id") + val copyNbtData by keyBindingWithDefaultUnbound("copy-nbt-data") + } + + override val config + get() = TConfig + + var lastCopiedStack: Pair? = null + set(value) { + field = value + if (value != null) + lastCopiedStackViewTime = true + } + var lastCopiedStackViewTime = false + + override fun onLoad() { + ItemTooltipEvent.subscribe { + if (TConfig.showItemIds) { + val id = it.stack.skyBlockId ?: return@subscribe + it.lines.add(Text.translatable("firmament.tooltip.skyblockid", id.neuItem)) + } + val (item, text) = lastCopiedStack ?: return@subscribe + if (item != it.stack) { + lastCopiedStack = null + return@subscribe + } + lastCopiedStackViewTime = true + it.lines.add(text) + } + TickEvent.subscribe { + if (!lastCopiedStackViewTime) + lastCopiedStack = null + lastCopiedStackViewTime = false + } + ScreenOpenEvent.subscribe { + lastCopiedStack = null + } + HandledScreenKeyPressedEvent.subscribe { + if (it.screen !is AccessorHandledScreen) return@subscribe + val item = it.screen.focusedSlot_Firmament?.stack ?: return@subscribe + if (it.matches(TConfig.copyItemId)) { + val sbId = item.skyBlockId + if (sbId == null) { + lastCopiedStack = Pair(item, Text.translatable("firmament.tooltip.copied.skyblockid.fail")) + return@subscribe + } + ClipboardUtils.setTextContent(sbId.neuItem) + lastCopiedStack = Pair(item, Text.translatable("firmament.tooltip.copied.skyblockid", sbId.neuItem)) + } else if (it.matches(TConfig.copyTexturePackId)) { + val model = CustomItemModelEvent.getModelIdentifier(item) + if (model == null) { + lastCopiedStack = Pair(item, Text.translatable("firmament.tooltip.copied.modelid.fail")) + return@subscribe + } + ClipboardUtils.setTextContent(model.toString()) + lastCopiedStack = Pair(item, Text.translatable("firmament.tooltip.copied.modelid", model.toString())) + } else if (it.matches(TConfig.copyNbtData)) { + val nbt = item.orCreateNbt.toString() + ClipboardUtils.setTextContent(nbt) + lastCopiedStack = Pair(item, Text.translatable("firmament.tooltip.copied.nbt")) + } + } + } + + +} diff --git a/src/main/kotlin/moe/nea/firmament/features/inventory/SlotLocking.kt b/src/main/kotlin/moe/nea/firmament/features/inventory/SlotLocking.kt index ec86341..5de8951 100644 --- a/src/main/kotlin/moe/nea/firmament/features/inventory/SlotLocking.kt +++ b/src/main/kotlin/moe/nea/firmament/features/inventory/SlotLocking.kt @@ -45,7 +45,7 @@ object SlotLocking : FirmamentFeature { val inventory = MC.handledScreen ?: return@subscribe inventory as AccessorHandledScreen - val slot = inventory.focusedSlot_NEU ?: return@subscribe + val slot = inventory.focusedSlot_Firmament ?: return@subscribe val lockedSlots = lockedSlots ?: return@subscribe if (slot.inventory is PlayerInventory) { if (slot.index in lockedSlots) { diff --git a/src/main/kotlin/moe/nea/firmament/rei/SkyblockItemIdFocusedStackProvider.kt b/src/main/kotlin/moe/nea/firmament/rei/SkyblockItemIdFocusedStackProvider.kt index a26ec53..c5bca1b 100644 --- a/src/main/kotlin/moe/nea/firmament/rei/SkyblockItemIdFocusedStackProvider.kt +++ b/src/main/kotlin/moe/nea/firmament/rei/SkyblockItemIdFocusedStackProvider.kt @@ -19,7 +19,7 @@ object SkyblockItemIdFocusedStackProvider : FocusedStackProvider { override fun provide(screen: Screen?, mouse: Point?): CompoundEventResult> { if (screen !is HandledScreen<*>) return CompoundEventResult.pass() screen as AccessorHandledScreen - val focusedSlot = screen.focusedSlot_NEU ?: return CompoundEventResult.pass() + val focusedSlot = screen.focusedSlot_Firmament ?: return CompoundEventResult.pass() val item = focusedSlot.stack ?: return CompoundEventResult.pass() val skyblockId = item.skyBlockId ?: return CompoundEventResult.pass() return CompoundEventResult.interruptTrue(SBItemEntryDefinition.getEntry(skyblockId)) diff --git a/src/main/kotlin/moe/nea/firmament/util/ClipboardUtils.kt b/src/main/kotlin/moe/nea/firmament/util/ClipboardUtils.kt new file mode 100644 index 0000000..d761a5a --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/util/ClipboardUtils.kt @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2023 Linnea Gräf + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package moe.nea.firmament.util + +import moe.nea.firmament.Firmament + +object ClipboardUtils { + fun setTextContent(string: String) { + try { + MC.keyboard.clipboard = string.ifEmpty { " " } + } catch (e: Exception) { + Firmament.logger.error("Could not write clipboard", e) + } + } + + fun getTextContents(): String { + try { + return MC.keyboard.clipboard ?: "" + } catch (e: Exception) { + Firmament.logger.error("Could not read clipboard", e) + return "" + } + } +} diff --git a/src/main/kotlin/moe/nea/firmament/util/MC.kt b/src/main/kotlin/moe/nea/firmament/util/MC.kt index 602d85a..78f2eec 100644 --- a/src/main/kotlin/moe/nea/firmament/util/MC.kt +++ b/src/main/kotlin/moe/nea/firmament/util/MC.kt @@ -16,6 +16,7 @@ object MC { player?.networkHandler?.sendCommand(command) } + inline val keyboard get() = MinecraftClient.getInstance().keyboard inline val textureManager get() = MinecraftClient.getInstance().textureManager inline val inGameHud get() = MinecraftClient.getInstance().inGameHud inline val font get() = MinecraftClient.getInstance().textRenderer diff --git a/src/main/resources/assets/firmament/lang/en_us.json b/src/main/resources/assets/firmament/lang/en_us.json index 7640c04..72d9830 100644 --- a/src/main/resources/assets/firmament/lang/en_us.json +++ b/src/main/resources/assets/firmament/lang/en_us.json @@ -1,112 +1,123 @@ { - "firmament.dev.resourcerebuild.start": "Invoking gradle resource rebuild (./gradlew :processResources)", - "firmament.dev.resourcerebuild.done": "Gradle resource rebuild done in %s", - "firmament.command.toggle.no-config-found": "Could not find config %s", - "firmament.command.toggle.no-property-found": "Could not find property %s", - "firmament.command.toggle.not-a-toggle": "Property %s is not a toggle", - "firmament.command.toggle.toggled": "Toggled %s / %s %s", - "firmament.toggle.true": "On", - "firmament.toggle.false": "Off", - "firmament.config.developer": "Developer Settings", - "firmament.config.developer.auto-rebuild": "Automatically rebuild resources", - "firmament.price": "Checking price for %s", - "firmament.price.bazaar": "Bazaar stats:", - "firmament.price.bazaar.productid": "Stock id: %s", - "firmament.price.bazaar.buy.price": "Buy Price: %s", - "firmament.price.bazaar.buy.order": "Buy orders: %d", - "firmament.tooltip.bazaar.sell-order": "Bazaar Sell Order: %s", - "firmament.tooltip.bazaar.buy-order": "Bazaar Buy Order: %s", - "firmament.tooltip.ah.lowestbin": "Lowest BIN: %d", - "firmament.pv.pets": "Pets", - "firmament.debug.skyblockid": "SkyBlock ID: %s", - "firmament.debug.skyblockid.copy": "Click to copy SkyBlock ID", - "firmament.price.bazaar.sell.price": "Sell Price: %s", - "firmament.price.bazaar.sell.order": "Sell orders: %d", - "firmament.price.lowestbin": "Lowest BIN: %s", - "firmament.repo.reload.network": "Trying to redownload the repository", - "firmament.repo.reload.disk": "Reloading repository from disk. This may lag a bit.", - "firmament.repo.cache": "Recaching items", - "firmament.repo.brokenitem": "Failed to render item: %s", - "firmanent.config.edit": "Edit", - "firmament.config.repo": "Firmament Repo Settings", - "firmament.config.repo.autoUpdate": "Auto Update", - "firmament.config.repo.username": "Repo Username", - "firmament.config.repo.username.hint": "NotEnoughUpdates", - "firmament.config.repo.reponame": "Repo Name", - "firmament.config.repo.reponame.hint": "NotEnoughUpdates-REPO", - "firmament.config.repo.branch": "Repo Branch", - "firmament.config.repo.branch.hint": "dangerous", - "firmament.config.repo.reset": "Reset", - "firmament.config.repo.disable-item-groups": "Disable Item Groups", - "firmament.config.repo.reload": "Reload Item List", - "firmament.config.repo.redownload": "Redownload Item List", - "firmament.ursa.debugrequest.start": "Ursa request launched", - "firmament.ursa.debugrequest.result": "Ursa request succeeded: %s", - "firmament.sbinfo.nolocraw": "No locraw data available", - "firmament.sbinfo.profile": "Current profile cutename: %s", - "firmament.sbinfo.server": "Locraw Server: %s", - "firmament.sbinfo.gametype": "Locraw Gametype: %s", - "firmament.sbinfo.mode": "Locraw Mode: %s", - "firmament.sbinfo.map": "Locraw Map: %s", - "firmament.config.price-data": "Price data", - "firmament.config.price-data.enable-always": "Enable Item Price", - "firmament.config.price-data.enable-keybind": "Enable only with Keybinding", - "firmament.config.fairy-souls": "Fairy Souls", - "firmament.config.fairy-souls.show": "Show Fairy Soul Waypoints", - "firmament.config.fairy-souls.reset": "Reset Collected Fairy Souls", - "firmament.config.fishing-warning": "Fishing Warning", - "firmament.config.fishing-warning.display-warning": "Display a warning when you are about to hook a fish", - "firmament.config.fishing-warning.highlight-wake-chain": "Highlight fishing particles", - "firmament.key.slotlocking": "Lock Slot / Slot Binding", - "firmament.key.category": "Firmament", - "firmament.protectitem": "Firmament protected your item: ", - "firmament.recipe.forge.time": "Forging Time: %s", - "firmament.pv.skills": "Skills", - "firmament.pv.skills.farming": "Farming", - "firmament.pv.skills.foraging": "Foraging", - "firmament.pv.skills.mining": "Mining", - "firmament.pv.skills.alchemy": "Alchemy", - "firmament.pv.skills.taming": "Taming", - "firmament.pv.skills.fishing": "Fishing", - "firmament.pv.skills.runecrafting": "Runecrafting", - "firmament.pv.skills.carpentry": "Carpentry", - "firmament.pv.skills.combat": "Combat", - "firmament.pv.skills.social": "Social", - "firmament.pv.skills.rift": "Rift", - "firmament.pv.skills.enchanting": "Enchanting", - "firmament.pv.skills.total": "Total Exp: %s", - "firmament.pv.lookingup": "Looking up %s", - "firmament.pv.noprofile": "%s has no SkyBlock profiles", - "firmament.pv.noplayer": "%s is not a Minecraft player", - "firmament.config.save-cursor-position.enable": "Enable", - "firmament.config.save-cursor-position.tolerance": "Tolerance", - "firmament.config.save-cursor-position": "Save Cursor Position", - "firmament.config.storage-overlay": "Storage Overlay", - "firmament.config.storage-overlay.rows": "Rows", - "firmament.config.storage-overlay.padding": "Padding", - "firmament.config.storage-overlay.scroll-speed": "Scroll Speed", - "firmament.config.storage-overlay.inverse-scroll": "Invert Scroll", - "firmament.config.storage-overlay.margin": "Margin", - "firmament.config.chat-links": "Chat Links", - "firmament.config.chat-links.links-enabled": "Enable Clickable Links", - "firmament.config.chat-links.image-enabled": "Enable Image Preview", - "firmament.config.chat-links.allow-all-hosts": "Allow all Image Hosts", - "firmament.config.chat-links.allowed-hosts": "Allowed Image Hosts", - "firmament.config.chat-links.position": "Chat Image Preview", - "firmament.hud.edit": "Edit %s", - "firmament.keybinding.external": "External", - "firmament.config.slot-locking": "Slot Locking", - "firmament.config.slot-locking.lock": "Lock Slot", - "firmament.config.fixes.auto-sprint": "Auto Sprint", - "firmament.config.fixes.auto-sprint-keybinding": "Auto Sprint KeyBinding", - "firmament.config.fixes.auto-sprint-hud": "Sprint State Hud", - "firmament.config.fixes.peek-chat": "Peek Chat", - "firmament.fixes.auto-sprint.on": "Sprint toggled", - "firmament.fixes.auto-sprint.sprinting": "Sprinting", - "firmament.fixes.auto-sprint.not-sprinting": "Not Sprinting", - "firmament.config.custom-skyblock-textures": "Custom SkyBlock Item Textures", - "firmament.config.custom-skyblock-textures.cache-duration": "Model Cache Duration", - "firmament.config.custom-skyblock-textures.enabled": "Enable Custom Item Textures", - "firmament.config.fixes": "Fixes", - "firmament.config.fixes.player-skins": "Fix unsigned Player Skins" + "firmament.dev.resourcerebuild.start": "Invoking gradle resource rebuild (./gradlew :processResources)", + "firmament.dev.resourcerebuild.done": "Gradle resource rebuild done in %s", + "firmament.command.toggle.no-config-found": "Could not find config %s", + "firmament.command.toggle.no-property-found": "Could not find property %s", + "firmament.command.toggle.not-a-toggle": "Property %s is not a toggle", + "firmament.command.toggle.toggled": "Toggled %s / %s %s", + "firmament.toggle.true": "On", + "firmament.toggle.false": "Off", + "firmament.config.developer": "Developer Settings", + "firmament.config.developer.auto-rebuild": "Automatically rebuild resources", + "firmament.price": "Checking price for %s", + "firmament.price.bazaar": "Bazaar stats:", + "firmament.price.bazaar.productid": "Stock id: %s", + "firmament.price.bazaar.buy.price": "Buy Price: %s", + "firmament.price.bazaar.buy.order": "Buy orders: %d", + "firmament.tooltip.bazaar.sell-order": "Bazaar Sell Order: %s", + "firmament.tooltip.bazaar.buy-order": "Bazaar Buy Order: %s", + "firmament.tooltip.ah.lowestbin": "Lowest BIN: %d", + "firmament.pv.pets": "Pets", + "firmament.debug.skyblockid": "SkyBlock ID: %s", + "firmament.debug.skyblockid.copy": "Click to copy SkyBlock ID", + "firmament.price.bazaar.sell.price": "Sell Price: %s", + "firmament.price.bazaar.sell.order": "Sell orders: %d", + "firmament.price.lowestbin": "Lowest BIN: %s", + "firmament.repo.reload.network": "Trying to redownload the repository", + "firmament.repo.reload.disk": "Reloading repository from disk. This may lag a bit.", + "firmament.repo.cache": "Recaching items", + "firmament.repo.brokenitem": "Failed to render item: %s", + "firmanent.config.edit": "Edit", + "firmament.config.repo": "Firmament Repo Settings", + "firmament.config.repo.autoUpdate": "Auto Update", + "firmament.config.repo.username": "Repo Username", + "firmament.config.repo.username.hint": "NotEnoughUpdates", + "firmament.config.repo.reponame": "Repo Name", + "firmament.config.repo.reponame.hint": "NotEnoughUpdates-REPO", + "firmament.config.repo.branch": "Repo Branch", + "firmament.config.repo.branch.hint": "dangerous", + "firmament.config.repo.reset": "Reset", + "firmament.config.repo.disable-item-groups": "Disable Item Groups", + "firmament.config.repo.reload": "Reload Item List", + "firmament.config.repo.redownload": "Redownload Item List", + "firmament.ursa.debugrequest.start": "Ursa request launched", + "firmament.ursa.debugrequest.result": "Ursa request succeeded: %s", + "firmament.sbinfo.nolocraw": "No locraw data available", + "firmament.sbinfo.profile": "Current profile cutename: %s", + "firmament.sbinfo.server": "Locraw Server: %s", + "firmament.sbinfo.gametype": "Locraw Gametype: %s", + "firmament.sbinfo.mode": "Locraw Mode: %s", + "firmament.sbinfo.map": "Locraw Map: %s", + "firmament.config.price-data": "Price data", + "firmament.config.price-data.enable-always": "Enable Item Price", + "firmament.config.price-data.enable-keybind": "Enable only with Keybinding", + "firmament.config.fairy-souls": "Fairy Souls", + "firmament.config.fairy-souls.show": "Show Fairy Soul Waypoints", + "firmament.config.fairy-souls.reset": "Reset Collected Fairy Souls", + "firmament.config.fishing-warning": "Fishing Warning", + "firmament.config.fishing-warning.display-warning": "Display a warning when you are about to hook a fish", + "firmament.config.fishing-warning.highlight-wake-chain": "Highlight fishing particles", + "firmament.key.slotlocking": "Lock Slot / Slot Binding", + "firmament.key.category": "Firmament", + "firmament.protectitem": "Firmament protected your item: ", + "firmament.recipe.forge.time": "Forging Time: %s", + "firmament.pv.skills": "Skills", + "firmament.pv.skills.farming": "Farming", + "firmament.pv.skills.foraging": "Foraging", + "firmament.pv.skills.mining": "Mining", + "firmament.pv.skills.alchemy": "Alchemy", + "firmament.pv.skills.taming": "Taming", + "firmament.pv.skills.fishing": "Fishing", + "firmament.pv.skills.runecrafting": "Runecrafting", + "firmament.pv.skills.carpentry": "Carpentry", + "firmament.pv.skills.combat": "Combat", + "firmament.pv.skills.social": "Social", + "firmament.pv.skills.rift": "Rift", + "firmament.pv.skills.enchanting": "Enchanting", + "firmament.pv.skills.total": "Total Exp: %s", + "firmament.pv.lookingup": "Looking up %s", + "firmament.pv.noprofile": "%s has no SkyBlock profiles", + "firmament.pv.noplayer": "%s is not a Minecraft player", + "firmament.config.save-cursor-position.enable": "Enable", + "firmament.config.save-cursor-position.tolerance": "Tolerance", + "firmament.config.save-cursor-position": "Save Cursor Position", + "firmament.config.storage-overlay": "Storage Overlay", + "firmament.config.storage-overlay.rows": "Rows", + "firmament.config.storage-overlay.padding": "Padding", + "firmament.config.storage-overlay.scroll-speed": "Scroll Speed", + "firmament.config.storage-overlay.inverse-scroll": "Invert Scroll", + "firmament.config.storage-overlay.margin": "Margin", + "firmament.config.chat-links": "Chat Links", + "firmament.config.chat-links.links-enabled": "Enable Clickable Links", + "firmament.config.chat-links.image-enabled": "Enable Image Preview", + "firmament.config.chat-links.allow-all-hosts": "Allow all Image Hosts", + "firmament.config.chat-links.allowed-hosts": "Allowed Image Hosts", + "firmament.config.chat-links.position": "Chat Image Preview", + "firmament.hud.edit": "Edit %s", + "firmament.keybinding.external": "External", + "firmament.config.slot-locking": "Slot Locking", + "firmament.config.slot-locking.lock": "Lock Slot", + "firmament.config.fixes.auto-sprint": "Auto Sprint", + "firmament.config.fixes.auto-sprint-keybinding": "Auto Sprint KeyBinding", + "firmament.config.fixes.auto-sprint-hud": "Sprint State Hud", + "firmament.config.fixes.peek-chat": "Peek Chat", + "firmament.fixes.auto-sprint.on": "Sprint toggled", + "firmament.fixes.auto-sprint.sprinting": "Sprinting", + "firmament.fixes.auto-sprint.not-sprinting": "Not Sprinting", + "firmament.config.custom-skyblock-textures": "Custom SkyBlock Item Textures", + "firmament.config.custom-skyblock-textures.cache-duration": "Model Cache Duration", + "firmament.config.custom-skyblock-textures.enabled": "Enable Custom Item Textures", + "firmament.config.fixes": "Fixes", + "firmament.config.fixes.player-skins": "Fix unsigned Player Skins", + "firmament.config.power-user.show-item-id": "Show SkyBlock Ids", + "firmament.config.power-user.copy-item-id": "Copy SkyBlock Id", + "firmament.config.power-user.copy-texture-pack-id": "Copy Texture Pack Id", + "firmament.config.power-user.copy-nbt-data": "Copy NBT data", + "firmament.config.power-user": "Power Users", + "firmament.tooltip.skyblockid": "SkyBlock Id: %s", + "firmament.tooltip.copied.skyblockid.fail": "Failed to copy SkyBlock Id", + "firmament.tooltip.copied.skyblockid": "Copied SkyBlock Id: %s", + "firmament.tooltip.copied.modelid.fail": "Failed to copy Texture Id", + "firmament.tooltip.copied.modelid": "Copied Texture Id: %s", + "firmament.tooltip.copied.nbt": "Copied NBT data" } -- cgit