diff --git a/src/lwjgl/java/net/minestom/demo/largeframebuffers/Demo.java b/src/lwjgl/java/net/minestom/demo/largeframebuffers/Demo.java index 97d092b0b..71e6af396 100644 --- a/src/lwjgl/java/net/minestom/demo/largeframebuffers/Demo.java +++ b/src/lwjgl/java/net/minestom/demo/largeframebuffers/Demo.java @@ -102,11 +102,8 @@ public class Demo { MinecraftServer.getSchedulerManager().buildTask(() -> { renderingCode.accept(framebuffer); for (int i = 0; i < subviews.length; i++) { - final MapDataPacket packet = new MapDataPacket(); - packet.mapId = mapIDStart + i; - Framebuffer f = subviews[i]; - f.preparePacket(packet); + MapDataPacket packet = f.preparePacket(mapIDStart + i); sendPacket(packet); } }).repeat(15, TimeUnit.MILLISECOND).schedule(); diff --git a/src/main/java/net/minestom/server/advancements/Advancement.java b/src/main/java/net/minestom/server/advancements/Advancement.java index fc5f85508..0472685ff 100644 --- a/src/main/java/net/minestom/server/advancements/Advancement.java +++ b/src/main/java/net/minestom/server/advancements/Advancement.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Date; +import java.util.List; import java.util.Set; /** @@ -284,33 +285,14 @@ public class Advancement { this.parent = parent; } - @NotNull - protected AdvancementsPacket.ProgressMapping toProgressMapping() { - AdvancementsPacket.ProgressMapping progressMapping = new AdvancementsPacket.ProgressMapping(); - { - AdvancementsPacket.AdvancementProgress advancementProgress = new AdvancementsPacket.AdvancementProgress(); - advancementProgress.criteria = new AdvancementsPacket.Criteria[]{criteria}; - - progressMapping.key = identifier; - progressMapping.value = advancementProgress; - } - return progressMapping; + protected @NotNull AdvancementsPacket.ProgressMapping toProgressMapping() { + final var advancementProgress = new AdvancementsPacket.AdvancementProgress(List.of(criteria)); + return new AdvancementsPacket.ProgressMapping(identifier, advancementProgress); } - @NotNull - protected AdvancementsPacket.DisplayData toDisplayData() { - AdvancementsPacket.DisplayData displayData = new AdvancementsPacket.DisplayData(); - displayData.x = x; - displayData.y = y; - displayData.title = title; - displayData.description = description; - displayData.icon = icon; - displayData.frameType = frameType; - displayData.flags = getFlags(); - if (background != null) { - displayData.backgroundTexture = background; - } - return displayData; + protected @NotNull AdvancementsPacket.DisplayData toDisplayData() { + return new AdvancementsPacket.DisplayData(title, description, icon, + frameType, getFlags(), background, x, y); } /** @@ -318,31 +300,13 @@ public class Advancement { * * @return the mapping of this advancement */ - @NotNull - protected AdvancementsPacket.AdvancementMapping toMapping() { - AdvancementsPacket.AdvancementMapping mapping = new AdvancementsPacket.AdvancementMapping(); - { - AdvancementsPacket.Advancement adv = new AdvancementsPacket.Advancement(); - mapping.key = getIdentifier(); - mapping.value = adv; - - final Advancement parent = getParent(); - if (parent != null) { - adv.parentIdentifier = parent.getIdentifier(); - } - - adv.displayData = toDisplayData(); - adv.criterions = new String[]{criteria.criterionIdentifier}; - - AdvancementsPacket.Requirement requirement = new AdvancementsPacket.Requirement(); - { - requirement.requirements = new String[]{criteria.criterionIdentifier}; - } - adv.requirements = new AdvancementsPacket.Requirement[]{requirement}; - - } - - return mapping; + protected @NotNull AdvancementsPacket.AdvancementMapping toMapping() { + final Advancement parent = getParent(); + final String parentIdentifier = parent != null ? parent.getIdentifier() : null; + AdvancementsPacket.Advancement adv = new AdvancementsPacket.Advancement(parentIdentifier, toDisplayData(), + List.of(criteria.criterionIdentifier()), + List.of(criteria.criterionIdentifier())); + return new AdvancementsPacket.AdvancementMapping(getIdentifier(), adv); } /** @@ -351,16 +315,8 @@ public class Advancement { * @return the packet to add this advancement */ protected AdvancementsPacket getUpdatePacket() { - AdvancementsPacket advancementsPacket = new AdvancementsPacket(); - advancementsPacket.resetAdvancements = false; - - final AdvancementsPacket.AdvancementMapping mapping = toMapping(); - - advancementsPacket.identifiersToRemove = new String[]{}; - advancementsPacket.advancementMappings = new AdvancementsPacket.AdvancementMapping[]{mapping}; - advancementsPacket.progressMappings = new AdvancementsPacket.ProgressMapping[]{toProgressMapping()}; - - return advancementsPacket; + return new AdvancementsPacket(false, List.of(toMapping()), + List.of(), List.of(toProgressMapping())); } /** @@ -379,16 +335,9 @@ public class Advancement { } protected void updateCriteria() { - this.criteria = new AdvancementsPacket.Criteria(); - { - AdvancementsPacket.CriterionProgress progress = new AdvancementsPacket.CriterionProgress(); - progress.achieved = achieved; - if (achieved) { - progress.dateOfAchieving = new Date(System.currentTimeMillis()).getTime(); - } - this.criteria.criterionProgress = progress; - this.criteria.criterionIdentifier = identifier; - } + Long achievedDate = achieved ? new Date(System.currentTimeMillis()).getTime() : null; + final var progress = new AdvancementsPacket.CriterionProgress(achievedDate); + this.criteria = new AdvancementsPacket.Criteria(identifier, progress); } private int getFlags() { diff --git a/src/main/java/net/minestom/server/advancements/AdvancementTab.java b/src/main/java/net/minestom/server/advancements/AdvancementTab.java index 5bc96795b..c1c31fd50 100644 --- a/src/main/java/net/minestom/server/advancements/AdvancementTab.java +++ b/src/main/java/net/minestom/server/advancements/AdvancementTab.java @@ -87,24 +87,14 @@ public class AdvancementTab implements Viewable { * * @return the packet adding this advancement tab and all its advancements */ - @NotNull - protected AdvancementsPacket createPacket() { - AdvancementsPacket advancementsPacket = new AdvancementsPacket(); - advancementsPacket.resetAdvancements = false; - + protected @NotNull AdvancementsPacket createPacket() { List mappings = new ArrayList<>(); List progressMappings = new ArrayList<>(); - for (Advancement advancement : advancementMap.keySet()) { mappings.add(advancement.toMapping()); progressMappings.add(advancement.toProgressMapping()); } - - advancementsPacket.identifiersToRemove = new String[]{}; - advancementsPacket.advancementMappings = mappings.toArray(new AdvancementsPacket.AdvancementMapping[0]); - advancementsPacket.progressMappings = progressMappings.toArray(new AdvancementsPacket.ProgressMapping[0]); - - return advancementsPacket; + return new AdvancementsPacket(false, mappings, List.of(), progressMappings); } /** diff --git a/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java b/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java index 57f597d3d..9cfe148fa 100644 --- a/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java +++ b/src/main/java/net/minestom/server/advancements/notifications/NotificationCenter.java @@ -8,6 +8,7 @@ import net.minestom.server.utils.advancement.AdvancementUtils; import java.sql.Date; import java.util.Collection; +import java.util.List; /** * Used to send one or multiples {@link Notification}. @@ -58,72 +59,23 @@ public class NotificationCenter { * @return the packet used to show the Toast */ private static AdvancementsPacket getCreatePacket(Notification notification) { - // For An advancement to be shown, it must have all of it's criteria achieved (progress 100%) + // For An advancement to be shown, it must have all of its criteria achieved (progress 100%) // Create a Criteria that we can set to 100% achieved. - // Criteria + final var displayData = new AdvancementsPacket.DisplayData( + notification.getTitle(), Component.text("Articdive was here. #Minestom"), + notification.getIcon(), notification.getFrameType(), + 0x6, null, 0f, 0f); - AdvancementsPacket.Criteria criteria = new AdvancementsPacket.Criteria(); - { - AdvancementsPacket.CriterionProgress progress = new AdvancementsPacket.CriterionProgress(); - progress.achieved = true; - progress.dateOfAchieving = new Date(System.currentTimeMillis()).getTime(); - criteria.criterionProgress = progress; - criteria.criterionIdentifier = "minestom:some_criteria"; - } + final var criteria = new AdvancementsPacket.Criteria("minestom:some_criteria", + new AdvancementsPacket.CriterionProgress(new Date(System.currentTimeMillis()).getTime())); - // Now create an AdvancementsPacket that we can send: - AdvancementsPacket advancementsPacket = new AdvancementsPacket(); - advancementsPacket.resetAdvancements = false; + final var advancement = new AdvancementsPacket.Advancement(null, displayData, + List.of(criteria.criterionIdentifier()), List.of(criteria.criterionIdentifier())); - AdvancementsPacket.AdvancementMapping mapping = new AdvancementsPacket.AdvancementMapping(); - { - // Get the advancement - AdvancementsPacket.Advancement advancement = new AdvancementsPacket.Advancement(); - // Setup display data for the advancement - AdvancementsPacket.DisplayData displayData = new AdvancementsPacket.DisplayData(); - { - displayData.title = notification.getTitle(); - // Description is required, but never shown/seen so, small Easter egg. - displayData.description = Component.text("Articdive was here. #Minestom"); - displayData.icon = notification.getIcon(); - displayData.frameType = notification.getFrameType(); - displayData.flags = 0x6; - // No background texture required as we are using 0x6 - displayData.x = 0.0F; - displayData.y = 0.0F; - } - advancement.displayData = displayData; - // Add the criteria to the advancement - advancement.criterions = new String[]{criteria.criterionIdentifier}; - // Add the requirement of the criteria to the advancement - AdvancementsPacket.Requirement requirement = new AdvancementsPacket.Requirement(); - { - requirement.requirements = new String[]{criteria.criterionIdentifier}; - } - advancement.requirements = new AdvancementsPacket.Requirement[]{requirement}; + final var mapping = new AdvancementsPacket.AdvancementMapping(IDENTIFIER, advancement); + final var progressMapping = new AdvancementsPacket.ProgressMapping(IDENTIFIER, + new AdvancementsPacket.AdvancementProgress(List.of(criteria))); - mapping.key = IDENTIFIER; - mapping.value = advancement; - } - // Add the mapping to the main packet - advancementsPacket.advancementMappings = new AdvancementsPacket.AdvancementMapping[]{mapping}; - - - // We have no identifiers to remove. - advancementsPacket.identifiersToRemove = new String[]{}; - - // Now we need to set the player's progress for the criteria. - AdvancementsPacket.ProgressMapping progressMapping = new AdvancementsPacket.ProgressMapping(); - { - AdvancementsPacket.AdvancementProgress advancementProgress = new AdvancementsPacket.AdvancementProgress(); - advancementProgress.criteria = new AdvancementsPacket.Criteria[]{criteria}; - - progressMapping.key = IDENTIFIER; - progressMapping.value = advancementProgress; - } - advancementsPacket.progressMappings = new AdvancementsPacket.ProgressMapping[]{progressMapping}; - - return advancementsPacket; + return new AdvancementsPacket(false, List.of(mapping), List.of(), List.of(progressMapping)); } - } diff --git a/src/main/java/net/minestom/server/adventure/AdventurePacketConvertor.java b/src/main/java/net/minestom/server/adventure/AdventurePacketConvertor.java index cbf7bf67a..abd6bb528 100644 --- a/src/main/java/net/minestom/server/adventure/AdventurePacketConvertor.java +++ b/src/main/java/net/minestom/server/adventure/AdventurePacketConvertor.java @@ -10,6 +10,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.title.Title; import net.kyori.adventure.title.TitlePart; +import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Entity; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.play.*; @@ -110,25 +111,11 @@ public class AdventurePacketConvertor { public static @NotNull ServerPacket createSoundPacket(@NotNull Sound sound, double x, double y, double z) { final SoundEvent minestomSound = SoundEvent.fromNamespaceId(sound.name().asString()); if (minestomSound == null) { - final NamedSoundEffectPacket packet = new NamedSoundEffectPacket(); - packet.soundName = sound.name().asString(); - packet.soundSource = sound.source(); - packet.x = (int) x; - packet.y = (int) y; - packet.z = (int) z; - packet.volume = sound.volume(); - packet.pitch = sound.pitch(); - return packet; + return new NamedSoundEffectPacket(sound.name().asString(), sound.source(), + (int) x, (int) y, (int) z, sound.volume(), sound.pitch()); } else { - final SoundEffectPacket packet = new SoundEffectPacket(); - packet.soundId = minestomSound.id(); - packet.soundSource = sound.source(); - packet.x = (int) x; - packet.y = (int) y; - packet.z = (int) z; - packet.volume = sound.volume(); - packet.pitch = sound.pitch(); - return packet; + return new SoundEffectPacket(minestomSound.id(), sound.source(), + (int) x, (int) y, (int) z, sound.volume(), sound.pitch()); } } @@ -148,24 +135,11 @@ public class AdventurePacketConvertor { final SoundEvent minestomSound = SoundEvent.fromNamespaceId(sound.name().asString()); if (minestomSound != null) { - final EntitySoundEffectPacket packet = new EntitySoundEffectPacket(); - packet.soundId = minestomSound.id(); - packet.soundSource = sound.source(); - packet.entityId = entity.getEntityId(); - packet.volume = sound.volume(); - packet.pitch = sound.pitch(); - return packet; + return new EntitySoundEffectPacket(minestomSound.id(), sound.source(), entity.getEntityId(), sound.volume(), sound.pitch()); } else { - final var pos = entity.getPosition(); - final NamedSoundEffectPacket packet = new NamedSoundEffectPacket(); - packet.soundName = sound.name().asString(); - packet.soundSource = sound.source(); - packet.x = (int) pos.x(); - packet.y = (int) pos.y(); - packet.z = (int) pos.z(); - packet.volume = sound.volume(); - packet.pitch = sound.pitch(); - return packet; + final Pos pos = entity.getPosition(); + return new NamedSoundEffectPacket(sound.name().asString(), sound.source(), + (int) pos.x(), (int) pos.y(), (int) pos.z(), sound.volume(), sound.pitch()); } } @@ -189,30 +163,27 @@ public class AdventurePacketConvertor { * @return the sound stop packet */ public static ServerPacket createSoundStopPacket(@NotNull SoundStop stop) { - StopSoundPacket packet = new StopSoundPacket(); - packet.flags = 0x0; + byte flags = 0x0; + Sound.Source source = stop.source(); + String sound = null; - final Sound.Source source = stop.source(); - if (source != null) { - packet.flags |= 0x1; - packet.source = AdventurePacketConvertor.getSoundSourceValue(source); + if (source != null) flags |= 0x1; + + final Key soundKey = stop.sound(); + if (soundKey != null) { + flags |= 0x2; + sound = soundKey.asString(); } - final Key sound = stop.sound(); - if (sound != null) { - packet.flags |= 0x2; - packet.sound = sound.asString(); - } - - return packet; + return new StopSoundPacket(flags, source, sound); } /** * Creates one of the three title packets from a title part and a value. * - * @param part the part + * @param part the part * @param value the value - * @param the type of the part + * @param the type of the part * @return the title packet */ public static @NotNull ServerPacket createTitlePartPacket(@NotNull TitlePart part, @NotNull T value) { diff --git a/src/main/java/net/minestom/server/adventure/audience/PacketGroupingAudience.java b/src/main/java/net/minestom/server/adventure/audience/PacketGroupingAudience.java index 0767089c1..f253588cd 100644 --- a/src/main/java/net/minestom/server/adventure/audience/PacketGroupingAudience.java +++ b/src/main/java/net/minestom/server/adventure/audience/PacketGroupingAudience.java @@ -78,7 +78,7 @@ public interface PacketGroupingAudience extends ForwardingAudience { @Override default void clearTitle() { - sendGroupedPacket(new ClearTitlesPacket()); + sendGroupedPacket(new ClearTitlesPacket(false)); } @Override diff --git a/src/main/java/net/minestom/server/adventure/bossbar/BossBarHolder.java b/src/main/java/net/minestom/server/adventure/bossbar/BossBarHolder.java index 9a5deb280..1d249c7cd 100644 --- a/src/main/java/net/minestom/server/adventure/bossbar/BossBarHolder.java +++ b/src/main/java/net/minestom/server/adventure/bossbar/BossBarHolder.java @@ -12,9 +12,6 @@ import java.util.Collections; import java.util.Set; import java.util.UUID; import java.util.concurrent.CopyOnWriteArraySet; -import java.util.function.Consumer; - -import static net.minestom.server.network.packet.server.play.BossBarPacket.Action.*; /** * A holder of a boss bar. This class is not intended for public use, instead you should @@ -31,32 +28,23 @@ final class BossBarHolder implements Viewable { } @NotNull BossBarPacket createRemovePacket() { - return this.createGenericPacket(REMOVE, packet -> { }); + return new BossBarPacket(uuid, new BossBarPacket.RemoveAction()); } @NotNull BossBarPacket createAddPacket() { - return this.createGenericPacket(ADD, packet -> { - packet.title = bar.name(); - packet.color = bar.color(); - packet.overlay = bar.overlay(); - packet.health = bar.progress(); - packet.flags = AdventurePacketConvertor.getBossBarFlagValue(bar.flags()); - }); + return new BossBarPacket(uuid, new BossBarPacket.AddAction(bar)); } @NotNull BossBarPacket createPercentUpdate(float newPercent) { - return this.createGenericPacket(UPDATE_HEALTH, packet -> packet.health = newPercent); + return new BossBarPacket(uuid, new BossBarPacket.UpdateHealthAction(newPercent)); } @NotNull BossBarPacket createColorUpdate(@NotNull BossBar.Color color) { - return this.createGenericPacket(UPDATE_STYLE, packet -> { - packet.color = color; - packet.overlay = bar.overlay(); - }); + return new BossBarPacket(uuid, new BossBarPacket.UpdateStyleAction(color, bar.overlay())); } @NotNull BossBarPacket createTitleUpdate(@NotNull Component title) { - return this.createGenericPacket(UPDATE_TITLE, packet -> packet.title = title); + return new BossBarPacket(uuid, new BossBarPacket.UpdateTitleAction(title)); } @NotNull BossBarPacket createFlagsUpdate() { @@ -64,22 +52,11 @@ final class BossBarHolder implements Viewable { } @NotNull BossBarPacket createFlagsUpdate(@NotNull Set newFlags) { - return this.createGenericPacket(UPDATE_FLAGS, packet -> packet.flags = AdventurePacketConvertor.getBossBarFlagValue(newFlags)); + return new BossBarPacket(uuid, new BossBarPacket.UpdateFlagsAction(AdventurePacketConvertor.getBossBarFlagValue(newFlags))); } @NotNull BossBarPacket createOverlayUpdate(@NotNull BossBar.Overlay overlay) { - return this.createGenericPacket(UPDATE_STYLE, packet -> { - packet.overlay = overlay; - packet.color = bar.color(); - }); - } - - private @NotNull BossBarPacket createGenericPacket(@NotNull BossBarPacket.Action action, @NotNull Consumer consumer) { - BossBarPacket packet = new BossBarPacket(); - packet.uuid = this.uuid; - packet.action = action; - consumer.accept(packet); - return packet; + return new BossBarPacket(uuid, new BossBarPacket.UpdateStyleAction(bar.color(), overlay)); } @Override diff --git a/src/main/java/net/minestom/server/command/CommandManager.java b/src/main/java/net/minestom/server/command/CommandManager.java index 14b0185f4..90c3c28e0 100644 --- a/src/main/java/net/minestom/server/command/CommandManager.java +++ b/src/main/java/net/minestom/server/command/CommandManager.java @@ -177,8 +177,6 @@ public final class CommandManager { * @return the commands packet for the specific player */ private @NotNull DeclareCommandsPacket buildPacket(@NotNull Player player) { - DeclareCommandsPacket declareCommandsPacket = new DeclareCommandsPacket(); - List nodes = new ArrayList<>(); // Contains the children of the main node (all commands name) IntList rootChildren = new IntArrayList(); @@ -227,11 +225,7 @@ public final class CommandManager { } // Add root node children rootNode.children = ArrayUtils.toArray(rootChildren); - - declareCommandsPacket.nodes = nodes.toArray(new DeclareCommandsPacket.Node[0]); - declareCommandsPacket.rootIndex = 0; - - return declareCommandsPacket; + return new DeclareCommandsPacket(nodes, 0); } private int serializeCommand(CommandSender sender, Command command, diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index af886b94b..c664f800d 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -677,7 +677,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler final List effects = this.effects; if (effects.isEmpty()) return; effects.removeIf(timedPotion -> { - final long potionTime = (long) timedPotion.getPotion().getDuration() * MinecraftServer.TICK_MS; + final long potionTime = (long) timedPotion.getPotion().duration() * MinecraftServer.TICK_MS; // Remove if the potion should be expired if (time >= timedPotion.getStartingTime() + potionTime) { // Send the packet that the potion should no longer be applied @@ -1042,17 +1042,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler } protected @NotNull SetPassengersPacket getPassengersPacket() { - SetPassengersPacket passengersPacket = new SetPassengersPacket(); - passengersPacket.vehicleEntityId = getEntityId(); - - int[] passengers = new int[this.passengers.size()]; - int counter = 0; - for (Entity passenger : this.passengers) { - passengers[counter++] = passenger.getEntityId(); - } - - passengersPacket.passengersId = passengers; - return passengersPacket; + return new SetPassengersPacket(getEntityId(), passengers.stream().map(Entity::getEntityId).toList()); } /** @@ -1406,7 +1396,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler * @param potion The potion to add */ public void addEffect(@NotNull Potion potion) { - removeEffect(potion.getEffect()); + removeEffect(potion.effect()); this.effects.add(new TimedPotion(potion, System.currentTimeMillis())); potion.sendAddPacket(this); EventDispatcher.call(new EntityPotionAddEvent(this, potion)); @@ -1419,7 +1409,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler */ public void removeEffect(@NotNull PotionEffect effect) { this.effects.removeIf(timedPotion -> { - if (timedPotion.getPotion().getEffect() == effect) { + if (timedPotion.getPotion().effect() == effect) { timedPotion.getPotion().sendRemovePacket(this); EventDispatcher.call(new EntityPotionRemoveEvent(this, timedPotion.getPotion())); return true; diff --git a/src/main/java/net/minestom/server/entity/EntitySpawnType.java b/src/main/java/net/minestom/server/entity/EntitySpawnType.java index 6e46818aa..9c2fd41e4 100644 --- a/src/main/java/net/minestom/server/entity/EntitySpawnType.java +++ b/src/main/java/net/minestom/server/entity/EntitySpawnType.java @@ -1,5 +1,7 @@ package net.minestom.server.entity; +import net.minestom.server.coordinate.Point; +import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.metadata.ObjectDataProvider; import net.minestom.server.entity.metadata.other.ExperienceOrbMeta; @@ -11,37 +13,28 @@ public enum EntitySpawnType { BASE { @Override public ServerPacket getSpawnPacket(Entity entity) { - SpawnEntityPacket packet = new SpawnEntityPacket(); - packet.entityId = entity.getEntityId(); - packet.uuid = entity.getUuid(); - packet.type = entity.getEntityType().id(); - packet.position = entity.getPosition(); + int data = 0; + short velocityX = 0, velocityZ = 0, velocityY = 0; if (entity.getEntityMeta() instanceof ObjectDataProvider objectDataProvider) { - packet.data = objectDataProvider.getObjectData(); + data = objectDataProvider.getObjectData(); if (objectDataProvider.requiresVelocityPacketAtSpawn()) { final var velocity = entity.getVelocityForPacket(); - packet.velocityX = (short) velocity.x(); - packet.velocityY = (short) velocity.y(); - packet.velocityZ = (short) velocity.z(); + velocityX = (short) velocity.x(); + velocityY = (short) velocity.y(); + velocityZ = (short) velocity.z(); } } - return packet; + return new SpawnEntityPacket(entity.getEntityId(), entity.getUuid(), entity.getEntityType().id(), + entity.getPosition(), data, velocityX, velocityY, velocityZ); } }, LIVING { @Override public ServerPacket getSpawnPacket(Entity entity) { - SpawnLivingEntityPacket packet = new SpawnLivingEntityPacket(); - packet.entityId = entity.getEntityId(); - packet.entityUuid = entity.getUuid(); - packet.entityType = entity.getEntityType().id(); - packet.position = entity.getPosition(); - packet.headPitch = entity.getPosition().pitch(); - final var velocity = entity.getVelocityForPacket(); - packet.velocityX = (short) velocity.x(); - packet.velocityY = (short) velocity.y(); - packet.velocityZ = (short) velocity.z(); - return packet; + final Pos position = entity.getPosition(); + final Vec velocity = entity.getVelocityForPacket(); + return new SpawnLivingEntityPacket(entity.getEntityId(), entity.getUuid(), entity.getEntityType().id(), + position, position.yaw(), (short) velocity.x(), (short) velocity.y(), (short) velocity.z()); } }, PLAYER { @@ -53,41 +46,35 @@ public enum EntitySpawnType { EXPERIENCE_ORB { @Override public ServerPacket getSpawnPacket(Entity entity) { - SpawnExperienceOrbPacket packet = new SpawnExperienceOrbPacket(); - packet.entityId = entity.getEntityId(); - packet.position = entity.getPosition(); - if (entity.getEntityMeta() instanceof ExperienceOrbMeta experienceOrbMeta) { - packet.expCount = (short) experienceOrbMeta.getCount(); - } - return packet; + final short expCount = (short) (entity.getEntityMeta() instanceof ExperienceOrbMeta experienceOrbMeta ? + experienceOrbMeta.getCount() : 0); + return new SpawnExperienceOrbPacket(entity.getEntityId(), entity.getPosition(), expCount); } }, PAINTING { @Override public ServerPacket getSpawnPacket(Entity entity) { - SpawnPaintingPacket packet = new SpawnPaintingPacket(); - packet.entityId = entity.getEntityId(); - packet.entityUuid = entity.getUuid(); + int motive = 0; + Point position = Vec.ZERO; + byte direction = 0; if (entity.getEntityMeta() instanceof PaintingMeta paintingMeta) { - packet.motive = paintingMeta.getMotive().ordinal(); - packet.position = new Vec( + motive = paintingMeta.getMotive().ordinal(); + position = new Vec( Math.max(0, (paintingMeta.getMotive().getWidth() >> 1) - 1), paintingMeta.getMotive().getHeight() >> 1, 0 ); - switch (paintingMeta.getDirection()) { - case SOUTH -> packet.direction = 0; - case WEST -> packet.direction = 1; - case NORTH -> packet.direction = 2; - case EAST -> packet.direction = 3; - } - } else { - packet.position = Vec.ZERO; + direction = switch (paintingMeta.getDirection()) { + case SOUTH -> 0; + case WEST -> 1; + case NORTH -> 2; + case EAST -> 3; + default -> 0; + }; } - return packet; + return new SpawnPaintingPacket(entity.getEntityId(), entity.getUuid(), motive, position, direction); } }; public abstract ServerPacket getSpawnPacket(Entity entity); - } diff --git a/src/main/java/net/minestom/server/entity/LivingEntity.java b/src/main/java/net/minestom/server/entity/LivingEntity.java index 080c52b36..b5faeda90 100644 --- a/src/main/java/net/minestom/server/entity/LivingEntity.java +++ b/src/main/java/net/minestom/server/entity/LivingEntity.java @@ -369,12 +369,8 @@ public class LivingEntity extends Entity implements EquipmentHandler { // TODO: separate living entity categories soundCategory = Source.HOSTILE; } - - SoundEffectPacket damageSoundPacket = - SoundEffectPacket.create(soundCategory, sound, - getPosition(), - 1.0f, 1.0f); - sendPacketToViewersAndSelf(damageSoundPacket); + sendPacketToViewersAndSelf(new SoundEffectPacket(sound, soundCategory, + getPosition(), 1.0f, 1.0f)); } }); @@ -590,32 +586,11 @@ public class LivingEntity extends Entity implements EquipmentHandler { * @param attributes the attributes to include in the packet * @return an {@link EntityPropertiesPacket} linked to this entity */ - @NotNull - protected EntityPropertiesPacket getPropertiesPacket(@NotNull Collection attributes) { + protected @NotNull EntityPropertiesPacket getPropertiesPacket(@NotNull Collection attributes) { // Get all the attributes which should be sent to the client - final AttributeInstance[] instances = attributes.stream() - .filter(i -> i.getAttribute().isShared()) - .toArray(AttributeInstance[]::new); - - - EntityPropertiesPacket propertiesPacket = new EntityPropertiesPacket(); - propertiesPacket.entityId = getEntityId(); - - EntityPropertiesPacket.Property[] properties = new EntityPropertiesPacket.Property[instances.length]; - for (int i = 0; i < properties.length; ++i) { - EntityPropertiesPacket.Property property = new EntityPropertiesPacket.Property(); - - final float value = instances[i].getBaseValue(); - - property.instance = instances[i]; - property.attribute = instances[i].getAttribute(); - property.value = value; - - properties[i] = property; - } - - propertiesPacket.properties = properties; - return propertiesPacket; + final List properties = attributes.stream() + .filter(i -> i.getAttribute().isShared()).toList(); + return new EntityPropertiesPacket(getEntityId(), properties); } @Override diff --git a/src/main/java/net/minestom/server/entity/Metadata.java b/src/main/java/net/minestom/server/entity/Metadata.java index 41e3949b1..010810924 100644 --- a/src/main/java/net/minestom/server/entity/Metadata.java +++ b/src/main/java/net/minestom/server/entity/Metadata.java @@ -1,7 +1,6 @@ package net.minestom.server.entity; import net.kyori.adventure.text.Component; -import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Vec; import net.minestom.server.item.ItemStack; @@ -15,9 +14,7 @@ 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.io.IOException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @@ -136,15 +133,7 @@ public class Metadata { } public static Value NBT(@NotNull NBT 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; - } - }); + return new Value<>(TYPE_NBT, nbt, writer -> writer.writeNBT("", nbt), BinaryReader::readTag); } public static Value VillagerData(int villagerType, diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 037726cd2..7b892d719 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -46,13 +46,14 @@ import net.minestom.server.inventory.PlayerInventory; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import net.minestom.server.item.metadata.WrittenBookMeta; +import net.minestom.server.listener.manager.PacketListenerManager; import net.minestom.server.message.ChatMessageType; import net.minestom.server.message.ChatPosition; import net.minestom.server.message.Messenger; import net.minestom.server.network.ConnectionManager; import net.minestom.server.network.ConnectionState; import net.minestom.server.network.PlayerProvider; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.packet.client.play.ClientChatMessagePacket; import net.minestom.server.network.packet.server.SendablePacket; import net.minestom.server.network.packet.server.ServerPacket; @@ -83,6 +84,7 @@ import org.jctools.queues.MpscUnboundedXaddArrayQueue; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jglrxavpok.hephaistos.nbt.NBTCompound; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -101,6 +103,7 @@ import java.util.function.UnaryOperator; public class Player extends LivingEntity implements CommandSender, Localizable, HoverEventSource, Identified, NamedAndIdentified { private static final Component REMOVE_MESSAGE = Component.text("You have been removed from the server without reason.", NamedTextColor.RED); + private static final PacketListenerManager PACKET_LISTENER_MANAGER = MinecraftServer.getPacketListenerManager(); private long lastKeepAlive; private boolean answerKeepAlive; @@ -137,7 +140,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, private final AtomicInteger teleportId = new AtomicInteger(); private int receivedTeleportId; - private final MessagePassingQueue packets = new MpscUnboundedXaddArrayQueue<>(32); + private final MessagePassingQueue packets = new MpscUnboundedXaddArrayQueue<>(32); private final boolean levelFlat; private final PlayerSettings settings; private float exp; @@ -234,15 +237,16 @@ public class Player extends LivingEntity implements CommandSender, Localizable, public void UNSAFE_init(@NotNull Instance spawnInstance) { this.dimensionType = spawnInstance.getDimensionType(); - JoinGamePacket joinGamePacket = new JoinGamePacket(); - joinGamePacket.entityId = getEntityId(); - joinGamePacket.gameMode = gameMode; - joinGamePacket.dimensionType = dimensionType; - joinGamePacket.maxPlayers = 0; // Unused - joinGamePacket.viewDistance = MinecraftServer.getChunkViewDistance(); - joinGamePacket.simulationDistance = MinecraftServer.getChunkViewDistance(); - joinGamePacket.reducedDebugInfo = false; - joinGamePacket.isFlat = levelFlat; + NBTCompound nbt = new NBTCompound(); + NBTCompound dimensions = MinecraftServer.getDimensionTypeManager().toNBT(); + NBTCompound biomes = MinecraftServer.getBiomeManager().toNBT(); + nbt.set("minecraft:dimension_type", dimensions); + nbt.set("minecraft:worldgen/biome", biomes); + + final JoinGamePacket joinGamePacket = new JoinGamePacket(getEntityId(), gameMode.isHardcore(), gameMode, null, + List.of("minestom:world"), nbt, dimensionType.toNBT(), dimensionType.getName().asString(), + 0, 0, MinecraftServer.getChunkViewDistance(), MinecraftServer.getChunkViewDistance(), + false, true, false, levelFlat); playerConnection.sendPacket(joinGamePacket); // Server brand name @@ -268,10 +272,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, // Recipes start { RecipeManager recipeManager = MinecraftServer.getRecipeManager(); - DeclareRecipesPacket declareRecipesPacket = recipeManager.getDeclareRecipesPacket(); - if (declareRecipesPacket.recipes != null) { - playerConnection.sendPacket(declareRecipesPacket); - } + playerConnection.sendPacket(recipeManager.getDeclareRecipesPacket()); List recipesIdentifier = new ArrayList<>(); for (Recipe recipe : recipeManager.getRecipes()) { @@ -281,11 +282,12 @@ public class Player extends LivingEntity implements CommandSender, Localizable, recipesIdentifier.add(recipe.getRecipeId()); } if (!recipesIdentifier.isEmpty()) { - final String[] identifiers = recipesIdentifier.toArray(new String[0]); - UnlockRecipesPacket unlockRecipesPacket = new UnlockRecipesPacket(); - unlockRecipesPacket.mode = 0; - unlockRecipesPacket.recipesId = identifiers; - unlockRecipesPacket.initRecipesId = identifiers; + UnlockRecipesPacket unlockRecipesPacket = new UnlockRecipesPacket(0, + false, false, + false, false, + false, false, + false, false, + recipesIdentifier, recipesIdentifier); playerConnection.sendPacket(unlockRecipesPacket); } } @@ -315,7 +317,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, this.playerConnection.update(); // Process received packets - this.packets.drain(packet -> packet.process(this)); + this.packets.drain(packet -> PACKET_LISTENER_MANAGER.processClientPacket(packet, this)); super.update(time); // Super update (item pickup/fire management) @@ -399,7 +401,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, // #buildDeathScreenText can return null, check here if (deathText != null) { - playerConnection.sendPacket(DeathCombatEventPacket.of(getEntityId(), -1, deathText)); + playerConnection.sendPacket(new DeathCombatEventPacket(getEntityId(), -1, deathText)); } // #buildDeathMessage can return null, check here @@ -422,10 +424,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, setFireForDuration(0); setOnFire(false); refreshHealth(); - RespawnPacket respawnPacket = new RespawnPacket(); - respawnPacket.dimensionType = getDimensionType(); - respawnPacket.gameMode = getGameMode(); - respawnPacket.isFlat = levelFlat; + RespawnPacket respawnPacket = new RespawnPacket(getDimensionType(), getDimensionType().getName().asString(), + 0, gameMode, gameMode, false, levelFlat, true); getPlayerConnection().sendPacket(respawnPacket); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this); EventDispatcher.call(respawnEvent); @@ -640,9 +640,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, * @param message the message that the player will send */ public void chat(@NotNull String message) { - ClientChatMessagePacket chatMessagePacket = new ClientChatMessagePacket(); - chatMessagePacket.message = message; - addPacketToQueue(chatMessagePacket); + addPacketToQueue(new ClientChatMessagePacket(message)); } @Override @@ -684,12 +682,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, * @param disableRelativeVolume disable volume scaling based on distance */ public void playEffect(@NotNull Effects effect, int x, int y, int z, int data, boolean disableRelativeVolume) { - EffectPacket packet = new EffectPacket(); - packet.effectId = effect.getId(); - packet.position = new Vec(x, y, z); - packet.data = data; - packet.disableRelativeVolume = disableRelativeVolume; - playerConnection.sendPacket(packet); + playerConnection.sendPacket(new EffectPacket(effect.getId(), new Vec(x, y, z), data, disableRelativeVolume)); } @Override @@ -714,7 +707,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, @Override public void clearTitle() { - playerConnection.sendPacket(new ClearTitlesPacket()); + playerConnection.sendPacket(new ClearTitlesPacket(false)); } @Override @@ -870,10 +863,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, */ public void setDisplayName(@Nullable Component displayName) { this.displayName = displayName; - - PlayerInfoPacket infoPacket = new PlayerInfoPacket(PlayerInfoPacket.Action.UPDATE_DISPLAY_NAME); - infoPacket.playerInfos.add(new PlayerInfoPacket.UpdateDisplayName(getUuid(), displayName)); - sendPacketToViewersAndSelf(infoPacket); + final List entry = List.of(new PlayerInfoPacket.UpdateDisplayName(getUuid(), displayName)); + sendPacketToViewersAndSelf(new PlayerInfoPacket(PlayerInfoPacket.Action.UPDATE_DISPLAY_NAME, entry)); } /** @@ -904,10 +895,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, final PlayerInfoPacket removePlayerPacket = getRemovePlayerToList(); final PlayerInfoPacket addPlayerPacket = getAddPlayerToList(); - RespawnPacket respawnPacket = new RespawnPacket(); - respawnPacket.dimensionType = getDimensionType(); - respawnPacket.gameMode = getGameMode(); - respawnPacket.isFlat = levelFlat; + RespawnPacket respawnPacket = new RespawnPacket(getDimensionType(), getDimensionType().getName().asString(), + 0, gameMode, gameMode, false, levelFlat, true); playerConnection.sendPacket(removePlayerPacket); playerConnection.sendPacket(destroyEntitiesPacket); @@ -982,10 +971,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, } private void sendChangeGameStatePacket(@NotNull ChangeGameStatePacket.Reason reason, float value) { - ChangeGameStatePacket changeGameStatePacket = new ChangeGameStatePacket(); - changeGameStatePacket.reason = reason; - changeGameStatePacket.value = value; - playerConnection.sendPacket(changeGameStatePacket); + playerConnection.sendPacket(new ChangeGameStatePacket(reason, value)); } /** @@ -1038,18 +1024,13 @@ public class Player extends LivingEntity implements CommandSender, Localizable, private void facePosition(@NotNull FacePoint facePoint, @NotNull Point targetPosition, @Nullable Entity entity, @Nullable FacePoint targetPoint) { - FacePlayerPacket facePlayerPacket = new FacePlayerPacket(); - facePlayerPacket.entityFacePosition = facePoint == FacePoint.EYE ? - FacePlayerPacket.FacePosition.EYES : FacePlayerPacket.FacePosition.FEET; - facePlayerPacket.targetX = targetPosition.x(); - facePlayerPacket.targetY = targetPosition.y(); - facePlayerPacket.targetZ = targetPosition.z(); - if (entity != null) { - facePlayerPacket.entityId = entity.getEntityId(); - facePlayerPacket.entityFacePosition = targetPoint == FacePoint.EYE ? - FacePlayerPacket.FacePosition.EYES : FacePlayerPacket.FacePosition.FEET; - } - playerConnection.sendPacket(facePlayerPacket); + final int entityId = entity != null ? entity.getEntityId() : 0; + playerConnection.sendPacket(new FacePlayerPacket( + facePoint == FacePoint.EYE ? + FacePlayerPacket.FacePosition.EYES : FacePlayerPacket.FacePosition.FEET, targetPosition, + entityId, + targetPoint == FacePoint.EYE ? + FacePlayerPacket.FacePosition.EYES : FacePlayerPacket.FacePosition.FEET)); } /** @@ -1247,10 +1228,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, // Condition to prevent sending the packets before spawning the player if (isActive()) { sendChangeGameStatePacket(ChangeGameStatePacket.Reason.CHANGE_GAMEMODE, gameMode.getId()); - - PlayerInfoPacket infoPacket = new PlayerInfoPacket(PlayerInfoPacket.Action.UPDATE_GAMEMODE); - infoPacket.playerInfos.add(new PlayerInfoPacket.UpdateGamemode(getUuid(), gameMode)); - sendPacketToViewersAndSelf(infoPacket); + final List entry = List.of(new PlayerInfoPacket.UpdateGameMode(getUuid(), gameMode)); + sendPacketToViewersAndSelf(new PlayerInfoPacket(PlayerInfoPacket.Action.UPDATE_GAMEMODE, entry)); } } @@ -1273,11 +1252,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, Check.argCondition(dimensionType.equals(getDimensionType()), "The dimension needs to be different than the current one!"); this.dimensionType = dimensionType; - RespawnPacket respawnPacket = new RespawnPacket(); - respawnPacket.dimensionType = dimensionType; - respawnPacket.gameMode = gameMode; - respawnPacket.isFlat = levelFlat; - playerConnection.sendPacket(respawnPacket); + sendPacket(new RespawnPacket(dimensionType, dimensionType.getName().asString(), + 0, gameMode, gameMode, false, levelFlat, true)); } /** @@ -1386,10 +1362,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, return; } - OpenWindowPacket openWindowPacket = new OpenWindowPacket(newInventory.getTitle()); - openWindowPacket.windowId = newInventory.getWindowId(); - openWindowPacket.windowType = newInventory.getInventoryType().getWindowType(); - playerConnection.sendPacket(openWindowPacket); + playerConnection.sendPacket(new OpenWindowPacket(newInventory.getWindowId(), + newInventory.getInventoryType().getWindowType(), newInventory.getTitle())); newInventory.addViewer(this); this.openInventory = newInventory; }); @@ -1419,11 +1393,11 @@ public class Player extends LivingEntity implements CommandSender, Localizable, } } - CloseWindowPacket closeWindowPacket = new CloseWindowPacket(); + CloseWindowPacket closeWindowPacket; if (openInventory == null) { - closeWindowPacket.windowId = 0; + closeWindowPacket = new CloseWindowPacket((byte) 0); } else { - closeWindowPacket.windowId = openInventory.getWindowId(); + closeWindowPacket = new CloseWindowPacket(openInventory.getWindowId()); openInventory.removeViewer(this); // Clear cache this.openInventory = null; } @@ -1707,7 +1681,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, * * @param packet the packet to add in the queue */ - public void addPacketToQueue(@NotNull ClientPlayPacket packet) { + public void addPacketToQueue(@NotNull ClientPacket packet) { this.packets.offer(packet); } @@ -1718,9 +1692,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, */ public void refreshLatency(int latency) { this.latency = latency; - PlayerInfoPacket playerInfoPacket = new PlayerInfoPacket(PlayerInfoPacket.Action.UPDATE_LATENCY); - playerInfoPacket.playerInfos.add(new PlayerInfoPacket.UpdateLatency(getUuid(), latency)); - sendPacketToViewersAndSelf(playerInfoPacket); + final List entry = List.of(new PlayerInfoPacket.UpdateLatency(getUuid(), latency)); + sendPacketToViewersAndSelf(new PlayerInfoPacket(PlayerInfoPacket.Action.UPDATE_LATENCY, entry)); } public void refreshOnGround(boolean onGround) { @@ -1841,21 +1814,12 @@ public class Player extends LivingEntity implements CommandSender, Localizable, * @return a {@link PlayerInfoPacket} to add the player */ protected @NotNull PlayerInfoPacket getAddPlayerToList() { - PlayerInfoPacket playerInfoPacket = new PlayerInfoPacket(PlayerInfoPacket.Action.ADD_PLAYER); - - PlayerInfoPacket.AddPlayer addPlayer = - new PlayerInfoPacket.AddPlayer(getUuid(), getUsername(), getGameMode(), getLatency()); - addPlayer.displayName = displayName; - - // Skin support - if (skin != null) { - PlayerInfoPacket.AddPlayer.Property prop = - new PlayerInfoPacket.AddPlayer.Property("textures", skin.textures(), skin.signature()); - addPlayer.properties.add(prop); - } - - playerInfoPacket.playerInfos.add(addPlayer); - return playerInfoPacket; + final PlayerSkin skin = this.skin; + List prop = skin != null ? + List.of(new PlayerInfoPacket.AddPlayer.Property("textures", skin.textures(), skin.signature())) : + Collections.emptyList(); + final PlayerInfoPacket.Entry entry = new PlayerInfoPacket.AddPlayer(getUuid(), getUsername(), prop, getGameMode(), getLatency(), displayName); + return new PlayerInfoPacket(PlayerInfoPacket.Action.ADD_PLAYER, List.of(entry)); } /** @@ -1864,9 +1828,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, * @return a {@link PlayerInfoPacket} to remove the player */ protected @NotNull PlayerInfoPacket getRemovePlayerToList() { - PlayerInfoPacket playerInfoPacket = new PlayerInfoPacket(PlayerInfoPacket.Action.REMOVE_PLAYER); - playerInfoPacket.playerInfos.add(new PlayerInfoPacket.RemovePlayer(getUuid())); - return playerInfoPacket; + return new PlayerInfoPacket(PlayerInfoPacket.Action.REMOVE_PLAYER, + List.of(new PlayerInfoPacket.RemovePlayer(getUuid()))); } /** diff --git a/src/main/java/net/minestom/server/entity/fakeplayer/FakePlayerController.java b/src/main/java/net/minestom/server/entity/fakeplayer/FakePlayerController.java index 2bd9c0cec..fa48a645f 100644 --- a/src/main/java/net/minestom/server/entity/fakeplayer/FakePlayerController.java +++ b/src/main/java/net/minestom/server/entity/fakeplayer/FakePlayerController.java @@ -8,8 +8,9 @@ import net.minestom.server.inventory.AbstractInventory; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.PlayerInventory; import net.minestom.server.item.ItemStack; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.packet.client.play.*; +import net.minestom.server.network.packet.server.SendablePacket; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.play.KeepAlivePacket; import net.minestom.server.network.packet.server.play.PlayerPositionAndLookPacket; @@ -19,10 +20,12 @@ import net.minestom.server.utils.inventory.PlayerInventoryUtils; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; +import java.util.List; + /** * This class acts as a client controller for {@link FakePlayer}. *

- * The main use is to simulate the receiving of {@link ClientPlayPacket} + * The main use is to simulate the receiving of {@link ClientPacket} */ public class FakePlayerController { @@ -54,13 +57,9 @@ public class FakePlayerController { ItemStack itemStack = abstractInventory.getItemStack(slot); - ClientClickWindowPacket clickWindowPacket = new ClientClickWindowPacket(); - clickWindowPacket.windowId = playerInventory ? 0 : inventory.getWindowId(); - clickWindowPacket.slot = slot; - clickWindowPacket.button = button; - clickWindowPacket.clickType = clickType; - clickWindowPacket.item = itemStack; - addToQueue(clickWindowPacket); + addToQueue(new ClientClickWindowPacket(playerInventory ? 0 : inventory.getWindowId(), 0, + slot, button, clickType, + List.of(), itemStack)); } /** @@ -68,10 +67,7 @@ public class FakePlayerController { */ public void closeWindow() { Inventory openInventory = fakePlayer.getOpenInventory(); - - ClientCloseWindowPacket closeWindow = new ClientCloseWindowPacket(); - closeWindow.windowId = openInventory == null ? 0 : openInventory.getWindowId(); - addToQueue(closeWindow); + addToQueue(new ClientCloseWindowPacket(openInventory == null ? 0 : openInventory.getWindowId())); } /** @@ -81,10 +77,7 @@ public class FakePlayerController { * @param message The message data. */ public void sendPluginMessage(String channel, byte[] message) { - ClientPluginMessagePacket pluginMessagePacket = new ClientPluginMessagePacket(); - pluginMessagePacket.channel = channel; - pluginMessagePacket.data = message; - addToQueue(pluginMessagePacket); + addToQueue(new ClientPluginMessagePacket(channel, message)); } /** @@ -103,10 +96,7 @@ public class FakePlayerController { * @param entity The entity that is to be attacked. */ public void attackEntity(Entity entity) { - ClientInteractEntityPacket interactEntityPacket = new ClientInteractEntityPacket(); - interactEntityPacket.targetId = entity.getEntityId(); - interactEntityPacket.type = ClientInteractEntityPacket.Type.ATTACK; - addToQueue(interactEntityPacket); + addToQueue(new ClientInteractEntityPacket(entity.getEntityId(), new ClientInteractEntityPacket.Attack(), fakePlayer.isSneaking())); } /** @@ -131,10 +121,7 @@ public class FakePlayerController { */ public void setHeldItem(short slot) { Check.argCondition(!MathUtils.isBetween(slot, 0, 8), "Slot has to be between 0 and 8!"); - - ClientHeldItemChangePacket heldItemChangePacket = new ClientHeldItemChangePacket(); - heldItemChangePacket.slot = slot; - addToQueue(heldItemChangePacket); + addToQueue(new ClientHeldItemChangePacket(slot)); } /** @@ -143,9 +130,7 @@ public class FakePlayerController { * @param hand The hand of the arm to be animated. */ public void sendArmAnimation(Player.Hand hand) { - ClientAnimationPacket animationPacket = new ClientAnimationPacket(); - animationPacket.hand = hand; - addToQueue(animationPacket); + addToQueue(new ClientAnimationPacket(hand)); } /** @@ -154,9 +139,7 @@ public class FakePlayerController { * @param hand The hand in which an ite mshould be. */ public void useItem(Player.Hand hand) { - ClientUseItemPacket useItemPacket = new ClientUseItemPacket(); - useItemPacket.hand = hand; - addToQueue(useItemPacket); + addToQueue(new ClientUseItemPacket(hand)); } /** @@ -166,11 +149,7 @@ public class FakePlayerController { * @param pitch The new pitch for the fake player. */ public void rotate(float yaw, float pitch) { - ClientPlayerRotationPacket playerRotationPacket = new ClientPlayerRotationPacket(); - playerRotationPacket.yaw = yaw; - playerRotationPacket.pitch = pitch; - playerRotationPacket.onGround = fakePlayer.isOnGround(); - addToQueue(playerRotationPacket); + addToQueue(new ClientPlayerRotationPacket(yaw, pitch, fakePlayer.isOnGround())); } /** @@ -180,11 +159,7 @@ public class FakePlayerController { * @param blockFace From where the block is struck. */ public void startDigging(Point blockPosition, BlockFace blockFace) { - ClientPlayerDiggingPacket playerDiggingPacket = new ClientPlayerDiggingPacket(); - playerDiggingPacket.status = ClientPlayerDiggingPacket.Status.STARTED_DIGGING; - playerDiggingPacket.blockPosition = blockPosition; - playerDiggingPacket.blockFace = blockFace; - addToQueue(playerDiggingPacket); + addToQueue(new ClientPlayerDiggingPacket(ClientPlayerDiggingPacket.Status.STARTED_DIGGING, blockPosition, blockFace)); } /** @@ -194,11 +169,7 @@ public class FakePlayerController { * @param blockFace From where the block is struck. */ public void stopDigging(Point blockPosition, BlockFace blockFace) { - ClientPlayerDiggingPacket playerDiggingPacket = new ClientPlayerDiggingPacket(); - playerDiggingPacket.status = ClientPlayerDiggingPacket.Status.CANCELLED_DIGGING; - playerDiggingPacket.blockPosition = blockPosition; - playerDiggingPacket.blockFace = blockFace; - addToQueue(playerDiggingPacket); + addToQueue(new ClientPlayerDiggingPacket(ClientPlayerDiggingPacket.Status.CANCELLED_DIGGING, blockPosition, blockFace)); } /** @@ -208,29 +179,21 @@ public class FakePlayerController { * @param blockFace From where the block is struck. */ public void finishDigging(Point blockPosition, BlockFace blockFace) { - ClientPlayerDiggingPacket playerDiggingPacket = new ClientPlayerDiggingPacket(); - playerDiggingPacket.status = ClientPlayerDiggingPacket.Status.FINISHED_DIGGING; - playerDiggingPacket.blockPosition = blockPosition; - playerDiggingPacket.blockFace = blockFace; - addToQueue(playerDiggingPacket); + addToQueue(new ClientPlayerDiggingPacket(ClientPlayerDiggingPacket.Status.FINISHED_DIGGING, blockPosition, blockFace)); } /** * Makes the player receives a packet * WARNING: pretty much unsafe, used internally to redirect packets here, - * you should instead use {@link PlayerConnection#sendPacket(ServerPacket)} + * you should instead use {@link PlayerConnection#sendPacket(SendablePacket)} * * @param serverPacket the packet to consume */ public void consumePacket(ServerPacket serverPacket) { - if (serverPacket instanceof PlayerPositionAndLookPacket) { - ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(); - teleportConfirmPacket.teleportId = ((PlayerPositionAndLookPacket) serverPacket).teleportId; - addToQueue(teleportConfirmPacket); - } else if (serverPacket instanceof KeepAlivePacket) { - ClientKeepAlivePacket keepAlivePacket = new ClientKeepAlivePacket(); - keepAlivePacket.id = ((KeepAlivePacket) serverPacket).id; - addToQueue(keepAlivePacket); + if (serverPacket instanceof PlayerPositionAndLookPacket playerPositionAndLookPacket) { + addToQueue(new ClientTeleportConfirmPacket(playerPositionAndLookPacket.teleportId())); + } else if (serverPacket instanceof KeepAlivePacket keepAlivePacket) { + addToQueue(new ClientKeepAlivePacket(keepAlivePacket.id())); } } @@ -240,7 +203,7 @@ public class FakePlayerController { * * @param clientPlayPacket The packet to add in the queue. */ - private void addToQueue(ClientPlayPacket clientPlayPacket) { + private void addToQueue(ClientPacket clientPlayPacket) { this.fakePlayer.addPacketToQueue(clientPlayPacket); } } diff --git a/src/main/java/net/minestom/server/instance/Explosion.java b/src/main/java/net/minestom/server/instance/Explosion.java index 2deca9808..186be7a1d 100644 --- a/src/main/java/net/minestom/server/instance/Explosion.java +++ b/src/main/java/net/minestom/server/instance/Explosion.java @@ -57,30 +57,22 @@ public abstract class Explosion { */ public void apply(@NotNull Instance instance) { List blocks = prepare(instance); - ExplosionPacket packet = new ExplosionPacket(); - packet.x = getCenterX(); - packet.y = getCenterY(); - packet.z = getCenterZ(); - packet.radius = getStrength(); - packet.playerMotionX = 0.0f; // TODO: figure out why this is here - packet.playerMotionY = 0.0f; // TODO: figure out why this is here - packet.playerMotionZ = 0.0f; // TODO: figure out why this is here - - packet.records = new byte[3 * blocks.size()]; + byte[] records = new byte[3 * blocks.size()]; for (int i = 0; i < blocks.size(); i++) { final var pos = blocks.get(i); instance.setBlock(pos, Block.AIR); final byte x = (byte) (pos.x() - Math.floor(getCenterX())); final byte y = (byte) (pos.y() - Math.floor(getCenterY())); final byte z = (byte) (pos.z() - Math.floor(getCenterZ())); - packet.records[i * 3 + 0] = x; - packet.records[i * 3 + 1] = y; - packet.records[i * 3 + 2] = z; + records[i * 3 + 0] = x; + records[i * 3 + 1] = y; + records[i * 3 + 2] = z; } - postExplosion(instance, blocks, packet); - // TODO send only to close players + ExplosionPacket packet = new ExplosionPacket(centerX, centerY, centerZ, strength, + records, 0, 0, 0); + postExplosion(instance, blocks, packet); PacketUtils.sendGroupedPacket(instance.getPlayers(), packet); postSend(instance, blocks); diff --git a/src/main/java/net/minestom/server/instance/WorldBorder.java b/src/main/java/net/minestom/server/instance/WorldBorder.java index 4cb6e284d..79229566a 100644 --- a/src/main/java/net/minestom/server/instance/WorldBorder.java +++ b/src/main/java/net/minestom/server/instance/WorldBorder.java @@ -102,7 +102,7 @@ public class WorldBorder { */ public void setWarningTime(int warningTime) { this.warningTime = warningTime; - sendPacket(WorldBorderWarningDelayPacket.of(warningTime)); + sendPacket(new WorldBorderWarningDelayPacket(warningTime)); } public int getWarningBlocks() { @@ -114,7 +114,7 @@ public class WorldBorder { */ public void setWarningBlocks(int warningBlocks) { this.warningBlocks = warningBlocks; - sendPacket(WorldBorderWarningReachPacket.of(warningBlocks)); + sendPacket(new WorldBorderWarningReachPacket(warningBlocks)); } /** @@ -131,7 +131,7 @@ public class WorldBorder { this.newDiameter = diameter; this.speed = speed; this.lerpStartTime = System.currentTimeMillis(); - sendPacket(WorldBorderLerpSizePacket.of(oldDiameter, newDiameter, speed)); + sendPacket(new WorldBorderLerpSizePacket(oldDiameter, newDiameter, speed)); } /** @@ -154,7 +154,7 @@ public class WorldBorder { this.oldDiameter = diameter; this.newDiameter = diameter; this.lerpStartTime = 0; - sendPacket(WorldBorderSizePacket.of(diameter)); + sendPacket(new WorldBorderSizePacket(diameter)); } /** @@ -229,9 +229,8 @@ public class WorldBorder { */ @ApiStatus.Internal public void init(@NotNull Player player) { - player.getPlayerConnection().sendPacket( - InitializeWorldBorderPacket.of(centerX, centerZ, oldDiameter, newDiameter, speed, - portalTeleportBoundary, warningTime, warningBlocks)); + player.getPlayerConnection().sendPacket(new InitializeWorldBorderPacket(centerX, centerZ, + oldDiameter, newDiameter, speed, portalTeleportBoundary, warningTime, warningBlocks)); } /** @@ -248,7 +247,7 @@ public class WorldBorder { * Sends the new world border centers to all instance players. */ private void refreshCenter() { - sendPacket(WorldBorderCenterPacket.of(centerX, centerZ)); + sendPacket(new WorldBorderCenterPacket(centerX, centerZ)); } private void sendPacket(@NotNull ServerPacket packet) { diff --git a/src/main/java/net/minestom/server/inventory/EquipmentHandler.java b/src/main/java/net/minestom/server/inventory/EquipmentHandler.java index f763d12b3..576dddd4d 100644 --- a/src/main/java/net/minestom/server/inventory/EquipmentHandler.java +++ b/src/main/java/net/minestom/server/inventory/EquipmentHandler.java @@ -8,6 +8,8 @@ import net.minestom.server.network.packet.server.play.EntityEquipmentPacket; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; +import java.util.Map; + /** * Represents an {@link Entity} which can have {@link ItemStack} in hands and armor slots. */ @@ -164,15 +166,8 @@ public interface EquipmentHandler { Check.stateCondition(!(this instanceof Entity), "Only accessible for Entity"); Entity entity = (Entity) this; - final ItemStack itemStack = getEquipment(slot); - - EntityEquipmentPacket entityEquipmentPacket = new EntityEquipmentPacket(); - entityEquipmentPacket.entityId = entity.getEntityId(); - entityEquipmentPacket.slots = new EquipmentSlot[]{slot}; - entityEquipmentPacket.itemStacks = new ItemStack[]{itemStack}; - - entity.sendPacketToViewers(entityEquipmentPacket); + entity.sendPacketToViewers(new EntityEquipmentPacket(entity.getEntityId(), Map.of(slot, itemStack))); } /** @@ -183,18 +178,13 @@ public interface EquipmentHandler { */ default @NotNull EntityEquipmentPacket getEquipmentsPacket() { Check.stateCondition(!(this instanceof Entity), "Only accessible for Entity"); - final EquipmentSlot[] slots = EquipmentSlot.values(); - ItemStack[] equipments = new ItemStack[slots.length]; - for (int i = 0; i < equipments.length; i++) { - final EquipmentSlot slot = slots[i]; - equipments[i] = getEquipment(slot); - } - // Create equipment packet - EntityEquipmentPacket equipmentPacket = new EntityEquipmentPacket(); - equipmentPacket.entityId = ((Entity) this).getEntityId(); - equipmentPacket.slots = slots; - equipmentPacket.itemStacks = equipments; - return equipmentPacket; + return new EntityEquipmentPacket(((Entity) this).getEntityId(), Map.of( + EquipmentSlot.MAIN_HAND, getItemInMainHand(), + EquipmentSlot.OFF_HAND, getItemInOffHand(), + EquipmentSlot.BOOTS, getBoots(), + EquipmentSlot.LEGGINGS, getLeggings(), + EquipmentSlot.CHESTPLATE, getChestplate(), + EquipmentSlot.HELMET, getHelmet())); } } diff --git a/src/main/java/net/minestom/server/inventory/Inventory.java b/src/main/java/net/minestom/server/inventory/Inventory.java index 80f84fc0d..84306d96e 100644 --- a/src/main/java/net/minestom/server/inventory/Inventory.java +++ b/src/main/java/net/minestom/server/inventory/Inventory.java @@ -16,6 +16,7 @@ import net.minestom.server.utils.inventory.PlayerInventoryUtils; import org.jetbrains.annotations.NotNull; import java.util.Collections; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; @@ -93,14 +94,8 @@ public non-sealed class Inventory extends AbstractInventory implements Viewable */ public void setTitle(@NotNull Component title) { this.title = title; - - OpenWindowPacket packet = new OpenWindowPacket(title); - - packet.windowId = getWindowId(); - packet.windowType = getInventoryType().getWindowType(); - // Re-open the inventory - sendPacketToViewers(packet); + sendPacketToViewers(new OpenWindowPacket(getWindowId(), getInventoryType().getWindowType(), title)); // Send inventory items update(); } @@ -226,7 +221,7 @@ public non-sealed class Inventory extends AbstractInventory implements Viewable * @return a new {@link WindowItemsPacket} packet */ private @NotNull WindowItemsPacket createNewWindowItemsPacket(Player player) { - return new WindowItemsPacket(getWindowId(), 0, getItemStacks(), cursorPlayersItem.getOrDefault(player, ItemStack.AIR)); + return new WindowItemsPacket(getWindowId(), 0, List.of(getItemStacks()), cursorPlayersItem.getOrDefault(player, ItemStack.AIR)); } /** diff --git a/src/main/java/net/minestom/server/inventory/PlayerInventory.java b/src/main/java/net/minestom/server/inventory/PlayerInventory.java index 4d8afb0ef..f0097d8b0 100644 --- a/src/main/java/net/minestom/server/inventory/PlayerInventory.java +++ b/src/main/java/net/minestom/server/inventory/PlayerInventory.java @@ -13,6 +13,8 @@ import net.minestom.server.network.packet.server.play.SetSlotPacket; import net.minestom.server.network.packet.server.play.WindowItemsPacket; import org.jetbrains.annotations.NotNull; +import java.util.List; + import static net.minestom.server.utils.inventory.PlayerInventoryUtils.*; /** @@ -194,7 +196,7 @@ public non-sealed class PlayerInventory extends AbstractInventory implements Equ final int slot = convertToPacketSlot(i); convertedSlots[slot] = itemStacks[i]; } - return new WindowItemsPacket((byte) 0, 0, convertedSlots, cursorItem); + return new WindowItemsPacket((byte) 0, 0, List.of(convertedSlots), cursorItem); } @Override diff --git a/src/main/java/net/minestom/server/inventory/type/VillagerInventory.java b/src/main/java/net/minestom/server/inventory/type/VillagerInventory.java index 5db943fd4..8d3292c14 100644 --- a/src/main/java/net/minestom/server/inventory/type/VillagerInventory.java +++ b/src/main/java/net/minestom/server/inventory/type/VillagerInventory.java @@ -4,105 +4,95 @@ import net.kyori.adventure.text.Component; import net.minestom.server.entity.Player; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryType; +import net.minestom.server.network.packet.server.CachedPacket; import net.minestom.server.network.packet.server.play.TradeListPacket; -import net.minestom.server.utils.ArrayUtils; import org.jetbrains.annotations.NotNull; -public class VillagerInventory extends Inventory { +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; - protected TradeListPacket tradeListPacket; +public class VillagerInventory extends Inventory { + private final CachedPacket tradeCache = new CachedPacket(this::createTradePacket); + private final List trades = new ArrayList<>(); + private int villagerLevel; + private int experience; + private boolean regularVillager; + private boolean canRestock; public VillagerInventory(@NotNull Component title) { super(InventoryType.MERCHANT, title); - setupPacket(); } public VillagerInventory(@NotNull String title) { super(InventoryType.MERCHANT, title); - setupPacket(); } - public TradeListPacket.Trade[] getTrades() { - return tradeListPacket.trades; + public List getTrades() { + return Collections.unmodifiableList(trades); } public void addTrade(TradeListPacket.Trade trade) { - TradeListPacket.Trade[] oldTrades = getTrades(); - final int length = oldTrades.length + 1; - TradeListPacket.Trade[] trades = new TradeListPacket.Trade[length]; - System.arraycopy(oldTrades, 0, trades, 0, oldTrades.length); - trades[length - 1] = trade; - this.tradeListPacket.trades = trades; + this.trades.add(trade); update(); } public void removeTrade(int index) { - TradeListPacket.Trade[] oldTrades = getTrades(); - final int length = oldTrades.length - 1; - TradeListPacket.Trade[] trades = new TradeListPacket.Trade[length]; - ArrayUtils.removeElement(trades, index); - this.tradeListPacket.trades = trades; + this.trades.remove(index); update(); } public int getVillagerLevel() { - return tradeListPacket.villagerLevel; + return villagerLevel; } public void setVillagerLevel(int level) { - this.tradeListPacket.villagerLevel = level; + this.villagerLevel = level; update(); } public int getExperience() { - return tradeListPacket.experience; + return experience; } public void setExperience(int experience) { - this.tradeListPacket.experience = experience; + this.experience = experience; update(); } public boolean isRegularVillager() { - return tradeListPacket.regularVillager; + return regularVillager; } public void setRegularVillager(boolean regularVillager) { - this.tradeListPacket.regularVillager = regularVillager; + this.regularVillager = regularVillager; update(); } public boolean canRestock() { - return tradeListPacket.canRestock; + return canRestock; } public void setCanRestock(boolean canRestock) { - this.tradeListPacket.canRestock = canRestock; + this.canRestock = canRestock; update(); } @Override public void update() { super.update(); - sendPacketToViewers(tradeListPacket); // Refresh window + this.tradeCache.invalidate(); + sendPacketToViewers(tradeCache.retrieve()); } @Override public boolean addViewer(@NotNull Player player) { final boolean result = super.addViewer(player); - if (result) { - player.getPlayerConnection().sendPacket(tradeListPacket); - } + if (result) player.sendPacket(tradeCache.retrieve()); return result; } - private void setupPacket() { - this.tradeListPacket = new TradeListPacket(); - this.tradeListPacket.windowId = getWindowId(); - this.tradeListPacket.trades = new TradeListPacket.Trade[0]; - this.tradeListPacket.villagerLevel = 0; - this.tradeListPacket.experience = 0; - this.tradeListPacket.regularVillager = false; - this.tradeListPacket.canRestock = false; + private TradeListPacket createTradePacket() { + return new TradeListPacket(getWindowId(), trades, villagerLevel, experience, regularVillager, canRestock); } } diff --git a/src/main/java/net/minestom/server/listener/AbilitiesListener.java b/src/main/java/net/minestom/server/listener/AbilitiesListener.java index c2894465d..69eddadfb 100644 --- a/src/main/java/net/minestom/server/listener/AbilitiesListener.java +++ b/src/main/java/net/minestom/server/listener/AbilitiesListener.java @@ -12,7 +12,7 @@ public class AbilitiesListener { final boolean canFly = player.isAllowFlying() || player.isCreative(); if (canFly) { - final boolean isFlying = (packet.flags & 0x2) > 0; + final boolean isFlying = (packet.flags() & 0x2) > 0; player.refreshFlying(isFlying); diff --git a/src/main/java/net/minestom/server/listener/AdvancementTabListener.java b/src/main/java/net/minestom/server/listener/AdvancementTabListener.java index 5e917f7ae..3a8edbd12 100644 --- a/src/main/java/net/minestom/server/listener/AdvancementTabListener.java +++ b/src/main/java/net/minestom/server/listener/AdvancementTabListener.java @@ -1,6 +1,5 @@ package net.minestom.server.listener; -import net.minestom.server.advancements.AdvancementAction; import net.minestom.server.entity.Player; import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.AdvancementTabEvent; @@ -9,10 +8,9 @@ import net.minestom.server.network.packet.client.play.ClientAdvancementTabPacket public class AdvancementTabListener { public static void listener(ClientAdvancementTabPacket packet, Player player) { - final AdvancementAction action = packet.action; - final String tabId = packet.tabIdentifier; - AdvancementTabEvent advancementTabEvent = new AdvancementTabEvent(player, action, tabId); - - EventDispatcher.call(advancementTabEvent); + final String tabIdentifier = packet.tabIdentifier(); + if (tabIdentifier != null) { + EventDispatcher.call(new AdvancementTabEvent(player, packet.action(), tabIdentifier)); + } } } diff --git a/src/main/java/net/minestom/server/listener/AnimationListener.java b/src/main/java/net/minestom/server/listener/AnimationListener.java index b8c909980..42e249c73 100644 --- a/src/main/java/net/minestom/server/listener/AnimationListener.java +++ b/src/main/java/net/minestom/server/listener/AnimationListener.java @@ -9,7 +9,7 @@ import net.minestom.server.network.packet.client.play.ClientAnimationPacket; public class AnimationListener { public static void animationListener(ClientAnimationPacket packet, Player player) { - final Player.Hand hand = packet.hand; + final Player.Hand hand = packet.hand(); final ItemStack itemStack = player.getItemInHand(hand); //itemStack.onLeftClick(player, hand); PlayerHandAnimationEvent handAnimationEvent = new PlayerHandAnimationEvent(player, hand); diff --git a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java index cb02c047e..12cd19076 100644 --- a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java +++ b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java @@ -34,9 +34,9 @@ public class BlockPlacementListener { public static void listener(ClientPlayerBlockPlacementPacket packet, Player player) { final PlayerInventory playerInventory = player.getInventory(); - final Player.Hand hand = packet.hand; - final BlockFace blockFace = packet.blockFace; - final Point blockPosition = packet.blockPosition; + final Player.Hand hand = packet.hand(); + final BlockFace blockFace = packet.blockFace(); + final Point blockPosition = packet.blockPosition(); final Direction direction = blockFace.toDirection(); final Instance instance = player.getInstance(); @@ -134,7 +134,7 @@ public class BlockPlacementListener { return; } // BlockPlaceEvent check - PlayerBlockPlaceEvent playerBlockPlaceEvent = new PlayerBlockPlaceEvent(player, placedBlock, blockFace, placementPosition, packet.hand); + PlayerBlockPlaceEvent playerBlockPlaceEvent = new PlayerBlockPlaceEvent(player, placedBlock, blockFace, placementPosition, packet.hand()); playerBlockPlaceEvent.consumeBlock(player.getGameMode() != GameMode.CREATIVE); EventDispatcher.call(playerBlockPlaceEvent); if (playerBlockPlaceEvent.isCancelled()) { @@ -155,7 +155,7 @@ public class BlockPlacementListener { } // Place the block instance.placeBlock(new BlockHandler.PlayerPlacement(resultBlock, instance, placementPosition, player, hand, blockFace, - packet.cursorPositionX, packet.cursorPositionY, packet.cursorPositionZ)); + packet.cursorPositionX(), packet.cursorPositionY(), packet.cursorPositionZ())); // Block consuming if (playerBlockPlaceEvent.doesConsumeBlock()) { // Consume the block in the player's hand diff --git a/src/main/java/net/minestom/server/listener/ChatMessageListener.java b/src/main/java/net/minestom/server/listener/ChatMessageListener.java index bc251f7a5..2aadf723a 100644 --- a/src/main/java/net/minestom/server/listener/ChatMessageListener.java +++ b/src/main/java/net/minestom/server/listener/ChatMessageListener.java @@ -22,7 +22,7 @@ public class ChatMessageListener { private static final ConnectionManager CONNECTION_MANAGER = MinecraftServer.getConnectionManager(); public static void listener(ClientChatMessagePacket packet, Player player) { - String message = packet.message; + String message = packet.message(); final String cmdPrefix = CommandManager.COMMAND_PREFIX; if (message.startsWith(cmdPrefix)) { diff --git a/src/main/java/net/minestom/server/listener/CreativeInventoryActionListener.java b/src/main/java/net/minestom/server/listener/CreativeInventoryActionListener.java index f121baade..b03e4f506 100644 --- a/src/main/java/net/minestom/server/listener/CreativeInventoryActionListener.java +++ b/src/main/java/net/minestom/server/listener/CreativeInventoryActionListener.java @@ -11,8 +11,8 @@ import java.util.Objects; public final class CreativeInventoryActionListener { public static void listener(ClientCreativeInventoryActionPacket packet, Player player) { if (!player.isCreative()) return; - short slot = packet.slot; - final ItemStack item = packet.item; + short slot = packet.slot(); + final ItemStack item = packet.item(); if (slot == -1) { // Drop item player.dropItem(item); diff --git a/src/main/java/net/minestom/server/listener/EntityActionListener.java b/src/main/java/net/minestom/server/listener/EntityActionListener.java index bc8e7cacc..e4f7405b2 100644 --- a/src/main/java/net/minestom/server/listener/EntityActionListener.java +++ b/src/main/java/net/minestom/server/listener/EntityActionListener.java @@ -8,8 +8,7 @@ import net.minestom.server.network.packet.client.play.ClientEntityActionPacket; public class EntityActionListener { public static void listener(ClientEntityActionPacket packet, Player player) { - ClientEntityActionPacket.Action action = packet.action; - switch (action) { + switch (packet.action()) { case START_SNEAKING -> EntityActionListener.setSneaking(player, true); case STOP_SNEAKING -> EntityActionListener.setSneaking(player, false); case START_SPRINTING -> EntityActionListener.setSprinting(player, true); diff --git a/src/main/java/net/minestom/server/listener/KeepAliveListener.java b/src/main/java/net/minestom/server/listener/KeepAliveListener.java index 5fe4bb8da..a456aad05 100644 --- a/src/main/java/net/minestom/server/listener/KeepAliveListener.java +++ b/src/main/java/net/minestom/server/listener/KeepAliveListener.java @@ -9,7 +9,7 @@ public final class KeepAliveListener { private static final Component KICK_MESSAGE = Component.text("Bad Keep Alive packet", NamedTextColor.RED); public static void listener(ClientKeepAlivePacket packet, Player player) { - final long packetId = packet.id; + final long packetId = packet.id(); if (packetId != player.getLastKeepAlive()) { player.kick(KICK_MESSAGE); return; diff --git a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java index 04bb92a08..37bc268c4 100644 --- a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java @@ -21,8 +21,8 @@ import org.jetbrains.annotations.NotNull; public final class PlayerDiggingListener { public static void playerDiggingListener(ClientPlayerDiggingPacket packet, Player player) { - final ClientPlayerDiggingPacket.Status status = packet.status; - final Point blockPosition = packet.blockPosition; + final ClientPlayerDiggingPacket.Status status = packet.status(); + final Point blockPosition = packet.blockPosition(); final Instance instance = player.getInstance(); if (instance == null) return; diff --git a/src/main/java/net/minestom/server/listener/PlayerHeldListener.java b/src/main/java/net/minestom/server/listener/PlayerHeldListener.java index 196df6c24..b4d14fa81 100644 --- a/src/main/java/net/minestom/server/listener/PlayerHeldListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerHeldListener.java @@ -9,12 +9,12 @@ import net.minestom.server.utils.MathUtils; public class PlayerHeldListener { public static void heldListener(ClientHeldItemChangePacket packet, Player player) { - if (!MathUtils.isBetween(packet.slot, 0, 8)) { + if (!MathUtils.isBetween(packet.slot(), 0, 8)) { // Incorrect packet, ignore return; } - final byte slot = (byte) packet.slot; + final byte slot = (byte) packet.slot(); PlayerChangeHeldSlotEvent changeHeldSlotEvent = new PlayerChangeHeldSlotEvent(player, slot); EventDispatcher.call(changeHeldSlotEvent); diff --git a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java index da11e1a13..c34b5b99f 100644 --- a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java @@ -14,23 +14,23 @@ import org.jetbrains.annotations.NotNull; public class PlayerPositionListener { public static void playerPacketListener(ClientPlayerPacket packet, Player player) { - player.refreshOnGround(packet.onGround); + player.refreshOnGround(packet.onGround()); } public static void playerLookListener(ClientPlayerRotationPacket packet, Player player) { - processMovement(player, player.getPosition().withView(packet.yaw, packet.pitch), packet.onGround); + processMovement(player, player.getPosition().withView(packet.yaw(), packet.pitch()), packet.onGround()); } public static void playerPositionListener(ClientPlayerPositionPacket packet, Player player) { - processMovement(player, player.getPosition().withCoord(packet.x, packet.y, packet.z), packet.onGround); + processMovement(player, player.getPosition().withCoord(packet.position()), packet.onGround()); } public static void playerPositionAndLookListener(ClientPlayerPositionAndRotationPacket packet, Player player) { - processMovement(player, new Pos(packet.x, packet.y, packet.z, packet.yaw, packet.pitch), packet.onGround); + processMovement(player, packet.position(), packet.onGround()); } public static void teleportConfirmListener(ClientTeleportConfirmPacket packet, Player player) { - player.refreshReceivedTeleportId(packet.teleportId); + player.refreshReceivedTeleportId(packet.teleportId()); } private static void processMovement(@NotNull Player player, @NotNull Pos packetPosition, boolean onGround) { diff --git a/src/main/java/net/minestom/server/listener/PlayerVehicleListener.java b/src/main/java/net/minestom/server/listener/PlayerVehicleListener.java index c35073676..0c3c4ac25 100644 --- a/src/main/java/net/minestom/server/listener/PlayerVehicleListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerVehicleListener.java @@ -1,6 +1,5 @@ package net.minestom.server.listener; -import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Player; import net.minestom.server.entity.metadata.other.BoatMeta; @@ -11,10 +10,10 @@ import net.minestom.server.network.packet.client.play.ClientVehicleMovePacket; public class PlayerVehicleListener { public static void steerVehicleListener(ClientSteerVehiclePacket packet, Player player) { - final byte flags = packet.flags; + final byte flags = packet.flags(); final boolean jump = (flags & 0x1) != 0; final boolean unmount = (flags & 0x2) != 0; - player.refreshVehicleSteer(packet.sideways, packet.forward, jump, unmount); + player.refreshVehicleSteer(packet.sideways(), packet.forward(), jump, unmount); } public static void vehicleMoveListener(ClientVehicleMovePacket packet, Player player) { @@ -22,8 +21,7 @@ public class PlayerVehicleListener { if (vehicle == null) return; - final var newPosition = new Pos(packet.x, packet.y, packet.z, packet.yaw, packet.pitch); - vehicle.refreshPosition(newPosition); + vehicle.refreshPosition(packet.position()); // This packet causes weird screen distortion /*VehicleMovePacket vehicleMovePacket = new VehicleMovePacket(); @@ -39,7 +37,7 @@ public class PlayerVehicleListener { public static void boatSteerListener(ClientSteerBoatPacket packet, Player player) { final Entity vehicle = player.getVehicle(); if (!(vehicle.getEntityMeta() instanceof BoatMeta boat)) return; - boat.setLeftPaddleTurning(packet.leftPaddleTurning); - boat.setRightPaddleTurning(packet.rightPaddleTurning); + boat.setLeftPaddleTurning(packet.leftPaddleTurning()); + boat.setRightPaddleTurning(packet.rightPaddleTurning()); } } diff --git a/src/main/java/net/minestom/server/listener/PluginMessageListener.java b/src/main/java/net/minestom/server/listener/PluginMessageListener.java index 22d3e4d04..2e85b2f17 100644 --- a/src/main/java/net/minestom/server/listener/PluginMessageListener.java +++ b/src/main/java/net/minestom/server/listener/PluginMessageListener.java @@ -8,7 +8,7 @@ import net.minestom.server.network.packet.client.play.ClientPluginMessagePacket; public class PluginMessageListener { public static void listener(ClientPluginMessagePacket packet, Player player) { - PlayerPluginMessageEvent pluginMessageEvent = new PlayerPluginMessageEvent(player, packet.channel, packet.data); + PlayerPluginMessageEvent pluginMessageEvent = new PlayerPluginMessageEvent(player, packet.channel(), packet.data()); EventDispatcher.call(pluginMessageEvent); } diff --git a/src/main/java/net/minestom/server/listener/RecipeListener.java b/src/main/java/net/minestom/server/listener/RecipeListener.java index 2b8622d04..2038d7d73 100644 --- a/src/main/java/net/minestom/server/listener/RecipeListener.java +++ b/src/main/java/net/minestom/server/listener/RecipeListener.java @@ -7,9 +7,6 @@ import net.minestom.server.network.packet.server.play.CraftRecipeResponse; public class RecipeListener { public static void listener(ClientCraftRecipeRequest packet, Player player) { - CraftRecipeResponse recipeResponse = new CraftRecipeResponse(); - recipeResponse.windowId = packet.windowId; - recipeResponse.recipe = packet.recipe; - player.getPlayerConnection().sendPacket(recipeResponse); + player.getPlayerConnection().sendPacket(new CraftRecipeResponse(packet.windowId(), packet.recipe())); } } diff --git a/src/main/java/net/minestom/server/listener/ResourcePackListener.java b/src/main/java/net/minestom/server/listener/ResourcePackListener.java index 5bbaa1368..a88db1cb8 100644 --- a/src/main/java/net/minestom/server/listener/ResourcePackListener.java +++ b/src/main/java/net/minestom/server/listener/ResourcePackListener.java @@ -4,13 +4,10 @@ import net.minestom.server.entity.Player; import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerResourcePackStatusEvent; import net.minestom.server.network.packet.client.play.ClientResourcePackStatusPacket; -import net.minestom.server.resourcepack.ResourcePackStatus; public class ResourcePackListener { public static void listener(ClientResourcePackStatusPacket packet, Player player) { - final ResourcePackStatus result = packet.result; - PlayerResourcePackStatusEvent resourcePackStatusEvent = new PlayerResourcePackStatusEvent(player, result); - EventDispatcher.call(resourcePackStatusEvent); + EventDispatcher.call(new PlayerResourcePackStatusEvent(player, packet.status())); } } diff --git a/src/main/java/net/minestom/server/listener/SettingsListener.java b/src/main/java/net/minestom/server/listener/SettingsListener.java index 97476d947..04d94b72a 100644 --- a/src/main/java/net/minestom/server/listener/SettingsListener.java +++ b/src/main/java/net/minestom/server/listener/SettingsListener.java @@ -8,8 +8,8 @@ import net.minestom.server.network.packet.client.play.ClientSettingsPacket; public final class SettingsListener { public static void listener(ClientSettingsPacket packet, Player player) { Player.PlayerSettings settings = player.getSettings(); - final byte viewDistance = (byte) Math.abs(packet.viewDistance); - settings.refresh(packet.locale, viewDistance, packet.chatMessageType, packet.chatColors, packet.displayedSkinParts, packet.mainHand); + final byte viewDistance = (byte) Math.abs(packet.viewDistance()); + settings.refresh(packet.locale(), viewDistance, packet.chatMessageType(), packet.chatColors(), packet.displayedSkinParts(), packet.mainHand()); EventDispatcher.call(new PlayerSettingsChangeEvent(player)); } } diff --git a/src/main/java/net/minestom/server/listener/SpectateListener.java b/src/main/java/net/minestom/server/listener/SpectateListener.java index 18098adbf..d058e2027 100644 --- a/src/main/java/net/minestom/server/listener/SpectateListener.java +++ b/src/main/java/net/minestom/server/listener/SpectateListener.java @@ -9,7 +9,7 @@ import java.util.UUID; public class SpectateListener { public static void listener(ClientSpectatePacket packet, Player player) { - final UUID targetUuid = packet.targetUuid; + final UUID targetUuid = packet.target(); final Entity target = Entity.getEntity(targetUuid); // Check if the target is valid diff --git a/src/main/java/net/minestom/server/listener/StatusListener.java b/src/main/java/net/minestom/server/listener/StatusListener.java index a6be0ea75..4f1aafab3 100644 --- a/src/main/java/net/minestom/server/listener/StatusListener.java +++ b/src/main/java/net/minestom/server/listener/StatusListener.java @@ -12,24 +12,18 @@ import java.util.Map; public class StatusListener { public static void listener(ClientStatusPacket packet, Player player) { - switch (packet.action) { + switch (packet.action()) { case PERFORM_RESPAWN -> player.respawn(); case REQUEST_STATS -> { List statisticList = new ArrayList<>(); - StatisticsPacket statisticsPacket = new StatisticsPacket(); final Map playerStatisticValueMap = player.getStatisticValueMap(); for (var entry : playerStatisticValueMap.entrySet()) { final PlayerStatistic playerStatistic = entry.getKey(); final int value = entry.getValue(); - - StatisticsPacket.Statistic statistic = new StatisticsPacket.Statistic(); - statistic.category = playerStatistic.getCategory(); - statistic.statisticId = playerStatistic.getStatisticId(); - statistic.value = value; - - statisticList.add(statistic); + statisticList.add(new StatisticsPacket.Statistic(playerStatistic.getCategory(), + playerStatistic.getStatisticId(), value)); } - statisticsPacket.statistics = statisticList.toArray(new StatisticsPacket.Statistic[0]); + StatisticsPacket statisticsPacket = new StatisticsPacket(statisticList); player.getPlayerConnection().sendPacket(statisticsPacket); } } diff --git a/src/main/java/net/minestom/server/listener/TabCompleteListener.java b/src/main/java/net/minestom/server/listener/TabCompleteListener.java index 462978a50..50c9d9e5f 100644 --- a/src/main/java/net/minestom/server/listener/TabCompleteListener.java +++ b/src/main/java/net/minestom/server/listener/TabCompleteListener.java @@ -19,9 +19,9 @@ import java.util.regex.Pattern; public class TabCompleteListener { public static void listener(ClientTabCompletePacket packet, Player player) { - final String text = packet.text; + final String text = packet.text(); - String commandString = packet.text.replaceFirst(CommandManager.COMMAND_PREFIX, ""); + String commandString = text.replaceFirst(CommandManager.COMMAND_PREFIX, ""); String[] split = commandString.split(StringUtils.SPACE); String commandName = split[0]; String args = commandString.replaceFirst(Pattern.quote(commandName), ""); @@ -56,24 +56,10 @@ public class TabCompleteListener { Suggestion suggestion = new Suggestion(input, start, inputLength); suggestionCallback.apply(player, queryResult.context, suggestion); - TabCompletePacket tabCompletePacket = new TabCompletePacket(); - tabCompletePacket.transactionId = packet.transactionId; - tabCompletePacket.start = suggestion.getStart(); - tabCompletePacket.length = suggestion.getLength(); - tabCompletePacket.matches = suggestion.getEntries() - .stream() - .map(suggestionEntry -> { - TabCompletePacket.Match match = new TabCompletePacket.Match(); - match.match = suggestionEntry.getEntry(); - match.hasTooltip = suggestionEntry.getTooltip() != null; - match.tooltip = suggestionEntry.getTooltip(); - return match; - }).toArray(TabCompletePacket.Match[]::new); - - player.getPlayerConnection().sendPacket(tabCompletePacket); + player.getPlayerConnection().sendPacket(new TabCompletePacket(packet.transactionId(), suggestion.getStart(), suggestion.getLength(), + suggestion.getEntries().stream() + .map(suggestionEntry -> new TabCompletePacket.Match(suggestionEntry.getEntry(), suggestionEntry.getTooltip())).toList())); } - - } } diff --git a/src/main/java/net/minestom/server/listener/UseEntityListener.java b/src/main/java/net/minestom/server/listener/UseEntityListener.java index 3628797a2..87912d724 100644 --- a/src/main/java/net/minestom/server/listener/UseEntityListener.java +++ b/src/main/java/net/minestom/server/listener/UseEntityListener.java @@ -11,23 +11,22 @@ import net.minestom.server.network.packet.client.play.ClientInteractEntityPacket public class UseEntityListener { public static void useEntityListener(ClientInteractEntityPacket packet, Player player) { - final Entity entity = Entity.getEntity(packet.targetId); + final Entity entity = Entity.getEntity(packet.targetId()); if (entity == null) return; - ClientInteractEntityPacket.Type type = packet.type; + ClientInteractEntityPacket.Type type = packet.type(); // Player cannot interact with entities he cannot see if (!entity.isViewer(player)) return; - if (type == ClientInteractEntityPacket.Type.ATTACK) { + if (type instanceof ClientInteractEntityPacket.Attack) { if (entity instanceof LivingEntity && ((LivingEntity) entity).isDead()) // Can't attack dead entities return; - EntityAttackEvent entityAttackEvent = new EntityAttackEvent(player, entity); EventDispatcher.call(entityAttackEvent); - } else if (type == ClientInteractEntityPacket.Type.INTERACT) { - PlayerEntityInteractEvent playerEntityInteractEvent = new PlayerEntityInteractEvent(player, entity, packet.hand); + } else if (type instanceof ClientInteractEntityPacket.Interact interact) { + PlayerEntityInteractEvent playerEntityInteractEvent = new PlayerEntityInteractEvent(player, entity, interact.hand()); EventDispatcher.call(playerEntityInteractEvent); } else { // TODO find difference with INTERACT diff --git a/src/main/java/net/minestom/server/listener/UseItemListener.java b/src/main/java/net/minestom/server/listener/UseItemListener.java index 58df175e1..0ffb5f408 100644 --- a/src/main/java/net/minestom/server/listener/UseItemListener.java +++ b/src/main/java/net/minestom/server/listener/UseItemListener.java @@ -15,7 +15,7 @@ public class UseItemListener { public static void useItemListener(ClientUseItemPacket packet, Player player) { final PlayerInventory inventory = player.getInventory(); - final Player.Hand hand = packet.hand; + final Player.Hand hand = packet.hand(); ItemStack itemStack = hand == Player.Hand.MAIN ? inventory.getItemInMainHand() : inventory.getItemInOffHand(); //itemStack.onRightClick(player, hand); PlayerUseItemEvent useItemEvent = new PlayerUseItemEvent(player, hand, itemStack); diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index 2ac80cd70..6f5df0f2a 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -16,16 +16,16 @@ import net.minestom.server.network.packet.server.play.SetSlotPacket; public class WindowListener { public static void clickWindowListener(ClientClickWindowPacket packet, Player player) { - final int windowId = packet.windowId; + final int windowId = packet.windowId(); final AbstractInventory inventory = windowId == 0 ? player.getInventory() : player.getOpenInventory(); if (inventory == null) { // Invalid packet return; } - final short slot = packet.slot; - final byte button = packet.button; - final ClientClickWindowPacket.ClickType clickType = packet.clickType; + final short slot = packet.slot(); + final byte button = packet.button(); + final ClientClickWindowPacket.ClickType clickType = packet.clickType(); //System.out.println("Window id: " + windowId + " | slot: " + slot + " | button: " + button + " | clickType: " + clickType); @@ -56,7 +56,7 @@ public class WindowListener { } else if (clickType == ClientClickWindowPacket.ClickType.CLONE) { successful = player.isCreative(); if (successful) { - setCursor(player, inventory, packet.item); + setCursor(player, inventory, packet.clickedItem()); } } else if (clickType == ClientClickWindowPacket.ClickType.THROW) { successful = inventory.drop(player, false, slot, button); @@ -78,9 +78,7 @@ public class WindowListener { refreshCursorItem(player, inventory); // (Why is the ping packet necessary?) - PingPacket pingPacket = new PingPacket(); - pingPacket.id = (1 << 30) | (windowId << 16); - player.getPlayerConnection().sendPacket(pingPacket); + player.getPlayerConnection().sendPacket(new PingPacket((1 << 30) | (windowId << 16))); } public static void pong(ClientPongPacket packet, Player player) { diff --git a/src/main/java/net/minestom/server/listener/manager/ClientPacketConsumer.java b/src/main/java/net/minestom/server/listener/manager/ClientPacketConsumer.java index fc8110f39..276e539aa 100644 --- a/src/main/java/net/minestom/server/listener/manager/ClientPacketConsumer.java +++ b/src/main/java/net/minestom/server/listener/manager/ClientPacketConsumer.java @@ -2,7 +2,7 @@ package net.minestom.server.listener.manager; import net.minestom.server.entity.Player; import net.minestom.server.network.ConnectionManager; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import org.jetbrains.annotations.NotNull; /** @@ -18,5 +18,5 @@ public interface ClientPacketConsumer { * @param packetController the packet controller, can be used to cancel the packet * @param packet the packet */ - void accept(@NotNull Player player, @NotNull PacketController packetController, @NotNull ClientPlayPacket packet); + void accept(@NotNull Player player, @NotNull PacketController packetController, @NotNull ClientPacket packet); } diff --git a/src/main/java/net/minestom/server/listener/manager/PacketController.java b/src/main/java/net/minestom/server/listener/manager/PacketController.java index c628090c3..afef9e548 100644 --- a/src/main/java/net/minestom/server/listener/manager/PacketController.java +++ b/src/main/java/net/minestom/server/listener/manager/PacketController.java @@ -1,13 +1,13 @@ package net.minestom.server.listener.manager; import net.minestom.server.entity.Player; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.packet.server.ServerPacket; import java.util.Collection; /** - * Used to control the output of a packet in {@link ClientPacketConsumer#accept(Player, PacketController, ClientPlayPacket)} + * Used to control the output of a packet in {@link ClientPacketConsumer#accept(Player, PacketController, ClientPacket)} * and {@link ServerPacketConsumer#accept(Collection, PacketController, ServerPacket)}. */ public class PacketController { diff --git a/src/main/java/net/minestom/server/listener/manager/PacketListenerConsumer.java b/src/main/java/net/minestom/server/listener/manager/PacketListenerConsumer.java index 800531eb7..53eb95a10 100644 --- a/src/main/java/net/minestom/server/listener/manager/PacketListenerConsumer.java +++ b/src/main/java/net/minestom/server/listener/manager/PacketListenerConsumer.java @@ -1,7 +1,7 @@ package net.minestom.server.listener.manager; import net.minestom.server.entity.Player; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; /** * Small convenient interface to use method references with {@link PacketListenerManager#setListener(Class, PacketListenerConsumer)}. @@ -9,6 +9,6 @@ import net.minestom.server.network.packet.client.ClientPlayPacket; * @param the packet type */ @FunctionalInterface -public interface PacketListenerConsumer { +public interface PacketListenerConsumer { void accept(T packet, Player player); } diff --git a/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java b/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java index b0ec7d267..57df52318 100644 --- a/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java +++ b/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java @@ -6,7 +6,7 @@ import net.minestom.server.event.GlobalHandles; import net.minestom.server.event.player.PlayerPacketEvent; import net.minestom.server.listener.*; import net.minestom.server.network.ConnectionManager; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.packet.client.play.*; import net.minestom.server.network.packet.server.ServerPacket; import org.jetbrains.annotations.NotNull; @@ -23,7 +23,7 @@ public final class PacketListenerManager { public final static Logger LOGGER = LoggerFactory.getLogger(PacketListenerManager.class); private static final ConnectionManager CONNECTION_MANAGER = MinecraftServer.getConnectionManager(); - private final Map, PacketListenerConsumer> listeners = new ConcurrentHashMap<>(); + private final Map, PacketListenerConsumer> listeners = new ConcurrentHashMap<>(); public PacketListenerManager() { setListener(ClientKeepAlivePacket.class, KeepAliveListener::listener); @@ -65,7 +65,7 @@ public final class PacketListenerManager { * @param player the player who sent the packet * @param the packet type */ - public void processClientPacket(@NotNull T packet, @NotNull Player player) { + public void processClientPacket(@NotNull T packet, @NotNull Player player) { final Class clazz = packet.getClass(); @@ -135,7 +135,7 @@ public final class PacketListenerManager { * @param consumer the new packet's listener * @param the type of the packet */ - public void setListener(@NotNull Class packetClass, @NotNull PacketListenerConsumer consumer) { + public void setListener(@NotNull Class packetClass, @NotNull PacketListenerConsumer consumer) { this.listeners.put(packetClass, consumer); } diff --git a/src/main/java/net/minestom/server/map/Framebuffer.java b/src/main/java/net/minestom/server/map/Framebuffer.java index cfd1bf191..d0ed8c058 100644 --- a/src/main/java/net/minestom/server/map/Framebuffer.java +++ b/src/main/java/net/minestom/server/map/Framebuffer.java @@ -2,6 +2,8 @@ package net.minestom.server.map; import net.minestom.server.network.packet.server.play.MapDataPacket; +import java.util.List; + /** * Framebuffer to render to a map */ @@ -12,11 +14,11 @@ public interface Framebuffer { byte[] toMapColors(); - default void preparePacket(MapDataPacket packet) { - preparePacket(packet, 0, 0, WIDTH, HEIGHT); + default MapDataPacket preparePacket(int mapId) { + return preparePacket(mapId, 0, 0, WIDTH, HEIGHT); } - default void preparePacket(MapDataPacket packet, int minX, int minY, int width, int height) { + default MapDataPacket preparePacket(int mapId, int minX, int minY, int width, int height) { byte[] colors; if (minX == 0 && minY == 0 && width == WIDTH && height == HEIGHT) { colors = toMapColors(); @@ -30,13 +32,11 @@ public interface Framebuffer { } } } - - packet.columns = (short) width; - packet.rows = (short) height; - packet.icons = new MapDataPacket.Icon[0]; - packet.x = (byte) minX; - packet.z = (byte) minY; - packet.data = colors; + return new MapDataPacket(mapId, (byte) 0, false, + false, List.of(), + (byte) width, (byte) height, + (byte) minX, (byte) minY, + colors); } static int index(int x, int z) { diff --git a/src/main/java/net/minestom/server/map/LargeFramebuffer.java b/src/main/java/net/minestom/server/map/LargeFramebuffer.java index 9b67b8e34..d9f3dca85 100644 --- a/src/main/java/net/minestom/server/map/LargeFramebuffer.java +++ b/src/main/java/net/minestom/server/map/LargeFramebuffer.java @@ -2,6 +2,8 @@ package net.minestom.server.map; import net.minestom.server.network.packet.server.play.MapDataPacket; +import java.util.List; + /** * Framebuffer that is meant to be split in sub-framebuffers. * Contrary to {@link Framebuffer}, LargeFramebuffer supports sizes over 128x128 pixels. @@ -26,12 +28,8 @@ public interface LargeFramebuffer { /** * Prepares the packet to render a 128x128 sub view of this framebuffer - * - * @param packet the {@link MapDataPacket} to prepare - * @param left - * @param top */ - default void preparePacket(MapDataPacket packet, int left, int top) { + default MapDataPacket preparePacket(int mapId, int left, int top) { byte[] colors = new byte[Framebuffer.WIDTH * Framebuffer.WIDTH]; final int width = Math.min(width(), left + Framebuffer.WIDTH) - left; final int height = Math.min(height(), top + Framebuffer.HEIGHT) - top; @@ -41,12 +39,10 @@ public interface LargeFramebuffer { colors[Framebuffer.index(x - left, y - top)] = color; } } - - packet.columns = (short) width; - packet.rows = (short) height; - packet.icons = new MapDataPacket.Icon[0]; - packet.x = 0; - packet.z = 0; - packet.data = colors; + return new MapDataPacket(mapId, (byte) 0, false, + false, List.of(), + (byte) width, (byte) height, + (byte) 0, (byte) 0, + colors); } } diff --git a/src/main/java/net/minestom/server/network/PacketProcessor.java b/src/main/java/net/minestom/server/network/PacketProcessor.java index 60206c373..9a8a19a39 100644 --- a/src/main/java/net/minestom/server/network/PacketProcessor.java +++ b/src/main/java/net/minestom/server/network/PacketProcessor.java @@ -2,19 +2,13 @@ package net.minestom.server.network; import net.minestom.server.MinecraftServer; import net.minestom.server.entity.Player; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; +import net.minestom.server.network.packet.client.ClientPacketsHandler; import net.minestom.server.network.packet.client.ClientPreplayPacket; -import net.minestom.server.network.packet.client.handler.ClientLoginPacketsHandler; -import net.minestom.server.network.packet.client.handler.ClientPlayPacketsHandler; -import net.minestom.server.network.packet.client.handler.ClientStatusPacketsHandler; import net.minestom.server.network.packet.client.handshake.HandshakePacket; -import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.network.player.PlayerSocketConnection; import net.minestom.server.utils.binary.BinaryReader; -import net.minestom.server.utils.binary.Readable; import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.nio.ByteBuffer; @@ -22,113 +16,47 @@ import java.nio.ByteBuffer; * Responsible for processing client packets. *

* You can retrieve the different packet handlers per state (status/login/play) - * from the {@link net.minestom.server.network.packet.client.handler.ClientPacketsHandler} class. - *

- * Packet handlers are cached here and can be retrieved with {@link #getStatusPacketsHandler()}, {@link #getLoginPacketsHandler()} - * and {@link #getPlayPacketsHandler()}. The one to use depend on the type of packet you need to retrieve (the packet id 0 does not have - * the same meaning as it is a login or play packet). + * from the {@link ClientPacketsHandler} classes. */ -public final class PacketProcessor { - private final static Logger LOGGER = LoggerFactory.getLogger(PacketProcessor.class); - - // Protocols state - private final ClientStatusPacketsHandler statusPacketsHandler; - private final ClientLoginPacketsHandler loginPacketsHandler; - private final ClientPlayPacketsHandler playPacketsHandler; - +public record PacketProcessor(@NotNull ClientPacketsHandler statusHandler, + @NotNull ClientPacketsHandler loginHandler, + @NotNull ClientPacketsHandler playHandler) { public PacketProcessor() { - this.statusPacketsHandler = new ClientStatusPacketsHandler(); - this.loginPacketsHandler = new ClientLoginPacketsHandler(); - this.playPacketsHandler = new ClientPlayPacketsHandler(); + this(new ClientPacketsHandler.Status(), + new ClientPacketsHandler.Login(), + new ClientPacketsHandler.Play()); } - public void process(@NotNull PlayerSocketConnection playerConnection, int packetId, ByteBuffer body) { + public void process(@NotNull PlayerSocketConnection connection, int packetId, ByteBuffer body) { if (MinecraftServer.getRateLimit() > 0) { // Increment packet count (checked in PlayerConnection#update) - playerConnection.getPacketCounter().incrementAndGet(); + connection.getPacketCounter().incrementAndGet(); } BinaryReader binaryReader = new BinaryReader(body); - final ConnectionState connectionState = playerConnection.getConnectionState(); + final ConnectionState connectionState = connection.getConnectionState(); if (connectionState == ConnectionState.UNKNOWN) { // Should be handshake packet if (packetId == 0) { - HandshakePacket handshakePacket = new HandshakePacket(); - safeRead(playerConnection, handshakePacket, binaryReader); - handshakePacket.process(playerConnection); + final HandshakePacket handshakePacket = new HandshakePacket(binaryReader); + handshakePacket.process(connection); } return; } switch (connectionState) { case PLAY -> { - final Player player = playerConnection.getPlayer(); - ClientPlayPacket playPacket = (ClientPlayPacket) playPacketsHandler.getPacketInstance(packetId); - safeRead(playerConnection, playPacket, binaryReader); + final Player player = connection.getPlayer(); + ClientPacket playPacket = playHandler.create(packetId, binaryReader); assert player != null; player.addPacketToQueue(playPacket); } case LOGIN -> { - final ClientPreplayPacket loginPacket = (ClientPreplayPacket) loginPacketsHandler.getPacketInstance(packetId); - safeRead(playerConnection, loginPacket, binaryReader); - loginPacket.process(playerConnection); + final ClientPreplayPacket loginPacket = (ClientPreplayPacket) loginHandler.create(packetId, binaryReader); + loginPacket.process(connection); } case STATUS -> { - final ClientPreplayPacket statusPacket = (ClientPreplayPacket) statusPacketsHandler.getPacketInstance(packetId); - safeRead(playerConnection, statusPacket, binaryReader); - statusPacket.process(playerConnection); + final ClientPreplayPacket statusPacket = (ClientPreplayPacket) statusHandler.create(packetId, binaryReader); + statusPacket.process(connection); } } } - - /** - * Gets the handler for client status packets. - * - * @return the status packets handler - * @see Status packets - */ - public @NotNull ClientStatusPacketsHandler getStatusPacketsHandler() { - return statusPacketsHandler; - } - - /** - * Gets the handler for client login packets. - * - * @return the status login handler - * @see Login packets - */ - public @NotNull ClientLoginPacketsHandler getLoginPacketsHandler() { - return loginPacketsHandler; - } - - /** - * Gets the handler for client play packets. - * - * @return the play packets handler - * @see Play packets - */ - public @NotNull ClientPlayPacketsHandler getPlayPacketsHandler() { - return playPacketsHandler; - } - - /** - * Calls {@link Readable#read(BinaryReader)} and catch all the exceptions to be printed using the packet processor logger. - * - * @param connection the connection who sent the packet - * @param readable the readable interface - * @param reader the buffer containing the packet - */ - private void safeRead(@NotNull PlayerConnection connection, @NotNull Readable readable, @NotNull BinaryReader reader) { - final int readableBytes = reader.available(); - // Check if there is anything to read - if (readableBytes == 0) { - return; - } - try { - readable.read(reader); - } catch (Exception e) { - final Player player = connection.getPlayer(); - final String username = player != null ? player.getUsername() : "null"; - LOGGER.warn("Connection {} ({}) sent an unexpected packet.", connection.getRemoteAddress(), username); - MinecraftServer.getExceptionManager().handleException(e); - } - } } diff --git a/src/main/java/net/minestom/server/network/packet/client/ClientPacket.java b/src/main/java/net/minestom/server/network/packet/client/ClientPacket.java index 9716e3d61..6870aaf31 100644 --- a/src/main/java/net/minestom/server/network/packet/client/ClientPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/ClientPacket.java @@ -1,18 +1,9 @@ package net.minestom.server.network.packet.client; -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; /** * Represents a packet received from a client. */ -public interface ClientPacket extends Readable, Writeable { - - @Override - default void write(@NotNull BinaryWriter writer) { - // FIXME: remove when all packets are written and read properly - throw new UnsupportedOperationException("WIP: This packet is not setup to be written from Minestom code at the moment."); - } +public interface ClientPacket extends Writeable { } diff --git a/src/main/java/net/minestom/server/network/packet/client/ClientPacketsHandler.java b/src/main/java/net/minestom/server/network/packet/client/ClientPacketsHandler.java new file mode 100644 index 000000000..b3196248e --- /dev/null +++ b/src/main/java/net/minestom/server/network/packet/client/ClientPacketsHandler.java @@ -0,0 +1,106 @@ +package net.minestom.server.network.packet.client; + +import net.minestom.server.network.packet.client.login.EncryptionResponsePacket; +import net.minestom.server.network.packet.client.login.LoginPluginResponsePacket; +import net.minestom.server.network.packet.client.login.LoginStartPacket; +import net.minestom.server.network.packet.client.play.*; +import net.minestom.server.network.packet.client.status.PingPacket; +import net.minestom.server.network.packet.client.status.StatusRequestPacket; +import net.minestom.server.utils.ObjectArray; +import net.minestom.server.utils.binary.BinaryReader; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.UnknownNullability; + +import java.util.function.Function; + +/** + * Contains registered packets and a way to instantiate them. + *

+ * Packets are registered using {@link #register(int, Function)} and created using {@link #create(int, BinaryReader)}. + */ +public sealed class ClientPacketsHandler permits ClientPacketsHandler.Status, ClientPacketsHandler.Login, ClientPacketsHandler.Play { + private final ObjectArray> suppliers = new ObjectArray<>(0x10); + + private ClientPacketsHandler() { + } + + public void register(int id, @NotNull Function<@NotNull BinaryReader, @NotNull ClientPacket> packetSupplier) { + this.suppliers.set(id, packetSupplier); + } + + public @UnknownNullability ClientPacket create(int packetId, @NotNull BinaryReader reader) { + final Function supplier = suppliers.get(packetId); + if (supplier == null) + throw new IllegalStateException("Packet id 0x" + Integer.toHexString(packetId) + " isn't registered!"); + return supplier.apply(reader); + } + + public static final class Status extends ClientPacketsHandler { + public Status() { + register(0x00, StatusRequestPacket::new); + register(0x01, PingPacket::new); + } + } + + public static final class Login extends ClientPacketsHandler { + public Login() { + register(0x00, LoginStartPacket::new); + register(0x01, EncryptionResponsePacket::new); + register(0x02, LoginPluginResponsePacket::new); + } + } + + public static final class Play extends ClientPacketsHandler { + public Play() { + register(0x00, ClientTeleportConfirmPacket::new); + register(0x01, ClientQueryBlockNbtPacket::new); + register(0x03, ClientChatMessagePacket::new); + register(0x04, ClientStatusPacket::new); + register(0x05, ClientSettingsPacket::new); + register(0x06, ClientTabCompletePacket::new); + register(0x07, ClientClickWindowButtonPacket::new); + register(0x08, ClientClickWindowPacket::new); + register(0x09, ClientCloseWindowPacket::new); + register(0x0A, ClientPluginMessagePacket::new); + register(0x0B, ClientEditBookPacket::new); + register(0x0C, ClientQueryEntityNbtPacket::new); + register(0x0D, ClientInteractEntityPacket::new); + register(0x0E, ClientGenerateStructurePacket::new); + register(0x0F, ClientKeepAlivePacket::new); + + // 0x10 packet not used server-side + register(0x11, ClientPlayerPositionPacket::new); + register(0x12, ClientPlayerPositionAndRotationPacket::new); + register(0x13, ClientPlayerRotationPacket::new); + register(0x14, ClientPlayerPacket::new); + register(0x15, ClientVehicleMovePacket::new); + register(0x16, ClientSteerBoatPacket::new); + register(0x17, ClientPickItemPacket::new); + register(0x18, ClientCraftRecipeRequest::new); + register(0x19, ClientPlayerAbilitiesPacket::new); + register(0x1A, ClientPlayerDiggingPacket::new); + register(0x1B, ClientEntityActionPacket::new); + register(0x1C, ClientSteerVehiclePacket::new); + register(0x1D, ClientPongPacket::new); + register(0x1E, ClientSetRecipeBookStatePacket::new); + register(0x1F, ClientSetDisplayedRecipePacket::new); + + register(0x20, ClientNameItemPacket::new); + register(0x21, ClientResourcePackStatusPacket::new); + register(0x22, ClientAdvancementTabPacket::new); + register(0x23, ClientSelectTradePacket::new); + register(0x24, ClientSetBeaconEffectPacket::new); + register(0x25, ClientHeldItemChangePacket::new); + register(0x26, ClientUpdateCommandBlockPacket::new); + register(0x27, ClientUpdateCommandBlockMinecartPacket::new); + register(0x28, ClientCreativeInventoryActionPacket::new); + //Update Jigsaw Block?? + register(0x2A, ClientUpdateStructureBlockPacket::new); + register(0x2B, ClientUpdateSignPacket::new); + register(0x2C, ClientAnimationPacket::new); + register(0x2D, ClientSpectatePacket::new); + register(0x2E, ClientPlayerBlockPlacementPacket::new); + register(0x2F, ClientUseItemPacket::new); + } + } +} diff --git a/src/main/java/net/minestom/server/network/packet/client/ClientPlayPacket.java b/src/main/java/net/minestom/server/network/packet/client/ClientPlayPacket.java deleted file mode 100644 index 9dcdd20af..000000000 --- a/src/main/java/net/minestom/server/network/packet/client/ClientPlayPacket.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.minestom.server.network.packet.client; - -import net.minestom.server.MinecraftServer; -import net.minestom.server.entity.Player; -import net.minestom.server.listener.manager.PacketListenerManager; -import org.jetbrains.annotations.NotNull; - -public abstract class ClientPlayPacket implements ClientPacket { - private static final PacketListenerManager PACKET_LISTENER_MANAGER = MinecraftServer.getPacketListenerManager(); - - /** - * Processes the packet for {@code player}. - *

- * Called during the player tick and forwarded to the {@link PacketListenerManager}. - * - * @param player the player who sent the packet - */ - public void process(@NotNull Player player) { - PACKET_LISTENER_MANAGER.processClientPacket(this, player); - } -} diff --git a/src/main/java/net/minestom/server/network/packet/client/handler/ClientLoginPacketsHandler.java b/src/main/java/net/minestom/server/network/packet/client/handler/ClientLoginPacketsHandler.java deleted file mode 100644 index 122026d74..000000000 --- a/src/main/java/net/minestom/server/network/packet/client/handler/ClientLoginPacketsHandler.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.minestom.server.network.packet.client.handler; - -import net.minestom.server.network.packet.client.login.EncryptionResponsePacket; -import net.minestom.server.network.packet.client.login.LoginPluginResponsePacket; -import net.minestom.server.network.packet.client.login.LoginStartPacket; - -public class ClientLoginPacketsHandler extends ClientPacketsHandler { - - public ClientLoginPacketsHandler() { - register(0, LoginStartPacket::new); - register(1, EncryptionResponsePacket::new); - register(2, LoginPluginResponsePacket::new); - } - -} diff --git a/src/main/java/net/minestom/server/network/packet/client/handler/ClientPacketsHandler.java b/src/main/java/net/minestom/server/network/packet/client/handler/ClientPacketsHandler.java deleted file mode 100644 index a61b1b8cb..000000000 --- a/src/main/java/net/minestom/server/network/packet/client/handler/ClientPacketsHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.minestom.server.network.packet.client.handler; - -import net.minestom.server.network.packet.client.ClientPacket; -import net.minestom.server.utils.binary.BinaryReader; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Supplier; - -/** - * Contains registered packets and a way to instantiate them. - *

- * Packets are register using {@link #register(int, ClientPacketSupplier)} - * (you can override a packet id even if not recommended and not officially supported) and retrieved with {@link #getPacketInstance(int)}. - *

- * If you want to fill the packet from a buffer, consider using {@link ClientPacket#read(BinaryReader)} after getting the packet instance. - */ -public class ClientPacketsHandler { - - // Max packet id - private static final int SIZE = 0x30; - - private final ClientPacketSupplier[] supplierAccesses = new ClientPacketSupplier[SIZE]; - - /** - * Registers a client packet which can be retrieved later using {@link #getPacketInstance(int)}. - * - * @param id the packet id - * @param packetSupplier the supplier of the packet - */ - public void register(int id, @NotNull ClientPacketSupplier packetSupplier) { - this.supplierAccesses[id] = packetSupplier; - } - - /** - * Retrieves a {@link net.minestom.server.network.packet.client.ClientPlayPacket} from its id. - * - * @param id the packet id - * @return the associated client packet - * @throws IllegalStateException if {@code id} is not a valid packet id, or unregistered - */ - public ClientPacket getPacketInstance(int id) { - if (id > SIZE) - throw new IllegalStateException("Packet ID 0x" + Integer.toHexString(id) + " has been tried to be parsed, debug needed"); - - ClientPacketSupplier supplier = supplierAccesses[id]; - if (supplierAccesses[id] == null) - throw new IllegalStateException("Packet id 0x" + Integer.toHexString(id) + " isn't registered!"); - - //ClientPacket packet = supplier.get(); - //System.out.println("RECEIVED PACKET 0x" + Integer.toHexString(id)+" : "+packet.getClass().getSimpleName()); - return supplier.get(); - } - - /** - * Convenient interface to supply a {@link ClientPacket}. - */ - protected interface ClientPacketSupplier extends Supplier { - } - -} diff --git a/src/main/java/net/minestom/server/network/packet/client/handler/ClientPlayPacketsHandler.java b/src/main/java/net/minestom/server/network/packet/client/handler/ClientPlayPacketsHandler.java deleted file mode 100644 index a1a564cd9..000000000 --- a/src/main/java/net/minestom/server/network/packet/client/handler/ClientPlayPacketsHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.minestom.server.network.packet.client.handler; - -import net.minestom.server.network.packet.client.play.*; - -public class ClientPlayPacketsHandler extends ClientPacketsHandler { - - public ClientPlayPacketsHandler() { - register(0x00, ClientTeleportConfirmPacket::new); - register(0x01, ClientQueryBlockNbtPacket::new); - register(0x03, ClientChatMessagePacket::new); - register(0x04, ClientStatusPacket::new); - register(0x05, ClientSettingsPacket::new); - register(0x06, ClientTabCompletePacket::new); - register(0x07, ClientClickWindowButtonPacket::new); - register(0x08, ClientClickWindowPacket::new); - register(0x09, ClientCloseWindowPacket::new); - register(0x0A, ClientPluginMessagePacket::new); - register(0x0B, ClientEditBookPacket::new); - register(0x0C, ClientQueryEntityNbtPacket::new); - register(0x0D, ClientInteractEntityPacket::new); - register(0x0E, ClientGenerateStructurePacket::new); - register(0x0F, ClientKeepAlivePacket::new); - - // 0x10 packet not used server-side - register(0x11, ClientPlayerPositionPacket::new); - register(0x12, ClientPlayerPositionAndRotationPacket::new); - register(0x13, ClientPlayerRotationPacket::new); - register(0x14, ClientPlayerPacket::new); - register(0x15, ClientVehicleMovePacket::new); - register(0x16, ClientSteerBoatPacket::new); - register(0x17, ClientPickItemPacket::new); - register(0x18, ClientCraftRecipeRequest::new); - register(0x19, ClientPlayerAbilitiesPacket::new); - register(0x1A, ClientPlayerDiggingPacket::new); - register(0x1B, ClientEntityActionPacket::new); - register(0x1C, ClientSteerVehiclePacket::new); - register(0x1D, ClientPongPacket::new); - register(0x1E, ClientSetRecipeBookStatePacket::new); - register(0x1F, ClientSetDisplayedRecipePacket::new); - - - register(0x20, ClientNameItemPacket::new); - register(0x21, ClientResourcePackStatusPacket::new); - register(0x22, ClientAdvancementTabPacket::new); - register(0x23, ClientSelectTradePacket::new); - register(0x24, ClientSetBeaconEffectPacket::new); - register(0x25, ClientHeldItemChangePacket::new); - register(0x26, ClientUpdateCommandBlockPacket::new); - register(0x27, ClientUpdateCommandBlockMinecartPacket::new); - register(0x28, ClientCreativeInventoryActionPacket::new); - //Update Jigsaw Block?? - register(0x2A, ClientUpdateStructureBlockPacket::new); - register(0x2B, ClientUpdateSignPacket::new); - register(0x2C, ClientAnimationPacket::new); - register(0x2D, ClientSpectatePacket::new); - register(0x2E, ClientPlayerBlockPlacementPacket::new); - register(0x2F, ClientUseItemPacket::new); - } -} diff --git a/src/main/java/net/minestom/server/network/packet/client/handler/ClientStatusPacketsHandler.java b/src/main/java/net/minestom/server/network/packet/client/handler/ClientStatusPacketsHandler.java deleted file mode 100644 index b216a8dad..000000000 --- a/src/main/java/net/minestom/server/network/packet/client/handler/ClientStatusPacketsHandler.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.minestom.server.network.packet.client.handler; - -import net.minestom.server.network.packet.client.status.PingPacket; -import net.minestom.server.network.packet.client.status.StatusRequestPacket; - -public class ClientStatusPacketsHandler extends ClientPacketsHandler { - public ClientStatusPacketsHandler() { - register(0x00, StatusRequestPacket::new); - register(0x01, PingPacket::new); - } -} diff --git a/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java b/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java index cfad0a759..0ab282d50 100644 --- a/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java @@ -17,7 +17,8 @@ import org.jetbrains.annotations.NotNull; import java.net.SocketAddress; import java.util.UUID; -public class HandshakePacket implements ClientPreplayPacket { +public record HandshakePacket(int protocolVersion, @NotNull String serverAddress, + int serverPort, int nextState) implements ClientPreplayPacket { /** * Text sent if a player tries to connect with an invalid version of the client @@ -25,24 +26,9 @@ public class HandshakePacket implements ClientPreplayPacket { private static final Component INVALID_VERSION_TEXT = Component.text("Invalid Version, please use " + MinecraftServer.VERSION_NAME, NamedTextColor.RED); private static final Component INVALID_BUNGEE_FORWARDING = Component.text("If you wish to use IP forwarding, please enable it in your BungeeCord config as well!", NamedTextColor.RED); - private int protocolVersion; - private String serverAddress = ""; - private int serverPort; - private int nextState; - - @Override - public void read(@NotNull BinaryReader reader) { - this.protocolVersion = reader.readVarInt(); - try { - this.serverAddress = reader.readSizedString(BungeeCordProxy.isEnabled() ? Short.MAX_VALUE : 255); - } catch (Exception e) { - if (BungeeCordProxy.isEnabled()) { - System.err.println("Legacy proxy forwarding is enabled but the read did underflow. Please check your proxy."); - } - e.printStackTrace(); - } - this.serverPort = reader.readUnsignedShort(); - this.nextState = reader.readVarInt(); + public HandshakePacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readSizedString(BungeeCordProxy.isEnabled() ? Short.MAX_VALUE : 255), + reader.readUnsignedShort(), reader.readVarInt()); } @Override @@ -60,13 +46,14 @@ public class HandshakePacket implements ClientPreplayPacket { @Override public void process(@NotNull PlayerConnection connection) { + String address = serverAddress; // Bungee support (IP forwarding) if (BungeeCordProxy.isEnabled() && connection instanceof PlayerSocketConnection socketConnection) { - if (serverAddress != null) { - final String[] split = serverAddress.split("\00"); + if (address != null) { + final String[] split = address.split("\00"); if (split.length == 3 || split.length == 4) { - this.serverAddress = split[0]; + address = split[0]; final SocketAddress socketAddress = new java.net.InetSocketAddress(split[1], ((java.net.InetSocketAddress) connection.getRemoteAddress()).getPort()); @@ -99,7 +86,7 @@ public class HandshakePacket implements ClientPreplayPacket { if (connection instanceof PlayerSocketConnection) { // Give to the connection the server info that the client used - ((PlayerSocketConnection) connection).refreshServerInformation(serverAddress, serverPort, protocolVersion); + ((PlayerSocketConnection) connection).refreshServerInformation(address, serverPort, protocolVersion); } switch (nextState) { diff --git a/src/main/java/net/minestom/server/network/packet/client/login/EncryptionResponsePacket.java b/src/main/java/net/minestom/server/network/packet/client/login/EncryptionResponsePacket.java index e25afa278..37fce125f 100644 --- a/src/main/java/net/minestom/server/network/packet/client/login/EncryptionResponsePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/login/EncryptionResponsePacket.java @@ -25,15 +25,12 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.UUID; -public class EncryptionResponsePacket implements ClientPreplayPacket { +public record EncryptionResponsePacket(byte[] sharedSecret, byte[] verifyToken) implements ClientPreplayPacket { private static final String MOJANG_AUTH_URL = System.getProperty("minestom.auth.url", "https://sessionserver.mojang.com/session/minecraft/hasJoined").concat("?username=%s&serverId=%s"); private static final Gson GSON = new Gson(); - private byte[] sharedSecret; - private byte[] verifyToken; - public EncryptionResponsePacket() { - sharedSecret = new byte[0]; - verifyToken = new byte[0]; + public EncryptionResponsePacket(BinaryReader reader) { + this(reader.readBytes(reader.readVarInt()), reader.readBytes(reader.readVarInt())); } @Override @@ -92,12 +89,6 @@ public class EncryptionResponsePacket implements ClientPreplayPacket { }); } - @Override - public void read(@NotNull BinaryReader reader) { - this.sharedSecret = ByteArrayData.decodeByteArray(reader); - this.verifyToken = ByteArrayData.decodeByteArray(reader); - } - @Override public void write(@NotNull BinaryWriter writer) { ByteArrayData.encodeByteArray(writer, sharedSecret); diff --git a/src/main/java/net/minestom/server/network/packet/client/login/LoginPluginResponsePacket.java b/src/main/java/net/minestom/server/network/packet/client/login/LoginPluginResponsePacket.java index 99ff13cdc..f1d6cdb2c 100644 --- a/src/main/java/net/minestom/server/network/packet/client/login/LoginPluginResponsePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/login/LoginPluginResponsePacket.java @@ -14,19 +14,20 @@ import net.minestom.server.network.player.PlayerSocketConnection; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.UUID; -public class LoginPluginResponsePacket implements ClientPreplayPacket { +public record LoginPluginResponsePacket(int messageId, byte @Nullable [] data) implements ClientPreplayPacket { private final static ConnectionManager CONNECTION_MANAGER = MinecraftServer.getConnectionManager(); public static final Component INVALID_PROXY_RESPONSE = Component.text("Invalid proxy response!", NamedTextColor.RED); - public int messageId; - public boolean successful; - public byte[] data = new byte[0]; + public LoginPluginResponsePacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readBoolean() ? reader.readRemainingBytes() : null); + } @Override public void process(@NotNull PlayerConnection connection) { @@ -82,21 +83,10 @@ public class LoginPluginResponsePacket implements ClientPreplayPacket { } } - @Override - public void read(@NotNull BinaryReader reader) { - this.messageId = reader.readVarInt(); - this.successful = reader.readBoolean(); - if (successful) { - this.data = reader.readRemainingBytes(); - } - } - @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(messageId); - writer.writeBoolean(successful); - if (successful) { - writer.writeBytes(data); - } + writer.writeBoolean(data != null); + if (data != null) writer.writeBytes(data); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java b/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java index 285871e70..988e675a2 100644 --- a/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java @@ -21,11 +21,12 @@ import org.jetbrains.annotations.NotNull; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; -public class LoginStartPacket implements ClientPreplayPacket { - +public record LoginStartPacket(@NotNull String username) implements ClientPreplayPacket { private static final Component ALREADY_CONNECTED = Component.text("You are already on this server", NamedTextColor.RED); - public String username = ""; + public LoginStartPacket(BinaryReader reader) { + this(reader.readSizedString(16)); + } @Override public void process(@NotNull PlayerConnection connection) { @@ -50,12 +51,7 @@ public class LoginStartPacket implements ClientPreplayPacket { final String channel = VelocityProxy.PLAYER_INFO_CHANNEL; // Important in order to retrieve the channel in the response packet socketConnection.addPluginRequestEntry(messageId, channel); - - LoginPluginRequestPacket loginPluginRequestPacket = new LoginPluginRequestPacket(); - loginPluginRequestPacket.messageId = messageId; - loginPluginRequestPacket.channel = channel; - loginPluginRequestPacket.data = null; - connection.sendPacket(loginPluginRequestPacket); + connection.sendPacket(new LoginPluginRequestPacket(messageId, channel, null)); return; } } @@ -69,8 +65,12 @@ public class LoginStartPacket implements ClientPreplayPacket { } final PlayerSocketConnection socketConnection = (PlayerSocketConnection) connection; socketConnection.setConnectionState(ConnectionState.LOGIN); - EncryptionRequestPacket encryptionRequestPacket = new EncryptionRequestPacket(socketConnection); - socketConnection.sendPacket(encryptionRequestPacket); + + final byte[] publicKey = MojangAuth.getKeyPair().getPublic().getEncoded(); + byte[] nonce = new byte[4]; + ThreadLocalRandom.current().nextBytes(nonce); + socketConnection.setNonce(nonce); + socketConnection.sendPacket(new EncryptionRequestPacket("", publicKey, nonce)); } else { final boolean bungee = BungeeCordProxy.isEnabled(); // Offline @@ -85,11 +85,6 @@ public class LoginStartPacket implements ClientPreplayPacket { } } - @Override - public void read(@NotNull BinaryReader reader) { - this.username = reader.readSizedString(16); - } - @Override public void write(@NotNull BinaryWriter writer) { if (username.length() > 16) diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientAdvancementTabPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientAdvancementTabPacket.java index cb080627b..f7aae2afb 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientAdvancementTabPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientAdvancementTabPacket.java @@ -1,31 +1,34 @@ 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.network.packet.client.ClientPacket; 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 ClientAdvancementTabPacket extends ClientPlayPacket { +public record ClientAdvancementTabPacket(@NotNull AdvancementAction action, + @Nullable String tabIdentifier) implements ClientPacket { + public ClientAdvancementTabPacket(BinaryReader reader) { + this(read(reader)); + } - public AdvancementAction action = AdvancementAction.OPENED_TAB; - public String tabIdentifier = ""; + private ClientAdvancementTabPacket(ClientAdvancementTabPacket packet) { + this(packet.action, packet.tabIdentifier); + } - @Override - public void read(@NotNull BinaryReader reader) { - this.action = AdvancementAction.values()[reader.readVarInt()]; - - if (action == AdvancementAction.OPENED_TAB) { - this.tabIdentifier = reader.readSizedString(256); - } + private static ClientAdvancementTabPacket read(BinaryReader reader) { + var action = AdvancementAction.values()[reader.readVarInt()]; + var tabIdentifier = action == AdvancementAction.OPENED_TAB ? reader.readSizedString(256) : null; + return new ClientAdvancementTabPacket(action, tabIdentifier); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(action.ordinal()); - - if(action == AdvancementAction.OPENED_TAB) { - if(tabIdentifier.length() > 256) { + if (action == AdvancementAction.OPENED_TAB) { + assert tabIdentifier != null; + if (tabIdentifier.length() > 256) { throw new IllegalArgumentException("Tab identifier cannot be longer than 256 characters."); } writer.writeSizedString(tabIdentifier); diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientAnimationPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientAnimationPacket.java index c6a8b92aa..6ec5446b8 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientAnimationPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientAnimationPacket.java @@ -1,18 +1,14 @@ 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.network.packet.client.ClientPacket; 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 = Player.Hand.MAIN; - - @Override - public void read(@NotNull BinaryReader reader) { - this.hand = Player.Hand.values()[reader.readVarInt()]; +public record ClientAnimationPacket(@NotNull Player.Hand hand) implements ClientPacket { + public ClientAnimationPacket(BinaryReader reader) { + this(Player.Hand.values()[reader.readVarInt()]); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientChatMessagePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientChatMessagePacket.java index 9ce504e64..6e5c80d10 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientChatMessagePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientChatMessagePacket.java @@ -1,22 +1,18 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 = ""; - - @Override - public void read(@NotNull BinaryReader reader) { - this.message = reader.readSizedString(256); +public record ClientChatMessagePacket(@NotNull String message) implements ClientPacket { + public ClientChatMessagePacket(BinaryReader reader) { + this(reader.readSizedString(256)); } @Override public void write(@NotNull BinaryWriter writer) { - if(message.length() > 256) { + if (message.length() > 256) { throw new IllegalArgumentException("Message cannot be more than 256 characters long."); } writer.writeSizedString(message); diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowButtonPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowButtonPacket.java index 3ee6a362b..08034505b 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowButtonPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowButtonPacket.java @@ -1,19 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientClickWindowButtonPacket extends ClientPlayPacket { - - public byte windowId; - public byte buttonId; - - @Override - public void read(@NotNull BinaryReader reader) { - this.windowId = reader.readByte(); - this.buttonId = reader.readByte(); +public record ClientClickWindowButtonPacket(byte windowId, byte buttonId) implements ClientPacket { + public ClientClickWindowButtonPacket(BinaryReader reader) { + this(reader.readByte(), reader.readByte()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowPacket.java index fe762a408..fd3cc94e3 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientClickWindowPacket.java @@ -1,39 +1,26 @@ package net.minestom.server.network.packet.client.play; -import it.unimi.dsi.fastutil.shorts.Short2ObjectMap; -import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap; import net.minestom.server.item.ItemStack; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; +import net.minestom.server.utils.binary.Writeable; import org.jetbrains.annotations.NotNull; -public class ClientClickWindowPacket extends ClientPlayPacket { +import java.util.List; - public byte windowId; - public int stateId; - public short slot; - public byte button; - public ClickType clickType = ClickType.PICKUP; - public Short2ObjectMap changedSlots = new Short2ObjectOpenHashMap<>(); - public ItemStack item = ItemStack.AIR; +public record ClientClickWindowPacket(byte windowId, int stateId, + short slot, byte button, @NotNull ClickType clickType, + @NotNull List changedSlots, + @NotNull ItemStack clickedItem) implements ClientPacket { + public ClientClickWindowPacket { + changedSlots = List.copyOf(changedSlots); + } - @Override - public void read(@NotNull BinaryReader reader) { - this.windowId = reader.readByte(); - this.stateId = reader.readVarInt(); - this.slot = reader.readShort(); - this.button = reader.readByte(); - this.clickType = ClickType.values()[reader.readVarInt()]; - - final int length = reader.readVarInt(); - this.changedSlots = new Short2ObjectOpenHashMap<>(length); - for (int i = 0; i < length; i++) { - short slot = reader.readShort(); - ItemStack item = reader.readItemStack(); - changedSlots.put(slot, item); - } - this.item = reader.readItemStack(); + public ClientClickWindowPacket(BinaryReader reader) { + this(reader.readByte(), reader.readVarInt(), + reader.readShort(), reader.readByte(), ClickType.values()[reader.readVarInt()], + reader.readVarIntList(ChangedSlot::new), reader.readItemStack()); } @Override @@ -43,13 +30,20 @@ public class ClientClickWindowPacket extends ClientPlayPacket { writer.writeShort(slot); writer.writeByte(button); writer.writeVarInt(clickType.ordinal()); + writer.writeVarIntList(changedSlots, BinaryWriter::write); + writer.writeItemStack(clickedItem); + } - writer.writeVarInt(changedSlots.size()); - changedSlots.forEach((slot, itemStack) -> { + public record ChangedSlot(short slot, @NotNull ItemStack item) implements Writeable { + public ChangedSlot(BinaryReader reader) { + this(reader.readShort(), reader.readItemStack()); + } + + @Override + public void write(@NotNull BinaryWriter writer) { writer.writeShort(slot); - writer.writeItemStack(itemStack); - }); - writer.writeItemStack(item); + writer.writeItemStack(item); + } } public enum ClickType { diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientCloseWindowPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientCloseWindowPacket.java index c0bb899a1..2c4071162 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientCloseWindowPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientCloseWindowPacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientCloseWindowPacket extends ClientPlayPacket { - - public byte windowId; - - @Override - public void read(@NotNull BinaryReader reader) { - this.windowId = reader.readByte(); +public record ClientCloseWindowPacket(byte windowId) implements ClientPacket { + public ClientCloseWindowPacket(BinaryReader reader) { + this(reader.readByte()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientCraftRecipeRequest.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientCraftRecipeRequest.java index cb0ce7a22..5e02579d3 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientCraftRecipeRequest.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientCraftRecipeRequest.java @@ -1,29 +1,24 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 record ClientCraftRecipeRequest(byte windowId, String recipe, boolean makeAll) implements ClientPacket { + public ClientCraftRecipeRequest { + if (recipe.length() > 256) { + throw new IllegalArgumentException("'recipe' cannot be longer than 256 characters."); + } + } - public byte windowId; - public String recipe = ""; - public boolean makeAll; - - @Override - public void read(@NotNull BinaryReader reader) { - this.windowId = reader.readByte(); - this.recipe = reader.readSizedString(256); - this.makeAll = reader.readBoolean(); + public ClientCraftRecipeRequest(BinaryReader reader) { + this(reader.readByte(), reader.readSizedString(256), 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); } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientCreativeInventoryActionPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientCreativeInventoryActionPacket.java index 2cf718f2f..5296f24f6 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientCreativeInventoryActionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientCreativeInventoryActionPacket.java @@ -1,20 +1,14 @@ 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.network.packet.client.ClientPacket; 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 = ItemStack.AIR; - - @Override - public void read(@NotNull BinaryReader reader) { - this.slot = reader.readShort(); - this.item = reader.readItemStack(); +public record ClientCreativeInventoryActionPacket(short slot, @NotNull ItemStack item) implements ClientPacket { + public ClientCreativeInventoryActionPacket(BinaryReader reader) { + this(reader.readShort(), reader.readItemStack()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientEditBookPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientEditBookPacket.java index c19c4450a..ca8f298eb 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientEditBookPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientEditBookPacket.java @@ -1,45 +1,29 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 ClientEditBookPacket extends ClientPlayPacket { +import java.util.List; - public int slot; - public String[] pages; - public String title; - - public ClientEditBookPacket(int slot, String[] pages, String title) { - this.slot = slot; - this.pages = pages; - this.title = title; +public record ClientEditBookPacket(int slot, @NotNull List pages, + @Nullable String title) implements ClientPacket { + public ClientEditBookPacket { + pages = List.copyOf(pages); } - public ClientEditBookPacket() { - this(0, null, ""); - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.slot = reader.readVarInt(); - final int pageLength = reader.readVarInt(); - this.pages = new String[pageLength]; - for (int i = 0; i < pageLength; i++) { - pages[i] = reader.readSizedString(8192); - } - this.title = reader.readBoolean() ? reader.readSizedString(128) : null; + public ClientEditBookPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarIntList(BinaryReader::readSizedString), + reader.readBoolean() ? reader.readSizedString(128) : null); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(slot); - writer.writeStringArray(pages); - final boolean hasTitle = title != null; - writer.writeBoolean(hasTitle); - if (hasTitle) { - writer.writeSizedString(title); - } + writer.writeVarIntList(pages, BinaryWriter::writeSizedString); + writer.writeBoolean(title != null); + if (title != null) writer.writeSizedString(title); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientEntityActionPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientEntityActionPacket.java index 7c251b342..7da634ec0 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientEntityActionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientEntityActionPacket.java @@ -1,21 +1,15 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 = Action.START_SNEAKING; - public int horseJumpBoost; - - @Override - public void read(@NotNull BinaryReader reader) { - this.playerId = reader.readVarInt(); - this.action = Action.values()[reader.readVarInt()]; - this.horseJumpBoost = reader.readVarInt(); +public record ClientEntityActionPacket(int playerId, @NotNull Action action, + int horseJumpBoost) implements ClientPacket { + public ClientEntityActionPacket(BinaryReader reader) { + this(reader.readVarInt(), Action.values()[reader.readVarInt()], + reader.readVarInt()); } @Override @@ -36,5 +30,4 @@ public class ClientEntityActionPacket extends ClientPlayPacket { OPEN_HORSE_INVENTORY, START_FLYING_ELYTRA } - } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientGenerateStructurePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientGenerateStructurePacket.java index 67add65de..4ecf8bddd 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientGenerateStructurePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientGenerateStructurePacket.java @@ -1,23 +1,15 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.coordinate.Point; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; -public class ClientGenerateStructurePacket extends ClientPlayPacket { - - public Point blockPosition = Vec.ZERO; - public int level; - public boolean keepJigsaws; - - @Override - public void read(@NotNull BinaryReader reader) { - this.blockPosition = reader.readBlockPosition(); - this.level = reader.readVarInt(); - this.keepJigsaws = reader.readBoolean(); +public record ClientGenerateStructurePacket(@NotNull Point blockPosition, + int level, boolean keepJigsaws) implements ClientPacket { + public ClientGenerateStructurePacket(BinaryReader reader) { + this(reader.readBlockPosition(), reader.readVarInt(), reader.readBoolean()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientHeldItemChangePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientHeldItemChangePacket.java index ea6f4fab9..e2d1239dd 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientHeldItemChangePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientHeldItemChangePacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientHeldItemChangePacket extends ClientPlayPacket { - - public short slot; - - @Override - public void read(@NotNull BinaryReader reader) { - this.slot = reader.readShort(); +public record ClientHeldItemChangePacket(short slot) implements ClientPacket { + public ClientHeldItemChangePacket(BinaryReader reader) { + this(reader.readShort()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientInteractEntityPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientInteractEntityPacket.java index 752c7814c..9c87c876d 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientInteractEntityPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientInteractEntityPacket.java @@ -1,66 +1,81 @@ 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.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; +import net.minestom.server.utils.binary.Writeable; import org.jetbrains.annotations.NotNull; -public class ClientInteractEntityPacket extends ClientPlayPacket { - - public int targetId; - public Type type = Type.INTERACT; - public float x; - public float y; - public float z; - public Player.Hand hand = Player.Hand.MAIN; - public boolean sneaking; - - @Override - public void read(@NotNull BinaryReader reader) { - this.targetId = reader.readVarInt(); - this.type = Type.values()[reader.readVarInt()]; - - switch (type) { - case INTERACT: - this.hand = Player.Hand.values()[reader.readVarInt()]; - break; - case ATTACK: - break; - case INTERACT_AT: - this.x = reader.readFloat(); - this.y = reader.readFloat(); - this.z = reader.readFloat(); - this.hand = Player.Hand.values()[reader.readVarInt()]; - break; - } - this.sneaking = reader.readBoolean(); +public record ClientInteractEntityPacket(int targetId, @NotNull Type type, boolean sneaking) implements ClientPacket { + public ClientInteractEntityPacket(BinaryReader reader) { + this(reader.readVarInt(), switch (reader.readVarInt()) { + case 0 -> new Interact(reader); + case 1 -> new Attack(); + case 2 -> new InteractAt(reader); + default -> throw new RuntimeException("Unknown action id"); + }, 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.writeVarInt(type.id()); + writer.write(type); writer.writeBoolean(sneaking); } - public enum Type { - INTERACT, - ATTACK, - INTERACT_AT + public sealed interface Type extends Writeable + permits Interact, Attack, InteractAt { + int id(); + } + + public record Interact(@NotNull Player.Hand hand) implements Type { + public Interact(BinaryReader reader) { + this(Player.Hand.values()[reader.readVarInt()]); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeVarInt(hand.ordinal()); + } + + @Override + public int id() { + return 0; + } + } + + public record Attack() implements Type { + @Override + public void write(@NotNull BinaryWriter writer) { + // Empty + } + + @Override + public int id() { + return 1; + } + } + + public record InteractAt(float targetX, float targetY, float targetZ, + Player.Hand hand) implements Type { + public InteractAt(BinaryReader reader) { + this(reader.readFloat(), reader.readFloat(), reader.readFloat(), + Player.Hand.values()[reader.readVarInt()]); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeFloat(targetX); + writer.writeFloat(targetY); + writer.writeFloat(targetZ); + writer.writeVarInt(hand.ordinal()); + } + + @Override + public int id() { + return 2; + } } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientKeepAlivePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientKeepAlivePacket.java index a22cf834a..54cd95326 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientKeepAlivePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientKeepAlivePacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientKeepAlivePacket extends ClientPlayPacket { - - public long id; - - @Override - public void read(@NotNull BinaryReader reader) { - this.id = reader.readLong(); +public record ClientKeepAlivePacket(long id) implements ClientPacket { + public ClientKeepAlivePacket(BinaryReader reader) { + this(reader.readLong()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientNameItemPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientNameItemPacket.java index 664b12433..50f66d959 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientNameItemPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientNameItemPacket.java @@ -1,24 +1,23 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 record ClientNameItemPacket(@NotNull String itemName) implements ClientPacket { + public ClientNameItemPacket { + if (itemName.length() > Short.MAX_VALUE) { + throw new IllegalArgumentException("ItemStack name cannot be longer than Short.MAX_VALUE characters!"); + } + } - public String itemName = ""; - - @Override - public void read(@NotNull BinaryReader reader) { - this.itemName = reader.readSizedString(Short.MAX_VALUE); + public ClientNameItemPacket(BinaryReader reader) { + this(reader.readSizedString(Short.MAX_VALUE)); } @Override public void write(@NotNull BinaryWriter writer) { - if(itemName.length() > Short.MAX_VALUE) { - throw new IllegalArgumentException("ItemStack name cannot be longer than Short.MAX_VALUE characters!"); - } writer.writeSizedString(itemName); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPickItemPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPickItemPacket.java index 4c32370d0..702156c9a 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPickItemPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPickItemPacket.java @@ -1,21 +1,17 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientPickItemPacket extends ClientPlayPacket { - - public int slotToUse; - - @Override - public void read(@NotNull BinaryReader reader) { - this.slotToUse = reader.readVarInt(); +public record ClientPickItemPacket(int slot) implements ClientPacket { + public ClientPickItemPacket(BinaryReader reader) { + this(reader.readVarInt()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeVarInt(slotToUse); + writer.writeVarInt(slot); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerAbilitiesPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerAbilitiesPacket.java index 0fec1a32b..014fad3a9 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerAbilitiesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerAbilitiesPacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientPlayerAbilitiesPacket extends ClientPlayPacket { - - public byte flags; - - @Override - public void read(@NotNull BinaryReader reader) { - this.flags = reader.readByte(); +public record ClientPlayerAbilitiesPacket(byte flags) implements ClientPacket { + public ClientPlayerAbilitiesPacket(BinaryReader reader) { + this(reader.readByte()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerBlockPlacementPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerBlockPlacementPacket.java index 91581be44..6f3b1b8f6 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerBlockPlacementPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerBlockPlacementPacket.java @@ -1,31 +1,22 @@ package net.minestom.server.network.packet.client.play; +import net.minestom.server.coordinate.Point; import net.minestom.server.entity.Player; import net.minestom.server.instance.block.BlockFace; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; -public class ClientPlayerBlockPlacementPacket extends ClientPlayPacket { - - public Player.Hand hand = Player.Hand.MAIN; - public Point blockPosition = Vec.ZERO; - public BlockFace blockFace = BlockFace.TOP; - public float cursorPositionX, cursorPositionY, cursorPositionZ; - public boolean insideBlock; - - @Override - public void read(@NotNull BinaryReader reader) { - this.hand = Player.Hand.values()[reader.readVarInt()]; - this.blockPosition = reader.readBlockPosition(); - this.blockFace = BlockFace.values()[reader.readVarInt()]; - this.cursorPositionX = reader.readFloat(); - this.cursorPositionY = reader.readFloat(); - this.cursorPositionZ = reader.readFloat(); - this.insideBlock = reader.readBoolean(); +public record ClientPlayerBlockPlacementPacket(@NotNull Player.Hand hand, @NotNull Point blockPosition, + @NotNull BlockFace blockFace, + float cursorPositionX, float cursorPositionY, float cursorPositionZ, + boolean insideBlock) implements ClientPacket { + public ClientPlayerBlockPlacementPacket(BinaryReader reader) { + this(Player.Hand.values()[reader.readVarInt()], reader.readBlockPosition(), + BlockFace.values()[reader.readVarInt()], + reader.readFloat(), reader.readFloat(), reader.readFloat(), + reader.readBoolean()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerDiggingPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerDiggingPacket.java index 88edf7bfc..189604a07 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerDiggingPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerDiggingPacket.java @@ -1,24 +1,17 @@ package net.minestom.server.network.packet.client.play; +import net.minestom.server.coordinate.Point; import net.minestom.server.instance.block.BlockFace; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; -public class ClientPlayerDiggingPacket extends ClientPlayPacket { - - public Status status = Status.SWAP_ITEM_HAND; - public Point blockPosition = Vec.ZERO; - public BlockFace blockFace = BlockFace.TOP; - - @Override - public void read(@NotNull BinaryReader reader) { - this.status = Status.values()[reader.readVarInt()]; - this.blockPosition = reader.readBlockPosition(); - this.blockFace = BlockFace.values()[reader.readByte()]; +public record ClientPlayerDiggingPacket(@NotNull Status status, @NotNull Point blockPosition, + @NotNull BlockFace blockFace) implements ClientPacket { + public ClientPlayerDiggingPacket(BinaryReader reader) { + this(Status.values()[reader.readVarInt()], reader.readBlockPosition(), + BlockFace.values()[reader.readByte()]); } @Override @@ -37,5 +30,4 @@ public class ClientPlayerDiggingPacket extends ClientPlayPacket { UPDATE_ITEM_STATE, SWAP_ITEM_HAND } - } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPacket.java index 4aa5de700..c495c9dbc 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientPlayerPacket extends ClientPlayPacket { - - public boolean onGround; - - @Override - public void read(@NotNull BinaryReader reader) { - this.onGround = reader.readBoolean(); +public record ClientPlayerPacket(boolean onGround) implements ClientPacket { + public ClientPlayerPacket(BinaryReader reader) { + this(reader.readBoolean()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPositionAndRotationPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPositionAndRotationPacket.java index 07b05e92f..12759e5de 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPositionAndRotationPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPositionAndRotationPacket.java @@ -1,37 +1,25 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientPlayerPositionAndRotationPacket extends ClientPlayPacket { - - public double x, y, z; - public float yaw, pitch; - public boolean onGround; - - @Override - public void read(@NotNull BinaryReader reader) { - this.x = reader.readDouble(); - this.y = reader.readDouble(); - this.z = reader.readDouble(); - - this.yaw = reader.readFloat(); - this.pitch = reader.readFloat(); - - this.onGround = reader.readBoolean(); +public record ClientPlayerPositionAndRotationPacket(@NotNull Pos position, + boolean onGround) implements ClientPacket { + public ClientPlayerPositionAndRotationPacket(BinaryReader reader) { + this(new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), + reader.readFloat(), reader.readFloat()), 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.writeDouble(position.x()); + writer.writeDouble(position.y()); + writer.writeDouble(position.z()); + writer.writeFloat(position.yaw()); + writer.writeFloat(position.pitch()); writer.writeBoolean(onGround); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPositionPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPositionPacket.java index 8141c3fe7..1e1197ff7 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPositionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerPositionPacket.java @@ -1,30 +1,24 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.coordinate.Point; +import net.minestom.server.coordinate.Vec; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientPlayerPositionPacket extends ClientPlayPacket { - - public double x, y, z; - public boolean onGround; - - @Override - public void read(@NotNull BinaryReader reader) { - this.x = reader.readDouble(); - this.y = reader.readDouble(); - this.z = reader.readDouble(); - - this.onGround = reader.readBoolean(); +public record ClientPlayerPositionPacket(@NotNull Point position, + boolean onGround) implements ClientPacket { + public ClientPlayerPositionPacket(BinaryReader reader) { + this(new Vec(reader.readDouble(), reader.readDouble(), reader.readDouble()), + reader.readBoolean()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeDouble(x); - writer.writeDouble(y); - writer.writeDouble(z); - + writer.writeDouble(position.x()); + writer.writeDouble(position.y()); + writer.writeDouble(position.z()); writer.writeBoolean(onGround); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerRotationPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerRotationPacket.java index 476e48b99..5e90b17a2 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerRotationPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPlayerRotationPacket.java @@ -1,20 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientPlayerRotationPacket extends ClientPlayPacket { - - public float yaw, pitch; - public boolean onGround; - - @Override - public void read(@NotNull BinaryReader reader) { - this.yaw = reader.readFloat(); - this.pitch = reader.readFloat(); - this.onGround = reader.readBoolean(); +public record ClientPlayerRotationPacket(float yaw, float pitch, boolean onGround) implements ClientPacket { + public ClientPlayerRotationPacket(BinaryReader reader) { + this(reader.readFloat(), reader.readFloat(), reader.readBoolean()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPluginMessagePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPluginMessagePacket.java index 53fb5fd43..98dde8bad 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPluginMessagePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPluginMessagePacket.java @@ -1,25 +1,22 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 record ClientPluginMessagePacket(@NotNull String channel, byte[] data) implements ClientPacket { + public ClientPluginMessagePacket { + if (channel.length() > 256) + throw new IllegalArgumentException("Channel cannot be more than 256 characters long"); + } - public String channel = ""; - public byte[] data = new byte[0]; - - @Override - public void read(@NotNull BinaryReader reader) { - this.channel = reader.readSizedString(256); - this.data = reader.readRemainingBytes(); + public ClientPluginMessagePacket(BinaryReader reader) { + this(reader.readSizedString(256), 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); } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPongPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPongPacket.java index 67eaffa79..9198bb708 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPongPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPongPacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientPongPacket extends ClientPlayPacket { - - public int id; - - @Override - public void read(@NotNull BinaryReader reader) { - this.id = reader.readInt(); +public record ClientPongPacket(int id) implements ClientPacket { + public ClientPongPacket(BinaryReader reader) { + this(reader.readInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientQueryBlockNbtPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientQueryBlockNbtPacket.java index f0a7bf897..37abbb140 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientQueryBlockNbtPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientQueryBlockNbtPacket.java @@ -1,21 +1,14 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.coordinate.Point; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; -public class ClientQueryBlockNbtPacket extends ClientPlayPacket { - - public int transactionId; - public Point blockPosition = Vec.ZERO; - - @Override - public void read(@NotNull BinaryReader reader) { - this.transactionId = reader.readVarInt(); - this.blockPosition = reader.readBlockPosition(); +public record ClientQueryBlockNbtPacket(int transactionId, @NotNull Point blockPosition) implements ClientPacket { + public ClientQueryBlockNbtPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readBlockPosition()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientQueryEntityNbtPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientQueryEntityNbtPacket.java index 767187895..c650f7207 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientQueryEntityNbtPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientQueryEntityNbtPacket.java @@ -1,19 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientQueryEntityNbtPacket extends ClientPlayPacket { - - public int transactionId; - public int entityId; - - @Override - public void read(@NotNull BinaryReader reader) { - this.transactionId = reader.readVarInt(); - this.entityId = reader.readVarInt(); +public record ClientQueryEntityNbtPacket(int transactionId, int entityId) implements ClientPacket { + public ClientQueryEntityNbtPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientResourcePackStatusPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientResourcePackStatusPacket.java index 046d33ef6..49bcccd7e 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientResourcePackStatusPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientResourcePackStatusPacket.java @@ -1,22 +1,18 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 = ResourcePackStatus.SUCCESS; - - @Override - public void read(@NotNull BinaryReader reader) { - this.result = ResourcePackStatus.values()[reader.readVarInt()]; +public record ClientResourcePackStatusPacket(@NotNull ResourcePackStatus status) implements ClientPacket { + public ClientResourcePackStatusPacket(BinaryReader reader) { + this(ResourcePackStatus.values()[reader.readVarInt()]); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeVarInt(result.ordinal()); + writer.writeVarInt(status.ordinal()); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSelectTradePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSelectTradePacket.java index e6f3a327f..6c99fa530 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSelectTradePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSelectTradePacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientSelectTradePacket extends ClientPlayPacket { - - public int selectedSlot; - - @Override - public void read(@NotNull BinaryReader reader) { - this.selectedSlot = reader.readVarInt(); +public record ClientSelectTradePacket(int selectedSlot) implements ClientPacket { + public ClientSelectTradePacket(BinaryReader reader) { + this(reader.readVarInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSetBeaconEffectPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSetBeaconEffectPacket.java index dc1573c8e..0b0424437 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSetBeaconEffectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSetBeaconEffectPacket.java @@ -1,19 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientSetBeaconEffectPacket extends ClientPlayPacket { - - public int primaryEffect; - public int secondaryEffect; - - @Override - public void read(@NotNull BinaryReader reader) { - this.primaryEffect = reader.readVarInt(); - this.secondaryEffect = reader.readVarInt(); +public record ClientSetBeaconEffectPacket(int primaryEffect, int secondaryEffect) implements ClientPacket { + public ClientSetBeaconEffectPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSetDisplayedRecipePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSetDisplayedRecipePacket.java index 860a58078..827496ae8 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSetDisplayedRecipePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSetDisplayedRecipePacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientSetDisplayedRecipePacket extends ClientPlayPacket { - - public String recipeId = ""; - - @Override - public void read(@NotNull BinaryReader reader) { - this.recipeId = reader.readSizedString(256); +public record ClientSetDisplayedRecipePacket(@NotNull String recipeId) implements ClientPacket { + public ClientSetDisplayedRecipePacket(BinaryReader reader) { + this(reader.readSizedString(256)); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSetRecipeBookStatePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSetRecipeBookStatePacket.java index 17a1e9e64..e1ccc84ea 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSetRecipeBookStatePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSetRecipeBookStatePacket.java @@ -1,26 +1,19 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientSetRecipeBookStatePacket extends ClientPlayPacket { - - public BookType type = BookType.CRAFTING; - public boolean bookOpen; - public boolean filterActive; - - @Override - public void read(@NotNull BinaryReader reader) { - this.type = BookType.values()[reader.readVarInt()]; - this.bookOpen = reader.readBoolean(); - this.filterActive = reader.readBoolean(); +public record ClientSetRecipeBookStatePacket(@NotNull BookType bookType, + boolean bookOpen, boolean filterActive) implements ClientPacket { + public ClientSetRecipeBookStatePacket(BinaryReader reader) { + this(BookType.values()[reader.readVarInt()], reader.readBoolean(), reader.readBoolean()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeVarInt(type.ordinal()); + writer.writeVarInt(bookType.ordinal()); writer.writeBoolean(bookOpen); writer.writeBoolean(filterActive); } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSettingsPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSettingsPacket.java index 2f64c8893..9f0975800 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSettingsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSettingsPacket.java @@ -2,32 +2,20 @@ package net.minestom.server.network.packet.client.play; import net.minestom.server.entity.Player; import net.minestom.server.message.ChatMessageType; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 byte viewDistance; - public ChatMessageType chatMessageType = ChatMessageType.FULL; - public boolean chatColors; - public byte displayedSkinParts; - public Player.MainHand mainHand = Player.MainHand.RIGHT; - public boolean disableTextFiltering; - public boolean allowsListing; - - @Override - public void read(@NotNull BinaryReader reader) { - this.locale = reader.readSizedString(128); - this.viewDistance = reader.readByte(); - this.chatMessageType = ChatMessageType.fromPacketID(reader.readVarInt()); - this.chatColors = reader.readBoolean(); - this.displayedSkinParts = reader.readByte(); - this.mainHand = Player.MainHand.values()[reader.readVarInt()]; - this.disableTextFiltering = reader.readBoolean(); - this.allowsListing = reader.readBoolean(); +public record ClientSettingsPacket(@NotNull String locale, byte viewDistance, + @NotNull ChatMessageType chatMessageType, boolean chatColors, + byte displayedSkinParts, @NotNull Player.MainHand mainHand, + boolean disableTextFiltering, boolean allowsListing) implements ClientPacket { + public ClientSettingsPacket(BinaryReader reader) { + this(reader.readSizedString(128), reader.readByte(), + ChatMessageType.fromPacketID(reader.readVarInt()), reader.readBoolean(), + reader.readByte(), Player.MainHand.values()[reader.readVarInt()], + reader.readBoolean(), reader.readBoolean()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSpectatePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSpectatePacket.java index a29fb1060..e2fc5e08e 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSpectatePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSpectatePacket.java @@ -1,23 +1,19 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 = new UUID(0,0); - - @Override - public void read(@NotNull BinaryReader reader) { - this.targetUuid = reader.readUuid(); +public record ClientSpectatePacket(@NotNull UUID target) implements ClientPacket { + public ClientSpectatePacket(BinaryReader reader) { + this(reader.readUuid()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeUuid(targetUuid); + writer.writeUuid(target); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientStatusPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientStatusPacket.java index 6327b4271..57640b449 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientStatusPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientStatusPacket.java @@ -1,21 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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()]; +public record ClientStatusPacket(@NotNull Action action) implements ClientPacket { + public ClientStatusPacket(BinaryReader reader) { + this(Action.values()[reader.readVarInt()]); } @Override @@ -27,5 +19,4 @@ public class ClientStatusPacket extends ClientPlayPacket { PERFORM_RESPAWN, REQUEST_STATS } - } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSteerBoatPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSteerBoatPacket.java index 1c7d3ff2e..d7343c953 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSteerBoatPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSteerBoatPacket.java @@ -1,19 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientSteerBoatPacket extends ClientPlayPacket { - - public boolean leftPaddleTurning; - public boolean rightPaddleTurning; - - @Override - public void read(@NotNull BinaryReader reader) { - this.leftPaddleTurning = reader.readBoolean(); - this.rightPaddleTurning = reader.readBoolean(); +public record ClientSteerBoatPacket(boolean leftPaddleTurning, boolean rightPaddleTurning) implements ClientPacket { + public ClientSteerBoatPacket(BinaryReader reader) { + this(reader.readBoolean(), reader.readBoolean()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSteerVehiclePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSteerVehiclePacket.java index a14c6be53..609819dcf 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSteerVehiclePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSteerVehiclePacket.java @@ -1,21 +1,14 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientSteerVehiclePacket extends ClientPlayPacket { - - public float sideways; - public float forward; - public byte flags; - - @Override - public void read(@NotNull BinaryReader reader) { - this.sideways = reader.readFloat(); - this.forward = reader.readFloat(); - this.flags = reader.readByte(); +public record ClientSteerVehiclePacket(float sideways, float forward, + byte flags) implements ClientPacket { + public ClientSteerVehiclePacket(BinaryReader reader) { + this(reader.readFloat(), reader.readFloat(), reader.readByte()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientTabCompletePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientTabCompletePacket.java index 53388fc29..e1089b6b5 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientTabCompletePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientTabCompletePacket.java @@ -1,19 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 = ""; - - @Override - public void read(@NotNull BinaryReader reader) { - this.transactionId = reader.readVarInt(); - this.text = reader.readSizedString(Short.MAX_VALUE); +public record ClientTabCompletePacket(int transactionId, @NotNull String text) implements ClientPacket { + public ClientTabCompletePacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readSizedString(Short.MAX_VALUE)); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientTeleportConfirmPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientTeleportConfirmPacket.java index d070880cf..234908526 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientTeleportConfirmPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientTeleportConfirmPacket.java @@ -1,17 +1,13 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientTeleportConfirmPacket extends ClientPlayPacket { - - public int teleportId; - - @Override - public void read(@NotNull BinaryReader reader) { - this.teleportId = reader.readVarInt(); +public record ClientTeleportConfirmPacket(int teleportId) implements ClientPacket { + public ClientTeleportConfirmPacket(BinaryReader reader) { + this(reader.readVarInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java index 930831415..f084c22da 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java @@ -1,21 +1,14 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; 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 boolean trackOutput; - - @Override - public void read(@NotNull BinaryReader reader) { - this.entityId = reader.readVarInt(); - this.command = reader.readSizedString(Short.MAX_VALUE); - this.trackOutput = reader.readBoolean(); +public record ClientUpdateCommandBlockMinecartPacket(int entityId, @NotNull String command, + boolean trackOutput) implements ClientPacket { + public ClientUpdateCommandBlockMinecartPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readSizedString(Short.MAX_VALUE), reader.readBoolean()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockPacket.java index 7f581516b..096769d1c 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockPacket.java @@ -1,31 +1,16 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.coordinate.Point; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; -public class ClientUpdateCommandBlockPacket extends ClientPlayPacket { - - public Point blockPosition; - public String command; - public Mode mode; - public byte flags; - - public ClientUpdateCommandBlockPacket() { - blockPosition = Vec.ZERO; - command = ""; - mode = Mode.REDSTONE; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.blockPosition = reader.readBlockPosition(); - this.command = reader.readSizedString(Short.MAX_VALUE); - this.mode = Mode.values()[reader.readVarInt()]; - this.flags = reader.readByte(); +public record ClientUpdateCommandBlockPacket(@NotNull Point blockPosition, @NotNull String command, + @NotNull Mode mode, byte flags) implements ClientPacket { + public ClientUpdateCommandBlockPacket(BinaryReader reader) { + this(reader.readBlockPosition(), reader.readSizedString(Short.MAX_VALUE), + Mode.values()[reader.readVarInt()], reader.readByte()); } @Override @@ -39,5 +24,4 @@ public class ClientUpdateCommandBlockPacket extends ClientPlayPacket { public enum Mode { SEQUENCE, AUTO, REDSTONE } - } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateSignPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateSignPacket.java index 20f62a968..55c733924 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateSignPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateSignPacket.java @@ -1,43 +1,42 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.coordinate.Point; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; -public class ClientUpdateSignPacket extends ClientPlayPacket { +import java.util.List; - public Point blockPosition = Vec.ZERO; - public String line1 = ""; - public String line2 = ""; - public String line3 = ""; - public String line4 = ""; +public record ClientUpdateSignPacket(@NotNull Point blockPosition, + @NotNull List lines) implements ClientPacket { + public ClientUpdateSignPacket { + lines = List.copyOf(lines); + if (lines.size() != 4) { + throw new IllegalArgumentException("Signs must have 4 lines!"); + } + for (String line : lines) { + if (line.length() > 384) { + throw new IllegalArgumentException("Signs must have a maximum of 384 characters per line!"); + } + } + } - @Override - public void read(@NotNull BinaryReader reader) { - this.blockPosition = reader.readBlockPosition(); - this.line1 = reader.readSizedString(384); - this.line2 = reader.readSizedString(384); - this.line3 = reader.readSizedString(384); - this.line4 = reader.readSizedString(384); + public ClientUpdateSignPacket(BinaryReader reader) { + this(reader.readBlockPosition(), readLines(reader)); } @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); + writer.writeSizedString(lines.get(0)); + writer.writeSizedString(lines.get(1)); + writer.writeSizedString(lines.get(2)); + writer.writeSizedString(lines.get(3)); + } + + private static List readLines(BinaryReader reader) { + return List.of(reader.readSizedString(384), reader.readSizedString(384), + reader.readSizedString(384), reader.readSizedString(384)); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateStructureBlockPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateStructureBlockPacket.java index 7949a2c9c..d8a8366c0 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateStructureBlockPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateStructureBlockPacket.java @@ -2,13 +2,27 @@ package net.minestom.server.network.packet.client.play; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Vec; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.Rotation; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientUpdateStructureBlockPacket extends ClientPlayPacket { +public record ClientUpdateStructureBlockPacket(Point location, Action action, + Mode mode, String name, + Point offset, Point size, + Mirror mirror, Rotation rotation, + String metadata, float integrity, + long seed, byte flags) implements ClientPacket { + public ClientUpdateStructureBlockPacket(BinaryReader reader) { + this(reader.readBlockPosition(), Action.values()[reader.readVarInt()], + Mode.values()[reader.readVarInt()], reader.readSizedString(Short.MAX_VALUE), + new Vec(reader.readByte(), reader.readByte(), reader.readByte()), new Vec(reader.readByte(), reader.readByte(), reader.readByte()), + Mirror.values()[reader.readVarInt()], fromRestrictedRotation(reader.readVarInt()), + reader.readSizedString(Short.MAX_VALUE), reader.readFloat(), + reader.readVarLong(), reader.readByte()); + } + // Flag values public static final byte IGNORE_ENTITIES = 0x1; public static final byte SHOW_AIR = 0x2; @@ -17,19 +31,6 @@ public class ClientUpdateStructureBlockPacket extends ClientPlayPacket { */ public static final byte SHOW_BOUNDING_BOX = 0x4; - public Point location = Vec.ZERO; - public Action action = Action.UPDATE_DATA; - public Mode mode = Mode.DATA; - public String name = ""; - public Point offset = new Vec(0, 1, 0); - public Point size = Vec.ONE; - public Mirror mirror = Mirror.NONE; - public Rotation rotation = Rotation.NONE; - public String metadata = ""; - public float integrity = 1.0f; - public long seed = 0; - public byte flags = 0x0; - @Override public void write(@NotNull BinaryWriter writer) { writer.writeBlockPosition(location); @@ -50,30 +51,6 @@ public class ClientUpdateStructureBlockPacket extends ClientPlayPacket { writer.writeByte(flags); } - @Override - public void read(@NotNull BinaryReader reader) { - location = reader.readBlockPosition(); - action = Action.values()[reader.readVarInt()]; - mode = Mode.values()[reader.readVarInt()]; - name = reader.readSizedString(Short.MAX_VALUE); - offset = new Vec( - reader.readByte(), - reader.readByte(), - reader.readByte() - ); - size = new Vec( - reader.readByte(), - reader.readByte(), - reader.readByte() - ); - mirror = Mirror.values()[reader.readVarInt()]; - rotation = fromRestrictedRotation(reader.readVarInt()); - metadata = reader.readSizedString(Short.MAX_VALUE); - integrity = reader.readFloat(); - seed = reader.readVarLong(); - flags = reader.readByte(); - } - /** * Update action, UPDATE_DATA indicates nothing special. */ @@ -89,7 +66,7 @@ public class ClientUpdateStructureBlockPacket extends ClientPlayPacket { NONE, LEFT_RIGHT, FRONT_BACK } - private int toRestrictedRotation(Rotation rotation) { + private static int toRestrictedRotation(Rotation rotation) { return switch (rotation) { case NONE -> 0; case CLOCKWISE -> 1; @@ -99,7 +76,7 @@ public class ClientUpdateStructureBlockPacket extends ClientPlayPacket { }; } - private Rotation fromRestrictedRotation(int rotation) { + private static Rotation fromRestrictedRotation(int rotation) { return switch (rotation) { case 0 -> Rotation.NONE; case 1 -> Rotation.CLOCKWISE; diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientUseItemPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientUseItemPacket.java index 29781adbd..ed9798aff 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientUseItemPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientUseItemPacket.java @@ -1,18 +1,14 @@ 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.network.packet.client.ClientPacket; 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 = Player.Hand.MAIN; - - @Override - public void read(@NotNull BinaryReader reader) { - this.hand = Player.Hand.values()[reader.readVarInt()]; +public record ClientUseItemPacket(@NotNull Player.Hand hand) implements ClientPacket { + public ClientUseItemPacket(BinaryReader reader) { + this(Player.Hand.values()[reader.readVarInt()]); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientVehicleMovePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientVehicleMovePacket.java index 5378a493d..0c6901846 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientVehicleMovePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientVehicleMovePacket.java @@ -1,31 +1,23 @@ package net.minestom.server.network.packet.client.play; -import net.minestom.server.network.packet.client.ClientPlayPacket; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClientVehicleMovePacket extends ClientPlayPacket { - - public double x, y, z; - public float yaw, pitch; - - @Override - public void read(@NotNull BinaryReader reader) { - this.x = reader.readDouble(); - this.y = reader.readDouble(); - this.z = reader.readDouble(); - - this.yaw = reader.readFloat(); - this.pitch = reader.readFloat(); +public record ClientVehicleMovePacket(@NotNull Pos position) implements ClientPacket { + public ClientVehicleMovePacket(BinaryReader reader) { + this(new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), + reader.readFloat(), reader.readFloat())); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeDouble(x); - writer.writeDouble(y); - writer.writeDouble(z); - writer.writeFloat(yaw); - writer.writeFloat(pitch); + writer.writeDouble(position.x()); + writer.writeDouble(position.y()); + writer.writeDouble(position.z()); + writer.writeFloat(position.yaw()); + writer.writeFloat(position.pitch()); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/status/LegacyServerListPingPacket.java b/src/main/java/net/minestom/server/network/packet/client/status/LegacyServerListPingPacket.java index 86aa82da4..2ea6fd49b 100644 --- a/src/main/java/net/minestom/server/network/packet/client/status/LegacyServerListPingPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/status/LegacyServerListPingPacket.java @@ -6,20 +6,16 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class LegacyServerListPingPacket implements ClientPreplayPacket { - - private byte payload; +public record LegacyServerListPingPacket(byte payload) implements ClientPreplayPacket { + public LegacyServerListPingPacket(BinaryReader reader) { + this(reader.readByte()); + } @Override public void process(@NotNull PlayerConnection connection) { } - @Override - public void read(@NotNull BinaryReader reader) { - this.payload = reader.readByte(); - } - @Override public void write(@NotNull BinaryWriter writer) { writer.writeByte(payload); diff --git a/src/main/java/net/minestom/server/network/packet/client/status/PingPacket.java b/src/main/java/net/minestom/server/network/packet/client/status/PingPacket.java index 5e336a12f..7c4c42350 100644 --- a/src/main/java/net/minestom/server/network/packet/client/status/PingPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/status/PingPacket.java @@ -10,11 +10,9 @@ 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() { +public record PingPacket(long number) implements ClientPreplayPacket { + public PingPacket(BinaryReader reader) { + this(reader.readLong()); } @Override @@ -37,11 +35,6 @@ public class PingPacket implements ClientPreplayPacket { } } - @Override - public void read(@NotNull BinaryReader reader) { - this.number = reader.readLong(); - } - @Override public void write(@NotNull BinaryWriter writer) { writer.writeLong(number); diff --git a/src/main/java/net/minestom/server/network/packet/client/status/StatusRequestPacket.java b/src/main/java/net/minestom/server/network/packet/client/status/StatusRequestPacket.java index 87361e984..1f3130fae 100644 --- a/src/main/java/net/minestom/server/network/packet/client/status/StatusRequestPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/status/StatusRequestPacket.java @@ -10,7 +10,10 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class StatusRequestPacket implements ClientPreplayPacket { +public record StatusRequestPacket() implements ClientPreplayPacket { + public StatusRequestPacket(BinaryReader reader) { + this(); + } @Override public void process(@NotNull PlayerConnection connection) { @@ -20,11 +23,6 @@ public class StatusRequestPacket implements ClientPreplayPacket { connection.sendPacket(new ResponsePacket(pingVersion.getPingResponse(statusRequestEvent.getResponseData())))); } - @Override - public void read(@NotNull BinaryReader reader) { - // Empty - } - @Override public void write(@NotNull BinaryWriter writer) { // Empty diff --git a/src/main/java/net/minestom/server/network/packet/server/ServerPacket.java b/src/main/java/net/minestom/server/network/packet/server/ServerPacket.java index bf3904282..205f5a12d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/ServerPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/ServerPacket.java @@ -1,21 +1,12 @@ package net.minestom.server.network.packet.server; import net.minestom.server.network.player.PlayerConnection; -import net.minestom.server.utils.binary.BinaryReader; -import net.minestom.server.utils.binary.Readable; import net.minestom.server.utils.binary.Writeable; -import org.jetbrains.annotations.NotNull; /** * Represents a packet which can be sent to a player using {@link PlayerConnection#sendPacket(SendablePacket)}. */ -public non-sealed interface ServerPacket extends Readable, Writeable, SendablePacket { - - @Override - default void read(@NotNull BinaryReader reader) { - // FIXME: remove when all packets are written and read properly - throw new UnsupportedOperationException("WIP: This packet is not set up to be read from Minestom code at the moment."); - } +public non-sealed interface ServerPacket extends Writeable, SendablePacket { /** * Gets the id of this packet. @@ -25,5 +16,4 @@ public non-sealed interface ServerPacket extends Readable, Writeable, SendablePa * @return the id of this packet */ int getId(); - } diff --git a/src/main/java/net/minestom/server/network/packet/server/handshake/ResponsePacket.java b/src/main/java/net/minestom/server/network/packet/server/handshake/ResponsePacket.java index 2f3869471..4b199afd5 100644 --- a/src/main/java/net/minestom/server/network/packet/server/handshake/ResponsePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/handshake/ResponsePacket.java @@ -5,16 +5,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ResponsePacket implements ServerPacket { - - public String jsonResponse; - - public ResponsePacket(String jsonResponse) { - this.jsonResponse = jsonResponse; - } - - public ResponsePacket() { - this(""); +public record ResponsePacket(@NotNull String jsonResponse) implements ServerPacket { + public ResponsePacket(BinaryReader reader) { + this(reader.readSizedString()); } @Override @@ -22,11 +15,6 @@ public class ResponsePacket implements ServerPacket { writer.writeSizedString(jsonResponse); } - @Override - public void read(@NotNull BinaryReader reader) { - jsonResponse = reader.readSizedString(); - } - @Override public int getId() { return 0x00; diff --git a/src/main/java/net/minestom/server/network/packet/server/login/EncryptionRequestPacket.java b/src/main/java/net/minestom/server/network/packet/server/login/EncryptionRequestPacket.java index 20b38349d..256b8aa5d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/login/EncryptionRequestPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/login/EncryptionRequestPacket.java @@ -1,48 +1,27 @@ package net.minestom.server.network.packet.server.login; -import net.minestom.server.data.type.array.ByteArrayData; -import net.minestom.server.extras.MojangAuth; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; -import net.minestom.server.network.player.PlayerSocketConnection; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -import java.util.concurrent.ThreadLocalRandom; - -public class EncryptionRequestPacket implements ServerPacket { - - public byte[] publicKey; - public byte[] nonce = new byte[4]; - - public EncryptionRequestPacket(PlayerSocketConnection connection) { - ThreadLocalRandom.current().nextBytes(nonce); - connection.setNonce(nonce); - } - - /** - * Only for testing purposes. DO NOT USE - */ - private EncryptionRequestPacket() { - MojangAuth.init(); - publicKey = new byte[0]; +public record EncryptionRequestPacket(@NotNull String serverId, + byte @NotNull [] publicKey, + byte @NotNull [] verifyToken) implements ServerPacket { + public EncryptionRequestPacket(BinaryReader reader) { + this(reader.readSizedString(), + reader.readBytes(reader.readVarInt()), + reader.readBytes(reader.readVarInt())); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeSizedString(""); - final byte[] publicKey = MojangAuth.getKeyPair().getPublic().getEncoded(); - ByteArrayData.encodeByteArray(writer, publicKey); - ByteArrayData.encodeByteArray(writer, nonce); - } - - @Override - public void read(@NotNull BinaryReader reader) { - reader.readSizedString(); // server id, apparently empty - - publicKey = ByteArrayData.decodeByteArray(reader); - nonce = ByteArrayData.decodeByteArray(reader); + writer.writeSizedString(serverId); + writer.writeVarInt(publicKey.length); + writer.writeBytes(publicKey); + writer.writeVarInt(verifyToken.length); + writer.writeBytes(verifyToken); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/login/LoginDisconnectPacket.java b/src/main/java/net/minestom/server/network/packet/server/login/LoginDisconnectPacket.java index c9737071a..285642d4b 100644 --- a/src/main/java/net/minestom/server/network/packet/server/login/LoginDisconnectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/login/LoginDisconnectPacket.java @@ -11,11 +11,9 @@ import java.util.Collection; import java.util.List; import java.util.function.UnaryOperator; -public class LoginDisconnectPacket implements ComponentHoldingServerPacket { - public Component kickMessage; - - private LoginDisconnectPacket() { - this(Component.text("This constructor should not be used, tell your server devs.")); +public record LoginDisconnectPacket(@NotNull Component kickMessage) implements ComponentHoldingServerPacket { + public LoginDisconnectPacket(BinaryReader reader) { + this(reader.readComponent()); } public LoginDisconnectPacket(@NotNull Component kickMessage) { @@ -27,11 +25,6 @@ public class LoginDisconnectPacket implements ComponentHoldingServerPacket { writer.writeComponent(kickMessage); } - @Override - public void read(@NotNull BinaryReader reader) { - kickMessage = reader.readComponent(); - } - @Override public int getId() { return ServerPacketIdentifier.LOGIN_DISCONNECT; diff --git a/src/main/java/net/minestom/server/network/packet/server/login/LoginPluginRequestPacket.java b/src/main/java/net/minestom/server/network/packet/server/login/LoginPluginRequestPacket.java index 5e9d355ed..e4ee1f2c8 100644 --- a/src/main/java/net/minestom/server/network/packet/server/login/LoginPluginRequestPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/login/LoginPluginRequestPacket.java @@ -5,12 +5,14 @@ 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 LoginPluginRequestPacket implements ServerPacket { - - public int messageId; - public String channel = "none"; - public byte[] data; +public record LoginPluginRequestPacket(int messageId, @NotNull String channel, + byte @Nullable [] data) implements ServerPacket { + public LoginPluginRequestPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readSizedString(), + reader.readRemainingBytes()); + } @Override public void write(@NotNull BinaryWriter writer) { @@ -21,13 +23,6 @@ public class LoginPluginRequestPacket implements ServerPacket { } } - @Override - public void read(@NotNull BinaryReader reader) { - messageId = reader.readVarInt(); - channel = reader.readSizedString(); - data = reader.readRemainingBytes(); - } - @Override public int getId() { return ServerPacketIdentifier.LOGIN_PLUGIN_REQUEST; diff --git a/src/main/java/net/minestom/server/network/packet/server/login/LoginSuccessPacket.java b/src/main/java/net/minestom/server/network/packet/server/login/LoginSuccessPacket.java index 501ba1168..7cf8c200f 100644 --- a/src/main/java/net/minestom/server/network/packet/server/login/LoginSuccessPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/login/LoginSuccessPacket.java @@ -8,21 +8,9 @@ import org.jetbrains.annotations.NotNull; import java.util.UUID; -public class LoginSuccessPacket implements ServerPacket { - - public UUID uuid; - public String username; - - /** - * DO NOT USE. - */ - private LoginSuccessPacket() { - this(new UUID(0, 0), ""); - } - - public LoginSuccessPacket(@NotNull UUID uuid, @NotNull String username) { - this.uuid = uuid; - this.username = username; +public record LoginSuccessPacket(@NotNull UUID uuid, @NotNull String username) implements ServerPacket { + public LoginSuccessPacket(BinaryReader reader) { + this(reader.readUuid(), reader.readSizedString()); } @Override @@ -31,12 +19,6 @@ public class LoginSuccessPacket implements ServerPacket { writer.writeSizedString(username); } - @Override - public void read(@NotNull BinaryReader reader) { - uuid = reader.readUuid(); - username = reader.readSizedString(); - } - @Override public int getId() { return ServerPacketIdentifier.LOGIN_SUCCESS; diff --git a/src/main/java/net/minestom/server/network/packet/server/login/SetCompressionPacket.java b/src/main/java/net/minestom/server/network/packet/server/login/SetCompressionPacket.java index a3229f7fc..4aca8785d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/login/SetCompressionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/login/SetCompressionPacket.java @@ -6,19 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class SetCompressionPacket implements ServerPacket { - - public int threshold; - - /** - * DO NOT USE - */ - private SetCompressionPacket() { - threshold = 256; - } - - public SetCompressionPacket(int threshold) { - this.threshold = threshold; +public record SetCompressionPacket(int threshold) implements ServerPacket { + public SetCompressionPacket(BinaryReader reader) { + this(reader.readVarInt()); } @Override @@ -26,11 +16,6 @@ public class SetCompressionPacket implements ServerPacket { writer.writeVarInt(threshold); } - @Override - public void read(@NotNull BinaryReader reader) { - threshold = reader.readVarInt(); - } - @Override public int getId() { return ServerPacketIdentifier.LOGIN_SET_COMPRESSION; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/AcknowledgePlayerDiggingPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/AcknowledgePlayerDiggingPacket.java index 5bb042046..ff31908b2 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/AcknowledgePlayerDiggingPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/AcknowledgePlayerDiggingPacket.java @@ -1,7 +1,6 @@ package net.minestom.server.network.packet.server.play; import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import net.minestom.server.instance.block.Block; import net.minestom.server.network.packet.client.play.ClientPlayerDiggingPacket; import net.minestom.server.network.packet.server.ServerPacket; @@ -10,28 +9,17 @@ 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 Point blockPosition; - public int blockStateId; - public ClientPlayerDiggingPacket.Status status; - public boolean successful; - - public AcknowledgePlayerDiggingPacket(@NotNull Point blockPosition, int blockStateId, - @NotNull ClientPlayerDiggingPacket.Status status, boolean success) { - this.blockPosition = blockPosition; - this.blockStateId = blockStateId; - this.status = status; - this.successful = success; - } - +public record AcknowledgePlayerDiggingPacket(@NotNull Point blockPosition, int blockStateId, + @NotNull ClientPlayerDiggingPacket.Status status, + boolean successful) implements ServerPacket { public AcknowledgePlayerDiggingPacket(@NotNull Point blockPosition, Block block, - @NotNull ClientPlayerDiggingPacket.Status status, boolean success) { - this(blockPosition, block.stateId(), status, success); + @NotNull ClientPlayerDiggingPacket.Status status, boolean successful) { + this(blockPosition, block.stateId(), status, successful); } - public AcknowledgePlayerDiggingPacket() { - this(Vec.ZERO, 0, ClientPlayerDiggingPacket.Status.STARTED_DIGGING, false); + public AcknowledgePlayerDiggingPacket(BinaryReader reader) { + this(reader.readBlockPosition(), reader.readVarInt(), + ClientPlayerDiggingPacket.Status.values()[reader.readVarInt()], reader.readBoolean()); } @Override @@ -42,14 +30,6 @@ public class AcknowledgePlayerDiggingPacket implements ServerPacket { writer.writeBoolean(successful); } - @Override - public void read(@NotNull BinaryReader reader) { - this.blockPosition = reader.readBlockPosition(); - this.blockStateId = reader.readVarInt(); - this.status = ClientPlayerDiggingPacket.Status.values()[reader.readVarInt()]; - this.successful = reader.readBoolean(); - } - @Override public int getId() { return ServerPacketIdentifier.ACKNOWLEDGE_PLAYER_DIGGING; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ActionBarPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ActionBarPacket.java index 8c12cc9e6..786749a3f 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ActionBarPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ActionBarPacket.java @@ -7,26 +7,14 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ActionBarPacket implements ServerPacket { - - public Component actionBarText; - - public ActionBarPacket(@NotNull Component actionBarText) { - this.actionBarText = actionBarText; - } - - public ActionBarPacket() { - this(Component.empty()); - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.actionBarText = reader.readComponent(); +public record ActionBarPacket(@NotNull Component text) implements ServerPacket { + public ActionBarPacket(BinaryReader reader) { + this(reader.readComponent()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeComponent(actionBarText); + writer.writeComponent(text); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java index 1d85fd22a..0f9cb3bf2 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/AdvancementsPacket.java @@ -3,66 +3,37 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.text.Component; import net.minestom.server.advancements.FrameType; 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; +import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.List; -import java.util.function.UnaryOperator; -public class AdvancementsPacket implements ComponentHoldingServerPacket { +public record AdvancementsPacket(boolean reset, @NotNull List advancementMappings, + @NotNull List identifiersToRemove, + @NotNull List progressMappings) implements ServerPacket { + public AdvancementsPacket { + advancementMappings = List.copyOf(advancementMappings); + identifiersToRemove = List.copyOf(identifiersToRemove); + progressMappings = List.copyOf(progressMappings); + } - public boolean resetAdvancements; - public AdvancementMapping[] advancementMappings = new AdvancementMapping[0]; - public String[] identifiersToRemove = new String[0]; - public ProgressMapping[] progressMappings = new ProgressMapping[0]; - - public AdvancementsPacket() { + public AdvancementsPacket(BinaryReader reader) { + this(reader.readBoolean(), reader.readVarIntList(AdvancementMapping::new), + reader.readVarIntList(BinaryReader::readSizedString), + reader.readVarIntList(ProgressMapping::new)); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeBoolean(resetAdvancements); - - writer.writeVarInt(advancementMappings.length); - for (AdvancementMapping advancementMapping : advancementMappings) { - advancementMapping.write(writer); - } - writer.writeStringArray(identifiersToRemove); - - writer.writeVarInt(progressMappings.length); - for (ProgressMapping progressMapping : progressMappings) { - progressMapping.write(writer); - } - } - - @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); - } + writer.writeBoolean(reset); + writer.writeVarIntList(advancementMappings, BinaryWriter::write); + writer.writeVarIntList(identifiersToRemove, BinaryWriter::writeSizedString); + writer.writeVarIntList(progressMappings, BinaryWriter::write); } @Override @@ -70,120 +41,73 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket { return ServerPacketIdentifier.ADVANCEMENTS; } - @Override - public @NotNull Collection components() { - List components = new ArrayList<>(); - for (AdvancementMapping advancementMapping : advancementMappings) { - components.add(advancementMapping.value.displayData.title); - components.add(advancementMapping.value.displayData.description); - } - return components; - } - - @Override - public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { - AdvancementsPacket packet = new AdvancementsPacket(); - packet.resetAdvancements = this.resetAdvancements; - packet.advancementMappings = Arrays.copyOf(this.advancementMappings, this.advancementMappings.length); - packet.identifiersToRemove = Arrays.copyOf(this.identifiersToRemove, this.identifiersToRemove.length); - packet.progressMappings = Arrays.copyOf(this.progressMappings, this.progressMappings.length); - - for (AdvancementMapping advancementMapping : packet.advancementMappings) { - advancementMapping.value.displayData.title = operator.apply(advancementMapping.value.displayData.title); - advancementMapping.value.displayData.description = operator.apply(advancementMapping.value.displayData.title); - } - - return packet; - } - /** * AdvancementMapping maps the namespaced ID to the Advancement. */ - public static class AdvancementMapping implements Writeable, Readable { - - public String key; - public Advancement value; + public record AdvancementMapping(@NotNull String key, @NotNull Advancement value) implements Writeable { + public AdvancementMapping(BinaryReader reader) { + this(reader.readSizedString(), new Advancement(reader)); + } @Override public void write(@NotNull BinaryWriter writer) { writer.writeSizedString(key); - value.write(writer); - } - - @Override - public void read(@NotNull BinaryReader reader) { - key = reader.readSizedString(); - value = new Advancement(); - value.read(reader); + writer.write(value); } } - public static class Advancement implements Writeable, Readable { - public String parentIdentifier; - public DisplayData displayData; - public String[] criterions = new String[0]; - public Requirement[] requirements = new Requirement[0]; + public record Advancement(@Nullable String parentIdentifier, @Nullable DisplayData displayData, + @NotNull List criterions, + @NotNull List requirements) implements Writeable { + public Advancement(BinaryReader reader) { + this(reader.readBoolean() ? reader.readSizedString() : null, + reader.readBoolean() ? new DisplayData(reader) : null, + reader.readVarIntList(BinaryReader::readSizedString), + reader.readVarIntList(BinaryReader::readSizedString)); + } @Override public void write(@NotNull BinaryWriter writer) { - // hasParent writer.writeBoolean(parentIdentifier != null); - if (parentIdentifier != null) { - writer.writeSizedString(parentIdentifier); - } + if (parentIdentifier != null) writer.writeSizedString(parentIdentifier); - // hasDisplay writer.writeBoolean(displayData != null); - if (displayData != null) { - displayData.write(writer); - } + if (displayData != null) writer.write(displayData); - writer.writeStringArray(criterions); - - - writer.writeVarInt(requirements.length); - for (Requirement requirement : requirements) { - requirement.write(writer); - } - } - - @Override - public void read(@NotNull BinaryReader reader) { - boolean hasParent = reader.readBoolean(); - if (hasParent) { - parentIdentifier = reader.readSizedString(); - } else { - parentIdentifier = null; - } - - boolean hasDisplay = reader.readBoolean(); - if (hasDisplay) { - displayData = new DisplayData(); - displayData.read(reader); - } else { - displayData = null; - } - - criterions = reader.readSizedStringArray(); - - int requirementCount = reader.readVarInt(); - requirements = new Requirement[requirementCount]; - for (int i = 0; i < requirementCount; i++) { - requirements[i] = new Requirement(); - requirements[i].read(reader); - } + writer.writeVarIntList(criterions, BinaryWriter::writeSizedString); + writer.writeVarIntList(requirements, BinaryWriter::writeSizedString); } } - 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.AIR; - public FrameType frameType = FrameType.TASK; - public int flags; - public String backgroundTexture = ""; - public float x; - public float y; + public record DisplayData(@NotNull Component title, @NotNull Component description, + @NotNull ItemStack icon, @NotNull FrameType frameType, + int flags, @Nullable String backgroundTexture, + float x, float y) implements Writeable { + public DisplayData(BinaryReader reader) { + this(read(reader)); + } + + private DisplayData(DisplayData displayData) { + this(displayData.title, displayData.description, + displayData.icon, displayData.frameType, + displayData.flags, displayData.backgroundTexture, + displayData.x, displayData.y); + } + + private static DisplayData read(BinaryReader reader) { + var title = reader.readComponent(); + var description = reader.readComponent(); + var icon = reader.readItemStack(); + var frameType = FrameType.values()[reader.readVarInt()]; + var flags = reader.readInt(); + var backgroundTexture = (flags & 0x1) != 0 ? reader.readSizedString() : null; + var x = reader.readFloat(); + var y = reader.readFloat(); + return new DisplayData(title, description, + icon, frameType, + flags, backgroundTexture, + x, y); + } @Override public void write(@NotNull BinaryWriter writer) { @@ -193,120 +117,63 @@ public class AdvancementsPacket implements ComponentHoldingServerPacket { writer.writeVarInt(frameType.ordinal()); writer.writeInt(flags); if ((flags & 0x1) != 0) { + assert backgroundTexture != null; writer.writeSizedString(backgroundTexture); } writer.writeFloat(x); writer.writeFloat(y); } - - @Override - public void read(@NotNull BinaryReader reader) { - title = reader.readComponent(); - description = reader.readComponent(); - icon = reader.readItemStack(); - frameType = FrameType.values()[reader.readVarInt()]; - flags = reader.readInt(); - if ((flags & 0x1) != 0) { - backgroundTexture = reader.readSizedString(); - } else { - backgroundTexture = null; - } - x = reader.readFloat(); - y = reader.readFloat(); - } } - public static class Requirement implements Writeable, Readable { - - public String[] requirements = new String[0]; - - @Override - public void write(@NotNull BinaryWriter writer) { - writer.writeStringArray(requirements); + public record ProgressMapping(@NotNull String key, @NotNull AdvancementProgress progress) implements Writeable { + public ProgressMapping(BinaryReader reader) { + this(reader.readSizedString(), new AdvancementProgress(reader)); } - @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(); - value = new AdvancementProgress(); - value.read(reader); + writer.write(progress); } } - public static class AdvancementProgress implements Writeable, Readable { - public Criteria[] criteria = new Criteria[0]; + public record AdvancementProgress(@NotNull List criteria) implements Writeable { + public AdvancementProgress { + criteria = List.copyOf(criteria); + } + + public AdvancementProgress(BinaryReader reader) { + this(reader.readVarIntList(Criteria::new)); + } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeVarInt(criteria.length); - for (Criteria criterion : criteria) { - 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); - } + writer.writeVarIntList(criteria, BinaryWriter::write); } } - public static class Criteria implements Writeable, Readable { - public String criterionIdentifier = ""; - public CriterionProgress criterionProgress = new CriterionProgress(); + public record Criteria(@NotNull String criterionIdentifier, + @NotNull CriterionProgress criterionProgress) implements Writeable { + public Criteria(BinaryReader reader) { + this(reader.readSizedString(), new CriterionProgress(reader)); + } @Override public void write(@NotNull BinaryWriter writer) { writer.writeSizedString(criterionIdentifier); - criterionProgress.write(writer); - } - - @Override - public void read(@NotNull BinaryReader reader) { - criterionIdentifier = reader.readSizedString(); - criterionProgress = new CriterionProgress(); - criterionProgress.read(reader); + writer.write(criterionProgress); } } - public static class CriterionProgress implements Writeable, Readable { - public boolean achieved; - public long dateOfAchieving; + public record CriterionProgress(@Nullable Long dateOfAchieving) implements Writeable { + public CriterionProgress(BinaryReader reader) { + this(reader.readBoolean() ? reader.readLong() : null); + } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeBoolean(achieved); - if (achieved) - writer.writeLong(dateOfAchieving); - } - - @Override - public void read(@NotNull BinaryReader reader) { - achieved = reader.readBoolean(); - if (achieved) { - dateOfAchieving = reader.readLong(); - } + writer.writeBoolean(dateOfAchieving != null); + if (dateOfAchieving != null) writer.writeLong(dateOfAchieving); } } - } \ No newline at end of file diff --git a/src/main/java/net/minestom/server/network/packet/server/play/AttachEntityPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/AttachEntityPacket.java index 66b6a1234..538d2ec45 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/AttachEntityPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/AttachEntityPacket.java @@ -8,22 +8,13 @@ import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class AttachEntityPacket implements ServerPacket { - - public int attachedEntityId; - public int holdingEntityId; // Or -1 to detach - - public AttachEntityPacket(int attachedEntityId, int holdingEntityId) { - this.attachedEntityId = attachedEntityId; - this.holdingEntityId = holdingEntityId; - } - +public record AttachEntityPacket(int attachedEntityId, int holdingEntityId) implements ServerPacket { public AttachEntityPacket(@NotNull Entity attachedEntity, @Nullable Entity holdingEntity) { this(attachedEntity.getEntityId(), holdingEntity != null ? holdingEntity.getEntityId() : -1); } - public AttachEntityPacket() { - this(0, 0); + public AttachEntityPacket(BinaryReader reader) { + this(reader.readInt(), reader.readInt()); } @Override @@ -32,12 +23,6 @@ public class AttachEntityPacket implements ServerPacket { writer.writeInt(holdingEntityId); } - @Override - public void read(@NotNull BinaryReader reader) { - attachedEntityId = reader.readInt(); - holdingEntityId = reader.readInt(); - } - @Override public int getId() { return ServerPacketIdentifier.ATTACH_ENTITY; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/BlockActionPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/BlockActionPacket.java index 426b884c1..f9e980da1 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/BlockActionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/BlockActionPacket.java @@ -1,7 +1,6 @@ package net.minestom.server.network.packet.server.play; import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import net.minestom.server.instance.block.Block; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; @@ -9,26 +8,14 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class BlockActionPacket implements ServerPacket { - - public Point blockPosition; - public byte actionId; - public byte actionParam; - public int blockId; - - public BlockActionPacket(Point blockPosition, byte actionId, byte actionParam, int blockId) { - this.blockPosition = blockPosition; - this.actionId = actionId; - this.actionParam = actionParam; - this.blockId = blockId; - } - +public record BlockActionPacket(Point blockPosition, byte actionId, byte actionParam, + int blockId) implements ServerPacket { public BlockActionPacket(Point blockPosition, byte actionId, byte actionParam, Block block) { this(blockPosition, actionId, actionParam, block.id()); } - public BlockActionPacket() { - this(Vec.ZERO, (byte) 0, (byte) 0, Block.AIR); + public BlockActionPacket(BinaryReader reader) { + this(reader.readBlockPosition(), reader.readByte(), reader.readByte(), reader.readVarInt()); } @Override @@ -39,14 +26,6 @@ public class BlockActionPacket implements ServerPacket { writer.writeVarInt(blockId); } - @Override - public void read(@NotNull BinaryReader reader) { - this.blockPosition = reader.readBlockPosition(); - this.actionId = reader.readByte(); - this.actionParam = reader.readByte(); - this.blockId = reader.readVarInt(); - } - @Override public int getId() { return ServerPacketIdentifier.BLOCK_ACTION; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/BlockBreakAnimationPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/BlockBreakAnimationPacket.java index efb060e38..a88af4f38 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/BlockBreakAnimationPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/BlockBreakAnimationPacket.java @@ -1,27 +1,15 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Point; 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.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; -public class BlockBreakAnimationPacket implements ServerPacket { - - public int entityId; - public Point blockPosition; - public byte destroyStage; - - public BlockBreakAnimationPacket() { - blockPosition = Vec.ZERO; - } - - public BlockBreakAnimationPacket(int entityId, Point blockPosition, byte destroyStage) { - this.entityId = entityId; - this.blockPosition = blockPosition; - this.destroyStage = destroyStage; +public record BlockBreakAnimationPacket(int entityId, Point blockPosition, byte destroyStage) implements ServerPacket { + public BlockBreakAnimationPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readBlockPosition(), reader.readByte()); } @Override @@ -31,13 +19,6 @@ public class BlockBreakAnimationPacket implements ServerPacket { writer.writeByte(destroyStage); } - @Override - public void read(@NotNull BinaryReader reader) { - this.entityId = reader.readVarInt(); - this.blockPosition = reader.readBlockPosition(); - this.destroyStage = reader.readByte(); - } - @Override public int getId() { return ServerPacketIdentifier.BLOCK_BREAK_ANIMATION; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/BlockChangePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/BlockChangePacket.java index b73c3b2cc..76dd41809 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/BlockChangePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/BlockChangePacket.java @@ -1,7 +1,6 @@ package net.minestom.server.network.packet.server.play; import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; import net.minestom.server.instance.block.Block; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; @@ -9,22 +8,13 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class BlockChangePacket implements ServerPacket { - - public Point blockPosition; - public int blockStateId; - - public BlockChangePacket(Point blockPosition, int blockStateId) { - this.blockPosition = blockPosition; - this.blockStateId = blockStateId; - } - +public record BlockChangePacket(Point blockPosition, int blockStateId) implements ServerPacket { public BlockChangePacket(Point blockPosition, Block block) { this(blockPosition, block.stateId()); } - public BlockChangePacket() { - this(Vec.ZERO, 0); + public BlockChangePacket(BinaryReader reader) { + this(reader.readBlockPosition(), reader.readVarInt()); } @Override @@ -33,12 +23,6 @@ public class BlockChangePacket implements ServerPacket { writer.writeVarInt(blockStateId); } - @Override - public void read(@NotNull BinaryReader reader) { - this.blockPosition = reader.readBlockPosition(); - this.blockStateId = reader.readVarInt(); - } - @Override public int getId() { return ServerPacketIdentifier.BLOCK_CHANGE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/BlockEntityDataPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/BlockEntityDataPacket.java index 2ee1dc304..d3be273ba 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/BlockEntityDataPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/BlockEntityDataPacket.java @@ -1,55 +1,30 @@ package net.minestom.server.network.packet.server.play; -import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; 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.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 { - - public Point blockPosition; - public int action; - public NBTCompound nbtCompound; - - public BlockEntityDataPacket() { - blockPosition = Vec.ZERO; +public record BlockEntityDataPacket(Point blockPosition, int action, NBTCompound data) implements ServerPacket { + public BlockEntityDataPacket(BinaryReader reader) { + this(reader.readBlockPosition(), reader.readVarInt(), (NBTCompound) reader.readTag()); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeBlockPosition(blockPosition); writer.writeVarInt(action); - if (nbtCompound != null) { - writer.writeNBT("", nbtCompound); + if (data != null) { + writer.writeNBT("", data); } else { // TAG_End writer.writeByte((byte) 0x00); } } - @Override - public void read(@NotNull BinaryReader reader) { - blockPosition = reader.readBlockPosition(); - action = reader.readVarInt(); - 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/BossBarPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/BossBarPacket.java index 13d52a7f5..90206752b 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/BossBarPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/BossBarPacket.java @@ -3,93 +3,158 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; 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.binary.Writeable; import org.jetbrains.annotations.NotNull; -import java.util.Collection; -import java.util.Collections; import java.util.UUID; -import java.util.function.UnaryOperator; -public class BossBarPacket implements ComponentHoldingServerPacket { - - public UUID uuid = new UUID(0, 0); - public Action action = Action.ADD; - - public Component title = Component.empty(); // Only text - public float health; - public BossBar.Color color = BossBar.Color.BLUE; - public BossBar.Overlay overlay = BossBar.Overlay.PROGRESS; - public byte flags; - - public BossBarPacket() { +public record BossBarPacket(@NotNull UUID uuid, @NotNull Action action) implements ServerPacket { + public BossBarPacket(BinaryReader reader) { + this(reader.readUuid(), switch (reader.readVarInt()) { + case 0 -> new AddAction(reader); + case 1 -> new RemoveAction(); + case 2 -> new UpdateHealthAction(reader); + case 3 -> new UpdateTitleAction(reader); + case 4 -> new UpdateStyleAction(reader); + case 5 -> new UpdateFlagsAction(reader); + default -> throw new RuntimeException("Unknown action id"); + }); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeUuid(uuid); - writer.writeVarInt(action.ordinal()); + writer.writeVarInt(action.id()); + writer.write(action); + } - switch (action) { - case ADD: - writer.writeComponent(title); - writer.writeFloat(health); - writer.writeVarInt(AdventurePacketConvertor.getBossBarColorValue(color)); - writer.writeVarInt(AdventurePacketConvertor.getBossBarOverlayValue(overlay)); - writer.writeByte(flags); - break; - case REMOVE: + public sealed interface Action extends Writeable + permits AddAction, RemoveAction, UpdateHealthAction, UpdateTitleAction, UpdateStyleAction, UpdateFlagsAction { + int id(); + } - break; - case UPDATE_HEALTH: - writer.writeFloat(health); - break; - case UPDATE_TITLE: - writer.writeComponent(title); - break; - case UPDATE_STYLE: - writer.writeVarInt(AdventurePacketConvertor.getBossBarColorValue(color)); - writer.writeVarInt(AdventurePacketConvertor.getBossBarOverlayValue(overlay)); - break; - case UPDATE_FLAGS: - writer.writeByte(flags); - break; + public record AddAction(@NotNull Component title, float health, @NotNull BossBar.Color color, + @NotNull BossBar.Overlay overlay, byte flags) implements Action { + public AddAction(@NotNull BossBar bar) { + this(bar.name(), bar.progress(), bar.color(), bar.overlay(), + AdventurePacketConvertor.getBossBarFlagValue(bar.flags())); + } + + public AddAction(BinaryReader reader) { + this(reader.readComponent(), reader.readFloat(), + BossBar.Color.values()[reader.readVarInt()], + BossBar.Overlay.values()[reader.readVarInt()], reader.readByte()); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeComponent(title); + writer.writeFloat(health); + writer.writeVarInt(AdventurePacketConvertor.getBossBarColorValue(color)); + writer.writeVarInt(AdventurePacketConvertor.getBossBarOverlayValue(overlay)); + writer.writeByte(flags); + } + + @Override + public int id() { + return 0; } } - @Override - public void read(@NotNull BinaryReader reader) { - uuid = reader.readUuid(); - action = Action.values()[reader.readVarInt()]; + public record RemoveAction() implements Action { + @Override + public void write(@NotNull BinaryWriter writer) { + } - switch (action) { - case ADD: - title = reader.readComponent(); - health = reader.readFloat(); - color = BossBar.Color.values()[reader.readVarInt()]; - overlay = BossBar.Overlay.values()[reader.readVarInt()]; - flags = reader.readByte(); - break; - case REMOVE: + @Override + public int id() { + return 1; + } + } - break; - case UPDATE_HEALTH: - health = reader.readFloat(); - break; - case UPDATE_TITLE: - title = reader.readComponent(); - break; - case UPDATE_STYLE: - color = BossBar.Color.values()[reader.readVarInt()]; - overlay = BossBar.Overlay.values()[reader.readVarInt()]; - break; - case UPDATE_FLAGS: - flags = reader.readByte(); - break; + public record UpdateHealthAction(float health) implements Action { + public UpdateHealthAction(@NotNull BossBar bar) { + this(bar.progress()); + } + + public UpdateHealthAction(BinaryReader reader) { + this(reader.readFloat()); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeFloat(health); + } + + @Override + public int id() { + return 2; + } + } + + public record UpdateTitleAction(@NotNull Component title) implements Action { + public UpdateTitleAction(@NotNull BossBar bar) { + this(bar.name()); + } + + public UpdateTitleAction(BinaryReader reader) { + this(reader.readComponent()); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeComponent(title); + } + + @Override + public int id() { + return 3; + } + } + + public record UpdateStyleAction(@NotNull BossBar.Color color, + @NotNull BossBar.Overlay overlay) implements Action { + public UpdateStyleAction(@NotNull BossBar bar) { + this(bar.color(), bar.overlay()); + } + + public UpdateStyleAction(BinaryReader reader) { + this(BossBar.Color.values()[reader.readVarInt()], BossBar.Overlay.values()[reader.readVarInt()]); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeVarInt(AdventurePacketConvertor.getBossBarColorValue(color)); + writer.writeVarInt(AdventurePacketConvertor.getBossBarOverlayValue(overlay)); + } + + @Override + public int id() { + return 4; + } + } + + public record UpdateFlagsAction(byte flags) implements Action { + public UpdateFlagsAction(@NotNull BossBar bar) { + this(AdventurePacketConvertor.getBossBarFlagValue(bar.flags())); + } + + public UpdateFlagsAction(BinaryReader reader) { + this(reader.readByte()); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeByte(flags); + } + + @Override + public int id() { + return 5; } } @@ -97,49 +162,4 @@ public class BossBarPacket implements ComponentHoldingServerPacket { public int getId() { return ServerPacketIdentifier.BOSS_BAR; } - - @Override - public @NotNull Collection components() { - if (title != null) { - return Collections.singleton(title); - } else { - return Collections.emptyList(); - } - } - - @Override - public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { - switch (action) { - case UPDATE_TITLE: { - BossBarPacket packet = new BossBarPacket(); - packet.action = action; - packet.uuid = uuid; - packet.title = operator.apply(title); - return packet; - } - case ADD: { - BossBarPacket packet = new BossBarPacket(); - packet.action = action; - packet.uuid = uuid; - packet.title = operator.apply(title); - packet.health = health; - packet.overlay = overlay; - packet.color = color; - packet.flags = flags; - return packet; - } - default: - return this; - } - } - - public enum Action { - ADD, - REMOVE, - UPDATE_HEALTH, - UPDATE_TITLE, - UPDATE_STYLE, - UPDATE_FLAGS - } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/CameraPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/CameraPacket.java index 87de08693..3cd8e40dd 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/CameraPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/CameraPacket.java @@ -7,32 +7,20 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class CameraPacket implements ServerPacket { - - public int cameraId; - - public CameraPacket(int cameraId) { - this.cameraId = cameraId; +public record CameraPacket(int cameraId) implements ServerPacket { + public CameraPacket(BinaryReader reader) { + this(reader.readVarInt()); } public CameraPacket(@NotNull Entity camera) { this(camera.getEntityId()); } - public CameraPacket() { - this(0); - } - @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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ChangeGameStatePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ChangeGameStatePacket.java index 78e791013..d5889d90a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ChangeGameStatePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ChangeGameStatePacket.java @@ -6,13 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ChangeGameStatePacket implements ServerPacket { - - public Reason reason; - public float value; - - public ChangeGameStatePacket() { - reason = Reason.NO_RESPAWN_BLOCK; +public record ChangeGameStatePacket(Reason reason, float value) implements ServerPacket { + public ChangeGameStatePacket(BinaryReader reader) { + this(Reason.values()[reader.readByte()], reader.readFloat()); } @Override @@ -21,12 +17,6 @@ public class ChangeGameStatePacket implements ServerPacket { 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; @@ -46,5 +36,4 @@ public class ChangeGameStatePacket implements ServerPacket { PLAYER_ELDER_GUARDIAN_MOB_APPEARANCE, ENABLE_RESPAWN_SCREEN } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ChatMessagePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ChatMessagePacket.java index 85b57f270..3841858c2 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ChatMessagePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ChatMessagePacket.java @@ -8,32 +8,19 @@ 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; import java.util.Collection; import java.util.Collections; -import java.util.Objects; import java.util.UUID; import java.util.function.UnaryOperator; /** * Represents an outgoing chat message packet. */ -public class ChatMessagePacket implements ComponentHoldingServerPacket { - private static final UUID NULL_UUID = new UUID(0, 0); - - public Component message; - public ChatPosition position; - public UUID uuid; - - public ChatMessagePacket(@NotNull Component message, @NotNull ChatPosition position, @Nullable UUID uuid) { - this.message = message; - this.position = position; - this.uuid = Objects.requireNonNullElse(uuid, NULL_UUID); - } - - public ChatMessagePacket() { - this(Component.empty(), ChatPosition.SYSTEM_MESSAGE, NULL_UUID); +public record ChatMessagePacket(Component message, ChatPosition position, + UUID uuid) implements ComponentHoldingServerPacket { + public ChatMessagePacket(BinaryReader reader) { + this(reader.readComponent(), ChatPosition.fromPacketID(reader.readByte()), reader.readUuid()); } @Override @@ -43,13 +30,6 @@ public class ChatMessagePacket implements ComponentHoldingServerPacket { writer.writeUuid(uuid); } - @Override - public void read(@NotNull BinaryReader reader) { - message = reader.readComponent(); - position = ChatPosition.fromPacketID(reader.readByte()); - uuid = reader.readUuid(); - } - @Override public int getId() { return ServerPacketIdentifier.CHAT_MESSAGE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ChunkDataPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ChunkDataPacket.java index 51d1b55be..f7253b708 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ChunkDataPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ChunkDataPacket.java @@ -4,17 +4,25 @@ import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.play.data.ChunkData; import net.minestom.server.network.packet.server.play.data.LightData; +import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public record ChunkDataPacket(int chunkX, int chunkZ, ChunkData chunkData, LightData lightData) - implements ServerPacket { +public record ChunkDataPacket(int chunkX, int chunkZ, + @NotNull ChunkData chunkData, + @NotNull LightData lightData) implements ServerPacket { + public ChunkDataPacket(BinaryReader reader) { + this(reader.readInt(), reader.readInt(), + new ChunkData(reader), + new LightData(reader)); + } + @Override public void write(@NotNull BinaryWriter writer) { writer.writeInt(chunkX); writer.writeInt(chunkZ); - this.chunkData.write(writer); - this.lightData.write(writer); + writer.write(chunkData); + writer.write(lightData); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ClearTitlesPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ClearTitlesPacket.java index 5e0151b5e..947ee4ee2 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ClearTitlesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ClearTitlesPacket.java @@ -6,20 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ClearTitlesPacket implements ServerPacket { - - public boolean reset; - - public ClearTitlesPacket() { - } - - public ClearTitlesPacket(boolean reset) { - this.reset = reset; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.reset = reader.readBoolean(); +public record ClearTitlesPacket(boolean reset) implements ServerPacket { + public ClearTitlesPacket(BinaryReader reader) { + this(reader.readBoolean()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/CloseWindowPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/CloseWindowPacket.java index e30b27830..d34c0db49 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/CloseWindowPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/CloseWindowPacket.java @@ -6,22 +6,16 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class CloseWindowPacket implements ServerPacket { - - public byte windowId; - - public CloseWindowPacket() {} +public record CloseWindowPacket(byte windowId) implements ServerPacket { + public CloseWindowPacket(BinaryReader reader) { + this(reader.readByte()); + } @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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/CollectItemPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/CollectItemPacket.java index 9e137ee2a..1db805e43 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/CollectItemPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/CollectItemPacket.java @@ -6,20 +6,10 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class CollectItemPacket implements ServerPacket { - - public int collectedEntityId; - public int collectorEntityId; - public int pickupItemCount; - - public CollectItemPacket(int collectedEntityId, int collectorEntityId, int pickupItemCount) { - this.collectedEntityId = collectedEntityId; - this.collectorEntityId = collectorEntityId; - this.pickupItemCount = pickupItemCount; - } - - public CollectItemPacket() { - this(0, 0, 0); +public record CollectItemPacket(int collectedEntityId, int collectorEntityId, int pickupItemCount) + implements ServerPacket { + public CollectItemPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarInt(), reader.readVarInt()); } @Override @@ -29,13 +19,6 @@ 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/CraftRecipeResponse.java b/src/main/java/net/minestom/server/network/packet/server/play/CraftRecipeResponse.java index cb6db367a..a84c143e3 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/CraftRecipeResponse.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/CraftRecipeResponse.java @@ -6,13 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class CraftRecipeResponse implements ServerPacket { - - public byte windowId; - public String recipe; - - public CraftRecipeResponse() { - recipe = ""; +public record CraftRecipeResponse(byte windowId, String recipe) implements ServerPacket { + public CraftRecipeResponse(BinaryReader reader) { + this(reader.readByte(), reader.readSizedString()); } @Override @@ -21,12 +17,6 @@ public class CraftRecipeResponse implements ServerPacket { writer.writeSizedString(recipe); } - @Override - public void read(@NotNull BinaryReader reader) { - windowId = reader.readByte(); - recipe = reader.readSizedString(); - } - @Override public int getId() { return ServerPacketIdentifier.CRAFT_RECIPE_RESPONSE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/DeathCombatEventPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/DeathCombatEventPacket.java index 038512226..d890cdc87 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/DeathCombatEventPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/DeathCombatEventPacket.java @@ -7,25 +7,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class DeathCombatEventPacket implements ServerPacket { - - public int playerId; - public int entityId; - public Component message = Component.empty(); - - public static DeathCombatEventPacket of(int playerId, int entityId, Component message) { - DeathCombatEventPacket packet = new DeathCombatEventPacket(); - packet.playerId = playerId; - packet.entityId = entityId; - packet.message = message; - return packet; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.playerId = reader.readVarInt(); - this.entityId = reader.readInt(); - this.message = reader.readComponent(); +public record DeathCombatEventPacket(int playerId, int entityId, Component message) implements ServerPacket { + public DeathCombatEventPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readInt(), reader.readComponent()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/DeclareCommandsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/DeclareCommandsPacket.java index 265ea50bd..c8a48349d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/DeclareCommandsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/DeclareCommandsPacket.java @@ -8,29 +8,26 @@ import net.minestom.server.utils.binary.Readable; import net.minestom.server.utils.binary.Writeable; import org.jetbrains.annotations.NotNull; -public class DeclareCommandsPacket implements ServerPacket { +import java.util.List; - public Node[] nodes = new Node[0]; - public int rootIndex; +public record DeclareCommandsPacket(@NotNull List nodes, + int rootIndex) implements ServerPacket { + public DeclareCommandsPacket { + nodes = List.copyOf(nodes); + } - @Override - public void write(@NotNull BinaryWriter writer) { - writer.writeVarInt(nodes.length); - for (Node node : nodes) { - node.write(writer); - } - writer.writeVarInt(rootIndex); + public DeclareCommandsPacket(@NotNull BinaryReader reader) { + this(reader.readVarIntList(r -> { + Node node = new Node(); + node.read(r); + return node; + }), reader.readVarInt()); } @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(); + public void write(@NotNull BinaryWriter writer) { + writer.writeVarIntList(nodes, BinaryWriter::write); + writer.writeVarInt(rootIndex); } @Override @@ -38,8 +35,7 @@ public class DeclareCommandsPacket implements ServerPacket { return ServerPacketIdentifier.DECLARE_COMMANDS; } - public static class Node implements Writeable, Readable { - + public static final class Node implements Writeable, Readable { public byte flags; public int[] children = new int[0]; public int redirectedNode; // Only if flags & 0x08 @@ -133,35 +129,17 @@ public class DeclareCommandsPacket implements ServerPacket { private boolean isArgument() { return (flags & 0b10) != 0; } - } public static byte getFlag(@NotNull NodeType type, boolean executable, boolean redirect, boolean suggestionType) { - byte result = (byte) type.mask; - - if (executable) { - result |= 0x04; - } - - if (redirect) { - result |= 0x08; - } - - if (suggestionType) { - result |= 0x10; - } + byte result = (byte) type.ordinal(); + if (executable) result |= 0x04; + if (redirect) result |= 0x08; + if (suggestionType) result |= 0x10; return result; } public enum NodeType { - ROOT(0), LITERAL(0b1), ARGUMENT(0b10), NONE(0x11); - - private final int mask; - - NodeType(int mask) { - this.mask = mask; - } - + ROOT, LITERAL, ARGUMENT, NONE; } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java index 22266d346..7d1e9d5f0 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java @@ -5,48 +5,36 @@ 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 { +import java.util.List; - public DeclaredRecipe[] recipes = new DeclaredRecipe[0]; +public record DeclareRecipesPacket(@NotNull List recipes) implements ServerPacket { + public DeclareRecipesPacket { + recipes = List.copyOf(recipes); + } - public DeclareRecipesPacket() { + public DeclareRecipesPacket(BinaryReader reader) { + this(reader.readVarIntList(r -> { + final String type = r.readSizedString(); + return switch (type) { + case "crafting_shapeless" -> new DeclaredShapelessCraftingRecipe(reader); + case "crafting_shaped" -> new DeclaredShapedCraftingRecipe(reader); + case "smelting" -> new DeclaredSmeltingRecipe(reader); + case "blasting" -> new DeclaredBlastingRecipe(reader); + case "smoking" -> new DeclaredSmokingRecipe(reader); + case "campfire_cooking" -> new DeclaredCampfireCookingRecipe(reader); + case "stonecutter" -> new DeclaredStonecutterRecipe(reader); + case "smithing" -> new DeclaredSmithingRecipe(reader); + default -> throw new UnsupportedOperationException("Unrecognized type: " + type); + }; + })); } @Override public void write(@NotNull BinaryWriter writer) { - Check.notNull(recipes, "Recipes cannot be null!"); - - writer.writeVarInt(recipes.length); - for (DeclaredRecipe recipe : recipes) { - recipe.write(writer); - } - } - - @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(); - String id = reader.readSizedString(); - - switch (type) { - case "crafting_shapeless" -> recipes[i] = new DeclaredShapelessCraftingRecipe(id, reader); - case "crafting_shaped" -> recipes[i] = new DeclaredShapedCraftingRecipe(id, reader); - case "smelting" -> recipes[i] = new DeclaredSmeltingRecipe(id, reader); - case "blasting" -> recipes[i] = new DeclaredBlastingRecipe(id, reader); - case "smoking" -> recipes[i] = new DeclaredSmokingRecipe(id, reader); - case "campfire_cooking" -> recipes[i] = new DeclaredCampfireCookingRecipe(id, reader); - case "stonecutter" -> recipes[i] = new DeclaredStonecutterRecipe(id, reader); - case "smithing" -> recipes[i] = new DeclaredSmithingRecipe(id, reader); - default -> throw new UnsupportedOperationException("Unrecognized type: " + type + " (id is " + id + ")"); - } - } + writer.writeVarIntList(recipes, BinaryWriter::write); } @Override @@ -54,435 +42,218 @@ public class DeclareRecipesPacket implements ServerPacket { return ServerPacketIdentifier.DECLARE_RECIPES; } - public abstract static class DeclaredRecipe implements Writeable, Readable { - protected final String recipeId; - protected final String recipeType; + public sealed interface DeclaredRecipe extends Writeable + permits DeclaredShapelessCraftingRecipe, DeclaredShapedCraftingRecipe, + DeclaredSmeltingRecipe, DeclaredBlastingRecipe, DeclaredSmokingRecipe, + DeclaredCampfireCookingRecipe, DeclaredStonecutterRecipe, DeclaredSmithingRecipe { + @NotNull String type(); - protected DeclaredRecipe(@NotNull String recipeId, @NotNull String recipeType) { - this.recipeId = recipeId; - this.recipeType = recipeType; - } - - public void write(@NotNull BinaryWriter writer) { - writer.writeSizedString(recipeType); - writer.writeSizedString(recipeId); - } - - @Override - public void read(@NotNull BinaryReader reader) { - throw new UnsupportedOperationException("'read' must be implemented inside subclasses!"); - } + @NotNull String recipeId(); } - public static class DeclaredShapelessCraftingRecipe extends DeclaredRecipe { - private String group; - private Ingredient[] ingredients; - private ItemStack result; - - public DeclaredShapelessCraftingRecipe( - @NotNull String recipeId, - @NotNull String group, - @NotNull Ingredient[] ingredients, - @NotNull ItemStack result - ) { - super(recipeId, "crafting_shapeless"); - this.group = group; - this.ingredients = ingredients; - this.result = result; - } - - private DeclaredShapelessCraftingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) { - super(recipeId, "crafting_shapeless"); - read(reader); + public record DeclaredShapelessCraftingRecipe(String recipeId, String group, + List ingredients, + ItemStack result) implements DeclaredRecipe { + private DeclaredShapelessCraftingRecipe(@NotNull BinaryReader reader) { + this(reader.readSizedString(), reader.readSizedString(), + reader.readVarIntList(Ingredient::new), reader.readItemStack()); } @Override public void write(@NotNull BinaryWriter writer) { - // Write type & id - super.write(writer); - // Write recipe specific stuff. + writer.writeSizedString(recipeId); writer.writeSizedString(group); - writer.writeVarInt(ingredients.length); - for (Ingredient ingredient : ingredients) { - ingredient.write(writer); - } + writer.writeVarIntList(ingredients, BinaryWriter::write); writer.writeItemStack(result); } @Override - public void read(@NotNull BinaryReader reader) { - group = reader.readSizedString(); - 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 @NotNull String type() { + return "crafting_shapeless"; } } - public static class DeclaredShapedCraftingRecipe extends DeclaredRecipe { - public int width; - public int height; - private String group; - private Ingredient[] ingredients; - private ItemStack result; - - public DeclaredShapedCraftingRecipe( - @NotNull String recipeId, - int width, - int height, - @NotNull String group, - @NotNull Ingredient[] ingredients, - @NotNull ItemStack result - ) { - super(recipeId, "crafting_shaped"); - this.group = group; - this.ingredients = ingredients; - this.result = result; - this.width = width; - this.height = height; + public record DeclaredShapedCraftingRecipe(@NotNull String recipeId, int width, int height, + @NotNull String group, @NotNull List ingredients, + @NotNull ItemStack result) implements DeclaredRecipe { + public DeclaredShapedCraftingRecipe { + ingredients = List.copyOf(ingredients); } - private DeclaredShapedCraftingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) { - super(recipeId, "crafting_shaped"); - read(reader); + public DeclaredShapedCraftingRecipe(BinaryReader reader) { + this(reader.readSizedString(), reader.readVarInt(), reader.readVarInt(), + reader.readSizedString(), reader.readVarIntList(Ingredient::new), + reader.readItemStack()); } @Override public void write(@NotNull BinaryWriter writer) { - // Write type & id - super.write(writer); - // Write recipe specific stuff. + writer.writeSizedString(recipeId); writer.writeVarInt(width); writer.writeVarInt(height); writer.writeSizedString(group); - for (Ingredient ingredient : ingredients) { - ingredient.write(writer); - } + writer.writeVarIntList(ingredients, BinaryWriter::write); writer.writeItemStack(result); } @Override - public void read(@NotNull BinaryReader reader) { - width = reader.readVarInt(); - height = reader.readVarInt(); - group = reader.readSizedString(); - 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 @NotNull String type() { + return "crafting_shaped"; } } - public static class DeclaredSmeltingRecipe extends DeclaredRecipe { - private String group; - private Ingredient ingredient; - private ItemStack result; - private float experience; - private int cookingTime; - - public DeclaredSmeltingRecipe( - @NotNull String recipeId, - @NotNull String group, - @NotNull Ingredient ingredient, - @NotNull ItemStack result, - float experience, - int cookingTime - ) { - super(recipeId, "smelting"); - this.group = group; - this.ingredient = ingredient; - this.result = result; - this.experience = experience; - this.cookingTime = cookingTime; - } - - private DeclaredSmeltingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) { - super(recipeId, "smelting"); - read(reader); + public record DeclaredSmeltingRecipe(@NotNull String recipeId, @NotNull String group, + @NotNull Ingredient ingredient, @NotNull ItemStack result, + float experience, int cookingTime) implements DeclaredRecipe { + public DeclaredSmeltingRecipe(BinaryReader reader) { + this(reader.readSizedString(), reader.readSizedString(), + new Ingredient(reader), reader.readItemStack(), + reader.readFloat(), reader.readVarInt()); } @Override public void write(@NotNull BinaryWriter writer) { - // Write type & id - super.write(writer); - // Write recipe specific stuff. + writer.writeSizedString(recipeId); writer.writeSizedString(group); - ingredient.write(writer); + writer.write(ingredient); writer.writeItemStack(result); writer.writeFloat(experience); writer.writeVarInt(cookingTime); } @Override - public void read(@NotNull BinaryReader reader) { - group = reader.readSizedString(); - ingredient = new Ingredient(); - ingredient.read(reader); - result = reader.readItemStack(); - experience = reader.readFloat(); - cookingTime = reader.readVarInt(); + public @NotNull String type() { + return "smelting"; } } - public static class DeclaredBlastingRecipe extends DeclaredRecipe { - private String group; - private Ingredient ingredient; - private ItemStack result; - private float experience; - private int cookingTime; - - public DeclaredBlastingRecipe( - @NotNull String recipeId, - @NotNull String group, - @NotNull Ingredient ingredient, - @NotNull ItemStack result, - float experience, - int cookingTime - ) { - super(recipeId, "blasting"); - this.group = group; - this.ingredient = ingredient; - this.result = result; - this.experience = experience; - this.cookingTime = cookingTime; - } - - private DeclaredBlastingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) { - super(recipeId, "blasting"); - read(reader); + public record DeclaredBlastingRecipe(@NotNull String recipeId, @NotNull String group, + @NotNull Ingredient ingredient, @NotNull ItemStack result, + float experience, int cookingTime) implements DeclaredRecipe { + public DeclaredBlastingRecipe(BinaryReader reader) { + this(reader.readSizedString(), reader.readSizedString(), + new Ingredient(reader), reader.readItemStack(), + reader.readFloat(), reader.readVarInt()); } @Override public void write(@NotNull BinaryWriter writer) { - // Write type & id - super.write(writer); - // Write recipe specific stuff. + writer.writeSizedString(recipeId); writer.writeSizedString(group); - ingredient.write(writer); + writer.write(ingredient); writer.writeItemStack(result); writer.writeFloat(experience); writer.writeVarInt(cookingTime); } @Override - public void read(@NotNull BinaryReader reader) { - group = reader.readSizedString(); - ingredient = new Ingredient(); - ingredient.read(reader); - result = reader.readItemStack(); - experience = reader.readFloat(); - cookingTime = reader.readVarInt(); + public @NotNull String type() { + return "blasting"; } } - public static class DeclaredSmokingRecipe extends DeclaredRecipe { - private String group; - private Ingredient ingredient; - private ItemStack result; - private float experience; - private int cookingTime; - - public DeclaredSmokingRecipe( - @NotNull String recipeId, - @NotNull String group, - @NotNull Ingredient ingredient, - @NotNull ItemStack result, - float experience, - int cookingTime - ) { - super(recipeId, "smoking"); - this.group = group; - this.ingredient = ingredient; - this.result = result; - this.experience = experience; - this.cookingTime = cookingTime; - } - - private DeclaredSmokingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) { - super(recipeId, "smoking"); - read(reader); + public record DeclaredSmokingRecipe(@NotNull String recipeId, @NotNull String group, + @NotNull Ingredient ingredient, @NotNull ItemStack result, + float experience, int cookingTime) implements DeclaredRecipe { + public DeclaredSmokingRecipe(BinaryReader reader) { + this(reader.readSizedString(), reader.readSizedString(), + new Ingredient(reader), reader.readItemStack(), + reader.readFloat(), reader.readVarInt()); } @Override public void write(@NotNull BinaryWriter writer) { - // Write type & id - super.write(writer); - // Write recipe specific stuff. + writer.writeSizedString(recipeId); writer.writeSizedString(group); - ingredient.write(writer); + writer.write(ingredient); writer.writeItemStack(result); writer.writeFloat(experience); writer.writeVarInt(cookingTime); } @Override - public void read(@NotNull BinaryReader reader) { - group = reader.readSizedString(); - ingredient = new Ingredient(); - ingredient.read(reader); - result = reader.readItemStack(); - experience = reader.readFloat(); - cookingTime = reader.readVarInt(); + public @NotNull String type() { + return "smoking"; } } - public static class DeclaredCampfireCookingRecipe extends DeclaredRecipe { - private String group; - private Ingredient ingredient; - private ItemStack result; - private float experience; - private int cookingTime; - - public DeclaredCampfireCookingRecipe( - @NotNull String recipeId, - @NotNull String group, - @NotNull Ingredient ingredient, - @NotNull ItemStack result, - float experience, - int cookingTime - ) { - super(recipeId, "campfire_cooking"); - this.group = group; - this.ingredient = ingredient; - this.result = result; - this.experience = experience; - this.cookingTime = cookingTime; - } - - private DeclaredCampfireCookingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) { - super(recipeId, "campfire_cooking"); - read(reader); + public record DeclaredCampfireCookingRecipe(@NotNull String recipeId, @NotNull String group, + @NotNull Ingredient ingredient, @NotNull ItemStack result, + float experience, int cookingTime) implements DeclaredRecipe { + public DeclaredCampfireCookingRecipe(BinaryReader reader) { + this(reader.readSizedString(), reader.readSizedString(), + new Ingredient(reader), reader.readItemStack(), + reader.readFloat(), reader.readVarInt()); } @Override public void write(@NotNull BinaryWriter writer) { - // Write type & id - super.write(writer); - // Write recipe specific stuff. + writer.writeSizedString(recipeId); writer.writeSizedString(group); - ingredient.write(writer); + writer.write(ingredient); writer.writeItemStack(result); writer.writeFloat(experience); writer.writeVarInt(cookingTime); } @Override - public void read(@NotNull BinaryReader reader) { - group = reader.readSizedString(); - ingredient = new Ingredient(); - ingredient.read(reader); - result = reader.readItemStack(); - experience = reader.readFloat(); - cookingTime = reader.readVarInt(); + public @NotNull String type() { + return "campfire_cooking"; } } - public static class DeclaredStonecutterRecipe extends DeclaredRecipe { - private String group; - private Ingredient ingredient; - private ItemStack result; - - public DeclaredStonecutterRecipe( - @NotNull String recipeId, - @NotNull String group, - @NotNull Ingredient ingredient, - @NotNull ItemStack result - ) { - super(recipeId, "stonecutter"); - this.group = group; - this.ingredient = ingredient; - this.result = result; - } - - private DeclaredStonecutterRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) { - super(recipeId, "stonecutter"); - read(reader); + public record DeclaredStonecutterRecipe(String recipeId, String group, + Ingredient ingredient, ItemStack result) implements DeclaredRecipe { + public DeclaredStonecutterRecipe(@NotNull BinaryReader reader) { + this(reader.readSizedString(), reader.readSizedString(), + new Ingredient(reader), reader.readItemStack()); } @Override public void write(@NotNull BinaryWriter writer) { - // Write type & id - super.write(writer); - // Write recipe specific stuff. + writer.writeSizedString(recipeId); writer.writeSizedString(group); - ingredient.write(writer); + writer.write(ingredient); writer.writeItemStack(result); } @Override - public void read(@NotNull BinaryReader reader) { - group = reader.readSizedString(); - ingredient = new Ingredient(); - ingredient.read(reader); - result = reader.readItemStack(); + public @NotNull String type() { + return "stonecutter"; } } - public final static class DeclaredSmithingRecipe extends DeclaredRecipe { - private Ingredient base; - private Ingredient addition; - private ItemStack result; - - public DeclaredSmithingRecipe( - @NotNull String recipeId, - @NotNull Ingredient base, - @NotNull Ingredient addition, - @NotNull ItemStack result - ) { - super(recipeId, "smithing"); - this.base = base; - this.addition = addition; - this.result = result; - } - - private DeclaredSmithingRecipe(@NotNull String recipeId, @NotNull BinaryReader reader) { - super(recipeId, "smithing"); - read(reader); + public record DeclaredSmithingRecipe(String recipeId, Ingredient base, Ingredient addition, + ItemStack result) implements DeclaredRecipe { + public DeclaredSmithingRecipe(@NotNull BinaryReader reader) { + this(reader.readSizedString(), new Ingredient(reader), new Ingredient(reader), reader.readItemStack()); } @Override public void write(@NotNull BinaryWriter writer) { - // Write type & id - super.write(writer); - // Write recipe specific stuff. - base.write(writer); - addition.write(writer); + writer.writeSizedString(recipeId); + writer.write(base); + writer.write(addition); 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 @NotNull String type() { + return "smithing"; } } - public static class Ingredient implements Writeable, Readable { + public record Ingredient(@NotNull List items) implements Writeable { + public Ingredient { + items = List.copyOf(items); + } - // The count of each item should be 1 - public ItemStack[] items = new ItemStack[0]; + public Ingredient(BinaryReader reader) { + this(reader.readVarIntList(BinaryReader::readItemStack)); + } 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(); - } + writer.writeVarIntList(items, BinaryWriter::writeItemStack); } } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/DestroyEntitiesPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/DestroyEntitiesPacket.java index 210e7726b..a2853d9ee 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/DestroyEntitiesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/DestroyEntitiesPacket.java @@ -6,30 +6,24 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class DestroyEntitiesPacket implements ServerPacket { +import java.util.List; - public int[] entityIds; - - public DestroyEntitiesPacket(int[] entityIds) { - this.entityIds = entityIds; +public record DestroyEntitiesPacket(@NotNull List entityIds) implements ServerPacket { + public DestroyEntitiesPacket { + entityIds = List.copyOf(entityIds); } public DestroyEntitiesPacket(int entityId) { - this(new int[]{entityId}); + this(List.of(entityId)); } - public DestroyEntitiesPacket() { - this(0); + public DestroyEntitiesPacket(BinaryReader reader) { + this(reader.readVarIntList(BinaryReader::readVarInt)); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeVarIntArray(entityIds); - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.entityIds = reader.readVarIntArray(); + writer.writeVarIntList(entityIds, BinaryWriter::writeVarInt); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/DisconnectPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/DisconnectPacket.java index 4f5725b43..cb9b28196 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/DisconnectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/DisconnectPacket.java @@ -12,20 +12,9 @@ import java.util.Collection; import java.util.Collections; import java.util.function.UnaryOperator; -public class DisconnectPacket implements ComponentHoldingServerPacket { - public Component message; - - /** - * Creates a new disconnect packet with a given message. - * - * @param message the message - */ - public DisconnectPacket(@NotNull Component message) { - this.message = message; - } - - private DisconnectPacket() { - this(Component.text("Disconnected.")); +public record DisconnectPacket(Component message) implements ComponentHoldingServerPacket { + public DisconnectPacket(BinaryReader reader) { + this(reader.readComponent()); } @Override @@ -33,11 +22,6 @@ public class DisconnectPacket implements ComponentHoldingServerPacket { writer.writeComponent(message); } - @Override - public void read(@NotNull BinaryReader reader) { - message = reader.readComponent(); - } - @Override public int getId() { return ServerPacketIdentifier.DISCONNECT; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/DisplayScoreboardPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/DisplayScoreboardPacket.java index ed0d36174..620eb5380 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/DisplayScoreboardPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/DisplayScoreboardPacket.java @@ -6,13 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class DisplayScoreboardPacket implements ServerPacket { - - public byte position; - public String scoreName; - - public DisplayScoreboardPacket() { - scoreName = ""; +public record DisplayScoreboardPacket(byte position, String scoreName) implements ServerPacket { + public DisplayScoreboardPacket(BinaryReader reader) { + this(reader.readByte(), reader.readSizedString()); } @Override @@ -21,12 +17,6 @@ public class DisplayScoreboardPacket implements ServerPacket { writer.writeSizedString(scoreName); } - @Override - public void read(@NotNull BinaryReader reader) { - position = reader.readByte(); - scoreName = reader.readSizedString(); - } - @Override public int getId() { return ServerPacketIdentifier.DISPLAY_SCOREBOARD; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EffectPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EffectPacket.java index d789ad30d..5e5bf4aa5 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EffectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EffectPacket.java @@ -1,29 +1,16 @@ package net.minestom.server.network.packet.server.play; import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; 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 EffectPacket implements ServerPacket { - - public int effectId; - public Point position; - public int data; - public boolean disableRelativeVolume; - - public EffectPacket(int effectId, Point position, int data, boolean disableRelativeVolume) { - this.effectId = effectId; - this.position = position; - this.data = data; - this.disableRelativeVolume = disableRelativeVolume; - } - - public EffectPacket() { - this(0, Vec.ZERO, 0, false); +public record EffectPacket(int effectId, Point position, int data, + boolean disableRelativeVolume) implements ServerPacket { + public EffectPacket(BinaryReader reader) { + this(reader.readInt(), reader.readBlockPosition(), reader.readInt(), reader.readBoolean()); } @Override @@ -34,14 +21,6 @@ public class EffectPacket implements ServerPacket { writer.writeBoolean(disableRelativeVolume); } - @Override - public void read(@NotNull BinaryReader reader) { - this.effectId = reader.readInt(); - this.position = reader.readBlockPosition(); - this.data = reader.readInt(); - this.disableRelativeVolume = reader.readBoolean(); - } - @Override public int getId() { return ServerPacketIdentifier.EFFECT; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EndCombatEventPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EndCombatEventPacket.java index 58ab29eec..80e847aa9 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EndCombatEventPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EndCombatEventPacket.java @@ -6,15 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class EndCombatEventPacket implements ServerPacket { - - public int duration; - public int entityId; - - @Override - public void read(@NotNull BinaryReader reader) { - this.duration = reader.readVarInt(); - this.entityId = reader.readInt(); +public record EndCombatEventPacket(int duration, int entityId) implements ServerPacket { + public EndCombatEventPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EnterCombatEventPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EnterCombatEventPacket.java index 028660250..f70583ba7 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EnterCombatEventPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EnterCombatEventPacket.java @@ -2,18 +2,13 @@ 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 EnterCombatEventPacket implements ServerPacket { - - @Override - public void read(@NotNull BinaryReader reader) { - } - +public record EnterCombatEventPacket() implements ServerPacket { @Override public void write(@NotNull BinaryWriter writer) { + // Empty } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityAnimationPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityAnimationPacket.java index a171e040f..17fab19a1 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityAnimationPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityAnimationPacket.java @@ -6,18 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class EntityAnimationPacket implements ServerPacket { - - public int entityId; - public Animation animation; - - public EntityAnimationPacket(int entityId, Animation animation) { - this.entityId = entityId; - this.animation = animation; - } - - public EntityAnimationPacket() { - this(0, Animation.SWING_MAIN_ARM); +public record EntityAnimationPacket(int entityId, Animation animation) implements ServerPacket { + public EntityAnimationPacket(BinaryReader reader) { + this(reader.readVarInt(), Animation.values()[reader.readByte()]); } @Override @@ -26,12 +17,6 @@ public class EntityAnimationPacket implements ServerPacket { 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityEffectPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityEffectPacket.java index d3ffa277b..a1751cc3a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityEffectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityEffectPacket.java @@ -3,41 +3,19 @@ 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; -public class EntityEffectPacket implements ServerPacket { - - public int entityId; - public Potion potion; - - public EntityEffectPacket() { - potion = new Potion(PotionEffect.ABSORPTION, (byte) 0, 0); +public record EntityEffectPacket(int entityId, Potion potion) implements ServerPacket { + public EntityEffectPacket(BinaryReader reader) { + this(reader.readVarInt(), new Potion(reader)); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(entityId); - writer.writeByte((byte) potion.getEffect().id()); - writer.writeByte(potion.getAmplifier()); - writer.writeVarInt(potion.getDuration()); - 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); + writer.write(potion); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityEquipmentPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityEquipmentPacket.java index 5707fba40..cab2acee5 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityEquipmentPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityEquipmentPacket.java @@ -8,67 +8,44 @@ 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; +import java.util.EnumMap; +import java.util.Map; -public class EntityEquipmentPacket implements ServerPacket { +public record EntityEquipmentPacket(int entityId, Map equipments) implements ServerPacket { + public EntityEquipmentPacket { + equipments = Map.copyOf(equipments); + } - public int entityId; - public EquipmentSlot[] slots; - public ItemStack[] itemStacks; - - public EntityEquipmentPacket() { + public EntityEquipmentPacket(BinaryReader reader) { + this(reader.readVarInt(), readEquipments(reader)); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(entityId); - - if (slots == null || itemStacks == null) { - throw new IllegalArgumentException("You need to specify at least one slot and one item"); - } - - if (slots.length != itemStacks.length) { - throw new IllegalArgumentException("You need the same amount of slots and items"); - } - - for (int i = 0; i < slots.length; i++) { - final EquipmentSlot slot = slots[i]; - final ItemStack itemStack = itemStacks[i]; - final boolean last = i == slots.length - 1; - - byte slotEnum = (byte) slot.ordinal(); - if (!last) { - slotEnum |= 0x80; - } - + int index = 0; + for (var entry : equipments.entrySet()) { + final boolean last = index++ == equipments.size() - 1; + byte slotEnum = (byte) entry.getKey().ordinal(); + if (!last) slotEnum |= 0x80; writer.writeByte(slotEnum); - writer.writeItemStack(itemStack); + writer.writeItemStack(entry.getValue()); } } - @Override - public void read(@NotNull BinaryReader reader) { - entityId = reader.readVarInt(); - - boolean hasRemaining = true; - List slots = new LinkedList<>(); - List stacks = new LinkedList<>(); - while (hasRemaining) { - byte slotEnum = reader.readByte(); - hasRemaining = (slotEnum & 0x80) == 0x80; - - slots.add(EquipmentSlot.values()[slotEnum & 0x7F]); - stacks.add(reader.readItemStack()); - } - - this.slots = slots.toArray(new EquipmentSlot[0]); - this.itemStacks = stacks.toArray(new ItemStack[0]); - } - @Override public int getId() { return ServerPacketIdentifier.ENTITY_EQUIPMENT; } + private static Map readEquipments(BinaryReader reader) { + EnumMap equipments = new EnumMap<>(EquipmentSlot.class); + boolean hasRemaining = true; + while (hasRemaining) { + byte slotEnum = reader.readByte(); + hasRemaining = (slotEnum & 0x80) == 0x80; + equipments.put(EquipmentSlot.values()[slotEnum & 0x7F], reader.readItemStack()); + } + return equipments; + } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityHeadLookPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityHeadLookPacket.java index db0dbe883..64b0caa90 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityHeadLookPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityHeadLookPacket.java @@ -6,18 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class EntityHeadLookPacket implements ServerPacket { - - public int entityId; - public float yaw; - - public EntityHeadLookPacket(int entityId, float yaw) { - this.entityId = entityId; - this.yaw = yaw; - } - - public EntityHeadLookPacket() { - this(0, 0); +public record EntityHeadLookPacket(int entityId, float yaw) implements ServerPacket { + public EntityHeadLookPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readByte() * 360f / 256f); } @Override @@ -26,12 +17,6 @@ public class EntityHeadLookPacket implements ServerPacket { 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityMetaDataPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityMetaDataPacket.java index 57fa2eeda..31f8f40b0 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityMetaDataPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityMetaDataPacket.java @@ -7,52 +7,39 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; +import java.util.List; -public class EntityMetaDataPacket implements ServerPacket { - - public int entityId; - public Collection> entries; - - public EntityMetaDataPacket(int entityId, Collection> entries) { - this.entityId = entityId; - this.entries = entries; +public record EntityMetaDataPacket(int entityId, + @NotNull Collection> entries) implements ServerPacket { + public EntityMetaDataPacket { + entries = List.copyOf(entries); } - public EntityMetaDataPacket() { - this(0, Collections.emptyList()); + public EntityMetaDataPacket(BinaryReader reader) { + this(reader.readVarInt(), readEntries(reader)); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(entityId); - - if (entries != null) { - // Write all the fields - for (Metadata.Entry entry : entries) { - entry.write(writer); - } + 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<>(); + private static Collection> readEntries(BinaryReader reader) { + Collection> entries = new ArrayList<>(); while (true) { byte index = reader.readByte(); - if (index == (byte) 0xFF) { // reached the end break; } - entries.add(new Metadata.Entry<>(reader)); } + return entries; } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityPositionAndRotationPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityPositionAndRotationPacket.java index 5f2389d18..59a256060 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityPositionAndRotationPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityPositionAndRotationPacket.java @@ -1,20 +1,17 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Pos; 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.coordinate.Pos; import org.jetbrains.annotations.NotNull; -public class EntityPositionAndRotationPacket implements ServerPacket { - - public int entityId; - public short deltaX, deltaY, deltaZ; - public float yaw, pitch; - public boolean onGround; - - public EntityPositionAndRotationPacket() { +public record EntityPositionAndRotationPacket(int entityId, short deltaX, short deltaY, short deltaZ, + float yaw, float pitch, boolean onGround) implements ServerPacket { + public EntityPositionAndRotationPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readShort(), reader.readShort(), reader.readShort(), + reader.readByte() * 360f / 256f, reader.readByte() * 360f / 256f, reader.readBoolean()); } @Override @@ -28,17 +25,6 @@ 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() { return ServerPacketIdentifier.ENTITY_POSITION_AND_ROTATION; @@ -47,15 +33,9 @@ public class EntityPositionAndRotationPacket implements ServerPacket { public static EntityPositionAndRotationPacket getPacket(int entityId, @NotNull Pos newPosition, @NotNull Pos oldPosition, boolean onGround) { - EntityPositionAndRotationPacket entityPositionAndRotationPacket = new EntityPositionAndRotationPacket(); - entityPositionAndRotationPacket.entityId = entityId; - entityPositionAndRotationPacket.deltaX = (short) ((newPosition.x() * 32 - oldPosition.x() * 32) * 128); - entityPositionAndRotationPacket.deltaY = (short) ((newPosition.y() * 32 - oldPosition.y() * 32) * 128); - entityPositionAndRotationPacket.deltaZ = (short) ((newPosition.z() * 32 - oldPosition.z() * 32) * 128); - entityPositionAndRotationPacket.yaw = newPosition.yaw(); - entityPositionAndRotationPacket.pitch = newPosition.pitch(); - entityPositionAndRotationPacket.onGround = onGround; - - return entityPositionAndRotationPacket; + final short deltaX = (short) ((newPosition.x() * 32 - oldPosition.x() * 32) * 128); + final short deltaY = (short) ((newPosition.y() * 32 - oldPosition.y() * 32) * 128); + final short deltaZ = (short) ((newPosition.z() * 32 - oldPosition.z() * 32) * 128); + return new EntityPositionAndRotationPacket(entityId, deltaX, deltaY, deltaZ, newPosition.yaw(), newPosition.pitch(), onGround); } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityPositionPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityPositionPacket.java index a15e63b6d..c097cd87f 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityPositionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityPositionPacket.java @@ -1,19 +1,17 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Pos; 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.coordinate.Pos; import org.jetbrains.annotations.NotNull; -public class EntityPositionPacket implements ServerPacket { +public record EntityPositionPacket(int entityId, short deltaX, short deltaY, short deltaZ, boolean onGround) + implements ServerPacket { - public int entityId; - public short deltaX, deltaY, deltaZ; - public boolean onGround; - - public EntityPositionPacket() { + public EntityPositionPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readShort(), reader.readShort(), reader.readShort(), reader.readBoolean()); } @Override @@ -25,15 +23,6 @@ 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; @@ -43,13 +32,9 @@ public class EntityPositionPacket implements ServerPacket { public static EntityPositionPacket getPacket(int entityId, @NotNull Pos newPosition, @NotNull Pos oldPosition, boolean onGround) { - EntityPositionPacket entityPositionPacket = new EntityPositionPacket(); - entityPositionPacket.entityId = entityId; - entityPositionPacket.deltaX = (short) ((newPosition.x() * 32 - oldPosition.x() * 32) * 128); - entityPositionPacket.deltaY = (short) ((newPosition.y() * 32 - oldPosition.y() * 32) * 128); - entityPositionPacket.deltaZ = (short) ((newPosition.z() * 32 - oldPosition.z() * 32) * 128); - entityPositionPacket.onGround = onGround; - - return entityPositionPacket; + final short deltaX = (short) ((newPosition.x() * 32 - oldPosition.x() * 32) * 128); + final short deltaY = (short) ((newPosition.y() * 32 - oldPosition.y() * 32) * 128); + final short deltaZ = (short) ((newPosition.z() * 32 - oldPosition.z() * 32) * 128); + return new EntityPositionPacket(entityId, deltaX, deltaY, deltaZ, onGround); } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityPropertiesPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityPropertiesPacket.java index 06c8989f9..3c13eec0d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityPropertiesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityPropertiesPacket.java @@ -8,52 +8,38 @@ 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; +import java.util.List; -public class EntityPropertiesPacket implements ServerPacket { +public record EntityPropertiesPacket(int entityId, List properties) implements ServerPacket { + public EntityPropertiesPacket { + properties = List.copyOf(properties); + } - public int entityId; - public Property[] properties = new Property[0]; - - public EntityPropertiesPacket() { + public EntityPropertiesPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarIntList(r -> { + final Attribute attribute = Attribute.fromKey(reader.readSizedString()); + final double value = reader.readDouble(); + int modifierCount = reader.readVarInt(); + AttributeInstance 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); + } + return instance; + })); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(entityId); - writer.writeVarInt(properties.length); - for (Property property : properties) { - property.write(writer); - } - } + writer.writeVarInt(properties.size()); + for (AttributeInstance instance : properties) { + final Attribute attribute = instance.getAttribute(); + double value = instance.getValue(); - @Override - public void read(@NotNull BinaryReader reader) { - entityId = reader.readVarInt(); - int propertyCount = reader.readVarInt(); - 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 implements Writeable, Readable { - - public Attribute attribute; - public double value; - public AttributeInstance instance; - - public void write(BinaryWriter writer) { float maxValue = attribute.getMaxValue(); // Bypass vanilla limit client-side if needed (by sending the max value allowed) @@ -73,21 +59,10 @@ public class EntityPropertiesPacket implements ServerPacket { } } } - - @Override - public void read(@NotNull BinaryReader reader) { - String key = reader.readSizedString(); - 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); - } - } } + @Override + public int getId() { + return ServerPacketIdentifier.ENTITY_PROPERTIES; + } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityRotationPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityRotationPacket.java index a5b074775..34ffa3a9d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityRotationPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityRotationPacket.java @@ -6,21 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class EntityRotationPacket implements ServerPacket { - - public int entityId; - public float yaw, pitch; - public boolean onGround; - - public EntityRotationPacket(int entityId, float yaw, float pitch, boolean onGround) { - this.entityId = entityId; - this.yaw = yaw; - this.pitch = pitch; - this.onGround = onGround; - } - - public EntityRotationPacket() { - this(0, 0, 0, false); +public record EntityRotationPacket(int entityId, float yaw, float pitch, boolean onGround) implements ServerPacket { + public EntityRotationPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readByte() * 360f / 256f, reader.readByte() * 360f / 256f, reader.readBoolean()); } @Override @@ -31,29 +19,8 @@ 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; } - - @NotNull - public static EntityRotationPacket getPacket(int entityId, - float yaw, float pitch, - boolean onGround) { - EntityRotationPacket entityRotationPacket = new EntityRotationPacket(); - entityRotationPacket.entityId = entityId; - entityRotationPacket.yaw = yaw; - entityRotationPacket.pitch = pitch; - entityRotationPacket.onGround = onGround; - - return entityRotationPacket; - } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntitySoundEffectPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntitySoundEffectPacket.java index a697e1de6..9004d49e3 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntitySoundEffectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntitySoundEffectPacket.java @@ -8,36 +8,21 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class EntitySoundEffectPacket implements ServerPacket { - - public int soundId; - public Sound.Source soundSource; - public int entityId; - public float volume; - public float pitch; - - public EntitySoundEffectPacket() { - soundSource = Sound.Source.NEUTRAL; +public record EntitySoundEffectPacket(int soundId, Sound.Source source, int entityId, + float volume, float pitch) implements ServerPacket { + public EntitySoundEffectPacket(BinaryReader reader) { + this(reader.readVarInt(), Sound.Source.values()[reader.readVarInt()], reader.readVarInt(), reader.readFloat(), reader.readFloat()); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(soundId); - writer.writeVarInt(AdventurePacketConvertor.getSoundSourceValue(soundSource)); + writer.writeVarInt(AdventurePacketConvertor.getSoundSourceValue(source)); writer.writeVarInt(entityId); writer.writeFloat(volume); 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityStatusPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityStatusPacket.java index d7b10f94e..cf5bfc39a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityStatusPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityStatusPacket.java @@ -6,18 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class EntityStatusPacket implements ServerPacket { - - public int entityId; - public byte status; - - public EntityStatusPacket(int entityId, byte status) { - this.entityId = entityId; - this.status = status; - } - - public EntityStatusPacket() { - this(0, (byte) 0); +public record EntityStatusPacket(int entityId, byte status) implements ServerPacket { + public EntityStatusPacket(BinaryReader reader) { + this(reader.readInt(), reader.readByte()); } @Override @@ -26,12 +17,6 @@ public class EntityStatusPacket implements ServerPacket { writer.writeByte(status); } - @Override - public void read(@NotNull BinaryReader reader) { - entityId = reader.readInt(); - status = reader.readByte(); - } - @Override public int getId() { return ServerPacketIdentifier.ENTITY_STATUS; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityTeleportPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityTeleportPacket.java index 8e0486a8e..479ec169d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityTeleportPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityTeleportPacket.java @@ -7,20 +7,11 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class EntityTeleportPacket implements ServerPacket { - - public int entityId; - public Pos position; - public boolean onGround; - - public EntityTeleportPacket(int entityId, Pos position, boolean onGround) { - this.entityId = entityId; - this.position = position; - this.onGround = onGround; - } - - public EntityTeleportPacket() { - this(0, Pos.ZERO, false); +public record EntityTeleportPacket(int entityId, Pos position, boolean onGround) implements ServerPacket { + public EntityTeleportPacket(BinaryReader reader) { + this(reader.readVarInt(), new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), + reader.readByte() * 360f / 256f, reader.readByte() * 360f / 256f), + reader.readBoolean()); } @Override @@ -34,19 +25,6 @@ public class EntityTeleportPacket implements ServerPacket { writer.writeBoolean(onGround); } - @Override - public void read(@NotNull BinaryReader reader) { - entityId = reader.readVarInt(); - position = new Pos( - 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityVelocityPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityVelocityPacket.java index 8d4fc5a22..b66ecc83a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityVelocityPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityVelocityPacket.java @@ -7,26 +7,16 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class EntityVelocityPacket implements ServerPacket { - - public int entityId; - public short velocityX, velocityY, velocityZ; - - public EntityVelocityPacket(int entityId, short velocityX, short velocityY, short velocityZ) { - this.entityId = entityId; - this.velocityX = velocityX; - this.velocityY = velocityY; - this.velocityZ = velocityZ; +public record EntityVelocityPacket(int entityId, short velocityX, short velocityY, + short velocityZ) implements ServerPacket { + public EntityVelocityPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readShort(), reader.readShort(), reader.readShort()); } public EntityVelocityPacket(int entityId, Point velocity) { this(entityId, (short) velocity.x(), (short) velocity.y(), (short) velocity.z()); } - public EntityVelocityPacket() { - this(0, (short) 0, (short) 0, (short) 0); - } - @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(entityId); @@ -35,14 +25,6 @@ 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ExplosionPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ExplosionPacket.java index 8605e993c..f59bad232 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ExplosionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ExplosionPacket.java @@ -6,14 +6,12 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ExplosionPacket implements ServerPacket { - - public float x, y, z; - public float radius; // UNUSED - public byte[] records = new byte[0]; - public float playerMotionX, playerMotionY, playerMotionZ; - - public ExplosionPacket() { +public record ExplosionPacket(float x, float y, float z, float radius, byte[] records, + float playerMotionX, float playerMotionY, float playerMotionZ) implements ServerPacket { + public ExplosionPacket(BinaryReader reader) { + this(reader.readFloat(), reader.readFloat(), reader.readFloat(), + reader.readFloat(), reader.readBytes(reader.readVarInt() * 3), + reader.readFloat(), reader.readFloat(), reader.readFloat()); } @Override @@ -23,26 +21,12 @@ public class ExplosionPacket implements ServerPacket { writer.writeFloat(z); writer.writeFloat(radius); writer.writeVarInt(records.length / 3); // each record is 3 bytes long - for (byte record : records) - writer.writeByte(record); + for (byte record : records) writer.writeByte(record); writer.writeFloat(playerMotionX); writer.writeFloat(playerMotionY); 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.readVarInt() * 3; - records = reader.readBytes(recordCount); - playerMotionX = reader.readFloat(); - playerMotionY = reader.readFloat(); - playerMotionZ = reader.readFloat(); - } - @Override public int getId() { return ServerPacketIdentifier.EXPLOSION; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/FacePlayerPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/FacePlayerPacket.java index 15aa2f456..c42d4354f 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/FacePlayerPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/FacePlayerPacket.java @@ -1,30 +1,28 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Point; +import net.minestom.server.coordinate.Vec; 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 FacePlayerPacket implements ServerPacket { - - public FacePosition facePosition; - public double targetX, targetY, targetZ; - public int entityId; - public FacePosition entityFacePosition; - - public FacePlayerPacket() { - facePosition = FacePosition.EYES; - entityFacePosition = FacePosition.EYES; +public record FacePlayerPacket(FacePosition facePosition, + Point target, int entityId, FacePosition entityFacePosition) implements ServerPacket { + public FacePlayerPacket(BinaryReader reader) { + this(FacePosition.values()[reader.readVarInt()], + new Vec(reader.readDouble(), reader.readDouble(), reader.readDouble()), + reader.readBoolean() ? reader.readVarInt() : 0, + reader.available() > 0 ? FacePosition.values()[reader.readVarInt()] : null); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(facePosition.ordinal()); - writer.writeDouble(targetX); - writer.writeDouble(targetY); - writer.writeDouble(targetZ); - + writer.writeDouble(target.x()); + writer.writeDouble(target.y()); + writer.writeDouble(target.z()); final boolean isEntity = entityId > 0; writer.writeBoolean(isEntity); if (isEntity) { @@ -33,22 +31,6 @@ 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; @@ -57,5 +39,4 @@ public class FacePlayerPacket implements ServerPacket { public enum FacePosition { FEET, EYES } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/HeldItemChangePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/HeldItemChangePacket.java index 3abde0710..5ffb134e6 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/HeldItemChangePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/HeldItemChangePacket.java @@ -6,16 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class HeldItemChangePacket implements ServerPacket { - - public byte slot; - - public HeldItemChangePacket(byte slot) { - this.slot = slot; - } - - public HeldItemChangePacket() { - this((byte) 0); +public record HeldItemChangePacket(byte slot) implements ServerPacket { + public HeldItemChangePacket(BinaryReader reader) { + this(reader.readByte()); } @Override @@ -23,11 +16,6 @@ public class HeldItemChangePacket implements ServerPacket { writer.writeByte(slot); } - @Override - public void read(@NotNull BinaryReader reader) { - slot = reader.readByte(); - } - @Override public int getId() { return ServerPacketIdentifier.HELD_ITEM_CHANGE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/InitializeWorldBorderPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/InitializeWorldBorderPacket.java index db3beb0be..36e6e42af 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/InitializeWorldBorderPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/InitializeWorldBorderPacket.java @@ -4,30 +4,15 @@ 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 InitializeWorldBorderPacket implements ServerPacket { - - public double x, z; - public double oldDiameter; - public double newDiameter; - public long speed; - public int portalTeleportBoundary; - public int warningTime; - public int warningBlocks; - - public static InitializeWorldBorderPacket of(double x, double z, double oldDiameter, double newDiameter, long speed, - int portalTeleportBoundary, int warningTime, int warningBlocks) { - InitializeWorldBorderPacket packet = new InitializeWorldBorderPacket(); - packet.x = x; - packet.z = z; - packet.oldDiameter = oldDiameter; - packet.newDiameter = newDiameter; - packet.speed = speed; - packet.portalTeleportBoundary = portalTeleportBoundary; - packet.warningTime = warningTime; - packet.warningBlocks = warningBlocks; - return packet; +public record InitializeWorldBorderPacket(double x, double z, + double oldDiameter, double newDiameter, long speed, + int portalTeleportBoundary, int warningTime, + int warningBlocks) implements ServerPacket { + public InitializeWorldBorderPacket(BinaryReader reader) { + this(reader.readDouble(), reader.readDouble(), + reader.readDouble(), reader.readDouble(), + reader.readVarLong(), reader.readVarInt(), reader.readVarInt(), reader.readVarInt()); } @Override @@ -42,18 +27,6 @@ public class InitializeWorldBorderPacket implements ServerPacket { writer.writeVarInt(warningBlocks); } - @Override - public void read(@NotNull BinaryReader reader) { - this.x = reader.readDouble(); - this.z = reader.readDouble(); - this.oldDiameter = reader.readDouble(); - this.newDiameter = reader.readDouble(); - this.speed = reader.readVarLong(); - this.portalTeleportBoundary = reader.readVarInt(); - this.warningTime = reader.readVarInt(); - this.warningBlocks = reader.readVarInt(); - } - @Override public int getId() { return ServerPacketIdentifier.INITIALIZE_WORLD_BORDER; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/JoinGamePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/JoinGamePacket.java index 9bcbeae5e..724dea46b 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/JoinGamePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/JoinGamePacket.java @@ -1,66 +1,46 @@ package net.minestom.server.network.packet.server.play; -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; +import java.util.List; -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 - public int viewDistance; - public int simulationDistance; - public boolean reducedDebugInfo = false; - public boolean enableRespawnScreen = true; - public boolean isDebug = false; - public boolean isFlat = false; - - public JoinGamePacket() { - gameMode = GameMode.SURVIVAL; - dimensionType = DimensionType.OVERWORLD; +public record JoinGamePacket(int entityId, boolean isHardcore, GameMode gameMode, GameMode previousGameMode, + List worlds, NBTCompound dimensionCodec, NBTCompound dimension, String world, + long hashedSeed, int maxPlayers, int viewDistance, int simulationDistance, + boolean reducedDebugInfo, boolean enableRespawnScreen, boolean isDebug, + boolean isFlat) implements ServerPacket { + public JoinGamePacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readBoolean(), GameMode.fromId(reader.readByte()), GameMode.fromId(reader.readByte()), + List.of(reader.readSizedStringArray()), (NBTCompound) reader.readTag(), (NBTCompound) reader.readTag(), reader.readSizedString(), + reader.readLong(), reader.readVarInt(), reader.readVarInt(), reader.readVarInt(), + reader.readBoolean(), reader.readBoolean(), reader.readBoolean(), reader.readBoolean()); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeInt(entityId); - writer.writeBoolean(hardcore); + writer.writeBoolean(isHardcore); writer.writeByte(gameMode.getId()); - - if (previousGameMode == null) { - writer.writeByte(gameMode.getId()); - } else { + if (previousGameMode != null) { writer.writeByte(previousGameMode.getId()); + } else { + writer.writeByte((byte) -1); } //array of worlds writer.writeVarInt(1); writer.writeSizedString("minestom:world"); - NBTCompound nbt = new NBTCompound(); - NBTCompound dimensions = MinecraftServer.getDimensionTypeManager().toNBT(); - NBTCompound biomes = MinecraftServer.getBiomeManager().toNBT(); - nbt.set("minecraft:dimension_type", dimensions); - nbt.set("minecraft:worldgen/biome", biomes); + writer.writeNBT("", dimensionCodec); + writer.writeNBT("", dimension); - writer.writeNBT("", nbt); - writer.writeNBT("", dimensionType.toNBT()); - - writer.writeSizedString(dimensionType.getName().toString()); + writer.writeSizedString(world); writer.writeLong(hashedSeed); writer.writeVarInt(maxPlayers); writer.writeVarInt(viewDistance); @@ -73,36 +53,6 @@ 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(); - try { - NBTCompound dimensionCodec = (NBTCompound) reader.readTag(); - dimensionType = DimensionType.fromNBT((NBTCompound) reader.readTag()); - - String dimensionName = reader.readSizedString(); - hashedSeed = reader.readLong(); - maxPlayers = reader.readVarInt(); - viewDistance = reader.readVarInt(); - simulationDistance = 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/KeepAlivePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/KeepAlivePacket.java index 3e76ed3bb..80cb08c41 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/KeepAlivePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/KeepAlivePacket.java @@ -6,14 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class KeepAlivePacket implements ServerPacket { - - public long id; - - KeepAlivePacket() {} - - public KeepAlivePacket(long id) { - this.id = id; +public record KeepAlivePacket(long id) implements ServerPacket { + public KeepAlivePacket(BinaryReader reader) { + this(reader.readLong()); } @Override @@ -21,11 +16,6 @@ public class KeepAlivePacket implements ServerPacket { writer.writeLong(id); } - @Override - public void read(@NotNull BinaryReader reader) { - id = reader.readLong(); - } - @Override public int getId() { return ServerPacketIdentifier.KEEP_ALIVE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/MapDataPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/MapDataPacket.java index bd9d87295..c9705de5a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/MapDataPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/MapDataPacket.java @@ -1,34 +1,56 @@ package net.minestom.server.network.packet.server.play; 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 net.minestom.server.utils.binary.Readable; import net.minestom.server.utils.binary.Writeable; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.*; -import java.util.function.UnaryOperator; +import java.util.List; -public class MapDataPacket implements ComponentHoldingServerPacket { +public record MapDataPacket(int mapId, byte scale, boolean locked, + boolean trackingPosition, @NotNull List icons, + byte columns, byte rows, byte x, byte z, + byte @Nullable [] data) implements ServerPacket { + public MapDataPacket { + icons = List.copyOf(icons); + } - public int mapId; - public byte scale; - public boolean locked; - public boolean trackingPosition; + public MapDataPacket(BinaryReader reader) { + this(read(reader)); + } - public Icon[] icons = new Icon[0]; + private MapDataPacket(MapDataPacket packet) { + this(packet.mapId, packet.scale, packet.locked, + packet.trackingPosition, packet.icons, + packet.columns, packet.rows, packet.x, packet.z, + packet.data); + } - public short columns; - public short rows; - public byte x; - public byte z; - public byte[] data = new byte[0]; + private static MapDataPacket read(BinaryReader reader) { + var mapId = reader.readVarInt(); + var scale = reader.readByte(); + var locked = reader.readBoolean(); + var trackingPosition = reader.readBoolean(); + List icons = trackingPosition ? reader.readVarIntList(Icon::new) : List.of(); - public MapDataPacket() { + var columns = reader.readByte(); + byte rows = 0; + byte x = 0; + byte z = 0; + byte[] data = null; + if (columns > 0) { + rows = reader.readByte(); + x = reader.readByte(); + z = reader.readByte(); + data = reader.readBytes(reader.readVarInt()); + } + return new MapDataPacket(mapId, scale, locked, + trackingPosition, icons, columns, rows, x, z, + data); } @Override @@ -37,24 +59,11 @@ public class MapDataPacket implements ComponentHoldingServerPacket { writer.writeByte(scale); writer.writeBoolean(locked); writer.writeBoolean(trackingPosition); + if (trackingPosition) writer.writeVarIntList(icons, BinaryWriter::write); - if (trackingPosition) { - if (icons != null && icons.length > 0) { - writer.writeVarInt(icons.length); - for (Icon icon : icons) { - icon.write(writer); - } - } else { - writer.writeVarInt(0); - } - } - - writer.writeByte((byte) columns); - if (columns <= 0) { - return; - } - - writer.writeByte((byte) rows); + writer.writeByte(columns); + if (columns <= 0) return; + writer.writeByte(rows); writer.writeByte(x); writer.writeByte(z); if (data != null && data.length > 0) { @@ -63,37 +72,6 @@ public class MapDataPacket implements ComponentHoldingServerPacket { } else { writer.writeVarInt(0); } - - } - - @Override - public void read(@NotNull BinaryReader reader) { - mapId = reader.readVarInt(); - scale = reader.readByte(); - locked = reader.readBoolean(); - trackingPosition = reader.readBoolean(); - - if (trackingPosition) { - int iconCount = reader.readVarInt(); - icons = new Icon[iconCount]; - for (int i = 0; i < iconCount; i++) { - icons[i] = new Icon(); - icons[i].read(reader); - } - } else { - icons = new Icon[0]; - } - - columns = reader.readByte(); - if (columns <= 0) { - return; - } - - rows = reader.readByte(); - x = reader.readByte(); - z = reader.readByte(); - int dataLength = reader.readVarInt(); - data = reader.readBytes(dataLength); } @Override @@ -101,77 +79,20 @@ public class MapDataPacket implements ComponentHoldingServerPacket { return ServerPacketIdentifier.MAP_DATA; } - @Override - public @NotNull Collection components() { - if (icons == null || icons.length == 0) { - return Collections.emptyList(); - } else { - List components = new ArrayList<>(); - for (Icon icon : icons) { - components.add(icon.displayName); - } - return components; + public record Icon(int type, byte x, byte z, byte direction, + @Nullable Component displayName) implements Writeable { + public Icon(BinaryReader reader) { + this(reader.readVarInt(), reader.readByte(), reader.readByte(), reader.readByte(), + reader.readBoolean() ? reader.readComponent() : null); } - } - - @Override - public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { - if (this.icons == null || this.icons.length == 0) { - return this; - } else { - MapDataPacket packet = new MapDataPacket(); - packet.mapId = this.mapId; - packet.scale = this.scale; - packet.trackingPosition = this.trackingPosition; - packet.locked = this.locked; - packet.columns = this.columns; - packet.rows = this.rows; - packet.x = this.x; - packet.z = this.z; - packet.data = this.data; - - packet.icons = Arrays.copyOf(this.icons, this.icons.length); - for (Icon icon : packet.icons) { - icon.displayName = operator.apply(icon.displayName); - } - - return packet; - } - } - - public static class Icon implements Writeable, Readable { - public int type; - public byte x, z; - public byte direction; - public Component displayName; public void write(BinaryWriter writer) { writer.writeVarInt(type); writer.writeByte(x); writer.writeByte(z); writer.writeByte(direction); - - final boolean hasDisplayName = displayName != null; - writer.writeBoolean(hasDisplayName); - if (hasDisplayName) { - writer.writeComponent(displayName); - } - } - - @Override - public void read(@NotNull BinaryReader reader) { - type = reader.readVarInt(); - x = reader.readByte(); - z = reader.readByte(); - direction = reader.readByte(); - - boolean hasDisplayName = reader.readBoolean(); - if (hasDisplayName) { - displayName = reader.readComponent(); - } else { - displayName = null; - } + writer.writeBoolean(displayName != null); + if (displayName != null) writer.writeComponent(displayName); } } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/MultiBlockChangePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/MultiBlockChangePacket.java index 007025218..8373dae03 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/MultiBlockChangePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/MultiBlockChangePacket.java @@ -1,83 +1,34 @@ package net.minestom.server.network.packet.server.play; -import net.minestom.server.coordinate.Vec; -import net.minestom.server.instance.Chunk; -import net.minestom.server.instance.block.Block; 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.Writeable; import org.jetbrains.annotations.NotNull; -public class MultiBlockChangePacket implements ServerPacket { - public int chunkX; - public int chunkZ; - public int section; - //TODO this is important prob if we add a light api - public boolean suppressLightUpdates = true; - public BlockEntry[] blockChanges = new BlockEntry[0]; +public record MultiBlockChangePacket(long chunkSectionPosition, + boolean suppressLightUpdates, + long[] blocks) implements ServerPacket { + public MultiBlockChangePacket(int chunkX, int section, int chunkZ, + boolean suppressLightUpdates, + long[] blocks) { + this(((long) (chunkX & 0x3FFFFF) << 42) | (section & 0xFFFFF) | ((long) (chunkZ & 0x3FFFFF) << 20), + suppressLightUpdates, blocks); + } - public MultiBlockChangePacket() { + public MultiBlockChangePacket(BinaryReader reader) { + this(reader.readLong(), reader.readBoolean(), reader.readLongArray()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeLong(((long) (chunkX & 0x3FFFFF) << 42) | (section & 0xFFFFF) | ((long) (chunkZ & 0x3FFFFF) << 20)); + writer.writeLong(chunkSectionPosition); writer.writeBoolean(suppressLightUpdates); - writer.writeArray(blockChanges); - } - - @Override - public void read(@NotNull BinaryReader reader) { - final long chunkIndexWithSection = reader.readLong(); - this.chunkX = (int) ((chunkIndexWithSection >> 42) & 4194303L); - this.chunkZ = (int) ((chunkIndexWithSection >> 20) & 4194303L); - this.section = (int) (chunkIndexWithSection & 1048575L); - - this.suppressLightUpdates = reader.readBoolean(); - - final int blockChangeCount = reader.readVarInt(); - this.blockChanges = new BlockEntry[blockChangeCount]; - for (int i = 0; i < blockChangeCount; i++) { - final long encodedChange = reader.readVarLong(); - final short localPos = (short) (encodedChange & 0x0F_FF); - final int x = (localPos >> 8) % Chunk.CHUNK_SIZE_X; - final int y = localPos & 0xF; - final int z = (localPos >> 4) % Chunk.CHUNK_SIZE_Z; - final Block block = Block.fromStateId((short) (encodedChange >> 12)); - blockChanges[i] = new BlockEntry(new Vec(x, y, z), block); - } + writer.writeLongArray(blocks); } @Override public int getId() { return ServerPacketIdentifier.MULTI_BLOCK_CHANGE; } - - public static final class BlockEntry implements Writeable { - private final Vec chunkPosition; - public final Block block; - - public BlockEntry(Vec chunkPosition, Block block) { - this.chunkPosition = chunkPosition; - this.block = block; - } - - public Vec chunkPosition() { - return chunkPosition; - } - - public Block block() { - return block; - } - - @Override - public void write(@NotNull BinaryWriter writer) { - writer.writeVarLong((long) block.stateId() << 12 | - ((long) chunkPosition.blockX() << 8 | - (long) chunkPosition.blockZ() << 4 | - chunkPosition.blockY())); - } - } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/NamedSoundEffectPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/NamedSoundEffectPacket.java index ec15cd0b3..54f848a92 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/NamedSoundEffectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/NamedSoundEffectPacket.java @@ -8,23 +8,18 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class NamedSoundEffectPacket implements ServerPacket { - - public String soundName; - public Source soundSource; - public int x, y, z; - public float volume; - public float pitch; - - public NamedSoundEffectPacket() { - soundName = ""; - soundSource = Source.AMBIENT; +public record NamedSoundEffectPacket(String soundName, Source source, int x, int y, int z, + float volume, float pitch) implements ServerPacket { + public NamedSoundEffectPacket(BinaryReader reader) { + this(reader.readSizedString(), Source.values()[reader.readVarInt()], + reader.readInt() / 8, reader.readInt() / 8, reader.readInt() / 8, + reader.readFloat(), reader.readFloat()); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeSizedString(soundName); - writer.writeVarInt(AdventurePacketConvertor.getSoundSourceValue(soundSource)); + writer.writeVarInt(AdventurePacketConvertor.getSoundSourceValue(source)); writer.writeInt(x * 8); writer.writeInt(y * 8); writer.writeInt(z * 8); @@ -32,17 +27,6 @@ public class NamedSoundEffectPacket implements ServerPacket { writer.writeFloat(pitch); } - @Override - public void read(@NotNull BinaryReader reader) { - soundName = reader.readSizedString(); - 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.NAMED_SOUND_EFFECT; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/NbtQueryResponsePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/NbtQueryResponsePacket.java index 05a0ffd98..ff3f38601 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/NbtQueryResponsePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/NbtQueryResponsePacket.java @@ -1,53 +1,28 @@ 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.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.NBTEnd; -import org.jglrxavpok.hephaistos.nbt.NBTException; -import java.io.IOException; - -public class NbtQueryResponsePacket implements ServerPacket { - - public int transactionId; - public NBTCompound nbtCompound; - - public NbtQueryResponsePacket() {} +public record NbtQueryResponsePacket(int transactionId, NBTCompound data) implements ServerPacket { + public NbtQueryResponsePacket(BinaryReader reader) { + this(reader.readVarInt(), (NBTCompound) reader.readTag()); + } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(transactionId); - if (nbtCompound != null) { - writer.writeNBT("", nbtCompound); + if (data != null) { + writer.writeNBT("", data); } else { // TAG_End writer.writeByte((byte) 0x00); } } - @Override - public void read(@NotNull BinaryReader reader) { - transactionId = reader.readVarInt(); - try { - NBT nbt = reader.readTag(); - - if (nbt instanceof NBTEnd) { - return; - } - - nbtCompound = (NBTCompound) nbt; - } catch (IOException | NBTException e) { - MinecraftServer.getExceptionManager().handleException(e); - // TODO: should we throw? the packet is not valid - } - } - @Override public int getId() { return ServerPacketIdentifier.NBT_QUERY_RESPONSE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/OpenBookPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/OpenBookPacket.java index ad5695538..a8b6af1f7 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/OpenBookPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/OpenBookPacket.java @@ -7,16 +7,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class OpenBookPacket implements ServerPacket { - - public Player.Hand hand; - - public OpenBookPacket(Player.Hand hand) { - this.hand = hand; - } - - public OpenBookPacket() { - this(Player.Hand.MAIN); +public record OpenBookPacket(Player.Hand hand) implements ServerPacket { + public OpenBookPacket(BinaryReader reader) { + this(Player.Hand.values()[reader.readVarInt()]); } @Override @@ -24,11 +17,6 @@ public class OpenBookPacket implements ServerPacket { writer.writeVarInt(hand.ordinal()); } - @Override - public void read(@NotNull BinaryReader reader) { - hand = Player.Hand.values()[reader.readVarInt()]; - } - @Override public int getId() { return ServerPacketIdentifier.OPEN_BOOK; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/OpenHorseWindowPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/OpenHorseWindowPacket.java index 376e4a189..295bf6a1e 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/OpenHorseWindowPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/OpenHorseWindowPacket.java @@ -6,11 +6,10 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class OpenHorseWindowPacket implements ServerPacket { - - public byte windowId; - public int slotCount; - public int entityId; +public record OpenHorseWindowPacket(byte windowId, int slotCount, int entityId) implements ServerPacket { + public OpenHorseWindowPacket(BinaryReader reader) { + this(reader.readByte(), reader.readVarInt(), reader.readInt()); + } @Override public void write(@NotNull BinaryWriter writer) { @@ -19,13 +18,6 @@ public class OpenHorseWindowPacket implements ServerPacket { writer.writeInt(entityId); } - @Override - public void read(@NotNull BinaryReader reader) { - windowId = reader.readByte(); - slotCount = reader.readVarInt(); - entityId = reader.readInt(); - } - @Override public int getId() { return ServerPacketIdentifier.OPEN_HORSE_WINDOW; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/OpenSignEditorPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/OpenSignEditorPacket.java index 06a22eb5e..81aaddab0 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/OpenSignEditorPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/OpenSignEditorPacket.java @@ -1,32 +1,20 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Point; 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.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; -public class OpenSignEditorPacket implements ServerPacket { - - /** - * WARNING: There must be a sign in this location (you can send a BlockChangePacket beforehand) - */ - public Point signPosition; - - public OpenSignEditorPacket() { - signPosition = Vec.ZERO; +public record OpenSignEditorPacket(Point position) implements ServerPacket { + public OpenSignEditorPacket(BinaryReader reader) { + this(reader.readBlockPosition()); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeBlockPosition(signPosition); - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.signPosition = reader.readBlockPosition(); + writer.writeBlockPosition(position); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/OpenWindowPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/OpenWindowPacket.java index f8ca80130..96755cdfc 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/OpenWindowPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/OpenWindowPacket.java @@ -7,17 +7,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class OpenWindowPacket implements ServerPacket { - - public int windowId; - public int windowType; - public Component title = Component.text(""); - - public OpenWindowPacket() { - } - - public OpenWindowPacket(Component title) { - this.title = title; +public record OpenWindowPacket(int windowId, int windowType, Component title) implements ServerPacket { + public OpenWindowPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarInt(), reader.readComponent()); } @Override @@ -27,13 +19,6 @@ public class OpenWindowPacket implements ServerPacket { writer.writeComponent(title); } - @Override - public void read(@NotNull BinaryReader reader) { - windowId = reader.readVarInt(); - windowType = reader.readVarInt(); - title = reader.readComponent(); - } - @Override public int getId() { return ServerPacketIdentifier.OPEN_WINDOW; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ParticlePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ParticlePacket.java index 005ca13c8..3c717308a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ParticlePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ParticlePacket.java @@ -6,19 +6,15 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ParticlePacket implements ServerPacket { - - public int particleId; - public boolean longDistance; - public double x, y, z; - public float offsetX, offsetY, offsetZ; - public float particleData; - public int particleCount; - - public byte[] data; - - public ParticlePacket() { - data = new byte[0]; +public record ParticlePacket(int particleId, boolean longDistance, + double x, double y, double z, + float offsetX, float offsetY, float offsetZ, + float particleData, int particleCount, byte[] data) implements ServerPacket { + public ParticlePacket(BinaryReader reader) { + this(reader.readInt(), reader.readBoolean(), + reader.readDouble(), reader.readDouble(), reader.readDouble(), + reader.readFloat(), reader.readFloat(), reader.readFloat(), + reader.readFloat(), reader.readInt(), reader.readRemainingBytes()); } @Override @@ -37,22 +33,6 @@ public class ParticlePacket implements ServerPacket { writer.writeBytes(data); } - @Override - public void read(@NotNull BinaryReader reader) { - particleId = reader.readInt(); - longDistance = reader.readBoolean(); - x = reader.readDouble(); - y = reader.readDouble(); - z = reader.readDouble(); - offsetX = reader.readFloat(); - offsetY = reader.readFloat(); - offsetZ = reader.readFloat(); - particleData = reader.readFloat(); - particleCount = reader.readInt(); - - data = reader.readRemainingBytes(); - } - @Override public int getId() { return ServerPacketIdentifier.PARTICLE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PingPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PingPacket.java index e5aa01de8..8c4ad6723 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PingPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PingPacket.java @@ -6,13 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class PingPacket implements ServerPacket { - - public int id; - - @Override - public void read(@NotNull BinaryReader reader) { - this.id = reader.readInt(); +public record PingPacket(int id) implements ServerPacket { + public PingPacket(BinaryReader reader) { + this(reader.readInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PlayerAbilitiesPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PlayerAbilitiesPacket.java index 4035c86ad..2fed46fdf 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PlayerAbilitiesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PlayerAbilitiesPacket.java @@ -6,24 +6,14 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class PlayerAbilitiesPacket implements ServerPacket { - public static final byte FLAG_INVULNERABLE = 0x01; - public static final byte FLAG_FLYING = 0x02; - public static final byte FLAG_ALLOW_FLYING = 0x04; +public record PlayerAbilitiesPacket(byte flags, float flyingSpeed, float fieldViewModifier) implements ServerPacket { + public static final byte FLAG_INVULNERABLE = 0x01; + public static final byte FLAG_FLYING = 0x02; + public static final byte FLAG_ALLOW_FLYING = 0x04; public static final byte FLAG_INSTANT_BREAK = 0x08; - public byte flags; - public float flyingSpeed; - public float fieldViewModifier; - - public PlayerAbilitiesPacket(byte flags, float flyingSpeed, float fieldViewModifier) { - this.flags = flags; - this.flyingSpeed = flyingSpeed; - this.fieldViewModifier = fieldViewModifier; - } - - public PlayerAbilitiesPacket() { - this((byte) 0, 0f, 0f); + public PlayerAbilitiesPacket(BinaryReader reader) { + this(reader.readByte(), reader.readFloat(), reader.readFloat()); } @Override @@ -33,13 +23,6 @@ public class PlayerAbilitiesPacket implements ServerPacket { writer.writeFloat(fieldViewModifier); } - @Override - public void read(@NotNull BinaryReader reader) { - this.flags = reader.readByte(); - this.flyingSpeed = reader.readFloat(); - this.fieldViewModifier = reader.readFloat(); - } - @Override public int getId() { return ServerPacketIdentifier.PLAYER_ABILITIES; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PlayerInfoPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PlayerInfoPacket.java index 1af258e5f..7a316ea5a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PlayerInfoPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PlayerInfoPacket.java @@ -11,53 +11,50 @@ import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.UnaryOperator; -public class PlayerInfoPacket implements ComponentHoldingServerPacket { +public final class PlayerInfoPacket implements ComponentHoldingServerPacket { + private final Action action; + private final List entries; - public Action action; - public List playerInfos; - - PlayerInfoPacket() { - this(Action.UPDATE_DISPLAY_NAME); + public PlayerInfoPacket(@NotNull Action action, @NotNull List entries) { + this.action = action; + this.entries = List.copyOf(entries); } - public PlayerInfoPacket(Action action) { - this.action = action; - this.playerInfos = new CopyOnWriteArrayList<>(); + public PlayerInfoPacket(BinaryReader reader) { + this.action = Action.values()[reader.readVarInt()]; + final int playerInfoCount = reader.readVarInt(); + this.entries = new ArrayList<>(playerInfoCount); + for (int i = 0; i < playerInfoCount; i++) { + final UUID uuid = reader.readUuid(); + this.entries.add(switch (action) { + case ADD_PLAYER -> new AddPlayer(uuid, reader); + case UPDATE_GAMEMODE -> new UpdateGameMode(uuid, reader); + case UPDATE_LATENCY -> new UpdateLatency(uuid, reader); + case UPDATE_DISPLAY_NAME -> new UpdateDisplayName(uuid, reader); + case REMOVE_PLAYER -> new RemovePlayer(uuid); + }); + } } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(action.ordinal()); - writer.writeVarInt(playerInfos.size()); - - for (PlayerInfo playerInfo : this.playerInfos) { - if (!playerInfo.getClass().equals(action.getClazz())) continue; - writer.writeUuid(playerInfo.uuid); - playerInfo.write(writer); + writer.writeVarInt(entries.size()); + for (Entry entry : this.entries) { + if (!entry.getClass().equals(action.getClazz())) continue; + writer.writeUuid(entry.uuid()); + entry.write(writer); } } - @Override - public void read(@NotNull BinaryReader reader) { - action = Action.values()[reader.readVarInt()]; - int playerInfoCount = reader.readVarInt(); + public Action action() { + return action; + } - playerInfos = new ArrayList<>(playerInfoCount); - - for (int i = 0; i < playerInfoCount; i++) { - UUID uuid = reader.readUuid(); - PlayerInfo info = switch (action) { - case ADD_PLAYER -> new AddPlayer(uuid, reader); - case UPDATE_GAMEMODE -> new UpdateGamemode(uuid, reader); - case UPDATE_LATENCY -> new UpdateLatency(uuid, reader); - case UPDATE_DISPLAY_NAME -> new UpdateDisplayName(uuid, reader); - case REMOVE_PLAYER -> new RemovePlayer(uuid); - }; - playerInfos.set(i, info); - } + public List entries() { + return entries; } @Override @@ -65,15 +62,28 @@ public class PlayerInfoPacket implements ComponentHoldingServerPacket { return ServerPacketIdentifier.PLAYER_INFO; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PlayerInfoPacket)) return false; + PlayerInfoPacket that = (PlayerInfoPacket) o; + return action == that.action && entries.equals(that.entries); + } + + @Override + public int hashCode() { + return Objects.hash(action, entries); + } + @Override public @NotNull Collection components() { switch (this.action) { case ADD_PLAYER: case UPDATE_DISPLAY_NAME: List components = new ArrayList<>(); - for (PlayerInfo playerInfo : playerInfos) { - if (playerInfo instanceof ComponentHolder) { - components.addAll(((ComponentHolder) playerInfo).components()); + for (Entry entry : entries) { + if (entry instanceof ComponentHolder) { + components.addAll(((ComponentHolder) entry).components()); } } return components; @@ -84,89 +94,55 @@ public class PlayerInfoPacket implements ComponentHoldingServerPacket { @Override public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { - switch (this.action) { - case ADD_PLAYER: - case UPDATE_DISPLAY_NAME: - PlayerInfoPacket packet = new PlayerInfoPacket(action); - packet.playerInfos = new ArrayList<>(playerInfos.size()); - for (PlayerInfo playerInfo : playerInfos) { - if (playerInfo instanceof ComponentHolder) { - playerInfos.add(((ComponentHolder) playerInfo).copyWithOperator(operator)); + return switch (action) { + case ADD_PLAYER, UPDATE_DISPLAY_NAME -> { + List entries = new ArrayList<>(this.entries.size()); + for (Entry entry : this.entries) { + if (entry instanceof ComponentHolder) { + entries.add(((ComponentHolder) entry).copyWithOperator(operator)); } else { - playerInfos.add(playerInfo); + entries.add(entry); } } - default: - return this; - } + yield new PlayerInfoPacket(action, entries); + } + default -> this; + }; } public enum Action { - ADD_PLAYER(AddPlayer.class), - UPDATE_GAMEMODE(UpdateGamemode.class), + UPDATE_GAMEMODE(UpdateGameMode.class), UPDATE_LATENCY(UpdateLatency.class), UPDATE_DISPLAY_NAME(UpdateDisplayName.class), REMOVE_PLAYER(RemovePlayer.class); - private final Class clazz; + private final Class clazz; - Action(Class clazz) { + Action(Class clazz) { this.clazz = clazz; } @NotNull - public Class getClazz() { + public Class getClazz() { return clazz; } } - public static abstract class PlayerInfo { + public sealed interface Entry + permits AddPlayer, UpdateGameMode, UpdateLatency, UpdateDisplayName, RemovePlayer { + void write(BinaryWriter writer); - public UUID uuid; - - public PlayerInfo(UUID uuid) { - this.uuid = uuid; - } - - public abstract void write(BinaryWriter writer); + UUID uuid(); } - public static class AddPlayer extends PlayerInfo implements ComponentHolder { - - public String name; - public List properties; - public GameMode gameMode; - public int ping; - public Component displayName; - - public AddPlayer(UUID uuid, String name, GameMode gameMode, int ping) { - super(uuid); - this.name = name; - this.properties = new ArrayList<>(); - this.gameMode = gameMode; - this.ping = ping; - } - - AddPlayer(UUID uuid, BinaryReader reader) { - super(uuid); - name = reader.readSizedString(); - int propertyCount = reader.readVarInt(); - - properties = new ArrayList<>(propertyCount); - for (int i = 0; i < propertyCount; i++) { - properties.set(i, new Property(reader)); - } - - gameMode = GameMode.fromId((byte) reader.readVarInt()); - ping = reader.readVarInt(); - boolean hasDisplayName = reader.readBoolean(); - - if (hasDisplayName) { - displayName = reader.readComponent(); - } else { - displayName = null; - } + public record AddPlayer(UUID uuid, String name, List properties, GameMode gameMode, int ping, + Component displayName) implements Entry, ComponentHolder { + public AddPlayer(UUID uuid, BinaryReader reader) { + this(uuid, reader.readSizedString(), + reader.readVarIntList(Property::new), + GameMode.values()[reader.readVarInt()], reader.readVarInt(), + reader.readBoolean() ? reader.readComponent() : null); } @Override @@ -181,54 +157,27 @@ public class PlayerInfoPacket implements ComponentHoldingServerPacket { final boolean hasDisplayName = displayName != null; writer.writeBoolean(hasDisplayName); - if (hasDisplayName) - writer.writeComponent(displayName); + if (hasDisplayName) writer.writeComponent(displayName); } @Override public @NotNull Collection components() { - if (displayName == null) { - return Collections.emptyList(); - } else { - return Collections.singleton(displayName); - } + return displayName != null ? Collections.singleton(displayName) : Collections.emptyList(); } @Override public @NotNull AddPlayer copyWithOperator(@NotNull UnaryOperator operator) { - if (displayName == null) { - return this; - } else { - AddPlayer addPlayer = new AddPlayer(uuid, name, gameMode, ping); - addPlayer.displayName = operator.apply(displayName); - return addPlayer; - } + return displayName != null ? + new AddPlayer(uuid, name, properties, gameMode, ping, operator.apply(displayName)) : this; } - public static class Property { - - public String name; - public String value; - public String signature; - - public Property(String name, String value, String signature) { - this.name = name; - this.value = value; - this.signature = signature; - } - + public record Property(String name, String value, String signature) { public Property(String name, String value) { this(name, value, null); } - Property(BinaryReader reader) { - name = reader.readSizedString(); - value = reader.readSizedString(); - boolean hasSignature = reader.readBoolean(); - - if (hasSignature) { - signature = reader.readSizedString(); - } + public Property(BinaryReader reader) { + this(reader.readSizedString(), reader.readSizedString(), reader.readBoolean() ? reader.readSizedString() : null); } public void write(BinaryWriter writer) { @@ -237,24 +186,14 @@ public class PlayerInfoPacket implements ComponentHoldingServerPacket { final boolean signed = signature != null; writer.writeBoolean(signed); - if (signed) - writer.writeSizedString(signature); + if (signed) writer.writeSizedString(signature); } } } - public static class UpdateGamemode extends PlayerInfo { - - public GameMode gameMode; - - public UpdateGamemode(UUID uuid, GameMode gameMode) { - super(uuid); - this.gameMode = gameMode; - } - - UpdateGamemode(UUID uuid, BinaryReader reader) { - super(uuid); - gameMode = GameMode.fromId((byte) reader.readVarInt()); + public record UpdateGameMode(UUID uuid, GameMode gameMode) implements Entry { + public UpdateGameMode(UUID uuid, BinaryReader reader) { + this(uuid, GameMode.fromId((byte) reader.readVarInt())); } @Override @@ -263,18 +202,9 @@ public class PlayerInfoPacket implements ComponentHoldingServerPacket { } } - public static class UpdateLatency extends PlayerInfo { - - public int ping; - - public UpdateLatency(UUID uuid, int ping) { - super(uuid); - this.ping = ping; - } - - UpdateLatency(UUID uuid, BinaryReader reader) { - super(uuid); - ping = reader.readVarInt(); + public record UpdateLatency(UUID uuid, int ping) implements Entry { + public UpdateLatency(UUID uuid, BinaryReader reader) { + this(uuid, reader.readVarInt()); } @Override @@ -283,58 +213,31 @@ public class PlayerInfoPacket implements ComponentHoldingServerPacket { } } - public static class UpdateDisplayName extends PlayerInfo implements ComponentHolder { - - public Component displayName; - - public UpdateDisplayName(UUID uuid, Component displayName) { - super(uuid); - this.displayName = displayName; - } - - UpdateDisplayName(UUID uuid, BinaryReader reader) { - super(uuid); - boolean hasDisplayName = reader.readBoolean(); - if (hasDisplayName) { - displayName = reader.readComponent(); - } else { - displayName = null; - } + public record UpdateDisplayName(UUID uuid, + Component displayName) implements Entry, ComponentHolder { + public UpdateDisplayName(UUID uuid, BinaryReader reader) { + this(uuid, reader.readBoolean() ? reader.readComponent() : null); } @Override public void write(BinaryWriter writer) { final boolean hasDisplayName = displayName != null; writer.writeBoolean(hasDisplayName); - if (hasDisplayName) - writer.writeComponent(displayName); + if (hasDisplayName) writer.writeComponent(displayName); } @Override public @NotNull Collection components() { - if (displayName == null) { - return Collections.emptyList(); - } else { - return Collections.singleton(displayName); - } + return displayName != null ? Collections.singleton(displayName) : Collections.emptyList(); } @Override public @NotNull UpdateDisplayName copyWithOperator(@NotNull UnaryOperator operator) { - if (displayName == null) { - return this; - } else { - return new UpdateDisplayName(uuid, operator.apply(displayName)); - } + return displayName != null ? new UpdateDisplayName(uuid, operator.apply(displayName)) : this; } } - public static class RemovePlayer extends PlayerInfo { - - public RemovePlayer(UUID uuid) { - super(uuid); - } - + public record RemovePlayer(UUID uuid) implements Entry { @Override public void write(BinaryWriter writer) { } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PlayerListHeaderAndFooterPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PlayerListHeaderAndFooterPacket.java index 28361a613..4e506aea2 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PlayerListHeaderAndFooterPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PlayerListHeaderAndFooterPacket.java @@ -7,7 +7,6 @@ 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; import java.util.ArrayList; import java.util.Collection; @@ -15,17 +14,10 @@ import java.util.List; import java.util.Objects; import java.util.function.UnaryOperator; -public class PlayerListHeaderAndFooterPacket implements ComponentHoldingServerPacket { - public Component header; - public Component footer; - - public PlayerListHeaderAndFooterPacket() { - this(null, null); - } - - public PlayerListHeaderAndFooterPacket(@Nullable Component header, @Nullable Component footer) { - this.header = header; - this.footer = footer; +public record PlayerListHeaderAndFooterPacket(Component header, + Component footer) implements ComponentHoldingServerPacket { + public PlayerListHeaderAndFooterPacket(BinaryReader reader) { + this(reader.readComponent(), reader.readComponent()); } @Override @@ -51,11 +43,6 @@ public class PlayerListHeaderAndFooterPacket implements ComponentHoldingServerPa return new PlayerListHeaderAndFooterPacket(header == null ? null : operator.apply(header), footer == null ? null : operator.apply(footer)); } - public void read(@NotNull BinaryReader reader) { - header = reader.readComponent(); - footer = reader.readComponent(); - } - @Override public int getId() { return ServerPacketIdentifier.PLAYER_LIST_HEADER_AND_FOOTER; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PlayerPositionAndLookPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PlayerPositionAndLookPacket.java index 8d7d01dbe..6e1409e52 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PlayerPositionAndLookPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PlayerPositionAndLookPacket.java @@ -7,22 +7,11 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class PlayerPositionAndLookPacket implements ServerPacket { - - public Pos position; - public byte flags; - public int teleportId; - public boolean dismountVehicle; - - public PlayerPositionAndLookPacket(Pos position, byte flags, int teleportId, boolean dismountVehicle) { - this.position = position; - this.flags = flags; - this.teleportId = teleportId; - this.dismountVehicle = dismountVehicle; - } - - public PlayerPositionAndLookPacket() { - this(Pos.ZERO, (byte) 0, 0, false); +public record PlayerPositionAndLookPacket(Pos position, byte flags, int teleportId, + boolean dismountVehicle) implements ServerPacket { + public PlayerPositionAndLookPacket(BinaryReader reader) { + this(new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), reader.readFloat(), reader.readFloat()), + reader.readByte(), reader.readVarInt(), reader.readBoolean()); } @Override @@ -39,15 +28,6 @@ public class PlayerPositionAndLookPacket implements ServerPacket { writer.writeBoolean(dismountVehicle); } - @Override - public void read(@NotNull BinaryReader reader) { - position = new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), reader.readFloat(), reader.readFloat()); - - flags = reader.readByte(); - teleportId = reader.readVarInt(); - dismountVehicle = reader.readBoolean(); - } - @Override public int getId() { return ServerPacketIdentifier.PLAYER_POSITION_AND_LOOK; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PluginMessagePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PluginMessagePacket.java index 32efda9f9..115a005a7 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PluginMessagePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PluginMessagePacket.java @@ -7,18 +7,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class PluginMessagePacket implements ServerPacket { - - public String channel; - public byte[] data; - - public PluginMessagePacket(String channel, byte[] data) { - this.channel = channel; - this.data = data; - } - - public PluginMessagePacket() { - this("none", new byte[0]); +public record PluginMessagePacket(String channel, byte[] data) implements ServerPacket { + public PluginMessagePacket(BinaryReader reader) { + this(reader.readSizedString(), reader.readRemainingBytes()); } @Override @@ -27,12 +18,6 @@ public class PluginMessagePacket implements ServerPacket { writer.writeBytes(data); } - @Override - public void read(@NotNull BinaryReader reader) { - channel = reader.readSizedString(); - data = reader.readRemainingBytes(); - } - @Override public int getId() { return ServerPacketIdentifier.PLUGIN_MESSAGE; @@ -45,17 +30,10 @@ public class PluginMessagePacket implements ServerPacket { * * @return the current brand name packet */ - @NotNull - public static PluginMessagePacket getBrandPacket() { - PluginMessagePacket brandMessage = new PluginMessagePacket(); - brandMessage.channel = "minecraft:brand"; - + public static @NotNull PluginMessagePacket getBrandPacket() { final String brandName = MinecraftServer.getBrandName(); BinaryWriter writer = new BinaryWriter(4 + brandName.length()); writer.writeSizedString(brandName); - - brandMessage.data = writer.toByteArray(); - - return brandMessage; + return new PluginMessagePacket("minecraft:brand", writer.toByteArray()); } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/RemoveEntityEffectPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/RemoveEntityEffectPacket.java index 7a989e92a..e3b4e9d9e 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/RemoveEntityEffectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/RemoveEntityEffectPacket.java @@ -7,23 +7,15 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class RemoveEntityEffectPacket implements ServerPacket { - - public int entityId; - public PotionEffect effect = PotionEffect.ABSORPTION; - - public RemoveEntityEffectPacket() {} +public record RemoveEntityEffectPacket(int entityId, PotionEffect potionEffect) implements ServerPacket { + public RemoveEntityEffectPacket(BinaryReader reader) { + this(reader.readVarInt(), PotionEffect.fromId(reader.readByte())); + } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(entityId); - writer.writeByte((byte) effect.id()); - } - - @Override - public void read(@NotNull BinaryReader reader) { - entityId = reader.readVarInt(); - effect = PotionEffect.fromId(reader.readByte()); + writer.writeByte((byte) potionEffect.id()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ResourcePackSendPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ResourcePackSendPacket.java index 015bc503f..c948adc18 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ResourcePackSendPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ResourcePackSendPacket.java @@ -8,21 +8,16 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class ResourcePackSendPacket implements ServerPacket { - - public String url = ""; - public String hash = "0000000000000000000000000000000000000000"; // Size 40 - public boolean forced; - public Component forcedMessage; - - public ResourcePackSendPacket() { +public record ResourcePackSendPacket(String url, String hash, boolean forced, + Component forcedMessage) implements ServerPacket { + public ResourcePackSendPacket(BinaryReader reader) { + this(reader.readSizedString(), reader.readSizedString(), reader.readBoolean(), + reader.readBoolean() ? reader.readComponent() : null); } public ResourcePackSendPacket(@NotNull ResourcePack resourcePack) { - this.url = resourcePack.getUrl(); - this.hash = resourcePack.getHash(); - this.forced = resourcePack.isForced(); - this.forcedMessage = resourcePack.getForcedMessage(); + this(resourcePack.getUrl(), resourcePack.getHash(), resourcePack.isForced(), + resourcePack.getForcedMessage()); } @Override @@ -38,20 +33,6 @@ public class ResourcePackSendPacket implements ServerPacket { } } - @Override - public void read(@NotNull BinaryReader reader) { - this.url = reader.readSizedString(); - this.hash = reader.readSizedString(); - this.forced = reader.readBoolean(); - - final boolean hasMessage = reader.readBoolean(); - if (hasMessage) { - this.forcedMessage = reader.readComponent(); - } else { - this.forcedMessage = null; - } - } - @Override public int getId() { return ServerPacketIdentifier.RESOURCE_PACK_SEND; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/RespawnPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/RespawnPacket.java index 6eb5b2e20..1ad13b546 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/RespawnPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/RespawnPacket.java @@ -8,60 +8,28 @@ 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 { - - public DimensionType dimensionType; - public long hashedSeed; - public GameMode gameMode; - public boolean isDebug = false; - public boolean isFlat = true; - public boolean copyMeta = true; - - public RespawnPacket() { - dimensionType = DimensionType.OVERWORLD; - gameMode = GameMode.SURVIVAL; +public record RespawnPacket(DimensionType dimensionType, String worldName, + long hashedSeed, GameMode gameMode, GameMode previousGameMode, + boolean isDebug, boolean isFlat, boolean copyMeta) implements ServerPacket { + public RespawnPacket(BinaryReader reader) { + this(DimensionType.fromNBT((NBTCompound) reader.readTag()), reader.readSizedString(), + reader.readLong(), GameMode.values()[reader.readByte()], GameMode.values()[reader.readByte()], + reader.readBoolean(), reader.readBoolean(), reader.readBoolean()); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeNBT("", dimensionType.toNBT()); - - // Warning: must be different for each dimension type! Otherwise the client seems to cache the world name - writer.writeSizedString(dimensionType.getName().toString()); - + writer.writeSizedString(worldName); writer.writeLong(hashedSeed); writer.writeByte(gameMode.getId()); - writer.writeByte(gameMode.getId()); // Hardcore flag not included + writer.writeByte(previousGameMode.getId()); // Hardcore flag not included writer.writeBoolean(isDebug); writer.writeBoolean(isFlat); writer.writeBoolean(copyMeta); } - @Override - public void read(@NotNull BinaryReader reader) { - try { - dimensionType = DimensionType.fromNBT((NBTCompound) reader.readTag()); - - // dimension type name - reader.readSizedString(); - - 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ScoreboardObjectivePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ScoreboardObjectivePacket.java index 530b3cb95..6a26c4253 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ScoreboardObjectivePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ScoreboardObjectivePacket.java @@ -7,60 +7,47 @@ 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; import java.util.Collection; import java.util.Collections; import java.util.function.UnaryOperator; -public class ScoreboardObjectivePacket implements ComponentHoldingServerPacket { +public record ScoreboardObjectivePacket(@NotNull String objectiveName, byte mode, + @Nullable Component objectiveValue, + @Nullable Type type) implements ComponentHoldingServerPacket { + public ScoreboardObjectivePacket(BinaryReader reader) { + this(read(reader)); + } - /** - * An unique name for the objective - */ - public String objectiveName; - /** - * 0 = create the scoreboard
- * 1 = to remove the scoreboard
- * 2 = to update the display text - */ - public byte mode; - /** - * The text to be displayed for the score - */ - public Component objectiveValue; // Only text - /** - * The type how the score is displayed - */ - public Type type; + private ScoreboardObjectivePacket(ScoreboardObjectivePacket packet) { + this(packet.objectiveName, packet.mode, packet.objectiveValue, packet.type); + } - public ScoreboardObjectivePacket() { - objectiveName = ""; - objectiveValue = Component.empty(); - type = Type.INTEGER; + private static ScoreboardObjectivePacket read(BinaryReader reader) { + var objectiveName = reader.readSizedString(); + var mode = reader.readByte(); + Component objectiveValue = null; + Type type = null; + if (mode == 0 || mode == 2) { + objectiveValue = reader.readComponent(); + type = Type.values()[reader.readVarInt()]; + } + return new ScoreboardObjectivePacket(objectiveName, mode, objectiveValue, type); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeSizedString(objectiveName); writer.writeByte(mode); - if (mode == 0 || mode == 2) { + assert objectiveValue != null; writer.writeComponent(objectiveValue); + assert type != null; writer.writeVarInt(type.ordinal()); } } - @Override - public void read(@NotNull BinaryReader reader) { - objectiveName = reader.readSizedString(); - mode = reader.readByte(); - - if (mode == 0 || mode == 2) { - objectiveValue = reader.readComponent(); - type = Type.values()[reader.readVarInt()]; - } - } - @Override public int getId() { return ServerPacketIdentifier.SCOREBOARD_OBJECTIVE; @@ -68,25 +55,14 @@ public class ScoreboardObjectivePacket implements ComponentHoldingServerPacket { @Override public @NotNull Collection components() { - if (mode == 0 || mode == 2) { - return Collections.singleton(objectiveValue); - } else { - return Collections.emptyList(); - } + return mode == 0 || mode == 2 ? Collections.singleton(objectiveValue) : + Collections.emptyList(); } @Override public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { - if (mode == 0 || mode == 2) { - ScoreboardObjectivePacket packet = new ScoreboardObjectivePacket(); - packet.objectiveName = objectiveName; - packet.mode = mode; - packet.objectiveValue = operator.apply(objectiveValue); - packet.type = type; - return packet; - } else { - return this; - } + return mode == 0 || mode == 2 ? new ScoreboardObjectivePacket(objectiveName, mode, + operator.apply(objectiveValue), type) : this; } /** diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SculkVibrationSignal.java b/src/main/java/net/minestom/server/network/packet/server/play/SculkVibrationSignal.java index 64953cbb7..c43a9197c 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SculkVibrationSignal.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SculkVibrationSignal.java @@ -3,7 +3,6 @@ package net.minestom.server.network.packet.server.play; import net.minestom.server.coordinate.Point; 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; @@ -14,11 +13,6 @@ public class SculkVibrationSignal implements ServerPacket { // TODO 'varies' destination public int arrivalTicks; - @Override - public void read(@NotNull BinaryReader reader) { - - } - @Override public void write(@NotNull BinaryWriter writer) { diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SelectAdvancementTabPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SelectAdvancementTabPacket.java index 657797fe1..9b142fa5a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SelectAdvancementTabPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SelectAdvancementTabPacket.java @@ -5,34 +5,17 @@ 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() { +public record SelectAdvancementTabPacket(String identifier) implements ServerPacket { + public SelectAdvancementTabPacket(BinaryReader reader) { + this(reader.readBoolean() ? reader.readSizedString() : null); } @Override public void write(@NotNull BinaryWriter writer) { final boolean hasId = identifier != null; - writer.writeBoolean(hasId); - if (hasId) { - writer.writeSizedString(identifier); - } - } - - @Override - public void read(@NotNull BinaryReader reader) { - boolean hasID = reader.readBoolean(); - if (hasID) { - identifier = reader.readSizedString(); - } else { - identifier = null; - } + if (hasId) writer.writeSizedString(identifier); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/ServerDifficultyPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/ServerDifficultyPacket.java index 1752e686b..79ffd519e 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/ServerDifficultyPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/ServerDifficultyPacket.java @@ -7,18 +7,9 @@ import net.minestom.server.utils.binary.BinaryWriter; import net.minestom.server.world.Difficulty; import org.jetbrains.annotations.NotNull; -public class ServerDifficultyPacket implements ServerPacket { - - public Difficulty difficulty; - public boolean locked; - - public ServerDifficultyPacket(Difficulty difficulty, boolean locked) { - this.difficulty = difficulty; - this.locked = locked; - } - - public ServerDifficultyPacket() { - this(Difficulty.NORMAL, false); +public record ServerDifficultyPacket(Difficulty difficulty, boolean locked) implements ServerPacket { + public ServerDifficultyPacket(BinaryReader reader) { + this(Difficulty.values()[reader.readByte()], reader.readBoolean()); } @Override @@ -27,12 +18,6 @@ public class ServerDifficultyPacket implements ServerPacket { 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetCooldownPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetCooldownPacket.java index b3de767b0..01ecefa8c 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetCooldownPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetCooldownPacket.java @@ -6,12 +6,10 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class SetCooldownPacket implements ServerPacket { - - public int itemId; - public int cooldownTicks; - - public SetCooldownPacket() {} +public record SetCooldownPacket(int itemId, int cooldownTicks) implements ServerPacket { + public SetCooldownPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarInt()); + } @Override public void write(@NotNull BinaryWriter writer) { @@ -19,12 +17,6 @@ public class SetCooldownPacket implements ServerPacket { writer.writeVarInt(cooldownTicks); } - @Override - public void read(@NotNull BinaryReader reader) { - itemId = reader.readVarInt(); - cooldownTicks = reader.readVarInt(); - } - @Override public int getId() { return ServerPacketIdentifier.SET_COOLDOWN; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetExperiencePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetExperiencePacket.java index 8e847f7b7..4c455a70c 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetExperiencePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetExperiencePacket.java @@ -6,20 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class SetExperiencePacket implements ServerPacket { - - public float percentage; - public int level; - public int totalExperience; - - public SetExperiencePacket(float percentage, int level, int totalExperience) { - this.percentage = percentage; - this.level = level; - this.totalExperience = totalExperience; - } - - public SetExperiencePacket() { - this(0, 0, 0); +public record SetExperiencePacket(float percentage, int level, int totalExperience) implements ServerPacket { + public SetExperiencePacket(BinaryReader reader) { + this(reader.readFloat(), reader.readVarInt(), reader.readVarInt()); } @Override @@ -29,13 +18,6 @@ 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetPassengersPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetPassengersPacket.java index 7344bf8e3..a1e3a2e20 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetPassengersPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetPassengersPacket.java @@ -6,25 +6,22 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class SetPassengersPacket implements ServerPacket { +import java.util.List; - public int vehicleEntityId; - public int[] passengersId; +public record SetPassengersPacket(int vehicleEntityId, + @NotNull List passengersId) implements ServerPacket { + public SetPassengersPacket { + passengersId = List.copyOf(passengersId); + } - public SetPassengersPacket() { - passengersId = new int[0]; + public SetPassengersPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarIntList(BinaryReader::readVarInt)); } @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(); + writer.writeVarIntList(passengersId, BinaryWriter::writeVarInt); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java index 75b79da98..990b05c28 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java @@ -7,22 +7,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class SetSlotPacket implements ServerPacket { - - public byte windowId; - public int stateId; - public short slot; - public ItemStack itemStack; - - public SetSlotPacket(byte windowId, int stateId, short slot, ItemStack itemStack) { - this.windowId = windowId; - this.stateId = stateId; - this.slot = slot; - this.itemStack = itemStack; - } - - public SetSlotPacket() { - this((byte) 0, 0, (short) 0, ItemStack.AIR); +public record SetSlotPacket(byte windowId, int stateId, short slot, ItemStack itemStack) implements ServerPacket { + public SetSlotPacket(BinaryReader reader) { + this(reader.readByte(), reader.readVarInt(), reader.readShort(), reader.readItemStack()); } @Override @@ -33,14 +20,6 @@ public class SetSlotPacket implements ServerPacket { writer.writeItemStack(itemStack); } - @Override - public void read(@NotNull BinaryReader reader) { - windowId = reader.readByte(); - stateId = reader.readVarInt(); - slot = reader.readShort(); - itemStack = reader.readItemStack(); - } - @Override public int getId() { return ServerPacketIdentifier.SET_SLOT; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetTitleSubTitlePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetTitleSubTitlePacket.java index fe5bd7f3d..d85a60ba4 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetTitleSubTitlePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetTitleSubTitlePacket.java @@ -7,20 +7,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class SetTitleSubTitlePacket implements ServerPacket { - - public Component subtitle = Component.empty(); - - public SetTitleSubTitlePacket() { - } - - public SetTitleSubTitlePacket(Component subtitle) { - this.subtitle = subtitle; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.subtitle = reader.readComponent(); +public record SetTitleSubTitlePacket(Component subtitle) implements ServerPacket { + public SetTitleSubTitlePacket(BinaryReader reader) { + this(reader.readComponent()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetTitleTextPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetTitleTextPacket.java index 0b74572a5..419c8d464 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetTitleTextPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetTitleTextPacket.java @@ -7,20 +7,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class SetTitleTextPacket implements ServerPacket { - - public Component title = Component.empty(); - - public SetTitleTextPacket() { - } - - public SetTitleTextPacket(Component title) { - this.title = title; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.title = reader.readComponent(); +public record SetTitleTextPacket(Component title) implements ServerPacket { + public SetTitleTextPacket(BinaryReader reader) { + this(reader.readComponent()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetTitleTimePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetTitleTimePacket.java index 0199a4f39..1e10ff2c4 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetTitleTimePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetTitleTimePacket.java @@ -6,27 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class SetTitleTimePacket implements ServerPacket { - - public int fadeIn; - public int stay; - public int fadeOut; - - public SetTitleTimePacket() { - } - - public SetTitleTimePacket(int fadeIn, int stay, int fadeOut) { - this.fadeIn = fadeIn; - this.stay = stay; - this.fadeOut = fadeOut; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.fadeIn = reader.readInt(); - this.stay = reader.readInt(); - this.fadeOut = reader.readInt(); - +public record SetTitleTimePacket(int fadeIn, int stay, int fadeOut) implements ServerPacket { + public SetTitleTimePacket(BinaryReader reader) { + this(reader.readInt(), reader.readInt(), reader.readInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SoundEffectPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SoundEffectPacket.java index cb0006082..31883bc0a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SoundEffectPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SoundEffectPacket.java @@ -2,44 +2,30 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.sound.Sound.Source; import net.minestom.server.adventure.AdventurePacketConvertor; +import net.minestom.server.coordinate.Point; 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.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Pos; import org.jetbrains.annotations.NotNull; -public class SoundEffectPacket implements ServerPacket { - - public int soundId; - public Source soundSource; - public int x, y, z; - public float volume; - public float pitch; - - public SoundEffectPacket() { - soundSource = Source.AMBIENT; +public record SoundEffectPacket(int soundId, Source source, int x, int y, int z, + float volume, float pitch) implements ServerPacket { + public SoundEffectPacket(BinaryReader reader) { + this(reader.readVarInt(), Source.values()[reader.readVarInt()], + reader.readInt() * 8, reader.readInt() * 8, reader.readInt() * 8, + reader.readFloat(), reader.readFloat()); } - @NotNull - public static SoundEffectPacket create(Source category, SoundEvent sound, Pos position, float volume, float pitch) { - SoundEffectPacket packet = new SoundEffectPacket(); - packet.soundId = sound.id(); - packet.soundSource = category; - // *8 converts to fixed-point representation with 3 bits for fractional part - packet.x = (int) position.x(); - packet.y = (int) position.y(); - packet.z = (int) position.z(); - packet.volume = volume; - packet.pitch = pitch; - return packet; + public SoundEffectPacket(SoundEvent sound, Source source, Point position, float volume, float pitch) { + this(sound.id(), source, (int) position.x(), (int) position.y(), (int) position.z(), volume, pitch); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(soundId); - writer.writeVarInt(AdventurePacketConvertor.getSoundSourceValue(soundSource)); + writer.writeVarInt(AdventurePacketConvertor.getSoundSourceValue(source)); writer.writeInt(x * 8); writer.writeInt(y * 8); writer.writeInt(z * 8); @@ -47,17 +33,6 @@ 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; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SpawnEntityPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SpawnEntityPacket.java index f220801a1..846dc0511 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SpawnEntityPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SpawnEntityPacket.java @@ -1,26 +1,21 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Pos; 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.coordinate.Pos; import org.jetbrains.annotations.NotNull; import java.util.UUID; -public class SpawnEntityPacket implements ServerPacket { - - public int entityId; - public UUID uuid; - public int type; - public Pos position; - public int data; - public short velocityX, velocityY, velocityZ; - - public SpawnEntityPacket() { - uuid = new UUID(0, 0); - position = Pos.ZERO; +public record SpawnEntityPacket(int entityId, UUID uuid, int type, Pos position, int data, + short velocityX, short velocityY, short velocityZ) implements ServerPacket { + public SpawnEntityPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readUuid(), reader.readVarInt(), + new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), + reader.readByte() * 360f / 256f, reader.readByte() * 360f / 256f), + reader.readInt(), reader.readShort(), reader.readShort(), reader.readShort()); } @Override @@ -43,23 +38,6 @@ 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 Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), - reader.readByte() * 360f / 256f, - reader.readByte() * 360f / 256f); - - data = reader.readInt(); - - velocityX = reader.readShort(); - velocityY = reader.readShort(); - velocityZ = reader.readShort(); - } - @Override public int getId() { return ServerPacketIdentifier.SPAWN_ENTITY; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SpawnExperienceOrbPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SpawnExperienceOrbPacket.java index b0db786b2..a0a799146 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SpawnExperienceOrbPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SpawnExperienceOrbPacket.java @@ -1,20 +1,15 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Pos; 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.coordinate.Pos; import org.jetbrains.annotations.NotNull; -public class SpawnExperienceOrbPacket implements ServerPacket { - - public int entityId; - public Pos position; - public short expCount; - - public SpawnExperienceOrbPacket() { - position = Pos.ZERO; +public record SpawnExperienceOrbPacket(int entityId, Pos position, short expCount) implements ServerPacket { + public SpawnExperienceOrbPacket(BinaryReader reader) { + this(reader.readVarInt(), new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble()), reader.readShort()); } @Override @@ -26,13 +21,6 @@ public class SpawnExperienceOrbPacket implements ServerPacket { writer.writeShort(expCount); } - @Override - public void read(@NotNull BinaryReader reader) { - entityId = reader.readVarInt(); - position = new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble()); - expCount = reader.readShort(); - } - @Override public int getId() { return ServerPacketIdentifier.SPAWN_EXPERIENCE_ORB; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SpawnLivingEntityPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SpawnLivingEntityPacket.java index c407ab502..cd865e775 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SpawnLivingEntityPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SpawnLivingEntityPacket.java @@ -1,26 +1,23 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Pos; 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.coordinate.Pos; import org.jetbrains.annotations.NotNull; import java.util.UUID; -public class SpawnLivingEntityPacket implements ServerPacket { - - public int entityId; - public UUID entityUuid; - public int entityType; - public Pos position; - public float headPitch; - public short velocityX, velocityY, velocityZ; - - public SpawnLivingEntityPacket() { - entityUuid = new UUID(0, 0); - position = Pos.ZERO; +public record SpawnLivingEntityPacket(int entityId, UUID entityUuid, int entityType, Pos position, float headPitch, + short velocityX, short velocityY, short velocityZ) implements ServerPacket { + public SpawnLivingEntityPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readUuid(), reader.readVarInt(), + new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), + reader.readByte() * 360f / 256f, + reader.readByte() * 360f / 256f), + reader.readByte() * 360f / 256f, + reader.readShort(), reader.readShort(), reader.readShort()); } @Override @@ -42,22 +39,6 @@ public class SpawnLivingEntityPacket implements ServerPacket { writer.writeShort(velocityZ); } - @Override - public void read(@NotNull BinaryReader reader) { - entityId = reader.readVarInt(); - entityUuid = reader.readUuid(); - entityType = reader.readVarInt(); - - position = new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), - reader.readByte() * 360f / 256f, - reader.readByte() * 360f / 256f); - headPitch = reader.readByte() * 360f / 256f; - - velocityX = reader.readShort(); - velocityY = reader.readShort(); - velocityZ = reader.readShort(); - } - @Override public int getId() { return ServerPacketIdentifier.SPAWN_LIVING_ENTITY; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SpawnPaintingPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SpawnPaintingPacket.java index 4a9308b6a..d178a4dd8 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SpawnPaintingPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SpawnPaintingPacket.java @@ -1,26 +1,18 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Point; 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.coordinate.Point; -import net.minestom.server.coordinate.Vec; import org.jetbrains.annotations.NotNull; import java.util.UUID; -public class SpawnPaintingPacket implements ServerPacket { - - public int entityId; - public UUID entityUuid; - public int motive; - public Point position; - public byte direction; - - public SpawnPaintingPacket() { - entityUuid = new UUID(0, 0); - position = Vec.ZERO; +public record SpawnPaintingPacket(int entityId, UUID entityUuid, int motive, Point position, + byte direction) implements ServerPacket { + public SpawnPaintingPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readUuid(), reader.readVarInt(), reader.readBlockPosition(), reader.readByte()); } @Override @@ -32,15 +24,6 @@ public class SpawnPaintingPacket implements ServerPacket { writer.writeByte(direction); } - @Override - public void read(@NotNull BinaryReader reader) { - this.entityId = reader.readVarInt(); - this.entityUuid = reader.readUuid(); - this.motive = reader.readVarInt(); - this.position = reader.readBlockPosition(); - this.direction = reader.readByte(); - } - @Override public int getId() { return ServerPacketIdentifier.SPAWN_PAINTING; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SpawnPlayerPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SpawnPlayerPacket.java index 978b13e87..353f8604c 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SpawnPlayerPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SpawnPlayerPacket.java @@ -9,20 +9,10 @@ import org.jetbrains.annotations.NotNull; import java.util.UUID; -public class SpawnPlayerPacket implements ServerPacket { - - public int entityId; - public UUID playerUuid; - public Pos position; - - public SpawnPlayerPacket(int entityId, UUID playerUuid, Pos position) { - this.entityId = entityId; - this.playerUuid = playerUuid; - this.position = position; - } - - public SpawnPlayerPacket() { - this(0, new UUID(0, 0), Pos.ZERO); +public record SpawnPlayerPacket(int entityId, UUID playerUuid, Pos position) implements ServerPacket { + public SpawnPlayerPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readUuid(), new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), + (reader.readByte() * 360f) / 256f, (reader.readByte() * 360f) / 256f)); } @Override @@ -36,15 +26,6 @@ public class SpawnPlayerPacket implements ServerPacket { writer.writeByte((byte) (position.pitch() * 256f / 360f)); } - @Override - public void read(@NotNull BinaryReader reader) { - this.entityId = reader.readVarInt(); - this.playerUuid = reader.readUuid(); - this.position = new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), - (reader.readByte() * 360f) / 256f, - (reader.readByte() * 360f) / 256f); - } - @Override public int getId() { return ServerPacketIdentifier.SPAWN_PLAYER; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SpawnPositionPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SpawnPositionPacket.java index a26e3748d..8b07e552a 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SpawnPositionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SpawnPositionPacket.java @@ -1,25 +1,15 @@ package net.minestom.server.network.packet.server.play; import net.minestom.server.coordinate.Point; -import net.minestom.server.coordinate.Vec; 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 SpawnPositionPacket implements ServerPacket { - - public Point position; - public float angle; - - public SpawnPositionPacket(Point position, float angle) { - this.position = position; - this.angle = angle; - } - - public SpawnPositionPacket() { - this(Vec.ZERO, 0); +public record SpawnPositionPacket(Point position, float angle) implements ServerPacket { + public SpawnPositionPacket(BinaryReader reader) { + this(reader.readBlockPosition(), reader.readFloat()); } @Override @@ -28,12 +18,6 @@ public class SpawnPositionPacket implements ServerPacket { writer.writeFloat(angle); } - @Override - public void read(@NotNull BinaryReader reader) { - this.position = reader.readBlockPosition(); - this.angle = reader.readFloat(); - } - @Override public int getId() { return ServerPacketIdentifier.SPAWN_POSITION; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/StatisticsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/StatisticsPacket.java index 9dfb76a2c..0bb840a68 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/StatisticsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/StatisticsPacket.java @@ -5,46 +5,37 @@ import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.statistic.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 { +import java.util.List; - public Statistic[] statistics; +public record StatisticsPacket(List statistics) implements ServerPacket { + public StatisticsPacket { + statistics = List.copyOf(statistics); + } - public StatisticsPacket() { - statistics = new Statistic[0]; + public StatisticsPacket(BinaryReader reader) { + this(reader.readVarIntList(Statistic::new)); } @Override public void write(@NotNull BinaryWriter writer) { - writer.writeVarInt(statistics.length); + writer.writeVarInt(statistics.size()); for (Statistic statistic : statistics) { statistic.write(writer); } } - @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 implements Writeable, Readable { - - public StatisticCategory category; - public int statisticId; - public int value; + public record Statistic(StatisticCategory category, int statisticId, int value) implements Writeable { + public Statistic(BinaryReader reader) { + this(StatisticCategory.values()[reader.readVarInt()], reader.readVarInt(), reader.readVarInt()); + } @Override public void write(BinaryWriter writer) { @@ -52,13 +43,5 @@ public class StatisticsPacket implements ServerPacket { writer.writeVarInt(statisticId); writer.writeVarInt(value); } - - @Override - public void read(@NotNull BinaryReader reader) { - category = StatisticCategory.values()[reader.readVarInt()]; - statisticId = reader.readVarInt(); - value = reader.readVarInt(); - } } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/StopSoundPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/StopSoundPacket.java index 08de7c0b5..77a80f6ae 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/StopSoundPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/StopSoundPacket.java @@ -1,43 +1,72 @@ package net.minestom.server.network.packet.server.play; +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.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class StopSoundPacket implements ServerPacket { +import java.util.Objects; - public byte flags; - public int source; - public String sound; +public final class StopSoundPacket implements ServerPacket { + private final byte flags; + private final Sound.Source source; + private final String sound; - public StopSoundPacket() { - sound = ""; + public StopSoundPacket(byte flags, Sound.Source source, String sound) { + this.flags = flags; + this.source = source; + this.sound = sound; + } + + public StopSoundPacket(BinaryReader reader) { + this.flags = reader.readByte(); + if (flags == 3 || flags == 1) { + this.source = Sound.Source.values()[reader.readVarInt()]; + } else this.source = null; + if (flags == 2 || flags == 3) { + this.sound = reader.readSizedString(); + } else this.sound = null; } @Override public void write(@NotNull BinaryWriter writer) { writer.writeByte(flags); if (flags == 3 || flags == 1) - writer.writeVarInt(source); + writer.writeVarInt(AdventurePacketConvertor.getSoundSourceValue(source)); if (flags == 2 || flags == 3) 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(); - } + public byte flags() { + return flags; + } + + public Sound.Source source() { + return source; + } + + public String sound() { + return sound; } @Override public int getId() { return ServerPacketIdentifier.STOP_SOUND; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof StopSoundPacket that)) return false; + return flags == that.flags && source == that.source && + Objects.equals(sound, that.sound); + } + + @Override + public int hashCode() { + return Objects.hash(flags, source, sound); + } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TabCompletePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TabCompletePacket.java index f690ae0dc..ccb89cbc1 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TabCompletePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TabCompletePacket.java @@ -7,7 +7,9 @@ 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.Writeable; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -15,15 +17,14 @@ import java.util.Collections; import java.util.List; import java.util.function.UnaryOperator; -public class TabCompletePacket implements ComponentHoldingServerPacket { +public record TabCompletePacket(int transactionId, int start, int length, + @NotNull List matches) implements ComponentHoldingServerPacket { + public TabCompletePacket { + matches = List.copyOf(matches); + } - public int transactionId; - public int start; - public int length; - public Match[] matches; - - public TabCompletePacket() { - matches = new Match[0]; + public TabCompletePacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarInt(), reader.readVarInt(), reader.readVarIntList(Match::new)); } @Override @@ -31,37 +32,7 @@ public class TabCompletePacket implements ComponentHoldingServerPacket { writer.writeVarInt(transactionId); writer.writeVarInt(start); writer.writeVarInt(length); - - writer.writeVarInt(matches.length); - for (Match match : matches) { - writer.writeSizedString(match.match); - writer.writeBoolean(match.hasTooltip); - if (match.hasTooltip) - writer.writeComponent(match.tooltip); - } - } - - @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(); - boolean hasTooltip = reader.readBoolean(); - Component tooltip = null; - if (hasTooltip) { - tooltip = reader.readComponent(); - } - Match newMatch = new Match(); - newMatch.match = match; - newMatch.hasTooltip = hasTooltip; - newMatch.tooltip = tooltip; - matches[i] = newMatch; - } + writer.writeVarIntList(matches, BinaryWriter::write); } @Override @@ -71,64 +42,45 @@ public class TabCompletePacket implements ComponentHoldingServerPacket { @Override public @NotNull Collection components() { - if (matches == null || matches.length == 0) { - return Collections.emptyList(); - } else { - List components = new ArrayList<>(matches.length); - for (Match match : matches) { - if (match.hasTooltip) { - components.add(match.tooltip); - } + if (matches.isEmpty()) return Collections.emptyList(); + List components = new ArrayList<>(matches.size()); + for (Match match : matches) { + if (match.tooltip != null) { + components.add(match.tooltip); } - return components; } + return components; } @Override public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { - if (matches == null || matches.length == 0) { - return this; - } else { - TabCompletePacket packet = new TabCompletePacket(); - packet.transactionId = transactionId; - packet.start = start; - packet.length = length; - packet.matches = new Match[matches.length]; + if (matches.isEmpty()) return this; + final List updatedMatches = matches.stream().map(match -> match.copyWithOperator(operator)).toList(); + return new TabCompletePacket(transactionId, start, length, updatedMatches); - for (int i = 0; i < matches.length; i++) { - packet.matches[i] = matches[i].copyWithOperator(operator); - } - - return packet; - } } - public static class Match implements ComponentHolder { - public String match; - public boolean hasTooltip; - public Component tooltip; + public record Match(@NotNull String match, + @Nullable Component tooltip) implements Writeable, ComponentHolder { + public Match(BinaryReader reader) { + this(reader.readSizedString(), reader.readBoolean() ? reader.readComponent() : null); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeSizedString(match); + writer.writeBoolean(tooltip != null); + if (tooltip != null) writer.writeComponent(tooltip); + } @Override public @NotNull Collection components() { - if (hasTooltip) { - return Collections.singleton(tooltip); - } else { - return Collections.emptyList(); - } + return tooltip != null ? Collections.singletonList(tooltip) : Collections.emptyList(); } @Override public @NotNull Match copyWithOperator(@NotNull UnaryOperator operator) { - if (hasTooltip) { - Match newMatch = new Match(); - newMatch.match = match; - newMatch.hasTooltip = hasTooltip; - newMatch.tooltip = tooltip; - return newMatch; - } else { - return this; - } + return tooltip != null ? new Match(match, operator.apply(tooltip)) : this; } } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TagsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TagsPacket.java index 415e2e1b5..f8243f9f4 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TagsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TagsPacket.java @@ -14,18 +14,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class TagsPacket implements ServerPacket { +public record TagsPacket(Map> tagsMap) implements ServerPacket { @ApiStatus.Internal public static final CachedPacket DEFAULT_TAGS = new CachedPacket(new TagsPacket(MinecraftServer.getTagManager().getTagMap())); - public Map> tagsMap; - - public TagsPacket(Map> tagsMap) { - this.tagsMap = tagsMap; + public TagsPacket { + tagsMap = Map.copyOf(tagsMap); } - public TagsPacket() { - this(new HashMap<>()); + public TagsPacket(BinaryReader reader) { + this(readTagsMap(reader)); } @Override @@ -48,8 +46,12 @@ public class TagsPacket implements ServerPacket { } @Override - public void read(@NotNull BinaryReader reader) { - this.tagsMap = new HashMap<>(); + public int getId() { + return ServerPacketIdentifier.TAGS; + } + + private static Map> readTagsMap(BinaryReader reader) { + Map> tagsMap = new HashMap<>(); // Read amount of tag types final int typeCount = reader.readVarInt(); for (int i = 0; i < typeCount; i++) { @@ -66,10 +68,6 @@ public class TagsPacket implements ServerPacket { // TODO convert } } - } - - @Override - public int getId() { - return ServerPacketIdentifier.TAGS; + return tagsMap; } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TeamsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TeamsPacket.java index 915885dd1..e49924b52 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TeamsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TeamsPacket.java @@ -3,130 +3,154 @@ package net.minestom.server.network.packet.server.play; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; 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.binary.Writeable; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import java.util.Collection; -import java.util.Collections; import java.util.List; -import java.util.function.UnaryOperator; /** * The packet creates or updates teams */ -public class TeamsPacket implements ComponentHoldingServerPacket { - - /** - * The registry name of the team - */ - public String teamName; - /** - * The action of the packet - */ - public Action action; - - /** - * The display name for the team - */ - public Component teamDisplayName; - /** - * The friendly flags to - */ - public byte friendlyFlags; - /** - * Visibility state for the name tag - */ - public NameTagVisibility nameTagVisibility; - /** - * Rule for the collision - */ - public CollisionRule collisionRule; - /** - * The color of the team - */ - public NamedTextColor teamColor; - /** - * The prefix of the team - */ - public Component teamPrefix; - /** - * The suffix of the team - */ - public Component teamSuffix; - /** - * An array with all entities in the team - */ - public String[] entities; - - public TeamsPacket() { - teamName = ""; - action = Action.REMOVE_TEAM; +public record TeamsPacket(String teamName, Action action) implements ServerPacket { + public TeamsPacket(BinaryReader reader) { + this(reader.readSizedString(), switch (reader.readByte()) { + case 0 -> new CreateTeamAction(reader); + case 1 -> new RemoveTeamAction(); + case 2 -> new UpdateTeamAction(reader); + case 3 -> new AddEntitiesToTeamAction(reader); + case 4 -> new RemoveEntitiesToTeamAction(reader); + default -> throw new RuntimeException("Unknown action id"); + }); } - /** - * Writes data into the {@link BinaryWriter} - * - * @param writer The writer to writes - */ @Override public void write(@NotNull BinaryWriter writer) { - writer.writeSizedString(this.teamName); - writer.writeByte((byte) this.action.ordinal()); - - switch (action) { - case CREATE_TEAM: - case UPDATE_TEAM_INFO: - writer.writeComponent(this.teamDisplayName); - writer.writeByte(this.friendlyFlags); - writer.writeSizedString(this.nameTagVisibility.getIdentifier()); - writer.writeSizedString(this.collisionRule.getIdentifier()); - writer.writeVarInt(AdventurePacketConvertor.getNamedTextColorValue(this.teamColor)); - writer.writeComponent(this.teamPrefix); - writer.writeComponent(this.teamSuffix); - break; - case REMOVE_TEAM: - - break; - } - - if (action == Action.CREATE_TEAM || action == Action.ADD_PLAYERS_TEAM || action == Action.REMOVE_PLAYERS_TEAM) { - if (entities == null || entities.length == 0) { - writer.writeVarInt(0); // Empty - } else { - writer.writeStringArray(entities); - } - } - + writer.writeSizedString(teamName); + writer.writeByte((byte) action.id()); + writer.write(action); } - @Override - public void read(@NotNull BinaryReader reader) { - teamName = reader.readSizedString(); - action = Action.values()[reader.readByte()]; + public sealed interface Action extends Writeable + permits CreateTeamAction, RemoveTeamAction, UpdateTeamAction, AddEntitiesToTeamAction, RemoveEntitiesToTeamAction { + int id(); + } - switch (action) { - case CREATE_TEAM: - case UPDATE_TEAM_INFO: - this.teamDisplayName = reader.readComponent(); - this.friendlyFlags = reader.readByte(); - nameTagVisibility = NameTagVisibility.fromIdentifier(reader.readSizedString()); - collisionRule = CollisionRule.fromIdentifier(reader.readSizedString()); - this.teamColor = NamedTextColor.ofExact(reader.readVarInt()); - this.teamPrefix = reader.readComponent(); - this.teamSuffix = reader.readComponent(); - break; - case REMOVE_TEAM: - - break; + public record CreateTeamAction(Component displayName, byte friendlyFlags, + NameTagVisibility nameTagVisibility, CollisionRule collisionRule, + NamedTextColor teamColor, Component teamPrefix, Component teamSuffix, + Collection entities) implements Action { + public CreateTeamAction { + entities = List.copyOf(entities); } - if (action == Action.CREATE_TEAM || action == Action.ADD_PLAYERS_TEAM || action == Action.REMOVE_PLAYERS_TEAM) { - entities = reader.readSizedStringArray(); + public CreateTeamAction(BinaryReader reader) { + this(reader.readComponent(), reader.readByte(), + NameTagVisibility.fromIdentifier(reader.readSizedString()), CollisionRule.fromIdentifier(reader.readSizedString()), + NamedTextColor.ofExact(reader.readVarInt()), reader.readComponent(), reader.readComponent(), + reader.readVarIntList(BinaryReader::readSizedString)); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeComponent(displayName); + writer.writeByte(friendlyFlags); + writer.writeSizedString(nameTagVisibility.getIdentifier()); + writer.writeSizedString(collisionRule.getIdentifier()); + writer.writeVarInt(AdventurePacketConvertor.getNamedTextColorValue(teamColor)); + writer.writeComponent(teamPrefix); + writer.writeComponent(teamSuffix); + writer.writeVarIntList(entities, BinaryWriter::writeSizedString); + } + + @Override + public int id() { + return 0; + } + } + + public record RemoveTeamAction() implements Action { + @Override + public void write(@NotNull BinaryWriter writer) { + } + + @Override + public int id() { + return 1; + } + } + + public record UpdateTeamAction(Component displayName, byte friendlyFlags, + NameTagVisibility nameTagVisibility, CollisionRule collisionRule, + NamedTextColor teamColor, Component teamPrefix, Component teamSuffix, + Collection entities) implements Action { + public UpdateTeamAction { + entities = List.copyOf(entities); + } + + public UpdateTeamAction(BinaryReader reader) { + this(reader.readComponent(), reader.readByte(), + NameTagVisibility.fromIdentifier(reader.readSizedString()), CollisionRule.fromIdentifier(reader.readSizedString()), + NamedTextColor.ofExact(reader.readVarInt()), reader.readComponent(), reader.readComponent(), + reader.readVarIntList(BinaryReader::readSizedString)); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeComponent(displayName); + writer.writeByte(friendlyFlags); + writer.writeSizedString(nameTagVisibility.getIdentifier()); + writer.writeSizedString(collisionRule.getIdentifier()); + writer.writeVarInt(AdventurePacketConvertor.getNamedTextColorValue(teamColor)); + writer.writeComponent(teamPrefix); + writer.writeComponent(teamSuffix); + writer.writeVarIntList(entities, BinaryWriter::writeSizedString); + } + + @Override + public int id() { + return 2; + } + } + + public record AddEntitiesToTeamAction(Collection entities) implements Action { + public AddEntitiesToTeamAction { + entities = List.copyOf(entities); + } + + public AddEntitiesToTeamAction(BinaryReader reader) { + this(reader.readVarIntList(BinaryReader::readSizedString)); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeVarIntList(entities, BinaryWriter::writeSizedString); + } + + @Override + public int id() { + return 3; + } + } + + public record RemoveEntitiesToTeamAction(String[] entities) implements Action { + public RemoveEntitiesToTeamAction(BinaryReader reader) { + this(reader.readSizedStringArray()); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeStringArray(entities); + } + + @Override + public int id() { + return 4; } } @@ -140,61 +164,6 @@ public class TeamsPacket implements ComponentHoldingServerPacket { return ServerPacketIdentifier.TEAMS; } - @Override - public @NotNull Collection components() { - if (this.action == Action.UPDATE_TEAM_INFO || this.action == Action.CREATE_TEAM) { - return List.of(teamDisplayName, teamPrefix, teamSuffix); - } else { - return Collections.emptyList(); - } - } - - @Override - public @NotNull ServerPacket copyWithOperator(@NotNull UnaryOperator operator) { - if (this.action == Action.UPDATE_TEAM_INFO || this.action == Action.CREATE_TEAM) { - TeamsPacket packet = new TeamsPacket(); - packet.teamName = teamName; - packet.action = action; - packet.teamDisplayName = teamDisplayName == null ? null : operator.apply(teamDisplayName); - packet.friendlyFlags = friendlyFlags; - packet.nameTagVisibility = nameTagVisibility; - packet.collisionRule = collisionRule; - packet.teamColor = teamColor; - packet.teamPrefix = teamPrefix == null ? null : operator.apply(teamPrefix); - packet.teamSuffix = teamSuffix == null ? null : operator.apply(teamSuffix); - packet.entities = entities; - return packet; - } else { - return this; - } - } - - /** - * An enumeration which representing all actions for the packet - */ - public enum Action { - /** - * An action to create a new team - */ - CREATE_TEAM, - /** - * An action to remove a team - */ - REMOVE_TEAM, - /** - * An action to update the team information - */ - UPDATE_TEAM_INFO, - /** - * An action to add player to the team - */ - ADD_PLAYERS_TEAM, - /** - * An action to remove player from the team - */ - REMOVE_PLAYERS_TEAM - } - /** * An enumeration which representing all visibility states for the name tags */ @@ -286,8 +255,7 @@ public class TeamsPacket implements ComponentHoldingServerPacket { this.identifier = identifier; } - @NotNull - public static CollisionRule fromIdentifier(String identifier) { + public static @NotNull CollisionRule fromIdentifier(String identifier) { for (CollisionRule v : values()) { if (v.getIdentifier().equals(identifier)) return v; @@ -301,10 +269,8 @@ public class TeamsPacket implements ComponentHoldingServerPacket { * * @return the identifier */ - @NotNull - public String getIdentifier() { + public @NotNull String getIdentifier() { return identifier; } } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TimeUpdatePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TimeUpdatePacket.java index a7c5e06bc..3ee90655d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TimeUpdatePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TimeUpdatePacket.java @@ -6,18 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class TimeUpdatePacket implements ServerPacket { - - public long worldAge; - public long timeOfDay; - - public TimeUpdatePacket(long worldAge, long timeOfDay) { - this.worldAge = worldAge; - this.timeOfDay = timeOfDay; - } - - public TimeUpdatePacket() { - this(0, 0); +public record TimeUpdatePacket(long worldAge, long timeOfDay) implements ServerPacket { + public TimeUpdatePacket(BinaryReader reader) { + this(reader.readLong(), reader.readLong()); } @Override @@ -26,12 +17,6 @@ public class TimeUpdatePacket implements ServerPacket { writer.writeLong(timeOfDay); } - @Override - public void read(@NotNull BinaryReader reader) { - worldAge = reader.readLong(); - timeOfDay = reader.readLong(); - } - @Override public int getId() { return ServerPacketIdentifier.TIME_UPDATE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TradeListPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TradeListPacket.java index 0ff36a2f7..043da29ff 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TradeListPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TradeListPacket.java @@ -5,72 +5,49 @@ 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; -public class TradeListPacket implements ServerPacket { +import java.util.List; - public int windowId; - public Trade[] trades; - public int villagerLevel; - public int experience; - public boolean regularVillager; - public boolean canRestock; +public record TradeListPacket(int windowId, @NotNull List trades, + int villagerLevel, int experience, + boolean regularVillager, boolean canRestock) implements ServerPacket { + public TradeListPacket { + trades = List.copyOf(trades); + } - /** - * Default constructor, required for reflection operations. - */ - public TradeListPacket() { - trades = new Trade[0]; + public TradeListPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readByteList(Trade::new), + reader.readVarInt(), reader.readVarInt(), + reader.readBoolean(), reader.readBoolean()); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(windowId); - writer.writeByte((byte) trades.length); - for (Trade trade : trades) { - trade.write(writer); - } + writer.writeByteList(trades, BinaryWriter::write); writer.writeVarInt(villagerLevel); writer.writeVarInt(experience); writer.writeBoolean(regularVillager); writer.writeBoolean(canRestock); } - @Override - public void read(@NotNull BinaryReader reader) { - windowId = reader.readVarInt(); - byte tradeCount = reader.readByte(); - - trades = new Trade[tradeCount]; - for (int i = 0; i < tradeCount; i++) { - trades[i] = new Trade(); - trades[i].read(reader); - } - villagerLevel = reader.readVarInt(); - experience = reader.readVarInt(); - regularVillager = reader.readBoolean(); - canRestock = reader.readBoolean(); - } - @Override public int getId() { return ServerPacketIdentifier.TRADE_LIST; } - public static class Trade implements Writeable, Readable { - - public ItemStack inputItem1; - public ItemStack result; - public ItemStack inputItem2; - public boolean tradeDisabled; - public int tradeUsesNumber; - public int maxTradeUsesNumber; - public int exp; - public int specialPrice; - public float priceMultiplier; - public int demand; + public record Trade(ItemStack inputItem1, ItemStack result, + ItemStack inputItem2, boolean tradeDisabled, + int tradeUsesNumber, int maxTradeUsesNumber, int exp, + int specialPrice, float priceMultiplier, int demand) implements Writeable { + public Trade(BinaryReader reader) { + this(reader.readItemStack(), reader.readItemStack(), + reader.readBoolean() ? reader.readItemStack() : null, reader.readBoolean(), + reader.readInt(), reader.readInt(), reader.readInt(), + reader.readInt(), reader.readFloat(), reader.readInt()); + } @Override public void write(BinaryWriter writer) { @@ -79,8 +56,7 @@ public class TradeListPacket implements ServerPacket { writer.writeItemStack(inputItem1); writer.writeItemStack(result); writer.writeBoolean(hasSecondItem); - if (hasSecondItem) - writer.writeItemStack(inputItem2); + if (hasSecondItem) writer.writeItemStack(inputItem2); writer.writeBoolean(tradeDisabled); writer.writeInt(tradeUsesNumber); writer.writeInt(maxTradeUsesNumber); @@ -89,27 +65,5 @@ public class TradeListPacket implements ServerPacket { writer.writeFloat(priceMultiplier); writer.writeInt(demand); } - - @Override - public void read(@NotNull BinaryReader reader) { - inputItem1 = reader.readItemStack(); - result = reader.readItemStack(); - - boolean hasSecondItem = reader.readBoolean(); - if (hasSecondItem) { - inputItem2 = reader.readItemStack(); - } else { - inputItem2 = null; - } - - tradeDisabled = reader.readBoolean(); - tradeUsesNumber = reader.readInt(); - maxTradeUsesNumber = reader.readInt(); - exp = reader.readInt(); - specialPrice = reader.readInt(); - priceMultiplier = reader.readFloat(); - demand = reader.readInt(); - } } - } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/UnloadChunkPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/UnloadChunkPacket.java index 463bd7e9f..961c0586d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/UnloadChunkPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/UnloadChunkPacket.java @@ -6,17 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class UnloadChunkPacket implements ServerPacket { - - public int chunkX, chunkZ; - - public UnloadChunkPacket(int chunkX, int chunkZ) { - this.chunkX = chunkX; - this.chunkZ = chunkZ; - } - - public UnloadChunkPacket() { - this(0, 0); +public record UnloadChunkPacket(int chunkX, int chunkZ) implements ServerPacket { + public UnloadChunkPacket(BinaryReader reader) { + this(reader.readInt(), reader.readInt()); } @Override @@ -25,12 +17,6 @@ public class UnloadChunkPacket implements ServerPacket { writer.writeInt(chunkZ); } - @Override - public void read(@NotNull BinaryReader reader) { - chunkX = reader.readInt(); - chunkZ = reader.readInt(); - } - @Override public int getId() { return ServerPacketIdentifier.UNLOAD_CHUNK; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/UnlockRecipesPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/UnlockRecipesPacket.java index 4114c4f46..95b75ade4 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/UnlockRecipesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/UnlockRecipesPacket.java @@ -5,72 +5,72 @@ 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.UnknownNullability; -public class UnlockRecipesPacket implements ServerPacket { +import java.util.List; - public int mode; +public record UnlockRecipesPacket(int mode, + boolean craftingRecipeBookOpen, boolean craftingRecipeBookFilterActive, + boolean smeltingRecipeBookOpen, boolean smeltingRecipeBookFilterActive, + boolean blastFurnaceRecipeBookOpen, boolean blastFurnaceRecipeBookFilterActive, + boolean smokerRecipeBookOpen, boolean smokerRecipeBookFilterActive, + @NotNull List recipeIds, + @UnknownNullability List initRecipeIds) implements ServerPacket { + public UnlockRecipesPacket { + recipeIds = List.copyOf(recipeIds); + if (initRecipeIds != null) { + initRecipeIds = List.copyOf(initRecipeIds); + } + } - public boolean craftingRecipeBookOpen; - public boolean craftingRecipeBookFilterActive; - public boolean smeltingRecipeBookOpen; - public boolean smeltingRecipeBookFilterActive; + public UnlockRecipesPacket(BinaryReader reader) { + this(read(reader)); + } - public String[] recipesId; + private UnlockRecipesPacket(UnlockRecipesPacket packet) { + this(packet.mode, + packet.craftingRecipeBookOpen, packet.craftingRecipeBookFilterActive, + packet.smeltingRecipeBookOpen, packet.smeltingRecipeBookFilterActive, + packet.blastFurnaceRecipeBookOpen, packet.blastFurnaceRecipeBookFilterActive, + packet.smokerRecipeBookOpen, packet.smokerRecipeBookFilterActive, + packet.recipeIds, packet.initRecipeIds); + } - // Only if mode = 0 - public String[] initRecipesId; - - /** - * Default constructor, required for reflection operations. - */ - public UnlockRecipesPacket() { - recipesId = new String[0]; - initRecipesId = new String[0]; + private static UnlockRecipesPacket read(BinaryReader reader) { + var mode = reader.readVarInt(); + var craftingRecipeBookOpen = reader.readBoolean(); + var craftingRecipeBookFilterActive = reader.readBoolean(); + var smeltingRecipeBookOpen = reader.readBoolean(); + var smeltingRecipeBookFilterActive = reader.readBoolean(); + var blastFurnaceRecipeBookOpen = reader.readBoolean(); + var blastFurnaceRecipeBookFilterActive = reader.readBoolean(); + var smokerRecipeBookOpen = reader.readBoolean(); + var smokerRecipeBookFilterActive = reader.readBoolean(); + var recipeIds = reader.readVarIntList(BinaryReader::readSizedString); + var initRecipeIds = mode == 0 ? reader.readVarIntList(BinaryReader::readSizedString) : null; + return new UnlockRecipesPacket(mode, + craftingRecipeBookOpen, craftingRecipeBookFilterActive, + smeltingRecipeBookOpen, smeltingRecipeBookFilterActive, + blastFurnaceRecipeBookOpen, blastFurnaceRecipeBookFilterActive, + smokerRecipeBookOpen, smokerRecipeBookFilterActive, + recipeIds, initRecipeIds); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(mode); - writer.writeBoolean(craftingRecipeBookOpen); writer.writeBoolean(craftingRecipeBookFilterActive); writer.writeBoolean(smeltingRecipeBookOpen); writer.writeBoolean(smeltingRecipeBookFilterActive); + writer.writeBoolean(blastFurnaceRecipeBookOpen); + writer.writeBoolean(blastFurnaceRecipeBookFilterActive); + writer.writeBoolean(smokerRecipeBookOpen); + writer.writeBoolean(smokerRecipeBookFilterActive); - writer.writeVarInt(recipesId.length); - for (String string : recipesId) { - writer.writeSizedString(string); - } - + writer.writeVarIntList(recipeIds, BinaryWriter::writeSizedString); if (mode == 0) { - writer.writeVarInt(initRecipesId.length); - for (String string : initRecipesId) { - writer.writeSizedString(string); - } - } - } - - @Override - public void read(@NotNull BinaryReader reader) { - mode = reader.readVarInt(); - - craftingRecipeBookOpen = reader.readBoolean(); - craftingRecipeBookFilterActive = reader.readBoolean(); - smeltingRecipeBookOpen = reader.readBoolean(); - smeltingRecipeBookFilterActive = reader.readBoolean(); - - int length = reader.readVarInt(); - recipesId = new String[length]; - for (int i = 0; i < length; i++) { - recipesId[i] = reader.readSizedString(); - } - - if (mode == 0) { - int initRecipesLength = reader.readVarInt(); - initRecipesId = new String[initRecipesLength]; - for (int i = 0; i < length; i++) { - initRecipesId[i] = reader.readSizedString(); - } + writer.writeVarIntList(initRecipeIds, BinaryWriter::writeSizedString); } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/UpdateHealthPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/UpdateHealthPacket.java index 1e397ea44..bcfae9628 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/UpdateHealthPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/UpdateHealthPacket.java @@ -6,20 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class UpdateHealthPacket implements ServerPacket { - - public float health; - public int food; - public float foodSaturation; - - public UpdateHealthPacket(float health, int food, float foodSaturation) { - this.health = health; - this.food = food; - this.foodSaturation = foodSaturation; - } - - public UpdateHealthPacket() { - this(0, 0, 0); +public record UpdateHealthPacket(float health, int food, float foodSaturation) implements ServerPacket { + public UpdateHealthPacket(BinaryReader reader) { + this(reader.readFloat(), reader.readVarInt(), reader.readFloat()); } @Override @@ -29,13 +18,6 @@ public class UpdateHealthPacket implements ServerPacket { writer.writeFloat(foodSaturation); } - @Override - public void read(@NotNull BinaryReader reader) { - health = reader.readFloat(); - food = reader.readVarInt(); - foodSaturation = reader.readFloat(); - } - @Override public int getId() { return ServerPacketIdentifier.UPDATE_HEALTH; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/UpdateLightPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/UpdateLightPacket.java index 7aeee5709..b6b6bbaef 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/UpdateLightPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/UpdateLightPacket.java @@ -3,11 +3,16 @@ 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.network.packet.server.play.data.LightData; +import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; public record UpdateLightPacket(int chunkX, int chunkZ, LightData lightData) implements ServerPacket { + public UpdateLightPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarInt(), new LightData(reader)); + } + @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(chunkX); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/UpdateScorePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/UpdateScorePacket.java index c56e610a8..9771e9174 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/UpdateScorePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/UpdateScorePacket.java @@ -6,19 +6,22 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class UpdateScorePacket implements ServerPacket { +public record UpdateScorePacket(@NotNull String entityName, byte action, + @NotNull String objectiveName, int value) implements ServerPacket { + public UpdateScorePacket(BinaryReader reader) { + this(read(reader)); + } - public String entityName; - public byte action; - public String objectiveName; - public int value; + private UpdateScorePacket(UpdateScorePacket packet) { + this(packet.entityName, packet.action, packet.objectiveName, packet.value); + } - /** - * Default constructor, required for reflection operations. - */ - public UpdateScorePacket() { - entityName = ""; - objectiveName = ""; + private static UpdateScorePacket read(BinaryReader reader) { + var entityName = reader.readSizedString(); + var action = reader.readByte(); + var objectiveName = reader.readSizedString(); + var value = action != 1 ? reader.readVarInt() : 0; + return new UpdateScorePacket(entityName, action, objectiveName, value); } @Override @@ -26,19 +29,7 @@ public class UpdateScorePacket implements ServerPacket { writer.writeSizedString(entityName); writer.writeByte(action); writer.writeSizedString(objectiveName); - if (action != 1) { - writer.writeVarInt(value); - } - } - - @Override - public void read(@NotNull BinaryReader reader) { - entityName = reader.readSizedString(); - action = reader.readByte(); - objectiveName = reader.readSizedString(); - if (action != 1) { - value = reader.readVarInt(); - } + if (action != 1) writer.writeVarInt(value); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/UpdateSimulationDistancePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/UpdateSimulationDistancePacket.java index 5ed265f0a..1eaf166a4 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/UpdateSimulationDistancePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/UpdateSimulationDistancePacket.java @@ -2,10 +2,15 @@ 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 record UpdateSimulationDistancePacket(int simulationDistance) implements ServerPacket { + public UpdateSimulationDistancePacket(BinaryReader reader) { + this(reader.readVarInt()); + } + @Override public void write(@NotNull BinaryWriter writer) { writer.writeVarInt(simulationDistance); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/UpdateViewDistancePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/UpdateViewDistancePacket.java index 3c1783614..f6439d094 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/UpdateViewDistancePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/UpdateViewDistancePacket.java @@ -6,16 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class UpdateViewDistancePacket implements ServerPacket { - - public int viewDistance; - - public UpdateViewDistancePacket(int viewDistance) { - this.viewDistance = viewDistance; - } - - public UpdateViewDistancePacket() { - this(0); +public record UpdateViewDistancePacket(int viewDistance) implements ServerPacket { + public UpdateViewDistancePacket(BinaryReader reader) { + this(reader.readVarInt()); } @Override @@ -23,11 +16,6 @@ public class UpdateViewDistancePacket implements ServerPacket { writer.writeVarInt(viewDistance); } - @Override - public void read(@NotNull BinaryReader reader) { - viewDistance = reader.readVarInt(); - } - @Override public int getId() { return ServerPacketIdentifier.UPDATE_VIEW_DISTANCE; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/UpdateViewPositionPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/UpdateViewPositionPacket.java index 57d27d022..4c729b766 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/UpdateViewPositionPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/UpdateViewPositionPacket.java @@ -6,17 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class UpdateViewPositionPacket implements ServerPacket { - - public int chunkX, chunkZ; - - public UpdateViewPositionPacket(int chunkX, int chunkZ) { - this.chunkX = chunkX; - this.chunkZ = chunkZ; - } - - public UpdateViewPositionPacket() { - this(0, 0); +public record UpdateViewPositionPacket(int chunkX, int chunkZ) implements ServerPacket { + public UpdateViewPositionPacket(BinaryReader reader) { + this(reader.readVarInt(), reader.readVarInt()); } @Override @@ -25,12 +17,6 @@ public class UpdateViewPositionPacket implements ServerPacket { writer.writeVarInt(chunkZ); } - @Override - public void read(@NotNull BinaryReader reader) { - chunkX = reader.readVarInt(); - chunkZ = reader.readVarInt(); - } - @Override public int getId() { return ServerPacketIdentifier.UPDATE_VIEW_POSITION; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/VehicleMovePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/VehicleMovePacket.java index 1a53d5abf..bd88fc0d4 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/VehicleMovePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/VehicleMovePacket.java @@ -1,37 +1,24 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Pos; 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 VehicleMovePacket implements ServerPacket { - - public double x, y, z; - public float yaw, pitch; - - /** - * Default constructor, required for reflection operations. - */ - public VehicleMovePacket() {} - - @Override - public void write(@NotNull BinaryWriter writer) { - writer.writeDouble(x); - writer.writeDouble(y); - writer.writeDouble(z); - writer.writeFloat(yaw); - writer.writeFloat(pitch); +public record VehicleMovePacket(Pos position) implements ServerPacket { + public VehicleMovePacket(BinaryReader reader) { + this(new Pos(reader.readDouble(), reader.readDouble(), reader.readDouble(), reader.readFloat(), reader.readFloat())); } @Override - public void read(@NotNull BinaryReader reader) { - x = reader.readDouble(); - y = reader.readDouble(); - z = reader.readDouble(); - yaw = reader.readFloat(); - pitch = reader.readFloat(); + public void write(@NotNull BinaryWriter writer) { + writer.writeDouble(position.x()); + writer.writeDouble(position.y()); + writer.writeDouble(position.z()); + writer.writeFloat(position.yaw()); + writer.writeFloat(position.pitch()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/WindowItemsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/WindowItemsPacket.java index 60761727b..4dc5d5145 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/WindowItemsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/WindowItemsPacket.java @@ -7,53 +7,27 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class WindowItemsPacket implements ServerPacket { +import java.util.List; - public byte windowId; - public int stateId; - public ItemStack[] items; - public ItemStack carriedItem; - - public WindowItemsPacket(byte windowId, int stateId, ItemStack[] items, ItemStack carriedItem) { - this.windowId = windowId; - this.stateId = stateId; - this.items = items; - this.carriedItem = carriedItem; +public record WindowItemsPacket(byte windowId, int stateId, @NotNull List items, + @NotNull ItemStack carriedItem) implements ServerPacket { + public WindowItemsPacket { + items = List.copyOf(items); } - public WindowItemsPacket() { - this((byte) 0, 0, new ItemStack[]{}, ItemStack.AIR); + public WindowItemsPacket(BinaryReader reader) { + this(reader.readByte(), reader.readVarInt(), reader.readVarIntList(BinaryReader::readItemStack), + reader.readItemStack()); } @Override public void write(@NotNull BinaryWriter writer) { writer.writeByte(windowId); writer.writeVarInt(stateId); - - if (items == null) { - writer.writeVarInt(0); - } else { - writer.writeVarInt(items.length); - for (ItemStack item : items) { - writer.writeItemStack(item); - } - } + writer.writeVarIntList(items, BinaryWriter::writeItemStack); writer.writeItemStack(carriedItem); } - @Override - public void read(@NotNull BinaryReader reader) { - windowId = reader.readByte(); - stateId = reader.readVarInt(); - - final int length = reader.readVarInt(); - items = new ItemStack[length]; - for (int i = 0; i < length; i++) { - items[i] = reader.readItemStack(); - } - carriedItem = reader.readItemStack(); - } - @Override public int getId() { return ServerPacketIdentifier.WINDOW_ITEMS; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/WindowPropertyPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/WindowPropertyPacket.java index 8f0451fb2..85695b09c 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/WindowPropertyPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/WindowPropertyPacket.java @@ -6,20 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class WindowPropertyPacket implements ServerPacket { - - public byte windowId; - public short property; - public short value; - - public WindowPropertyPacket(byte windowId, short property, short value) { - this.windowId = windowId; - this.property = property; - this.value = value; - } - - public WindowPropertyPacket() { - this((byte) 0, (short) 0, (short) 0); +public record WindowPropertyPacket(byte windowId, short property, short value) implements ServerPacket { + public WindowPropertyPacket(BinaryReader reader) { + this(reader.readByte(), reader.readShort(), reader.readShort()); } @Override @@ -29,13 +18,6 @@ public class WindowPropertyPacket implements ServerPacket { writer.writeShort(value); } - @Override - public void read(@NotNull BinaryReader reader) { - windowId = reader.readByte(); - property = reader.readShort(); - value = reader.readShort(); - } - @Override public int getId() { return ServerPacketIdentifier.WINDOW_PROPERTY; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderCenterPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderCenterPacket.java index d097b879c..de1885cc2 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderCenterPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderCenterPacket.java @@ -6,22 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class WorldBorderCenterPacket implements ServerPacket { - - public double x; - public double z; - - public static WorldBorderCenterPacket of(double x, double z) { - WorldBorderCenterPacket packet = new WorldBorderCenterPacket(); - packet.x = x; - packet.z = z; - return packet; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.x = reader.readDouble(); - this.z = reader.readDouble(); +public record WorldBorderCenterPacket(double x, double z) implements ServerPacket { + public WorldBorderCenterPacket(BinaryReader reader) { + this(reader.readDouble(), reader.readDouble()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderLerpSizePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderLerpSizePacket.java index df835c6a8..6576af521 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderLerpSizePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderLerpSizePacket.java @@ -6,25 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class WorldBorderLerpSizePacket implements ServerPacket { - - public double oldDiameter; - public double newDiameter; - public long speed; - - public static WorldBorderLerpSizePacket of(double oldDiameter, double newDiameter, long speed) { - WorldBorderLerpSizePacket packet = new WorldBorderLerpSizePacket(); - packet.oldDiameter = oldDiameter; - packet.newDiameter = newDiameter; - packet.speed = speed; - return packet; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.oldDiameter = reader.readDouble(); - this.newDiameter = reader.readDouble(); - this.speed = reader.readVarLong(); +public record WorldBorderLerpSizePacket(double oldDiameter, double newDiameter, long speed) implements ServerPacket { + public WorldBorderLerpSizePacket(BinaryReader reader) { + this(reader.readDouble(), reader.readDouble(), reader.readVarLong()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderSizePacket.java b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderSizePacket.java index 320fd601b..2d72ab41b 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderSizePacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderSizePacket.java @@ -6,19 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class WorldBorderSizePacket implements ServerPacket { - - public double diameter; - - public static WorldBorderSizePacket of(double diameter) { - WorldBorderSizePacket packet = new WorldBorderSizePacket(); - packet.diameter = diameter; - return packet; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.diameter = reader.readDouble(); +public record WorldBorderSizePacket(double diameter) implements ServerPacket { + public WorldBorderSizePacket(BinaryReader reader) { + this(reader.readDouble()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderWarningDelayPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderWarningDelayPacket.java index 79b1e6871..8e0bc2e68 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderWarningDelayPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderWarningDelayPacket.java @@ -6,19 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class WorldBorderWarningDelayPacket implements ServerPacket { - - public int warningTime; - - public static WorldBorderWarningDelayPacket of(int warningTime) { - WorldBorderWarningDelayPacket packet = new WorldBorderWarningDelayPacket(); - packet.warningTime = warningTime; - return packet; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.warningTime = reader.readVarInt(); +public record WorldBorderWarningDelayPacket(int warningTime) implements ServerPacket { + public WorldBorderWarningDelayPacket(BinaryReader reader) { + this(reader.readVarInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderWarningReachPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderWarningReachPacket.java index da4a8f654..62d4d5f15 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderWarningReachPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/WorldBorderWarningReachPacket.java @@ -6,19 +6,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class WorldBorderWarningReachPacket implements ServerPacket { - - public int warningBlocks; - - public static WorldBorderWarningReachPacket of(int warningBlocks) { - WorldBorderWarningReachPacket packet = new WorldBorderWarningReachPacket(); - packet.warningBlocks = warningBlocks; - return packet; - } - - @Override - public void read(@NotNull BinaryReader reader) { - this.warningBlocks = reader.readVarInt(); +public record WorldBorderWarningReachPacket(int warningBlocks) implements ServerPacket { + public WorldBorderWarningReachPacket(BinaryReader reader) { + this(reader.readVarInt()); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/data/ChunkData.java b/src/main/java/net/minestom/server/network/packet/server/play/data/ChunkData.java index b7fc5af87..6078a7d16 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/data/ChunkData.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/data/ChunkData.java @@ -4,24 +4,29 @@ import net.minestom.server.coordinate.Point; import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.BlockHandler; import net.minestom.server.tag.Tag; +import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import net.minestom.server.utils.binary.Writeable; import net.minestom.server.utils.chunk.ChunkUtils; import org.jetbrains.annotations.NotNull; import org.jglrxavpok.hephaistos.nbt.NBTCompound; +import java.util.HashMap; import java.util.Map; import java.util.Objects; -public final class ChunkData implements Writeable { - private final NBTCompound heightmaps; - private final byte[] data; - private final Map blockEntities; +public record ChunkData(NBTCompound heightmaps, byte[] data, + Map blockEntities) implements Writeable { + public ChunkData { + heightmaps = heightmaps.deepClone(); + data = data.clone(); + blockEntities = Map.copyOf(blockEntities); + } - public ChunkData(NBTCompound heightmaps, byte[] data, Map blockEntities) { - this.heightmaps = heightmaps.deepClone(); - this.data = data.clone(); - this.blockEntities = Map.copyOf(blockEntities); + public ChunkData(BinaryReader reader) { + this((NBTCompound) reader.readTag(), + reader.readBytes(reader.readVarInt()), + readBlockEntities(reader)); } @Override @@ -66,7 +71,20 @@ public final class ChunkData implements Writeable { final NBTCompound blockNbt = block.nbt(); resultNbt = blockNbt == null ? new NBTCompound() : blockNbt; } - if (resultNbt != null) writer.writeNBT("", resultNbt); // block nbt + writer.writeNBT("", resultNbt); // block nbt } } + + private static Map readBlockEntities(BinaryReader reader) { + final Map blockEntities = new HashMap<>(); + final int size = reader.readVarInt(); + for (int i = 0; i < size; i++) { + final byte xz = reader.readByte(); + final short y = reader.readShort(); + final int blockEntityId = reader.readVarInt(); + final NBTCompound nbt = (NBTCompound) reader.readTag(); + // TODO create block object + } + return blockEntities; + } } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/data/LightData.java b/src/main/java/net/minestom/server/network/packet/server/play/data/LightData.java index 0c8fc678b..ab9208a99 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/data/LightData.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/data/LightData.java @@ -1,5 +1,6 @@ package net.minestom.server.network.packet.server.play.data; +import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import net.minestom.server.utils.binary.Writeable; import org.jetbrains.annotations.NotNull; @@ -29,6 +30,16 @@ public final class LightData implements Writeable { this.blockLight = blockLight; } + public LightData(BinaryReader reader) { + this.trustEdges = reader.readBoolean(); + this.skyMask = BitSet.valueOf(reader.readLongArray()); + this.blockMask = BitSet.valueOf(reader.readLongArray()); + this.emptySkyMask = BitSet.valueOf(reader.readLongArray()); + this.emptyBlockMask = BitSet.valueOf(reader.readLongArray()); + this.skyLight = reader.readVarIntList(r -> r.readBytes(r.readVarInt())); + this.blockLight = reader.readVarIntList(r -> r.readBytes(r.readVarInt())); + } + @Override public void write(@NotNull BinaryWriter writer) { writer.writeBoolean(trustEdges); diff --git a/src/main/java/net/minestom/server/network/packet/server/status/PongPacket.java b/src/main/java/net/minestom/server/network/packet/server/status/PongPacket.java index b088e9842..f4948a43b 100644 --- a/src/main/java/net/minestom/server/network/packet/server/status/PongPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/status/PongPacket.java @@ -5,17 +5,9 @@ import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; import org.jetbrains.annotations.NotNull; -public class PongPacket implements ServerPacket { - - public long number; - - /** - * Default constructor, required for reflection operations. - */ - public PongPacket() {} - - public PongPacket(long number) { - this.number = number; +public record PongPacket(long number) implements ServerPacket { + public PongPacket(BinaryReader reader) { + this(reader.readLong()); } @Override @@ -23,11 +15,6 @@ public class PongPacket implements ServerPacket { writer.writeLong(number); } - @Override - public void read(@NotNull BinaryReader reader) { - number = reader.readLong(); - } - @Override public int getId() { return 0x01; diff --git a/src/main/java/net/minestom/server/particle/ParticleCreator.java b/src/main/java/net/minestom/server/particle/ParticleCreator.java index 4e6fb56aa..f005c4e93 100644 --- a/src/main/java/net/minestom/server/particle/ParticleCreator.java +++ b/src/main/java/net/minestom/server/particle/ParticleCreator.java @@ -15,40 +15,22 @@ public class ParticleCreator { double x, double y, double z, float offsetX, float offsetY, float offsetZ, float particleData, int count, @Nullable Consumer dataWriter) { - ParticlePacket particlePacket = new ParticlePacket(); - particlePacket.particleId = particleType.id(); - particlePacket.longDistance = distance; - - particlePacket.x = x; - particlePacket.y = y; - particlePacket.z = z; - - particlePacket.offsetX = offsetX; - particlePacket.offsetY = offsetY; - particlePacket.offsetZ = offsetZ; - - particlePacket.particleData = particleData; - particlePacket.particleCount = count; - + byte[] data; if (dataWriter != null) { BinaryWriter writer = new BinaryWriter(); dataWriter.accept(writer); - particlePacket.data = writer.toByteArray(); + data = writer.toByteArray(); } else { - particlePacket.data = new byte[0]; + data = new byte[0]; } - - return particlePacket; + return new ParticlePacket(particleType.id(), distance, x, y, z, offsetX, offsetY, offsetZ, particleData, count, data); } public static ParticlePacket createParticlePacket(Particle particleType, double x, double y, double z, float offsetX, float offsetY, float offsetZ, int count) { - return createParticlePacket(particleType, true, - x, y, z, - offsetX, offsetY, offsetZ, - 0, count, null); + return createParticlePacket(particleType, true, x, y, z, + offsetX, offsetY, offsetZ, 0, count, null); } - } diff --git a/src/main/java/net/minestom/server/potion/Potion.java b/src/main/java/net/minestom/server/potion/Potion.java index 960340c02..da27e82b4 100644 --- a/src/main/java/net/minestom/server/potion/Potion.java +++ b/src/main/java/net/minestom/server/potion/Potion.java @@ -3,93 +3,16 @@ package net.minestom.server.potion; import net.minestom.server.entity.Entity; import net.minestom.server.network.packet.server.play.EntityEffectPacket; import net.minestom.server.network.packet.server.play.RemoveEntityEffectPacket; +import net.minestom.server.utils.binary.BinaryReader; +import net.minestom.server.utils.binary.BinaryWriter; +import net.minestom.server.utils.binary.Writeable; import org.jetbrains.annotations.NotNull; -public class Potion { - - private final PotionEffect effect; - private final byte amplifier; - private final int duration; - private final byte flags; - - /** - * Creates a new potion. - * - * @param effect The type of potion. - * @param amplifier The strength of the potion. - * @param duration The length of the potion in ticks. - */ - public Potion(@NotNull PotionEffect effect, byte amplifier, int duration) { - this(effect, amplifier, duration, true, true, false); - } - - /** - * Creates a new potion. - * - * @param effect The type of potion. - * @param amplifier The strength of the potion. - * @param duration The length of the potion in ticks. - * @param particles If the potion has particles. - */ - public Potion(@NotNull PotionEffect effect, byte amplifier, int duration, boolean particles) { - this(effect, amplifier, duration, particles, true, false); - } - - /** - * Creates a new potion. - * - * @param effect The type of potion. - * @param amplifier The strength of the potion. - * @param duration The length of the potion in ticks. - * @param particles If the potion has particles. - * @param icon If the potion has an icon. - */ - public Potion(@NotNull PotionEffect effect, byte amplifier, int duration, boolean particles, boolean icon) { - this(effect, amplifier, duration, particles, icon, false); - } - - /** - * Creates a new potion. - * - * @param effect The type of potion. - * @param amplifier The strength of the potion. - * @param duration The length of the potion in ticks. - * @param particles If the potion has particles. - * @param icon If the potion has an icon. - * @param ambient If the potion came from a beacon. - */ - public Potion(@NotNull PotionEffect effect, byte amplifier, int duration, boolean particles, boolean icon, boolean ambient) { - this.effect = effect; - this.amplifier = amplifier; - this.duration = duration; - byte flags = 0; - if (ambient) { - flags = (byte) (flags | 0x01); - } - if (particles) { - flags = (byte) (flags | 0x02); - } - if (icon) { - flags = (byte) (flags | 0x04); - } - this.flags = flags; - } - - @NotNull - public PotionEffect getEffect() { - return effect; - } - - public byte getAmplifier() { - return amplifier; - } - - public int getDuration() { - return duration; - } - - public byte getFlags() { - return flags; +public record Potion(PotionEffect effect, byte amplifier, int duration, byte flags) + implements Writeable { + public Potion(BinaryReader reader) { + this(PotionEffect.fromId(reader.readVarInt()), reader.readByte(), + reader.readVarInt(), reader.readByte()); } /** @@ -100,10 +23,7 @@ public class Potion { * @param entity the entity to add the effect to */ public void sendAddPacket(@NotNull Entity entity) { - EntityEffectPacket entityEffectPacket = new EntityEffectPacket(); - entityEffectPacket.entityId = entity.getEntityId(); - entityEffectPacket.potion = this; - entity.sendPacketToViewersAndSelf(entityEffectPacket); + entity.sendPacketToViewersAndSelf(new EntityEffectPacket(entity.getEntityId(), this)); } /** @@ -114,9 +34,14 @@ public class Potion { * @param entity the entity to remove the effect from */ public void sendRemovePacket(@NotNull Entity entity) { - RemoveEntityEffectPacket removeEntityEffectPacket = new RemoveEntityEffectPacket(); - removeEntityEffectPacket.entityId = entity.getEntityId(); - removeEntityEffectPacket.effect = effect; - entity.sendPacketToViewersAndSelf(removeEntityEffectPacket); + entity.sendPacketToViewersAndSelf(new RemoveEntityEffectPacket(entity.getEntityId(), effect)); + } + + @Override + public void write(@NotNull BinaryWriter writer) { + writer.writeByte((byte) effect.id()); + writer.writeByte(amplifier); + writer.writeVarInt(duration); + writer.writeByte(flags); } } diff --git a/src/main/java/net/minestom/server/recipe/RecipeManager.java b/src/main/java/net/minestom/server/recipe/RecipeManager.java index eff8fdbae..1d2156140 100644 --- a/src/main/java/net/minestom/server/recipe/RecipeManager.java +++ b/src/main/java/net/minestom/server/recipe/RecipeManager.java @@ -9,7 +9,7 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; public class RecipeManager { - private final DeclareRecipesPacket declareRecipesPacket = new DeclareRecipesPacket(); + private DeclareRecipesPacket declareRecipesPacket = new DeclareRecipesPacket(List.of()); private final Set recipes = new CopyOnWriteArraySet<>(); public void addRecipe(@NotNull Recipe recipe) { @@ -48,7 +48,7 @@ public class RecipeManager { new DeclareRecipesPacket.DeclaredShapelessCraftingRecipe( shapelessRecipe.getRecipeId(), shapelessRecipe.getGroup(), - shapelessRecipe.getIngredients().toArray(new DeclareRecipesPacket.Ingredient[0]), + shapelessRecipe.getIngredients(), shapelessRecipe.getResult() ) ); @@ -61,7 +61,7 @@ public class RecipeManager { shapedRecipe.getWidth(), shapedRecipe.getHeight(), shapedRecipe.getGroup(), - shapedRecipe.getIngredients().toArray(new DeclareRecipesPacket.Ingredient[0]), + shapedRecipe.getIngredients(), shapedRecipe.getResult() ) ); @@ -143,7 +143,7 @@ public class RecipeManager { } } - declareRecipesPacket.recipes = recipesCache.toArray(new DeclareRecipesPacket.DeclaredRecipe[0]); + declareRecipesPacket = new DeclareRecipesPacket(recipesCache); } } diff --git a/src/main/java/net/minestom/server/scoreboard/Scoreboard.java b/src/main/java/net/minestom/server/scoreboard/Scoreboard.java index eaa042e9a..b14aebca4 100644 --- a/src/main/java/net/minestom/server/scoreboard/Scoreboard.java +++ b/src/main/java/net/minestom/server/scoreboard/Scoreboard.java @@ -37,15 +37,8 @@ public interface Scoreboard extends Viewable, PacketGroupingAudience { * @param type The type for the objective * @return the creation objective packet */ - @NotNull - default ScoreboardObjectivePacket getCreationObjectivePacket(Component value, ScoreboardObjectivePacket.Type type) { - final ScoreboardObjectivePacket packet = new ScoreboardObjectivePacket(); - packet.objectiveName = this.getObjectiveName(); - packet.mode = 0; // Create Scoreboard - packet.objectiveValue = value; - packet.type = type; - - return packet; + default @NotNull ScoreboardObjectivePacket getCreationObjectivePacket(Component value, ScoreboardObjectivePacket.Type type) { + return new ScoreboardObjectivePacket(getObjectiveName(), (byte) 0, value, type); } /** @@ -53,13 +46,8 @@ public interface Scoreboard extends Viewable, PacketGroupingAudience { * * @return the destruction objective packet */ - @NotNull - default ScoreboardObjectivePacket getDestructionObjectivePacket() { - final ScoreboardObjectivePacket packet = new ScoreboardObjectivePacket(); - packet.objectiveName = this.getObjectiveName(); - packet.mode = 1; // Destroy Scoreboard - - return packet; + default @NotNull ScoreboardObjectivePacket getDestructionObjectivePacket() { + return new ScoreboardObjectivePacket(getObjectiveName(), (byte) 1, null, null); } /** @@ -68,13 +56,8 @@ public interface Scoreboard extends Viewable, PacketGroupingAudience { * @param position The position of the scoreboard * @return the created display scoreboard packet */ - @NotNull - default DisplayScoreboardPacket getDisplayScoreboardPacket(byte position) { - final DisplayScoreboardPacket packet = new DisplayScoreboardPacket(); - packet.position = position; - packet.scoreName = this.getObjectiveName(); - - return packet; + default @NotNull DisplayScoreboardPacket getDisplayScoreboardPacket(byte position) { + return new DisplayScoreboardPacket(position, getObjectiveName()); } /** @@ -84,13 +67,7 @@ public interface Scoreboard extends Viewable, PacketGroupingAudience { * @param score The new score */ default void updateScore(Player player, int score) { - final UpdateScorePacket packet = new UpdateScorePacket(); - packet.entityName = player.getUsername(); - packet.action = 0; // Create/Update score - packet.objectiveName = this.getObjectiveName(); - packet.value = score; - - sendPacketsToViewers(packet); + sendPacketsToViewers(new UpdateScorePacket(player.getUsername(), (byte) 0, getObjectiveName(), score)); } /** @@ -98,11 +75,10 @@ public interface Scoreboard extends Viewable, PacketGroupingAudience { * * @return the objective name */ - @NotNull - String getObjectiveName(); + @NotNull String getObjectiveName(); @Override - @NotNull default Collection getPlayers() { + default @NotNull Collection getPlayers() { return this.getViewers(); } } diff --git a/src/main/java/net/minestom/server/scoreboard/Sidebar.java b/src/main/java/net/minestom/server/scoreboard/Sidebar.java index 0bfefe29b..edc88dd9d 100644 --- a/src/main/java/net/minestom/server/scoreboard/Sidebar.java +++ b/src/main/java/net/minestom/server/scoreboard/Sidebar.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; +import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; @@ -97,14 +98,8 @@ public class Sidebar implements Scoreboard { */ public void setTitle(@NotNull Component title) { this.title = title; - - ScoreboardObjectivePacket scoreboardObjectivePacket = new ScoreboardObjectivePacket(); - scoreboardObjectivePacket.objectiveName = objectiveName; - scoreboardObjectivePacket.mode = 2; // Update display text - scoreboardObjectivePacket.objectiveValue = title; - scoreboardObjectivePacket.type = ScoreboardObjectivePacket.Type.INTEGER; - - sendPacketToViewers(scoreboardObjectivePacket); + sendPacketToViewers(new ScoreboardObjectivePacket(objectiveName, (byte) 2, title, + ScoreboardObjectivePacket.Type.INTEGER)); } /** @@ -345,12 +340,7 @@ public class Sidebar implements Scoreboard { * @return a {@link UpdateScorePacket} */ private UpdateScorePacket getScoreCreationPacket(String objectiveName) { - UpdateScorePacket updateScorePacket = new UpdateScorePacket(); - updateScorePacket.entityName = entityName; - updateScorePacket.action = 0; // Create/Update - updateScorePacket.objectiveName = objectiveName; - updateScorePacket.value = line; - return updateScorePacket; + return new UpdateScorePacket(entityName, (byte) 0, objectiveName, line); } /** @@ -360,11 +350,7 @@ public class Sidebar implements Scoreboard { * @return a {@link UpdateScorePacket} */ private UpdateScorePacket getScoreDestructionPacket(String objectiveName) { - UpdateScorePacket updateScorePacket = new UpdateScorePacket(); - updateScorePacket.entityName = entityName; - updateScorePacket.action = 1; // Remove - updateScorePacket.objectiveName = objectiveName; - return updateScorePacket; + return new UpdateScorePacket(entityName, (byte) 1, objectiveName, 0); } /** @@ -375,9 +361,7 @@ public class Sidebar implements Scoreboard { * @return a {@link UpdateScorePacket} */ private UpdateScorePacket getLineScoreUpdatePacket(String objectiveName, int score) { - UpdateScorePacket updateScorePacket = getScoreCreationPacket(objectiveName); - updateScorePacket.value = score; - return updateScorePacket; + return new UpdateScorePacket(entityName, (byte) 0, objectiveName, score); } /** @@ -428,18 +412,9 @@ public class Sidebar implements Scoreboard { * @return a {@link TeamsPacket} which creates a new team */ private TeamsPacket getCreationPacket() { - TeamsPacket teamsPacket = new TeamsPacket(); - teamsPacket.teamName = teamName; - teamsPacket.action = TeamsPacket.Action.CREATE_TEAM; - teamsPacket.teamDisplayName = teamDisplayName; - teamsPacket.friendlyFlags = friendlyFlags; - teamsPacket.nameTagVisibility = nameTagVisibility; - teamsPacket.collisionRule = collisionRule; - teamsPacket.teamColor = teamColor; - teamsPacket.teamPrefix = prefix; - teamsPacket.teamSuffix = suffix; - teamsPacket.entities = new String[]{entityName}; - return teamsPacket; + final var action = new TeamsPacket.CreateTeamAction(teamDisplayName, friendlyFlags, + nameTagVisibility, collisionRule, teamColor, prefix, suffix, List.of(entityName)); + return new TeamsPacket(teamName, action); } /** @@ -448,10 +423,7 @@ public class Sidebar implements Scoreboard { * @return a {@link TeamsPacket} which destroyed a team */ private TeamsPacket getDestructionPacket() { - TeamsPacket teamsPacket = new TeamsPacket(); - teamsPacket.teamName = teamName; - teamsPacket.action = TeamsPacket.Action.REMOVE_TEAM; - return teamsPacket; + return new TeamsPacket(teamName, new TeamsPacket.RemoveTeamAction()); } /** @@ -461,17 +433,9 @@ public class Sidebar implements Scoreboard { * @return a {@link TeamsPacket} with the updated prefix */ private TeamsPacket updatePrefix(Component prefix) { - TeamsPacket teamsPacket = new TeamsPacket(); - teamsPacket.teamName = teamName; - teamsPacket.action = TeamsPacket.Action.UPDATE_TEAM_INFO; - teamsPacket.teamDisplayName = teamDisplayName; - teamsPacket.friendlyFlags = friendlyFlags; - teamsPacket.nameTagVisibility = nameTagVisibility; - teamsPacket.collisionRule = collisionRule; - teamsPacket.teamColor = teamColor; - teamsPacket.teamPrefix = prefix; - teamsPacket.teamSuffix = suffix; - return teamsPacket; + final var action = new TeamsPacket.UpdateTeamAction(teamDisplayName, friendlyFlags, + nameTagVisibility, collisionRule, teamColor, prefix, suffix, List.of(entityName)); + return new TeamsPacket(teamName, action); } /** diff --git a/src/main/java/net/minestom/server/scoreboard/Team.java b/src/main/java/net/minestom/server/scoreboard/Team.java index 9b5489c68..23b59a8e3 100644 --- a/src/main/java/net/minestom/server/scoreboard/Team.java +++ b/src/main/java/net/minestom/server/scoreboard/Team.java @@ -115,13 +115,10 @@ public class Team implements PacketGroupingAudience { this.members.add(member); // Initializes add player packet - final TeamsPacket addPlayerPacket = new TeamsPacket(); - addPlayerPacket.teamName = this.teamName; - addPlayerPacket.action = TeamsPacket.Action.ADD_PLAYERS_TEAM; - addPlayerPacket.entities = members.toArray(new String[0]); - + final TeamsPacket addPlayerPacket = new TeamsPacket(teamName, + new TeamsPacket.AddEntitiesToTeamAction(members)); // Sends to all online players the add player packet - PacketUtils.sendGroupedPacket(CONNECTION_MANAGER.getOnlinePlayers(), addPlayerPacket); + PacketUtils.broadcastPacket(addPlayerPacket); // invalidate player members this.isPlayerMembersUpToDate = false; @@ -134,13 +131,10 @@ public class Team implements PacketGroupingAudience { */ public void removeMember(@NotNull String member) { // Initializes remove player packet - final TeamsPacket removePlayerPacket = new TeamsPacket(); - removePlayerPacket.teamName = this.teamName; - removePlayerPacket.action = TeamsPacket.Action.REMOVE_PLAYERS_TEAM; - removePlayerPacket.entities = new String[]{member}; - + final TeamsPacket removePlayerPacket = new TeamsPacket(teamName, + new TeamsPacket.RemoveEntitiesToTeamAction(new String[]{member})); // Sends to all online player teh remove player packet - PacketUtils.sendGroupedPacket(CONNECTION_MANAGER.getOnlinePlayers(), removePlayerPacket); + PacketUtils.broadcastPacket(removePlayerPacket); // Removes the member from the team this.members.remove(member); @@ -351,21 +345,10 @@ public class Team implements PacketGroupingAudience { * * @return the packet to add the team */ - @NotNull - public TeamsPacket createTeamsCreationPacket() { - TeamsPacket teamsCreationPacket = new TeamsPacket(); - teamsCreationPacket.teamName = teamName; - teamsCreationPacket.action = TeamsPacket.Action.CREATE_TEAM; - teamsCreationPacket.teamDisplayName = this.teamDisplayName; - teamsCreationPacket.friendlyFlags = this.friendlyFlags; - teamsCreationPacket.nameTagVisibility = this.nameTagVisibility; - teamsCreationPacket.collisionRule = this.collisionRule; - teamsCreationPacket.teamColor = this.teamColor; - teamsCreationPacket.teamPrefix = this.prefix; - teamsCreationPacket.teamSuffix = this.suffix; - teamsCreationPacket.entities = this.members.toArray(new String[0]); - - return teamsCreationPacket; + public @NotNull TeamsPacket createTeamsCreationPacket() { + final var info = new TeamsPacket.CreateTeamAction(teamDisplayName, friendlyFlags, + nameTagVisibility, collisionRule, teamColor, prefix, suffix, members); + return new TeamsPacket(teamName, info); } /** @@ -373,12 +356,8 @@ public class Team implements PacketGroupingAudience { * * @return the packet to remove the team */ - @NotNull - public TeamsPacket createTeamDestructionPacket() { - TeamsPacket teamsPacket = new TeamsPacket(); - teamsPacket.teamName = teamName; - teamsPacket.action = TeamsPacket.Action.REMOVE_TEAM; - return teamsPacket; + public @NotNull TeamsPacket createTeamDestructionPacket() { + return new TeamsPacket(teamName, new TeamsPacket.RemoveTeamAction()); } /** @@ -454,21 +433,12 @@ public class Team implements PacketGroupingAudience { } /** - * Sends an {@link TeamsPacket.Action#UPDATE_TEAM_INFO} packet. + * Sends an {@link TeamsPacket.UpdateTeamAction} action packet. */ public void sendUpdatePacket() { - final TeamsPacket updatePacket = new TeamsPacket(); - updatePacket.teamName = this.teamName; - updatePacket.action = TeamsPacket.Action.UPDATE_TEAM_INFO; - updatePacket.teamDisplayName = this.teamDisplayName; - updatePacket.friendlyFlags = this.friendlyFlags; - updatePacket.nameTagVisibility = this.nameTagVisibility; - updatePacket.collisionRule = this.collisionRule; - updatePacket.teamColor = this.teamColor; - updatePacket.teamPrefix = this.prefix; - updatePacket.teamSuffix = this.suffix; - - PacketUtils.sendGroupedPacket(MinecraftServer.getConnectionManager().getOnlinePlayers(), updatePacket); + final var info = new TeamsPacket.UpdateTeamAction(teamDisplayName, friendlyFlags, + nameTagVisibility, collisionRule, teamColor, prefix, suffix, members); + PacketUtils.broadcastPacket(new TeamsPacket(teamName, info)); } @Override diff --git a/src/main/java/net/minestom/server/utils/NBTUtils.java b/src/main/java/net/minestom/server/utils/NBTUtils.java index 76ec29b4b..2fbd77259 100644 --- a/src/main/java/net/minestom/server/utils/NBTUtils.java +++ b/src/main/java/net/minestom/server/utils/NBTUtils.java @@ -4,7 +4,6 @@ import net.kyori.adventure.nbt.api.BinaryTagHolder; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.util.Codec; -import net.minestom.server.MinecraftServer; import net.minestom.server.adventure.MinestomAdventure; import net.minestom.server.attribute.Attribute; import net.minestom.server.attribute.AttributeOperation; @@ -24,7 +23,6 @@ import org.jglrxavpok.hephaistos.nbt.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; import java.util.*; // for lack of a better name @@ -111,13 +109,9 @@ public final class NBTUtils { nbt.set(listName, enchantList); } - @NotNull - public static ItemStack readItemStack(@NotNull BinaryReader reader) { + public static @NotNull ItemStack readItemStack(@NotNull BinaryReader reader) { final boolean present = reader.readBoolean(); - - if (!present) { - return ItemStack.AIR; - } + if (!present) return ItemStack.AIR; final int id = reader.readVarInt(); if (id == -1) { @@ -127,17 +121,8 @@ public final class NBTUtils { final Material material = Material.fromId((short) id); final byte count = reader.readByte(); - NBTCompound nbtCompound = null; - - try { - final NBT itemNBT = reader.readTag(); - if (itemNBT instanceof NBTCompound) { // can also be a TAG_End if no data - nbtCompound = (NBTCompound) itemNBT; - } - } catch (IOException | NBTException e) { - MinecraftServer.getExceptionManager().handleException(e); - } - + NBTCompound nbtCompound = reader.readTag() instanceof NBTCompound compound ? + compound : null; return ItemStack.fromNBT(material, nbtCompound, count); } diff --git a/src/main/java/net/minestom/server/utils/advancement/AdvancementUtils.java b/src/main/java/net/minestom/server/utils/advancement/AdvancementUtils.java index d82ec7b51..bdd7d827c 100644 --- a/src/main/java/net/minestom/server/utils/advancement/AdvancementUtils.java +++ b/src/main/java/net/minestom/server/utils/advancement/AdvancementUtils.java @@ -2,6 +2,8 @@ package net.minestom.server.utils.advancement; import net.minestom.server.network.packet.server.play.AdvancementsPacket; +import java.util.List; + public final class AdvancementUtils { private AdvancementUtils() { @@ -15,12 +17,6 @@ public final class AdvancementUtils { * @return the packet to remove all the identifiers */ public static AdvancementsPacket getRemovePacket(String[] identifiers) { - AdvancementsPacket advancementsPacket = new AdvancementsPacket(); - advancementsPacket.resetAdvancements = false; - advancementsPacket.identifiersToRemove = identifiers; - advancementsPacket.advancementMappings = new AdvancementsPacket.AdvancementMapping[]{}; - advancementsPacket.progressMappings = new AdvancementsPacket.ProgressMapping[]{}; - - return advancementsPacket; + return new AdvancementsPacket(false, List.of(), List.of(identifiers), List.of()); } } diff --git a/src/main/java/net/minestom/server/utils/binary/BinaryReader.java b/src/main/java/net/minestom/server/utils/binary/BinaryReader.java index 8fbdd717d..a942a4801 100644 --- a/src/main/java/net/minestom/server/utils/binary/BinaryReader.java +++ b/src/main/java/net/minestom/server/utils/binary/BinaryReader.java @@ -2,6 +2,7 @@ package net.minestom.server.utils.binary; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.item.ItemStack; import net.minestom.server.utils.NBTUtils; @@ -18,7 +19,10 @@ import java.io.InputStream; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; +import java.util.function.Function; import java.util.function.Supplier; /** @@ -220,6 +224,22 @@ public class BinaryReader extends InputStream { return (T[]) result; } + public List readVarIntList(@NotNull Function supplier) { + return readList(readVarInt(), supplier); + } + + public List readByteList(@NotNull Function supplier) { + return readList(readByte(), supplier); + } + + private List readList(int length, @NotNull Function supplier) { + List list = new ArrayList<>(length); + for (int i = 0; i < length; i++) { + list.add(supplier.apply(this)); + } + return list; + } + public ByteBuffer getBuffer() { return buffer; } @@ -234,13 +254,18 @@ public class BinaryReader extends InputStream { return buffer.remaining(); } - public NBT readTag() throws IOException, NBTException { + public NBT readTag() { NBTReader reader = this.nbtReader; if (reader == null) { reader = new NBTReader(this, false); this.nbtReader = reader; } - return reader.read(); + try { + return reader.read(); + } catch (IOException | NBTException e) { + MinecraftServer.getExceptionManager().handleException(e); + throw new RuntimeException(); + } } /** diff --git a/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java b/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java index c252040d0..11427ae1a 100644 --- a/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java +++ b/src/main/java/net/minestom/server/utils/binary/BinaryWriter.java @@ -19,7 +19,9 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.Collection; import java.util.UUID; +import java.util.function.BiConsumer; import java.util.function.Consumer; /** @@ -333,6 +335,20 @@ public class BinaryWriter extends OutputStream { } } + public void writeVarIntList(Collection list, @NotNull BiConsumer consumer) { + writeVarInt(list.size()); + writeList(list, consumer); + } + + public void writeByteList(Collection list, @NotNull BiConsumer consumer) { + writeByte((byte) list.size()); + writeList(list, consumer); + } + + private void writeList(Collection list, @NotNull BiConsumer consumer) { + for (T t : list) consumer.accept(this, t); + } + /** * Converts the internal buffer to a byte array. * diff --git a/src/test/java/demo/commands/PotionCommand.java b/src/test/java/demo/commands/PotionCommand.java index e16db5c56..f687e2d05 100644 --- a/src/test/java/demo/commands/PotionCommand.java +++ b/src/test/java/demo/commands/PotionCommand.java @@ -37,11 +37,7 @@ public class PotionCommand extends Command { final Integer duration = context.get(this.duration); player.sendMessage(Component.text(player.getActiveEffects().toString())); - player.addEffect(new Potion( - potionEffect, - (byte) 0, - duration * MinecraftServer.TICK_PER_SECOND - )); + player.addEffect(new Potion(potionEffect, (byte) 0, duration * MinecraftServer.TICK_PER_SECOND, (byte) 0)); } } \ No newline at end of file diff --git a/src/test/java/readwritepackets/ReadWritePackets.java b/src/test/java/readwritepackets/ReadWritePackets.java deleted file mode 100644 index 30d6ace81..000000000 --- a/src/test/java/readwritepackets/ReadWritePackets.java +++ /dev/null @@ -1,103 +0,0 @@ -package readwritepackets; - -import com.google.common.reflect.ClassPath; -import net.minestom.server.MinecraftServer; -import net.minestom.server.entity.EquipmentSlot; -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; -import net.minestom.server.utils.binary.Writeable; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DynamicTest; -import org.junit.jupiter.api.TestFactory; - -import java.io.IOException; -import java.lang.reflect.Constructor; -import java.lang.reflect.Modifier; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; - -/** - * If you are using IntelliJ, set it up so that tests are run through IntelliJ and not Gradle for this collection of tests - */ -public class ReadWritePackets { - - /** - * Test that all read operations on ServerPacket subclasses are implemented, and use the correct amount of memory. - * This is by no means a perfect test as some packets have variable length and content has to be validated - */ - @TestFactory - public Collection checkServerImplementationPresence() throws IOException { - return checkImplementationPresence(ServerPacket.class); - } - - /** - * Test that all write operations on ClientPacket subclasses are implemented, and use the correct amount of memory. - * This is by no means a perfect test as some packets have variable length and content has to be validated - */ - @TestFactory - public Collection checkClientImplementationPresence() throws IOException { - return checkImplementationPresence(ClientPacket.class); - } - - private Collection checkImplementationPresence(Class packetClass) throws IOException { - ClassPath cp = ClassPath.from(ClassLoader.getSystemClassLoader()); - List allTests = new LinkedList<>(); - for (ClassPath.ClassInfo classInfo : cp.getAllClasses()) { - if (!classInfo.getPackageName().startsWith("net.minestom.server.network.packet")) - continue; - try { - Class clazz = classInfo.load(); - if (packetClass.isAssignableFrom(clazz) && !clazz.isInterface() && ((clazz.getModifiers() & Modifier.ABSTRACT) != Modifier.ABSTRACT)) { - allTests.add(DynamicTest.dynamicTest("WriteThenRead " + clazz.getSimpleName(), () -> { - // required for managers to be loaded - MinecraftServer.init(); - - BinaryWriter writer = new BinaryWriter(); - Constructor constructor = clazz.getDeclaredConstructor(); - constructor.setAccessible(true); - 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.AIR}; - p.slots = new EquipmentSlot[]{EquipmentSlot.MAIN_HAND}; - packet = (T) p; - } else { - packet = (T) constructor.newInstance(); - } - - // write packet - packet.write(writer); - - // re-read packet - byte[] originalBytes = writer.toByteArray(); - BinaryReader reader = new BinaryReader(originalBytes); - packet.read(reader); - - 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(); - packet.write(secondWriter); - - // check that contents are the same than before read - Assertions.assertArrayEquals(originalBytes, secondWriter.toByteArray()); - })); - } - } catch (Exception e) { - e.printStackTrace(); - throw e; - } - } - - return allTests; - } -}