Support copying nerd stats from item list
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
35
src/main/kotlin/moe/nea/firmament/util/HoveredItemStack.kt
Normal file
35
src/main/kotlin/moe/nea/firmament/util/HoveredItemStack.kt
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user