From 6eea339be76a0bc403cac0d7b83777cab286d789 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Sun, 21 Sep 2025 20:27:56 -0400 Subject: [PATCH 1/6] perf: avoid copies if possible --- .../clientcommands/command/ListenCommand.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java index 59852f56..8947b4ec 100644 --- a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java +++ b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java @@ -198,12 +198,12 @@ private static Component serializeInner(Object object, Set seen, int dep case Message message -> Component.translationArg(message); case Collection collection -> { MutableComponent component = Component.literal("["); - component.append(collection.stream().map(e -> serialize(e, seen, depth + 1).copy()).reduce((l, r) -> l.append(", ").append(r)).orElse(Component.empty())); + component.append(collection.stream().map(e -> asMutable(serialize(e, seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElse(Component.empty())); yield component.append("]"); } case Map map -> { MutableComponent component = Component.literal("{"); - component.append(map.entrySet().stream().map(e -> serialize(e.getKey(), seen, depth + 1).copy().append("=").append(serialize(e.getValue(), seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElse(Component.empty())); + component.append(map.entrySet().stream().map(e -> asMutable(serialize(e.getKey(), seen, depth + 1)).append("=").append(serialize(e.getValue(), seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElse(Component.empty())); yield component.append("}"); } case Registry registry -> Component.translationArg(registry.key().location()); @@ -265,6 +265,10 @@ private static Component serializeInner(Object object, Set seen, int dep }; } + private static MutableComponent asMutable(Component component) { + return component instanceof MutableComponent mutable ? mutable : component.copy(); + } + public enum PacketFlow { SERVERBOUND, CLIENTBOUND, From 851fa2e3b11c8c2d7419258d36ec90b3e747f50e Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Sun, 21 Sep 2025 20:29:34 -0400 Subject: [PATCH 2/6] perf: avoid unused component allocations --- .../earthcomputer/clientcommands/command/ListenCommand.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java index 8947b4ec..be0718fa 100644 --- a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java +++ b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java @@ -198,12 +198,12 @@ private static Component serializeInner(Object object, Set seen, int dep case Message message -> Component.translationArg(message); case Collection collection -> { MutableComponent component = Component.literal("["); - component.append(collection.stream().map(e -> asMutable(serialize(e, seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElse(Component.empty())); + component.append(collection.stream().map(e -> asMutable(serialize(e, seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElseGet(Component::empty)); yield component.append("]"); } case Map map -> { MutableComponent component = Component.literal("{"); - component.append(map.entrySet().stream().map(e -> asMutable(serialize(e.getKey(), seen, depth + 1)).append("=").append(serialize(e.getValue(), seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElse(Component.empty())); + component.append(map.entrySet().stream().map(e -> asMutable(serialize(e.getKey(), seen, depth + 1)).append("=").append(serialize(e.getValue(), seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElseGet(Component::empty)); yield component.append("}"); } case Registry registry -> Component.translationArg(registry.key().location()); @@ -259,7 +259,7 @@ private static Component serializeInner(Object object, Set seen, int dep } }) .reduce((l, r) -> l.append(", ").append(r)) - .orElse(Component.empty())); + .orElseGet(Component::empty)); yield component.append("}"); } }; From b7100c91eabce4eeae890d07682de6a03f32f849 Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Sun, 21 Sep 2025 20:40:41 -0400 Subject: [PATCH 3/6] perf: use constant components for common symbols --- .../clientcommands/command/ListenCommand.java | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java index be0718fa..5399d3b8 100644 --- a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java +++ b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java @@ -17,10 +17,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.core.Holder; import net.minecraft.core.Registry; -import net.minecraft.network.chat.ClickEvent; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.HoverEvent; -import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.*; import net.minecraft.network.protocol.Packet; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -59,6 +56,11 @@ public static void disable() { private static final SimpleCommandExceptionType ALREADY_LISTENING_EXCEPTION = new SimpleCommandExceptionType(Component.translatable("commands.clisten.add.failed")); private static final SimpleCommandExceptionType NOT_LISTENING_EXCEPTION = new SimpleCommandExceptionType(Component.translatable("commands.clisten.remove.failed")); + private static final Component SQUARE_BRACKET = Component.literal("]"); + private static final Component CURLY_BRACKET = Component.literal("}"); + private static final Component EQUALS = Component.literal("="); + private static final Component SEPARATOR = ComponentUtils.DEFAULT_NO_STYLE_SEPARATOR; + private static final Logger LOGGER = LogUtils.getLogger(); private static final Set packets = new HashSet<>(); @@ -198,38 +200,38 @@ private static Component serializeInner(Object object, Set seen, int dep case Message message -> Component.translationArg(message); case Collection collection -> { MutableComponent component = Component.literal("["); - component.append(collection.stream().map(e -> asMutable(serialize(e, seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElseGet(Component::empty)); - yield component.append("]"); + component.append(collection.stream().map(e -> asMutable(serialize(e, seen, depth + 1))).reduce((l, r) -> l.append(SEPARATOR).append(r)).orElseGet(Component::empty)); + yield component.append(SQUARE_BRACKET); } case Map map -> { MutableComponent component = Component.literal("{"); - component.append(map.entrySet().stream().map(e -> asMutable(serialize(e.getKey(), seen, depth + 1)).append("=").append(serialize(e.getValue(), seen, depth + 1))).reduce((l, r) -> l.append(", ").append(r)).orElseGet(Component::empty)); - yield component.append("}"); + component.append(map.entrySet().stream().map(e -> asMutable(serialize(e.getKey(), seen, depth + 1)).append(EQUALS).append(serialize(e.getValue(), seen, depth + 1))).reduce((l, r) -> l.append(SEPARATOR).append(r)).orElseGet(Component::empty)); + yield component.append(CURLY_BRACKET); } case Registry registry -> Component.translationArg(registry.key().location()); case ResourceKey resourceKey -> { MutableComponent component = Component.literal("{"); - component.append("registry=").append(serialize(resourceKey.registry(), seen, depth + 1)).append(", "); + component.append("registry=").append(serialize(resourceKey.registry(), seen, depth + 1)).append(SEPARATOR); component.append("location=").append(serialize(resourceKey.location(), seen, depth + 1)); - yield component.append("}"); + yield component.append(CURLY_BRACKET); } case Holder holder -> { MutableComponent component = Component.literal("{"); - component.append("kind=").append(serialize(holder.kind().name(), seen, depth + 1)).append(", "); + component.append("kind=").append(serialize(holder.kind().name(), seen, depth + 1)).append(SEPARATOR); component.append("value=").append(serialize(holder.value(), seen, depth + 1)); - yield component.append("}"); + yield component.append(CURLY_BRACKET); } default -> { if (object.getClass().isArray()) { MutableComponent component = Component.literal("["); int lengthMinusOne = Array.getLength(object) - 1; if (lengthMinusOne < 0) { - yield component.append("]"); + yield component.append(SQUARE_BRACKET); } for (int i = 0; i < lengthMinusOne; i++) { - component.append(serialize(Array.get(object, i), seen, depth + 1)).append(", "); + component.append(serialize(Array.get(object, i), seen, depth + 1)).append(SEPARATOR); } - yield component.append(serialize(Array.get(object, lengthMinusOne), seen, depth + 1)).append("]"); + yield component.append(serialize(Array.get(object, lengthMinusOne), seen, depth + 1)).append(SQUARE_BRACKET); } String className = object.getClass().getName().replace(".", "/"); @@ -258,9 +260,9 @@ private static Component serializeInner(Object object, Set seen, int dep } } }) - .reduce((l, r) -> l.append(", ").append(r)) + .reduce((l, r) -> l.append(SEPARATOR).append(r)) .orElseGet(Component::empty)); - yield component.append("}"); + yield component.append(CURLY_BRACKET); } }; } From 4e91ba3a67cd742e11579c4bf486d3c411eb74de Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Sun, 21 Sep 2025 20:52:42 -0400 Subject: [PATCH 4/6] add explicit blockstate serializing --- .../clientcommands/command/ListenCommand.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java index 5399d3b8..43edef8c 100644 --- a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java +++ b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java @@ -17,11 +17,14 @@ import net.minecraft.ChatFormatting; import net.minecraft.core.Holder; import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.*; import net.minecraft.network.protocol.Packet; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import org.slf4j.Logger; import java.io.IOException; @@ -40,6 +43,7 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; import static net.earthcomputer.clientcommands.command.arguments.PacketTypeArgument.*; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.*; @@ -221,6 +225,13 @@ private static Component serializeInner(Object object, Set seen, int dep component.append("value=").append(serialize(holder.value(), seen, depth + 1)); yield component.append(CURLY_BRACKET); } + case BlockState state -> { + MutableComponent component = Component.literal(BuiltInRegistries.BLOCK.getKey(state.getBlock()).toString()); + if (!state.getProperties().isEmpty()) { + component.append(state.getProperties().stream().map(property -> property.getName() + "=" + getProperty(state, property)).collect(Collectors.joining(", ", "[", "]"))); + } + yield component; + } default -> { if (object.getClass().isArray()) { MutableComponent component = Component.literal("["); @@ -271,6 +282,10 @@ private static MutableComponent asMutable(Component component) { return component instanceof MutableComponent mutable ? mutable : component.copy(); } + private static > String getProperty(BlockState state, Property property) { + return property.getName(state.getValue(property)); + } + public enum PacketFlow { SERVERBOUND, CLIENTBOUND, From 2669264277bb0b4946452a5c1ea34bce2c163c1c Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Sun, 21 Sep 2025 21:25:36 -0400 Subject: [PATCH 5/6] add common complex registry entry items --- .../clientcommands/command/ListenCommand.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java index 43edef8c..81154077 100644 --- a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java +++ b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java @@ -22,7 +22,10 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.Property; import org.slf4j.Logger; @@ -226,12 +229,15 @@ private static Component serializeInner(Object object, Set seen, int dep yield component.append(CURLY_BRACKET); } case BlockState state -> { - MutableComponent component = Component.literal(BuiltInRegistries.BLOCK.getKey(state.getBlock()).toString()); + MutableComponent component = asMutable(serialize(state.getBlock(), seen, depth)); if (!state.getProperties().isEmpty()) { component.append(state.getProperties().stream().map(property -> property.getName() + "=" + getProperty(state, property)).collect(Collectors.joining(", ", "[", "]"))); } yield component; } + case Block block -> Component.literal(BuiltInRegistries.BLOCK.getKey(block).toString()); + case Item item -> Component.literal(BuiltInRegistries.ITEM.getKey(item).toString()); + case EntityType entityType -> Component.literal(BuiltInRegistries.ENTITY_TYPE.getKey(entityType).toString()); default -> { if (object.getClass().isArray()) { MutableComponent component = Component.literal("["); From 1af80666de4c163b5c5b15f45029098a7be6381b Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Sun, 21 Sep 2025 21:40:56 -0400 Subject: [PATCH 6/6] remove star imports --- .../earthcomputer/clientcommands/command/ListenCommand.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java index 81154077..5668d44d 100644 --- a/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java +++ b/src/main/java/net/earthcomputer/clientcommands/command/ListenCommand.java @@ -18,7 +18,11 @@ import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.chat.*; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentUtils; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.protocol.Packet; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation;