Skip to content

Commit

Permalink
Implement some serialization better (#812)
Browse files Browse the repository at this point in the history
* Implement some serialization better

* Fix buf naming
  • Loading branch information
AlexProgrammerDE authored May 17, 2024
1 parent 1b80c1b commit 92acb01
Show file tree
Hide file tree
Showing 14 changed files with 98 additions and 211 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,23 @@ public <T> void writeNullable(ByteBuf buf, @Nullable T value, BiConsumer<ByteBuf
}
}

public <T> List<T> readList(ByteBuf buf, Function<ByteBuf, T> reader) {
int size = this.readVarInt(buf);
List<T> list = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
list.add(reader.apply(buf));
}

return list;
}

public <T> void writeList(ByteBuf buf, List<T> value, BiConsumer<ByteBuf, T> writer) {
this.writeVarInt(buf, value.size());
for (T t : value) {
writer.accept(buf, t);
}
}

public <T> Holder<T> readHolder(ByteBuf buf, Function<ByteBuf, T> readCustom) {
int registryId = this.readVarInt(buf);
return registryId == 0 ? Holder.ofCustom(readCustom.apply(buf)) : Holder.ofId(registryId - 1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import org.geysermc.mcprotocollib.protocol.codec.MinecraftPacket;
import org.geysermc.mcprotocollib.protocol.data.game.RegistryEntry;

import java.util.ArrayList;
import java.util.List;

@Data
Expand All @@ -20,22 +19,15 @@ public class ClientboundRegistryDataPacket implements MinecraftPacket {

public ClientboundRegistryDataPacket(ByteBuf in, MinecraftCodecHelper helper) {
this.registry = helper.readResourceLocation(in);
this.entries = new ArrayList<>();

int entryCount = helper.readVarInt(in);
for (int i = 0; i < entryCount; i++) {
this.entries.add(new RegistryEntry(helper.readResourceLocation(in), helper.readNullable(in, helper::readCompoundTag)));
}
this.entries = helper.readList(in, buf -> new RegistryEntry(helper.readResourceLocation(buf), helper.readNullable(buf, helper::readCompoundTag)));
}

@Override
public void serialize(ByteBuf out, MinecraftCodecHelper helper) {
helper.writeResourceLocation(out, this.registry);

helper.writeVarInt(out, this.entries.size());
for (RegistryEntry entry : this.entries) {
helper.writeResourceLocation(out, entry.getId());
helper.writeNullable(out, entry.getData(), helper::writeAnyTag);
}
helper.writeList(out, this.entries, (buf, entry) -> {
helper.writeResourceLocation(buf, entry.getId());
helper.writeNullable(buf, entry.getData(), helper::writeAnyTag);
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import org.geysermc.mcprotocollib.protocol.codec.MinecraftPacket;
import org.geysermc.mcprotocollib.protocol.data.game.KnownPack;

import java.util.ArrayList;
import java.util.List;

@Data
Expand All @@ -18,20 +17,15 @@ public class ClientboundSelectKnownPacks implements MinecraftPacket {
private final List<KnownPack> knownPacks;

public ClientboundSelectKnownPacks(ByteBuf in, MinecraftCodecHelper helper) {
this.knownPacks = new ArrayList<>();
int entryCount = helper.readVarInt(in);
for (int i = 0; i < entryCount; i++) {
this.knownPacks.add(new KnownPack(helper.readString(in), helper.readString(in), helper.readString(in)));
}
this.knownPacks = helper.readList(in, buf -> new KnownPack(helper.readString(buf), helper.readString(buf), helper.readString(buf)));
}

@Override
public void serialize(ByteBuf out, MinecraftCodecHelper helper) {
helper.writeVarInt(out, this.knownPacks.size());
for (KnownPack entry : this.knownPacks) {
helper.writeString(out, entry.getNamespace());
helper.writeString(out, entry.getId());
helper.writeString(out, entry.getVersion());
}
helper.writeList(out, this.knownPacks, (buf, entry) -> {
helper.writeString(buf, entry.getNamespace());
helper.writeString(buf, entry.getId());
helper.writeString(buf, entry.getVersion());
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,11 @@ public class ClientboundPlayerChatPacket implements MinecraftPacket {
public ClientboundPlayerChatPacket(ByteBuf in, MinecraftCodecHelper helper) {
this.sender = helper.readUUID(in);
this.index = helper.readVarInt(in);
if (in.readBoolean()) {
this.messageSignature = new byte[256];
in.readBytes(this.messageSignature);
} else {
this.messageSignature = null;
}
this.messageSignature = helper.readNullable(in, buf -> {
byte[] signature = new byte[256];
buf.readBytes(signature);
return signature;
});

this.content = helper.readString(in, 256);
this.timeStamp = in.readLong();
Expand All @@ -67,10 +66,7 @@ public ClientboundPlayerChatPacket(ByteBuf in, MinecraftCodecHelper helper) {
public void serialize(ByteBuf out, MinecraftCodecHelper helper) {
helper.writeUUID(out, this.sender);
helper.writeVarInt(out, this.index);
out.writeBoolean(this.messageSignature != null);
if (this.messageSignature != null) {
out.writeBytes(this.messageSignature);
}
helper.writeNullable(out, this.messageSignature, ByteBuf::writeBytes);

helper.writeString(out, this.content);
out.writeLong(this.timeStamp);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.geysermc.mcprotocollib.protocol.codec.MinecraftCodecHelper;
import org.geysermc.mcprotocollib.protocol.codec.MinecraftPacket;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

Expand All @@ -18,17 +17,10 @@ public class ClientboundPlayerInfoRemovePacket implements MinecraftPacket {
private final List<UUID> profileIds;

public ClientboundPlayerInfoRemovePacket(ByteBuf in, MinecraftCodecHelper helper) {
this.profileIds = new ArrayList<>();
int numIds = helper.readVarInt(in);
for (int i = 0; i < numIds; i++) {
this.profileIds.add(helper.readUUID(in));
}
this.profileIds = helper.readList(in, helper::readUUID);
}

public void serialize(ByteBuf out, MinecraftCodecHelper helper) {
helper.writeVarInt(out, this.profileIds.size());
for (UUID id : this.profileIds) {
helper.writeUUID(out, id);
}
helper.writeList(out, this.profileIds, helper::writeUUID);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;

@Data
@With
Expand All @@ -36,13 +34,7 @@ public ClientboundPlayerInfoUpdatePacket(ByteBuf in, MinecraftCodecHelper helper
switch (action) {
case ADD_PLAYER -> {
GameProfile profile = new GameProfile(entry.getProfileId(), helper.readString(in, 16));
int propertyCount = helper.readVarInt(in);
List<GameProfile.Property> propertyList = new ArrayList<>();
for (int index = 0; index < propertyCount; index++) {
propertyList.add(helper.readProperty(in));
}

profile.setProperties(propertyList);
profile.setProperties(helper.readList(in, helper::readProperty));

entry.setProfile(profile);
}
Expand Down Expand Up @@ -104,10 +96,7 @@ public void serialize(ByteBuf out, MinecraftCodecHelper helper) {
}

helper.writeString(out, profile.getName());
helper.writeVarInt(out, profile.getProperties().size());
for (GameProfile.Property property : profile.getProperties()) {
helper.writeProperty(out, property);
}
helper.writeList(out, profile.getProperties(), helper::writeProperty);
}
case INITIALIZE_CHAT -> {
out.writeBoolean(entry.getPublicKey() != null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,22 @@
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.With;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.mcprotocollib.protocol.codec.MinecraftCodecHelper;
import org.geysermc.mcprotocollib.protocol.codec.MinecraftPacket;

@Data
@With
@AllArgsConstructor
public class ClientboundSelectAdvancementsTabPacket implements MinecraftPacket {
private final String tabId;
private final @Nullable String tabId;

public ClientboundSelectAdvancementsTabPacket(ByteBuf in, MinecraftCodecHelper helper) {
if (in.readBoolean()) {
this.tabId = helper.readString(in);
} else {
this.tabId = null;
}
this.tabId = helper.readNullable(in, helper::readString);
}

@Override
public void serialize(ByteBuf out, MinecraftCodecHelper helper) {
if (this.tabId != null) {
out.writeBoolean(true);
helper.writeString(out, this.tabId);
} else {
out.writeBoolean(false);
}
helper.writeNullable(out, this.tabId, helper::writeString);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import org.geysermc.mcprotocollib.protocol.data.game.advancement.Advancement.DisplayData.AdvancementType;
import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -51,36 +50,25 @@ public ClientboundUpdateAdvancementsPacket(ByteBuf in, MinecraftCodecHelper help
for (int i = 0; i < this.advancements.length; i++) {
String id = helper.readString(in);
String parentId = helper.readNullable(in, helper::readString);
DisplayData displayData = null;
if (in.readBoolean()) {
Component title = helper.readComponent(in);
Component description = helper.readComponent(in);
ItemStack icon = helper.readOptionalItemStack(in);
AdvancementType advancementType = AdvancementType.from(helper.readVarInt(in));

int flags = in.readInt();
DisplayData displayData = helper.readNullable(in, buf -> {
Component title = helper.readComponent(buf);
Component description = helper.readComponent(buf);
ItemStack icon = helper.readOptionalItemStack(buf);
AdvancementType advancementType = AdvancementType.from(helper.readVarInt(buf));

int flags = buf.readInt();
boolean hasBackgroundTexture = (flags & FLAG_HAS_BACKGROUND_TEXTURE) != 0;
boolean showToast = (flags & FLAG_SHOW_TOAST) != 0;
boolean hidden = (flags & FLAG_HIDDEN) != 0;

String backgroundTexture = hasBackgroundTexture ? helper.readString(in) : null;
float posX = in.readFloat();
float posY = in.readFloat();

displayData = new DisplayData(title, description, icon, advancementType, showToast, hidden, posX, posY, backgroundTexture);
}
String backgroundTexture = hasBackgroundTexture ? helper.readString(buf) : null;
float posX = buf.readFloat();
float posY = buf.readFloat();

List<List<String>> requirements = new ArrayList<>();
int requirementCount = helper.readVarInt(in);
for (int j = 0; j < requirementCount; j++) {
List<String> requirement = new ArrayList<>();
int componentCount = helper.readVarInt(in);
for (int k = 0; k < componentCount; k++) {
requirement.add(helper.readString(in));
}
return new DisplayData(title, description, icon, advancementType, showToast, hidden, posX, posY, backgroundTexture);
});

requirements.add(requirement);
}
List<List<String>> requirements = helper.readList(in, buf -> helper.readList(buf, helper::readString));

boolean sendTelemetryEvent = in.readBoolean();

Expand Down Expand Up @@ -123,47 +111,36 @@ public void serialize(ByteBuf out, MinecraftCodecHelper helper) {
out.writeBoolean(false);
}

DisplayData displayData = advancement.getDisplayData();
if (displayData != null) {
out.writeBoolean(true);
helper.writeComponent(out, displayData.getTitle());
helper.writeComponent(out, displayData.getDescription());
helper.writeOptionalItemStack(out, displayData.getIcon());
helper.writeVarInt(out, displayData.getAdvancementType().ordinal());
String backgroundTexture = displayData.getBackgroundTexture();
helper.writeNullable(out, advancement.getDisplayData(), (buf, data) -> {
helper.writeComponent(buf, data.getTitle());
helper.writeComponent(buf, data.getDescription());
helper.writeOptionalItemStack(buf, data.getIcon());
helper.writeVarInt(buf, data.getAdvancementType().ordinal());

int flags = 0;
if (backgroundTexture != null) {
if (data.getBackgroundTexture() != null) {
flags |= FLAG_HAS_BACKGROUND_TEXTURE;
}

if (displayData.isShowToast()) {
if (data.isShowToast()) {
flags |= FLAG_SHOW_TOAST;
}

if (displayData.isHidden()) {
if (data.isHidden()) {
flags |= FLAG_HIDDEN;
}

out.writeInt(flags);
buf.writeInt(flags);

if (backgroundTexture != null) {
helper.writeString(out, backgroundTexture);
if (data.getBackgroundTexture() != null) {
helper.writeString(buf, data.getBackgroundTexture());
}

out.writeFloat(displayData.getPosX());
out.writeFloat(displayData.getPosY());
} else {
out.writeBoolean(false);
}
buf.writeFloat(data.getPosX());
buf.writeFloat(data.getPosY());
});

helper.writeVarInt(out, advancement.getRequirements().size());
for (List<String> requirement : advancement.getRequirements()) {
helper.writeVarInt(out, requirement.size());
for (String criterion : requirement) {
helper.writeString(out, criterion);
}
}
helper.writeList(out, advancement.getRequirements(), (buf, requirement) -> helper.writeList(buf, requirement, helper::writeString));

out.writeBoolean(advancement.isSendsTelemetryEvent());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.geysermc.mcprotocollib.protocol.codec.MinecraftPacket;
import org.geysermc.mcprotocollib.protocol.data.game.chunk.ChunkBiomeData;

import java.util.ArrayList;
import java.util.List;

@Data
Expand All @@ -16,22 +15,18 @@ public class ClientboundChunksBiomesPacket implements MinecraftPacket {
private final List<ChunkBiomeData> chunkBiomeData;

public ClientboundChunksBiomesPacket(ByteBuf in, MinecraftCodecHelper helper) {
this.chunkBiomeData = new ArrayList<>();

int length = helper.readVarInt(in);
for (int i = 0; i < length; i++) {
long raw = in.readLong();
this.chunkBiomeData.add(new ChunkBiomeData((int) raw, (int) (raw >> 32), helper.readByteArray(in)));
}
this.chunkBiomeData = helper.readList(in, buf -> {
long raw = buf.readLong();
return new ChunkBiomeData((int) raw, (int) (raw >> 32), helper.readByteArray(buf));
});
}

@Override
public void serialize(ByteBuf out, MinecraftCodecHelper helper) {
helper.writeVarInt(out, this.chunkBiomeData.size());
for (ChunkBiomeData entry : this.chunkBiomeData) {
helper.writeList(out, this.chunkBiomeData, (buf, entry) -> {
long raw = (long) entry.getX() & 0xFFFFFFFFL | ((long) entry.getZ() & 0xFFFFFFFFL) << 32;
out.writeLong(raw);
helper.writeByteArray(out, entry.getBuffer());
}
buf.writeLong(raw);
helper.writeByteArray(buf, entry.getBuffer());
});
}
}
Loading

0 comments on commit 92acb01

Please sign in to comment.