Merge branch 'master' into improved-pathfinding

This commit is contained in:
iam 2024-03-25 19:47:22 -04:00 committed by GitHub
commit 9cade8766c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
177 changed files with 1482 additions and 1404 deletions

View File

@ -1,4 +1,4 @@
# Thanks paper: https://github.com/lynxplay/paper/blob/master/.github/workflows/close_invalid_prs.yml # Thanks paper: https://github.com/papermc/paper/blob/master/.github/workflows/close_invalid_prs.yml
name: Close invalid PRs name: Close invalid PRs
on: on:

View File

@ -75,6 +75,7 @@ public class Main {
commandManager.register(new SetEntityType()); commandManager.register(new SetEntityType());
commandManager.register(new RelightCommand()); commandManager.register(new RelightCommand());
commandManager.register(new KillCommand()); commandManager.register(new KillCommand());
commandManager.register(new WeatherCommand());
commandManager.setUnknownCommandCallback((sender, command) -> sender.sendMessage(Component.text("Unknown command", NamedTextColor.RED))); commandManager.setUnknownCommandCallback((sender, command) -> sender.sendMessage(Component.text("Unknown command", NamedTextColor.RED)));

View File

@ -170,7 +170,7 @@ public class PlayerInit {
}); });
instanceContainer.setChunkSupplier(LightingChunk::new); instanceContainer.setChunkSupplier(LightingChunk::new);
instanceContainer.setTimeRate(0); instanceContainer.setTimeRate(0);
instanceContainer.setTime(18000); instanceContainer.setTime(12000);
// var i2 = new InstanceContainer(UUID.randomUUID(), DimensionType.OVERWORLD, null, NamespaceID.from("minestom:demo")); // var i2 = new InstanceContainer(UUID.randomUUID(), DimensionType.OVERWORLD, null, NamespaceID.from("minestom:demo"));
// instanceManager.registerInstance(i2); // instanceManager.registerInstance(i2);

View File

@ -0,0 +1,29 @@
package net.minestom.demo.commands;
import net.minestom.server.command.CommandSender;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.CommandContext;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.entity.Player;
import net.minestom.server.instance.Weather;
public class WeatherCommand extends Command {
public WeatherCommand() {
super("weather");
var isRaining = ArgumentType.Boolean("isRaining").setDefaultValue(false);
var rainLevel = ArgumentType.Float("rainLevel").setDefaultValue(0.0f);
var thunderLevel = ArgumentType.Float("thunderLevel").setDefaultValue(0.0f);
var transitionTicks = ArgumentType.Integer("transition").setDefaultValue(0);
addSyntax(this::handleWeather, isRaining, rainLevel, thunderLevel, transitionTicks);
}
private void handleWeather(CommandSender source, CommandContext context) {
Player player = (Player) source;
boolean isRaining = context.get("isRaining");
float rainLevel = context.get("rainLevel");
float thunderLevel = context.get("thunderLevel");
int transitionTicks = context.get("transition");
player.getInstance().setWeather(new Weather(isRaining, rainLevel, thunderLevel), transitionTicks);
}
}

View File

@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions] [versions]
# Important dependencies # Important dependencies
data = "1.20.4-rv3" data = "1.20.4-rv4"
adventure = "4.15.0" adventure = "4.15.0"
kotlin = "1.7.22" kotlin = "1.7.22"
dependencyGetter = "v1.0.1" dependencyGetter = "v1.0.1"

Binary file not shown.

View File

@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

41
gradlew vendored
View File

@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -80,13 +80,11 @@ do
esac esac
done done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # This is normally unused
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@ -133,22 +131,29 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
# shell script including quotes and variable substitutions, so put them in DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded. # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
@ -205,6 +214,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \ org.gradle.wrapper.GradleWrapperMain \
"$@" "$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args. # Use "xargs" to parse quoted args.
# #
# With -n1 it outputs one arg per line, with the quotes and backslashes removed. # With -n1 it outputs one arg per line, with the quotes and backslashes removed.

35
gradlew.bat vendored
View File

@ -14,7 +14,7 @@
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@if "%DEBUG%" == "" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@rem Gradle startup script for Windows @rem Gradle startup script for Windows
@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@ -56,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd if %ERRORLEVEL% equ 0 goto mainEnd
:fail :fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code! rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 set EXIT_CODE=%ERRORLEVEL%
exit /b 1 if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd :mainEnd
if "%OS%"=="Windows_NT" endlocal if "%OS%"=="Windows_NT" endlocal

View File

@ -15,6 +15,7 @@ public final class ServerFlag {
public static final int SERVER_TICKS_PER_SECOND = Integer.getInteger("minestom.tps", 20); public static final int SERVER_TICKS_PER_SECOND = Integer.getInteger("minestom.tps", 20);
public static final int CHUNK_VIEW_DISTANCE = Integer.getInteger("minestom.chunk-view-distance", 8); public static final int CHUNK_VIEW_DISTANCE = Integer.getInteger("minestom.chunk-view-distance", 8);
public static final int ENTITY_VIEW_DISTANCE = Integer.getInteger("minestom.entity-view-distance", 5); public static final int ENTITY_VIEW_DISTANCE = Integer.getInteger("minestom.entity-view-distance", 5);
public static final int ENTITY_SYNCHRONIZATION_TICKS = Integer.getInteger("minestom.entity-synchronization-ticks", 20);
public static final int WORKER_COUNT = Integer.getInteger("minestom.workers", Runtime.getRuntime().availableProcessors()); public static final int WORKER_COUNT = Integer.getInteger("minestom.workers", Runtime.getRuntime().availableProcessors());
public static final int MAX_PACKET_SIZE = Integer.getInteger("minestom.max-packet-size", 2_097_151); // 3 bytes var-int public static final int MAX_PACKET_SIZE = Integer.getInteger("minestom.max-packet-size", 2_097_151); // 3 bytes var-int
public static final int SOCKET_SEND_BUFFER_SIZE = Integer.getInteger("minestom.send-buffer-size", 262_143); public static final int SOCKET_SEND_BUFFER_SIZE = Integer.getInteger("minestom.send-buffer-size", 262_143);
@ -22,6 +23,7 @@ public final class ServerFlag {
public static final int POOLED_BUFFER_SIZE = Integer.getInteger("minestom.pooled-buffer-size", 262_143); public static final int POOLED_BUFFER_SIZE = Integer.getInteger("minestom.pooled-buffer-size", 262_143);
public static final int PLAYER_PACKET_PER_TICK = Integer.getInteger("minestom.packet-per-tick", 20); public static final int PLAYER_PACKET_PER_TICK = Integer.getInteger("minestom.packet-per-tick", 20);
public static final int PLAYER_PACKET_QUEUE_SIZE = Integer.getInteger("minestom.packet-queue-size", 1000); public static final int PLAYER_PACKET_QUEUE_SIZE = Integer.getInteger("minestom.packet-queue-size", 1000);
public static final int SEND_LIGHT_AFTER_BLOCK_PLACEMENT_DELAY = Integer.getInteger("minestom.send-light-after-block-placement-delay", 100);
// Packet sending optimizations // Packet sending optimizations
public static final boolean GROUPED_PACKET = PropertyUtils.getBoolean("minestom.grouped-packet", true); public static final boolean GROUPED_PACKET = PropertyUtils.getBoolean("minestom.grouped-packet", true);

View File

@ -63,17 +63,6 @@ public final class BoundingBox implements Shape {
return false; return false;
} }
/**
* Used to know if this {@link BoundingBox} intersects with the bounding box of an entity.
*
* @param entity the entity to check the bounding box
* @return true if this bounding box intersects with the entity, false otherwise
*/
@ApiStatus.Experimental
public boolean intersectEntity(@NotNull Point src, @NotNull Entity entity) {
return intersectBox(src.sub(entity.getPosition()), entity.getBoundingBox());
}
@ApiStatus.Experimental @ApiStatus.Experimental
public boolean boundingBoxRayIntersectionCheck(Vec start, Vec direction, Pos position) { public boolean boundingBoxRayIntersectionCheck(Vec start, Vec direction, Pos position) {
return RayUtils.BoundingBoxRayIntersectionCheck(start, direction, this, position); return RayUtils.BoundingBoxRayIntersectionCheck(start, direction, this, position);

View File

@ -1,6 +1,7 @@
package net.minestom.server.collision; package net.minestom.server.collision;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.entity.Entity;
import net.minestom.server.instance.block.BlockFace; import net.minestom.server.instance.block.BlockFace;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -39,6 +40,18 @@ public interface Shape {
boolean intersectBoxSwept(@NotNull Point rayStart, @NotNull Point rayDirection, boolean intersectBoxSwept(@NotNull Point rayStart, @NotNull Point rayDirection,
@NotNull Point shapePos, @NotNull BoundingBox moving, @NotNull SweepResult finalResult); @NotNull Point shapePos, @NotNull BoundingBox moving, @NotNull SweepResult finalResult);
/**
* Used to know if this {@link BoundingBox} intersects with the bounding box of an entity.
*
* @param entity the entity to check the bounding box
* @return true if this bounding box intersects with the entity, false otherwise
*/
@ApiStatus.Experimental
default boolean intersectEntity(@NotNull Point src, @NotNull Entity entity) {
return intersectBox(src.sub(entity.getPosition()), entity.getBoundingBox());
}
/** /**
* Relative Start * Relative Start
* *

View File

@ -18,6 +18,7 @@ public final class ShapeImpl implements Shape {
private static final Pattern PATTERN = Pattern.compile("\\d.\\d+", Pattern.MULTILINE); private static final Pattern PATTERN = Pattern.compile("\\d.\\d+", Pattern.MULTILINE);
private final BoundingBox[] collisionBoundingBoxes; private final BoundingBox[] collisionBoundingBoxes;
private final Point relativeStart, relativeEnd; private final Point relativeStart, relativeEnd;
private final byte fullFaces;
private final BoundingBox[] occlusionBoundingBoxes; private final BoundingBox[] occlusionBoundingBoxes;
private final byte blockOcclusion; private final byte blockOcclusion;
@ -32,7 +33,7 @@ public final class ShapeImpl implements Shape {
this.blockEntry = blockEntry; this.blockEntry = blockEntry;
// Find bounds of collision // Find bounds of collision
{ if (collisionBoundingBoxes.length > 0) {
double minX = 1, minY = 1, minZ = 1; double minX = 1, minY = 1, minZ = 1;
double maxX = 0, maxY = 0, maxZ = 0; double maxX = 0, maxY = 0, maxZ = 0;
for (BoundingBox blockSection : collisionBoundingBoxes) { for (BoundingBox blockSection : collisionBoundingBoxes) {
@ -47,12 +48,22 @@ public final class ShapeImpl implements Shape {
} }
this.relativeStart = new Vec(minX, minY, minZ); this.relativeStart = new Vec(minX, minY, minZ);
this.relativeEnd = new Vec(maxX, maxY, maxZ); this.relativeEnd = new Vec(maxX, maxY, maxZ);
} else {
this.relativeStart = Vec.ZERO;
this.relativeEnd = Vec.ZERO;
} }
byte fullCollisionFaces = 0;
for (BlockFace f : BlockFace.values()) {
final byte res = isFaceCovered(computeOcclusionSet(f, collisionBoundingBoxes));
fullCollisionFaces |= ((res == 2) ? 0b1 : 0b0) << (byte) f.ordinal();
}
this.fullFaces = fullCollisionFaces;
byte airFaces = 0; byte airFaces = 0;
byte fullFaces = 0; byte fullFaces = 0;
for (BlockFace f : BlockFace.values()) { for (BlockFace f : BlockFace.values()) {
final byte res = isFaceCovered(computeOcclusionSet(f)); final byte res = isFaceCovered(computeOcclusionSet(f, occlusionBoundingBoxes));
airFaces |= ((res == 0) ? 0b1 : 0b0) << (byte) f.ordinal(); airFaces |= ((res == 0) ? 0b1 : 0b0) << (byte) f.ordinal();
fullFaces |= ((res == 2) ? 0b1 : 0b0) << (byte) f.ordinal(); fullFaces |= ((res == 2) ? 0b1 : 0b0) << (byte) f.ordinal();
} }
@ -145,14 +156,14 @@ public final class ShapeImpl implements Shape {
if (hasAirOcclusion || hasAirOcclusionOther) return false; if (hasAirOcclusion || hasAirOcclusionOther) return false;
// Comparing two partial faces. Computation needed // Comparing two partial faces. Computation needed
List<Rectangle> allRectangles = shapeImpl.computeOcclusionSet(face.getOppositeFace()); List<Rectangle> allRectangles = computeOcclusionSet(face.getOppositeFace(), shapeImpl.occlusionBoundingBoxes);
allRectangles.addAll(computeOcclusionSet(face)); allRectangles.addAll(computeOcclusionSet(face, occlusionBoundingBoxes));
return isFaceCovered(allRectangles) == 2; return isFaceCovered(allRectangles) == 2;
} }
@Override @Override
public boolean isFaceFull(@NotNull BlockFace face) { public boolean isFaceFull(@NotNull BlockFace face) {
return (((blockOcclusion >> face.ordinal()) & 1) == 1); return (((fullFaces >> face.ordinal()) & 1) == 1);
} }
@Override @Override
@ -187,9 +198,9 @@ public final class ShapeImpl implements Shape {
return block; return block;
} }
private List<Rectangle> computeOcclusionSet(BlockFace face) { private static @NotNull List<Rectangle> computeOcclusionSet(BlockFace face, BoundingBox[] boundingBoxes) {
List<Rectangle> rSet = new ArrayList<>(); List<Rectangle> rSet = new ArrayList<>();
for (BoundingBox boundingBox : this.occlusionBoundingBoxes) { for (BoundingBox boundingBox : boundingBoxes) {
switch (face) { switch (face) {
case NORTH -> // negative Z case NORTH -> // negative Z
{ {

View File

@ -5,10 +5,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.event.HoverEvent.ShowEntity; import net.kyori.adventure.text.event.HoverEvent.ShowEntity;
import net.kyori.adventure.text.event.HoverEventSource; import net.kyori.adventure.text.event.HoverEventSource;
import net.minestom.server.MinecraftServer; import net.minestom.server.*;
import net.minestom.server.ServerProcess;
import net.minestom.server.Tickable;
import net.minestom.server.Viewable;
import net.minestom.server.collision.*; import net.minestom.server.collision.*;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
@ -31,8 +28,6 @@ import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.block.BlockFace; import net.minestom.server.instance.block.BlockFace;
import net.minestom.server.instance.block.BlockHandler; import net.minestom.server.instance.block.BlockHandler;
import net.minestom.server.network.packet.server.CachedPacket; import net.minestom.server.network.packet.server.CachedPacket;
import net.minestom.server.network.packet.server.LazyPacket;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.play.*; import net.minestom.server.network.packet.server.play.*;
import net.minestom.server.permission.Permission; import net.minestom.server.permission.Permission;
import net.minestom.server.permission.PermissionHandler; import net.minestom.server.permission.PermissionHandler;
@ -56,7 +51,6 @@ import net.minestom.server.utils.block.BlockIterator;
import net.minestom.server.utils.chunk.ChunkCache; import net.minestom.server.utils.chunk.ChunkCache;
import net.minestom.server.utils.chunk.ChunkUtils; import net.minestom.server.utils.chunk.ChunkUtils;
import net.minestom.server.utils.player.PlayerUtils; import net.minestom.server.utils.player.PlayerUtils;
import net.minestom.server.utils.time.Cooldown;
import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.utils.time.TimeUnit;
import net.minestom.server.utils.validate.Check; import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
@ -162,12 +156,15 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
protected boolean removed; protected boolean removed;
private final Set<Entity> passengers = new CopyOnWriteArraySet<>(); private final Set<Entity> passengers = new CopyOnWriteArraySet<>();
private final Set<Entity> leashedEntities = new CopyOnWriteArraySet<>();
private Entity leashHolder;
protected EntityType entityType; // UNSAFE to change, modify at your own risk protected EntityType entityType; // UNSAFE to change, modify at your own risk
// Network synchronization, send the absolute position of the entity each X milliseconds // Network synchronization, send the absolute position of the entity every n ticks
private static final Duration SYNCHRONIZATION_COOLDOWN = Duration.of(1, TimeUnit.MINUTE); private long synchronizationTicks = ServerFlag.ENTITY_SYNCHRONIZATION_TICKS;
private Duration customSynchronizationCooldown; private long nextSynchronizationTick = synchronizationTicks;
private long lastAbsoluteSynchronizationTime;
protected Metadata metadata = new Metadata(this); protected Metadata metadata = new Metadata(this);
protected EntityMeta entityMeta; protected EntityMeta entityMeta;
@ -322,7 +319,7 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
this.position = position; this.position = position;
refreshCoordinate(position); refreshCoordinate(position);
synchronizePosition(true); synchronizePosition(true);
setView(position.yaw(), position.pitch()); sendPacketToViewers(new EntityHeadLookPacket(getEntityId(), position.yaw()));
}; };
if (chunks != null && chunks.length > 0) { if (chunks != null && chunks.length > 0) {
@ -464,7 +461,7 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
public void updateNewViewer(@NotNull Player player) { public void updateNewViewer(@NotNull Player player) {
player.sendPacket(getEntityType().registry().spawnType().getSpawnPacket(this)); player.sendPacket(getEntityType().registry().spawnType().getSpawnPacket(this));
if (hasVelocity()) player.sendPacket(getVelocityPacket()); if (hasVelocity()) player.sendPacket(getVelocityPacket());
player.sendPacket(new LazyPacket(this::getMetadataPacket)); player.sendPacket(getMetadataPacket());
// Passengers // Passengers
final Set<Entity> passengers = this.passengers; final Set<Entity> passengers = this.passengers;
if (!passengers.isEmpty()) { if (!passengers.isEmpty()) {
@ -473,6 +470,15 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
} }
player.sendPacket(getPassengersPacket()); player.sendPacket(getPassengersPacket());
} }
// Leashes
if (leashHolder != null && (player.equals(leashHolder) || leashHolder.isViewer(player))) {
player.sendPacket(getAttachEntityPacket());
}
for (Entity entity : leashedEntities) {
if (entity.isViewer(player)) {
player.sendPacket(entity.getAttachEntityPacket());
}
};
// Head position // Head position
player.sendPacket(new EntityHeadLookPacket(getEntityId(), position.yaw())); player.sendPacket(new EntityHeadLookPacket(getEntityId(), position.yaw()));
} }
@ -491,6 +497,7 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
if (passenger != player) passenger.updateOldViewer(player); if (passenger != player) passenger.updateOldViewer(player);
} }
} }
leashedEntities.forEach(entity -> player.sendPacket(new AttachEntityPacket(entity, null)));
player.sendPacket(destroyPacketCache); player.sendPacket(destroyPacketCache);
} }
@ -567,7 +574,7 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
effectTick(time); effectTick(time);
} }
// Scheduled synchronization // Scheduled synchronization
if (!Cooldown.hasCooldown(time, lastAbsoluteSynchronizationTime, getSynchronizationCooldown())) { if (ticks >= nextSynchronizationTick) {
synchronizePosition(false); synchronizePosition(false);
} }
} }
@ -890,6 +897,7 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
if (this instanceof Player player) { if (this instanceof Player player) {
instance.getWorldBorder().init(player); instance.getWorldBorder().init(player);
player.sendPacket(instance.createTimePacket()); player.sendPacket(instance.createTimePacket());
player.sendPackets(instance.getWeather().createWeatherPackets());
} }
instance.getEntityTracker().register(this, spawnPosition, trackingTarget, trackingUpdate); instance.getEntityTracker().register(this, spawnPosition, trackingTarget, trackingUpdate);
spawn(); spawn();
@ -1098,6 +1106,40 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
return new SetPassengersPacket(getEntityId(), passengers.stream().map(Entity::getEntityId).toList()); return new SetPassengersPacket(getEntityId(), passengers.stream().map(Entity::getEntityId).toList());
} }
/**
* Gets the entities that this entity is leashing.
*
* @return an unmodifiable list containing all the leashed entities
*/
public @NotNull Set<Entity> getLeashedEntities() {
return Collections.unmodifiableSet(leashedEntities);
}
/**
* Gets the current leash holder.
*
* @return the entity leashing this entity, null if no leash holder
*/
public @Nullable Entity getLeashHolder() {
return leashHolder;
}
/**
* Sets the leash holder to this entity.
*
* @param entity the new leash holder
*/
public void setLeashHolder(@Nullable Entity entity) {
if (leashHolder != null) leashHolder.leashedEntities.remove(this);
if (entity != null) entity.leashedEntities.add(this);
this.leashHolder = entity;
sendPacketToViewersAndSelf(getAttachEntityPacket());
}
protected @NotNull AttachEntityPacket getAttachEntityPacket() {
return new AttachEntityPacket(this, leashHolder);
}
/** /**
* Entity statuses can be found <a href="https://wiki.vg/Entity_statuses">here</a>. * Entity statuses can be found <a href="https://wiki.vg/Entity_statuses">here</a>.
* *
@ -1321,6 +1363,11 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
this.position = position; this.position = position;
this.previousPosition = previousPosition; this.previousPosition = previousPosition;
if (!position.samePoint(previousPosition)) refreshCoordinate(position); if (!position.samePoint(previousPosition)) refreshCoordinate(position);
if (nextSynchronizationTick <= ticks + 1) {
// The entity will be synchronized at the end of its tick
// not returning here will duplicate position packets
return;
}
// Update viewers // Update viewers
final boolean viewChange = !position.sameView(lastSyncedPosition); final boolean viewChange = !position.sameView(lastSyncedPosition);
final double distanceX = Math.abs(position.x() - lastSyncedPosition.x()); final double distanceX = Math.abs(position.x() - lastSyncedPosition.x());
@ -1331,7 +1378,7 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
final Chunk chunk = getChunk(); final Chunk chunk = getChunk();
if (distanceX > 8 || distanceY > 8 || distanceZ > 8) { if (distanceX > 8 || distanceY > 8 || distanceZ > 8) {
PacketUtils.prepareViewablePacket(chunk, new EntityTeleportPacket(getEntityId(), position, isOnGround()), this); PacketUtils.prepareViewablePacket(chunk, new EntityTeleportPacket(getEntityId(), position, isOnGround()), this);
this.lastAbsoluteSynchronizationTime = System.currentTimeMillis(); nextSynchronizationTick = synchronizationTicks + 1;
} else if (positionChange && viewChange) { } else if (positionChange && viewChange) {
PacketUtils.prepareViewablePacket(chunk, EntityPositionAndRotationPacket.getPacket(getEntityId(), position, PacketUtils.prepareViewablePacket(chunk, EntityPositionAndRotationPacket.getPacket(getEntityId(), position,
lastSyncedPosition, isOnGround()), this); lastSyncedPosition, isOnGround()), this);
@ -1543,6 +1590,9 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
final Entity vehicle = this.vehicle; final Entity vehicle = this.vehicle;
if (vehicle != null) vehicle.removePassenger(this); if (vehicle != null) vehicle.removePassenger(this);
Set<Entity> leashedEntities = getLeashedEntities();
leashedEntities.forEach(entity -> entity.setLeashHolder(null));
MinecraftServer.process().dispatcher().removeElement(this); MinecraftServer.process().dispatcher().removeElement(this);
this.removed = true; this.removed = true;
if (permanent) { if (permanent) {
@ -1628,9 +1678,11 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
@ApiStatus.Internal @ApiStatus.Internal
protected void synchronizePosition(boolean includeSelf) { protected void synchronizePosition(boolean includeSelf) {
final Pos posCache = this.position; final Pos posCache = this.position;
final ServerPacket packet = new EntityTeleportPacket(getEntityId(), posCache, isOnGround()); PacketUtils.prepareViewablePacket(currentChunk, new EntityTeleportPacket(getEntityId(), posCache, isOnGround()), this);
PacketUtils.prepareViewablePacket(currentChunk, packet, this); if (posCache.yaw() != lastSyncedPosition.yaw()) {
this.lastAbsoluteSynchronizationTime = System.currentTimeMillis(); PacketUtils.prepareViewablePacket(currentChunk, new EntityHeadLookPacket(getEntityId(), position.yaw()), this);
}
nextSynchronizationTick = ticks + synchronizationTicks;
this.lastSyncedPosition = posCache; this.lastSyncedPosition = posCache;
} }
@ -1640,28 +1692,34 @@ public class Entity implements Viewable, Tickable, Schedulable, Snapshotable, Ev
} }
/** /**
* Asks for a synchronization (position) to happen during next entity tick. * Asks for a position synchronization to happen during next entity tick.
*/ */
public void askSynchronization() { public void synchronizeNextTick() {
this.lastAbsoluteSynchronizationTime = 0; this.nextSynchronizationTick = 0;
} }
/** /**
* Set custom cooldown for position synchronization. * Returns the current synchronization interval. The default value is {@link ServerFlag#ENTITY_SYNCHRONIZATION_TICKS}
* but can be overridden per entity with {@link #setSynchronizationTicks(long)}.
* *
* @param cooldown custom cooldown for position synchronization. * @return The current synchronization ticks
*/ */
public void setCustomSynchronizationCooldown(@Nullable Duration cooldown) { public long getSynchronizationTicks() {
this.customSynchronizationCooldown = cooldown; return this.synchronizationTicks;
}
/**
* Set the tick period until this entity's position is synchronized.
*
* @param ticks the new synchronization tick period
*/
public void setSynchronizationTicks(long ticks) {
this.synchronizationTicks = ticks;
} }
@Override @Override
public @NotNull HoverEvent<ShowEntity> asHoverEvent(@NotNull UnaryOperator<ShowEntity> op) { public @NotNull HoverEvent<ShowEntity> asHoverEvent(@NotNull UnaryOperator<ShowEntity> op) {
return HoverEvent.showEntity(ShowEntity.of(this.entityType, this.uuid)); return HoverEvent.showEntity(ShowEntity.showEntity(this.entityType, this.uuid));
}
private Duration getSynchronizationCooldown() {
return Objects.requireNonNullElse(this.customSynchronizationCooldown, SYNCHRONIZATION_COOLDOWN);
} }
@ApiStatus.Experimental @ApiStatus.Experimental

View File

@ -5,6 +5,7 @@ import net.minestom.server.coordinate.Point;
import net.minestom.server.entity.metadata.animal.FrogMeta; import net.minestom.server.entity.metadata.animal.FrogMeta;
import net.minestom.server.entity.metadata.animal.SnifferMeta; import net.minestom.server.entity.metadata.animal.SnifferMeta;
import net.minestom.server.entity.metadata.animal.tameable.CatMeta; import net.minestom.server.entity.metadata.animal.tameable.CatMeta;
import net.minestom.server.entity.metadata.other.PaintingMeta;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.play.EntityMetaDataPacket; import net.minestom.server.network.packet.server.play.EntityMetaDataPacket;
@ -115,6 +116,10 @@ public final class Metadata {
return new MetadataImpl.EntryImpl<>(TYPE_FROG_VARIANT, value, NetworkBuffer.FROG_VARIANT); return new MetadataImpl.EntryImpl<>(TYPE_FROG_VARIANT, value, NetworkBuffer.FROG_VARIANT);
} }
public static Entry<PaintingMeta.Variant> PaintingVariant(@NotNull PaintingMeta.Variant value) {
return new MetadataImpl.EntryImpl<>(TYPE_PAINTINGVARIANT, value, NetworkBuffer.PAINTING_VARIANT);
}
public static Entry<SnifferMeta.State> SnifferState(@NotNull SnifferMeta.State value) { public static Entry<SnifferMeta.State> SnifferState(@NotNull SnifferMeta.State value) {
return new MetadataImpl.EntryImpl<>(TYPE_SNIFFER_STATE, value, NetworkBuffer.SNIFFER_STATE); return new MetadataImpl.EntryImpl<>(TYPE_SNIFFER_STATE, value, NetworkBuffer.SNIFFER_STATE);
} }

View File

@ -5,6 +5,7 @@ import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.metadata.animal.FrogMeta; import net.minestom.server.entity.metadata.animal.FrogMeta;
import net.minestom.server.entity.metadata.animal.SnifferMeta; import net.minestom.server.entity.metadata.animal.SnifferMeta;
import net.minestom.server.entity.metadata.animal.tameable.CatMeta; import net.minestom.server.entity.metadata.animal.tameable.CatMeta;
import net.minestom.server.entity.metadata.other.PaintingMeta;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
@ -45,7 +46,7 @@ final class MetadataImpl {
EMPTY_VALUES.set(TYPE_CAT_VARIANT, CatVariant(CatMeta.Variant.TABBY)); EMPTY_VALUES.set(TYPE_CAT_VARIANT, CatVariant(CatMeta.Variant.TABBY));
EMPTY_VALUES.set(TYPE_FROG_VARIANT, FrogVariant(FrogMeta.Variant.TEMPERATE)); EMPTY_VALUES.set(TYPE_FROG_VARIANT, FrogVariant(FrogMeta.Variant.TEMPERATE));
// OptGlobalPos // OptGlobalPos
// PaintingVariant EMPTY_VALUES.set(TYPE_PAINTINGVARIANT, PaintingVariant(PaintingMeta.Variant.KEBAB));
EMPTY_VALUES.set(TYPE_SNIFFER_STATE, SnifferState(SnifferMeta.State.IDLING)); EMPTY_VALUES.set(TYPE_SNIFFER_STATE, SnifferState(SnifferMeta.State.IDLING));
EMPTY_VALUES.set(TYPE_VECTOR3, Vector3(Vec.ZERO)); EMPTY_VALUES.set(TYPE_VECTOR3, Vector3(Vec.ZERO));
EMPTY_VALUES.set(TYPE_QUATERNION, Quaternion(new float[]{0, 0, 0, 0})); EMPTY_VALUES.set(TYPE_QUATERNION, Quaternion(new float[]{0, 0, 0, 0}));

View File

@ -3,128 +3,159 @@ package net.minestom.server.entity.metadata.other;
import net.minestom.server.entity.Entity; import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata; import net.minestom.server.entity.Metadata;
import net.minestom.server.entity.metadata.EntityMeta; import net.minestom.server.entity.metadata.EntityMeta;
import net.minestom.server.utils.Direction; import net.minestom.server.entity.metadata.ObjectDataProvider;
import net.minestom.server.registry.StaticProtocolObject;
import net.minestom.server.utils.NamespaceID;
import net.minestom.server.utils.validate.Check; import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Locale; import java.util.Locale;
public class PaintingMeta extends EntityMeta { public class PaintingMeta extends EntityMeta implements ObjectDataProvider {
public static final byte OFFSET = EntityMeta.MAX_OFFSET; public static final byte OFFSET = EntityMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 0; public static final byte MAX_OFFSET = OFFSET + 1;
private Motive motive = Motive.KEBAB; private Orientation orientation = null;
private Direction direction = Direction.SOUTH;
public PaintingMeta(@NotNull Entity entity, @NotNull Metadata metadata) { public PaintingMeta(@NotNull Entity entity, @NotNull Metadata metadata) {
super(entity, metadata); super(entity, metadata);
} }
@NotNull public @NotNull Variant getVariant() {
public Motive getMotive() { return super.metadata.getIndex(OFFSET, Variant.KEBAB);
return motive;
} }
/** public void setVariant(@NotNull Variant value) {
* Sets motive of a painting. super.metadata.setIndex(OFFSET, Metadata.PaintingVariant(value));
* This is possible only before spawn packet is sent.
*
* @param motive motive of a painting.
*/
public void setMotive(@NotNull Motive motive) {
this.motive = motive;
} }
@NotNull @NotNull
public Direction getDirection() { public Orientation getOrientation() {
return direction; return this.orientation;
} }
/** /**
* Sets direction of a painting. * Sets orientation of the painting.
* This is possible only before spawn packet is sent. * This is possible only before spawn packet is sent.
* *
* @param direction direction of a painting. * @param orientation the orientation of the painting.
*/ */
public void setDirection(@NotNull Direction direction) { public void setOrientation(@NotNull Orientation orientation) {
Check.argCondition(direction == Direction.UP || direction == Direction.DOWN, "Painting can't look up or down!"); this.orientation = orientation;
this.direction = direction;
} }
/* @Override
TODO: write a parser? public int getObjectData() {
Currently none of existing ones support it. Check.stateCondition(this.orientation == null, "Painting orientation must be set before spawn");
*/ return this.orientation.id();
public enum Motive { }
KEBAB(0, 0, 16, 16),
AZTEC(16, 0, 16, 16),
ALBAN(32, 0, 16, 16),
AZTEC2(48, 0, 16, 16),
BOMB(64, 0, 16, 16),
PLANT(80, 0, 16, 16),
WASTELAND(96, 0, 16, 16),
POOL(0, 32, 32, 16),
COURBET(32, 32, 32, 16),
SEA(64, 32, 32, 16),
SUNSET(96, 32, 32, 16),
CREEBET(128, 32, 32, 16),
WANDERER(0, 64, 16, 32),
GRAHAM(16, 64, 16, 32),
MATCH(0, 128, 32, 32),
BUST(32, 128, 32, 32),
STAGE(64, 128, 32, 32),
VOID(96, 128, 32, 32),
SKULL_AND_ROSES("skull_and_roses", 128, 128, 32, 32),
WITHER(160, 128, 32, 32),
FIGHTERS(0, 96, 64, 32),
POINTER(0, 192, 64, 64),
PIGSCENE(64, 192, 64, 64),
BURNING_SKULL(128, 192, 64, 64),
SKELETON(192, 64, 64, 48),
DONKEY_KONG(192, 112, 64, 48);
private final String name; @Override
private final int x; public boolean requiresVelocityPacketAtSpawn() {
private final int y; return false;
}
public enum Orientation {
NORTH(2),
SOUTH(3),
WEST(4),
EAST(5);
private final int id;
Orientation(int id) {
this.id = id;
}
public int id() {
return id;
}
}
public enum Variant implements StaticProtocolObject {
KEBAB(16, 16),
AZTEC(16, 16),
ALBAN(16, 16),
AZTEC2(16, 16),
BOMB(16, 16),
PLANT(16, 16),
WASTELAND(16, 16),
POOL(32, 16),
COURBET(32, 16),
SEA(32, 16),
SUNSET(32, 16),
CREEBET(32, 16),
WANDERER(16, 32),
GRAHAM(16, 32),
MATCH(32, 32),
BUST(32, 32),
STAGE(32, 32),
VOID(32, 32),
SKULL_AND_ROSES(32, 32),
WITHER(32, 32),
FIGHTERS(64, 32),
POINTER(64, 64),
PIGSCENE(64, 64),
BURNING_SKULL(64, 64),
SKELETON(64, 48),
EARTH(32, 32),
WIND(32, 32),
WATER(32, 32),
FIRE(32, 32),
DONKEY_KONG(64, 48);
private static final Variant[] VALUES = values();
public static @Nullable Variant fromId(int id) {
if (id < 0 || id >= VALUES.length) {
return null;
}
return VALUES[id];
}
public static @Nullable Variant fromNamespaceId(@Nullable String namespaceId) {
if (namespaceId == null) return null;
return fromNamespaceId(NamespaceID.from(namespaceId));
}
public static @Nullable Variant fromNamespaceId(@Nullable NamespaceID namespaceId) {
if (namespaceId == null) return null;
for (Variant value : VALUES) {
if (value.namespace().equals(namespaceId)) {
return value;
}
}
return null;
}
private final NamespaceID namespace;
private final int width; private final int width;
private final int height; private final int height;
Motive(String name, int x, int y, int width, int height) { Variant(int width, int height) {
this.name = name; this.namespace = NamespaceID.from("minecraft", name().toLowerCase(Locale.ROOT));
this.x = x;
this.y = y;
this.width = width; this.width = width;
this.height = height; this.height = height;
} }
Motive(int x, int y, int width, int height) { @Override
this.name = "minecraft:" + name().toLowerCase(Locale.ROOT); public int id() {
this.x = x; return ordinal();
this.y = y;
this.width = width;
this.height = height;
} }
public String getName() { public int width() {
return this.name; return width;
} }
public int getX() { public int height() {
return this.x; return height;
} }
public int getY() { @Override
return this.y; public @NotNull NamespaceID namespace() {
return namespace;
} }
public int getWidth() {
return this.width;
}
public int getHeight() {
return this.height;
}
} }
} }

View File

@ -271,6 +271,11 @@ public abstract class Chunk implements Block.Getter, Block.Setter, Biome.Getter,
*/ */
protected void onLoad() {} protected void onLoad() {}
/**
* Called when the chunk generator has finished generating the chunk.
*/
public void onGenerate() {}
@Override @Override
public String toString() { public String toString() {
return getClass().getSimpleName() + "[" + chunkX + ":" + chunkZ + "]"; return getClass().getSimpleName() + "[" + chunkX + ":" + chunkZ + "]";

View File

@ -82,6 +82,11 @@ public abstract class Instance implements Block.Getter, Block.Setter,
private Duration timeUpdate = Duration.of(1, TimeUnit.SECOND); private Duration timeUpdate = Duration.of(1, TimeUnit.SECOND);
private long lastTimeUpdate; private long lastTimeUpdate;
// Weather of the instance
private Weather targetWeather = new Weather(false, 0, 0);
private Weather currentWeather = new Weather(false, 0, 0);
private int remainingWeatherTransitionTicks;
// Field for tick events // Field for tick events
private long lastTickAge = System.currentTimeMillis(); private long lastTickAge = System.currentTimeMillis();
@ -664,6 +669,13 @@ public abstract class Instance implements Block.Getter, Block.Setter,
} }
} }
// Weather
if (remainingWeatherTransitionTicks > 0) {
Weather previousWeather = currentWeather;
currentWeather = transitionWeather(remainingWeatherTransitionTicks);
sendWeatherPackets(previousWeather);
remainingWeatherTransitionTicks--;
}
// Tick event // Tick event
{ {
// Process tick events // Process tick events
@ -674,6 +686,45 @@ public abstract class Instance implements Block.Getter, Block.Setter,
this.worldBorder.update(); this.worldBorder.update();
} }
/**
* Gets the current weather on this instance
*
* @return the current weather
*/
public @NotNull Weather getWeather() {
return currentWeather;
}
/**
* Sets the weather on this instance, transitions over time
*
* @param weather the new weather
* @param transitionTicks the ticks to transition to new weather
*/
public void setWeather(@NotNull Weather weather, int transitionTicks) {
Check.stateCondition(transitionTicks < 1, "Transition ticks cannot be lower than 1");
targetWeather = weather;
remainingWeatherTransitionTicks = transitionTicks;
}
private void sendWeatherPackets(@NotNull Weather previousWeather) {
if (currentWeather.isRaining() != previousWeather.isRaining()) sendGroupedPacket(currentWeather.createIsRainingPacket());
if (currentWeather.rainLevel() != previousWeather.rainLevel()) sendGroupedPacket(currentWeather.createRainLevelPacket());
if (currentWeather.thunderLevel() != previousWeather.thunderLevel()) sendGroupedPacket(currentWeather.createThunderLevelPacket());
}
private @NotNull Weather transitionWeather(int remainingTicks) {
Weather target = targetWeather;
Weather current = currentWeather;
if (remainingTicks <= 1) {
return new Weather(target.isRaining(), target.isRaining() ? target.rainLevel() : 0,
target.isRaining() ? target.thunderLevel() : 0);
}
float rainLevel = current.rainLevel() + (target.rainLevel() - current.rainLevel()) * (1 / (float)remainingTicks);
float thunderLevel = current.thunderLevel() + (target.thunderLevel() - current.thunderLevel()) * (1 / (float)remainingTicks);
return new Weather(rainLevel > 0, rainLevel, thunderLevel);
}
@Override @Override
public @NotNull TagHandler tagHandler() { public @NotNull TagHandler tagHandler() {
return tagHandler; return tagHandler;

View File

@ -298,7 +298,7 @@ public class InstanceContainer extends Instance {
return CompletableFuture.completedFuture(chunk); return CompletableFuture.completedFuture(chunk);
} else { } else {
// Loader couldn't load the chunk, generate it // Loader couldn't load the chunk, generate it
return createChunk(chunkX, chunkZ); return createChunk(chunkX, chunkZ).whenComplete((c, a) -> c.onGenerate());
} }
}) })
// cache the retrieved chunk // cache the retrieved chunk

View File

@ -1,6 +1,7 @@
package net.minestom.server.instance; package net.minestom.server.instance;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.ServerFlag;
import net.minestom.server.collision.Shape; import net.minestom.server.collision.Shape;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Vec; import net.minestom.server.coordinate.Vec;
@ -8,10 +9,7 @@ import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.block.BlockFace; import net.minestom.server.instance.block.BlockFace;
import net.minestom.server.instance.block.BlockHandler; import net.minestom.server.instance.block.BlockHandler;
import net.minestom.server.instance.light.Light; import net.minestom.server.instance.light.Light;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.packet.server.CachedPacket; import net.minestom.server.network.packet.server.CachedPacket;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.play.UpdateLightPacket;
import net.minestom.server.network.packet.server.play.data.LightData; import net.minestom.server.network.packet.server.play.data.LightData;
import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.MathUtils;
import net.minestom.server.utils.NamespaceID; import net.minestom.server.utils.NamespaceID;
@ -26,6 +24,8 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import static net.minestom.server.instance.light.LightCompute.emptyContent; import static net.minestom.server.instance.light.LightCompute.emptyContent;
@ -41,9 +41,16 @@ public class LightingChunk extends DynamicChunk {
private int[] heightmap; private int[] heightmap;
final CachedPacket lightCache = new CachedPacket(this::createLightPacket); final CachedPacket lightCache = new CachedPacket(this::createLightPacket);
private LightData lightData;
boolean chunkLoaded = false; boolean chunkLoaded = false;
private int highestBlock; private int highestBlock;
private boolean initialLightingSent = false;
private final ReentrantLock packetGenerationLock = new ReentrantLock();
private final AtomicInteger resendTimer = new AtomicInteger(-1);
private final int resendDelay = ServerFlag.SEND_LIGHT_AFTER_BLOCK_PLACEMENT_DELAY;
private boolean doneInit = false;
enum LightType { enum LightType {
SKY, SKY,
@ -67,6 +74,7 @@ public class LightingChunk extends DynamicChunk {
Block.DARK_OAK_LEAVES.namespace(), Block.DARK_OAK_LEAVES.namespace(),
Block.FLOWERING_AZALEA_LEAVES.namespace(), Block.FLOWERING_AZALEA_LEAVES.namespace(),
Block.JUNGLE_LEAVES.namespace(), Block.JUNGLE_LEAVES.namespace(),
Block.CHERRY_LEAVES.namespace(),
Block.OAK_LEAVES.namespace(), Block.OAK_LEAVES.namespace(),
Block.SPRUCE_LEAVES.namespace(), Block.SPRUCE_LEAVES.namespace(),
Block.SPAWNER.namespace(), Block.SPAWNER.namespace(),
@ -83,6 +91,7 @@ public class LightingChunk extends DynamicChunk {
public void invalidate() { public void invalidate() {
this.lightCache.invalidate(); this.lightCache.invalidate();
this.chunkCache.invalidate(); this.chunkCache.invalidate();
this.lightData = null;
} }
public LightingChunk(@NotNull Instance instance, int chunkX, int chunkZ) { public LightingChunk(@NotNull Instance instance, int chunkX, int chunkZ) {
@ -107,8 +116,7 @@ public class LightingChunk extends DynamicChunk {
if (neighborChunk == null) continue; if (neighborChunk == null) continue;
if (neighborChunk instanceof LightingChunk light) { if (neighborChunk instanceof LightingChunk light) {
light.lightCache.invalidate(); light.invalidate();
light.chunkCache.invalidate();
} }
for (int k = -1; k <= 1; k++) { for (int k = -1; k <= 1; k++) {
@ -132,6 +140,19 @@ public class LightingChunk extends DynamicChunk {
if (chunkLoaded) { if (chunkLoaded) {
invalidateSection(coordinate); invalidateSection(coordinate);
this.lightCache.invalidate(); this.lightCache.invalidate();
if (doneInit) {
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
Chunk neighborChunk = instance.getChunk(chunkX + i, chunkZ + j);
if (neighborChunk == null) continue;
if (neighborChunk instanceof LightingChunk light) {
light.resendTimer.set(resendDelay);
}
}
}
}
} }
} }
@ -143,10 +164,41 @@ public class LightingChunk extends DynamicChunk {
@Override @Override
protected void onLoad() { protected void onLoad() {
chunkLoaded = true; chunkLoaded = true;
doneInit = true;
} }
public boolean isLightingCalculated() { @Override
return initialLightingSent; public void onGenerate() {
super.onGenerate();
for (int section = minSection; section < maxSection; section++) {
getSection(section).blockLight().invalidate();
getSection(section).skyLight().invalidate();
}
invalidate();
MinecraftServer.getSchedulerManager().scheduleNextTick(() -> {
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
Chunk neighborChunk = instance.getChunk(chunkX + i, chunkZ + j);
if (neighborChunk == null) continue;
if (neighborChunk instanceof LightingChunk light) {
for (int section = light.minSection; section < light.maxSection; section++) {
light.getSection(section).blockLight().invalidate();
light.getSection(section).skyLight().invalidate();
}
light.invalidate();
light.resendTimer.set(20);
}
}
}
});
doneInit = true;
} }
@Override @Override
@ -175,11 +227,11 @@ public class LightingChunk extends DynamicChunk {
int height = maxY; int height = maxY;
while (height > minY) { while (height > minY) {
Block block = getBlock(x, height, z, Condition.TYPE); Block block = getBlock(x, height, z, Condition.TYPE);
if (block != Block.AIR) highestBlock = Math.max(highestBlock, height);
if (checkSkyOcclusion(block)) break; if (checkSkyOcclusion(block)) break;
height--; height--;
} }
heightmap[z << 4 | x] = (height + 1); heightmap[z << 4 | x] = (height + 1);
if (height > highestBlock) highestBlock = height;
} }
} }
} }
@ -190,93 +242,95 @@ public class LightingChunk extends DynamicChunk {
@Override @Override
protected LightData createLightData() { protected LightData createLightData() {
if (lightCache.isValid()) { packetGenerationLock.lock();
ServerPacket packet = lightCache.packet(ConnectionState.PLAY); if (lightData != null) {
return ((UpdateLightPacket) packet).lightData(); packetGenerationLock.unlock();
return lightData;
} }
synchronized (lightCache) { BitSet skyMask = new BitSet();
BitSet skyMask = new BitSet(); BitSet blockMask = new BitSet();
BitSet blockMask = new BitSet(); BitSet emptySkyMask = new BitSet();
BitSet emptySkyMask = new BitSet(); BitSet emptyBlockMask = new BitSet();
BitSet emptyBlockMask = new BitSet(); List<byte[]> skyLights = new ArrayList<>();
List<byte[]> skyLights = new ArrayList<>(); List<byte[]> blockLights = new ArrayList<>();
List<byte[]> blockLights = new ArrayList<>();
Set<Chunk> combined = new HashSet<>(); int chunkMin = instance.getDimensionType().getMinY();
int chunkMin = instance.getDimensionType().getMinY();
int index = 0; int highestNeighborBlock = instance.getDimensionType().getMinY();
for (Section section : sections) { for (int i = -1; i <= 1; i++) {
boolean wasUpdatedBlock = false; for (int j = -1; j <= 1; j++) {
boolean wasUpdatedSky = false; Chunk neighborChunk = instance.getChunk(chunkX + i, chunkZ + j);
if (neighborChunk == null) continue;
if (section.blockLight().requiresUpdate()) { if (neighborChunk instanceof LightingChunk light) {
var needsSend = relightSection(instance, this.chunkX, index + minSection, chunkZ, LightType.BLOCK); light.getHeightmap();
combined.addAll(needsSend); highestNeighborBlock = Math.max(highestNeighborBlock, light.highestBlock);
wasUpdatedBlock = true;
} else if (section.blockLight().requiresSend()) {
wasUpdatedBlock = true;
} }
}
}
if (section.skyLight().requiresUpdate()) { int index = 0;
var needsSend = relightSection(instance, this.chunkX, index + minSection, chunkZ, LightType.SKY); for (Section section : sections) {
combined.addAll(needsSend); boolean wasUpdatedBlock = false;
wasUpdatedSky = true; boolean wasUpdatedSky = false;
} else if (section.skyLight().requiresSend()) {
wasUpdatedSky = true;
}
index++; if (section.blockLight().requiresUpdate()) {
relightSection(instance, this.chunkX, index + minSection, chunkZ, LightType.BLOCK);
wasUpdatedBlock = true;
} else if (section.blockLight().requiresSend()) {
wasUpdatedBlock = true;
}
final byte[] skyLight = section.skyLight().array(); if (section.skyLight().requiresUpdate()) {
final byte[] blockLight = section.blockLight().array(); relightSection(instance, this.chunkX, index + minSection, chunkZ, LightType.SKY);
final int sectionMaxY = index * 16 + chunkMin; wasUpdatedSky = true;
} else if (section.skyLight().requiresSend()) {
wasUpdatedSky = true;
}
if ((wasUpdatedSky) && this.instance.getDimensionType().isSkylightEnabled() && sectionMaxY <= (highestBlock + 16)) { index++;
if (skyLight.length != 0 && skyLight != emptyContent) {
skyLights.add(skyLight);
skyMask.set(index);
} else {
emptySkyMask.set(index);
}
}
if (wasUpdatedBlock) { final byte[] skyLight = section.skyLight().array();
if (blockLight.length != 0 && blockLight != emptyContent) { final byte[] blockLight = section.blockLight().array();
blockLights.add(blockLight); final int sectionMaxY = index * 16 + chunkMin;
blockMask.set(index);
} else { if ((wasUpdatedSky) && this.instance.getDimensionType().isSkylightEnabled() && sectionMaxY <= (highestNeighborBlock + 16)) {
emptyBlockMask.set(index); if (skyLight.length != 0 && skyLight != emptyContent) {
} skyLights.add(skyLight);
skyMask.set(index);
} else {
emptySkyMask.set(index);
} }
} }
MinecraftServer.getSchedulerManager().scheduleNextTick(() -> { if (wasUpdatedBlock) {
for (Chunk chunk : combined) { if (blockLight.length != 0 && blockLight != emptyContent) {
if (chunk instanceof LightingChunk light) { blockLights.add(blockLight);
if (light.initialLightingSent) { blockMask.set(index);
light.lightCache.invalidate(); } else {
light.chunkCache.invalidate(); emptyBlockMask.set(index);
// Compute Lighting. This will ensure lighting is computed even with no players
lightCache.body(ConnectionState.PLAY);
light.sendLighting();
light.sections.forEach(s -> {
s.blockLight().setRequiresSend(true);
s.skyLight().setRequiresSend(true);
});
}
}
} }
}
}
this.initialLightingSent = true; this.lightData = new LightData(skyMask, blockMask,
}); emptySkyMask, emptyBlockMask,
skyLights, blockLights);
return new LightData(skyMask, blockMask, packetGenerationLock.unlock();
emptySkyMask, emptyBlockMask,
skyLights, blockLights); return this.lightData;
}
@Override
public void tick(long time) {
super.tick(time);
if (doneInit && resendTimer.get() > 0) {
if (resendTimer.decrementAndGet() == 0) {
sendLighting();
}
} }
} }
@ -344,8 +398,7 @@ public class LightingChunk extends DynamicChunk {
sections.add(new Vec(chunk.getChunkX(), section, chunk.getChunkZ())); sections.add(new Vec(chunk.getChunkX(), section, chunk.getChunkZ()));
} }
lighting.lightCache.invalidate(); lighting.invalidate();
lighting.chunkCache.invalidate();
} }
} }

View File

@ -0,0 +1,75 @@
package net.minestom.server.instance;
import it.unimi.dsi.fastutil.floats.FloatUnaryOperator;
import net.minestom.server.network.packet.server.SendablePacket;
import net.minestom.server.network.packet.server.play.ChangeGameStatePacket;
import net.minestom.server.utils.MathUtils;
import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
/**
* Represents the possible weather properties of an instance
*
* @param isRaining true if the instance is raining, otherwise false
* @param rainLevel a percentage between 0 and 1
* used to change how heavy the rain is
* higher values darken the sky and increase rain opacity
* @param thunderLevel a percentage between 0 and 1
* used to change how heavy the thunder is
* higher values further darken the sky
*/
public record Weather(boolean isRaining, float rainLevel, float thunderLevel) {
/**
* @throws IllegalArgumentException if {@code rainLevel} is not between 0 and 1
* @throws IllegalArgumentException if {@code thunderLevel} is not between 0 and 1
*/
public Weather {
Check.argCondition(!MathUtils.isBetween(rainLevel, 0, 1), "Rain level should be between 0 and 1");
Check.argCondition(!MathUtils.isBetween(thunderLevel, 0, 1), "Thunder level should be between 0 and 1");
}
@Contract(pure = true)
public @NotNull Weather withRain(boolean isRaining) {
return new Weather(isRaining, rainLevel, thunderLevel);
}
@Contract(pure = true)
public @NotNull Weather withRainLevel(float rainLevel) {
return new Weather(isRaining, rainLevel, thunderLevel);
}
@Contract(pure = true)
public @NotNull Weather withRainLevel(@NotNull FloatUnaryOperator operator) {
return withRainLevel(operator.apply(rainLevel));
}
@Contract(pure = true)
public @NotNull Weather withThunderLevel(float thunderLevel) {
return new Weather(isRaining, rainLevel, thunderLevel);
}
@Contract(pure = true)
public @NotNull Weather withThunderLevel(@NotNull FloatUnaryOperator operator) {
return withRainLevel(operator.apply(thunderLevel));
}
public ChangeGameStatePacket createIsRainingPacket() {
return new ChangeGameStatePacket(isRaining ? ChangeGameStatePacket.Reason.BEGIN_RAINING : ChangeGameStatePacket.Reason.END_RAINING, 0);
}
public ChangeGameStatePacket createRainLevelPacket() {
return new ChangeGameStatePacket(ChangeGameStatePacket.Reason.RAIN_LEVEL_CHANGE, rainLevel);
}
public ChangeGameStatePacket createThunderLevelPacket() {
return new ChangeGameStatePacket(ChangeGameStatePacket.Reason.THUNDER_LEVEL_CHANGE, thunderLevel);
}
public @NotNull Collection<SendablePacket> createWeatherPackets() {
return List.of(createIsRainingPacket(), createRainLevelPacket(), createThunderLevelPacket());
}
}

View File

@ -24,7 +24,7 @@ final class BlockLight implements Light {
private byte[] contentPropagation; private byte[] contentPropagation;
private byte[] contentPropagationSwap; private byte[] contentPropagationSwap;
private boolean isValidBorders = false; private boolean isValidBorders = true;
private boolean needsSend = true; private boolean needsSend = true;
private Set<Point> toUpdateSet = new HashSet<>(); private Set<Point> toUpdateSet = new HashSet<>();
@ -34,27 +34,6 @@ final class BlockLight implements Light {
this.blockPalette = blockPalette; this.blockPalette = blockPalette;
} }
@ApiStatus.Internal
public void setInternalLighting(byte[] content) {
this.content = content;
this.isValidBorders = true;
}
@ApiStatus.Internal
public void setExternalLighting(byte[] content) {
this.contentPropagation = content;
}
@ApiStatus.Internal
public byte[] getInternalLighting() {
return content;
}
@ApiStatus.Internal
public byte[] getExternalLighting() {
return contentPropagation;
}
@Override @Override
public Set<Point> flip() { public Set<Point> flip() {
if (this.contentPropagationSwap != null) if (this.contentPropagationSwap != null)
@ -164,12 +143,6 @@ final class BlockLight implements Light {
return lightSources; return lightSources;
} }
@Override
public void copyFrom(byte @NotNull [] array) {
if (array.length == 0) this.content = null;
else this.content = array.clone();
}
@Override @Override
public Light calculateInternal(Instance instance, int chunkX, int sectionY, int chunkZ) { public Light calculateInternal(Instance instance, int chunkX, int sectionY, int chunkZ) {
Chunk chunk = instance.getChunk(chunkX, chunkZ); Chunk chunk = instance.getChunk(chunkX, chunkZ);
@ -223,7 +196,13 @@ final class BlockLight implements Light {
@Override @Override
public void set(byte[] copyArray) { public void set(byte[] copyArray) {
this.content = copyArray.clone(); if (copyArray.length == 0) {
this.content = emptyContent;
this.contentPropagation = emptyContent;
} else {
this.content = copyArray.clone();
this.contentPropagation = this.content;
}
} }
@Override @Override
@ -233,11 +212,6 @@ final class BlockLight implements Light {
return res; return res;
} }
@Override
public void setRequiresSend(boolean b) {
this.needsSend = b;
}
private void clearCache() { private void clearCache() {
this.contentPropagation = null; this.contentPropagation = null;
isValidBorders = true; isValidBorders = true;

View File

@ -27,15 +27,12 @@ public interface Light {
} }
boolean requiresSend(); boolean requiresSend();
void setRequiresSend(boolean b);
@ApiStatus.Internal @ApiStatus.Internal
byte[] array(); byte[] array();
Set<Point> flip(); Set<Point> flip();
void copyFrom(byte @NotNull [] array);
@ApiStatus.Internal @ApiStatus.Internal
Light calculateExternal(Instance instance, Chunk chunk, int sectionY); Light calculateExternal(Instance instance, Chunk chunk, int sectionY);

View File

@ -25,7 +25,7 @@ final class SkyLight implements Light {
private byte[] contentPropagation; private byte[] contentPropagation;
private byte[] contentPropagationSwap; private byte[] contentPropagationSwap;
private boolean isValidBorders = false; private boolean isValidBorders = true;
private boolean needsSend = true; private boolean needsSend = true;
private Set<Point> toUpdateSet = new HashSet<>(); private Set<Point> toUpdateSet = new HashSet<>();
@ -160,12 +160,6 @@ final class SkyLight implements Light {
return lightSources; return lightSources;
} }
@Override
public void copyFrom(byte @NotNull [] array) {
if (array.length == 0) this.content = null;
else this.content = array.clone();
}
@Override @Override
public Light calculateInternal(Instance instance, int chunkX, int sectionY, int chunkZ) { public Light calculateInternal(Instance instance, int chunkX, int sectionY, int chunkZ) {
Chunk chunk = instance.getChunk(chunkX, chunkZ); Chunk chunk = instance.getChunk(chunkX, chunkZ);
@ -228,7 +222,13 @@ final class SkyLight implements Light {
@Override @Override
public void set(byte[] copyArray) { public void set(byte[] copyArray) {
this.content = copyArray.clone(); if (copyArray.length == 0) {
this.content = emptyContent;
this.contentPropagation = emptyContent;
} else {
this.content = copyArray.clone();
this.contentPropagation = this.content;
}
} }
@Override @Override
@ -238,11 +238,6 @@ final class SkyLight implements Light {
return res; return res;
} }
@Override
public void setRequiresSend(boolean b) {
this.needsSend = b;
}
private void clearCache() { private void clearCache() {
this.contentPropagation = null; this.contentPropagation = null;
isValidBorders = true; isValidBorders = true;

View File

@ -18,6 +18,11 @@ public final class CreativeInventoryActionListener {
player.dropItem(item); player.dropItem(item);
return; return;
} }
// Bounds check
// 0 is crafting result inventory slot, ignore attempts to place into it
if (slot < 1 || slot > PlayerInventoryUtils.OFFHAND_SLOT) {
return;
}
// Set item // Set item
slot = (short) PlayerInventoryUtils.convertPlayerInventorySlot(slot, PlayerInventoryUtils.OFFSET); slot = (short) PlayerInventoryUtils.convertPlayerInventorySlot(slot, PlayerInventoryUtils.OFFSET);
PlayerInventory inventory = player.getInventory(); PlayerInventory inventory = player.getInventory();

View File

@ -1,19 +1,12 @@
package net.minestom.server.network; package net.minestom.server.network;
import java.util.BitSet;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.UUID;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.entity.Entity; import net.minestom.server.entity.Entity;
import net.minestom.server.entity.metadata.animal.FrogMeta; import net.minestom.server.entity.metadata.animal.FrogMeta;
import net.minestom.server.entity.metadata.animal.SnifferMeta; import net.minestom.server.entity.metadata.animal.SnifferMeta;
import net.minestom.server.entity.metadata.animal.tameable.CatMeta; import net.minestom.server.entity.metadata.animal.tameable.CatMeta;
import net.minestom.server.entity.metadata.other.PaintingMeta;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.server.play.data.DeathLocation; import net.minestom.server.network.packet.server.play.data.DeathLocation;
import net.minestom.server.particle.Particle; import net.minestom.server.particle.Particle;
@ -29,6 +22,7 @@ import org.jglrxavpok.hephaistos.nbt.NBTWriter;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.*;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
@ -73,6 +67,7 @@ public final class NetworkBuffer {
public static final Type<DeathLocation> DEATH_LOCATION = NetworkBufferTypes.DEATH_LOCATION; public static final Type<DeathLocation> DEATH_LOCATION = NetworkBufferTypes.DEATH_LOCATION;
public static final Type<CatMeta.Variant> CAT_VARIANT = NetworkBufferTypes.CAT_VARIANT; public static final Type<CatMeta.Variant> CAT_VARIANT = NetworkBufferTypes.CAT_VARIANT;
public static final Type<FrogMeta.Variant> FROG_VARIANT = NetworkBufferTypes.FROG_VARIANT; public static final Type<FrogMeta.Variant> FROG_VARIANT = NetworkBufferTypes.FROG_VARIANT;
public static final Type<PaintingMeta.Variant> PAINTING_VARIANT = NetworkBufferTypes.PAINTING_VARIANT;
public static final Type<SnifferMeta.State> SNIFFER_STATE = NetworkBufferTypes.SNIFFER_STATE; public static final Type<SnifferMeta.State> SNIFFER_STATE = NetworkBufferTypes.SNIFFER_STATE;
public static final Type<Point> VECTOR3 = NetworkBufferTypes.VECTOR3; public static final Type<Point> VECTOR3 = NetworkBufferTypes.VECTOR3;
public static final Type<Point> VECTOR3D = NetworkBufferTypes.VECTOR3D; public static final Type<Point> VECTOR3D = NetworkBufferTypes.VECTOR3D;

View File

@ -9,6 +9,7 @@ import net.minestom.server.entity.Entity;
import net.minestom.server.entity.metadata.animal.FrogMeta; import net.minestom.server.entity.metadata.animal.FrogMeta;
import net.minestom.server.entity.metadata.animal.SnifferMeta; import net.minestom.server.entity.metadata.animal.SnifferMeta;
import net.minestom.server.entity.metadata.animal.tameable.CatMeta; import net.minestom.server.entity.metadata.animal.tameable.CatMeta;
import net.minestom.server.entity.metadata.other.PaintingMeta;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import net.minestom.server.network.packet.server.play.data.DeathLocation; import net.minestom.server.network.packet.server.play.data.DeathLocation;
@ -578,6 +579,15 @@ final class NetworkBufferTypes {
final int ordinal = buffer.read(VAR_INT); final int ordinal = buffer.read(VAR_INT);
return FrogMeta.Variant.values()[ordinal]; return FrogMeta.Variant.values()[ordinal];
}); });
static final TypeImpl<PaintingMeta.Variant> PAINTING_VARIANT = new TypeImpl<>(PaintingMeta.Variant.class,
(buffer, value) -> {
buffer.write(VAR_INT, value.ordinal());
return -1;
},
buffer -> {
final int ordinal = buffer.read(VAR_INT);
return PaintingMeta.Variant.values()[ordinal];
});
static final TypeImpl<SnifferMeta.State> SNIFFER_STATE = new TypeImpl<>(SnifferMeta.State.class, static final TypeImpl<SnifferMeta.State> SNIFFER_STATE = new TypeImpl<>(SnifferMeta.State.class,
(buffer, value) -> { (buffer, value) -> {
buffer.write(VAR_INT, value.ordinal()); buffer.write(VAR_INT, value.ordinal());

View File

@ -1,8 +1,6 @@
package net.minestom.server.network.packet.client; package net.minestom.server.network.packet.client;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import org.jetbrains.annotations.Nullable;
/** /**
* Represents a packet received from a client. * Represents a packet received from a client.
@ -10,8 +8,4 @@ import org.jetbrains.annotations.Nullable;
* Packets are value-based, and should therefore not be reliant on identity. * Packets are value-based, and should therefore not be reliant on identity.
*/ */
public interface ClientPacket extends NetworkBuffer.Writer { public interface ClientPacket extends NetworkBuffer.Writer {
default @Nullable ConnectionState nextState() {
return null;
}
} }

View File

@ -1,12 +1,10 @@
package net.minestom.server.network.packet.client.play; package net.minestom.server.network.packet.client.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.packet.client.ClientPacket;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public record ClientConfigurationAckPacket() implements ClientPacket { public record ClientConfigurationAckPacket() implements ClientPacket {
public ClientConfigurationAckPacket(@NotNull NetworkBuffer buffer) { public ClientConfigurationAckPacket(@NotNull NetworkBuffer buffer) {
this(); this();
} }
@ -14,9 +12,4 @@ public record ClientConfigurationAckPacket() implements ClientPacket {
@Override @Override
public void write(@NotNull NetworkBuffer writer) { public void write(@NotNull NetworkBuffer writer) {
} }
@Override
public @NotNull ConnectionState nextState() {
return ConnectionState.CONFIGURATION;
}
} }

View File

@ -1,8 +0,0 @@
package net.minestom.server.network.packet.server;
import net.minestom.server.adventure.ComponentHolder;
/**
* A server packet that can hold components.
*/
public interface ComponentHoldingServerPacket extends ServerPacket, ComponentHolder<ServerPacket> { }

View File

@ -1,17 +1,22 @@
package net.minestom.server.network.packet.server; package net.minestom.server.network.packet.server;
import net.minestom.server.adventure.ComponentHolder;
import net.minestom.server.network.ConnectionState; import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.network.player.PlayerConnection;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
/** /**
* Represents a packet which can be sent to a player using {@link PlayerConnection#sendPacket(SendablePacket)}. * Represents a packet which can be sent to a player using {@link PlayerConnection#sendPacket(SendablePacket)}.
* <p> * <p>
* Packets are value-based, and should therefore not be reliant on identity. * Packets are value-based, and should therefore not be reliant on identity.
*/ */
public non-sealed interface ServerPacket extends NetworkBuffer.Writer, SendablePacket { public sealed interface ServerPacket extends NetworkBuffer.Writer, SendablePacket permits
ServerPacket.Configuration, ServerPacket.Status, ServerPacket.Login, ServerPacket.Play {
/** /**
* Gets the id of this packet. * Gets the id of this packet.
@ -20,6 +25,40 @@ public non-sealed interface ServerPacket extends NetworkBuffer.Writer, SendableP
* *
* @return the id of this packet * @return the id of this packet
*/ */
int getId(@NotNull ConnectionState state); default int getId(@NotNull ConnectionState state) {
final int id = switch (state) {
case HANDSHAKE -> -1;
case CONFIGURATION -> this instanceof Configuration configuration ? configuration.configurationId() : -1;
case STATUS -> this instanceof Status status ? status.statusId() : -1;
case LOGIN -> this instanceof Login login ? login.loginId() : -1;
case PLAY -> this instanceof Play play ? play.playId() : -1;
};
if (id != -1) return id;
// Invalid state, generate error
List<ConnectionState> validStates = new ArrayList<>();
if (this instanceof Configuration) validStates.add(ConnectionState.CONFIGURATION);
if (this instanceof Status) validStates.add(ConnectionState.STATUS);
if (this instanceof Login) validStates.add(ConnectionState.LOGIN);
if (this instanceof Play) validStates.add(ConnectionState.PLAY);
return PacketUtils.invalidPacketState(getClass(), state, validStates.toArray(ConnectionState[]::new));
}
non-sealed interface Configuration extends ServerPacket {
int configurationId();
}
non-sealed interface Status extends ServerPacket {
int statusId();
}
non-sealed interface Login extends ServerPacket {
int loginId();
}
non-sealed interface Play extends ServerPacket {
int playId();
}
interface ComponentHolding extends ComponentHolder<ServerPacket> {
}
} }

View File

@ -1,12 +1,9 @@
package net.minestom.server.network.packet.server.common; package net.minestom.server.network.packet.server.common;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
@ -15,7 +12,8 @@ import java.util.function.UnaryOperator;
import static net.minestom.server.network.NetworkBuffer.COMPONENT; import static net.minestom.server.network.NetworkBuffer.COMPONENT;
public record DisconnectPacket(@NotNull Component message) implements ComponentHoldingServerPacket { public record DisconnectPacket(@NotNull Component message) implements ServerPacket.Configuration, ServerPacket.Play,
ServerPacket.ComponentHolding {
public DisconnectPacket(@NotNull NetworkBuffer reader) { public DisconnectPacket(@NotNull NetworkBuffer reader) {
this(reader.read(COMPONENT)); this(reader.read(COMPONENT));
} }
@ -26,12 +24,13 @@ public record DisconnectPacket(@NotNull Component message) implements ComponentH
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_DISCONNECT;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_DISCONNECT; }
case PLAY -> ServerPacketIdentifier.DISCONNECT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION, ConnectionState.PLAY); @Override
}; public int playId() {
return ServerPacketIdentifier.DISCONNECT;
} }
@Override @Override

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.common; package net.minestom.server.network.packet.server.common;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.LONG; import static net.minestom.server.network.NetworkBuffer.LONG;
public record KeepAlivePacket(long id) implements ServerPacket { public record KeepAlivePacket(long id) implements ServerPacket.Configuration, ServerPacket.Play {
public KeepAlivePacket(@NotNull NetworkBuffer reader) { public KeepAlivePacket(@NotNull NetworkBuffer reader) {
this(reader.read(LONG)); this(reader.read(LONG));
} }
@ -20,11 +18,12 @@ public record KeepAlivePacket(long id) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_KEEP_ALIVE;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_KEEP_ALIVE; }
case PLAY -> ServerPacketIdentifier.KEEP_ALIVE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION, ConnectionState.PLAY); @Override
}; public int playId() {
return ServerPacketIdentifier.KEEP_ALIVE;
} }
} }

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.common; package net.minestom.server.network.packet.server.common;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.INT; import static net.minestom.server.network.NetworkBuffer.INT;
public record PingPacket(int id) implements ServerPacket { public record PingPacket(int id) implements ServerPacket.Configuration, ServerPacket.Play {
public PingPacket(@NotNull NetworkBuffer reader) { public PingPacket(@NotNull NetworkBuffer reader) {
this(reader.read(INT)); this(reader.read(INT));
} }
@ -20,11 +18,12 @@ public record PingPacket(int id) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_PING;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_PING; }
case PLAY -> ServerPacketIdentifier.PING;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION, ConnectionState.PLAY); @Override
}; public int playId() {
return ServerPacketIdentifier.PING;
} }
} }

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.common; package net.minestom.server.network.packet.server.common;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.LONG; import static net.minestom.server.network.NetworkBuffer.LONG;
public record PingResponsePacket(long number) implements ServerPacket { public record PingResponsePacket(long number) implements ServerPacket.Status, ServerPacket.Play {
public PingResponsePacket(@NotNull NetworkBuffer reader) { public PingResponsePacket(@NotNull NetworkBuffer reader) {
this(reader.read(LONG)); this(reader.read(LONG));
} }
@ -20,11 +18,12 @@ public record PingResponsePacket(long number) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int statusId() {
return switch (state) { return ServerPacketIdentifier.STATUS_PING_RESPONSE;
case STATUS -> ServerPacketIdentifier.STATUS_PING_RESPONSE; }
case PLAY -> ServerPacketIdentifier.PING_RESPONSE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.STATUS); @Override
}; public int playId() {
return ServerPacketIdentifier.PING_RESPONSE;
} }
} }

View File

@ -1,17 +1,16 @@
package net.minestom.server.network.packet.server.common; package net.minestom.server.network.packet.server.common;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.RAW_BYTES; import static net.minestom.server.network.NetworkBuffer.RAW_BYTES;
import static net.minestom.server.network.NetworkBuffer.STRING; import static net.minestom.server.network.NetworkBuffer.STRING;
public record PluginMessagePacket(String channel, byte[] data) implements ServerPacket { public record PluginMessagePacket(String channel,
byte[] data) implements ServerPacket.Configuration, ServerPacket.Play {
public PluginMessagePacket(@NotNull NetworkBuffer reader) { public PluginMessagePacket(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(RAW_BYTES)); this(reader.read(STRING), reader.read(RAW_BYTES));
} }
@ -23,12 +22,13 @@ public record PluginMessagePacket(String channel, byte[] data) implements Server
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_PLUGIN_MESSAGE;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_PLUGIN_MESSAGE; }
case PLAY -> ServerPacketIdentifier.PLUGIN_MESSAGE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION, ConnectionState.PLAY); @Override
}; public int playId() {
return ServerPacketIdentifier.PLUGIN_MESSAGE;
} }
/** /**

View File

@ -1,17 +1,14 @@
package net.minestom.server.network.packet.server.common; package net.minestom.server.network.packet.server.common;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.UUID; import java.util.UUID;
public record ResourcePackPopPacket(@Nullable UUID id) implements ServerPacket { public record ResourcePackPopPacket(@Nullable UUID id) implements ServerPacket.Configuration, ServerPacket.Play {
public ResourcePackPopPacket(@NotNull NetworkBuffer reader) { public ResourcePackPopPacket(@NotNull NetworkBuffer reader) {
this(reader.readOptional(NetworkBuffer.UUID)); this(reader.readOptional(NetworkBuffer.UUID));
} }
@ -22,11 +19,12 @@ public record ResourcePackPopPacket(@Nullable UUID id) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_RESOURCE_PACK_POP_PACKET;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_RESOURCE_PACK_POP_PACKET; }
case PLAY -> ServerPacketIdentifier.RESOURCE_PACK_POP;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION, ConnectionState.PLAY); @Override
}; public int playId() {
return ServerPacketIdentifier.RESOURCE_PACK_POP;
} }
} }

View File

@ -2,12 +2,9 @@ package net.minestom.server.network.packet.server.common;
import net.kyori.adventure.resource.ResourcePackInfo; import net.kyori.adventure.resource.ResourcePackInfo;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -24,7 +21,7 @@ public record ResourcePackPushPacket(
@NotNull String hash, @NotNull String hash,
boolean forced, boolean forced,
@Nullable Component prompt @Nullable Component prompt
) implements ComponentHoldingServerPacket { ) implements ServerPacket.Configuration, ServerPacket.Play, ServerPacket.ComponentHolding {
public ResourcePackPushPacket(@NotNull NetworkBuffer reader) { public ResourcePackPushPacket(@NotNull NetworkBuffer reader) {
this(reader.read(UUID), reader.read(STRING), reader.read(STRING), this(reader.read(UUID), reader.read(STRING), reader.read(STRING),
reader.read(BOOLEAN), reader.readOptional(COMPONENT)); reader.read(BOOLEAN), reader.readOptional(COMPONENT));
@ -44,12 +41,13 @@ public record ResourcePackPushPacket(
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_RESOURCE_PACK_PUSH_PACKET;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_RESOURCE_PACK_PUSH_PACKET; }
case PLAY -> ServerPacketIdentifier.RESOURCE_PACK_PUSH;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION, ConnectionState.PLAY); @Override
}; public int playId() {
return ServerPacketIdentifier.RESOURCE_PACK_PUSH;
} }
@Override @Override

View File

@ -2,12 +2,10 @@ package net.minestom.server.network.packet.server.common;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.gamedata.tags.Tag; import net.minestom.server.gamedata.tags.Tag;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.CachedPacket; import net.minestom.server.network.packet.server.CachedPacket;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -17,7 +15,8 @@ import java.util.Map;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record TagsPacket(@NotNull Map<Tag.BasicType, List<Tag>> tagsMap) implements ServerPacket { public record TagsPacket(
@NotNull Map<Tag.BasicType, List<Tag>> tagsMap) implements ServerPacket.Configuration, ServerPacket.Play {
@ApiStatus.Internal @ApiStatus.Internal
public static final CachedPacket DEFAULT_TAGS = new CachedPacket(new TagsPacket(MinecraftServer.getTagManager().getTagMap())); public static final CachedPacket DEFAULT_TAGS = new CachedPacket(new TagsPacket(MinecraftServer.getTagManager().getTagMap()));
@ -49,12 +48,13 @@ public record TagsPacket(@NotNull Map<Tag.BasicType, List<Tag>> tagsMap) impleme
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_TAGS;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_TAGS; }
case PLAY -> ServerPacketIdentifier.TAGS;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION, ConnectionState.PLAY); @Override
}; public int playId() {
return ServerPacketIdentifier.TAGS;
} }
private static Map<Tag.BasicType, List<Tag>> readTagsMap(@NotNull NetworkBuffer reader) { private static Map<Tag.BasicType, List<Tag>> readTagsMap(@NotNull NetworkBuffer reader) {

View File

@ -1,14 +1,11 @@
package net.minestom.server.network.packet.server.configuration; package net.minestom.server.network.packet.server.configuration;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public record FinishConfigurationPacket() implements ServerPacket { public record FinishConfigurationPacket() implements ServerPacket.Configuration {
public FinishConfigurationPacket(@NotNull NetworkBuffer buffer) { public FinishConfigurationPacket(@NotNull NetworkBuffer buffer) {
this(); this();
} }
@ -18,10 +15,7 @@ public record FinishConfigurationPacket() implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_FINISH_CONFIGURATION;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_FINISH_CONFIGURATION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION);
};
} }
} }

View File

@ -1,17 +1,14 @@
package net.minestom.server.network.packet.server.configuration; package net.minestom.server.network.packet.server.configuration;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import static net.minestom.server.network.NetworkBuffer.NBT; import static net.minestom.server.network.NetworkBuffer.NBT;
public record RegistryDataPacket(@NotNull NBTCompound data) implements ServerPacket { public record RegistryDataPacket(@NotNull NBTCompound data) implements ServerPacket.Configuration {
public RegistryDataPacket(@NotNull NetworkBuffer buffer) { public RegistryDataPacket(@NotNull NetworkBuffer buffer) {
this((NBTCompound) buffer.read(NBT)); this((NBTCompound) buffer.read(NBT));
} }
@ -22,10 +19,7 @@ public record RegistryDataPacket(@NotNull NBTCompound data) implements ServerPac
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_REGISTRY_DATA;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_REGISTRY_DATA;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION);
};
} }
} }

View File

@ -1,18 +1,16 @@
package net.minestom.server.network.packet.server.configuration; package net.minestom.server.network.packet.server.configuration;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.NamespaceID; import net.minestom.server.utils.NamespaceID;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Set; import java.util.Set;
import static net.minestom.server.network.NetworkBuffer.STRING; import static net.minestom.server.network.NetworkBuffer.STRING;
public record UpdateEnabledFeaturesPacket(@NotNull Set<NamespaceID> features) implements ServerPacket { public record UpdateEnabledFeaturesPacket(@NotNull Set<NamespaceID> features) implements ServerPacket.Configuration {
public static final int MAX_FEATURES = 1024; public static final int MAX_FEATURES = 1024;
public UpdateEnabledFeaturesPacket(@NotNull NetworkBuffer buffer) { public UpdateEnabledFeaturesPacket(@NotNull NetworkBuffer buffer) {
@ -25,11 +23,7 @@ public record UpdateEnabledFeaturesPacket(@NotNull Set<NamespaceID> features) im
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int configurationId() {
return switch (state) { return ServerPacketIdentifier.CONFIGURATION_UPDATE_ENABLED_FEATURES;
case CONFIGURATION -> ServerPacketIdentifier.CONFIGURATION_UPDATE_ENABLED_FEATURES;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.CONFIGURATION);
};
} }
} }

View File

@ -1,10 +1,8 @@
package net.minestom.server.network.packet.server.login; package net.minestom.server.network.packet.server.login;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE_ARRAY; import static net.minestom.server.network.NetworkBuffer.BYTE_ARRAY;
@ -12,7 +10,7 @@ import static net.minestom.server.network.NetworkBuffer.STRING;
public record EncryptionRequestPacket(@NotNull String serverId, public record EncryptionRequestPacket(@NotNull String serverId,
byte @NotNull [] publicKey, byte @NotNull [] publicKey,
byte @NotNull [] verifyToken) implements ServerPacket { byte @NotNull [] verifyToken) implements ServerPacket.Login {
public EncryptionRequestPacket(@NotNull NetworkBuffer reader) { public EncryptionRequestPacket(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), this(reader.read(STRING),
reader.read(BYTE_ARRAY), reader.read(BYTE_ARRAY),
@ -27,10 +25,7 @@ public record EncryptionRequestPacket(@NotNull String serverId,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int loginId() {
return switch (state) { return ServerPacketIdentifier.LOGIN_ENCRYPTION_REQUEST;
case LOGIN -> ServerPacketIdentifier.LOGIN_ENCRYPTION_REQUEST;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.LOGIN);
};
} }
} }

View File

@ -1,11 +1,9 @@
package net.minestom.server.network.packet.server.login; package net.minestom.server.network.packet.server.login;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
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.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
@ -14,7 +12,8 @@ import java.util.function.UnaryOperator;
import static net.minestom.server.network.NetworkBuffer.JSON_COMPONENT; import static net.minestom.server.network.NetworkBuffer.JSON_COMPONENT;
public record LoginDisconnectPacket(@NotNull Component kickMessage) implements ComponentHoldingServerPacket { public record LoginDisconnectPacket(@NotNull Component kickMessage) implements ServerPacket.Login,
ServerPacket.ComponentHolding {
public LoginDisconnectPacket(@NotNull NetworkBuffer reader) { public LoginDisconnectPacket(@NotNull NetworkBuffer reader) {
this(reader.read(JSON_COMPONENT)); this(reader.read(JSON_COMPONENT));
} }
@ -25,11 +24,8 @@ public record LoginDisconnectPacket(@NotNull Component kickMessage) implements C
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int loginId() {
return switch (state) { return ServerPacketIdentifier.LOGIN_DISCONNECT;
case LOGIN -> ServerPacketIdentifier.LOGIN_DISCONNECT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.LOGIN);
};
} }
@Override @Override

View File

@ -1,17 +1,15 @@
package net.minestom.server.network.packet.server.login; package net.minestom.server.network.packet.server.login;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record LoginPluginRequestPacket(int messageId, @NotNull String channel, public record LoginPluginRequestPacket(int messageId, @NotNull String channel,
byte @Nullable [] data) implements ServerPacket { byte @Nullable [] data) implements ServerPacket.Login {
public LoginPluginRequestPacket(@NotNull NetworkBuffer reader) { public LoginPluginRequestPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(STRING), this(reader.read(VAR_INT), reader.read(STRING),
reader.read(RAW_BYTES)); reader.read(RAW_BYTES));
@ -27,10 +25,7 @@ public record LoginPluginRequestPacket(int messageId, @NotNull String channel,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int loginId() {
return switch (state) { return ServerPacketIdentifier.LOGIN_PLUGIN_REQUEST;
case LOGIN -> ServerPacketIdentifier.LOGIN_PLUGIN_REQUEST;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.LOGIN);
};
} }
} }

View File

@ -1,10 +1,8 @@
package net.minestom.server.network.packet.server.login; package net.minestom.server.network.packet.server.login;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.UUID; import java.util.UUID;
@ -12,7 +10,8 @@ import java.util.UUID;
import static net.minestom.server.network.NetworkBuffer.STRING; import static net.minestom.server.network.NetworkBuffer.STRING;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record LoginSuccessPacket(@NotNull UUID uuid, @NotNull String username, int properties) implements ServerPacket { public record LoginSuccessPacket(@NotNull UUID uuid, @NotNull String username,
int properties) implements ServerPacket.Login {
public LoginSuccessPacket(@NotNull NetworkBuffer reader) { public LoginSuccessPacket(@NotNull NetworkBuffer reader) {
this(reader.read(NetworkBuffer.UUID), reader.read(STRING), reader.read(VAR_INT)); this(reader.read(NetworkBuffer.UUID), reader.read(STRING), reader.read(VAR_INT));
} }
@ -25,10 +24,7 @@ public record LoginSuccessPacket(@NotNull UUID uuid, @NotNull String username, i
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int loginId() {
return switch (state) { return ServerPacketIdentifier.LOGIN_SUCCESS;
case LOGIN -> ServerPacketIdentifier.LOGIN_SUCCESS;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.LOGIN);
};
} }
} }

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.login; package net.minestom.server.network.packet.server.login;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record SetCompressionPacket(int threshold) implements ServerPacket { public record SetCompressionPacket(int threshold) implements ServerPacket.Login {
public SetCompressionPacket(@NotNull NetworkBuffer reader) { public SetCompressionPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT)); this(reader.read(VAR_INT));
} }
@ -20,10 +18,7 @@ public record SetCompressionPacket(int threshold) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int loginId() {
return switch (state) { return ServerPacketIdentifier.LOGIN_SET_COMPRESSION;
case LOGIN -> ServerPacketIdentifier.LOGIN_SET_COMPRESSION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.LOGIN);
};
} }
} }

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record AcknowledgeBlockChangePacket(int sequence) implements ServerPacket { public record AcknowledgeBlockChangePacket(int sequence) implements ServerPacket.Play {
public AcknowledgeBlockChangePacket(@NotNull NetworkBuffer reader) { public AcknowledgeBlockChangePacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT)); this(reader.read(VAR_INT));
} }
@ -20,10 +18,7 @@ public record AcknowledgeBlockChangePacket(int sequence) implements ServerPacket
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ACKNOWLEDGE_BLOCK_CHANGE;
case PLAY -> ServerPacketIdentifier.ACKNOWLEDGE_BLOCK_CHANGE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,12 +1,9 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
@ -15,7 +12,7 @@ import java.util.function.UnaryOperator;
import static net.minestom.server.network.NetworkBuffer.COMPONENT; import static net.minestom.server.network.NetworkBuffer.COMPONENT;
public record ActionBarPacket(@NotNull Component text) implements ComponentHoldingServerPacket { public record ActionBarPacket(@NotNull Component text) implements ServerPacket.Play, ServerPacket.ComponentHolding {
public ActionBarPacket(@NotNull NetworkBuffer reader) { public ActionBarPacket(@NotNull NetworkBuffer reader) {
this(reader.read(COMPONENT)); this(reader.read(COMPONENT));
} }
@ -26,11 +23,8 @@ public record ActionBarPacket(@NotNull Component text) implements ComponentHoldi
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ACTION_BAR;
case PLAY -> ServerPacketIdentifier.ACTION_BAR;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
@Override @Override

View File

@ -4,12 +4,10 @@ import net.kyori.adventure.text.Component;
import net.minestom.server.advancements.FrameType; import net.minestom.server.advancements.FrameType;
import net.minestom.server.adventure.ComponentHolder; import net.minestom.server.adventure.ComponentHolder;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket; import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -23,7 +21,7 @@ import static net.minestom.server.network.NetworkBuffer.*;
public record AdvancementsPacket(boolean reset, @NotNull List<AdvancementMapping> advancementMappings, public record AdvancementsPacket(boolean reset, @NotNull List<AdvancementMapping> advancementMappings,
@NotNull List<String> identifiersToRemove, @NotNull List<String> identifiersToRemove,
@NotNull List<ProgressMapping> progressMappings) implements ComponentHoldingServerPacket { @NotNull List<ProgressMapping> progressMappings) implements ServerPacket.Play, ServerPacket.ComponentHolding {
public static final int MAX_ADVANCEMENTS = Short.MAX_VALUE; public static final int MAX_ADVANCEMENTS = Short.MAX_VALUE;
public AdvancementsPacket { public AdvancementsPacket {
@ -47,11 +45,8 @@ public record AdvancementsPacket(boolean reset, @NotNull List<AdvancementMapping
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ADVANCEMENTS;
case PLAY -> ServerPacketIdentifier.ADVANCEMENTS;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
// TODO is the display-item needed to be updated? // TODO is the display-item needed to be updated?

View File

@ -1,17 +1,15 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.entity.Entity; import net.minestom.server.entity.Entity;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import static net.minestom.server.network.NetworkBuffer.INT; import static net.minestom.server.network.NetworkBuffer.INT;
public record AttachEntityPacket(int attachedEntityId, int holdingEntityId) implements ServerPacket { public record AttachEntityPacket(int attachedEntityId, int holdingEntityId) implements ServerPacket.Play {
public AttachEntityPacket(@NotNull Entity attachedEntity, @Nullable Entity holdingEntity) { public AttachEntityPacket(@NotNull Entity attachedEntity, @Nullable Entity holdingEntity) {
this(attachedEntity.getEntityId(), holdingEntity != null ? holdingEntity.getEntityId() : -1); this(attachedEntity.getEntityId(), holdingEntity != null ? holdingEntity.getEntityId() : -1);
} }
@ -27,10 +25,7 @@ public record AttachEntityPacket(int attachedEntityId, int holdingEntityId) impl
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ATTACH_ENTITY;
case PLAY -> ServerPacketIdentifier.ATTACH_ENTITY;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -2,17 +2,15 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record BlockActionPacket(@NotNull Point blockPosition, byte actionId, public record BlockActionPacket(@NotNull Point blockPosition, byte actionId,
byte actionParam, int blockId) implements ServerPacket { byte actionParam, int blockId) implements ServerPacket.Play {
public BlockActionPacket(Point blockPosition, byte actionId, byte actionParam, Block block) { public BlockActionPacket(Point blockPosition, byte actionId, byte actionParam, Block block) {
this(blockPosition, actionId, actionParam, block.id()); this(blockPosition, actionId, actionParam, block.id());
} }
@ -31,10 +29,7 @@ public record BlockActionPacket(@NotNull Point blockPosition, byte actionId,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.BLOCK_ACTION;
case PLAY -> ServerPacketIdentifier.BLOCK_ACTION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,17 +1,15 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record BlockBreakAnimationPacket(int entityId, @NotNull Point blockPosition, public record BlockBreakAnimationPacket(int entityId, @NotNull Point blockPosition,
byte destroyStage) implements ServerPacket { byte destroyStage) implements ServerPacket.Play {
public BlockBreakAnimationPacket(@NotNull NetworkBuffer reader) { public BlockBreakAnimationPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(BLOCK_POSITION), reader.read(BYTE)); this(reader.read(VAR_INT), reader.read(BLOCK_POSITION), reader.read(BYTE));
} }
@ -24,10 +22,7 @@ public record BlockBreakAnimationPacket(int entityId, @NotNull Point blockPositi
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.BLOCK_BREAK_ANIMATION;
case PLAY -> ServerPacketIdentifier.BLOCK_BREAK_ANIMATION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -2,17 +2,15 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BLOCK_POSITION; import static net.minestom.server.network.NetworkBuffer.BLOCK_POSITION;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record BlockChangePacket(@NotNull Point blockPosition, int blockStateId) implements ServerPacket { public record BlockChangePacket(@NotNull Point blockPosition, int blockStateId) implements ServerPacket.Play {
public BlockChangePacket(@NotNull Point blockPosition, @NotNull Block block) { public BlockChangePacket(@NotNull Point blockPosition, @NotNull Block block) {
this(blockPosition, block.stateId()); this(blockPosition, block.stateId());
} }
@ -28,10 +26,7 @@ public record BlockChangePacket(@NotNull Point blockPosition, int blockStateId)
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.BLOCK_CHANGE;
case PLAY -> ServerPacketIdentifier.BLOCK_CHANGE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,11 +1,9 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTCompound;
@ -13,7 +11,7 @@ import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record BlockEntityDataPacket(@NotNull Point blockPosition, int action, public record BlockEntityDataPacket(@NotNull Point blockPosition, int action,
@Nullable NBTCompound data) implements ServerPacket { @Nullable NBTCompound data) implements ServerPacket.Play {
public BlockEntityDataPacket(@NotNull NetworkBuffer reader) { public BlockEntityDataPacket(@NotNull NetworkBuffer reader) {
this(reader.read(BLOCK_POSITION), reader.read(VAR_INT), (NBTCompound) reader.read(NBT)); this(reader.read(BLOCK_POSITION), reader.read(VAR_INT), (NBTCompound) reader.read(NBT));
} }
@ -31,10 +29,7 @@ public record BlockEntityDataPacket(@NotNull Point blockPosition, int action,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.BLOCK_ENTITY_DATA;
case PLAY -> ServerPacketIdentifier.BLOCK_ENTITY_DATA;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -4,12 +4,10 @@ import net.kyori.adventure.bossbar.BossBar;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.adventure.AdventurePacketConvertor; import net.minestom.server.adventure.AdventurePacketConvertor;
import net.minestom.server.adventure.ComponentHolder; import net.minestom.server.adventure.ComponentHolder;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket; import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
@ -19,7 +17,7 @@ import java.util.function.UnaryOperator;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record BossBarPacket(@NotNull UUID uuid, @NotNull Action action) implements ComponentHoldingServerPacket { public record BossBarPacket(@NotNull UUID uuid, @NotNull Action action) implements ServerPacket.Play, ServerPacket.ComponentHolding {
public BossBarPacket(@NotNull NetworkBuffer reader) { public BossBarPacket(@NotNull NetworkBuffer reader) {
this(reader.read(NetworkBuffer.UUID), switch (reader.read(VAR_INT)) { this(reader.read(NetworkBuffer.UUID), switch (reader.read(VAR_INT)) {
case 0 -> new AddAction(reader); case 0 -> new AddAction(reader);
@ -201,10 +199,7 @@ public record BossBarPacket(@NotNull UUID uuid, @NotNull Action action) implemen
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.BOSS_BAR;
case PLAY -> ServerPacketIdentifier.BOSS_BAR;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,13 +1,11 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public record BundlePacket() implements ServerPacket { public record BundlePacket() implements ServerPacket.Play {
public BundlePacket(@NotNull NetworkBuffer reader) { public BundlePacket(@NotNull NetworkBuffer reader) {
this(); this();
} }
@ -17,10 +15,7 @@ public record BundlePacket() implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.BUNDLE;
case PLAY -> ServerPacketIdentifier.BUNDLE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.entity.Entity; import net.minestom.server.entity.Entity;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record CameraPacket(int cameraId) implements ServerPacket { public record CameraPacket(int cameraId) implements ServerPacket.Play {
public CameraPacket(@NotNull NetworkBuffer reader) { public CameraPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT)); this(reader.read(VAR_INT));
} }
@ -25,10 +23,7 @@ public record CameraPacket(int cameraId) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CAMERA;
case PLAY -> ServerPacketIdentifier.CAMERA;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE; import static net.minestom.server.network.NetworkBuffer.BYTE;
import static net.minestom.server.network.NetworkBuffer.FLOAT; import static net.minestom.server.network.NetworkBuffer.FLOAT;
public record ChangeGameStatePacket(@NotNull Reason reason, float value) implements ServerPacket { public record ChangeGameStatePacket(@NotNull Reason reason, float value) implements ServerPacket.Play {
public ChangeGameStatePacket(@NotNull NetworkBuffer reader) { public ChangeGameStatePacket(@NotNull NetworkBuffer reader) {
this(Reason.values()[reader.read(BYTE)], reader.read(FLOAT)); this(Reason.values()[reader.read(BYTE)], reader.read(FLOAT));
} }
@ -22,11 +20,8 @@ public record ChangeGameStatePacket(@NotNull Reason reason, float value) impleme
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CHANGE_GAME_STATE;
case PLAY -> ServerPacketIdentifier.CHANGE_GAME_STATE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public enum Reason { public enum Reason {

View File

@ -1,16 +1,13 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record ChunkBatchFinishedPacket(int batchSize) implements ServerPacket { public record ChunkBatchFinishedPacket(int batchSize) implements ServerPacket.Play {
public ChunkBatchFinishedPacket(@NotNull NetworkBuffer buffer) { public ChunkBatchFinishedPacket(@NotNull NetworkBuffer buffer) {
this(buffer.read(VAR_INT)); this(buffer.read(VAR_INT));
} }
@ -21,10 +18,7 @@ public record ChunkBatchFinishedPacket(int batchSize) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CHUNK_BATCH_FINISHED;
case PLAY -> ServerPacketIdentifier.CHUNK_BATCH_FINISHED;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,14 +1,11 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public record ChunkBatchStartPacket() implements ServerPacket { public record ChunkBatchStartPacket() implements ServerPacket.Play {
public ChunkBatchStartPacket(@NotNull NetworkBuffer buffer) { public ChunkBatchStartPacket(@NotNull NetworkBuffer buffer) {
this(); this();
} }
@ -18,10 +15,7 @@ public record ChunkBatchStartPacket() implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CHUNK_BATCH_START;
case PLAY -> ServerPacketIdentifier.CHUNK_BATCH_START;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,19 +1,17 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; 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.ChunkData;
import net.minestom.server.network.packet.server.play.data.LightData; import net.minestom.server.network.packet.server.play.data.LightData;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.INT; import static net.minestom.server.network.NetworkBuffer.INT;
public record ChunkDataPacket(int chunkX, int chunkZ, public record ChunkDataPacket(int chunkX, int chunkZ,
@NotNull ChunkData chunkData, @NotNull ChunkData chunkData,
@NotNull LightData lightData) implements ServerPacket { @NotNull LightData lightData) implements ServerPacket.Play {
public ChunkDataPacket(@NotNull NetworkBuffer reader) { public ChunkDataPacket(@NotNull NetworkBuffer reader) {
this(reader.read(INT), reader.read(INT), this(reader.read(INT), reader.read(INT),
new ChunkData(reader), new ChunkData(reader),
@ -29,10 +27,7 @@ public record ChunkDataPacket(int chunkX, int chunkZ,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CHUNK_DATA;
case PLAY -> ServerPacketIdentifier.CHUNK_DATA;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BOOLEAN; import static net.minestom.server.network.NetworkBuffer.BOOLEAN;
public record ClearTitlesPacket(boolean reset) implements ServerPacket { public record ClearTitlesPacket(boolean reset) implements ServerPacket.Play {
public ClearTitlesPacket(@NotNull NetworkBuffer reader) { public ClearTitlesPacket(@NotNull NetworkBuffer reader) {
this(reader.read(BOOLEAN)); this(reader.read(BOOLEAN));
} }
@ -20,10 +18,7 @@ public record ClearTitlesPacket(boolean reset) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CLEAR_TITLES;
case PLAY -> ServerPacketIdentifier.CLEAR_TITLES;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE; import static net.minestom.server.network.NetworkBuffer.BYTE;
public record CloseWindowPacket(byte windowId) implements ServerPacket { public record CloseWindowPacket(byte windowId) implements ServerPacket.Play {
public CloseWindowPacket(@NotNull NetworkBuffer reader) { public CloseWindowPacket(@NotNull NetworkBuffer reader) {
this(reader.read(BYTE)); this(reader.read(BYTE));
} }
@ -20,10 +18,7 @@ public record CloseWindowPacket(byte windowId) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CLOSE_WINDOW;
case PLAY -> ServerPacketIdentifier.CLOSE_WINDOW;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record CollectItemPacket(int collectedEntityId, int collectorEntityId, int pickupItemCount) public record CollectItemPacket(int collectedEntityId, int collectorEntityId, int pickupItemCount)
implements ServerPacket { implements ServerPacket.Play {
public CollectItemPacket(@NotNull NetworkBuffer reader) { public CollectItemPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(VAR_INT), reader.read(VAR_INT)); this(reader.read(VAR_INT), reader.read(VAR_INT), reader.read(VAR_INT));
} }
@ -23,10 +21,7 @@ public record CollectItemPacket(int collectedEntityId, int collectorEntityId, in
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.COLLECT_ITEM;
case PLAY -> ServerPacketIdentifier.COLLECT_ITEM;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE; import static net.minestom.server.network.NetworkBuffer.BYTE;
import static net.minestom.server.network.NetworkBuffer.STRING; import static net.minestom.server.network.NetworkBuffer.STRING;
public record CraftRecipeResponse(byte windowId, String recipe) implements ServerPacket { public record CraftRecipeResponse(byte windowId, String recipe) implements ServerPacket.Play {
public CraftRecipeResponse(@NotNull NetworkBuffer reader) { public CraftRecipeResponse(@NotNull NetworkBuffer reader) {
this(reader.read(BYTE), reader.read(STRING)); this(reader.read(BYTE), reader.read(STRING));
} }
@ -22,10 +20,7 @@ public record CraftRecipeResponse(byte windowId, String recipe) implements Serve
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CRAFT_RECIPE_RESPONSE;
case PLAY -> ServerPacketIdentifier.CRAFT_RECIPE_RESPONSE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,10 +1,8 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
@ -12,7 +10,7 @@ import java.util.List;
import static net.minestom.server.network.NetworkBuffer.STRING; import static net.minestom.server.network.NetworkBuffer.STRING;
public record CustomChatCompletionPacket(@NotNull Action action, public record CustomChatCompletionPacket(@NotNull Action action,
@NotNull List<@NotNull String> entries) implements ServerPacket { @NotNull List<@NotNull String> entries) implements ServerPacket.Play {
public static final int MAX_ENTRIES = Short.MAX_VALUE; public static final int MAX_ENTRIES = Short.MAX_VALUE;
public CustomChatCompletionPacket { public CustomChatCompletionPacket {
@ -30,11 +28,8 @@ public record CustomChatCompletionPacket(@NotNull Action action,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.CUSTOM_CHAT_COMPLETIONS;
case PLAY -> ServerPacketIdentifier.CUSTOM_CHAT_COMPLETIONS;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public enum Action { public enum Action {

View File

@ -1,15 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
import static net.minestom.server.network.NetworkBuffer.VECTOR3D;
/** /**
* See <a href="https://wiki.vg/Protocol#Damage_Event">https://wiki.vg/Protocol#Damage_Event</a> for more info. * See <a href="https://wiki.vg/Protocol#Damage_Event">https://wiki.vg/Protocol#Damage_Event</a> for more info.
@ -20,18 +19,16 @@ import static net.minestom.server.network.NetworkBuffer.*;
* @param sourceDirectId 0 if there is no direct source. For direct attacks (e.g. melee), this is the same as sourceEntityId. For indirect attacks (e.g. projectiles), this is the projectile entity id + 1 * @param sourceDirectId 0 if there is no direct source. For direct attacks (e.g. melee), this is the same as sourceEntityId. For indirect attacks (e.g. projectiles), this is the projectile entity id + 1
* @param sourcePos null if there is no source position, otherwise the position of the source * @param sourcePos null if there is no source position, otherwise the position of the source
*/ */
public record DamageEventPacket(int targetEntityId, int damageTypeId, int sourceEntityId, int sourceDirectId, @Nullable Point sourcePos) implements ServerPacket { public record DamageEventPacket(int targetEntityId, int damageTypeId, int sourceEntityId, int sourceDirectId,
@Nullable Point sourcePos) implements ServerPacket.Play {
public DamageEventPacket(@NotNull NetworkBuffer reader) { public DamageEventPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(VAR_INT), reader.read(VAR_INT), reader.read(VAR_INT), reader.readOptional(VECTOR3D)); this(reader.read(VAR_INT), reader.read(VAR_INT), reader.read(VAR_INT), reader.read(VAR_INT), reader.readOptional(VECTOR3D));
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.DAMAGE_EVENT;
case PLAY -> ServerPacketIdentifier.DAMAGE_EVENT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
@Override @Override

View File

@ -1,12 +1,10 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket; import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
@ -15,7 +13,7 @@ import java.util.function.UnaryOperator;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record DeathCombatEventPacket(int playerId, @NotNull Component message) implements ComponentHoldingServerPacket { public record DeathCombatEventPacket(int playerId, @NotNull Component message) implements ServerPacket.Play, ServerPacket.ComponentHolding {
public DeathCombatEventPacket(@NotNull NetworkBuffer reader) { public DeathCombatEventPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(COMPONENT)); this(reader.read(VAR_INT), reader.read(COMPONENT));
} }
@ -27,11 +25,8 @@ public record DeathCombatEventPacket(int playerId, @NotNull Component message) i
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.DEATH_COMBAT_EVENT;
case PLAY -> ServerPacketIdentifier.DEATH_COMBAT_EVENT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
@Override @Override

View File

@ -1,12 +1,10 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.registry.StaticProtocolObject; import net.minestom.server.registry.StaticProtocolObject;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
@ -15,7 +13,7 @@ import java.util.function.Function;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record DeclareCommandsPacket(@NotNull List<Node> nodes, public record DeclareCommandsPacket(@NotNull List<Node> nodes,
int rootIndex) implements ServerPacket { int rootIndex) implements ServerPacket.Play {
public static final int MAX_NODES = Short.MAX_VALUE; public static final int MAX_NODES = Short.MAX_VALUE;
public DeclareCommandsPacket { public DeclareCommandsPacket {
@ -37,11 +35,8 @@ public record DeclareCommandsPacket(@NotNull List<Node> nodes,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.DECLARE_COMMANDS;
case PLAY -> ServerPacketIdentifier.DECLARE_COMMANDS;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public static final class Node implements NetworkBuffer.Writer { public static final class Node implements NetworkBuffer.Writer {

View File

@ -1,12 +1,10 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.recipe.RecipeCategory; import net.minestom.server.recipe.RecipeCategory;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -15,7 +13,7 @@ import java.util.List;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implements ServerPacket { public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implements ServerPacket.Play {
public static final int MAX_RECIPES = Short.MAX_VALUE; public static final int MAX_RECIPES = Short.MAX_VALUE;
public static final int MAX_INGREDIENTS = 128; public static final int MAX_INGREDIENTS = 128;
@ -51,11 +49,8 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.DECLARE_RECIPES;
case PLAY -> ServerPacketIdentifier.DECLARE_RECIPES;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public sealed interface DeclaredRecipe extends NetworkBuffer.Writer public sealed interface DeclaredRecipe extends NetworkBuffer.Writer

View File

@ -1,14 +1,12 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.crypto.MessageSignature; import net.minestom.server.crypto.MessageSignature;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public record DeleteChatPacket(@NotNull MessageSignature signature) implements ServerPacket { public record DeleteChatPacket(@NotNull MessageSignature signature) implements ServerPacket.Play {
public DeleteChatPacket(@NotNull NetworkBuffer reader) { public DeleteChatPacket(@NotNull NetworkBuffer reader) {
this(new MessageSignature(reader)); this(new MessageSignature(reader));
} }
@ -19,10 +17,7 @@ public record DeleteChatPacket(@NotNull MessageSignature signature) implements S
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.DELETE_CHAT_MESSAGE;
case PLAY -> ServerPacketIdentifier.DELETE_CHAT_MESSAGE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,17 +1,15 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record DestroyEntitiesPacket(@NotNull List<Integer> entityIds) implements ServerPacket { public record DestroyEntitiesPacket(@NotNull List<Integer> entityIds) implements ServerPacket.Play {
public static final int MAX_ENTRIES = Short.MAX_VALUE; public static final int MAX_ENTRIES = Short.MAX_VALUE;
public DestroyEntitiesPacket { public DestroyEntitiesPacket {
@ -32,10 +30,7 @@ public record DestroyEntitiesPacket(@NotNull List<Integer> entityIds) implements
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.DESTROY_ENTITIES;
case PLAY -> ServerPacketIdentifier.DESTROY_ENTITIES;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE; import static net.minestom.server.network.NetworkBuffer.BYTE;
import static net.minestom.server.network.NetworkBuffer.STRING; import static net.minestom.server.network.NetworkBuffer.STRING;
public record DisplayScoreboardPacket(byte position, String scoreName) implements ServerPacket { public record DisplayScoreboardPacket(byte position, String scoreName) implements ServerPacket.Play {
public DisplayScoreboardPacket(@NotNull NetworkBuffer reader) { public DisplayScoreboardPacket(@NotNull NetworkBuffer reader) {
this(reader.read(BYTE), reader.read(STRING)); this(reader.read(BYTE), reader.read(STRING));
} }
@ -22,10 +20,7 @@ public record DisplayScoreboardPacket(byte position, String scoreName) implement
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.DISPLAY_SCOREBOARD;
case PLAY -> ServerPacketIdentifier.DISPLAY_SCOREBOARD;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,17 +1,15 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EffectPacket(int effectId, Point position, int data, public record EffectPacket(int effectId, Point position, int data,
boolean disableRelativeVolume) implements ServerPacket { boolean disableRelativeVolume) implements ServerPacket.Play {
public EffectPacket(@NotNull NetworkBuffer reader) { public EffectPacket(@NotNull NetworkBuffer reader) {
this(reader.read(INT), reader.read(BLOCK_POSITION), reader.read(INT), reader.read(BOOLEAN)); this(reader.read(INT), reader.read(BLOCK_POSITION), reader.read(INT), reader.read(BOOLEAN));
} }
@ -25,10 +23,7 @@ public record EffectPacket(int effectId, Point position, int data,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.EFFECT;
case PLAY -> ServerPacketIdentifier.EFFECT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record EndCombatEventPacket(int duration) implements ServerPacket { public record EndCombatEventPacket(int duration) implements ServerPacket.Play {
public EndCombatEventPacket(@NotNull NetworkBuffer reader) { public EndCombatEventPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT)); this(reader.read(VAR_INT));
} }
@ -20,10 +18,7 @@ public record EndCombatEventPacket(int duration) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.END_COMBAT_EVENT;
case PLAY -> ServerPacketIdentifier.END_COMBAT_EVENT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,13 +1,11 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public record EnterCombatEventPacket() implements ServerPacket { public record EnterCombatEventPacket() implements ServerPacket.Play {
public EnterCombatEventPacket(@NotNull NetworkBuffer reader) { public EnterCombatEventPacket(@NotNull NetworkBuffer reader) {
this(); this();
} }
@ -18,10 +16,7 @@ public record EnterCombatEventPacket() implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTER_COMBAT_EVENT;
case PLAY -> ServerPacketIdentifier.ENTER_COMBAT_EVENT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE; import static net.minestom.server.network.NetworkBuffer.BYTE;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record EntityAnimationPacket(int entityId, @NotNull Animation animation) implements ServerPacket { public record EntityAnimationPacket(int entityId, @NotNull Animation animation) implements ServerPacket.Play {
public EntityAnimationPacket(@NotNull NetworkBuffer reader) { public EntityAnimationPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), Animation.values()[reader.read(BYTE)]); this(reader.read(VAR_INT), Animation.values()[reader.read(BYTE)]);
} }
@ -22,11 +20,8 @@ public record EntityAnimationPacket(int entityId, @NotNull Animation animation)
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_ANIMATION;
case PLAY -> ServerPacketIdentifier.ENTITY_ANIMATION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public enum Animation { public enum Animation {

View File

@ -1,11 +1,9 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.potion.Potion; import net.minestom.server.potion.Potion;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTCompound;
@ -13,7 +11,7 @@ import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EntityEffectPacket(int entityId, @NotNull Potion potion, public record EntityEffectPacket(int entityId, @NotNull Potion potion,
@Nullable NBTCompound factorCodec) implements ServerPacket { @Nullable NBTCompound factorCodec) implements ServerPacket.Play {
public EntityEffectPacket(@NotNull NetworkBuffer reader) { public EntityEffectPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), new Potion(reader), this(reader.read(VAR_INT), new Potion(reader),
reader.read(BOOLEAN) ? (NBTCompound) reader.read(NBT) : null); reader.read(BOOLEAN) ? (NBTCompound) reader.read(NBT) : null);
@ -27,10 +25,7 @@ public record EntityEffectPacket(int entityId, @NotNull Potion potion,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_EFFECT;
case PLAY -> ServerPacketIdentifier.ENTITY_EFFECT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -3,12 +3,10 @@ package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.entity.EquipmentSlot; import net.minestom.server.entity.EquipmentSlot;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket; import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
@ -21,7 +19,7 @@ import java.util.stream.Collectors;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EntityEquipmentPacket(int entityId, public record EntityEquipmentPacket(int entityId,
@NotNull Map<EquipmentSlot, ItemStack> equipments) implements ComponentHoldingServerPacket { @NotNull Map<EquipmentSlot, ItemStack> equipments) implements ServerPacket.Play, ServerPacket.ComponentHolding {
public EntityEquipmentPacket { public EntityEquipmentPacket {
equipments = Map.copyOf(equipments); equipments = Map.copyOf(equipments);
if (equipments.isEmpty()) if (equipments.isEmpty())
@ -46,11 +44,8 @@ public record EntityEquipmentPacket(int entityId,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_EQUIPMENT;
case PLAY -> ServerPacketIdentifier.ENTITY_EQUIPMENT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
@Override @Override

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE; import static net.minestom.server.network.NetworkBuffer.BYTE;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record EntityHeadLookPacket(int entityId, float yaw) implements ServerPacket { public record EntityHeadLookPacket(int entityId, float yaw) implements ServerPacket.Play {
public EntityHeadLookPacket(@NotNull NetworkBuffer reader) { public EntityHeadLookPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), (reader.read(BYTE) * 360f) / 256f); this(reader.read(VAR_INT), (reader.read(BYTE) * 360f) / 256f);
} }
@ -22,10 +20,7 @@ public record EntityHeadLookPacket(int entityId, float yaw) implements ServerPac
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_HEAD_LOOK;
case PLAY -> ServerPacketIdentifier.ENTITY_HEAD_LOOK;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -2,12 +2,10 @@ package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.entity.Metadata; import net.minestom.server.entity.Metadata;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket; import net.minestom.server.network.packet.server.ServerPacket.ComponentHolding;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
@ -18,7 +16,7 @@ import java.util.function.UnaryOperator;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EntityMetaDataPacket(int entityId, public record EntityMetaDataPacket(int entityId,
@NotNull Map<Integer, Metadata.Entry<?>> entries) implements ComponentHoldingServerPacket { @NotNull Map<Integer, Metadata.Entry<?>> entries) implements ServerPacket.Play, ServerPacket.ComponentHolding {
public EntityMetaDataPacket { public EntityMetaDataPacket {
entries = Map.copyOf(entries); entries = Map.copyOf(entries);
} }
@ -51,11 +49,8 @@ public record EntityMetaDataPacket(int entityId,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_METADATA;
case PLAY -> ServerPacketIdentifier.ENTITY_METADATA;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
@Override @Override

View File

@ -1,17 +1,15 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EntityPositionAndRotationPacket(int entityId, short deltaX, short deltaY, short deltaZ, public record EntityPositionAndRotationPacket(int entityId, short deltaX, short deltaY, short deltaZ,
float yaw, float pitch, boolean onGround) implements ServerPacket { float yaw, float pitch, boolean onGround) implements ServerPacket.Play {
public EntityPositionAndRotationPacket(@NotNull NetworkBuffer reader) { public EntityPositionAndRotationPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(SHORT), reader.read(SHORT), reader.read(SHORT), this(reader.read(VAR_INT), reader.read(SHORT), reader.read(SHORT), reader.read(SHORT),
reader.read(BYTE) * 360f / 256f, reader.read(BYTE) * 360f / 256f, reader.read(BOOLEAN)); reader.read(BYTE) * 360f / 256f, reader.read(BYTE) * 360f / 256f, reader.read(BOOLEAN));
@ -29,11 +27,8 @@ public record EntityPositionAndRotationPacket(int entityId, short deltaX, short
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_POSITION_AND_ROTATION;
case PLAY -> ServerPacketIdentifier.ENTITY_POSITION_AND_ROTATION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public static EntityPositionAndRotationPacket getPacket(int entityId, public static EntityPositionAndRotationPacket getPacket(int entityId,

View File

@ -1,17 +1,15 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EntityPositionPacket(int entityId, short deltaX, short deltaY, short deltaZ, boolean onGround) public record EntityPositionPacket(int entityId, short deltaX, short deltaY, short deltaZ, boolean onGround)
implements ServerPacket { implements ServerPacket.Play {
public EntityPositionPacket(@NotNull NetworkBuffer reader) { public EntityPositionPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(SHORT), reader.read(SHORT), reader.read(SHORT), reader.read(BOOLEAN)); this(reader.read(VAR_INT), reader.read(SHORT), reader.read(SHORT), reader.read(SHORT), reader.read(BOOLEAN));
@ -27,11 +25,8 @@ public record EntityPositionPacket(int entityId, short deltaX, short deltaY, sho
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_POSITION;
case PLAY -> ServerPacketIdentifier.ENTITY_POSITION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
@NotNull @NotNull

View File

@ -4,11 +4,9 @@ import net.minestom.server.attribute.Attribute;
import net.minestom.server.attribute.AttributeInstance; import net.minestom.server.attribute.AttributeInstance;
import net.minestom.server.attribute.AttributeModifier; import net.minestom.server.attribute.AttributeModifier;
import net.minestom.server.attribute.AttributeOperation; import net.minestom.server.attribute.AttributeOperation;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Collection; import java.util.Collection;
@ -16,7 +14,7 @@ import java.util.List;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EntityPropertiesPacket(int entityId, List<AttributeInstance> properties) implements ServerPacket { public record EntityPropertiesPacket(int entityId, List<AttributeInstance> properties) implements ServerPacket.Play {
public static final int MAX_ENTRIES = 1024; public static final int MAX_ENTRIES = 1024;
public EntityPropertiesPacket { public EntityPropertiesPacket {
@ -61,10 +59,7 @@ public record EntityPropertiesPacket(int entityId, List<AttributeInstance> prope
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_PROPERTIES;
case PLAY -> ServerPacketIdentifier.ENTITY_PROPERTIES;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EntityRotationPacket(int entityId, float yaw, float pitch, boolean onGround) implements ServerPacket { public record EntityRotationPacket(int entityId, float yaw, float pitch, boolean onGround) implements ServerPacket.Play {
public EntityRotationPacket(@NotNull NetworkBuffer reader) { public EntityRotationPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(BYTE) * 360f / 256f, reader.read(BYTE) * 360f / 256f, reader.read(BOOLEAN)); this(reader.read(VAR_INT), reader.read(BYTE) * 360f / 256f, reader.read(BYTE) * 360f / 256f, reader.read(BOOLEAN));
} }
@ -23,10 +21,7 @@ public record EntityRotationPacket(int entityId, float yaw, float pitch, boolean
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_ROTATION;
case PLAY -> ServerPacketIdentifier.ENTITY_ROTATION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -2,12 +2,10 @@ package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.sound.Sound; import net.kyori.adventure.sound.Sound;
import net.minestom.server.adventure.AdventurePacketConvertor; import net.minestom.server.adventure.AdventurePacketConvertor;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.sound.SoundEvent; import net.minestom.server.sound.SoundEvent;
import net.minestom.server.utils.PacketUtils;
import net.minestom.server.utils.validate.Check; import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -24,7 +22,7 @@ public record EntitySoundEffectPacket(
float volume, float volume,
float pitch, float pitch,
long seed long seed
) implements ServerPacket { ) implements ServerPacket.Play {
public EntitySoundEffectPacket { public EntitySoundEffectPacket {
Check.argCondition(soundEvent == null && soundName == null, "soundEvent and soundName cannot both be null"); Check.argCondition(soundEvent == null && soundName == null, "soundEvent and soundName cannot both be null");
@ -92,10 +90,7 @@ public record EntitySoundEffectPacket(
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_SOUND_EFFECT;
case PLAY -> ServerPacketIdentifier.ENTITY_SOUND_EFFECT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE; import static net.minestom.server.network.NetworkBuffer.BYTE;
import static net.minestom.server.network.NetworkBuffer.INT; import static net.minestom.server.network.NetworkBuffer.INT;
public record EntityStatusPacket(int entityId, byte status) implements ServerPacket { public record EntityStatusPacket(int entityId, byte status) implements ServerPacket.Play {
public EntityStatusPacket(@NotNull NetworkBuffer reader) { public EntityStatusPacket(@NotNull NetworkBuffer reader) {
this(reader.read(INT), reader.read(BYTE)); this(reader.read(INT), reader.read(BYTE));
} }
@ -22,10 +20,7 @@ public record EntityStatusPacket(int entityId, byte status) implements ServerPac
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_STATUS;
case PLAY -> ServerPacketIdentifier.ENTITY_STATUS;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Pos;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record EntityTeleportPacket(int entityId, Pos position, boolean onGround) implements ServerPacket { public record EntityTeleportPacket(int entityId, Pos position, boolean onGround) implements ServerPacket.Play {
public EntityTeleportPacket(@NotNull NetworkBuffer reader) { public EntityTeleportPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), new Pos(reader.read(DOUBLE), reader.read(DOUBLE), reader.read(DOUBLE), this(reader.read(VAR_INT), new Pos(reader.read(DOUBLE), reader.read(DOUBLE), reader.read(DOUBLE),
reader.read(BYTE) * 360f / 256f, reader.read(BYTE) * 360f / 256f), reader.read(BYTE) * 360f / 256f, reader.read(BYTE) * 360f / 256f),
@ -29,10 +27,7 @@ public record EntityTeleportPacket(int entityId, Pos position, boolean onGround)
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_TELEPORT;
case PLAY -> ServerPacketIdentifier.ENTITY_TELEPORT;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,19 +1,17 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.MathUtils;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.SHORT; import static net.minestom.server.network.NetworkBuffer.SHORT;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record EntityVelocityPacket(int entityId, short velocityX, short velocityY, public record EntityVelocityPacket(int entityId, short velocityX, short velocityY,
short velocityZ) implements ServerPacket { short velocityZ) implements ServerPacket.Play {
public EntityVelocityPacket(@NotNull NetworkBuffer reader) { public EntityVelocityPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(SHORT), reader.read(SHORT), reader.read(SHORT)); this(reader.read(VAR_INT), reader.read(SHORT), reader.read(SHORT), reader.read(SHORT));
} }
@ -36,10 +34,7 @@ public record EntityVelocityPacket(int entityId, short velocityX, short velocity
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.ENTITY_VELOCITY;
case PLAY -> ServerPacketIdentifier.ENTITY_VELOCITY;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,12 +1,10 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.particle.Particle; import net.minestom.server.particle.Particle;
import net.minestom.server.sound.SoundEvent; import net.minestom.server.sound.SoundEvent;
import net.minestom.server.utils.PacketUtils;
import net.minestom.server.utils.binary.BinaryWriter; import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -18,7 +16,7 @@ public record ExplosionPacket(double x, double y, double z, float radius,
@NotNull BlockInteraction blockInteraction, @NotNull BlockInteraction blockInteraction,
int smallParticleId, byte @NotNull [] smallParticleData, int smallParticleId, byte @NotNull [] smallParticleData,
int largeParticleId, byte @NotNull [] largeParticleData, int largeParticleId, byte @NotNull [] largeParticleData,
@NotNull String soundName, boolean hasFixedSoundRange, float soundRange) implements ServerPacket { @NotNull String soundName, boolean hasFixedSoundRange, float soundRange) implements ServerPacket.Play {
private static @NotNull ExplosionPacket fromReader(@NotNull NetworkBuffer reader) { private static @NotNull ExplosionPacket fromReader(@NotNull NetworkBuffer reader) {
double x = reader.read(DOUBLE), y = reader.read(DOUBLE), z = reader.read(DOUBLE); double x = reader.read(DOUBLE), y = reader.read(DOUBLE), z = reader.read(DOUBLE);
float radius = reader.read(FLOAT); float radius = reader.read(FLOAT);
@ -107,11 +105,8 @@ public record ExplosionPacket(double x, double y, double z, float radius,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.EXPLOSION;
case PLAY -> ServerPacketIdentifier.EXPLOSION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public enum BlockInteraction { public enum BlockInteraction {

View File

@ -2,17 +2,15 @@ package net.minestom.server.network.packet.server.play;
import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Vec; import net.minestom.server.coordinate.Vec;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record FacePlayerPacket(FacePosition facePosition, public record FacePlayerPacket(FacePosition facePosition,
Point target, int entityId, FacePosition entityFacePosition) implements ServerPacket { Point target, int entityId, FacePosition entityFacePosition) implements ServerPacket.Play {
public FacePlayerPacket(@NotNull NetworkBuffer reader) { public FacePlayerPacket(@NotNull NetworkBuffer reader) {
this(FacePosition.values()[reader.read(VAR_INT)], this(FacePosition.values()[reader.read(VAR_INT)],
new Vec(reader.read(DOUBLE), reader.read(DOUBLE), reader.read(DOUBLE)), new Vec(reader.read(DOUBLE), reader.read(DOUBLE), reader.read(DOUBLE)),
@ -35,11 +33,8 @@ public record FacePlayerPacket(FacePosition facePosition,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.FACE_PLAYER;
case PLAY -> ServerPacketIdentifier.FACE_PLAYER;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public enum FacePosition { public enum FacePosition {

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.BYTE; import static net.minestom.server.network.NetworkBuffer.BYTE;
public record HeldItemChangePacket(byte slot) implements ServerPacket { public record HeldItemChangePacket(byte slot) implements ServerPacket.Play {
public HeldItemChangePacket(@NotNull NetworkBuffer reader) { public HeldItemChangePacket(@NotNull NetworkBuffer reader) {
this(reader.read(BYTE)); this(reader.read(BYTE));
} }
@ -20,10 +18,7 @@ public record HeldItemChangePacket(byte slot) implements ServerPacket {
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.HELD_ITEM_CHANGE;
case PLAY -> ServerPacketIdentifier.HELD_ITEM_CHANGE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.FLOAT; import static net.minestom.server.network.NetworkBuffer.FLOAT;
import static net.minestom.server.network.NetworkBuffer.VAR_INT; import static net.minestom.server.network.NetworkBuffer.VAR_INT;
public record HitAnimationPacket(int entityId, float yaw) implements ServerPacket { public record HitAnimationPacket(int entityId, float yaw) implements ServerPacket.Play {
public HitAnimationPacket(@NotNull NetworkBuffer reader) { public HitAnimationPacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), reader.read(FLOAT)); this(reader.read(VAR_INT), reader.read(FLOAT));
@ -23,10 +21,7 @@ public record HitAnimationPacket(int entityId, float yaw) implements ServerPacke
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.HIT_ANIMATION;
case PLAY -> ServerPacketIdentifier.HIT_ANIMATION;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,10 +1,8 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
@ -12,7 +10,7 @@ import static net.minestom.server.network.NetworkBuffer.*;
public record InitializeWorldBorderPacket(double x, double z, public record InitializeWorldBorderPacket(double x, double z,
double oldDiameter, double newDiameter, long speed, double oldDiameter, double newDiameter, long speed,
int portalTeleportBoundary, int warningTime, int portalTeleportBoundary, int warningTime,
int warningBlocks) implements ServerPacket { int warningBlocks) implements ServerPacket.Play {
public InitializeWorldBorderPacket(@NotNull NetworkBuffer reader) { public InitializeWorldBorderPacket(@NotNull NetworkBuffer reader) {
this(reader.read(DOUBLE), reader.read(DOUBLE), this(reader.read(DOUBLE), reader.read(DOUBLE),
reader.read(DOUBLE), reader.read(DOUBLE), reader.read(DOUBLE), reader.read(DOUBLE),
@ -32,10 +30,7 @@ public record InitializeWorldBorderPacket(double x, double z,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.INITIALIZE_WORLD_BORDER;
case PLAY -> ServerPacketIdentifier.INITIALIZE_WORLD_BORDER;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,12 +1,10 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.entity.GameMode; import net.minestom.server.entity.GameMode;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.network.packet.server.play.data.DeathLocation; import net.minestom.server.network.packet.server.play.data.DeathLocation;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -20,7 +18,7 @@ public record JoinGamePacket(
boolean doLimitedCrafting, boolean doLimitedCrafting,
String dimensionType, String world, long hashedSeed, GameMode gameMode, GameMode previousGameMode, String dimensionType, String world, long hashedSeed, GameMode gameMode, GameMode previousGameMode,
boolean isDebug, boolean isFlat, DeathLocation deathLocation, int portalCooldown boolean isDebug, boolean isFlat, DeathLocation deathLocation, int portalCooldown
) implements ServerPacket { ) implements ServerPacket.Play {
public static final int MAX_WORLDS = Short.MAX_VALUE; public static final int MAX_WORLDS = Short.MAX_VALUE;
public JoinGamePacket { public JoinGamePacket {
@ -79,11 +77,8 @@ public record JoinGamePacket(
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.JOIN_GAME;
case PLAY -> ServerPacketIdentifier.JOIN_GAME;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
/** /**

View File

@ -1,11 +1,9 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -15,7 +13,7 @@ import static net.minestom.server.network.NetworkBuffer.*;
public record MapDataPacket(int mapId, byte scale, boolean locked, public record MapDataPacket(int mapId, byte scale, boolean locked,
boolean trackingPosition, @NotNull List<Icon> icons, boolean trackingPosition, @NotNull List<Icon> icons,
@Nullable MapDataPacket.ColorContent colorContent) implements ServerPacket { @Nullable MapDataPacket.ColorContent colorContent) implements ServerPacket.Play {
public static final int MAX_ICONS = 1024; public static final int MAX_ICONS = 1024;
public MapDataPacket { public MapDataPacket {
@ -65,11 +63,8 @@ public record MapDataPacket(int mapId, byte scale, boolean locked,
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.MAP_DATA;
case PLAY -> ServerPacketIdentifier.MAP_DATA;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
public record Icon(int type, byte x, byte z, byte direction, public record Icon(int type, byte x, byte z, byte direction,

View File

@ -1,15 +1,13 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record MultiBlockChangePacket(long chunkSectionPosition, long[] blocks) implements ServerPacket { public record MultiBlockChangePacket(long chunkSectionPosition, long[] blocks) implements ServerPacket.Play {
public MultiBlockChangePacket(int chunkX, int section, int chunkZ, public MultiBlockChangePacket(int chunkX, int section, int chunkZ,
long[] blocks) { long[] blocks) {
this(((long) (chunkX & 0x3FFFFF) << 42) | (section & 0xFFFFF) | ((long) (chunkZ & 0x3FFFFF) << 20), blocks); this(((long) (chunkX & 0x3FFFFF) << 42) | (section & 0xFFFFF) | ((long) (chunkZ & 0x3FFFFF) << 20), blocks);
@ -26,10 +24,7 @@ public record MultiBlockChangePacket(long chunkSectionPosition, long[] blocks) i
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.MULTI_BLOCK_CHANGE;
case PLAY -> ServerPacketIdentifier.MULTI_BLOCK_CHANGE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

View File

@ -1,16 +1,14 @@
package net.minestom.server.network.packet.server.play; package net.minestom.server.network.packet.server.play;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.PacketUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTCompound;
import static net.minestom.server.network.NetworkBuffer.*; import static net.minestom.server.network.NetworkBuffer.*;
public record NbtQueryResponsePacket(int transactionId, NBTCompound data) implements ServerPacket { public record NbtQueryResponsePacket(int transactionId, NBTCompound data) implements ServerPacket.Play {
public NbtQueryResponsePacket(@NotNull NetworkBuffer reader) { public NbtQueryResponsePacket(@NotNull NetworkBuffer reader) {
this(reader.read(VAR_INT), (NBTCompound) reader.read(NBT)); this(reader.read(VAR_INT), (NBTCompound) reader.read(NBT));
} }
@ -27,10 +25,7 @@ public record NbtQueryResponsePacket(int transactionId, NBTCompound data) implem
} }
@Override @Override
public int getId(@NotNull ConnectionState state) { public int playId() {
return switch (state) { return ServerPacketIdentifier.NBT_QUERY_RESPONSE;
case PLAY -> ServerPacketIdentifier.NBT_QUERY_RESPONSE;
default -> PacketUtils.invalidPacketState(getClass(), state, ConnectionState.PLAY);
};
} }
} }

Some files were not shown because too many files have changed in this diff Show More