More packets, just missing ChunkDataPacket

This commit is contained in:
jglrxavpok 2021-02-19 19:13:40 +01:00
parent 07ab4ac090
commit 930054385f
28 changed files with 481 additions and 87 deletions

View File

@ -17,6 +17,7 @@ import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerCommandEvent;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.ArrayUtils;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.callback.CommandCallback;
import net.minestom.server.utils.validate.Check;
import org.apache.commons.lang3.StringUtils;
@ -379,7 +380,7 @@ public final class CommandManager {
true, false, tracking);
tabNode.name = tracking ? "tab_completion" : "args";
tabNode.parser = "brigadier:string";
tabNode.properties = packetWriter -> packetWriter.writeVarInt(2); // Greedy phrase
tabNode.properties = BinaryWriter.makeArray(packetWriter -> packetWriter.writeVarInt(2)); // Greedy phrase
tabNode.children = new int[0];
if (tracking) {
tabNode.suggestionsType = "minecraft:ask_server";
@ -597,7 +598,6 @@ public final class CommandManager {
literalNode.children = ArrayUtils.toArray(cmdChildren);
return literalNode;
}
@NotNull

View File

@ -5,6 +5,7 @@ import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.command.builder.suggestion.SuggestionCallback;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.callback.validator.StringArrayValidator;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
@ -47,9 +48,9 @@ public class ArgumentDynamicStringArray extends Argument<String[]> {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, true);
argumentNode.parser = "brigadier:string";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeVarInt(2); // Greedy phrase
};
});
argumentNode.suggestionsType = "minecraft:ask_server";
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});

View File

@ -6,6 +6,7 @@ import net.minestom.server.command.builder.arguments.minecraft.SuggestionType;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.command.builder.suggestion.SuggestionCallback;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.callback.validator.StringValidator;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
@ -56,9 +57,9 @@ public class ArgumentDynamicWord extends Argument<String> {
final SuggestionType suggestionType = this.getSuggestionType();
argumentNode.parser = "brigadier:string";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeVarInt(0); // Single word
};
});
argumentNode.suggestionsType = suggestionType.getIdentifier();
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});

View File

@ -4,6 +4,7 @@ import io.netty.util.internal.StringUtil;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import org.apache.commons.text.StringEscapeUtils;
import org.jetbrains.annotations.NotNull;
@ -35,9 +36,9 @@ public class ArgumentString extends Argument<String> {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "brigadier:string";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeVarInt(1); // Quotable phrase
};
});
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}

View File

@ -2,6 +2,7 @@ package net.minestom.server.command.builder.arguments;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
@ -29,9 +30,9 @@ public class ArgumentStringArray extends Argument<String[]> {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "brigadier:string";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeVarInt(2); // Greedy phrase
};
});
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.command.builder.arguments;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.validate.Check;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
@ -90,9 +91,9 @@ public class ArgumentWord extends Argument<String> {
// Can be any word, add only one argument node
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "brigadier:string";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeVarInt(0); // Single word
};
});
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}
}

View File

@ -7,6 +7,7 @@ import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.GameMode;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.registry.Registries;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.entity.EntityFinder;
import net.minestom.server.utils.math.IntRange;
import org.apache.commons.lang3.StringUtils;
@ -75,7 +76,7 @@ public class ArgumentEntity extends Argument<EntityFinder> {
public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "minecraft:entity";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
byte mask = 0;
if (this.isOnlySingleEntity()) {
mask += 1;
@ -84,7 +85,7 @@ public class ArgumentEntity extends Argument<EntityFinder> {
mask += 2;
}
packetWriter.writeByte(mask);
};
});
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.command.builder.arguments.number;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ArgumentDouble extends ArgumentNumber<Double> {
@ -45,13 +46,13 @@ public class ArgumentDouble extends ArgumentNumber<Double> {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "brigadier:double";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeByte(getNumberProperties());
if (this.hasMin())
packetWriter.writeDouble(this.getMin());
if (this.hasMax())
packetWriter.writeDouble(this.getMax());
};
});
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.command.builder.arguments.number;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ArgumentFloat extends ArgumentNumber<Float> {
@ -45,13 +46,13 @@ public class ArgumentFloat extends ArgumentNumber<Float> {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "brigadier:float";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeByte(getNumberProperties());
if (this.hasMin())
packetWriter.writeFloat(this.getMin());
if (this.hasMax())
packetWriter.writeFloat(this.getMax());
};
});
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.command.builder.arguments.number;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ArgumentInteger extends ArgumentNumber<Integer> {
@ -36,13 +37,13 @@ public class ArgumentInteger extends ArgumentNumber<Integer> {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "brigadier:integer";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeByte(getNumberProperties());
if (this.hasMin())
packetWriter.writeInt(this.getMin());
if (this.hasMax())
packetWriter.writeInt(this.getMax());
};
});
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.command.builder.arguments.number;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
public class ArgumentLong extends ArgumentNumber<Long> {
@ -38,13 +39,13 @@ public class ArgumentLong extends ArgumentNumber<Long> {
// TODO maybe use ArgumentLiteral/ArgumentWord and impose long restriction server side?
argumentNode.parser = "brigadier:integer";
argumentNode.properties = packetWriter -> {
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeByte(getNumberProperties());
if (this.hasMin())
packetWriter.writeInt(this.getMin().intValue());
if (this.hasMax())
packetWriter.writeInt(this.getMax().intValue());
};
});
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}

View File

@ -4,13 +4,14 @@ import net.minestom.server.entity.Player;
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 ClientEditBookPacket extends ClientPlayPacket {
public ItemStack book;
public ItemStack book = ItemStack.getAirItem();
public boolean isSigning;
public Player.Hand hand;
public Player.Hand hand = Player.Hand.MAIN;
@Override
public void read(@NotNull BinaryReader reader) {
@ -18,4 +19,11 @@ public class ClientEditBookPacket extends ClientPlayPacket {
this.isSigning = reader.readBoolean();
this.hand = Player.Hand.values()[reader.readVarInt()];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeItemStack(book);
writer.writeBoolean(isSigning);
writer.writeVarInt(hand.ordinal());
}
}

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 ClientEntityActionPacket extends ClientPlayPacket {
public int playerId;
public Action action;
public Action action = Action.START_SNEAKING;
public int horseJumpBoost;
@Override
@ -17,6 +18,13 @@ public class ClientEntityActionPacket extends ClientPlayPacket {
this.horseJumpBoost = reader.readVarInt();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(playerId);
writer.writeVarInt(action.ordinal());
writer.writeVarInt(horseJumpBoost);
}
public enum Action {
START_SNEAKING,
STOP_SNEAKING,

View File

@ -3,11 +3,12 @@ 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 ClientGenerateStructurePacket extends ClientPlayPacket {
public BlockPosition blockPosition;
public BlockPosition blockPosition = new BlockPosition(0,0,0);
public int level;
public boolean keepJigsaws;
@ -17,4 +18,11 @@ public class ClientGenerateStructurePacket extends ClientPlayPacket {
this.level = reader.readVarInt();
this.keepJigsaws = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBlockPosition(blockPosition);
writer.writeVarInt(level);
writer.writeBoolean(keepJigsaws);
}
}

View File

@ -3,16 +3,17 @@ 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 ClientInteractEntityPacket extends ClientPlayPacket {
public int targetId;
public Type type;
public Type type = Type.INTERACT;
public float x;
public float y;
public float z;
public Player.Hand hand;
public Player.Hand hand = Player.Hand.MAIN;
public boolean sneaking;
@Override
@ -36,6 +37,27 @@ public class ClientInteractEntityPacket extends ClientPlayPacket {
this.sneaking = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(targetId);
writer.writeVarInt(type.ordinal());
switch (type) {
case INTERACT:
writer.writeVarInt(hand.ordinal());
break;
case ATTACK:
break;
case INTERACT_AT:
writer.writeFloat(x);
writer.writeFloat(y);
writer.writeFloat(z);
writer.writeVarInt(hand.ordinal());
break;
}
writer.writeBoolean(sneaking);
}
public enum Type {
INTERACT,
ATTACK,

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 ClientPlayerAbilitiesPacket extends ClientPlayPacket {
@ -12,4 +13,9 @@ public class ClientPlayerAbilitiesPacket extends ClientPlayPacket {
public void read(@NotNull BinaryReader reader) {
this.flags = reader.readByte();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(flags);
}
}

View File

@ -5,13 +5,14 @@ import net.minestom.server.instance.block.BlockFace;
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 ClientPlayerBlockPlacementPacket extends ClientPlayPacket {
public Player.Hand hand;
public BlockPosition blockPosition;
public BlockFace blockFace;
public Player.Hand hand = Player.Hand.MAIN;
public BlockPosition blockPosition = new BlockPosition(0,0,0);
public BlockFace blockFace = BlockFace.TOP;
public float cursorPositionX, cursorPositionY, cursorPositionZ;
public boolean insideBlock;
@ -26,4 +27,14 @@ public class ClientPlayerBlockPlacementPacket extends ClientPlayPacket {
this.insideBlock = reader.readBoolean();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(hand.ordinal());
writer.writeBlockPosition(blockPosition);
writer.writeVarInt(blockFace.ordinal());
writer.writeFloat(cursorPositionX);
writer.writeFloat(cursorPositionY);
writer.writeFloat(cursorPositionZ);
writer.writeBoolean(insideBlock);
}
}

View File

@ -4,13 +4,14 @@ import net.minestom.server.instance.block.BlockFace;
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 ClientPlayerDiggingPacket extends ClientPlayPacket {
public Status status;
public BlockPosition blockPosition;
public BlockFace blockFace;
public Status status = Status.SWAP_ITEM_HAND;
public BlockPosition blockPosition = new BlockPosition(0,0,0);
public BlockFace blockFace = BlockFace.TOP;
@Override
public void read(@NotNull BinaryReader reader) {
@ -19,6 +20,13 @@ public class ClientPlayerDiggingPacket extends ClientPlayPacket {
this.blockFace = BlockFace.values()[reader.readByte()];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(status.ordinal());
writer.writeBlockPosition(blockPosition);
writer.writeByte((byte) blockFace.ordinal());
}
public enum Status {
STARTED_DIGGING,
CANCELLED_DIGGING,

View File

@ -3,16 +3,17 @@ 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 ClientSettingsPacket extends ClientPlayPacket {
public String locale;
public String locale = "";
public byte viewDistance;
public Player.ChatMode chatMode;
public Player.ChatMode chatMode = Player.ChatMode.ENABLED;
public boolean chatColors;
public byte displayedSkinParts;
public Player.MainHand mainHand;
public Player.MainHand mainHand = Player.MainHand.RIGHT;
@Override
public void read(@NotNull BinaryReader reader) {
@ -23,4 +24,16 @@ public class ClientSettingsPacket extends ClientPlayPacket {
this.displayedSkinParts = reader.readByte();
this.mainHand = Player.MainHand.values()[reader.readVarInt()];
}
@Override
public void write(@NotNull BinaryWriter writer) {
if(locale.length() > 128)
throw new IllegalArgumentException("Locale cannot be longer than 128 characters.");
writer.writeSizedString(locale);
writer.writeByte(viewDistance);
writer.writeVarInt(chatMode.ordinal());
writer.writeBoolean(chatColors);
writer.writeByte(displayedSkinParts);
writer.writeVarInt(mainHand.ordinal());
}
}

View File

@ -4,16 +4,19 @@ import net.minestom.server.network.packet.client.play.ClientPlayerDiggingPacket;
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;
public class AcknowledgePlayerDiggingPacket implements ServerPacket {
public BlockPosition blockPosition;
public BlockPosition blockPosition = new BlockPosition(0,0,0);
public int blockStateId;
public ClientPlayerDiggingPacket.Status status;
public ClientPlayerDiggingPacket.Status status = ClientPlayerDiggingPacket.Status.STARTED_DIGGING;
public boolean successful;
public AcknowledgePlayerDiggingPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBlockPosition(blockPosition);
@ -22,6 +25,14 @@ public class AcknowledgePlayerDiggingPacket implements ServerPacket {
writer.writeBoolean(successful);
}
@Override
public void read(@NotNull BinaryReader reader) {
blockPosition = reader.readBlockPosition();
blockStateId = reader.readVarInt();
status = ClientPlayerDiggingPacket.Status.values()[reader.readVarInt()];
successful = reader.readBoolean();
}
@Override
public int getId() {
return ServerPacketIdentifier.ACKNOWLEDGE_PLAYER_DIGGING;

View File

@ -2,11 +2,15 @@ package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component;
import net.minestom.server.advancements.FrameType;
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.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 net.minestom.server.utils.binary.Readable;
import net.minestom.server.utils.binary.Writeable;
import org.jetbrains.annotations.NotNull;
@ -19,9 +23,11 @@ import java.util.function.UnaryOperator;
public class AdvancementsPacket implements ComponentHoldingServerPacket {
public boolean resetAdvancements;
public AdvancementMapping[] advancementMappings;
public String[] identifiersToRemove;
public ProgressMapping[] progressMappings;
public AdvancementMapping[] advancementMappings = new AdvancementMapping[0];
public String[] identifiersToRemove = new String[0];
public ProgressMapping[] progressMappings = new ProgressMapping[0];
public AdvancementsPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
@ -39,6 +45,27 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
resetAdvancements = reader.readBoolean();
int mappingCount = reader.readVarInt();
advancementMappings = new AdvancementMapping[mappingCount];
for (int i = 0; i < mappingCount; i++) {
advancementMappings[i] = new AdvancementMapping();
advancementMappings[i].read(reader);
}
identifiersToRemove = reader.readSizedStringArray(Integer.MAX_VALUE);
int progressCount = reader.readVarInt();
progressMappings = new ProgressMapping[progressCount];
for (int i = 0; i < progressCount; i++) {
progressMappings[i] = new ProgressMapping();
progressMappings[i].read(reader);
}
}
@Override
public int getId() {
return ServerPacketIdentifier.ADVANCEMENTS;
@ -73,7 +100,7 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket {
/**
* AdvancementMapping maps the namespaced ID to the Advancement.
*/
public static class AdvancementMapping implements Writeable {
public static class AdvancementMapping implements Writeable, Readable {
public String key;
public Advancement value;
@ -84,13 +111,19 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket {
value.write(writer);
}
@Override
public void read(@NotNull BinaryReader reader) {
key = reader.readSizedString(Integer.MAX_VALUE);
value = new Advancement();
value.read(reader);
}
}
public static class Advancement implements Writeable {
public static class Advancement implements Writeable, Readable {
public String parentIdentifier;
public DisplayData displayData;
public String[] criterions;
public Requirement[] requirements;
public String[] criterions = new String[0];
public Requirement[] requirements = new Requirement[0];
@Override
public void write(@NotNull BinaryWriter writer) {
@ -114,15 +147,42 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket {
requirement.write(writer);
}
}
@Override
public void read(@NotNull BinaryReader reader) {
boolean hasParent = reader.readBoolean();
if(hasParent) {
parentIdentifier = reader.readSizedString(Integer.MAX_VALUE);
} else {
parentIdentifier = null;
}
boolean hasDisplay = reader.readBoolean();
if(hasDisplay) {
displayData = new DisplayData();
displayData.read(reader);
} else {
displayData = null;
}
criterions = reader.readSizedStringArray(Integer.MAX_VALUE);
int requirementCount = reader.readVarInt();
requirements = new Requirement[requirementCount];
for (int i = 0; i < requirementCount; i++) {
requirements[i] = new Requirement();
requirements[i].read(reader);
}
}
}
public static class DisplayData implements Writeable {
public Component title; // Only text
public Component description; // Only text
public ItemStack icon;
public FrameType frameType;
public static class DisplayData implements Writeable, Readable {
public Component title = Component.empty(); // Only text
public Component description = Component.empty(); // Only text
public ItemStack icon = ItemStack.getAirItem();
public FrameType frameType = FrameType.TASK;
public int flags;
public String backgroundTexture;
public String backgroundTexture = "";
public float x;
public float y;
@ -140,34 +200,58 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket {
writer.writeFloat(y);
}
}
public static class Requirement implements Writeable {
public String[] requirements;
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(requirements.length);
for (String requirement : requirements) {
writer.writeSizedString(requirement);
public void read(@NotNull BinaryReader reader) {
title = reader.readComponent(Integer.MAX_VALUE);
description = reader.readComponent(Integer.MAX_VALUE);
icon = reader.readItemStack();
frameType = FrameType.values()[reader.readVarInt()];
flags = reader.readInt();
if((flags & 0x1) != 0) {
backgroundTexture = reader.readSizedString(Integer.MAX_VALUE);
} else {
backgroundTexture = null;
}
x = reader.readFloat();
y = reader.readFloat();
}
}
public static class ProgressMapping implements Writeable {
public String key;
public AdvancementProgress value;
public static class Requirement implements Writeable, Readable {
public String[] requirements = new String[0];
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeStringArray(requirements);
}
@Override
public void read(@NotNull BinaryReader reader) {
requirements = reader.readSizedStringArray(Integer.MAX_VALUE);
}
}
public static class ProgressMapping implements Writeable, Readable {
public String key = "";
public AdvancementProgress value = new AdvancementProgress();
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeSizedString(key);
value.write(writer);
}
@Override
public void read(@NotNull BinaryReader reader) {
key = reader.readSizedString(Integer.MAX_VALUE);
value = new AdvancementProgress();
value.read(reader);
}
}
public static class AdvancementProgress implements Writeable {
public Criteria[] criteria;
public static class AdvancementProgress implements Writeable, Readable {
public Criteria[] criteria = new Criteria[0];
@Override
public void write(@NotNull BinaryWriter writer) {
@ -176,11 +260,21 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket {
criterion.write(writer);
}
}
@Override
public void read(@NotNull BinaryReader reader) {
int count = reader.readVarInt();
criteria = new Criteria[count];
for (int i = 0; i < count; i++) {
criteria[i] = new Criteria();
criteria[i].read(reader);
}
}
}
public static class Criteria implements Writeable {
public String criterionIdentifier;
public CriterionProgress criterionProgress;
public static class Criteria implements Writeable, Readable {
public String criterionIdentifier = "";
public CriterionProgress criterionProgress = new CriterionProgress();
@Override
public void write(@NotNull BinaryWriter writer) {
@ -188,19 +282,32 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket {
criterionProgress.write(writer);
}
@Override
public void read(@NotNull BinaryReader reader) {
criterionIdentifier = reader.readSizedString(Integer.MAX_VALUE);
criterionProgress = new CriterionProgress();
criterionProgress.read(reader);
}
}
public static class CriterionProgress implements Writeable {
public static class CriterionProgress implements Writeable, Readable {
public boolean achieved;
public long dateOfAchieving;
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBoolean(achieved);
if (dateOfAchieving != 0)
if (achieved)
writer.writeLong(dateOfAchieving);
}
@Override
public void read(@NotNull BinaryReader reader) {
achieved = reader.readBoolean();
if(achieved) {
dateOfAchieving = reader.readLong();
}
}
}
}

View File

@ -6,6 +6,7 @@ import net.minestom.server.adventure.AdventurePacketConvertor;
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;
@ -16,15 +17,17 @@ import java.util.function.UnaryOperator;
public class BossBarPacket implements ComponentHoldingServerPacket {
public UUID uuid;
public Action action;
public UUID uuid = new UUID(0, 0);
public Action action = Action.ADD;
public Component title; // Only text
public Component title = Component.empty(); // Only text
public float health;
public BossBar.Color color;
public BossBar.Overlay overlay;
public BossBar.Color color = BossBar.Color.BLUE;
public BossBar.Overlay overlay = BossBar.Overlay.PROGRESS;
public byte flags;
public BossBarPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeUuid(uuid);
@ -57,6 +60,38 @@ public class BossBarPacket implements ComponentHoldingServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
uuid = reader.readUuid();
action = Action.values()[reader.readVarInt()];
switch (action) {
case ADD:
title = reader.readComponent(Integer.MAX_VALUE);
health = reader.readFloat();
color = BossBar.Color.values()[reader.readVarInt()];
overlay = BossBar.Overlay.values()[reader.readVarInt()];
flags = reader.readByte();
break;
case REMOVE:
break;
case UPDATE_HEALTH:
health = reader.readFloat();
break;
case UPDATE_TITLE:
title = reader.readComponent(Integer.MAX_VALUE);
break;
case UPDATE_STYLE:
color = BossBar.Color.values()[reader.readVarInt()];
overlay = BossBar.Overlay.values()[reader.readVarInt()];
break;
case UPDATE_FLAGS:
flags = reader.readByte();
break;
}
}
@Override
public int getId() {
return ServerPacketIdentifier.BOSS_BAR;

View File

@ -5,6 +5,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;
import org.jetbrains.annotations.Nullable;
@ -24,6 +25,10 @@ public class ChatMessagePacket implements ComponentHoldingServerPacket {
public Position position;
public UUID uuid;
public ChatMessagePacket() {
this(Component.empty(), Position.CHAT);
}
public ChatMessagePacket(Component message, Position position, UUID uuid) {
this.message = message;
this.position = position;
@ -41,6 +46,13 @@ public class ChatMessagePacket implements ComponentHoldingServerPacket {
writer.writeUuid(uuid);
}
@Override
public void read(@NotNull BinaryReader reader) {
message = reader.readComponent(Integer.MAX_VALUE);
position = Position.values()[reader.readByte()];
uuid = reader.readUuid();
}
@Override
public int getId() {
return ServerPacketIdentifier.CHAT_MESSAGE;

View File

@ -6,6 +6,7 @@ import net.minestom.server.entity.Player;
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;
@ -19,7 +20,7 @@ import java.util.function.UnaryOperator;
*/
public class CombatEventPacket implements ComponentHoldingServerPacket {
private EventType type;
private EventType type = EventType.ENTER_COMBAT;
private int duration;
private int opponent;
private int playerID;
@ -72,6 +73,27 @@ public class CombatEventPacket implements ComponentHoldingServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
type = EventType.values()[reader.readVarInt()];
switch (type) {
case ENTER_COMBAT:
// nothing to add
break;
case END_COMBAT:
duration = reader.readVarInt();
opponent = reader.readInt();
break;
case DEATH:
playerID = reader.readVarInt();
opponent = reader.readInt();
deathMessage = reader.readComponent(Integer.MAX_VALUE);
break;
}
}
@Override
public int getId() {
return ServerPacketIdentifier.COMBAT_EVENT;

View File

@ -2,7 +2,9 @@ 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 net.minestom.server.utils.binary.Readable;
import net.minestom.server.utils.binary.Writeable;
import org.jetbrains.annotations.NotNull;
@ -10,7 +12,7 @@ import java.util.function.Consumer;
public class DeclareCommandsPacket implements ServerPacket {
public Node[] nodes;
public Node[] nodes = new Node[0];
public int rootIndex;
@Override
@ -22,20 +24,31 @@ public class DeclareCommandsPacket implements ServerPacket {
writer.writeVarInt(rootIndex);
}
@Override
public void read(@NotNull BinaryReader reader) {
int nodeCount = reader.readVarInt();
nodes = new Node[nodeCount];
for (int i = 0; i < nodeCount; i++) {
nodes[i] = new Node();
nodes[i].read(reader);
}
rootIndex = reader.readVarInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.DECLARE_COMMANDS;
}
public static class Node implements Writeable {
public static class Node implements Writeable, Readable {
public byte flags;
public int[] children;
public int[] children = new int[0];
public int redirectedNode; // Only if flags & 0x08
public String name; // Only for literal and argument
public String parser; // Only for argument
public Consumer<BinaryWriter> properties; // Only for argument
public String suggestionsType; // Only if flags 0x10
public String name = ""; // Only for literal and argument
public String parser = ""; // Only for argument
public byte[] properties; // Only for argument
public String suggestionsType = ""; // Only if flags 0x10
@Override
public void write(@NotNull BinaryWriter writer) {
@ -54,14 +67,74 @@ public class DeclareCommandsPacket implements ServerPacket {
if (isArgument()) {
writer.writeSizedString(parser);
if (properties != null) {
properties.accept(writer);
writer.writeBytes(properties);
}
}
if ((flags & 0x10) != 0) {
writer.writeSizedString(suggestionsType);
}
}
@Override
public void read(@NotNull BinaryReader reader) {
flags = reader.readByte();
children = reader.readVarIntArray();
if ((flags & 0x08) != 0) {
redirectedNode = reader.readVarInt();
}
if (isLiteral() || isArgument()) {
name = reader.readSizedString(Integer.MAX_VALUE);
}
if(isArgument()) {
parser = reader.readSizedString(Integer.MAX_VALUE);
properties = getProperties(reader, parser);
}
if ((flags & 0x10) != 0) {
suggestionsType = reader.readSizedString(Integer.MAX_VALUE);
}
}
private byte[] getProperties(BinaryReader reader, String parser) {
switch (parser) {
case "brigadier:double":
return reader.extractBytes(() -> {
byte flags = reader.readByte();
if((flags & 0x01) == 0x01) {
reader.readDouble(); // min
}
if((flags & 0x02) == 0x02) {
reader.readDouble(); // max
}
});
case "brigadier:integer":
return reader.extractBytes(() -> {
byte flags = reader.readByte();
if((flags & 0x01) == 0x01) {
reader.readInt(); // min
}
if((flags & 0x02) == 0x02) {
reader.readInt(); // max
}
});
case "brigadier:string":
return reader.extractBytes(reader::readVarInt);
case "brigadier:entity":
case "brigadier:score_holder":
return reader.extractBytes(reader::readByte);
case "brigadier:range":
return reader.extractBytes(reader::readBoolean); // https://wiki.vg/Command_Data#minecraft:range, looks fishy
default:
return new byte[0]; // unknown
}
}
private boolean isLiteral() {

View File

@ -20,6 +20,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
/**
* Class used to read from a byte array.
@ -210,4 +212,19 @@ public class BinaryReader extends InputStream {
public NBT readTag() throws IOException, NBTException {
return nbtReader.read();
}
/**
* Records the current position, runs the given Runnable, and then returns the bytes between the position before
* running the runnable and the position after.
* Can be used to extract a subsection of this reader's buffer with complex data
* @param extractor the extraction code, simply call the reader's read* methods here.
*/
public byte[] extractBytes(Runnable extractor) {
int startingPosition = getBuffer().readerIndex();
extractor.run();
int endingPosition = getBuffer().readerIndex();
byte[] output = new byte[endingPosition-startingPosition];
getBuffer().getBytes(startingPosition, output);
return output;
}
}

View File

@ -341,4 +341,13 @@ public class BinaryWriter extends OutputStream {
public void writeUnsignedShort(int yourShort) {
buffer.writeShort(yourShort & 0xFFFF);
}
/**
* Returns a byte[] with the contents written via BinaryWriter
*/
public static byte[] makeArray(Consumer<BinaryWriter> writing) {
BinaryWriter writer = new BinaryWriter();
writing.accept(writer);
return writer.toByteArray();
}
}

View File

@ -2,8 +2,10 @@ package readwritepackets;
import com.google.common.reflect.ClassPath;
import net.minestom.server.MinecraftServer;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.client.ClientPacket;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.play.EntityEquipmentPacket;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.binary.Readable;
@ -58,7 +60,19 @@ public class ReadWritePackets {
BinaryWriter writer = new BinaryWriter();
Constructor<?> constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
T packet = (T) constructor.newInstance();
T packet;
// exceptions
if(clazz.getSimpleName().equals("EntityEquipmentPacket")) {
// requires at least one slot and one item
EntityEquipmentPacket p = new EntityEquipmentPacket();
p.itemStacks = new ItemStack[] { ItemStack.getAirItem() };
p.slots = new EntityEquipmentPacket.Slot[] { EntityEquipmentPacket.Slot.MAIN_HAND };
packet = (T) p;
}
else {
packet = (T) constructor.newInstance();
}
// write packet
packet.write(writer);