Skip to content

Commit 03cf4e4

Browse files
committed
feat: Add dye logger for armor stands
1 parent ce2e4f4 commit 03cf4e4

File tree

5 files changed

+92
-28
lines changed

5 files changed

+92
-28
lines changed

src/main/java/moe/nea/firmament/mixins/EntityUpdateEventListener.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.minecraft.entity.LivingEntity;
1313
import net.minecraft.network.ClientConnection;
1414
import net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket;
15+
import net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket;
1516
import net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket;
1617
import org.spongepowered.asm.mixin.Mixin;
1718
import org.spongepowered.asm.mixin.Shadow;
@@ -22,21 +23,26 @@
2223
@Mixin(ClientPlayNetworkHandler.class)
2324
public abstract class EntityUpdateEventListener extends ClientCommonNetworkHandler {
2425

25-
@Shadow
26-
private ClientWorld world;
26+
@Shadow
27+
private ClientWorld world;
2728

28-
protected EntityUpdateEventListener(MinecraftClient client, ClientConnection connection, ClientConnectionState connectionState) {
29-
super(client, connection, connectionState);
30-
}
29+
protected EntityUpdateEventListener(MinecraftClient client, ClientConnection connection, ClientConnectionState connectionState) {
30+
super(client, connection, connectionState);
31+
}
3132

32-
@Inject(method = "onEntityAttributes", at = @At("TAIL"))
33-
private void onAttributeUpdate(EntityAttributesS2CPacket packet, CallbackInfo ci) {
34-
EntityUpdateEvent.Companion.publish(new EntityUpdateEvent.AttributeUpdate(
35-
(LivingEntity) world.getEntityById(packet.getEntityId()), packet.getEntries()));
36-
}
33+
@Inject(method = "onEntityEquipmentUpdate", at = @At(value = "INVOKE", target = "Ljava/util/List;forEach(Ljava/util/function/Consumer;)V", shift = At.Shift.AFTER))
34+
private void onEquipmentUpdate(EntityEquipmentUpdateS2CPacket packet, CallbackInfo ci, @Local LivingEntity entity) {
35+
EntityUpdateEvent.Companion.publish(new EntityUpdateEvent.EquipmentUpdate(entity, packet.getEquipmentList()));
36+
}
3737

38-
@Inject(method = "onEntityTrackerUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;writeUpdatedEntries(Ljava/util/List;)V", shift = At.Shift.AFTER))
39-
private void onEntityTracker(EntityTrackerUpdateS2CPacket packet, CallbackInfo ci, @Local Entity entity) {
40-
EntityUpdateEvent.Companion.publish(new EntityUpdateEvent.TrackedDataUpdate(entity, packet.trackedValues()));
41-
}
38+
@Inject(method = "onEntityAttributes", at = @At("TAIL"))
39+
private void onAttributeUpdate(EntityAttributesS2CPacket packet, CallbackInfo ci) {
40+
EntityUpdateEvent.Companion.publish(new EntityUpdateEvent.AttributeUpdate(
41+
(LivingEntity) world.getEntityById(packet.getEntityId()), packet.getEntries()));
42+
}
43+
44+
@Inject(method = "onEntityTrackerUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;writeUpdatedEntries(Ljava/util/List;)V", shift = At.Shift.AFTER))
45+
private void onEntityTracker(EntityTrackerUpdateS2CPacket packet, CallbackInfo ci, @Local Entity entity) {
46+
EntityUpdateEvent.Companion.publish(new EntityUpdateEvent.TrackedDataUpdate(entity, packet.trackedValues()));
47+
}
4248
}

src/main/kotlin/Firmament.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,8 @@ object Firmament {
120120
@JvmStatic
121121
fun onClientInitialize() {
122122
FeatureManager.subscribeEvents()
123-
var tick = 0
124123
ClientTickEvents.END_CLIENT_TICK.register(ClientTickEvents.EndTick { instance ->
125-
TickEvent.publish(TickEvent(tick++))
124+
TickEvent.publish(TickEvent(MC.currentTick++))
126125
})
127126
IDataHolder.registerEvents()
128127
RepoManager.initialize()
Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
21
package moe.nea.firmament.events
32

3+
import com.mojang.datafixers.util.Pair
44
import net.minecraft.entity.Entity
5+
import net.minecraft.entity.EquipmentSlot
56
import net.minecraft.entity.LivingEntity
67
import net.minecraft.entity.data.DataTracker
8+
import net.minecraft.item.ItemStack
79
import net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket
810

911
/**
@@ -13,19 +15,24 @@ import net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket
1315
* *after* the values have been applied to the entity.
1416
*/
1517
sealed class EntityUpdateEvent : FirmamentEvent() {
16-
companion object : FirmamentEventBus<EntityUpdateEvent>()
18+
companion object : FirmamentEventBus<EntityUpdateEvent>()
19+
20+
abstract val entity: Entity
1721

18-
abstract val entity: Entity
22+
data class AttributeUpdate(
23+
override val entity: LivingEntity,
24+
val attributes: List<EntityAttributesS2CPacket.Entry>,
25+
) : EntityUpdateEvent()
1926

20-
data class AttributeUpdate(
21-
override val entity: LivingEntity,
22-
val attributes: List<EntityAttributesS2CPacket.Entry>,
23-
) : EntityUpdateEvent()
27+
data class TrackedDataUpdate(
28+
override val entity: Entity,
29+
val trackedValues: List<DataTracker.SerializedEntry<*>>,
30+
) : EntityUpdateEvent()
2431

25-
data class TrackedDataUpdate(
26-
override val entity: Entity,
27-
val trackedValues: List<DataTracker.SerializedEntry<*>>,
28-
) : EntityUpdateEvent()
32+
data class EquipmentUpdate(
33+
override val entity: Entity,
34+
val newEquipment: List<Pair<EquipmentSlot, ItemStack>>,
35+
) : EntityUpdateEvent()
2936

30-
// TODO: onEntityPassengersSet, onEntityAttach?, onEntityEquipmentUpdate, onEntityStatusEffect
37+
// TODO: onEntityPassengersSet, onEntityAttach?, onEntityStatusEffect
3138
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package moe.nea.firmament.features.debug
2+
3+
import net.minecraft.component.DataComponentTypes
4+
import net.minecraft.entity.Entity
5+
import moe.nea.firmament.annotations.Subscribe
6+
import moe.nea.firmament.commands.thenExecute
7+
import moe.nea.firmament.commands.thenLiteral
8+
import moe.nea.firmament.events.CommandEvent
9+
import moe.nea.firmament.events.EntityUpdateEvent
10+
import moe.nea.firmament.util.MC
11+
import moe.nea.firmament.util.skyBlockId
12+
import moe.nea.firmament.util.tr
13+
14+
object AnimatedClothingScanner {
15+
16+
var observedEntity: Entity? = null
17+
18+
@OptIn(ExperimentalStdlibApi::class)
19+
@Subscribe
20+
fun onUpdate(event: EntityUpdateEvent) {
21+
if (event.entity != observedEntity) return
22+
if (event is EntityUpdateEvent.EquipmentUpdate) {
23+
event.newEquipment.forEach {
24+
val id = it.second.skyBlockId?.neuItem
25+
val colour = it.second.get(DataComponentTypes.DYED_COLOR)
26+
?.rgb?.toHexString(HexFormat.UpperCase)
27+
?.let { " #$it" } ?: ""
28+
MC.sendChat(tr("firmament.fitstealer.update",
29+
"[FIT CHECK][${MC.currentTick}] ${it.first.asString()} => ${id}${colour}"))
30+
}
31+
}
32+
}
33+
34+
@Subscribe
35+
fun onSubCommand(event: CommandEvent.SubCommand) {
36+
event.subcommand("dev") {
37+
thenLiteral("stealthisfit") {
38+
thenExecute {
39+
observedEntity =
40+
if (observedEntity == null) MC.instance.targetedEntity else null
41+
42+
MC.sendChat(
43+
observedEntity?.let {
44+
tr("firmament.fitstealer.targeted", "Observing the equipment of ${it.name}.")
45+
} ?: tr("firmament.fitstealer.targetlost", "No longer logging equipment."),
46+
)
47+
}
48+
}
49+
}
50+
}
51+
}

src/main/kotlin/util/MC.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ object MC {
113113
val defaultRegistries: RegistryWrapper.WrapperLookup by lazy { BuiltinRegistries.createWrapperLookup() }
114114
inline val currentOrDefaultRegistries get() = currentRegistries ?: defaultRegistries
115115
val defaultItems: RegistryWrapper.Impl<Item> by lazy { defaultRegistries.getOrThrow(RegistryKeys.ITEM) }
116+
var currentTick = 0
116117
var lastWorld: World? = null
117118
get() {
118119
field = world ?: field

0 commit comments

Comments
 (0)