From 46b4ad37b159b1fc59e45871f7572101f5ed43ab Mon Sep 17 00:00:00 2001 From: Alemiz Date: Thu, 11 Apr 2024 18:49:58 +0200 Subject: [PATCH] Initial work on 1.20.80 support --- ...ientboundDebugRendererSerializer_v428.java | 12 +- .../bedrock/codec/v671/Bedrock_v671.java | 56 ++++++++ ...ientboundDebugRendererSerializer_v671.java | 20 +++ ...ctPlayerMovePredictionSerializer_v671.java | 38 ++++++ .../CraftingDataSerializer_v671.java | 56 ++++++++ .../ResourcePackStackSerializer_v671.java | 22 +++ .../serializer/StartGameSerializer_v671.java | 125 ++++++++++++++++++ .../UpdatePlayerGameTypeSerializer_v671.java | 23 ++++ .../bedrock/data/DisconnectFailReason.java | 9 +- .../protocol/bedrock/data/HudElement.java | 10 +- .../protocol/bedrock/data/ParticleType.java | 6 +- .../bedrock/data/entity/EntityFlag.java | 9 +- .../crafting/recipe/ShapedRecipeData.java | 22 ++- .../CorrectPlayerMovePredictionPacket.java | 8 ++ .../packet/ResourcePackStackPacket.java | 4 + .../bedrock/packet/StartGamePacket.java | 4 + .../packet/UpdatePlayerGameTypePacket.java | 4 + 17 files changed, 417 insertions(+), 11 deletions(-) create mode 100644 bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/Bedrock_v671.java create mode 100644 bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/ClientboundDebugRendererSerializer_v671.java create mode 100644 bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/CorrectPlayerMovePredictionSerializer_v671.java create mode 100644 bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/CraftingDataSerializer_v671.java create mode 100644 bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/ResourcePackStackSerializer_v671.java create mode 100644 bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/StartGameSerializer_v671.java create mode 100644 bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/UpdatePlayerGameTypeSerializer_v671.java diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v428/serializer/ClientboundDebugRendererSerializer_v428.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v428/serializer/ClientboundDebugRendererSerializer_v428.java index 6da291793..947ce8d0f 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v428/serializer/ClientboundDebugRendererSerializer_v428.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v428/serializer/ClientboundDebugRendererSerializer_v428.java @@ -16,7 +16,7 @@ public class ClientboundDebugRendererSerializer_v428 implements BedrockPacketSer @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDebugRendererPacket packet) { - VarInts.writeUnsignedInt(buffer, packet.getDebugMarkerType().ordinal()); + this.writeMarkerType(buffer, helper, packet.getDebugMarkerType()); if (packet.getDebugMarkerType() == ClientboundDebugRendererType.ADD_DEBUG_MARKER_CUBE) { helper.writeString(buffer, packet.getMarkerText()); helper.writeVector3f(buffer, packet.getMarkerPosition()); @@ -30,7 +30,7 @@ public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDebu @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDebugRendererPacket packet) { - packet.setDebugMarkerType(ClientboundDebugRendererType.values()[VarInts.readUnsignedInt(buffer)]); + packet.setDebugMarkerType(this.readMarkerType(buffer, helper)); if (packet.getDebugMarkerType() == ClientboundDebugRendererType.ADD_DEBUG_MARKER_CUBE) { packet.setMarkerText(helper.readString(buffer)); packet.setMarkerPosition(helper.readVector3f(buffer)); @@ -41,4 +41,12 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDe packet.setMarkerDuration(buffer.readLongLE()); } } + + protected void writeMarkerType(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDebugRendererType type) { + VarInts.writeUnsignedInt(buffer, type.ordinal()); + } + + protected ClientboundDebugRendererType readMarkerType(ByteBuf buffer, BedrockCodecHelper helper) { + return ClientboundDebugRendererType.values()[VarInts.readUnsignedInt(buffer)]; + } } diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/Bedrock_v671.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/Bedrock_v671.java new file mode 100644 index 000000000..baec730d6 --- /dev/null +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/Bedrock_v671.java @@ -0,0 +1,56 @@ +package org.cloudburstmc.protocol.bedrock.codec.v671; + +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.EntityDataTypeMap; +import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.LevelEventSerializer_v291; +import org.cloudburstmc.protocol.bedrock.codec.v361.serializer.LevelEventGenericSerializer_v361; +import org.cloudburstmc.protocol.bedrock.codec.v575.BedrockCodecHelper_v575; +import org.cloudburstmc.protocol.bedrock.codec.v662.Bedrock_v662; +import org.cloudburstmc.protocol.bedrock.codec.v671.serializer.*; +import org.cloudburstmc.protocol.bedrock.data.LevelEventType; +import org.cloudburstmc.protocol.bedrock.data.ParticleType; +import org.cloudburstmc.protocol.bedrock.data.command.CommandParam; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; +import org.cloudburstmc.protocol.bedrock.packet.*; +import org.cloudburstmc.protocol.bedrock.transformer.FlagTransformer; +import org.cloudburstmc.protocol.common.util.TypeMap; + +public class Bedrock_v671 extends Bedrock_v662 { + + protected static final TypeMap PARTICLE_TYPES = Bedrock_v662.PARTICLE_TYPES.toBuilder() + .insert(92, ParticleType.WOLF_ARMOR_BREAK) + .build(); + + protected static final TypeMap LEVEL_EVENTS = Bedrock_v662.LEVEL_EVENTS.toBuilder() + .insert(LEVEL_EVENT_PARTICLE_TYPE, PARTICLE_TYPES) + .build(); + + protected static final TypeMap ENTITY_FLAGS = Bedrock_v662.ENTITY_FLAGS + .toBuilder() + .insert(118, EntityFlag.BODY_ROTATION_BLOCKED) + .build(); + + protected static final EntityDataTypeMap ENTITY_DATA = Bedrock_v662.ENTITY_DATA + .toBuilder() + .update(EntityDataTypes.FLAGS, new FlagTransformer(ENTITY_FLAGS, 0)) + .update(EntityDataTypes.FLAGS_2, new FlagTransformer(ENTITY_FLAGS, 1)) + .build(); + + public static final BedrockCodec CODEC = Bedrock_v662.CODEC.toBuilder() + .raknetProtocolVersion(11) + .protocolVersion(671) + .minecraftVersion("1.20.80") + .helper(() -> new BedrockCodecHelper_v575(ENTITY_DATA, GAME_RULE_TYPES, ITEM_STACK_REQUEST_TYPES, CONTAINER_SLOT_TYPES, PLAYER_ABILITIES, TEXT_PROCESSING_ORIGINS)) + .updateSerializer(LevelEventPacket.class, new LevelEventSerializer_v291(LEVEL_EVENTS)) + .updateSerializer(LevelEventGenericPacket.class, new LevelEventGenericSerializer_v361(LEVEL_EVENTS)) + .updateSerializer(ClientboundDebugRendererPacket.class, ClientboundDebugRendererSerializer_v671.INSTANCE) + .updateSerializer(CorrectPlayerMovePredictionPacket.class, CorrectPlayerMovePredictionSerializer_v671.INSTANCE) + .updateSerializer(ResourcePackStackPacket.class, ResourcePackStackSerializer_v671.INSTANCE) + .updateSerializer(UpdatePlayerGameTypePacket.class, UpdatePlayerGameTypeSerializer_v671.INSTANCE) + .updateSerializer(StartGamePacket.class, StartGameSerializer_v671.INSTANCE) + .updateSerializer(CraftingDataPacket.class, CraftingDataSerializer_v671.INSTANCE) + .deregisterPacket(FilterTextPacket.class) // TODO: check + // TODO: confirm change in AnimatePacket + .build(); +} \ No newline at end of file diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/ClientboundDebugRendererSerializer_v671.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/ClientboundDebugRendererSerializer_v671.java new file mode 100644 index 000000000..8a00fc7f0 --- /dev/null +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/ClientboundDebugRendererSerializer_v671.java @@ -0,0 +1,20 @@ +package org.cloudburstmc.protocol.bedrock.codec.v671.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v428.serializer.ClientboundDebugRendererSerializer_v428; +import org.cloudburstmc.protocol.bedrock.data.ClientboundDebugRendererType; + +public class ClientboundDebugRendererSerializer_v671 extends ClientboundDebugRendererSerializer_v428 { + public static final ClientboundDebugRendererSerializer_v671 INSTANCE = new ClientboundDebugRendererSerializer_v671(); + + @Override + protected ClientboundDebugRendererType readMarkerType(ByteBuf buffer, BedrockCodecHelper helper) { + return ClientboundDebugRendererType.values()[buffer.readIntLE()]; + } + + @Override + protected void writeMarkerType(ByteBuf buffer, BedrockCodecHelper helper, ClientboundDebugRendererType type) { + buffer.writeIntLE(type.ordinal()); + } +} diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/CorrectPlayerMovePredictionSerializer_v671.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/CorrectPlayerMovePredictionSerializer_v671.java new file mode 100644 index 000000000..cb836e6d1 --- /dev/null +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/CorrectPlayerMovePredictionSerializer_v671.java @@ -0,0 +1,38 @@ +package org.cloudburstmc.protocol.bedrock.codec.v671.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v649.serializer.CorrectPlayerMovePredictionSerializer_v649; +import org.cloudburstmc.protocol.bedrock.data.PredictionType; +import org.cloudburstmc.protocol.bedrock.packet.CorrectPlayerMovePredictionPacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class CorrectPlayerMovePredictionSerializer_v671 extends CorrectPlayerMovePredictionSerializer_v649 { + public static final CorrectPlayerMovePredictionSerializer_v671 INSTANCE = new CorrectPlayerMovePredictionSerializer_v671(); + + private static final PredictionType[] PREDICTION_TYPES = PredictionType.values(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, CorrectPlayerMovePredictionPacket packet) { + buffer.writeByte(packet.getPredictionType().ordinal()); + helper.writeVector3f(buffer, packet.getPosition()); + helper.writeVector3f(buffer, packet.getDelta()); + if (packet.getPredictionType() == PredictionType.VEHICLE) { + helper.writeVector2f(buffer, packet.getVehicleRotation()); + } + buffer.writeBoolean(packet.isOnGround()); + VarInts.writeUnsignedLong(buffer, packet.getTick()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, CorrectPlayerMovePredictionPacket packet) { + packet.setPredictionType(PREDICTION_TYPES[buffer.readUnsignedByte()]); + packet.setPosition(helper.readVector3f(buffer)); + packet.setDelta(helper.readVector3f(buffer)); + if (packet.getPredictionType() == PredictionType.VEHICLE) { + packet.setVehicleRotation(helper.readVector2f(buffer)); + } + packet.setOnGround(buffer.readBoolean()); + packet.setTick(VarInts.readUnsignedInt(buffer)); + } +} diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/CraftingDataSerializer_v671.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/CraftingDataSerializer_v671.java new file mode 100644 index 000000000..f8db02db4 --- /dev/null +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/CraftingDataSerializer_v671.java @@ -0,0 +1,56 @@ +package org.cloudburstmc.protocol.bedrock.codec.v671.serializer; + +import io.netty.buffer.ByteBuf; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v582.serializer.CraftingDataSerializer_v582; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.cloudburstmc.protocol.bedrock.data.inventory.crafting.CraftingDataType; +import org.cloudburstmc.protocol.bedrock.data.inventory.crafting.recipe.ShapedRecipeData; +import org.cloudburstmc.protocol.bedrock.data.inventory.descriptor.ItemDescriptorWithCount; +import org.cloudburstmc.protocol.common.util.VarInts; + +import java.util.List; +import java.util.UUID; + +public class CraftingDataSerializer_v671 extends CraftingDataSerializer_v582 { + public static final CraftingDataSerializer_v671 INSTANCE = new CraftingDataSerializer_v671(); + + @Override + protected void writeShapedRecipe(ByteBuf buffer, BedrockCodecHelper helper, ShapedRecipeData data) { + helper.writeString(buffer, data.getId()); + VarInts.writeInt(buffer, data.getWidth()); + VarInts.writeInt(buffer, data.getHeight()); + int count = data.getWidth() * data.getHeight(); + List inputs = data.getIngredients(); + for (int i = 0; i < count; i++) { + helper.writeIngredient(buffer, inputs.get(i)); + } + helper.writeArray(buffer, data.getResults(), helper::writeItemInstance); + helper.writeUuid(buffer, data.getUuid()); + helper.writeString(buffer, data.getTag()); + VarInts.writeInt(buffer, data.getPriority()); + buffer.writeBoolean(data.isAssumeSymetry()); + VarInts.writeUnsignedInt(buffer, data.getNetId()); + } + + @Override + protected ShapedRecipeData readShapedRecipe(ByteBuf buffer, BedrockCodecHelper helper, CraftingDataType type) { + String recipeId = helper.readString(buffer); + int width = VarInts.readInt(buffer); + int height = VarInts.readInt(buffer); + int inputCount = width * height; + List inputs = new ObjectArrayList<>(inputCount); + for (int i = 0; i < inputCount; i++) { + inputs.add(helper.readIngredient(buffer)); + } + List outputs = new ObjectArrayList<>(); + helper.readArray(buffer, outputs, helper::readItemInstance); + UUID uuid = helper.readUuid(buffer); + String craftingTag = helper.readString(buffer); + int priority = VarInts.readInt(buffer); + boolean assumeSymmetry = buffer.readBoolean(); + int networkId = VarInts.readUnsignedInt(buffer); + return ShapedRecipeData.of(type, recipeId, width, height, inputs, outputs, uuid, craftingTag, priority, networkId, assumeSymmetry); + } +} diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/ResourcePackStackSerializer_v671.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/ResourcePackStackSerializer_v671.java new file mode 100644 index 000000000..913e56bd2 --- /dev/null +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/ResourcePackStackSerializer_v671.java @@ -0,0 +1,22 @@ +package org.cloudburstmc.protocol.bedrock.codec.v671.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v419.serializer.ResourcePackStackSerializer_v419; +import org.cloudburstmc.protocol.bedrock.packet.ResourcePackStackPacket; + +public class ResourcePackStackSerializer_v671 extends ResourcePackStackSerializer_v419 { + public static final ResourcePackStackSerializer_v671 INSTANCE = new ResourcePackStackSerializer_v671(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackStackPacket packet) { + super.serialize(buffer, helper, packet); + buffer.writeBoolean(packet.isHasEditorPacks()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, ResourcePackStackPacket packet) { + super.deserialize(buffer, helper, packet); + packet.setHasEditorPacks(buffer.readBoolean()); + } +} diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/StartGameSerializer_v671.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/StartGameSerializer_v671.java new file mode 100644 index 000000000..798392ca7 --- /dev/null +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/StartGameSerializer_v671.java @@ -0,0 +1,125 @@ +package org.cloudburstmc.protocol.bedrock.codec.v671.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v589.serializer.StartGameSerializer_v589; +import org.cloudburstmc.protocol.bedrock.data.*; +import org.cloudburstmc.protocol.bedrock.packet.StartGamePacket; +import org.cloudburstmc.protocol.common.util.OptionalBoolean; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class StartGameSerializer_v671 extends StartGameSerializer_v589 { + public static final StartGameSerializer_v671 INSTANCE = new StartGameSerializer_v671(); + + @Override + protected void writeLevelSettings(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + writeSeed(buffer, packet.getSeed()); + buffer.writeShortLE(packet.getSpawnBiomeType().ordinal()); + helper.writeString(buffer, packet.getCustomBiomeName()); + VarInts.writeInt(buffer, packet.getDimensionId()); + VarInts.writeInt(buffer, packet.getGeneratorId()); + VarInts.writeInt(buffer, packet.getLevelGameType().ordinal()); + buffer.writeBoolean(packet.isHardcore()); + VarInts.writeInt(buffer, packet.getDifficulty()); + helper.writeBlockPosition(buffer, packet.getDefaultSpawn()); + buffer.writeBoolean(packet.isAchievementsDisabled()); + buffer.writeBoolean(packet.isWorldEditor()); + buffer.writeBoolean(packet.isCreatedInEditor()); + buffer.writeBoolean(packet.isExportedFromEditor()); + VarInts.writeInt(buffer, packet.getDayCycleStopTime()); + VarInts.writeInt(buffer, packet.getEduEditionOffers()); + buffer.writeBoolean(packet.isEduFeaturesEnabled()); + helper.writeString(buffer, packet.getEducationProductionId()); + buffer.writeFloatLE(packet.getRainLevel()); + buffer.writeFloatLE(packet.getLightningLevel()); + buffer.writeBoolean(packet.isPlatformLockedContentConfirmed()); + buffer.writeBoolean(packet.isMultiplayerGame()); + buffer.writeBoolean(packet.isBroadcastingToLan()); + VarInts.writeInt(buffer, packet.getXblBroadcastMode().ordinal()); + VarInts.writeInt(buffer, packet.getPlatformBroadcastMode().ordinal()); + buffer.writeBoolean(packet.isCommandsEnabled()); + buffer.writeBoolean(packet.isTexturePacksRequired()); + helper.writeArray(buffer, packet.getGamerules(), helper::writeGameRule); + helper.writeExperiments(buffer, packet.getExperiments()); + buffer.writeBoolean(packet.isExperimentsPreviouslyToggled()); + buffer.writeBoolean(packet.isBonusChestEnabled()); + buffer.writeBoolean(packet.isStartingWithMap()); + VarInts.writeInt(buffer, packet.getDefaultPlayerPermission().ordinal()); + buffer.writeIntLE(packet.getServerChunkTickRange()); + buffer.writeBoolean(packet.isBehaviorPackLocked()); + buffer.writeBoolean(packet.isResourcePackLocked()); + buffer.writeBoolean(packet.isFromLockedWorldTemplate()); + buffer.writeBoolean(packet.isUsingMsaGamertagsOnly()); + buffer.writeBoolean(packet.isFromWorldTemplate()); + buffer.writeBoolean(packet.isWorldTemplateOptionLocked()); + buffer.writeBoolean(packet.isOnlySpawningV1Villagers()); + buffer.writeBoolean(packet.isDisablingPersonas()); + buffer.writeBoolean(packet.isDisablingCustomSkins()); + buffer.writeBoolean(packet.isEmoteChatMuted()); + helper.writeString(buffer, packet.getVanillaVersion()); + buffer.writeIntLE(packet.getLimitedWorldWidth()); + buffer.writeIntLE(packet.getLimitedWorldHeight()); + buffer.writeBoolean(packet.isNetherType()); + helper.writeString(buffer, packet.getEduSharedUriResource().getButtonName()); + helper.writeString(buffer, packet.getEduSharedUriResource().getLinkUri()); + helper.writeOptional(buffer, OptionalBoolean::isPresent, packet.getForceExperimentalGameplay(), + (buf, optional) -> buf.writeBoolean(optional.getAsBoolean())); + buffer.writeByte(packet.getChatRestrictionLevel().ordinal()); + buffer.writeBoolean(packet.isDisablingPlayerInteractions()); + } + + @Override + protected void readLevelSettings(ByteBuf buffer, BedrockCodecHelper helper, StartGamePacket packet) { + packet.setSeed(readSeed(buffer)); + packet.setSpawnBiomeType(SpawnBiomeType.byId(buffer.readShortLE())); + packet.setCustomBiomeName(helper.readString(buffer)); + packet.setDimensionId(VarInts.readInt(buffer)); + packet.setGeneratorId(VarInts.readInt(buffer)); + packet.setLevelGameType(GameType.from(VarInts.readInt(buffer))); + packet.setHardcore(buffer.readBoolean()); + packet.setDifficulty(VarInts.readInt(buffer)); + packet.setDefaultSpawn(helper.readBlockPosition(buffer)); + packet.setAchievementsDisabled(buffer.readBoolean()); + packet.setWorldEditor(buffer.readBoolean()); + packet.setCreatedInEditor(buffer.readBoolean()); + packet.setExportedFromEditor(buffer.readBoolean()); + packet.setDayCycleStopTime(VarInts.readInt(buffer)); + packet.setEduEditionOffers(VarInts.readInt(buffer)); + packet.setEduFeaturesEnabled(buffer.readBoolean()); + packet.setEducationProductionId(helper.readString(buffer)); + packet.setRainLevel(buffer.readFloatLE()); + packet.setLightningLevel(buffer.readFloatLE()); + packet.setPlatformLockedContentConfirmed(buffer.readBoolean()); + packet.setMultiplayerGame(buffer.readBoolean()); + packet.setBroadcastingToLan(buffer.readBoolean()); + packet.setXblBroadcastMode(GamePublishSetting.byId(VarInts.readInt(buffer))); + packet.setPlatformBroadcastMode(GamePublishSetting.byId(VarInts.readInt(buffer))); + packet.setCommandsEnabled(buffer.readBoolean()); + packet.setTexturePacksRequired(buffer.readBoolean()); + helper.readArray(buffer, packet.getGamerules(), helper::readGameRule); + helper.readExperiments(buffer, packet.getExperiments()); + packet.setExperimentsPreviouslyToggled(buffer.readBoolean()); + packet.setBonusChestEnabled(buffer.readBoolean()); + packet.setStartingWithMap(buffer.readBoolean()); + packet.setDefaultPlayerPermission(PLAYER_PERMISSIONS[VarInts.readInt(buffer)]); + packet.setServerChunkTickRange(buffer.readIntLE()); + packet.setBehaviorPackLocked(buffer.readBoolean()); + packet.setResourcePackLocked(buffer.readBoolean()); + packet.setFromLockedWorldTemplate(buffer.readBoolean()); + packet.setUsingMsaGamertagsOnly(buffer.readBoolean()); + packet.setFromWorldTemplate(buffer.readBoolean()); + packet.setWorldTemplateOptionLocked(buffer.readBoolean()); + packet.setOnlySpawningV1Villagers(buffer.readBoolean()); + packet.setDisablingPersonas(buffer.readBoolean()); + packet.setDisablingCustomSkins(buffer.readBoolean()); + packet.setEmoteChatMuted(buffer.readBoolean()); + packet.setVanillaVersion(helper.readString(buffer)); + packet.setLimitedWorldWidth(buffer.readIntLE()); + packet.setLimitedWorldHeight(buffer.readIntLE()); + packet.setNetherType(buffer.readBoolean()); + packet.setEduSharedUriResource(new EduSharedUriResource(helper.readString(buffer), helper.readString(buffer))); + packet.setForceExperimentalGameplay(helper.readOptional(buffer, OptionalBoolean.empty(), buf -> OptionalBoolean.of(buf.readBoolean()))); + packet.setChatRestrictionLevel(ChatRestrictionLevel.values()[buffer.readByte()]); + packet.setDisablingPlayerInteractions(buffer.readBoolean()); + } +} diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/UpdatePlayerGameTypeSerializer_v671.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/UpdatePlayerGameTypeSerializer_v671.java new file mode 100644 index 000000000..4e8c7e858 --- /dev/null +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/v671/serializer/UpdatePlayerGameTypeSerializer_v671.java @@ -0,0 +1,23 @@ +package org.cloudburstmc.protocol.bedrock.codec.v671.serializer; + +import io.netty.buffer.ByteBuf; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper; +import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.UpdatePlayerGameTypeSerializer_v407; +import org.cloudburstmc.protocol.bedrock.packet.UpdatePlayerGameTypePacket; +import org.cloudburstmc.protocol.common.util.VarInts; + +public class UpdatePlayerGameTypeSerializer_v671 extends UpdatePlayerGameTypeSerializer_v407 { + public static final UpdatePlayerGameTypeSerializer_v671 INSTANCE = new UpdatePlayerGameTypeSerializer_v671(); + + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, UpdatePlayerGameTypePacket packet) { + super.serialize(buffer, helper, packet); + VarInts.writeUnsignedInt(buffer, packet.getTick()); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, UpdatePlayerGameTypePacket packet) { + super.deserialize(buffer, helper, packet); + packet.setTick(VarInts.readUnsignedInt(buffer)); + } +} diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/DisconnectFailReason.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/DisconnectFailReason.java index f37afb1b5..a00d48165 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/DisconnectFailReason.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/DisconnectFailReason.java @@ -109,5 +109,12 @@ public enum DisconnectFailReason { WORLD_TRANSFER_NOT_PRIMARY_CLIENT, SERVER_SHUTDOWN, GAME_SETUP_CANCELLED, - GAME_SETUP_FAILED + GAME_SETUP_FAILED, + NO_VENUE, + CONN_SIGNALING_SIGN_IN_FAILED, + SESSION_ACCESS_DENIED, + SERVICE_SIGN_IN_ISSUE, + CONN_NO_SIGNALING_CHANNEL, + CONN_NOT_LOGGED_IN, + CONN_CLIENT_SIGNALING_ERROR } diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/HudElement.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/HudElement.java index 7994a235f..eee83962f 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/HudElement.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/HudElement.java @@ -11,5 +11,13 @@ public enum HudElement { PROGRESS_BAR, FOOD_BAR, AIR_BUBBLES_BAR, - VEHICLE_HEALTH + VEHICLE_HEALTH, + /** + * @since v671 + */ + EFFECTS_BAR, + /** + * @since v671 + */ + ITEM_TEXT_POPUP } diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ParticleType.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ParticleType.java index 1b26e5223..b838140e5 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ParticleType.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/ParticleType.java @@ -113,5 +113,9 @@ public enum ParticleType implements LevelEventType { /** * @since v662 */ - VAULT_CONNECTION + VAULT_CONNECTION, + /** + * @since v671 + */ + WOLF_ARMOR_BREAK } diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityFlag.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityFlag.java index 55ee189bb..a625f07af 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityFlag.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/entity/EntityFlag.java @@ -113,14 +113,17 @@ public enum EntityFlag { PUSH_TOWARDS_CLOSEST_SPACE, /** * @since v575 + * @deprecated since v671 */ SCENTING, /** * @since v575 + * @deprecated since v671 */ RISING, /** * @since v575 + * @deprecated since v671 */ FEELING_HAPPY, /** @@ -142,5 +145,9 @@ public enum EntityFlag { /** * @since v622 */ - TIMER_FLAG_3 + TIMER_FLAG_3, + /** + * @since v671 + */ + BODY_ROTATION_BLOCKED } diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/recipe/ShapedRecipeData.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/recipe/ShapedRecipeData.java index 45d870120..17c530005 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/recipe/ShapedRecipeData.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/inventory/crafting/recipe/ShapedRecipeData.java @@ -26,23 +26,35 @@ public class ShapedRecipeData implements CraftingRecipeData { private final String tag; private final int priority; private final int netId; + /** + * @since v671 + */ + private final boolean assumeSymetry; public static ShapedRecipeData of(CraftingDataType type, String id, int width, int height, List ingredients, List results, UUID uuid, String tag, int priority, int netId) { checkArgument(type == CraftingDataType.SHAPED || type == CraftingDataType.SHAPED_CHEMISTRY, "type must be SHAPED or SHAPED_CHEMISTRY"); - return new ShapedRecipeData(type, id, width, height, ingredients, results, uuid, tag, priority, netId); + return new ShapedRecipeData(type, id, width, height, ingredients, results, uuid, tag, priority, netId, false); + } + + public static ShapedRecipeData of(CraftingDataType type, String id, int width, int height, + List ingredients, List results, UUID uuid, + String tag, int priority, int netId, boolean assumeSymetry) { + checkArgument(type == CraftingDataType.SHAPED || type == CraftingDataType.SHAPED_CHEMISTRY, + "type must be SHAPED or SHAPED_CHEMISTRY"); + return new ShapedRecipeData(type, id, width, height, ingredients, results, uuid, tag, priority, netId, assumeSymetry); } public static ShapedRecipeData shaped(String id, int width, int height, List ingredients, - List results, UUID uuid, String tag, int priority, int netId) { - return of(CraftingDataType.SHAPED, id, width, height, ingredients, results, uuid, tag, priority, netId); + List results, UUID uuid, String tag, int priority, int netId, boolean assumeSymetry) { + return of(CraftingDataType.SHAPED, id, width, height, ingredients, results, uuid, tag, priority, netId, assumeSymetry); } public static ShapedRecipeData shapedChemistry(String id, int width, int height, List ingredients, List results, - UUID uuid, String tag, int priority, int netId) { - return of(CraftingDataType.SHAPED_CHEMISTRY, id, width, height, ingredients, results, uuid, tag, priority, netId); + UUID uuid, String tag, int priority, int netId, boolean assumeSymetry) { + return of(CraftingDataType.SHAPED_CHEMISTRY, id, width, height, ingredients, results, uuid, tag, priority, netId, assumeSymetry); } } diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CorrectPlayerMovePredictionPacket.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CorrectPlayerMovePredictionPacket.java index 0b4250304..9736e8dc8 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CorrectPlayerMovePredictionPacket.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/CorrectPlayerMovePredictionPacket.java @@ -3,6 +3,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.cloudburstmc.math.vector.Vector2f; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.PredictionType; import org.cloudburstmc.protocol.common.PacketSignal; @@ -54,6 +55,13 @@ public class CorrectPlayerMovePredictionPacket implements BedrockPacket { */ private PredictionType predictionType = PredictionType.PLAYER; + /** + * @since 671 + * + * The rotation of the vehicle. + */ + private Vector2f vehicleRotation; + @Override public PacketSignal handle(BedrockPacketHandler handler) { return handler.handle(this); diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackStackPacket.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackStackPacket.java index 6b042b2c5..5b88c48e7 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackStackPacket.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/ResourcePackStackPacket.java @@ -20,6 +20,10 @@ public class ResourcePackStackPacket implements BedrockPacket { private String gameVersion; private final List experiments = new ObjectArrayList<>(); private boolean experimentsPreviouslyToggled; + /** + * @since v671 + */ + private boolean hasEditorPacks; @Override diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StartGamePacket.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StartGamePacket.java index 7ec588ce5..c754e1d53 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StartGamePacket.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/StartGamePacket.java @@ -170,6 +170,10 @@ public class StartGamePacket implements BedrockPacket { * @since v589 */ private NetworkPermissions networkPermissions = NetworkPermissions.DEFAULT; + /** + * @since v671 + */ + private boolean hardcore; @Override public final PacketSignal handle(BedrockPacketHandler handler) { diff --git a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdatePlayerGameTypePacket.java b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdatePlayerGameTypePacket.java index 17db0a817..28fc6f503 100644 --- a/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdatePlayerGameTypePacket.java +++ b/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/packet/UpdatePlayerGameTypePacket.java @@ -12,6 +12,10 @@ public class UpdatePlayerGameTypePacket implements BedrockPacket { private GameType gameType; private long entityId; + /** + * @since v671 + */ + private int tick; @Override public PacketSignal handle(BedrockPacketHandler handler) {