diff options
Diffstat (limited to 'src/main/kotlin/features/debug/AnimatedClothingScanner.kt')
-rw-r--r-- | src/main/kotlin/features/debug/AnimatedClothingScanner.kt | 94 |
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."), + ) + } + } } } } |