diff --git a/gradle.properties b/gradle.properties index 2c44e384..9d6eaf39 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,7 +20,7 @@ org.gradle.daemon=false modrinth_project_id=9K7RJlvM # Dependencies - fabwork_version=1.3.2-beta.1+1.21 + fabwork_version=1.3.2-beta.2+1.21 modmenu_version=11.0.0-beta.1 minelp_version=4.12.0+1.21 kirin_version=1.19.0+1.21 diff --git a/src/main/java/com/minelittlepony/unicopia/SyncedConfig.java b/src/main/java/com/minelittlepony/unicopia/SyncedConfig.java index 6bbf4f6e..c7cf6438 100644 --- a/src/main/java/com/minelittlepony/unicopia/SyncedConfig.java +++ b/src/main/java/com/minelittlepony/unicopia/SyncedConfig.java @@ -2,7 +2,17 @@ package com.minelittlepony.unicopia; import java.util.Set; +import com.minelittlepony.unicopia.util.serialization.PacketCodecUtils; + +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; + public record SyncedConfig ( Set wantItNeedItExcludeList, Set dimensionsWithoutAtmosphere) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecUtils.STRING_SET, SyncedConfig::wantItNeedItExcludeList, + PacketCodecUtils.STRING_SET, SyncedConfig::dimensionsWithoutAtmosphere, + SyncedConfig::new + ); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java index 39b66b8f..43fb6ab7 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java @@ -12,10 +12,14 @@ import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.util.RegistryUtils; import net.minecraft.util.*; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.Registry; public interface Abilities { Registry> REGISTRY = RegistryUtils.createSimple(Unicopia.id("abilities")); + PacketCodec> PACKET_CODEC = PacketCodecs.registryValue(REGISTRY.getKey()); Map>> BY_SLOT = new EnumMap<>(AbilitySlot.class); BiFunction>> BY_SLOT_AND_COMPOSITE_RACE = Util.memoize((slot, race) -> { return BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Ability.java b/src/main/java/com/minelittlepony/unicopia/ability/Ability.java index 0710b1b1..9d7dd6ea 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Ability.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Ability.java @@ -6,7 +6,7 @@ import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.player.Pony; -import io.netty.buffer.ByteBuf; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -108,7 +108,7 @@ public interface Ability { /** * Gets the serializer to use for reading data over the network. */ - PacketCodec getSerializer(); + PacketCodec getSerializer(); /** * Called on the client to get any data required to activate the ability. diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ActivationType.java b/src/main/java/com/minelittlepony/unicopia/ability/ActivationType.java index 0b033691..22bcdd08 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ActivationType.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ActivationType.java @@ -1,5 +1,8 @@ package com.minelittlepony.unicopia.ability; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.util.math.MathHelper; public enum ActivationType { @@ -9,6 +12,7 @@ public enum ActivationType { TRIPLE_TAP; private static final ActivationType[] VALUES = values(); + public static final PacketCodec PACKET_CODEC = PacketCodecs.indexed(i -> VALUES[i], ActivationType::ordinal); public ActivationType getNext() { return VALUES[Math.min(VALUES.length - 1, ordinal() + 1)]; @@ -22,6 +26,7 @@ public enum ActivationType { return this != NONE; } + @Deprecated public static ActivationType of(int id) { return VALUES[MathHelper.clamp(id, 0, VALUES.length)]; } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java index 3d7c6779..ffd65298 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/Trait.java @@ -8,11 +8,15 @@ import java.util.stream.Stream; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.command.CommandArgumentEnum; import com.mojang.serialization.Codec; + +import io.netty.buffer.ByteBuf; import net.minecraft.command.argument.EnumArgumentType; import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.item.Item; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.text.*; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; @@ -59,6 +63,7 @@ public enum Trait implements CommandArgumentEnum { POISON(TraitGroup.DARKNESS), BLOOD(TraitGroup.DARKNESS); + private static final Trait[] VALUES = values(); private static final Map IDS = Arrays.stream(values()).collect(Collectors.toMap(Trait::getId, Function.identity())); private static final EnumCodec NAME_CODEC = StringIdentifiable.createCodec(Trait::values, n -> n.toLowerCase(Locale.ROOT)); public static final Codec CODEC = Identifier.CODEC.xmap(id -> IDS.get(id), Trait::getId); @@ -66,6 +71,7 @@ public enum Trait implements CommandArgumentEnum { l -> l.stream().distinct().collect(Collectors.toSet()), s -> s.stream().toList() ); + public static final PacketCodec PACKET_CODEC = PacketCodecs.indexed(i -> VALUES[i], Trait::ordinal); private final Identifier id; private final Identifier sprite; diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/PlayerPoser.java b/src/main/java/com/minelittlepony/unicopia/client/render/PlayerPoser.java index e58e1078..e13baca9 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/PlayerPoser.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/PlayerPoser.java @@ -10,17 +10,22 @@ import com.minelittlepony.unicopia.command.CommandArgumentEnum; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.item.GlassesItem; import com.minelittlepony.unicopia.util.AnimationUtil; +import com.minelittlepony.unicopia.util.serialization.PacketCodecUtils; import com.mojang.serialization.Codec; +import io.netty.buffer.ByteBuf; import net.minecraft.client.MinecraftClient; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.command.argument.EnumArgumentType; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.sound.SoundEvent; +import net.minecraft.text.Text; import net.minecraft.util.Arm; import net.minecraft.util.Hand; import net.minecraft.util.StringIdentifiable; @@ -34,8 +39,8 @@ public class PlayerPoser { public void applyPosing(MatrixStack matrices, PlayerEntity player, BipedEntityModel model, Context context) { Pony pony = Pony.of(player); - float tickDelta = MinecraftClient.getInstance().getTickDelta(); - float progress = pony.getAnimationProgress(MinecraftClient.getInstance().getTickDelta()); + float tickDelta = MinecraftClient.getInstance().getRenderTickCounter().getTickDelta(false); + float progress = pony.getAnimationProgress(MinecraftClient.getInstance().getRenderTickCounter().getTickDelta(false)); AnimationInstance animation = pony.getAnimation(); Race ponyRace = MineLPDelegate.getInstance().getPlayerPonyRace(player); Arm mainArm = player.getMainArm(); @@ -72,7 +77,8 @@ public class PlayerPoser { } } - if (glasses.hasCustomName() && "Cool Shades".equals(glasses.getName().getString())) { + Text name = glasses.get(DataComponentTypes.CUSTOM_NAME); + if (name != null && "Cool Shades".equals(name.getString())) { final float bop = AnimationUtil.beat(player.age, HEAD_NOD_DURATION, HEAD_NOD_GAP) * 3F; head.pitch += bop / 10F; @@ -396,6 +402,11 @@ public class PlayerPoser { public record AnimationInstance(Animation animation, Animation.Recipient recipient) { public static final AnimationInstance NONE = new AnimationInstance(Animation.NONE, Animation.Recipient.ANYONE); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecUtils.ofEnum(Animation.class), AnimationInstance::animation, + PacketCodecUtils.ofEnum(Animation.Recipient.class), AnimationInstance::recipient, + AnimationInstance::new + ); public boolean isOf(Animation animation) { return animation() == animation; diff --git a/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java b/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java index f11c401a..fdd68996 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java @@ -12,7 +12,6 @@ import net.minecraft.block.Blocks; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityGroup; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.FlyingItemEntity; import net.minecraft.entity.LivingEntity; @@ -127,7 +126,9 @@ public class FilledJarItem extends ProjectileItem implements ProjectileDelegate. butterfly.updatePosition(projectile.getX(), projectile.getY(), projectile.getZ()); projectile.getWorld().spawnEntity(butterfly); } else { - stack.damage(1, projectile.getWorld().random, null); + if (projectile.getWorld() instanceof ServerWorld sw) { + stack.damage(1, sw, null, i -> {}); + } projectile.dropStack(stack); } projectile.getWorld().syncWorldEvent(WorldEvents.BLOCK_BROKEN, projectile.getBlockPos(), Block.getRawIdFromState(Blocks.GLASS.getDefaultState())); diff --git a/src/main/java/com/minelittlepony/unicopia/network/Channel.java b/src/main/java/com/minelittlepony/unicopia/network/Channel.java index 5b9500b9..29b97d28 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/Channel.java +++ b/src/main/java/com/minelittlepony/unicopia/network/Channel.java @@ -12,31 +12,31 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; public interface Channel { - C2SPacketType> CLIENT_PLAYER_ABILITY = SimpleNetworking.clientToServer(Unicopia.id("player_ability"), MsgPlayerAbility::read); - C2SPacketType CLIENT_CASTER_LOOK = SimpleNetworking.clientToServer(Unicopia.id("caster_look"), MsgCasterLookRequest.Reply::new); - C2SPacketType CLIENT_REQUEST_SPECIES_CHANGE = SimpleNetworking.clientToServer(Unicopia.id("request_capabilities"), MsgRequestSpeciesChange::new); - C2SPacketType MARK_TRAIT_READ = SimpleNetworking.clientToServer(Unicopia.id("mark_trait_read"), MsgMarkTraitRead::new); - C2SPacketType REMOVE_SPELL = SimpleNetworking.clientToServer(Unicopia.id("remove_spell"), MsgRemoveSpell::new); - C2SPacketType FLIGHT_CONTROLS_INPUT = SimpleNetworking.clientToServer(Unicopia.id("flight_controls"), MsgPlayerFlightControlsInput::new); + C2SPacketType> CLIENT_PLAYER_ABILITY = SimpleNetworking.clientToServer(Unicopia.id("player_ability"), MsgPlayerAbility.PACKET_CODEC); + C2SPacketType CLIENT_CASTER_LOOK = SimpleNetworking.clientToServer(Unicopia.id("caster_look"), MsgCasterLookRequest.Reply.PACKET_CODEC); + C2SPacketType CLIENT_REQUEST_SPECIES_CHANGE = SimpleNetworking.clientToServer(Unicopia.id("request_capabilities"), MsgRequestSpeciesChange.PACKET_CODEC); + C2SPacketType MARK_TRAIT_READ = SimpleNetworking.clientToServer(Unicopia.id("mark_trait_read"), MsgMarkTraitRead.PACKET_CODEC); + C2SPacketType REMOVE_SPELL = SimpleNetworking.clientToServer(Unicopia.id("remove_spell"), MsgRemoveSpell.PACKET_CODEC); + C2SPacketType FLIGHT_CONTROLS_INPUT = SimpleNetworking.clientToServer(Unicopia.id("flight_controls"), MsgPlayerFlightControlsInput.PACKET_CODEC); - S2CPacketType SERVER_PLAYER_CAPABILITIES = SimpleNetworking.serverToClient(Unicopia.id("player_capabilities"), MsgPlayerCapabilities::new); - S2CPacketType SERVER_BLOCK_DESTRUCTION = SimpleNetworking.serverToClient(Unicopia.id("block_destruction"), MsgBlockDestruction::new); + S2CPacketType SERVER_PLAYER_CAPABILITIES = SimpleNetworking.serverToClient(Unicopia.id("player_capabilities"), MsgPlayerCapabilities.PACKET_CODEC); + S2CPacketType SERVER_BLOCK_DESTRUCTION = SimpleNetworking.serverToClient(Unicopia.id("block_destruction"), MsgBlockDestruction.PACKET_CODEC); S2CPacketType CANCEL_PLAYER_ABILITY = SimpleNetworking.serverToClient(Unicopia.id("player_ability_cancel"), MsgCancelPlayerAbility.PACKET_CODEC); - S2CPacketType SERVER_REQUEST_PLAYER_LOOK = SimpleNetworking.serverToClient(Unicopia.id("request_player_look"), MsgCasterLookRequest::new); - S2CPacketType UNLOCK_TRAITS = SimpleNetworking.serverToClient(Unicopia.id("unlock_traits"), MsgUnlockTraits::new); + S2CPacketType SERVER_REQUEST_PLAYER_LOOK = SimpleNetworking.serverToClient(Unicopia.id("request_player_look"), MsgCasterLookRequest.PACKET_CODEC); + S2CPacketType UNLOCK_TRAITS = SimpleNetworking.serverToClient(Unicopia.id("unlock_traits"), MsgUnlockTraits.PACKET_CODEC); - S2CPacketType SERVER_SELECT_TRIBE = SimpleNetworking.serverToClient(Unicopia.id("select_tribe"), MsgTribeSelect::new); + S2CPacketType SERVER_SELECT_TRIBE = SimpleNetworking.serverToClient(Unicopia.id("select_tribe"), MsgTribeSelect.PACKET_CODEC); - S2CPacketType> SERVER_SPELLBOOK_UPDATE = SimpleNetworking.serverToClient(Unicopia.id("server_spellbook_update"), MsgSpellbookStateChanged::new); - C2SPacketType> CLIENT_SPELLBOOK_UPDATE = SimpleNetworking.clientToServer(Unicopia.id("client_spellbook_update"), MsgSpellbookStateChanged::new); + S2CPacketType> SERVER_SPELLBOOK_UPDATE = SimpleNetworking.serverToClient(Unicopia.id("server_spellbook_update"), MsgSpellbookStateChanged.packetCodec()); + C2SPacketType> CLIENT_SPELLBOOK_UPDATE = SimpleNetworking.clientToServer(Unicopia.id("client_spellbook_update"), MsgSpellbookStateChanged.packetCodec()); S2CPacketType SERVER_RESOURCES = SimpleNetworking.serverToClient(Unicopia.id("resources"), MsgServerResources.PACKET_CODEC); - S2CPacketType SERVER_TRACKED_ENTITY_DATA = SimpleNetworking.serverToClient(Unicopia.id("tracked_entity_date"), MsgTrackedValues::new); - S2CPacketType SERVER_PLAYER_ANIMATION_CHANGE = SimpleNetworking.serverToClient(Unicopia.id("player_animation_change"), MsgPlayerAnimationChange::new); - S2CPacketType SERVER_SKY_ANGLE = SimpleNetworking.serverToClient(Unicopia.id("sky_angle"), MsgSkyAngle::new); - S2CPacketType CONFIGURATION_CHANGE = SimpleNetworking.serverToClient(Unicopia.id("config"), MsgConfigurationChange::new); - S2CPacketType SERVER_ZAP_STAGE = SimpleNetworking.serverToClient(Unicopia.id("zap_stage"), MsgZapAppleStage::new); + S2CPacketType SERVER_TRACKED_ENTITY_DATA = SimpleNetworking.serverToClient(Unicopia.id("tracked_entity_date"), MsgTrackedValues.PACKET_CODEC); + S2CPacketType SERVER_PLAYER_ANIMATION_CHANGE = SimpleNetworking.serverToClient(Unicopia.id("player_animation_change"), MsgPlayerAnimationChange.PACKET_CODEC); + S2CPacketType SERVER_SKY_ANGLE = SimpleNetworking.serverToClient(Unicopia.id("sky_angle"), MsgSkyAngle.PACKET_CODEC); + S2CPacketType CONFIGURATION_CHANGE = SimpleNetworking.serverToClient(Unicopia.id("config"), MsgConfigurationChange.PACKET_CODEC); + S2CPacketType SERVER_ZAP_STAGE = SimpleNetworking.serverToClient(Unicopia.id("zap_stage"), MsgZapAppleStage.PACKET_CODEC); S2CPacketType SERVER_TRINKET_BROKEN = SimpleNetworking.serverToClient(Unicopia.id("trinket_broken"), MsgTrinketBroken.PACKET_CODEC); static void bootstrap() { diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgBlockDestruction.java b/src/main/java/com/minelittlepony/unicopia/network/MsgBlockDestruction.java index fb76f664..0690142b 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgBlockDestruction.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgBlockDestruction.java @@ -1,29 +1,17 @@ package com.minelittlepony.unicopia.network; -import com.sollace.fabwork.api.packets.Packet; - +import io.netty.buffer.ByteBuf; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; /** * Sent by the server to update block destruction progress on the client. */ -public record MsgBlockDestruction (Long2ObjectMap destructions) implements Packet { - MsgBlockDestruction(PacketByteBuf buffer) { - this(new Long2ObjectOpenHashMap<>()); - int size = buffer.readInt(); - for (int i = 0; i < size; i++) { - destructions.put(buffer.readLong(), (Float)buffer.readFloat()); - } - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeInt(destructions.size()); - destructions.forEach((p, i) -> { - buffer.writeLong(p); - buffer.writeFloat(i); - }); - } +public record MsgBlockDestruction(Long2ObjectMap destructions) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.map(Long2ObjectOpenHashMap::new, PacketCodecs.VAR_LONG, PacketCodecs.FLOAT), MsgBlockDestruction::destructions, + MsgBlockDestruction::new + ); } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgCasterLookRequest.java b/src/main/java/com/minelittlepony/unicopia/network/MsgCasterLookRequest.java index 34946aef..db9da80a 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgCasterLookRequest.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgCasterLookRequest.java @@ -7,45 +7,33 @@ import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.OrientedSpell; import com.minelittlepony.unicopia.entity.player.Pony; -import com.sollace.fabwork.api.packets.HandledPacket; -import com.sollace.fabwork.api.packets.Packet; - +import com.sollace.fabwork.api.packets.Handled; +import io.netty.buffer.ByteBuf; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Uuids; /** * Sent to the client when the server needs to know precisely where the player is looking. */ -public record MsgCasterLookRequest (UUID spellId) implements Packet { - - public MsgCasterLookRequest(PacketByteBuf buffer) { - this(buffer.readUuid()); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeUuid(spellId); - } +public record MsgCasterLookRequest (UUID spellId) { + public static final PacketCodec PACKET_CODEC = Uuids.PACKET_CODEC.xmap(MsgCasterLookRequest::new, MsgCasterLookRequest::spellId); public record Reply ( UUID spellId, Rot rotation - ) implements HandledPacket { - - Reply(PacketByteBuf buffer) { - this(buffer.readUuid(), Rot.CODEC.decode(buffer)); - } + ) implements Handled { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + Uuids.PACKET_CODEC, Reply::spellId, + Rot.CODEC, Reply::rotation, + Reply::new + ); public Reply(OrientedSpell spell, Caster caster) { this(spell.getUuid(), Rot.of(caster)); } - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeUuid(spellId); - Rot.CODEC.encode(buffer, rotation); - } - @Override public void handle(ServerPlayerEntity sender) { Pony pony = Pony.of(sender); diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgConfigurationChange.java b/src/main/java/com/minelittlepony/unicopia/network/MsgConfigurationChange.java index 6f94d1fd..385c5c54 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgConfigurationChange.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgConfigurationChange.java @@ -1,24 +1,9 @@ package com.minelittlepony.unicopia.network; -import java.util.HashSet; - import com.minelittlepony.unicopia.SyncedConfig; -import com.sollace.fabwork.api.packets.Packet; - -import net.minecraft.network.PacketByteBuf; - -public record MsgConfigurationChange(SyncedConfig config) implements Packet { - public MsgConfigurationChange(PacketByteBuf buffer) { - this(new SyncedConfig( - buffer.readCollection(HashSet::new, PacketByteBuf::readString), - buffer.readCollection(HashSet::new, PacketByteBuf::readString) - )); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeCollection(config.wantItNeedItExcludeList(), PacketByteBuf::writeString); - buffer.writeCollection(config.dimensionsWithoutAtmosphere(), PacketByteBuf::writeString); - } +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; +public record MsgConfigurationChange(SyncedConfig config) { + public static final PacketCodec PACKET_CODEC = SyncedConfig.PACKET_CODEC.xmap(MsgConfigurationChange::new, MsgConfigurationChange::config); } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgMarkTraitRead.java b/src/main/java/com/minelittlepony/unicopia/network/MsgMarkTraitRead.java index 9cb559bf..d1ed712c 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgMarkTraitRead.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgMarkTraitRead.java @@ -5,25 +5,17 @@ import java.util.Set; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; import com.minelittlepony.unicopia.entity.player.Pony; -import com.sollace.fabwork.api.packets.HandledPacket; - +import com.sollace.fabwork.api.packets.Handled; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.server.network.ServerPlayerEntity; -public record MsgMarkTraitRead (Set traits) implements HandledPacket { - MsgMarkTraitRead(PacketByteBuf buffer) { - this(new HashSet<>()); - int length = buffer.readInt(); - for (int i = 0; i < length; i++) { - Trait.fromId(buffer.readIdentifier()).ifPresent(traits::add); - } - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeInt(traits.size()); - traits.forEach(trait -> buffer.writeIdentifier(trait.getId())); - } +public record MsgMarkTraitRead (Set traits) implements Handled { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + Trait.PACKET_CODEC.collect(PacketCodecs.toCollection(HashSet::new)), MsgMarkTraitRead::traits, + MsgMarkTraitRead::new + ); @Override public void handle(ServerPlayerEntity sender) { diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java index 53025eed..331a741b 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java @@ -1,15 +1,13 @@ package com.minelittlepony.unicopia.network; import java.util.Optional; - import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.ability.Ability; import com.minelittlepony.unicopia.ability.ActivationType; import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.player.Pony; -import com.sollace.fabwork.api.packets.HandledPacket; - -import net.minecraft.network.PacketByteBuf; +import com.sollace.fabwork.api.packets.Handled; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.server.network.ServerPlayerEntity; @@ -20,29 +18,28 @@ public record MsgPlayerAbility ( Ability power, Optional data, ActivationType type - ) implements HandledPacket { - - @SuppressWarnings("unchecked") - static MsgPlayerAbility read(PacketByteBuf buffer) { - Ability power = (Ability) Abilities.REGISTRY.get(buffer.readIdentifier()); - return new MsgPlayerAbility<>( - power, - buffer.readOptional(b -> ((PacketCodec)power.getSerializer()).decode(b)), - ActivationType.of(buffer.readInt()) - ); - } - - @SuppressWarnings("unchecked") - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeIdentifier(Abilities.REGISTRY.getId(power)); - buffer.writeOptional(data, (b, d) -> ((PacketCodec)power.getSerializer()).encode(b, d)); - buffer.writeInt(type.ordinal()); - } + ) implements Handled { + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static final PacketCodec> PACKET_CODEC = PacketCodec.of( + (packet, buffer) -> { + Abilities.PACKET_CODEC.encode(buffer, packet.power()); + buffer.writeOptional(packet.data(), (b, d) -> ((PacketCodec)packet.power().getSerializer()).encode(buffer, d)); + ActivationType.PACKET_CODEC.encode(buffer, packet.type()); + }, + buffer -> { + Ability power = Abilities.PACKET_CODEC.decode(buffer); + return new MsgPlayerAbility( + power, + buffer.readOptional(b -> power.getSerializer().decode(buffer)), + ActivationType.PACKET_CODEC.decode(buffer) + ); + } + ); @Override public void handle(ServerPlayerEntity sender) { Pony player = Pony.of(sender); + if (player == null) { return; } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAnimationChange.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAnimationChange.java index ba61524c..c8d2d106 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAnimationChange.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAnimationChange.java @@ -2,12 +2,12 @@ package com.minelittlepony.unicopia.network; import java.util.UUID; -import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.client.render.PlayerPoser.AnimationInstance; import com.minelittlepony.unicopia.entity.player.Pony; -import com.sollace.fabwork.api.packets.Packet; - import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.util.Uuids; /** * Sent to the client when a player's animation changes. @@ -16,28 +16,15 @@ public record MsgPlayerAnimationChange ( UUID playerId, AnimationInstance animation, int duration - ) implements Packet { - - MsgPlayerAnimationChange(PacketByteBuf buffer) { - this( - buffer.readUuid(), - new AnimationInstance( - buffer.readEnumConstant(Animation.class), - buffer.readEnumConstant(Animation.Recipient.class) - ), - buffer.readInt() - ); - } + ) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + Uuids.PACKET_CODEC, MsgPlayerAnimationChange::playerId, + AnimationInstance.PACKET_CODEC, MsgPlayerAnimationChange::animation, + PacketCodecs.INTEGER, MsgPlayerAnimationChange::duration, + MsgPlayerAnimationChange::new + ); public MsgPlayerAnimationChange(Pony player, AnimationInstance animation, int duration) { this(player.asEntity().getUuid(), animation, duration); } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeUuid(playerId); - buffer.writeEnumConstant(animation.animation()); - buffer.writeEnumConstant(animation.recipient()); - buffer.writeInt(duration); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java index 4f821b58..2264280b 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java @@ -1,9 +1,9 @@ package com.minelittlepony.unicopia.network; import com.minelittlepony.unicopia.entity.player.Pony; -import com.sollace.fabwork.api.packets.HandledPacket; - -import net.minecraft.network.PacketByteBuf; +import com.sollace.fabwork.api.packets.Handled; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodecs; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; @@ -13,15 +13,20 @@ import net.minecraft.nbt.NbtCompound; *

* Also used by the server to notify a race change. */ -public class MsgPlayerCapabilities implements HandledPacket { +public class MsgPlayerCapabilities implements Handled { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, i -> i.playerId, + PacketCodecs.NBT_COMPOUND, i -> i.compoundTag, + MsgPlayerCapabilities::new + ); protected final int playerId; private final NbtCompound compoundTag; - MsgPlayerCapabilities(PacketByteBuf buffer) { - playerId = buffer.readInt(); - compoundTag = PacketCodecs.NBT_COMPOUND.decode(buffer); + MsgPlayerCapabilities(int playerId, NbtCompound compoundTag) { + this.playerId = playerId; + this.compoundTag = compoundTag; } public MsgPlayerCapabilities(Pony player) { @@ -30,12 +35,6 @@ public class MsgPlayerCapabilities implements HandledPacket { player.toSyncronisedNbt(compoundTag, player.asWorld().getRegistryManager()); } - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeInt(playerId); - PacketCodecs.NBT_COMPOUND.encode(buffer, compoundTag); - } - @Override public void handle(PlayerEntity sender) { Pony player = Pony.of(sender.getWorld().getEntityById(playerId)).orElse(null); diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerFlightControlsInput.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerFlightControlsInput.java index cc800c1b..72ff9da1 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerFlightControlsInput.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerFlightControlsInput.java @@ -1,29 +1,26 @@ package com.minelittlepony.unicopia.network; import com.minelittlepony.unicopia.entity.player.Pony; -import com.sollace.fabwork.api.packets.HandledPacket; -import net.minecraft.network.PacketByteBuf; +import com.sollace.fabwork.api.packets.Handled; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.server.network.ServerPlayerEntity; public record MsgPlayerFlightControlsInput ( boolean ascending, boolean descending - ) implements HandledPacket { + ) implements Handled { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.BOOL, MsgPlayerFlightControlsInput::ascending, + PacketCodecs.BOOL, MsgPlayerFlightControlsInput::descending, + MsgPlayerFlightControlsInput::new + ); public MsgPlayerFlightControlsInput(Pony pony) { this(pony.getJumpingHeuristic().getState(), pony.asEntity().isSneaking()); } - public MsgPlayerFlightControlsInput(PacketByteBuf buffer) { - this(buffer.readBoolean(), buffer.readBoolean()); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeBoolean(ascending); - buffer.writeBoolean(descending); - } - @Override public void handle(ServerPlayerEntity sender) { sender.setSneaking(descending); diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgRemoveSpell.java b/src/main/java/com/minelittlepony/unicopia/network/MsgRemoveSpell.java index 771b2c73..8b5746be 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgRemoveSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgRemoveSpell.java @@ -4,28 +4,22 @@ import java.util.UUID; import com.minelittlepony.unicopia.ability.magic.spell.Spell; import com.minelittlepony.unicopia.entity.player.Pony; -import com.sollace.fabwork.api.packets.HandledPacket; - -import net.minecraft.network.PacketByteBuf; +import com.sollace.fabwork.api.packets.Handled; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Uuids; /** * Sent to the server when a player dismisses a spell from their dismiss spell screen */ -public record MsgRemoveSpell (UUID id) implements HandledPacket { - MsgRemoveSpell(PacketByteBuf buffer) { - this(buffer.readUuid()); - } +public record MsgRemoveSpell (UUID id) implements Handled { + public static final PacketCodec PACKET_CODEC = Uuids.PACKET_CODEC.xmap(MsgRemoveSpell::new, MsgRemoveSpell::id); public MsgRemoveSpell(Spell spell) { this(spell.getUuid()); } - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeUuid(id); - } - @Override public void handle(ServerPlayerEntity sender) { Pony player = Pony.of(sender); diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgRequestSpeciesChange.java b/src/main/java/com/minelittlepony/unicopia/network/MsgRequestSpeciesChange.java index c9990fc5..93a95b14 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgRequestSpeciesChange.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgRequestSpeciesChange.java @@ -4,9 +4,10 @@ import com.minelittlepony.unicopia.*; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.server.world.UGameRules; import com.minelittlepony.unicopia.server.world.UnicopiaWorldProperties; -import com.sollace.fabwork.api.packets.HandledPacket; - -import net.minecraft.network.PacketByteBuf; +import com.sollace.fabwork.api.packets.Handled; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.*; @@ -19,17 +20,12 @@ import net.minecraft.text.*; public record MsgRequestSpeciesChange ( boolean force, Race newRace - ) implements HandledPacket { - - MsgRequestSpeciesChange(PacketByteBuf buffer) { - this(buffer.readBoolean(), Race.REGISTRY.get(buffer.readRegistryKey(Race.REGISTRY_KEY))); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeBoolean(force); - buffer.writeRegistryKey(Race.REGISTRY.getKey(newRace).get()); - } + ) implements Handled { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.BOOL, MsgRequestSpeciesChange::force, + PacketCodecs.registryValue(Race.REGISTRY_KEY), MsgRequestSpeciesChange::newRace, + MsgRequestSpeciesChange::new + ); @Override public void handle(ServerPlayerEntity sender) { diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgSkyAngle.java b/src/main/java/com/minelittlepony/unicopia/network/MsgSkyAngle.java index 3cee8504..26d30642 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgSkyAngle.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgSkyAngle.java @@ -1,19 +1,11 @@ package com.minelittlepony.unicopia.network; -import com.sollace.fabwork.api.packets.Packet; - -import net.minecraft.network.PacketByteBuf; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; public record MsgSkyAngle ( float tangentalSkyAngle - ) implements Packet { - - public MsgSkyAngle(PacketByteBuf buffer) { - this(buffer.readFloat()); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeFloat(tangentalSkyAngle()); - } + ) { + public static final PacketCodec PACKET_CODEC = PacketCodecs.FLOAT.xmap(MsgSkyAngle::new, MsgSkyAngle::tangentalSkyAngle); } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgSpellbookStateChanged.java b/src/main/java/com/minelittlepony/unicopia/network/MsgSpellbookStateChanged.java index 1579a903..cfce556b 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgSpellbookStateChanged.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgSpellbookStateChanged.java @@ -2,11 +2,11 @@ package com.minelittlepony.unicopia.network; import com.minelittlepony.unicopia.container.SpellbookScreenHandler; import com.minelittlepony.unicopia.container.SpellbookState; -import com.sollace.fabwork.api.packets.HandledPacket; - +import com.sollace.fabwork.api.packets.Handled; 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.server.network.ServerPlayerEntity; /** @@ -16,22 +16,22 @@ import net.minecraft.server.network.ServerPlayerEntity; public record MsgSpellbookStateChanged ( int syncId, SpellbookState state - ) implements HandledPacket { + ) implements Handled { + private static final PacketCodec> PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.INTEGER, MsgSpellbookStateChanged::syncId, + SpellbookState.PACKET_CODEC, MsgSpellbookStateChanged::state, + MsgSpellbookStateChanged::new + ); + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static PacketCodec> packetCodec() { + return (PacketCodec)PACKET_CODEC; + } public static MsgSpellbookStateChanged create(SpellbookScreenHandler handler, SpellbookState state) { return new MsgSpellbookStateChanged<>(handler.syncId, state); } - public MsgSpellbookStateChanged(RegistryByteBuf buffer) { - this(buffer.readInt(), SpellbookState.PACKET_CODEC.decode(buffer)); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeInt(syncId); - SpellbookState.PACKET_CODEC.encode((RegistryByteBuf)buffer, state); - } - @Override public void handle(T sender) { if (sender.currentScreenHandler.syncId != syncId) { diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgTribeSelect.java b/src/main/java/com/minelittlepony/unicopia/network/MsgTribeSelect.java index cf362f8a..3fbe16f8 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgTribeSelect.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgTribeSelect.java @@ -4,21 +4,14 @@ import java.util.HashSet; import java.util.Set; import com.minelittlepony.unicopia.Race; -import com.sollace.fabwork.api.packets.Packet; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; -import net.minecraft.network.PacketByteBuf; - -public record MsgTribeSelect (Set availableRaces, String serverMessage) implements Packet { - public MsgTribeSelect(PacketByteBuf buffer) { - this( - buffer.readCollection(HashSet::new, buf -> Race.REGISTRY.get(buf.readRegistryKey(Race.REGISTRY_KEY))), - buffer.readString() - ); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeCollection(availableRaces, (buf, race) -> buf.writeRegistryKey(Race.REGISTRY.getKey(race).get())); - buffer.writeString(serverMessage); - } +public record MsgTribeSelect (Set availableRaces, String serverMessage) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.registryValue(Race.REGISTRY_KEY).collect(PacketCodecs.toCollection(HashSet::new)), MsgTribeSelect::availableRaces, + PacketCodecs.STRING, MsgTribeSelect::serverMessage, + MsgTribeSelect::new + ); } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgUnlockTraits.java b/src/main/java/com/minelittlepony/unicopia/network/MsgUnlockTraits.java index bc82e135..ea5ba09a 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgUnlockTraits.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgUnlockTraits.java @@ -4,26 +4,17 @@ import java.util.HashSet; import java.util.Set; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; -import com.sollace.fabwork.api.packets.Packet; - import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; -public record MsgUnlockTraits (Set traits) implements Packet { - MsgUnlockTraits(PacketByteBuf buffer) { - this(new HashSet<>()); - int length = buffer.readInt(); - for (int i = 0; i < length; i++) { - Trait.fromId(buffer.readIdentifier()).ifPresent(traits::add); - } - } +public record MsgUnlockTraits (Set traits) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + Trait.PACKET_CODEC.collect(PacketCodecs.toCollection(HashSet::new)), MsgUnlockTraits::traits, + MsgUnlockTraits::new + ); public MsgUnlockTraits(Set traits) { this.traits = new HashSet<>(traits); } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeInt(traits.size()); - traits.forEach(trait -> buffer.writeIdentifier(trait.getId())); - } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgZapAppleStage.java b/src/main/java/com/minelittlepony/unicopia/network/MsgZapAppleStage.java index ce9569de..85fb42de 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgZapAppleStage.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgZapAppleStage.java @@ -1,20 +1,11 @@ package com.minelittlepony.unicopia.network; import com.minelittlepony.unicopia.server.world.ZapAppleStageStore; -import com.sollace.fabwork.api.packets.Packet; - -import net.minecraft.network.PacketByteBuf; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; public record MsgZapAppleStage ( ZapAppleStageStore.Stage stage - ) implements Packet { - - public MsgZapAppleStage(PacketByteBuf buffer) { - this(buffer.readEnumConstant(ZapAppleStageStore.Stage.class)); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeEnumConstant(stage); - } + ) { + public static final PacketCodec PACKET_CODEC = ZapAppleStageStore.Stage.PACKET_CODEC.xmap(MsgZapAppleStage::new, MsgZapAppleStage::stage); } 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 610c346e..fd2a7366 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java +++ b/src/main/java/com/minelittlepony/unicopia/network/track/MsgTrackedValues.java @@ -10,8 +10,7 @@ import java.util.Set; import java.util.UUID; import com.minelittlepony.unicopia.util.serialization.PacketCodecUtils; -import com.sollace.fabwork.api.packets.HandledPacket; - +import com.sollace.fabwork.api.packets.Handled; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; @@ -23,21 +22,13 @@ public record MsgTrackedValues( int owner, Optional updatedObjects, Optional updatedTrackers -) implements HandledPacket { - public MsgTrackedValues(PacketByteBuf buffer) { - this( - buffer.readInt(), - TrackerObjects.OPTIONAL_PACKET_CODEC.decode(buffer), - TrackerEntries.OPTIONAL_PACKET_CODEC.decode(buffer) - ); - } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeInt(owner); - TrackerObjects.OPTIONAL_PACKET_CODEC.encode(buffer, updatedObjects); - TrackerEntries.OPTIONAL_PACKET_CODEC.encode(buffer, updatedTrackers); - } +) implements Handled { + 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, + MsgTrackedValues::new + ); @Override public void handle(PlayerEntity sender) { @@ -54,7 +45,6 @@ public record MsgTrackedValues( PacketCodecs.map(HashMap::new, Uuids.PACKET_CODEC, PacketCodecUtils.BUFFER), TrackerObjects::values, TrackerObjects::new ); - public static final PacketCodec> OPTIONAL_PACKET_CODEC = PacketCodecs.optional(PACKET_CODEC); } public record TrackerEntries(int id, boolean wipe, List> values, Map objects) { @@ -65,6 +55,5 @@ public record MsgTrackedValues( PacketCodecs.map(HashMap::new, PacketCodecs.INTEGER, PacketCodecUtils.BUFFER), TrackerEntries::objects, TrackerEntries::new ); - public static final PacketCodec> OPTIONAL_PACKET_CODEC = PacketCodecs.optional(PACKET_CODEC); } } diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/ZapAppleStageStore.java b/src/main/java/com/minelittlepony/unicopia/server/world/ZapAppleStageStore.java index dd024123..7b9ccfe6 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/ZapAppleStageStore.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/ZapAppleStageStore.java @@ -14,9 +14,12 @@ import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.util.MeteorlogicalUtil; import com.minelittlepony.unicopia.util.Tickable; +import io.netty.buffer.ByteBuf; import net.minecraft.entity.EntityType; import net.minecraft.entity.LightningEntity; import net.minecraft.nbt.*; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryWrapper.WrapperLookup; import net.minecraft.sound.SoundCategory; import net.minecraft.util.Identifier; @@ -153,6 +156,8 @@ public class ZapAppleStageStore extends PersistentState implements Tickable { static final Stage[] VALUES = values(); static final float MAX = VALUES.length; + public static final PacketCodec PACKET_CODEC = PacketCodecs.indexed(i -> VALUES[i], Stage::ordinal); + private final float ordinal = ordinal(); public Stage getNext() { @@ -180,7 +185,7 @@ public class ZapAppleStageStore extends PersistentState implements Tickable { return MathHelper.lerp(getStageProgress(world), ordinal, ordinal + 1) / MAX; } - public static Stage byId(int id) { + private static Stage byId(int id) { return VALUES[MathHelper.clamp(id, 0, VALUES.length)]; } 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 16af2ed5..5316df9c 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/util/serialization/PacketCodecUtils.java @@ -1,8 +1,10 @@ package com.minelittlepony.unicopia.util.serialization; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Function; import java.util.function.IntFunction; @@ -12,6 +14,7 @@ import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; +import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -35,6 +38,17 @@ public interface PacketCodecUtils { ); PacketCodec> OPTIONAL_VECTOR = PacketCodecs.optional(VECTOR); PacketCodec> OPTIONAL_POS = PacketCodecs.optional(BlockPos.PACKET_CODEC); + PacketCodec> STRING_SET = PacketCodecs.STRING.collect(PacketCodecs.toCollection(HashSet::new)); + + Function, PacketCodec> ENUM_CODEC_CACHE = Util.memoize(type -> { + final Object[] values = type.getEnumConstants(); + return PacketCodecs.indexed(i -> values[i], i -> ((Enum)i).ordinal()); + }); + + @SuppressWarnings("unchecked") + static > PacketCodec ofEnum(Class type) { + return (PacketCodec)ENUM_CODEC_CACHE.apply(type); + } static PacketCodec.ResultFunction> toMap(Function keyFunction) { return codec -> map(HashMap::new, codec, keyFunction, -1);