Most client packets are writtable, same for server packets and readability

This commit is contained in:
jglrxavpok 2021-02-18 23:24:34 +01:00
parent 43957805fd
commit 07ab4ac090
77 changed files with 1202 additions and 99 deletions

View File

@ -2,45 +2,54 @@ package net.minestom.server.entity;
import net.kyori.adventure.text.Component;
import net.minestom.server.adventure.AdventureSerializer;
import net.minestom.server.MinecraftServer;
import net.minestom.server.chat.ColoredText;
import net.minestom.server.chat.JsonMessage;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.server.play.EntityMetaDataPacket;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.Direction;
import net.minestom.server.utils.Position;
import net.minestom.server.utils.Vector;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.binary.Readable;
import net.minestom.server.utils.binary.Writeable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jglrxavpok.hephaistos.nbt.NBT;
import org.jglrxavpok.hephaistos.nbt.NBTEnd;
import org.jglrxavpok.hephaistos.nbt.NBTException;
import java.util.*;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Function;
public class Metadata {
// METADATA TYPES
public static Value<Byte> Byte(byte value) {
return new Value<>(TYPE_BYTE, value, writer -> writer.writeByte(value));
return new Value<>(TYPE_BYTE, value, writer -> writer.writeByte(value), BinaryReader::readByte);
}
public static Value<Integer> VarInt(int value) {
return new Value<>(TYPE_VARINT, value, writer -> writer.writeVarInt(value));
return new Value<>(TYPE_VARINT, value, writer -> writer.writeVarInt(value), BinaryReader::readVarInt);
}
public static Value<Float> Float(float value) {
return new Value<>(TYPE_FLOAT, value, writer -> writer.writeFloat(value));
return new Value<>(TYPE_FLOAT, value, writer -> writer.writeFloat(value), BinaryReader::readFloat);
}
public static Value<String> String(@NotNull String value) {
return new Value<>(TYPE_STRING, value, writer -> writer.writeSizedString(value));
return new Value<>(TYPE_STRING, value, writer -> writer.writeSizedString(value), reader -> reader.readSizedString(Integer.MAX_VALUE));
}
@Deprecated
public static Value<JsonMessage> Chat(@NotNull JsonMessage value) {
return new Value<>(TYPE_CHAT, value, writer -> writer.writeSizedString(value.toString()));
return new Value<>(TYPE_CHAT, value, writer -> writer.writeSizedString(value.toString()), reader -> reader.readJsonMessage(Integer.MAX_VALUE));
}
@Deprecated
@ -51,11 +60,19 @@ public class Metadata {
if (present) {
writer.writeSizedString(value.toString());
}
},
reader -> {
boolean present = reader.readBoolean();
if(present) {
return reader.readJsonMessage(Integer.MAX_VALUE);
} else {
return null;
}
});
}
public static Value<Component> Chat(@NotNull Component value) {
return new Value<>(TYPE_CHAT, value, writer -> writer.writeSizedString(AdventureSerializer.serialize(value)));
return new Value<>(TYPE_CHAT, value, writer -> writer.writeSizedString(AdventureSerializer.serialize(value)), reader -> reader.readComponent(Integer.MAX_VALUE));
}
public static Value<Component> OptChat(@Nullable Component value) {
@ -65,15 +82,21 @@ public class Metadata {
if (present) {
writer.writeSizedString(AdventureSerializer.serialize(value));
}
}, reader -> {
boolean present = reader.readBoolean();
if(present) {
return reader.readComponent(Integer.MAX_VALUE);
}
return null;
});
}
public static Value<ItemStack> Slot(@NotNull ItemStack value) {
return new Value<>(TYPE_SLOT, value, writer -> writer.writeItemStack(value));
return new Value<>(TYPE_SLOT, value, writer -> writer.writeItemStack(value), BinaryReader::readItemStack);
}
public static Value<Boolean> Boolean(boolean value) {
return new Value<>(TYPE_BOOLEAN, value, writer -> writer.writeBoolean(value));
return new Value<>(TYPE_BOOLEAN, value, writer -> writer.writeBoolean(value), BinaryReader::readBoolean);
}
public static Value<Vector> Rotation(@NotNull Vector value) {
@ -81,11 +104,11 @@ public class Metadata {
writer.writeFloat((float) value.getX());
writer.writeFloat((float) value.getY());
writer.writeFloat((float) value.getZ());
});
}, reader -> new Vector(reader.readFloat(), reader.readFloat(), reader.readFloat()));
}
public static Value<BlockPosition> Position(@NotNull BlockPosition value) {
return new Value<>(TYPE_POSITION, value, writer -> writer.writeBlockPosition(value));
return new Value<>(TYPE_POSITION, value, writer -> writer.writeBlockPosition(value), BinaryReader::readBlockPosition);
}
public static Value<BlockPosition> OptPosition(@Nullable BlockPosition value) {
@ -95,11 +118,18 @@ public class Metadata {
if (present) {
writer.writeBlockPosition(value);
}
}, reader -> {
boolean present = reader.readBoolean();
if(present) {
return reader.readBlockPosition();
} else {
return null;
}
});
}
public static Value<Direction> Direction(@NotNull Direction value) {
return new Value<>(TYPE_DIRECTION, value, writer -> writer.writeVarInt(value.ordinal()));
return new Value<>(TYPE_DIRECTION, value, writer -> writer.writeVarInt(value.ordinal()), reader -> Direction.values()[reader.readVarInt()]);
}
public static Value<UUID> OptUUID(@Nullable UUID value) {
@ -109,6 +139,13 @@ public class Metadata {
if (present) {
writer.writeUuid(value);
}
}, reader -> {
boolean present = reader.readBoolean();
if(present) {
return reader.readUuid();
} else {
return null;
}
});
}
@ -116,11 +153,27 @@ public class Metadata {
return new Value<>(TYPE_OPTBLOCKID, value, writer -> {
final boolean present = value != null;
writer.writeVarInt(present ? value : 0);
}, reader -> {
boolean present = reader.readBoolean();
if(present) {
return reader.readVarInt();
} else {
return null;
}
});
}
public static Value<NBT> NBT(@NotNull NBT nbt) {
return new Value<>(TYPE_NBT, nbt, writer -> writer.writeNBT("", nbt));
return new Value<>(TYPE_NBT, nbt, writer -> {
writer.writeNBT("", nbt);
}, reader -> {
try {
return reader.readTag();
} catch (IOException | NBTException e) {
MinecraftServer.getExceptionManager().handleException(e);
return null;
}
});
}
public static Value<int[]> VillagerData(int villagerType,
@ -130,6 +183,10 @@ public class Metadata {
writer.writeVarInt(villagerType);
writer.writeVarInt(villagerProfession);
writer.writeVarInt(level);
}, reader -> new int[] {
reader.readVarInt(),
reader.readVarInt(),
reader.readVarInt()
});
}
@ -137,11 +194,18 @@ public class Metadata {
return new Value<>(TYPE_OPTVARINT, value, writer -> {
final boolean present = value != null;
writer.writeVarInt(present ? value + 1 : 0);
}, reader -> {
boolean present = reader.readBoolean();
if(present) {
return reader.readVarInt();
} else {
return null;
}
});
}
public static Value<Entity.Pose> Pose(@NotNull Entity.Pose value) {
return new Value<>(TYPE_POSE, value, writer -> writer.writeVarInt(value.ordinal()));
return new Value<>(TYPE_POSE, value, writer -> writer.writeVarInt(value.ordinal()), reader -> Entity.Pose.values()[reader.readVarInt()]);
}
public static final byte TYPE_BYTE = 0;
@ -236,14 +300,20 @@ public class Metadata {
public static class Entry<T> implements Writeable {
protected final byte index;
protected final Value<T> value;
protected byte index;
protected Value<T> value;
public Entry(byte index, @NotNull Value<T> value) {
this.index = index;
this.value = value;
}
public Entry(BinaryReader reader) {
this.index = reader.readByte();
int type = reader.readVarInt();
value = Metadata.read(type, reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(index);
@ -260,16 +330,70 @@ public class Metadata {
}
}
public static class Value<T> implements Writeable {
private static <T> Value<T> getCorrespondingNewEmptyValue(int type) {
switch(type) {
case TYPE_BYTE:
return (Value<T>) Byte((byte) 0);
case TYPE_VARINT:
return (Value<T>) VarInt(0);
case TYPE_FLOAT:
return (Value<T>) Float(0);
case TYPE_STRING:
return (Value<T>) String("");
case TYPE_CHAT:
return (Value<T>) Chat(ColoredText.of(""));
case TYPE_OPTCHAT:
return (Value<T>) OptChat((Component) null);
case TYPE_SLOT:
return (Value<T>) Slot(ItemStack.getAirItem());
case TYPE_BOOLEAN:
return (Value<T>) Boolean(false);
case TYPE_ROTATION:
return (Value<T>) Rotation(new Vector());
case TYPE_POSITION:
return (Value<T>) Position(new BlockPosition(0,0,0));
case TYPE_OPTPOSITION:
return (Value<T>) OptPosition(null);
case TYPE_DIRECTION:
return (Value<T>) Direction(Direction.DOWN);
case TYPE_OPTUUID:
return (Value<T>) OptUUID(null);
case TYPE_OPTBLOCKID:
return (Value<T>) OptBlockID(null);
case TYPE_NBT:
return (Value<T>) NBT(new NBTEnd());
case TYPE_PARTICLE:
throw new UnsupportedOperationException();
case TYPE_VILLAGERDATA:
return (Value<T>) VillagerData(0,0,0);
case TYPE_OPTVARINT:
return (Value<T>) OptVarInt(null);
case TYPE_POSE:
return (Value<T>) Pose(Entity.Pose.STANDING);
default:
throw new UnsupportedOperationException();
}
}
private static <T> Value<T> read(int type, BinaryReader reader) {
Value<T> value = getCorrespondingNewEmptyValue(type);
value.read(reader);
return value;
}
public static class Value<T> implements Writeable, Readable {
protected final int type;
protected final T value;
protected T value;
protected final Consumer<BinaryWriter> valueWriter;
protected final Function<BinaryReader, T> readingFunction;
public Value(int type, T value, @NotNull Consumer<BinaryWriter> valueWriter) {
public Value(int type, T value, @NotNull Consumer<BinaryWriter> valueWriter, @NotNull Function<BinaryReader, T> readingFunction) {
this.type = type;
this.value = value;
this.valueWriter = valueWriter;
this.readingFunction = readingFunction;
}
@Override
@ -278,6 +402,12 @@ public class Metadata {
this.valueWriter.accept(writer);
}
@Override
public void read(@NotNull BinaryReader reader) {
// skip type, will be read somewhere else
value = readingFunction.apply(reader);
}
public int getType() {
return type;
}

View File

@ -71,7 +71,7 @@ public class FakePlayerController {
public void closeWindow() {
Inventory openInventory = fakePlayer.getOpenInventory();
ClientCloseWindow closeWindow = new ClientCloseWindow();
ClientCloseWindowPacket closeWindow = new ClientCloseWindowPacket();
closeWindow.windowId = openInventory == null ? 0 : openInventory.getWindowId();
addToQueue(closeWindow);
}

View File

@ -7,7 +7,7 @@ import net.minestom.server.inventory.InventoryClickHandler;
import net.minestom.server.inventory.PlayerInventory;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.client.play.ClientClickWindowPacket;
import net.minestom.server.network.packet.client.play.ClientCloseWindow;
import net.minestom.server.network.packet.client.play.ClientCloseWindowPacket;
import net.minestom.server.network.packet.client.play.ClientWindowConfirmationPacket;
import net.minestom.server.network.packet.server.play.SetSlotPacket;
import net.minestom.server.network.packet.server.play.WindowConfirmationPacket;
@ -96,7 +96,7 @@ public class WindowListener {
player.getPlayerConnection().sendPacket(windowConfirmationPacket);
}
public static void closeWindowListener(ClientCloseWindow packet, Player player) {
public static void closeWindowListener(ClientCloseWindowPacket packet, Player player) {
// if windowId == 0 then it is player's inventory, meaning that they hadn't been any open inventory packet
InventoryCloseEvent inventoryCloseEvent = new InventoryCloseEvent(player.getOpenInventory(), player);
player.callEvent(InventoryCloseEvent.class, inventoryCloseEvent);

View File

@ -27,7 +27,7 @@ public final class PacketListenerManager {
setListener(ClientKeepAlivePacket.class, KeepAliveListener::listener);
setListener(ClientChatMessagePacket.class, ChatMessageListener::listener);
setListener(ClientClickWindowPacket.class, WindowListener::clickWindowListener);
setListener(ClientCloseWindow.class, WindowListener::closeWindowListener);
setListener(ClientCloseWindowPacket.class, WindowListener::closeWindowListener);
setListener(ClientWindowConfirmationPacket.class, WindowListener::windowConfirmationListener);
setListener(ClientEntityActionPacket.class, EntityActionListener::listener);
setListener(ClientHeldItemChangePacket.class, PlayerHeldListener::heldListener);

View File

@ -14,7 +14,7 @@ public class ClientPlayPacketsHandler extends ClientPacketsHandler {
register(0x07, ClientWindowConfirmationPacket::new);
register(0x08, ClientClickWindowButtonPacket::new);
register(0x09, ClientClickWindowPacket::new);
register(0x0A, ClientCloseWindow::new);
register(0x0A, ClientCloseWindowPacket::new);
register(0x0B, ClientPluginMessagePacket::new);
register(0x0C, ClientEditBookPacket::new);
register(0x0D, ClientQueryEntityNbtPacket::new);

View File

@ -3,12 +3,13 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.advancements.AdvancementAction;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientAdvancementTabPacket extends ClientPlayPacket {
public AdvancementAction action;
public String tabIdentifier;
public AdvancementAction action = AdvancementAction.OPENED_TAB;
public String tabIdentifier = "";
@Override
public void read(@NotNull BinaryReader reader) {
@ -19,4 +20,15 @@ public class ClientAdvancementTabPacket extends ClientPlayPacket {
}
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(action.ordinal());
if(action == AdvancementAction.OPENED_TAB) {
if(tabIdentifier.length() > 256) {
throw new IllegalArgumentException("Tab identifier cannot be longer than 256 characters.");
}
writer.writeSizedString(tabIdentifier);
}
}
}

View File

@ -3,14 +3,20 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.entity.Player;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientAnimationPacket extends ClientPlayPacket {
public Player.Hand hand;
public Player.Hand hand = Player.Hand.MAIN;
@Override
public void read(@NotNull BinaryReader reader) {
this.hand = Player.Hand.values()[reader.readVarInt()];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(hand.ordinal());
}
}

View File

@ -2,14 +2,23 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientChatMessagePacket extends ClientPlayPacket {
public String message;
public String message = "";
@Override
public void read(@NotNull BinaryReader reader) {
this.message = reader.readSizedString(256);
}
@Override
public void write(@NotNull BinaryWriter writer) {
if(message.length() > 256) {
throw new IllegalArgumentException("Message cannot be more than 256 characters long.");
}
writer.writeSizedString(message);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientClickWindowButtonPacket extends ClientPlayPacket {
@ -14,4 +15,10 @@ public class ClientClickWindowButtonPacket extends ClientPlayPacket {
this.windowId = reader.readByte();
this.buttonId = reader.readByte();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(windowId);
writer.writeByte(buttonId);
}
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientClickWindowPacket extends ClientPlayPacket {
@ -12,7 +13,7 @@ public class ClientClickWindowPacket extends ClientPlayPacket {
public byte button;
public short actionNumber;
public int mode;
public ItemStack item;
public ItemStack item = ItemStack.getAirItem();
@Override
public void read(@NotNull BinaryReader reader) {
@ -23,4 +24,14 @@ public class ClientClickWindowPacket extends ClientPlayPacket {
this.mode = reader.readVarInt();
this.item = reader.readItemStack();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(windowId);
writer.writeShort(slot);
writer.writeByte(button);
writer.writeShort(actionNumber);
writer.writeVarInt(mode);
writer.writeItemStack(item);
}
}

View File

@ -2,9 +2,10 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientCloseWindow extends ClientPlayPacket {
public class ClientCloseWindowPacket extends ClientPlayPacket {
public int windowId;
@ -12,4 +13,9 @@ public class ClientCloseWindow extends ClientPlayPacket {
public void read(@NotNull BinaryReader reader) {
this.windowId = reader.readVarInt();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(windowId);
}
}

View File

@ -2,12 +2,13 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientCraftRecipeRequest extends ClientPlayPacket {
public byte windowId;
public String recipe;
public String recipe = "";
public boolean makeAll;
@Override
@ -16,4 +17,14 @@ public class ClientCraftRecipeRequest extends ClientPlayPacket {
this.recipe = reader.readSizedString(256);
this.makeAll = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(windowId);
if(recipe.length() > 256) {
throw new IllegalArgumentException("'recipe' cannot be longer than 256 characters.");
}
writer.writeSizedString(recipe);
writer.writeBoolean(makeAll);
}
}

View File

@ -3,16 +3,23 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientCreativeInventoryActionPacket extends ClientPlayPacket {
public short slot;
public ItemStack item;
public ItemStack item = ItemStack.getAirItem();
@Override
public void read(@NotNull BinaryReader reader) {
this.slot = reader.readShort();
this.item = reader.readItemStack();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeShort(slot);
writer.writeItemStack(item);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientHeldItemChangePacket extends ClientPlayPacket {
@ -12,4 +13,9 @@ public class ClientHeldItemChangePacket extends ClientPlayPacket {
public void read(@NotNull BinaryReader reader) {
this.slot = reader.readShort();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeShort(slot);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientKeepAlivePacket extends ClientPlayPacket {
@ -12,4 +13,9 @@ public class ClientKeepAlivePacket extends ClientPlayPacket {
public void read(@NotNull BinaryReader reader) {
this.id = reader.readLong();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeLong(id);
}
}

View File

@ -2,14 +2,23 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientNameItemPacket extends ClientPlayPacket {
public String itemName;
public String itemName = "";
@Override
public void read(@NotNull BinaryReader reader) {
this.itemName = reader.readSizedString(Short.MAX_VALUE);
}
@Override
public void write(@NotNull BinaryWriter writer) {
if(itemName.length() > Short.MAX_VALUE) {
throw new IllegalArgumentException("Item name cannot be longer than Short.MAX_VALUE characters!");
}
writer.writeSizedString(itemName);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientPickItemPacket extends ClientPlayPacket {
@ -12,4 +13,9 @@ public class ClientPickItemPacket extends ClientPlayPacket {
public void read(@NotNull BinaryReader reader) {
this.slotToUse = reader.readVarInt();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(slotToUse);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientPlayerPacket extends ClientPlayPacket {
@ -12,4 +13,9 @@ public class ClientPlayerPacket extends ClientPlayPacket {
public void read(@NotNull BinaryReader reader) {
this.onGround = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBoolean(onGround);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientPlayerPositionAndRotationPacket extends ClientPlayPacket {
@ -21,4 +22,16 @@ public class ClientPlayerPositionAndRotationPacket extends ClientPlayPacket {
this.onGround = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeDouble(x);
writer.writeDouble(y);
writer.writeDouble(z);
writer.writeFloat(yaw);
writer.writeFloat(pitch);
writer.writeBoolean(onGround);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientPlayerPositionPacket extends ClientPlayPacket {
@ -17,4 +18,13 @@ public class ClientPlayerPositionPacket extends ClientPlayPacket {
this.onGround = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeDouble(x);
writer.writeDouble(y);
writer.writeDouble(z);
writer.writeBoolean(onGround);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientPlayerRotationPacket extends ClientPlayPacket {
@ -15,4 +16,11 @@ public class ClientPlayerRotationPacket extends ClientPlayPacket {
this.pitch = reader.readFloat();
this.onGround = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeFloat(yaw);
writer.writeFloat(pitch);
writer.writeBoolean(onGround);
}
}

View File

@ -2,16 +2,25 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientPluginMessagePacket extends ClientPlayPacket {
public String channel;
public byte[] data;
public String channel = "";
public byte[] data = new byte[0];
@Override
public void read(@NotNull BinaryReader reader) {
this.channel = reader.readSizedString(256);
this.data = reader.getRemainingBytes();
this.data = reader.readRemainingBytes();
}
@Override
public void write(@NotNull BinaryWriter writer) {
if(channel.length() > 256)
throw new IllegalArgumentException("Channel cannot be more than 256 characters long");
writer.writeSizedString(channel);
writer.writeBytes(data);
}
}

View File

@ -3,16 +3,23 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientQueryBlockNbtPacket extends ClientPlayPacket {
public int transactionId;
public BlockPosition blockPosition;
public BlockPosition blockPosition = new BlockPosition(0,0,0);
@Override
public void read(@NotNull BinaryReader reader) {
this.transactionId = reader.readVarInt();
this.blockPosition = reader.readBlockPosition();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(transactionId);
writer.writeBlockPosition(blockPosition);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientQueryEntityNbtPacket extends ClientPlayPacket {
@ -14,4 +15,10 @@ public class ClientQueryEntityNbtPacket extends ClientPlayPacket {
this.transactionId = reader.readVarInt();
this.entityId = reader.readVarInt();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(transactionId);
writer.writeVarInt(entityId);
}
}

View File

@ -2,13 +2,14 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientRecipeBookData extends ClientPlayPacket {
public int type;
public String recipeId;
public String recipeId = "";
public boolean craftingRecipeBookOpen;
public boolean craftingRecipeFilterActive;
@ -39,4 +40,28 @@ public class ClientRecipeBookData extends ClientPlayPacket {
break;
}
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(type);
switch (type) {
case 0:
if(recipeId.length() > 256)
throw new IllegalArgumentException("recipeId must be less than 256 bytes");
writer.writeSizedString(recipeId);
break;
case 1:
writer.writeBoolean(this.craftingRecipeBookOpen);
writer.writeBoolean(this.craftingRecipeFilterActive);
writer.writeBoolean(this.smeltingRecipeBookOpen);
writer.writeBoolean(this.smeltingRecipeFilterActive);
writer.writeBoolean(this.blastingRecipeBookOpen);
writer.writeBoolean(this.blastingRecipeFilterActive);
writer.writeBoolean(this.smokingRecipeBookOpen);
writer.writeBoolean(this.smokingRecipeFilterActive);
break;
}
}
}

View File

@ -3,15 +3,20 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.resourcepack.ResourcePackStatus;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientResourcePackStatusPacket extends ClientPlayPacket {
public ResourcePackStatus result;
public ResourcePackStatus result = ResourcePackStatus.SUCCESS;
@Override
public void read(@NotNull BinaryReader reader) {
this.result = ResourcePackStatus.values()[reader.readVarInt()];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(result.ordinal());
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientSelectTradePacket extends ClientPlayPacket {
@ -12,4 +13,9 @@ public class ClientSelectTradePacket extends ClientPlayPacket {
public void read(@NotNull BinaryReader reader) {
this.selectedSlot = reader.readVarInt();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(selectedSlot);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientSetBeaconEffectPacket extends ClientPlayPacket {
@ -14,4 +15,10 @@ public class ClientSetBeaconEffectPacket extends ClientPlayPacket {
this.primaryEffect = reader.readVarInt();
this.secondaryEffect = reader.readVarInt();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(primaryEffect);
writer.writeVarInt(secondaryEffect);
}
}

View File

@ -2,16 +2,22 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class ClientSpectatePacket extends ClientPlayPacket {
public UUID targetUuid;
public UUID targetUuid = new UUID(0,0);
@Override
public void read(@NotNull BinaryReader reader) {
this.targetUuid = reader.readUuid();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeUuid(targetUuid);
}
}

View File

@ -2,17 +2,27 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientStatusPacket extends ClientPlayPacket {
public Action action;
public ClientStatusPacket() {
action = Action.REQUEST_STATS;
}
@Override
public void read(@NotNull BinaryReader reader) {
this.action = Action.values()[reader.readVarInt()];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(action.ordinal());
}
public enum Action {
PERFORM_RESPAWN,
REQUEST_STATS

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientSteerBoatPacket extends ClientPlayPacket {
@ -14,4 +15,10 @@ public class ClientSteerBoatPacket extends ClientPlayPacket {
this.leftPaddleTurning = reader.readBoolean();
this.rightPaddleTurning = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBoolean(leftPaddleTurning);
writer.writeBoolean(rightPaddleTurning);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientSteerVehiclePacket extends ClientPlayPacket {
@ -16,4 +17,11 @@ public class ClientSteerVehiclePacket extends ClientPlayPacket {
this.forward = reader.readFloat();
this.flags = reader.readByte();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeFloat(sideways);
writer.writeFloat(forward);
writer.writeByte(flags);
}
}

View File

@ -2,16 +2,23 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientTabCompletePacket extends ClientPlayPacket {
public int transactionId;
public String text;
public String text = "";
@Override
public void read(@NotNull BinaryReader reader) {
this.transactionId = reader.readVarInt();
this.text = reader.readSizedString(Short.MAX_VALUE);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(transactionId);
writer.writeSizedString(text);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientTeleportConfirmPacket extends ClientPlayPacket {
@ -12,4 +13,9 @@ public class ClientTeleportConfirmPacket extends ClientPlayPacket {
public void read(@NotNull BinaryReader reader) {
this.teleportId = reader.readVarInt();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(teleportId);
}
}

View File

@ -2,12 +2,13 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientUpdateCommandBlockMinecartPacket extends ClientPlayPacket {
public int entityId;
public String command;
public String command = "";
public boolean trackOutput;
@Override
@ -16,4 +17,11 @@ public class ClientUpdateCommandBlockMinecartPacket extends ClientPlayPacket {
this.command = reader.readSizedString(Short.MAX_VALUE);
this.trackOutput = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
writer.writeSizedString(command);
writer.writeBoolean(trackOutput);
}
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientUpdateCommandBlockPacket extends ClientPlayPacket {
@ -12,6 +13,12 @@ public class ClientUpdateCommandBlockPacket extends ClientPlayPacket {
public Mode mode;
public byte flags;
public ClientUpdateCommandBlockPacket() {
blockPosition = new BlockPosition(0,0,0);
command = "";
mode = Mode.REDSTONE;
}
@Override
public void read(@NotNull BinaryReader reader) {
this.blockPosition = reader.readBlockPosition();
@ -20,6 +27,14 @@ public class ClientUpdateCommandBlockPacket extends ClientPlayPacket {
this.flags = reader.readByte();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBlockPosition(blockPosition);
writer.writeSizedString(command);
writer.writeVarInt(mode.ordinal());
writer.writeByte(flags);
}
public enum Mode {
SEQUENCE, AUTO, REDSTONE
}

View File

@ -3,15 +3,16 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientUpdateSignPacket extends ClientPlayPacket {
public BlockPosition blockPosition;
public String line1;
public String line2;
public String line3;
public String line4;
public BlockPosition blockPosition = new BlockPosition(0,0,0);
public String line1 = "";
public String line2 = "";
public String line3 = "";
public String line4 = "";
@Override
public void read(@NotNull BinaryReader reader) {
@ -20,6 +21,22 @@ public class ClientUpdateSignPacket extends ClientPlayPacket {
this.line2 = reader.readSizedString(384);
this.line3 = reader.readSizedString(384);
this.line4 = reader.readSizedString(384);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBlockPosition(blockPosition);
if(line1.length() > 384)
throw new IllegalArgumentException("line1 is too long! Signs allow a maximum of 384 characters per line.");
if(line2.length() > 384)
throw new IllegalArgumentException("line2 is too long! Signs allow a maximum of 384 characters per line.");
if(line3.length() > 384)
throw new IllegalArgumentException("line3 is too long! Signs allow a maximum of 384 characters per line.");
if(line4.length() > 384)
throw new IllegalArgumentException("line4 is too long! Signs allow a maximum of 384 characters per line.");
writer.writeSizedString(line1);
writer.writeSizedString(line2);
writer.writeSizedString(line3);
writer.writeSizedString(line4);
}
}

View File

@ -3,14 +3,20 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.entity.Player;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientUseItemPacket extends ClientPlayPacket {
public Player.Hand hand;
public Player.Hand hand = Player.Hand.MAIN;
@Override
public void read(@NotNull BinaryReader reader) {
this.hand = Player.Hand.values()[reader.readVarInt()];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(hand.ordinal());
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientVehicleMovePacket extends ClientPlayPacket {
@ -18,4 +19,13 @@ public class ClientVehicleMovePacket extends ClientPlayPacket {
this.yaw = reader.readFloat();
this.pitch = reader.readFloat();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeDouble(x);
writer.writeDouble(y);
writer.writeDouble(z);
writer.writeFloat(yaw);
writer.writeFloat(pitch);
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ClientWindowConfirmationPacket extends ClientPlayPacket {
@ -16,4 +17,11 @@ public class ClientWindowConfirmationPacket extends ClientPlayPacket {
this.actionNumber = reader.readShort();
this.accepted = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(windowId);
writer.writeShort(actionNumber);
writer.writeBoolean(accepted);
}
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.client.status;
import net.minestom.server.network.packet.client.ClientPreplayPacket;
import net.minestom.server.network.player.PlayerConnection;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class LegacyServerListPingPacket implements ClientPreplayPacket {
@ -18,4 +19,9 @@ public class LegacyServerListPingPacket implements ClientPreplayPacket {
public void read(@NotNull BinaryReader reader) {
this.payload = reader.readByte();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(payload);
}
}

View File

@ -4,12 +4,15 @@ import net.minestom.server.network.packet.client.ClientPreplayPacket;
import net.minestom.server.network.packet.server.status.PongPacket;
import net.minestom.server.network.player.PlayerConnection;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class PingPacket implements ClientPreplayPacket {
private long number;
public PingPacket() {}
@Override
public void process(@NotNull PlayerConnection connection) {
PongPacket pongPacket = new PongPacket(number);
@ -21,4 +24,9 @@ public class PingPacket implements ClientPreplayPacket {
public void read(@NotNull BinaryReader reader) {
this.number = reader.readLong();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeLong(number);
}
}

View File

@ -7,6 +7,7 @@ import net.minestom.server.network.player.PlayerConnection;
import net.minestom.server.ping.ResponseData;
import net.minestom.server.ping.ResponseDataConsumer;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class StatusRequestPacket implements ClientPreplayPacket {
@ -37,4 +38,9 @@ public class StatusRequestPacket implements ClientPreplayPacket {
public void read(@NotNull BinaryReader reader) {
// Empty
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Empty
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -10,12 +11,20 @@ public class AttachEntityPacket implements ServerPacket {
public int attachedEntityId;
public int holdingEntityId; // Or -1 to detach
public AttachEntityPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeInt(attachedEntityId);
writer.writeInt(holdingEntityId);
}
@Override
public void read(@NotNull BinaryReader reader) {
attachedEntityId = reader.readInt();
holdingEntityId = reader.readInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.ATTACH_ENTITY;

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -13,6 +14,10 @@ public class BlockActionPacket implements ServerPacket {
public byte actionParam;
public int blockId;
public BlockActionPacket() {
blockPosition = new BlockPosition(0,0,0);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBlockPosition(blockPosition);
@ -21,6 +26,14 @@ public class BlockActionPacket implements ServerPacket {
writer.writeVarInt(blockId);
}
@Override
public void read(@NotNull BinaryReader reader) {
blockPosition = reader.readBlockPosition();
actionId = reader.readByte();
actionParam = reader.readByte();
blockId = reader.readVarInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.BLOCK_ACTION;

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -13,7 +14,7 @@ public class BlockBreakAnimationPacket implements ServerPacket {
public byte destroyStage;
public BlockBreakAnimationPacket() {
blockPosition = new BlockPosition(0,0,0);
}
public BlockBreakAnimationPacket(int entityId, BlockPosition blockPosition, byte destroyStage) {
@ -29,6 +30,13 @@ public class BlockBreakAnimationPacket implements ServerPacket {
writer.writeByte(destroyStage);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
blockPosition = reader.readBlockPosition();
destroyStage = reader.readByte();
}
@Override
public int getId() {
return ServerPacketIdentifier.BLOCK_BREAK_ANIMATION;

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -11,12 +12,22 @@ public class BlockChangePacket implements ServerPacket {
public BlockPosition blockPosition;
public int blockStateId;
public BlockChangePacket() {
blockPosition = new BlockPosition(0,0,0);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBlockPosition(blockPosition);
writer.writeVarInt(blockStateId);
}
@Override
public void read(@NotNull BinaryReader reader) {
blockPosition = reader.readBlockPosition();
blockStateId = reader.readVarInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.BLOCK_CHANGE;

View File

@ -1,11 +1,17 @@
package net.minestom.server.network.packet.server.play;
import net.minestom.server.MinecraftServer;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
import org.jglrxavpok.hephaistos.nbt.NBT;
import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import org.jglrxavpok.hephaistos.nbt.NBTException;
import java.io.IOException;
public class BlockEntityDataPacket implements ServerPacket {
@ -13,6 +19,10 @@ public class BlockEntityDataPacket implements ServerPacket {
public byte action;
public NBTCompound nbtCompound;
public BlockEntityDataPacket() {
blockPosition = new BlockPosition(0,0,0);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBlockPosition(blockPosition);
@ -25,6 +35,20 @@ public class BlockEntityDataPacket implements ServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
blockPosition = reader.readBlockPosition();;
action = reader.readByte();
try {
NBT tag = reader.readTag();
if(tag instanceof NBTCompound) {
nbtCompound = (NBTCompound) tag;
}
} catch (IOException | NBTException e) {
MinecraftServer.getExceptionManager().handleException(e);
}
}
@Override
public int getId() {
return ServerPacketIdentifier.BLOCK_ENTITY_DATA;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -9,11 +10,18 @@ public class CameraPacket implements ServerPacket {
public int cameraId;
public CameraPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(cameraId);
}
@Override
public void read(@NotNull BinaryReader reader) {
cameraId = reader.readVarInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.CAMERA;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -10,12 +11,22 @@ public class ChangeGameStatePacket implements ServerPacket {
public Reason reason;
public float value;
public ChangeGameStatePacket() {
reason = Reason.NO_RESPAWN_BLOCK;
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte((byte) reason.ordinal());
writer.writeFloat(value);
}
@Override
public void read(@NotNull BinaryReader reader) {
reason = Reason.values()[reader.readByte()];
value = reader.readFloat();
}
@Override
public int getId() {
return ServerPacketIdentifier.CHANGE_GAME_STATE;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -9,11 +10,18 @@ public class CloseWindowPacket implements ServerPacket {
public byte windowId;
public CloseWindowPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(windowId);
}
@Override
public void read(@NotNull BinaryReader reader) {
windowId = reader.readByte();
}
@Override
public int getId() {
return ServerPacketIdentifier.CLOSE_WINDOW;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -11,6 +12,8 @@ public class CollectItemPacket implements ServerPacket {
public int collectorEntityId;
public int pickupItemCount;
public CollectItemPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(collectedEntityId);
@ -18,6 +21,13 @@ public class CollectItemPacket implements ServerPacket {
writer.writeVarInt(pickupItemCount);
}
@Override
public void read(@NotNull BinaryReader reader) {
collectedEntityId = reader.readVarInt();
collectorEntityId = reader.readVarInt();
pickupItemCount = reader.readVarInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.COLLECT_ITEM;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -10,12 +11,22 @@ public class CraftRecipeResponse implements ServerPacket {
public byte windowId;
public String recipe;
public CraftRecipeResponse() {
recipe = "";
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(windowId);
writer.writeSizedString(recipe);
}
@Override
public void read(@NotNull BinaryReader reader) {
windowId = reader.readByte();
recipe = reader.readSizedString(Integer.MAX_VALUE);
}
@Override
public int getId() {
return ServerPacketIdentifier.CRAFT_RECIPE_RESPONSE;

View File

@ -3,13 +3,18 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.binary.Readable;
import net.minestom.server.utils.binary.Writeable;
import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.NotNull;
public class DeclareRecipesPacket implements ServerPacket {
public DeclaredRecipe[] recipes;
public DeclaredRecipe[] recipes = new DeclaredRecipe[0];
public DeclareRecipesPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
@ -21,12 +26,59 @@ public class DeclareRecipesPacket implements ServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
int recipeCount = reader.readVarInt();
recipes = new DeclaredRecipe[recipeCount];
for (int i = 0; i < recipeCount; i++) {
String type = reader.readSizedString(Integer.MAX_VALUE);
String id = reader.readSizedString(Integer.MAX_VALUE);
switch (type) {
case "crafting_shapeless":
recipes[i] = new DeclaredShapelessCraftingRecipe(id, reader);
break;
case "crafting_shaped":
recipes[i] = new DeclaredShapedCraftingRecipe(id, reader);
break;
case "smelting":
recipes[i] = new DeclaredSmeltingRecipe(id, reader);
break;
case "blasting":
recipes[i] = new DeclaredBlastingRecipe(id, reader);
break;
case "smoking":
recipes[i] = new DeclaredSmokingRecipe(id, reader);
break;
case "campfire_cooking":
recipes[i] = new DeclaredCampfireCookingRecipe(id, reader);
break;
case "stonecutter":
recipes[i] = new DeclaredStonecutterRecipe(id, reader);
break;
case "smithing":
recipes[i] = new DeclaredSmithingRecipe(id, reader);
break;
default:
throw new UnsupportedOperationException("Unrecognized type: "+type+" (id is "+id+")");
}
}
}
@Override
public int getId() {
return ServerPacketIdentifier.DECLARE_RECIPES;
}
public abstract static class DeclaredRecipe {
public abstract static class DeclaredRecipe implements Writeable, Readable {
protected final String recipeId;
protected final String recipeType;
@ -39,12 +91,17 @@ public class DeclareRecipesPacket implements ServerPacket {
writer.writeSizedString(recipeType);
writer.writeSizedString(recipeId);
}
@Override
public void read(@NotNull BinaryReader reader) {
throw new UnsupportedOperationException("'read' must be implemented inside subclasses!");
}
}
public static class DeclaredShapelessCraftingRecipe extends DeclaredRecipe {
private final String group;
private final Ingredient[] ingredients;
private final ItemStack result;
private String group;
private Ingredient[] ingredients;
private ItemStack result;
public DeclaredShapelessCraftingRecipe(
@NotNull String recipeId,
@ -58,6 +115,11 @@ public class DeclareRecipesPacket implements ServerPacket {
this.result = result;
}
private DeclaredShapelessCraftingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) {
super(recipeId, "crafting_shapeless");
read(reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Write type & id
@ -70,14 +132,26 @@ public class DeclareRecipesPacket implements ServerPacket {
}
writer.writeItemStack(result);
}
@Override
public void read(@NotNull BinaryReader reader) {
group = reader.readSizedString(Integer.MAX_VALUE);
int count = reader.readVarInt();
ingredients = new Ingredient[count];
for (int i = 0; i < count; i++) {
ingredients[i] = new Ingredient();
ingredients[i].read(reader);
}
result = reader.readItemStack();
}
}
public static class DeclaredShapedCraftingRecipe extends DeclaredRecipe {
public final int width;
public final int height;
private final String group;
private final Ingredient[] ingredients;
private final ItemStack result;
public int width;
public int height;
private String group;
private Ingredient[] ingredients;
private ItemStack result;
public DeclaredShapedCraftingRecipe(
@NotNull String recipeId,
@ -95,6 +169,11 @@ public class DeclareRecipesPacket implements ServerPacket {
this.height = height;
}
private DeclaredShapedCraftingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) {
super(recipeId, "crafting_shaped");
read(reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Write type & id
@ -108,14 +187,27 @@ public class DeclareRecipesPacket implements ServerPacket {
}
writer.writeItemStack(result);
}
@Override
public void read(@NotNull BinaryReader reader) {
width = reader.readVarInt();
height = reader.readVarInt();
group = reader.readSizedString(Integer.MAX_VALUE);
ingredients = new Ingredient[width*height];
for (int i = 0; i < width * height; i++) {
ingredients[i] = new Ingredient();
ingredients[i].read(reader);
}
result = reader.readItemStack();
}
}
public static class DeclaredSmeltingRecipe extends DeclaredRecipe {
private final String group;
private final Ingredient ingredient;
private final ItemStack result;
private final float experience;
private final int cookingTime;
private String group;
private Ingredient ingredient;
private ItemStack result;
private float experience;
private int cookingTime;
public DeclaredSmeltingRecipe(
@NotNull String recipeId,
@ -133,6 +225,11 @@ public class DeclareRecipesPacket implements ServerPacket {
this.cookingTime = cookingTime;
}
private DeclaredSmeltingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) {
super(recipeId, "smelting");
read(reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Write type & id
@ -144,14 +241,24 @@ public class DeclareRecipesPacket implements ServerPacket {
writer.writeFloat(experience);
writer.writeVarInt(cookingTime);
}
@Override
public void read(@NotNull BinaryReader reader) {
group = reader.readSizedString(Integer.MAX_VALUE);
ingredient = new Ingredient();
ingredient.read(reader);
result = reader.readItemStack();
experience = reader.readFloat();
cookingTime = reader.readVarInt();
}
}
public static class DeclaredBlastingRecipe extends DeclaredRecipe {
private final String group;
private final Ingredient ingredient;
private final ItemStack result;
private final float experience;
private final int cookingTime;
private String group;
private Ingredient ingredient;
private ItemStack result;
private float experience;
private int cookingTime;
public DeclaredBlastingRecipe(
@NotNull String recipeId,
@ -169,6 +276,11 @@ public class DeclareRecipesPacket implements ServerPacket {
this.cookingTime = cookingTime;
}
private DeclaredBlastingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) {
super(recipeId, "blasting");
read(reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Write type & id
@ -180,14 +292,24 @@ public class DeclareRecipesPacket implements ServerPacket {
writer.writeFloat(experience);
writer.writeVarInt(cookingTime);
}
@Override
public void read(@NotNull BinaryReader reader) {
group = reader.readSizedString(Integer.MAX_VALUE);
ingredient = new Ingredient();
ingredient.read(reader);
result = reader.readItemStack();
experience = reader.readFloat();
cookingTime = reader.readVarInt();
}
}
public static class DeclaredSmokingRecipe extends DeclaredRecipe {
private final String group;
private final Ingredient ingredient;
private final ItemStack result;
private final float experience;
private final int cookingTime;
private String group;
private Ingredient ingredient;
private ItemStack result;
private float experience;
private int cookingTime;
public DeclaredSmokingRecipe(
@NotNull String recipeId,
@ -205,6 +327,11 @@ public class DeclareRecipesPacket implements ServerPacket {
this.cookingTime = cookingTime;
}
private DeclaredSmokingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) {
super(recipeId, "smoking");
read(reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Write type & id
@ -216,14 +343,24 @@ public class DeclareRecipesPacket implements ServerPacket {
writer.writeFloat(experience);
writer.writeVarInt(cookingTime);
}
@Override
public void read(@NotNull BinaryReader reader) {
group = reader.readSizedString(Integer.MAX_VALUE);
ingredient = new Ingredient();
ingredient.read(reader);
result = reader.readItemStack();
experience = reader.readFloat();
cookingTime = reader.readVarInt();
}
}
public static class DeclaredCampfireCookingRecipe extends DeclaredRecipe {
private final String group;
private final Ingredient ingredient;
private final ItemStack result;
private final float experience;
private final int cookingTime;
private String group;
private Ingredient ingredient;
private ItemStack result;
private float experience;
private int cookingTime;
public DeclaredCampfireCookingRecipe(
@NotNull String recipeId,
@ -241,6 +378,11 @@ public class DeclareRecipesPacket implements ServerPacket {
this.cookingTime = cookingTime;
}
private DeclaredCampfireCookingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) {
super(recipeId, "campfire_cooking");
read(reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Write type & id
@ -252,12 +394,22 @@ public class DeclareRecipesPacket implements ServerPacket {
writer.writeFloat(experience);
writer.writeVarInt(cookingTime);
}
@Override
public void read(@NotNull BinaryReader reader) {
group = reader.readSizedString(Integer.MAX_VALUE);
ingredient = new Ingredient();
ingredient.read(reader);
result = reader.readItemStack();
experience = reader.readFloat();
cookingTime = reader.readVarInt();
}
}
public static class DeclaredStonecutterRecipe extends DeclaredRecipe {
private final String group;
private final Ingredient ingredient;
private final ItemStack result;
private String group;
private Ingredient ingredient;
private ItemStack result;
public DeclaredStonecutterRecipe(
@NotNull String recipeId,
@ -271,6 +423,11 @@ public class DeclareRecipesPacket implements ServerPacket {
this.result = result;
}
private DeclaredStonecutterRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) {
super(recipeId, "stonecutter");
read(reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Write type & id
@ -280,12 +437,20 @@ public class DeclareRecipesPacket implements ServerPacket {
ingredient.write(writer);
writer.writeItemStack(result);
}
@Override
public void read(@NotNull BinaryReader reader) {
group = reader.readSizedString(Integer.MAX_VALUE);
ingredient = new Ingredient();
ingredient.read( reader);
result = reader.readItemStack();
}
}
public final static class DeclaredSmithingRecipe extends DeclaredRecipe {
private final Ingredient base;
private final Ingredient addition;
private final ItemStack result;
private Ingredient base;
private Ingredient addition;
private ItemStack result;
public DeclaredSmithingRecipe(
@NotNull String recipeId,
@ -299,6 +464,11 @@ public class DeclareRecipesPacket implements ServerPacket {
this.result = result;
}
private DeclaredSmithingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) {
super(recipeId, "smithing");
read(reader);
}
@Override
public void write(@NotNull BinaryWriter writer) {
// Write type & id
@ -308,19 +478,35 @@ public class DeclareRecipesPacket implements ServerPacket {
addition.write(writer);
writer.writeItemStack(result);
}
@Override
public void read(@NotNull BinaryReader reader) {
base = new Ingredient();
addition = new Ingredient();
base.read(reader);
addition.read(reader);
result = reader.readItemStack();
}
}
public static class Ingredient {
public static class Ingredient implements Writeable, Readable {
// The count of each item should be 1
public ItemStack[] items;
public ItemStack[] items = new ItemStack[0];
private void write(BinaryWriter writer) {
public void write(BinaryWriter writer) {
writer.writeVarInt(items.length);
for (ItemStack itemStack : items) {
writer.writeItemStack(itemStack);
}
}
@Override
public void read(@NotNull BinaryReader reader) {
items = new ItemStack[reader.readVarInt()];
for (int i = 0; i < items.length; i++) {
items[i] = reader.readItemStack();
}
}
}
}

View File

@ -2,18 +2,26 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class DestroyEntitiesPacket implements ServerPacket {
public int[] entityIds;
public int[] entityIds = new int[0];
public DestroyEntitiesPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarIntArray(entityIds);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityIds = reader.readVarIntArray();
}
@Override
public int getId() {
return ServerPacketIdentifier.DESTROY_ENTITIES;

View File

@ -4,6 +4,7 @@ import net.kyori.adventure.text.Component;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -22,11 +23,20 @@ public class DisconnectPacket implements ComponentHoldingServerPacket {
this.message = message;
}
private DisconnectPacket() {
this(Component.text("Disconnected."));
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeComponent(message);
}
@Override
public void read(@NotNull BinaryReader reader) {
message = reader.readComponent(Integer.MAX_VALUE);
}
@Override
public int getId() {
return ServerPacketIdentifier.DISCONNECT;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -10,12 +11,22 @@ public class DisplayScoreboardPacket implements ServerPacket {
public byte position;
public String scoreName;
public DisplayScoreboardPacket() {
scoreName = "";
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(position);
writer.writeSizedString(scoreName);
}
@Override
public void read(@NotNull BinaryReader reader) {
position = reader.readByte();
scoreName = reader.readSizedString(Integer.MAX_VALUE);
}
@Override
public int getId() {
return ServerPacketIdentifier.DISPLAY_SCOREBOARD;

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -13,6 +14,10 @@ public class EffectPacket implements ServerPacket {
public int data;
public boolean disableRelativeVolume;
public EffectPacket() {
position = new BlockPosition(0,0,0);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeInt(effectId);
@ -21,6 +26,14 @@ public class EffectPacket implements ServerPacket {
writer.writeBoolean(disableRelativeVolume);
}
@Override
public void read(@NotNull BinaryReader reader) {
effectId = reader.readInt();
position = reader.readBlockPosition();
data = reader.readInt();
disableRelativeVolume = reader.readBoolean();
}
@Override
public int getId() {
return ServerPacketIdentifier.EFFECT;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -10,12 +11,22 @@ public class EntityAnimationPacket implements ServerPacket {
public int entityId;
public Animation animation;
public EntityAnimationPacket() {
animation = Animation.SWING_MAIN_ARM;
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
writer.writeByte((byte) animation.ordinal());
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
animation = Animation.values()[reader.readByte()];
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_ANIMATION;

View File

@ -3,6 +3,8 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.potion.Potion;
import net.minestom.server.potion.PotionEffect;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -11,6 +13,10 @@ public class EntityEffectPacket implements ServerPacket {
public int entityId;
public Potion potion;
public EntityEffectPacket() {
potion = new Potion(PotionEffect.ABSORPTION, (byte) 0, 0);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -20,6 +26,20 @@ public class EntityEffectPacket implements ServerPacket {
writer.writeByte(potion.getFlags());
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
byte potionEffectID = reader.readByte();
byte amplifier = reader.readByte();
int duration = reader.readVarInt();
byte flags = reader.readByte();
boolean ambient = (flags & 0x01) == 0x01;
boolean particles = (flags & 0x02) == 0x02;
boolean icon = (flags & 0x04) == 0x04;
potion = new Potion(PotionEffect.fromId(potionEffectID), amplifier, duration, particles, icon, ambient);
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_EFFECT;

View File

@ -4,15 +4,21 @@ import net.minestom.server.event.item.ArmorEquipEvent;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedList;
import java.util.List;
public class EntityEquipmentPacket implements ServerPacket {
public int entityId;
public Slot[] slots;
public ItemStack[] itemStacks;
public EntityEquipmentPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -40,6 +46,25 @@ public class EntityEquipmentPacket implements ServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
boolean hasRemaining = true;
List<Slot> slots = new LinkedList<>();
List<ItemStack> stacks = new LinkedList<>();
while(hasRemaining) {
byte slotEnum = reader.readByte();
hasRemaining = (slotEnum & 0x80) == 0x80;
slots.add(Slot.values()[slotEnum & 0x7F]);
stacks.add(reader.readItemStack());
}
this.slots = slots.toArray(new Slot[0]);
this.itemStacks = stacks.toArray(new ItemStack[0]);
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_EQUIPMENT;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -10,12 +11,20 @@ public class EntityHeadLookPacket implements ServerPacket {
public int entityId;
public float yaw;
public EntityHeadLookPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
writer.writeByte((byte) (this.yaw * 256 / 360));
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
yaw = reader.readByte() * 360f / 256f;
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_HEAD_LOOK;

View File

@ -3,28 +3,50 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.entity.Metadata;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.LinkedList;
public class EntityMetaDataPacket implements ServerPacket {
public int entityId;
public Collection<Metadata.Entry<?>> entries;
public EntityMetaDataPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
// Write all the fields
for (Metadata.Entry<?> entry : entries) {
entry.write(writer);
if(entries != null) {
// Write all the fields
for (Metadata.Entry<?> entry : entries) {
entry.write(writer);
}
}
writer.writeByte((byte) 0xFF); // End
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
entries = new LinkedList<>();
while(true) {
byte index = reader.readByte();
if(index == (byte) 0xFF) { // reached the end
break;
}
entries.add(new Metadata.Entry<Object>(reader));
}
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_METADATA;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -9,11 +10,18 @@ public class EntityMovementPacket implements ServerPacket {
public int entityId;
public EntityMovementPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_MOVEMENT;

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.Position;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -13,6 +14,8 @@ public class EntityPositionAndRotationPacket implements ServerPacket {
public float yaw, pitch;
public boolean onGround;
public EntityPositionAndRotationPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -24,6 +27,16 @@ public class EntityPositionAndRotationPacket implements ServerPacket {
writer.writeBoolean(onGround);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
deltaX = reader.readShort();
deltaY = reader.readShort();
deltaZ = reader.readShort();
yaw = reader.readByte() * 360f / 256f;
pitch = reader.readByte() * 360f / 256f;
onGround = reader.readBoolean();
}
@Override
public int getId() {

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.Position;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -12,6 +13,8 @@ public class EntityPositionPacket implements ServerPacket {
public short deltaX, deltaY, deltaZ;
public boolean onGround;
public EntityPositionPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -21,6 +24,15 @@ public class EntityPositionPacket implements ServerPacket {
writer.writeBoolean(onGround);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
deltaX = reader.readShort();
deltaY = reader.readShort();
deltaZ = reader.readShort();
onGround = reader.readBoolean();
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_POSITION;

View File

@ -3,9 +3,13 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.attribute.Attribute;
import net.minestom.server.attribute.AttributeInstance;
import net.minestom.server.attribute.AttributeModifier;
import net.minestom.server.attribute.AttributeOperation;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.binary.Readable;
import net.minestom.server.utils.binary.Writeable;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
@ -13,8 +17,9 @@ import java.util.Collection;
public class EntityPropertiesPacket implements ServerPacket {
public int entityId;
public Property[] properties;
public Property[] properties = new Property[0];
public EntityPropertiesPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
@ -25,18 +30,29 @@ public class EntityPropertiesPacket implements ServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
int propertyCount = reader.readInt();
properties = new Property[propertyCount];
for (int i = 0; i < propertyCount; i++) {
properties[i] = new Property();
properties[i].read(reader);
}
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_PROPERTIES;
}
public static class Property {
public static class Property implements Writeable, Readable {
public Attribute attribute;
public double value;
public AttributeInstance instance;
private void write(BinaryWriter writer) {
public void write(BinaryWriter writer) {
float maxValue = attribute.getMaxValue();
// Bypass vanilla limit client-side if needed (by sending the max value allowed)
@ -56,6 +72,21 @@ public class EntityPropertiesPacket implements ServerPacket {
}
}
}
@Override
public void read(@NotNull BinaryReader reader) {
String key = reader.readSizedString(Integer.MAX_VALUE);
attribute = Attribute.fromKey(key);
value = reader.readDouble();
int modifierCount = reader.readVarInt();
instance = new AttributeInstance(attribute, null);
for (int i = 0; i < modifierCount; i++) {
AttributeModifier modifier = new AttributeModifier(reader.readUuid(), "", (float) reader.readDouble(), AttributeOperation.fromId(reader.readByte()));
instance.addModifier(modifier);
}
}
}
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -11,6 +12,8 @@ public class EntityRotationPacket implements ServerPacket {
public float yaw, pitch;
public boolean onGround;
public EntityRotationPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -19,6 +22,14 @@ public class EntityRotationPacket implements ServerPacket {
writer.writeBoolean(onGround);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
yaw = reader.readByte() * 360f / 256f;
pitch = reader.readByte() * 360f / 256f;
onGround = reader.readBoolean();
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_ROTATION;

View File

@ -4,6 +4,8 @@ import net.kyori.adventure.sound.Sound;
import net.minestom.server.adventure.AdventurePacketConvertor;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.sound.SoundCategory;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -15,6 +17,10 @@ public class EntitySoundEffectPacket implements ServerPacket {
public float volume;
public float pitch;
public EntitySoundEffectPacket() {
soundSource = Sound.Source.NEUTRAL;
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(soundId);
@ -24,6 +30,15 @@ public class EntitySoundEffectPacket implements ServerPacket {
writer.writeFloat(pitch);
}
@Override
public void read(@NotNull BinaryReader reader) {
soundId = reader.readVarInt();
soundSource = Sound.Source.values()[reader.readVarInt()];
entityId = reader.readVarInt();
volume = reader.readFloat();
pitch = reader.readFloat();
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_SOUND_EFFECT;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -10,12 +11,20 @@ public class EntityStatusPacket implements ServerPacket {
public int entityId;
public byte status;
public EntityStatusPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeInt(entityId);
writer.writeByte(status);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readInt();
status = reader.readByte();
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_STATUS;

View File

@ -3,6 +3,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.Position;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -12,6 +13,10 @@ public class EntityTeleportPacket implements ServerPacket {
public Position position;
public boolean onGround;
public EntityTeleportPacket() {
position = new Position();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -23,6 +28,19 @@ public class EntityTeleportPacket implements ServerPacket {
writer.writeBoolean(onGround);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
position = new Position(
reader.readDouble(),
reader.readDouble(),
reader.readDouble(),
reader.readByte() * 360f / 256f,
reader.readByte() * 360f / 256f
);
onGround = reader.readBoolean();
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_TELEPORT;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -10,6 +11,8 @@ public class EntityVelocityPacket implements ServerPacket {
public int entityId;
public short velocityX, velocityY, velocityZ;
public EntityVelocityPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -18,6 +21,14 @@ public class EntityVelocityPacket implements ServerPacket {
writer.writeShort(velocityZ);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
velocityX = reader.readShort();
velocityY = reader.readShort();
velocityZ = reader.readShort();
}
@Override
public int getId() {
return ServerPacketIdentifier.ENTITY_VELOCITY;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -9,9 +10,11 @@ public class ExplosionPacket implements ServerPacket {
public float x, y, z;
public float radius; // UNUSED
public byte[] records;
public byte[] records = new byte[0];
public float playerMotionX, playerMotionY, playerMotionZ;
public ExplosionPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeFloat(x);
@ -26,6 +29,19 @@ public class ExplosionPacket implements ServerPacket {
writer.writeFloat(playerMotionZ);
}
@Override
public void read(@NotNull BinaryReader reader) {
x = reader.readFloat();
y = reader.readFloat();
z = reader.readFloat();
radius = reader.readFloat();
int recordCount = reader.readInt() * 3;
records = reader.readBytes(recordCount);
playerMotionX = reader.readFloat();
playerMotionY = reader.readFloat();
playerMotionZ = reader.readFloat();
}
@Override
public int getId() {
return ServerPacketIdentifier.EXPLOSION;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -12,6 +13,10 @@ public class FacePlayerPacket implements ServerPacket {
public int entityId;
public FacePosition entityFacePosition;
public FacePlayerPacket() {
facePosition = FacePosition.EYES;
entityFacePosition = FacePosition.EYES;
}
@Override
public void write(@NotNull BinaryWriter writer) {
@ -28,6 +33,22 @@ public class FacePlayerPacket implements ServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
facePosition = FacePosition.values()[reader.readVarInt()];
targetX = reader.readDouble();
targetY = reader.readDouble();
targetZ = reader.readDouble();
boolean isEntity = reader.readBoolean();
if(isEntity) {
entityId = reader.readVarInt();
entityFacePosition = FacePosition.values()[reader.readVarInt()];
} else {
entityId = 0;
}
}
@Override
public int getId() {
return ServerPacketIdentifier.FACE_PLAYER;

View File

@ -2,6 +2,7 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -9,11 +10,18 @@ public class HeldItemChangePacket implements ServerPacket {
public byte slot;
public HeldItemChangePacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(slot);
}
@Override
public void read(@NotNull BinaryReader reader) {
slot = reader.readByte();
}
@Override
public int getId() {
return ServerPacketIdentifier.HELD_ITEM_CHANGE;

View File

@ -4,15 +4,22 @@ import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.GameMode;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.validate.Check;
import net.minestom.server.world.DimensionType;
import org.jetbrains.annotations.NotNull;
import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import org.jglrxavpok.hephaistos.nbt.NBTException;
import java.io.IOException;
public class JoinGamePacket implements ServerPacket {
public int entityId;
public boolean hardcore;
public GameMode gameMode;
public GameMode previousGameMode;
public DimensionType dimensionType;
public long hashedSeed;
public int maxPlayers = 0; // Unused
@ -22,14 +29,23 @@ public class JoinGamePacket implements ServerPacket {
public boolean isDebug = false;
public boolean isFlat = false;
public JoinGamePacket() {
gameMode = GameMode.SURVIVAL;
dimensionType = DimensionType.OVERWORLD;
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeInt(entityId);
writer.writeBoolean(gameMode.isHardcore());
writer.writeByte(gameMode.getId());
//Previous Gamemode
writer.writeBoolean(hardcore);
writer.writeByte(gameMode.getId());
if(previousGameMode == null) {
writer.writeByte(gameMode.getId());
} else {
writer.writeByte(previousGameMode.getId());
}
//array of worlds
writer.writeVarInt(1);
writer.writeSizedString("minestom:world");
@ -55,6 +71,35 @@ public class JoinGamePacket implements ServerPacket {
writer.writeBoolean(isFlat);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readInt();
hardcore = reader.readBoolean();
gameMode = GameMode.fromId(reader.readByte());
previousGameMode = GameMode.fromId(reader.readByte());
int worldCount = reader.readVarInt();
Check.stateCondition(worldCount != 1, "Only 1 world is supported per JoinGamePacket by Minestom for the moment.");
//for (int i = 0; i < worldCount; i++) {
String worldName = reader.readSizedString(Integer.MAX_VALUE);
try {
NBTCompound dimensionCodec = (NBTCompound) reader.readTag();
dimensionType = DimensionType.fromNBT((NBTCompound) reader.readTag());
String dimensionName = reader.readSizedString(Integer.MAX_VALUE);
hashedSeed = reader.readLong();
maxPlayers = reader.readVarInt();
viewDistance = reader.readVarInt();
reducedDebugInfo = reader.readBoolean();
enableRespawnScreen = reader.readBoolean();
isDebug = reader.readBoolean();
isFlat = reader.readBoolean();
} catch (IOException | NBTException e) {
MinecraftServer.getExceptionManager().handleException(e);
// TODO: should we throw as the packet is invalid?
}
//}
}
@Override
public int getId() {
return ServerPacketIdentifier.JOIN_GAME;

View File

@ -68,7 +68,7 @@ public class ReadWritePackets {
BinaryReader reader = new BinaryReader(originalBytes);
packet.read(reader);
Assertions.assertEquals(0, reader.getRemainingBytes().length, "Packet did not read all available data");
Assertions.assertEquals(0, reader.readRemainingBytes().length, "Packet did not read all available data");
// re-write to ensure packet contents are the same
BinaryWriter secondWriter = new BinaryWriter();