Skip to content

Commit b077211

Browse files
add NETWORK serialization attribute and make MinecraftEndecs#ofRegistry use it
1 parent 68b0aa6 commit b077211

File tree

5 files changed

+67
-4
lines changed

5 files changed

+67
-4
lines changed

src/main/java/io/wispforest/owo/serialization/CodecUtils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,8 @@ public T decode(B buf) {
271271
? SerializationContext.attributes(RegistriesAttribute.of(registryByteBuf.getRegistryManager()))
272272
: SerializationContext.empty();
273273

274+
ctx = ctx.withAttributes(MinecraftSerializationAttributes.NETWORK);
275+
274276
return endec.decode(ctx, ByteBufDeserializer.of(buf));
275277
}
276278

@@ -280,6 +282,8 @@ public void encode(B buf, T value) {
280282
? SerializationContext.attributes(RegistriesAttribute.of(registryByteBuf.getRegistryManager()))
281283
: SerializationContext.empty();
282284

285+
ctx = ctx.withAttributes(MinecraftSerializationAttributes.NETWORK);
286+
283287
endec.encode(ctx, ByteBufSerializer.of(buf), value);
284288
}
285289
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.wispforest.owo.serialization;
2+
3+
import io.wispforest.endec.SerializationAttribute;
4+
5+
public final class MinecraftSerializationAttributes {
6+
private MinecraftSerializationAttributes() { }
7+
8+
/**
9+
* This format will be sent over the network.
10+
* <p>
11+
* Registries and block states can be represented as integer IDs.
12+
*/
13+
public static final SerializationAttribute.Marker NETWORK = SerializationAttribute.marker("network");
14+
}

src/main/java/io/wispforest/owo/serialization/endec/MinecraftEndecs.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package io.wispforest.owo.serialization.endec;
22

33
import com.mojang.datafixers.util.Function3;
4-
import io.wispforest.endec.Endec;
5-
import io.wispforest.endec.SerializationAttributes;
4+
import io.wispforest.endec.*;
65
import io.wispforest.endec.impl.ReflectiveEndecBuilder;
76
import io.wispforest.endec.impl.StructEndecBuilder;
87
import io.wispforest.owo.serialization.CodecUtils;
8+
import io.wispforest.owo.serialization.MinecraftSerializationAttributes;
9+
import net.fabricmc.fabric.api.event.registry.RegistryAttribute;
10+
import net.fabricmc.fabric.api.event.registry.RegistryAttributeHolder;
911
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
12+
import net.minecraft.block.Block;
13+
import net.minecraft.item.Item;
1014
import net.minecraft.item.ItemStack;
1115
import net.minecraft.network.PacketByteBuf;
16+
import net.minecraft.registry.Registries;
1217
import net.minecraft.registry.Registry;
1318
import net.minecraft.registry.RegistryKey;
1419
import net.minecraft.registry.tag.TagKey;
@@ -105,11 +110,37 @@ public static ReflectiveEndecBuilder addDefaults(ReflectiveEndecBuilder builder)
105110

106111
builder.register(BLOCK_HIT_RESULT, BlockHitResult.class);
107112

113+
builder.register(ofRegistry(Registries.ITEM), Item.class)
114+
.register(ofRegistry(Registries.BLOCK), Block.class);
115+
108116
return builder;
109117
}
110118

111119
public static <T> Endec<T> ofRegistry(Registry<T> registry) {
112-
return IDENTIFIER.xmap(registry::get, registry::getId);
120+
Endec<T> idEndec = IDENTIFIER.xmap(registry::get, registry::getId);
121+
Endec<T> rawIdEndec = Endec.VAR_INT.xmap(registry::get, registry::getRawId);
122+
123+
return new Endec<>() {
124+
@Override
125+
public void encode(SerializationContext ctx, Serializer<?> serializer, T value) {
126+
if (RegistryAttributeHolder.get(registry).hasAttribute(RegistryAttribute.SYNCED)
127+
&& ctx.hasAttribute(MinecraftSerializationAttributes.NETWORK)) {
128+
rawIdEndec.encode(ctx, serializer, value);
129+
} else {
130+
idEndec.encode(ctx, serializer, value);
131+
}
132+
}
133+
134+
@Override
135+
public T decode(SerializationContext ctx, Deserializer<?> deserializer) {
136+
if (RegistryAttributeHolder.get(registry).hasAttribute(RegistryAttribute.SYNCED)
137+
&& ctx.hasAttribute(MinecraftSerializationAttributes.NETWORK)) {
138+
return rawIdEndec.decode(ctx, deserializer);
139+
} else {
140+
return idEndec.decode(ctx, deserializer);
141+
}
142+
}
143+
};
113144
}
114145

115146
public static <T> Endec<TagKey<T>> unprefixedTagKey(RegistryKey<? extends Registry<T>> registry) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.wispforest.uwu.network;
2+
3+
import net.minecraft.block.Block;
4+
import net.minecraft.item.Item;
5+
6+
public record DispatchedSubclassThree(Item item, Block block) implements DispatchedInterface {
7+
@Override
8+
public String getName() {
9+
return "three";
10+
}
11+
}

src/testmod/java/io/wispforest/uwu/network/UwuNetworkExample.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package io.wispforest.uwu.network;
22

33
import io.wispforest.endec.impl.RecordEndec;
4-
import io.wispforest.endec.impl.ReflectiveEndecBuilder;
54
import io.wispforest.owo.network.OwoNetChannel;
65
import io.wispforest.endec.Endec;
76
import io.wispforest.endec.StructEndec;
87
import net.fabricmc.api.EnvType;
98
import net.fabricmc.api.Environment;
109
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
1110
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
11+
import net.minecraft.block.Blocks;
1212
import net.minecraft.client.option.KeyBinding;
13+
import net.minecraft.item.Items;
1314
import net.minecraft.text.Text;
1415
import net.minecraft.util.Identifier;
1516
import org.lwjgl.glfw.GLFW;
@@ -28,6 +29,7 @@ public static void init() {
2829

2930
REGISTRY.put("one", RecordEndec.create(CHANNEL.builder(), DispatchedSubclassOne.class));
3031
REGISTRY.put("two", RecordEndec.create(CHANNEL.builder(), DispatchedSubclassTwo.class));
32+
REGISTRY.put("three", RecordEndec.create(CHANNEL.builder(), DispatchedSubclassThree.class));
3133

3234
CHANNEL.registerClientbound(StringPacket.class, (message, access) -> {
3335
access.player().sendMessage(Text.of(message.value()), false);
@@ -67,6 +69,7 @@ public static void init() {
6769

6870
CHANNEL.clientHandle().send(new MaldingPacket(new DispatchedSubclassOne("base")));
6971
CHANNEL.clientHandle().send(new MaldingPacket(new DispatchedSubclassTwo(20)));
72+
CHANNEL.clientHandle().send(new MaldingPacket(new DispatchedSubclassThree(Items.ACACIA_BOAT, Blocks.DRAGON_EGG)));
7073

7174
CHANNEL.clientHandle().send(new NullablePacket(null, null));
7275
CHANNEL.clientHandle().send(new NullablePacket("Weeee", null));

0 commit comments

Comments
 (0)