aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/features/debug/AnimatedClothingScanner.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/features/debug/AnimatedClothingScanner.kt')
-rw-r--r--src/main/kotlin/features/debug/AnimatedClothingScanner.kt94
1 files changed, 77 insertions, 17 deletions
diff --git a/src/main/kotlin/features/debug/AnimatedClothingScanner.kt b/src/main/kotlin/features/debug/AnimatedClothingScanner.kt
index 11b47a9..d0db252 100644
--- a/src/main/kotlin/features/debug/AnimatedClothingScanner.kt
+++ b/src/main/kotlin/features/debug/AnimatedClothingScanner.kt
@@ -1,49 +1,109 @@
package moe.nea.firmament.features.debug
+import net.minecraft.command.argument.RegistryKeyArgumentType
+import net.minecraft.component.ComponentType
import net.minecraft.component.DataComponentTypes
import net.minecraft.entity.Entity
+import net.minecraft.item.ItemStack
+import net.minecraft.nbt.NbtElement
+import net.minecraft.nbt.NbtOps
+import net.minecraft.registry.RegistryKeys
+import net.minecraft.util.Identifier
import moe.nea.firmament.annotations.Subscribe
+import moe.nea.firmament.commands.get
+import moe.nea.firmament.commands.thenArgument
import moe.nea.firmament.commands.thenExecute
import moe.nea.firmament.commands.thenLiteral
import moe.nea.firmament.events.CommandEvent
import moe.nea.firmament.events.EntityUpdateEvent
+import moe.nea.firmament.util.ClipboardUtils
import moe.nea.firmament.util.MC
+import moe.nea.firmament.util.mc.NbtPrism
import moe.nea.firmament.util.skyBlockId
import moe.nea.firmament.util.tr
object AnimatedClothingScanner {
- var observedEntity: Entity? = null
+ data class SubjectOfFashionTheft<T>(
+ val observedEntity: Entity,
+ val prism: NbtPrism,
+ val component: ComponentType<T>,
+ ) {
+ fun observe(itemStack: ItemStack): Collection<NbtElement> {
+ val x = itemStack.get(component) ?: return listOf()
+ val nbt = component.codecOrThrow.encodeStart(NbtOps.INSTANCE, x).orThrow
+ return prism.access(nbt)
+ }
+ }
+
+ var subject: SubjectOfFashionTheft<*>? = null
@OptIn(ExperimentalStdlibApi::class)
@Subscribe
fun onUpdate(event: EntityUpdateEvent) {
- if (event.entity != observedEntity) return
+ val s = subject ?: return
+ if (event.entity != s.observedEntity) return
if (event is EntityUpdateEvent.EquipmentUpdate) {
+ val lines = mutableListOf<String>()
event.newEquipment.forEach {
- val id = it.second.skyBlockId?.neuItem
- val colour = it.second.get(DataComponentTypes.DYED_COLOR)
- ?.rgb?.toHexString(HexFormat.UpperCase)
- ?.let { " #$it" } ?: ""
- MC.sendChat(tr("firmament.fitstealer.update",
- "[FIT CHECK][${MC.currentTick}] ${it.first.asString()} => ${id}${colour}"))
+ val formatted = (s.observe(it.second)).joinToString()
+ lines.add(formatted)
+ MC.sendChat(
+ tr(
+ "firmament.fitstealer.update",
+ "[FIT CHECK][${MC.currentTick}] ${it.first.asString()} => $formatted"
+ )
+ )
+ }
+ if (lines.isNotEmpty()) {
+ val contents = ClipboardUtils.getTextContents()
+ if (contents.startsWith(EXPORT_WATERMARK))
+ ClipboardUtils.setTextContent(
+ contents + "\n" + lines.joinToString("\n")
+ )
}
}
}
+ val EXPORT_WATERMARK = "[CLOTHES EXPORT]"
+
@Subscribe
fun onSubCommand(event: CommandEvent.SubCommand) {
event.subcommand("dev") {
thenLiteral("stealthisfit") {
- thenExecute {
- observedEntity =
- if (observedEntity == null) MC.instance.targetedEntity else null
-
- MC.sendChat(
- observedEntity?.let {
- tr("firmament.fitstealer.targeted", "Observing the equipment of ${it.name}.")
- } ?: tr("firmament.fitstealer.targetlost", "No longer logging equipment."),
- )
+ thenArgument(
+ "component",
+ RegistryKeyArgumentType.registryKey(RegistryKeys.DATA_COMPONENT_TYPE)
+ ) { component ->
+ thenArgument("path", NbtPrism.Argument) { path ->
+ thenExecute {
+ subject =
+ if (subject == null) run {
+ val entity = MC.instance.targetedEntity ?: return@run null
+ val clipboard = ClipboardUtils.getTextContents()
+ MC.instance.entit
+ if (!clipboard.startsWith(EXPORT_WATERMARK)) {
+ ClipboardUtils.setTextContent(EXPORT_WATERMARK)
+ } else {
+ ClipboardUtils.setTextContent("$clipboard\n\n[NEW SCANNER]")
+ }
+ SubjectOfFashionTheft(
+ entity,
+ get(path),
+ MC.unsafeGetRegistryEntry(get(component))!!,
+ )
+ } else null
+
+ MC.sendChat(
+ subject?.let {
+ tr(
+ "firmament.fitstealer.targeted",
+ "Observing the equipment of ${it.observedEntity.name}."
+ )
+ } ?: tr("firmament.fitstealer.targetlost", "No longer logging equipment."),
+ )
+ }
+ }
}
}
}