More readable server packets

This commit is contained in:
jglrxavpok 2021-02-06 18:58:52 +01:00
parent 7b8a8e3eb0
commit f9dcbafddf
24 changed files with 487 additions and 25 deletions

View File

@ -3,9 +3,14 @@ package net.minestom.server.network.packet.server.play;
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.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 RespawnPacket implements ServerPacket {
@ -16,6 +21,11 @@ public class RespawnPacket implements ServerPacket {
public boolean isFlat = true;
public boolean copyMeta = true;
public RespawnPacket() {
dimensionType = DimensionType.OVERWORLD;
gameMode = GameMode.SURVIVAL;
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeNBT("", dimensionType.toNBT());
@ -31,6 +41,27 @@ public class RespawnPacket implements ServerPacket {
writer.writeBoolean(copyMeta);
}
@Override
public void read(@NotNull BinaryReader reader) {
try {
dimensionType = DimensionType.fromNBT((NBTCompound) reader.readTag());
// dimension type name
reader.readSizedString(Integer.MAX_VALUE);
hashedSeed = reader.readLong();
gameMode = GameMode.values()[reader.readByte()];
// TODO: hardcore flag
reader.readByte();
isDebug = reader.readBoolean();
isFlat = reader.readBoolean();
copyMeta = reader.readBoolean();
} catch (IOException | NBTException e) {
e.printStackTrace();
throw new RuntimeException("Failed to read DimensionType inside RespawnPacket", e);
}
}
@Override
public int getId() {
return ServerPacketIdentifier.RESPAWN;

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;
@ -32,6 +33,12 @@ public class ScoreboardObjectivePacket implements ComponentHoldingServerPacket {
*/
public Type type;
public ScoreboardObjectivePacket() {
objectiveName = "";
objectiveValue = Component.empty();
type = Type.INTEGER;
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeSizedString(objectiveName);
@ -43,6 +50,17 @@ public class ScoreboardObjectivePacket implements ComponentHoldingServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
objectiveName = reader.readSizedString(Integer.MAX_VALUE);
mode = reader.readByte();
if(mode == 0 || mode == 2) {
objectiveValue = reader.readComponent(Integer.MAX_VALUE);
type = Type.values()[reader.readVarInt()];
}
}
@Override
public int getId() {
return ServerPacketIdentifier.SCOREBOARD_OBJECTIVE;

View File

@ -2,13 +2,18 @@ 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;
import org.jetbrains.annotations.Nullable;
public class SelectAdvancementTabPacket implements ServerPacket {
@Nullable
public String identifier;
public SelectAdvancementTabPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
final boolean hasId = identifier != null;
@ -19,6 +24,16 @@ public class SelectAdvancementTabPacket implements ServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
boolean hasID = reader.readBoolean();
if(hasID) {
identifier = reader.readSizedString(Integer.MAX_VALUE);
} else {
identifier = null;
}
}
@Override
public int getId() {
return ServerPacketIdentifier.SELECT_ADVANCEMENT_TAB;

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 net.minestom.server.world.Difficulty;
import org.jetbrains.annotations.NotNull;
@ -11,12 +12,22 @@ public class ServerDifficultyPacket implements ServerPacket {
public Difficulty difficulty;
public boolean locked;
public ServerDifficultyPacket() {
difficulty = Difficulty.NORMAL;
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte((byte) difficulty.ordinal());
writer.writeBoolean(locked);
}
@Override
public void read(@NotNull BinaryReader reader) {
difficulty = Difficulty.values()[reader.readByte()];
locked = reader.readBoolean();
}
@Override
public int getId() {
return ServerPacketIdentifier.SERVER_DIFFICULTY;

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 SetCooldownPacket implements ServerPacket {
public int itemId;
public int cooldownTicks;
public SetCooldownPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(itemId);
writer.writeVarInt(cooldownTicks);
}
@Override
public void read(@NotNull BinaryReader reader) {
itemId = reader.readVarInt();
cooldownTicks = reader.readVarInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.SET_COOLDOWN;

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 SetExperiencePacket implements ServerPacket {
public int level;
public int totalExperience;
public SetExperiencePacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeFloat(percentage);
@ -18,6 +21,13 @@ public class SetExperiencePacket implements ServerPacket {
writer.writeVarInt(totalExperience);
}
@Override
public void read(@NotNull BinaryReader reader) {
percentage = reader.readFloat();
level = reader.readVarInt();
totalExperience = reader.readVarInt();
}
@Override
public int getId() {
return ServerPacketIdentifier.SET_EXPERIENCE;

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 SetPassengersPacket implements ServerPacket {
public int vehicleEntityId;
public int[] passengersId;
public SetPassengersPacket() {
passengersId = new int[0];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(vehicleEntityId);
writer.writeVarIntArray(passengersId);
}
@Override
public void read(@NotNull BinaryReader reader) {
vehicleEntityId = reader.readVarInt();
passengersId = reader.readVarIntArray();
}
@Override
public int getId() {
return ServerPacketIdentifier.SET_PASSENGERS;

View File

@ -3,6 +3,7 @@ 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 org.jetbrains.annotations.NotNull;
@ -12,6 +13,10 @@ public class SetSlotPacket implements ServerPacket {
public short slot;
public ItemStack itemStack;
public SetSlotPacket() {
itemStack = ItemStack.getAirItem();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(windowId);
@ -19,6 +24,13 @@ public class SetSlotPacket implements ServerPacket {
writer.writeItemStack(itemStack);
}
@Override
public void read(@NotNull BinaryReader reader) {
windowId = reader.readByte();
slot = reader.readShort();
itemStack = reader.readItemStack();
}
@Override
public int getId() {
return ServerPacketIdentifier.SET_SLOT;

View File

@ -6,6 +6,7 @@ import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.sound.SoundEvent;
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;
@ -17,6 +18,10 @@ public class SoundEffectPacket implements ServerPacket {
public float volume;
public float pitch;
public SoundEffectPacket() {
soundSource = Source.AMBIENT;
}
@NotNull
public static SoundEffectPacket create(Source category, SoundEvent sound, Position position, float volume, float pitch) {
SoundEffectPacket packet = new SoundEffectPacket();
@ -41,6 +46,17 @@ public class SoundEffectPacket implements ServerPacket {
writer.writeFloat(pitch);
}
@Override
public void read(@NotNull BinaryReader reader) {
soundId = reader.readVarInt();
soundSource = Source.values()[reader.readVarInt()];
x = reader.readInt()/8;
y = reader.readInt()/8;
z = reader.readInt()/8;
volume = reader.readFloat();
pitch = reader.readFloat();
}
@Override
public int getId() {
return ServerPacketIdentifier.SOUND_EFFECT;

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;
@ -17,6 +18,11 @@ public class SpawnEntityPacket implements ServerPacket {
public int data;
public short velocityX, velocityY, velocityZ;
public SpawnEntityPacket() {
uuid = new UUID(0, 0);
position = new Position();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -37,6 +43,24 @@ public class SpawnEntityPacket implements ServerPacket {
writer.writeShort(velocityZ);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
uuid = reader.readUuid();
type = reader.readVarInt();
position = new Position(reader.readDouble(), reader.readDouble(), reader.readDouble());
position.setYaw(reader.readByte() * 360f / 256f);
position.setPitch(reader.readByte() * 360f / 256f);
data = reader.readInt();
velocityX = reader.readShort();
velocityY = reader.readShort();
velocityZ = reader.readShort();
}
@Override
public int getId() {
return ServerPacketIdentifier.SPAWN_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.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 SpawnExperienceOrbPacket implements ServerPacket {
public Position position;
public short expCount;
public SpawnExperienceOrbPacket() {
position = new Position();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -21,6 +26,13 @@ public class SpawnExperienceOrbPacket implements ServerPacket {
writer.writeShort(expCount);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
position = new Position(reader.readDouble(), reader.readDouble(), reader.readDouble());
expCount = reader.readShort();
}
@Override
public int getId() {
return ServerPacketIdentifier.SPAWN_EXPERIENCE_ORB;

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;
@ -17,6 +18,11 @@ public class SpawnLivingEntityPacket implements ServerPacket {
public float headPitch;
public short velocityX, velocityY, velocityZ;
public SpawnLivingEntityPacket() {
entityUuid = new UUID(0, 0);
position = new Position();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -34,7 +40,23 @@ public class SpawnLivingEntityPacket implements ServerPacket {
writer.writeShort(velocityX);
writer.writeShort(velocityY);
writer.writeShort(velocityZ);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
entityUuid = reader.readUuid();
entityType = reader.readVarInt();
position = new Position(reader.readDouble(), reader.readDouble(), reader.readDouble());
position.setYaw(reader.readByte() * 360f / 256f);
position.setPitch(reader.readByte() * 360f / 256f);
headPitch = reader.readByte() * 360f / 256f;
velocityX = reader.readShort();
velocityY = reader.readShort();
velocityZ = reader.readShort();
}
@Override

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;
@ -16,6 +17,11 @@ public class SpawnPaintingPacket implements ServerPacket {
public BlockPosition position;
public byte direction;
public SpawnPaintingPacket() {
entityUuid = new UUID(0, 0);
position = new BlockPosition(0, 0, 0);
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -25,6 +31,15 @@ public class SpawnPaintingPacket implements ServerPacket {
writer.writeByte(direction);
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
entityUuid = reader.readUuid();
motive = reader.readVarInt();
position = reader.readBlockPosition();
direction = reader.readByte();
}
@Override
public int getId() {
return ServerPacketIdentifier.SPAWN_PAINTING;

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.BlockPosition;
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;
@ -14,6 +16,11 @@ public class SpawnPlayerPacket implements ServerPacket {
public UUID playerUuid;
public Position position;
public SpawnPlayerPacket() {
playerUuid = new UUID(0,0);
position = new Position();
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(entityId);
@ -25,6 +32,15 @@ public class SpawnPlayerPacket implements ServerPacket {
writer.writeByte((byte) (position.getPitch() * 256f / 360f));
}
@Override
public void read(@NotNull BinaryReader reader) {
entityId = reader.readVarInt();
playerUuid = reader.readUuid();
position = new Position(reader.readDouble(), reader.readDouble(), reader.readDouble());
position.setYaw((reader.readByte() * 360f) / 256f);
position.setPitch((reader.readByte() * 360f) / 256f);
}
@Override
public int getId() {
return ServerPacketIdentifier.SPAWN_PLAYER;

View File

@ -2,6 +2,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.utils.BlockPosition;
import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
@ -9,11 +11,21 @@ public class SpawnPositionPacket implements ServerPacket {
public int x, y, z;
public SpawnPositionPacket() {}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeBlockPosition(x, y, z);
}
@Override
public void read(@NotNull BinaryReader reader) {
BlockPosition pos = reader.readBlockPosition();
x = pos.getX();
y = pos.getY();
z = pos.getZ();
}
@Override
public int getId() {
return ServerPacketIdentifier.SPAWN_POSITION;

View File

@ -3,13 +3,20 @@ 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.stat.StatisticCategory;
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;
public class StatisticsPacket implements ServerPacket {
public Statistic[] statistics;
public StatisticsPacket() {
statistics = new Statistic[0];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(statistics.length);
@ -18,22 +25,40 @@ public class StatisticsPacket implements ServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
int length = reader.readVarInt();
statistics = new Statistic[length];
for (int i = 0; i < length; i++) {
statistics[i] = new Statistic();
statistics[i].read(reader);
}
}
@Override
public int getId() {
return ServerPacketIdentifier.STATISTICS;
}
public static class Statistic {
public static class Statistic implements Writeable, Readable {
public StatisticCategory category;
public int statisticId;
public int value;
private void write(BinaryWriter writer) {
@Override
public void write(BinaryWriter writer) {
writer.writeVarInt(category.ordinal());
writer.writeVarInt(statisticId);
writer.writeVarInt(value);
}
@Override
public void read(@NotNull BinaryReader reader) {
category = StatisticCategory.values()[reader.readVarInt()];
statisticId = reader.readVarInt();
value = reader.readVarInt();
}
}
}

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,10 @@ public class StopSoundPacket implements ServerPacket {
public int source;
public String sound;
public StopSoundPacket() {
sound = "";
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeByte(flags);
@ -20,6 +25,17 @@ public class StopSoundPacket implements ServerPacket {
writer.writeSizedString(sound);
}
@Override
public void read(@NotNull BinaryReader reader) {
flags = reader.readByte();
if(flags == 3 || flags == 1) {
source = reader.readVarInt();
}
if(flags == 2 || flags == 3) {
sound = reader.readSizedString(Integer.MAX_VALUE);
}
}
@Override
public int getId() {
return ServerPacketIdentifier.STOP_SOUND;

View File

@ -5,6 +5,7 @@ import net.minestom.server.adventure.ComponentHolder;
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;
@ -21,6 +22,10 @@ public class TabCompletePacket implements ComponentHoldingServerPacket {
public int length;
public Match[] matches;
public TabCompletePacket() {
matches = new Match[0];
}
@Override
public void write(@NotNull BinaryWriter writer) {
writer.writeVarInt(transactionId);
@ -36,6 +41,29 @@ public class TabCompletePacket implements ComponentHoldingServerPacket {
}
}
@Override
public void read(@NotNull BinaryReader reader) {
transactionId = reader.readVarInt();
start = reader.readVarInt();
length = reader.readVarInt();
int matchCount = reader.readVarInt();
matches = new Match[matchCount];
for (int i = 0; i < matchCount; i++) {
String match = reader.readSizedString(Integer.MAX_VALUE);
boolean hasTooltip = reader.readBoolean();
JsonMessage tooltip = null;
if(hasTooltip) {
tooltip = reader.readJsonMessage(Integer.MAX_VALUE);
}
Match newMatch = new Match();
newMatch.match = match;
newMatch.hasTooltip = hasTooltip;
newMatch.tooltip = tooltip;
matches[i] = newMatch;
}
}
@Override
public int getId() {
return ServerPacketIdentifier.TAB_COMPLETE;

View File

@ -6,8 +6,11 @@ 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 net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Collections;
@ -61,6 +64,11 @@ public class TeamsPacket implements ComponentHoldingServerPacket {
*/
public String[] entities;
public TeamsPacket() {
teamName = "";
action = Action.REMOVE_TEAM;
}
/**
* Writes data into the {@link BinaryWriter}
*
@ -97,6 +105,32 @@ public class TeamsPacket implements ComponentHoldingServerPacket {
}
@Override
public void read(@NotNull BinaryReader reader) {
teamName = reader.readSizedString(Integer.MAX_VALUE);
action = Action.values()[reader.readByte()];
switch (action) {
case CREATE_TEAM:
case UPDATE_TEAM_INFO:
this.teamDisplayName = reader.readJsonMessage(Integer.MAX_VALUE);
this.friendlyFlags = reader.readByte();
nameTagVisibility = NameTagVisibility.fromIdentifier(reader.readSizedString(Integer.MAX_VALUE));
collisionRule = CollisionRule.fromIdentifier(reader.readSizedString(Integer.MAX_VALUE));
this.teamColor = reader.readVarInt();
this.teamPrefix = reader.readJsonMessage(Integer.MAX_VALUE);
this.teamSuffix = reader.readJsonMessage(Integer.MAX_VALUE);
break;
case REMOVE_TEAM:
break;
}
if (action == Action.CREATE_TEAM || action == Action.ADD_PLAYERS_TEAM || action == Action.REMOVE_PLAYERS_TEAM) {
entities = reader.readSizedStringArray(Integer.MAX_VALUE);
}
}
/**
* Gets the identifier of the packet
*
@ -197,6 +231,16 @@ public class TeamsPacket implements ComponentHoldingServerPacket {
this.identifier = identifier;
}
@NotNull
public static NameTagVisibility fromIdentifier(String identifier) {
for(NameTagVisibility v : values()) {
if(v.getIdentifier().equals(identifier))
return v;
}
Check.fail("Identifier for NameTagVisibility is invalid: "+identifier);
return null;
}
/**
* Gets the client identifier
*
@ -243,6 +287,16 @@ public class TeamsPacket implements ComponentHoldingServerPacket {
this.identifier = identifier;
}
@NotNull
public static CollisionRule fromIdentifier(String identifier) {
for(CollisionRule v : values()) {
if(v.getIdentifier().equals(identifier))
return v;
}
Check.fail("Identifier for CollisionRule is invalid: "+identifier);
return null;
}
/**
* Gets the identifier of the rule
*

View File

@ -2,9 +2,14 @@ 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;
import java.util.function.Supplier;
public class WorldBorderPacket implements ServerPacket {
public Action action;
@ -26,27 +31,42 @@ public class WorldBorderPacket implements ServerPacket {
wbAction.write(writer);
}
@Override
public void read(@NotNull BinaryReader reader) {
action = Action.values()[reader.readVarInt()];
wbAction = action.generateNewInstance();
wbAction.read(reader);
}
@Override
public int getId() {
return ServerPacketIdentifier.WORLD_BORDER;
}
public enum Action {
SET_SIZE,
LERP_SIZE,
SET_CENTER,
INITIALIZE,
SET_WARNING_TIME,
SET_WARNING_BLOCKS
SET_SIZE(() -> new WBSetSize(0.0)),
LERP_SIZE(() -> new WBLerpSize(0.0, 0.0, 0)),
SET_CENTER(() -> new WBSetCenter(0.0, 0.0)),
INITIALIZE(() -> new WBInitialize(0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0)),
SET_WARNING_TIME(() -> new WBSetWarningTime(0)),
SET_WARNING_BLOCKS(() -> new WBSetWarningBlocks(0));
private Supplier<WBAction> generator;
Action(Supplier<WBAction> generator) {
this.generator = generator;
}
public WBAction generateNewInstance() {
return generator.get();
}
}
public static abstract class WBAction {
public abstract void write(BinaryWriter writer);
}
public static abstract class WBAction implements Writeable, Readable {}
public static class WBSetSize extends WBAction {
public final double diameter;
public double diameter;
public WBSetSize(double diameter) {
this.diameter = diameter;
@ -56,13 +76,18 @@ public class WorldBorderPacket implements ServerPacket {
public void write(BinaryWriter writer) {
writer.writeDouble(diameter);
}
@Override
public void read(@NotNull BinaryReader reader) {
diameter = reader.readDouble();
}
}
public static class WBLerpSize extends WBAction {
public final double oldDiameter;
public final double newDiameter;
public final long speed;
public double oldDiameter;
public double newDiameter;
public long speed;
public WBLerpSize(double oldDiameter, double newDiameter, long speed) {
this.oldDiameter = oldDiameter;
@ -76,11 +101,18 @@ public class WorldBorderPacket implements ServerPacket {
writer.writeDouble(newDiameter);
writer.writeVarLong(speed);
}
@Override
public void read(@NotNull BinaryReader reader) {
oldDiameter = reader.readDouble();
newDiameter = reader.readDouble();
speed = reader.readVarLong();
}
}
public static class WBSetCenter extends WBAction {
public final double x, z;
public double x, z;
public WBSetCenter(double x, double z) {
this.x = x;
@ -92,17 +124,23 @@ public class WorldBorderPacket implements ServerPacket {
writer.writeDouble(x);
writer.writeDouble(z);
}
@Override
public void read(@NotNull BinaryReader reader) {
x = reader.readDouble();
z = reader.readDouble();
}
}
public static class WBInitialize extends WBAction {
public final double x, z;
public final double oldDiameter;
public final double newDiameter;
public final long speed;
public final int portalTeleportBoundary;
public final int warningTime;
public final int warningBlocks;
public double x, z;
public double oldDiameter;
public double newDiameter;
public long speed;
public int portalTeleportBoundary;
public int warningTime;
public int warningBlocks;
public WBInitialize(double x, double z, double oldDiameter, double newDiameter, long speed,
int portalTeleportBoundary, int warningTime, int warningBlocks) {
@ -127,11 +165,23 @@ public class WorldBorderPacket implements ServerPacket {
writer.writeVarInt(warningTime);
writer.writeVarInt(warningBlocks);
}
@Override
public void read(@NotNull BinaryReader reader) {
x = reader.readDouble();
z = reader.readDouble();
oldDiameter = reader.readDouble();
newDiameter = reader.readDouble();
speed = reader.readVarLong();
portalTeleportBoundary = reader.readVarInt();
warningTime = reader.readVarInt();
warningBlocks = reader.readVarInt();
}
}
public static class WBSetWarningTime extends WBAction {
public final int warningTime;
public int warningTime;
public WBSetWarningTime(int warningTime) {
this.warningTime = warningTime;
@ -141,11 +191,16 @@ public class WorldBorderPacket implements ServerPacket {
public void write(BinaryWriter writer) {
writer.writeVarInt(warningTime);
}
@Override
public void read(@NotNull BinaryReader reader) {
warningTime = reader.readVarInt();
}
}
public static class WBSetWarningBlocks extends WBAction {
public final int warningBlocks;
public int warningBlocks;
public WBSetWarningBlocks(int warningBlocks) {
this.warningBlocks = warningBlocks;
@ -155,6 +210,11 @@ public class WorldBorderPacket implements ServerPacket {
public void write(BinaryWriter writer) {
writer.writeVarInt(warningBlocks);
}
@Override
public void read(@NotNull BinaryReader reader) {
warningBlocks = reader.readVarInt();
}
}
}

View File

@ -88,6 +88,24 @@ public final class Utils {
return result;
}
public static long readVarLong(ByteBuf buffer) {
int numRead = 0;
long result = 0;
byte read;
do {
read = buffer.readByte();
long value = (read & 0b01111111);
result |= (value << (7 * numRead));
numRead++;
if (numRead > 10) {
throw new RuntimeException("VarLong is too big");
}
} while ((read & 0b10000000) != 0);
return result;
}
public static void writeVarLong(BinaryWriter writer, long value) {
do {
byte temp = (byte) (value & 0b01111111);

View File

@ -43,6 +43,10 @@ public class BinaryReader extends InputStream {
return Utils.readVarInt(buffer);
}
public long readVarLong() {
return Utils.readVarLong(buffer);
}
public boolean readBoolean() {
return buffer.readBoolean();
}

View File

@ -37,6 +37,11 @@ public final class Check {
}
}
@Contract("_ -> fail")
public static void fail(@NotNull String reason) {
throw new IllegalArgumentException(reason);
}
@Contract("true, _ -> fail")
public static void stateCondition(boolean condition, @NotNull String reason) {
if (condition) {

View File

@ -82,6 +82,24 @@ public class DimensionType {
return new DimensionTypeBuilder();
}
public static DimensionType fromNBT(NBTCompound nbt) {
return DimensionType.builder(NamespaceID.from(nbt.getString("name")))
.ambientLight(nbt.getFloat("ambient_light"))
.infiniburn(NamespaceID.from(nbt.getString("infiniburn")))
.natural(nbt.getByte("natural") != 0)
.ceilingEnabled(nbt.getByte("has_ceiling") != 0)
.skylightEnabled(nbt.getByte("has_skylight") != 0)
.ultrawarm(nbt.getByte("ultrawarm") != 0)
.raidCapable(nbt.getByte("has_raids") != 0)
.respawnAnchorSafe(nbt.getByte("respawn_anchor_works") != 0)
.bedSafe(nbt.getByte("bed_works") != 0)
.effects(nbt.getString("effects"))
.piglinSafe(nbt.getByte("piglin_safe") != 0)
.logicalHeight(nbt.getInt("logical_height"))
.coordinateScale(nbt.getInt("coordinate_scale"))
.build();
}
@NotNull
public NBTCompound toIndexedNBT() {
NBTCompound nbt = new NBTCompound();