diff --git a/src/main/java/com/minelittlepony/unicopia/Race.java b/src/main/java/com/minelittlepony/unicopia/Race.java index c900a985..37d21ab0 100644 --- a/src/main/java/com/minelittlepony/unicopia/Race.java +++ b/src/main/java/com/minelittlepony/unicopia/Race.java @@ -10,7 +10,6 @@ import com.google.common.base.Strings; import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.ability.Ability; import com.minelittlepony.unicopia.ability.magic.Affine; -import com.minelittlepony.unicopia.network.track.TrackableDataType; import com.minelittlepony.unicopia.util.RegistryUtils; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -45,7 +44,6 @@ public record Race ( public static final String DEFAULT_ID = "unicopia:unset"; public static final Registry REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race"), DEFAULT_ID); public static final Registry COMMAND_REGISTRY = RegistryUtils.createDefaulted(Unicopia.id("race/grantable"), DEFAULT_ID); - public static final TrackableDataType TRACKABLE_TYPE = TrackableDataType.RACE; public static final RegistryKey> REGISTRY_KEY = REGISTRY.getKey(); private static final DynamicCommandExceptionType UNKNOWN_RACE_EXCEPTION = new DynamicCommandExceptionType(id -> Text.translatable("commands.race.fail", id)); private static final Function COMPOSITES = Util.memoize(race -> new Composite(race, null, null)); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/MultiSpellSlot.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/MultiSpellSlot.java index a01432bd..0951bc5f 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/MultiSpellSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/MultiSpellSlot.java @@ -17,9 +17,10 @@ import com.minelittlepony.unicopia.network.track.TrackableObject; import com.minelittlepony.unicopia.network.track.MsgTrackedValues.TrackerEntries; import com.minelittlepony.unicopia.util.serialization.NbtSerialisable; +import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryWrapper.WrapperLookup; @@ -147,22 +148,24 @@ class MultiSpellSlot implements SpellSlots, NbtSerialisable { } @Override - public void read(PacketByteBuf buffer, WrapperLookup lookup) { + public void read(ByteBuf buffer, WrapperLookup lookup) { byte contentType = buffer.readByte(); if (contentType == 1) { readTrackedNbt(PacketCodecs.NBT_COMPOUND.decode(buffer), lookup); } else { T spell = this.spell.get(); if (spell != null) { - spell.getDataTracker().load(MsgTrackedValues.TrackerEntries.PACKET_CODEC.decode(buffer), lookup); + spell.getDataTracker().load(MsgTrackedValues.TrackerEntries.PACKET_CODEC.decode( + buffer instanceof RegistryByteBuf r ? r : new RegistryByteBuf(buffer, owner.asEntity().getRegistryManager()) + ), lookup); } } } @Override - public Optional write(Status status, WrapperLookup lookup) { + public Optional write(Status status, WrapperLookup lookup) { if (status != Status.DEFAULT) { - PacketByteBuf buffer = new PacketByteBuf(Unpooled.buffer()); + ByteBuf buffer = Unpooled.buffer(); buffer.writeByte(1); PacketCodecs.NBT_COMPOUND.encode(buffer, spell.toNBT(lookup)); return Optional.of(buffer); @@ -172,7 +175,7 @@ class MultiSpellSlot implements SpellSlots, NbtSerialisable { return Optional.empty(); } return spell.getDataTracker().getDirtyPairs(lookup).map(entries -> { - PacketByteBuf buffer = new PacketByteBuf(Unpooled.buffer()); + RegistryByteBuf buffer = new RegistryByteBuf(Unpooled.buffer(), owner.asEntity().getRegistryManager()); buffer.writeByte(0); TrackerEntries.PACKET_CODEC.encode(buffer, entries); return buffer; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java b/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java index e6a8ba12..a94a42a5 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java @@ -7,6 +7,7 @@ import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.network.track.DataTracker; import com.minelittlepony.unicopia.network.track.DataTrackerManager; import com.minelittlepony.unicopia.network.track.Trackable; +import com.minelittlepony.unicopia.network.track.TrackableDataType; import com.minelittlepony.unicopia.particle.FollowingParticleEffect; import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.particle.UParticles; @@ -39,7 +40,7 @@ public class ItemImpl implements Equine { this.tracker = trackers.getPrimaryTracker(); this.physics = new ItemPhysics(owner); - race = tracker.startTracking(Race.TRACKABLE_TYPE, Race.HUMAN); + race = tracker.startTracking(TrackableDataType.RACE, Race.HUMAN); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index e3c18a5c..93f8f6c3 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -37,6 +37,7 @@ import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.util.*; import com.minelittlepony.unicopia.network.*; import com.minelittlepony.unicopia.network.track.DataTracker; +import com.minelittlepony.unicopia.network.track.TrackableDataType; import com.minelittlepony.unicopia.server.world.UGameRules; import com.minelittlepony.common.util.animation.LinearInterpolator; import com.google.common.collect.Streams; @@ -121,8 +122,8 @@ public class Pony extends Living implements Copyable, Update } }); - race = this.tracker.startTracking(Race.TRACKABLE_TYPE, Race.UNSET); - suppressedRace = this.tracker.startTracking(Race.TRACKABLE_TYPE, Race.UNSET); + race = this.tracker.startTracking(TrackableDataType.RACE, Race.UNSET); + suppressedRace = this.tracker.startTracking(TrackableDataType.RACE, Race.UNSET); this.levels = new PlayerLevelStore(this, tracker, true, USounds.Vanilla.ENTITY_PLAYER_LEVELUP); this.corruption = new PlayerLevelStore(this, tracker, false, USounds.ENTITY_PLAYER_CORRUPTION); this.mana = addTicker(new ManaContainer(this, tracker)); diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java b/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java index 05dcae7c..bacbcbf2 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/DataTracker.java @@ -7,11 +7,15 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import com.minelittlepony.unicopia.util.Untyped; + +import io.netty.buffer.ByteBuf; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryWrapper.WrapperLookup; public class DataTracker { @@ -44,14 +48,14 @@ public class DataTracker { } private T get(Entry entry) { - return getPair(entry).value; + return getPair(entry).value.value; } private void set(Entry entry, T value) { Pair pair = getPair(entry); if (!Objects.equals(pair.value, value)) { synchronized (this) { - pair.value = value; + pair.value.value = value; dirtyIndices.add(entry.id()); } } @@ -60,7 +64,7 @@ public class DataTracker { @SuppressWarnings({ "unchecked", "rawtypes" }) synchronized void copyTo(DataTracker destination) { for (int i = 0; i < codecs.size(); i++) { - ((Pair)destination.codecs.get(i)).value = codecs.get(i).value; + ((Pair)destination.codecs.get(i)).value.value = codecs.get(i).value.value; if (i < persistentObjects.size() && i < destination.persistentObjects.size()) { TrackableObject a = persistentObjects.get(i); TrackableObject b = destination.persistentObjects.get(i); @@ -74,7 +78,7 @@ public class DataTracker { synchronized Optional getInitialPairs(WrapperLookup lookup) { initial = false; dirtyIndices = new IntOpenHashSet(); - return Optional.of(new MsgTrackedValues.TrackerEntries(id, true, codecs, writePersistentObjects(lookup, true))); + return Optional.of(new MsgTrackedValues.TrackerEntries(id, true, codecs, Untyped.cast(writePersistentObjects(lookup, true)))); } public synchronized Optional getDirtyPairs(WrapperLookup lookup) { @@ -82,7 +86,7 @@ public class DataTracker { return getInitialPairs(lookup); } - Map updates = writePersistentObjects(lookup, false); + Map updates = writePersistentObjects(lookup, false); if (dirtyIndices.isEmpty() && updates.isEmpty()) { return Optional.empty(); @@ -94,11 +98,11 @@ public class DataTracker { for (int i : toSend) { pairs.add(codecs.get(i)); } - return Optional.of(new MsgTrackedValues.TrackerEntries(id, false, pairs, updates)); + return Optional.of(new MsgTrackedValues.TrackerEntries(id, false, pairs, Untyped.cast(updates))); } - private Map writePersistentObjects(WrapperLookup lookup, boolean initial) { - Map updates = new HashMap<>(); + private Map writePersistentObjects(WrapperLookup lookup, boolean initial) { + Map updates = new HashMap<>(); for (int i = 0; i < persistentObjects.size(); i++) { TrackableObject o = persistentObjects.get(i); TrackableObject.Status status = initial ? TrackableObject.Status.NEW : o.getStatus(); @@ -115,7 +119,7 @@ public class DataTracker { } else { for (var value : values.values()) { if (value.id >= 0 && value.id < codecs.size()) { - if (codecs.get(value.id).type == value.type) { + if (codecs.get(value.id).value.type == value.value.type) { codecs.set(value.id, value); } } @@ -140,28 +144,16 @@ public class DataTracker { } } - static class Pair { - public static final PacketCodec> PACKET_CODEC = PacketCodec.ofStatic((buffer, pair) -> pair.write(buffer), Pair::new); - - private final TrackableDataType type; - public final int id; - public T value; + record Pair (int id, TrackableDataType.TypedValue value) { + @SuppressWarnings("unchecked") + public static final PacketCodec> PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, Pair::id, + TrackableDataType.PACKET_CODEC, Pair::value, + Pair::new + ); public Pair(int id, TrackableDataType type, T value) { - this.id = id; - this.type = type; - this.value = value; - } - - private Pair(PacketByteBuf buffer) { - this.id = buffer.readInt(); - this.type = TrackableDataType.of(buffer); - this.value = type.read(buffer); - } - - private void write(PacketByteBuf buffer) { - buffer.writeInt(id); - type.write(buffer, value); + this(id, new TrackableDataType.TypedValue<>(type, value)); } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java b/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java index e6578cee..6e94e424 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/DataTrackerManager.java @@ -5,8 +5,6 @@ import java.util.Optional; import java.util.function.Consumer; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; - import com.minelittlepony.unicopia.network.Channel; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.entity.Entity; @@ -23,13 +21,13 @@ public class DataTrackerManager { private final List> objectTrackers = new ObjectArrayList<>(); private final List packetEmitters = new ObjectArrayList<>(); - @Nullable private DataTracker primaryTracker; public DataTrackerManager(Entity entity) { this.entity = entity; this.lookup = entity.getWorld().getRegistryManager(); this.isClient = entity.getWorld().isClient; + this.primaryTracker = checkoutTracker(); } public synchronized void addPacketEmitter(PacketEmitter packetEmitter) { @@ -37,9 +35,6 @@ public class DataTrackerManager { } public DataTracker getPrimaryTracker() { - if (primaryTracker == null) { - primaryTracker = checkoutTracker(); - } return primaryTracker; } diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java b/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java index fd2a7366..a176756d 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java @@ -11,9 +11,11 @@ import java.util.UUID; import com.minelittlepony.unicopia.util.serialization.PacketCodecUtils; import com.sollace.fabwork.api.packets.Handled; + +import io.netty.buffer.ByteBuf; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodecs; import net.minecraft.util.Uuids; @@ -23,7 +25,7 @@ public record MsgTrackedValues( Optional updatedObjects, Optional updatedTrackers ) implements Handled { - public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( PacketCodecs.INTEGER, MsgTrackedValues::owner, PacketCodecs.optional(TrackerObjects.PACKET_CODEC), MsgTrackedValues::updatedObjects, PacketCodecs.optional(TrackerEntries.PACKET_CODEC), MsgTrackedValues::updatedTrackers, @@ -38,21 +40,21 @@ public record MsgTrackedValues( } } - public record TrackerObjects(int id, Set removedValues, Map values) { - public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + public record TrackerObjects(int id, Set removedValues, Map values) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( PacketCodecs.INTEGER, TrackerObjects::id, Uuids.PACKET_CODEC.collect(PacketCodecs.toCollection(HashSet::new)), TrackerObjects::removedValues, - PacketCodecs.map(HashMap::new, Uuids.PACKET_CODEC, PacketCodecUtils.BUFFER), TrackerObjects::values, + PacketCodecs.map(HashMap::new, Uuids.PACKET_CODEC, PacketCodecUtils.REGISTRY_BUFFER), TrackerObjects::values, TrackerObjects::new ); } - public record TrackerEntries(int id, boolean wipe, List> values, Map objects) { - public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + public record TrackerEntries(int id, boolean wipe, List> values, Map objects) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( PacketCodecs.INTEGER, TrackerEntries::id, PacketCodecs.BOOL, TrackerEntries::wipe, DataTracker.Pair.PACKET_CODEC.collect(PacketCodecs.toCollection(ArrayList::new)), TrackerEntries::values, - PacketCodecs.map(HashMap::new, PacketCodecs.INTEGER, PacketCodecUtils.BUFFER), TrackerEntries::objects, + PacketCodecs.map(HashMap::new, PacketCodecs.INTEGER, PacketCodecUtils.REGISTRY_BUFFER), TrackerEntries::objects, TrackerEntries::new ); } diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java b/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java index 481bd514..3d35347a 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/ObjectTracker.java @@ -12,8 +12,8 @@ import java.util.function.Supplier; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.network.track.TrackableObject.Status; +import io.netty.buffer.ByteBuf; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.network.PacketByteBuf; import net.minecraft.registry.RegistryWrapper.WrapperLookup; public class ObjectTracker> { @@ -89,7 +89,7 @@ public class ObjectTracker> { return Optional.empty(); } - Map updates = new HashMap<>(); + Map updates = new HashMap<>(); quickAccess.entrySet().forEach(object -> { object.getValue().write(Status.NEW, lookup).ifPresent(data -> { updates.put(object.getKey(), data); @@ -101,7 +101,7 @@ public class ObjectTracker> { synchronized Optional getDirtyPairs(WrapperLookup lookup) { if (!trackedObjects.isEmpty()) { - Map updates = new HashMap<>(); + Map updates = new HashMap<>(); Set removedTrackableObjects = new HashSet<>(); trackedObjects.entrySet().removeIf(object -> { TrackableObject.Status status = object.getValue().getStatus(); diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/TrackableDataType.java b/src/main/java/com/minelittlepony/unicopia/network/track/TrackableDataType.java index b71c8e23..f48947ef 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/TrackableDataType.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/TrackableDataType.java @@ -2,17 +2,19 @@ package com.minelittlepony.unicopia.network.track; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.util.Untyped; import com.minelittlepony.unicopia.util.serialization.PacketCodecUtils; -import io.netty.buffer.ByteBuf; - import java.util.Objects; import java.util.Optional; import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; + import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryKey; @@ -21,8 +23,12 @@ import net.minecraft.util.Uuids; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -public record TrackableDataType(int id, PacketCodec codec) { +public record TrackableDataType(int id, PacketCodec> codec) { private static final Int2ObjectMap> REGISTRY = new Int2ObjectOpenHashMap<>(); + public static final PacketCodec> PACKET_CODEC = PacketCodecs.INTEGER.cast().xmap( + id -> Objects.requireNonNull(REGISTRY.get(id.intValue()), "Unknown trackable data type id: " + id), + type -> type.id() + ).dispatch(value -> Untyped.cast(value.type), TrackableDataType::codec); public static final TrackableDataType INT = of(Identifier.of("integer"), PacketCodecs.INTEGER); public static final TrackableDataType FLOAT = of(Identifier.of("float"), PacketCodecs.FLOAT); @@ -36,30 +42,30 @@ public record TrackableDataType(int id, PacketCodec codec) public static final TrackableDataType> OPTIONAL_VECTOR = of(Identifier.of("optional_vector"), PacketCodecUtils.OPTIONAL_VECTOR); private static final TrackableDataType>> OPTIONAL_REGISTRY_KEY = of(Identifier.of("optional_registry_key"), PacketCodecUtils.OPTIONAL_REGISTRY_KEY); - public static final TrackableDataType RACE = TrackableDataType.of(Unicopia.id("race"), PacketCodecs.registryValue(Race.REGISTRY_KEY)); + public static final TrackableDataType RACE = of(Unicopia.id("race"), PacketCodecs.registryValue(Race.REGISTRY_KEY)); - @SuppressWarnings({ "rawtypes", "unchecked" }) public static TrackableDataType>> ofRegistryKey() { - return (TrackableDataType)OPTIONAL_REGISTRY_KEY; + return Untyped.cast(OPTIONAL_REGISTRY_KEY); } - @SuppressWarnings("unchecked") - public static TrackableDataType of(PacketByteBuf buffer) { - int id = buffer.readInt(); - return Objects.requireNonNull((TrackableDataType)REGISTRY.get(id), "Unknown trackable data type id: " + id); + public static TrackableDataType of(Identifier typeName, PacketCodec codec) { + return Untyped.cast(REGISTRY.computeIfAbsent(typeName.hashCode(), t -> { + AtomicReference> ref = new AtomicReference<>(); + ref.set(new TrackableDataType<>(t, codec.cast().xmap( + value -> new TypedValue<>(ref.get(), value), + value -> value.value + ))); + return ref.get(); + })); } - @SuppressWarnings("unchecked") - public static TrackableDataType of(Identifier typeName, PacketCodec codec) { - return (TrackableDataType)REGISTRY.computeIfAbsent(typeName.hashCode(), t -> new TrackableDataType<>(t, (PacketCodec)codec)); - } + public static class TypedValue { + final TrackableDataType type; + public T value; - public T read(PacketByteBuf buffer) { - return codec().decode(buffer); - } - - public void write(PacketByteBuf buffer, T value) { - buffer.writeInt(id); - codec().encode(buffer, value); + public TypedValue(TrackableDataType type, T value) { + this.type = type; + this.value = value; + } } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/track/TrackableObject.java b/src/main/java/com/minelittlepony/unicopia/network/track/TrackableObject.java index 956d5cb5..ee76189d 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/TrackableObject.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/TrackableObject.java @@ -2,22 +2,22 @@ package com.minelittlepony.unicopia.network.track; import java.util.Optional; +import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryWrapper.WrapperLookup; public interface TrackableObject> { Status getStatus(); - default void read(PacketByteBuf buffer, WrapperLookup lookup) { + default void read(ByteBuf buffer, WrapperLookup lookup) { readTrackedNbt(PacketCodecs.NBT_COMPOUND.decode(buffer), lookup); } - default Optional write(Status status, WrapperLookup lookup) { + default Optional write(Status status, WrapperLookup lookup) { if (status == Status.NEW || status == Status.UPDATED) { - PacketByteBuf buffer = new PacketByteBuf(Unpooled.buffer()); + ByteBuf buffer = Unpooled.buffer(); PacketCodecs.NBT_COMPOUND.encode(buffer, writeTrackedNbt(lookup)); return Optional.of(buffer); } diff --git a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java b/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java index 6633a9b3..bf3d1ccc 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java @@ -10,6 +10,7 @@ import java.util.function.IntFunction; import io.netty.buffer.ByteBuf; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryKey; @@ -24,6 +25,13 @@ public interface PacketCodecUtils { buffer.writeBytes(bytes); }, buffer -> new PacketByteBuf(buffer.readBytes(buffer.readInt()))); PacketCodec> OPTIONAL_BUFFER = PacketCodecs.optional(BUFFER); + + PacketCodec REGISTRY_BUFFER = PacketCodec.of((buffer, bytes) -> { + buffer.writeInt(bytes.writerIndex()); + buffer.writeBytes(bytes); + }, buffer -> new RegistryByteBuf(buffer.readBytes(buffer.readInt()), buffer.getRegistryManager())); + PacketCodec> OPTIONAL_REGISTRY_BUFFER = PacketCodecs.optional(REGISTRY_BUFFER); + PacketCodec> REGISTRY_KEY = PacketCodec.tuple( Identifier.PACKET_CODEC, RegistryKey::getRegistry, Identifier.PACKET_CODEC, RegistryKey::getValue,