Support copying nerd stats from item list

This commit is contained in:
Linnea Gräf
2023-12-29 20:26:22 +01:00
parent bd0712adb0
commit 9c7ea1ff0a
4 changed files with 40 additions and 35 deletions

View File

@@ -6,7 +6,7 @@
package moe.nea.firmament.mixins.accessor; package moe.nea.firmament.mixins.accessor;
import me.shedaniel.math.Rectangle; import kotlin.Deprecated;
import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.Slot;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

View File

@@ -8,25 +8,17 @@ package moe.nea.firmament.features.debug
import java.nio.file.Path import java.nio.file.Path
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
import org.lwjgl.glfw.GLFW
import kotlin.io.path.absolute import kotlin.io.path.absolute
import kotlin.io.path.exists import kotlin.io.path.exists
import net.minecraft.client.MinecraftClient import net.minecraft.client.MinecraftClient
import net.minecraft.text.ClickEvent
import net.minecraft.text.HoverEvent
import net.minecraft.text.Style
import net.minecraft.text.Text import net.minecraft.text.Text
import net.minecraft.util.Formatting
import moe.nea.firmament.Firmament import moe.nea.firmament.Firmament
import moe.nea.firmament.events.HandledScreenKeyPressedEvent
import moe.nea.firmament.features.FirmamentFeature import moe.nea.firmament.features.FirmamentFeature
import moe.nea.firmament.gui.config.ManagedConfig import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.keybindings.IKeyBinding
import moe.nea.firmament.mixins.accessor.AccessorHandledScreen
import moe.nea.firmament.util.MC import moe.nea.firmament.util.MC
import moe.nea.firmament.util.TimeMark import moe.nea.firmament.util.TimeMark
import moe.nea.firmament.util.errorBoundary
import moe.nea.firmament.util.iterate import moe.nea.firmament.util.iterate
import moe.nea.firmament.util.skyBlockId
object DeveloperFeatures : FirmamentFeature { object DeveloperFeatures : FirmamentFeature {
override val identifier: String override val identifier: String
@@ -66,29 +58,6 @@ object DeveloperFeatures : FirmamentFeature {
override fun onLoad() { override fun onLoad() {
HandledScreenKeyPressedEvent.subscribe {
if (it.matches(IKeyBinding.ofKeyCode(GLFW.GLFW_KEY_K))) {
it.screen as AccessorHandledScreen
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(
Text.translatable(
"firmament.debug.skyblockid",
ident
).setStyle(
Style.EMPTY.withColor(Formatting.AQUA)
.withClickEvent(ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, ident))
.withHoverEvent(
HoverEvent(
HoverEvent.Action.SHOW_TEXT,
Text.translatable("firmament.debug.skyblockid.copy")
)
)
)
)
}
}
} }
} }

View File

@@ -24,6 +24,7 @@ import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.mixins.accessor.AccessorHandledScreen import moe.nea.firmament.mixins.accessor.AccessorHandledScreen
import moe.nea.firmament.util.ClipboardUtils import moe.nea.firmament.util.ClipboardUtils
import moe.nea.firmament.util.MC import moe.nea.firmament.util.MC
import moe.nea.firmament.util.focusedItemStack
import moe.nea.firmament.util.skyBlockId import moe.nea.firmament.util.skyBlockId
object PowerUserTools : FirmamentFeature { object PowerUserTools : FirmamentFeature {
@@ -56,7 +57,7 @@ object PowerUserTools : FirmamentFeature {
it.lines.add(Text.translatable("firmament.tooltip.skyblockid", id.neuItem)) it.lines.add(Text.translatable("firmament.tooltip.skyblockid", id.neuItem))
} }
val (item, text) = lastCopiedStack ?: return@subscribe val (item, text) = lastCopiedStack ?: return@subscribe
if (item != it.stack) { if (!ItemStack.areEqual(item, it.stack)) {
lastCopiedStack = null lastCopiedStack = null
return@subscribe return@subscribe
} }
@@ -96,7 +97,7 @@ object PowerUserTools : FirmamentFeature {
} }
HandledScreenKeyPressedEvent.subscribe { HandledScreenKeyPressedEvent.subscribe {
if (it.screen !is AccessorHandledScreen) return@subscribe if (it.screen !is AccessorHandledScreen) return@subscribe
val item = it.screen.focusedSlot_Firmament?.stack ?: return@subscribe val item = it.screen.focusedItemStack ?: return@subscribe
if (it.matches(TConfig.copyItemId)) { if (it.matches(TConfig.copyItemId)) {
val sbId = item.skyBlockId val sbId = item.skyBlockId
if (sbId == null) { if (sbId == null) {

View File

@@ -0,0 +1,35 @@
/*
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package moe.nea.firmament.util
import me.shedaniel.math.impl.PointHelper
import me.shedaniel.rei.api.client.REIRuntime
import me.shedaniel.rei.api.client.gui.widgets.Slot
import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry
import net.minecraft.client.gui.Element
import net.minecraft.client.gui.ParentElement
import net.minecraft.client.gui.screen.ingame.HandledScreen
import net.minecraft.item.ItemStack
import moe.nea.firmament.mixins.accessor.AccessorHandledScreen
val HandledScreen<*>.focusedItemStack: ItemStack?
get() {
this as AccessorHandledScreen
val vanillaSlot = this.focusedSlot_Firmament?.stack
if (vanillaSlot != null) return vanillaSlot
val focusedSlot = ScreenRegistry.getInstance().getFocusedStack(this, PointHelper.ofMouse())
if (focusedSlot != null) return focusedSlot.cheatsAs().value
var baseElement: Element? = REIRuntime.getInstance().overlay.orElse(null)
val mx = PointHelper.getMouseFloatingX()
val my = PointHelper.getMouseFloatingY()
while (true) {
if (baseElement is Slot) return baseElement.currentEntry.cheatsAs().value
if (baseElement !is ParentElement) return null
baseElement = baseElement.hoveredElement(mx, my).orElse(null)
}
}