From 5a7963867e176f970eec2c68c0dd8367a0bfa625 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 7 Nov 2025 13:25:18 +0100 Subject: [PATCH] packets: Add support for 1.21.11 --- libraries/packets/build.gradle.kts | 1 + .../implementations/1_21_11/build.gradle.kts | 23 ++ .../ClientboundAddEntityPacketImpl.java | 48 +++ .../ClientboundClearDialogPacketImpl.java | 22 ++ ...ientboundCreateOrUpdateTeamPacketImpl.java | 128 ++++++++ ...ClientboundPlayerInfoRemovePacketImpl.java | 30 ++ ...ClientboundPlayerInfoUpdatePacketImpl.java | 54 ++++ .../ClientboundRemoveEntitiesPacketImpl.java | 37 +++ .../ClientboundRotateHeadPacketImpl.java | 38 +++ .../ClientboundSetEntityDataPacketImpl.java | 67 +++++ .../ClientboundSetEquipmentPacketImpl.java | 45 +++ .../ClientboundSetPassengersPacketImpl.java | 45 +++ .../ClientboundShowDialogPacketImpl.java | 276 ++++++++++++++++++ .../ClientboundTeleportEntityPacketImpl.java | 43 +++ .../v1_21_11/utils/GameProfileImpl.java | 33 +++ .../v1_21_11/utils/PacketListenerImpl.java | 110 +++++++ .../v1_21_11/utils/VanillaPlayerAdapter.java | 12 + .../ClientboundAddEntityPacketImplTest.java | 65 +++++ .../ClientboundClearDialogPacketImplTest.java | 15 + ...ntboundPlayerInfoRemovePacketImplTest.java | 23 ++ ...ntboundPlayerInfoUpdatePacketImplTest.java | 62 ++++ ...ientboundRemoveEntitiesPacketImplTest.java | 21 ++ .../ClientboundRotateHeadPacketImplTest.java | 21 ++ ...lientboundSetEntityDataPacketImplTest.java | 29 ++ ...ClientboundSetEquipmentPacketImplTest.java | 29 ++ ...lientboundSetPassengersPacketImplTest.java | 29 ++ ...ientboundTeleportEntityPacketImplTest.java | 31 ++ .../fancysitula/api/utils/ServerVersion.java | 1 + .../fancysitula/factories/PacketFactory.java | 48 +++ .../factories/PacketListenerFactory.java | 3 + settings.gradle.kts | 1 + 31 files changed, 1390 insertions(+) create mode 100644 libraries/packets/implementations/1_21_11/build.gradle.kts create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundAddEntityPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundClearDialogPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundCreateOrUpdateTeamPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundPlayerInfoRemovePacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundPlayerInfoUpdatePacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundRemoveEntitiesPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundRotateHeadPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetEntityDataPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetEquipmentPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetPassengersPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundShowDialogPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundTeleportEntityPacketImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/GameProfileImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/PacketListenerImpl.java create mode 100644 libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/VanillaPlayerAdapter.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundAddEntityPacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundClearDialogPacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundPlayerInfoRemovePacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundPlayerInfoUpdatePacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundRemoveEntitiesPacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundRotateHeadPacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetEntityDataPacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetEquipmentPacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetPassengersPacketImplTest.java create mode 100644 libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundTeleportEntityPacketImplTest.java diff --git a/libraries/packets/build.gradle.kts b/libraries/packets/build.gradle.kts index 68ba4003..468d38a4 100644 --- a/libraries/packets/build.gradle.kts +++ b/libraries/packets/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { compileOnly("io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") implementation(project(":libraries:packets:packets-api")) + implementation(project(":libraries:packets:implementations:1_21_11")) implementation(project(":libraries:packets:implementations:1_21_9")) implementation(project(":libraries:packets:implementations:1_21_6")) implementation(project(":libraries:packets:implementations:1_21_5")) diff --git a/libraries/packets/implementations/1_21_11/build.gradle.kts b/libraries/packets/implementations/1_21_11/build.gradle.kts new file mode 100644 index 00000000..87087bfa --- /dev/null +++ b/libraries/packets/implementations/1_21_11/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + id("java-library") + id("io.papermc.paperweight.userdev") +} + +paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.MOJANG_PRODUCTION + +dependencies { + paperweight.paperDevBundle("25w45a-R0.1-SNAPSHOT") + compileOnly(project(":libraries:packets:packets-api")) + + testImplementation(project(":libraries:packets")) + testImplementation(project(":libraries:packets:packets-api")) + testImplementation("org.junit.jupiter:junit-jupiter-api:5.12.2") + testImplementation("org.junit.jupiter:junit-jupiter-engine:5.12.2") + testImplementation("org.junit.platform:junit-platform-console-standalone:1.12.2") +} + +tasks { + test { + useJUnitPlatform() + } +} \ No newline at end of file diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundAddEntityPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundAddEntityPacketImpl.java new file mode 100644 index 00000000..f4ca9230 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundAddEntityPacketImpl.java @@ -0,0 +1,48 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundAddEntityPacket; +import de.oliver.fancysitula.api.utils.AngelConverter; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec3; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.entity.EntityType; + +import java.util.UUID; + +public class ClientboundAddEntityPacketImpl extends FS_ClientboundAddEntityPacket { + + public ClientboundAddEntityPacketImpl(int entityId, UUID entityUUID, EntityType entityType, double x, double y, double z, float yaw, float pitch, float headYaw, int velocityX, int velocityY, int velocityZ, int data) { + super(entityId, entityUUID, entityType, x, y, z, yaw, pitch, headYaw, velocityX, velocityY, velocityZ, data); + } + + @Override + public Object createPacket() { + net.minecraft.world.entity.EntityType vanillaType = BuiltInRegistries.ENTITY_TYPE.getValue(CraftNamespacedKey.toMinecraft(entityType.getKey())); + + return new ClientboundAddEntityPacket( + entityId, + entityUUID, + x, + y, + z, + AngelConverter.degreesToVanillaByte(pitch), + AngelConverter.degreesToVanillaByte(yaw), + vanillaType, + data, + new Vec3(velocityX, velocityY, velocityZ), + AngelConverter.degreesToVanillaByte(headYaw) + ); + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundAddEntityPacket packet = (ClientboundAddEntityPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundClearDialogPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundClearDialogPacketImpl.java new file mode 100644 index 00000000..5fb79a62 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundClearDialogPacketImpl.java @@ -0,0 +1,22 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundClearDialogPacket; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import net.minecraft.network.protocol.common.ClientboundClearDialogPacket; +import net.minecraft.server.level.ServerPlayer; + +public class ClientboundClearDialogPacketImpl extends FS_ClientboundClearDialogPacket { + @Override + public Object createPacket() { + return ClientboundClearDialogPacket.INSTANCE; + } + + @Override + protected void sendPacketTo(FS_RealPlayer player) { + ClientboundClearDialogPacket packet = (ClientboundClearDialogPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundCreateOrUpdateTeamPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundCreateOrUpdateTeamPacketImpl.java new file mode 100644 index 00000000..3694e322 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundCreateOrUpdateTeamPacketImpl.java @@ -0,0 +1,128 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundCreateOrUpdateTeamPacket; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import io.papermc.paper.adventure.PaperAdventure; +import net.minecraft.ChatFormatting; +import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.scores.Scoreboard; +import net.minecraft.world.scores.Team; + +public class ClientboundCreateOrUpdateTeamPacketImpl extends FS_ClientboundCreateOrUpdateTeamPacket { + + private static final Scoreboard SCOREBOARD = new Scoreboard(); + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, CreateTeam createTeam) { + super(teamName, createTeam); + } + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, RemoveTeam removeTeam) { + super(teamName, removeTeam); + } + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, UpdateTeam updateTeam) { + super(teamName, updateTeam); + } + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, AddEntity addEntity) { + super(teamName, addEntity); + } + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, RemoveEntity removeEntity) { + super(teamName, removeEntity); + } + + @Override + public Object createPacket() { + return switch (method) { + case CREATE_TEAM -> createCreateTeamPacket(); + case REMOVE_TEAM -> createRemoveTeamPacket(); + case UPDATE_TEAM -> createUpdateTeamPacket(); + case ADD_ENTITY -> createAddEntityPacket(); + case REMOVE_ENTITY -> createRemoveEntityPacket(); + }; + } + + private Object createCreateTeamPacket() { + if (createTeam == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + playerTeam.setDisplayName(PaperAdventure.asVanilla(createTeam.getDisplayName())); + playerTeam.setAllowFriendlyFire(createTeam.isAllowFriendlyFire()); + playerTeam.setSeeFriendlyInvisibles(createTeam.isCanSeeFriendlyInvisibles()); + playerTeam.setNameTagVisibility(Team.Visibility.valueOf(createTeam.getNameTagVisibility().getName())); + playerTeam.setCollisionRule(PlayerTeam.CollisionRule.valueOf(createTeam.getCollisionRule().getName())); + playerTeam.setColor(ChatFormatting.getById(createTeam.getColor().getId())); + playerTeam.setPlayerPrefix(PaperAdventure.asVanilla(createTeam.getPrefix())); + playerTeam.setPlayerSuffix(PaperAdventure.asVanilla(createTeam.getSuffix())); + for (String entity : createTeam.getEntities()) { + playerTeam.getPlayers().add(entity); + } + + return ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, true); + } + + private Object createRemoveTeamPacket() { + if (removeTeam == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + return ClientboundSetPlayerTeamPacket.createRemovePacket(playerTeam); + } + + private Object createUpdateTeamPacket() { + if (updateTeam == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + playerTeam.setDisplayName(PaperAdventure.asVanilla(updateTeam.getDisplayName())); + playerTeam.setAllowFriendlyFire(updateTeam.isAllowFriendlyFire()); + playerTeam.setSeeFriendlyInvisibles(updateTeam.isCanSeeFriendlyInvisibles()); + playerTeam.setNameTagVisibility(Team.Visibility.valueOf(updateTeam.getNameTagVisibility().getName())); + playerTeam.setCollisionRule(PlayerTeam.CollisionRule.valueOf(updateTeam.getCollisionRule().getName())); + playerTeam.setColor(ChatFormatting.getById(updateTeam.getColor().getId())); + playerTeam.setPlayerPrefix(PaperAdventure.asVanilla(updateTeam.getPrefix())); + playerTeam.setPlayerSuffix(PaperAdventure.asVanilla(updateTeam.getSuffix())); + + return ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, true); + } + + private Object createAddEntityPacket() { + if (addEntity == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + for (String entity : addEntity.getEntities()) { + playerTeam.getPlayers().add(entity); + } + return ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket(playerTeam, addEntity.getEntities(), ClientboundSetPlayerTeamPacket.Action.ADD); + } + + private Object createRemoveEntityPacket() { + if (removeEntity == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + for (String entity : removeEntity.getEntities()) { + playerTeam.getPlayers().add(entity); + } + return ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket(playerTeam, removeEntity.getEntities(), ClientboundSetPlayerTeamPacket.Action.REMOVE); + } + + @Override + protected void sendPacketTo(FS_RealPlayer player) { + ClientboundSetPlayerTeamPacket packet = (ClientboundSetPlayerTeamPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundPlayerInfoRemovePacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundPlayerInfoRemovePacketImpl.java new file mode 100644 index 00000000..c4e6a6e1 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundPlayerInfoRemovePacketImpl.java @@ -0,0 +1,30 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundPlayerInfoRemovePacket; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; +import net.minecraft.server.level.ServerPlayer; + +import java.util.List; +import java.util.UUID; + +public class ClientboundPlayerInfoRemovePacketImpl extends FS_ClientboundPlayerInfoRemovePacket { + + public ClientboundPlayerInfoRemovePacketImpl(List uuids) { + super(uuids); + } + + @Override + public Object createPacket() { + return new ClientboundPlayerInfoRemovePacket(uuids); + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundPlayerInfoRemovePacket packet = (ClientboundPlayerInfoRemovePacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundPlayerInfoUpdatePacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundPlayerInfoUpdatePacketImpl.java new file mode 100644 index 00000000..b707f60e --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundPlayerInfoUpdatePacketImpl.java @@ -0,0 +1,54 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundPlayerInfoUpdatePacket; +import de.oliver.fancysitula.versions.v1_21_11.utils.GameProfileImpl; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import io.papermc.paper.adventure.PaperAdventure; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.GameType; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +public class ClientboundPlayerInfoUpdatePacketImpl extends FS_ClientboundPlayerInfoUpdatePacket { + + public ClientboundPlayerInfoUpdatePacketImpl(EnumSet actions, List entries) { + super(actions, entries); + } + + @Override + public Object createPacket() { + EnumSet vanillaActions = EnumSet.noneOf(ClientboundPlayerInfoUpdatePacket.Action.class); + for (FS_ClientboundPlayerInfoUpdatePacket.Action action : actions) { + vanillaActions.add(ClientboundPlayerInfoUpdatePacket.Action.valueOf(action.name())); + } + + List entries = new ArrayList<>(); + for (Entry entry : this.entries) { + entries.add(new ClientboundPlayerInfoUpdatePacket.Entry( + entry.uuid(), + GameProfileImpl.asVanilla(entry.profile()), + entry.listed(), + entry.latency(), + GameType.byId(entry.gameMode().getId()), + PaperAdventure.asVanilla(entry.displayName()), + true, + -1, + null // TODO: Add ChatSession support + )); + } + + return new ClientboundPlayerInfoUpdatePacket(vanillaActions, entries); + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundPlayerInfoUpdatePacket packet = (ClientboundPlayerInfoUpdatePacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundRemoveEntitiesPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundRemoveEntitiesPacketImpl.java new file mode 100644 index 00000000..7aca5733 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundRemoveEntitiesPacketImpl.java @@ -0,0 +1,37 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundRemoveEntitiesPacket; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; +import net.minecraft.server.level.ServerPlayer; + +import java.util.List; + +public class ClientboundRemoveEntitiesPacketImpl extends FS_ClientboundRemoveEntitiesPacket { + + /** + * @param entityIds IDs of the entities to remove + */ + public ClientboundRemoveEntitiesPacketImpl(List entityIds) { + super(entityIds); + } + + @Override + public Object createPacket() { + int[] ids = new int[this.entityIds.size()]; + for (int i = 0; i < this.entityIds.size(); i++) { + ids[i] = this.entityIds.get(i); + } + + return new ClientboundRemoveEntitiesPacket(ids); + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundRemoveEntitiesPacket packet = (ClientboundRemoveEntitiesPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundRotateHeadPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundRotateHeadPacketImpl.java new file mode 100644 index 00000000..240d3068 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundRotateHeadPacketImpl.java @@ -0,0 +1,38 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundRotateHeadPacket; +import de.oliver.fancysitula.api.utils.AngelConverter; +import de.oliver.fancysitula.api.utils.reflections.ReflectionUtils; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket; +import net.minecraft.server.level.ServerPlayer; + +public class ClientboundRotateHeadPacketImpl extends FS_ClientboundRotateHeadPacket { + + public ClientboundRotateHeadPacketImpl(int entityId, float headYaw) { + super(entityId, headYaw); + } + + @Override + public Object createPacket() { + ClientboundRotateHeadPacket packet = null; + + try { + packet = ReflectionUtils.createUnsafeInstance(ClientboundRotateHeadPacket.class); + ReflectionUtils.setFinalField(packet, "entityId", entityId); + ReflectionUtils.setFinalField(packet, "yHeadRot", AngelConverter.degreesToVanillaByte(headYaw)); + } catch (Exception e) { + e.printStackTrace(); + } + return packet; + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundRotateHeadPacket packet = (ClientboundRotateHeadPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetEntityDataPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetEntityDataPacketImpl.java new file mode 100644 index 00000000..a011e10c --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetEntityDataPacketImpl.java @@ -0,0 +1,67 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundSetEntityDataPacket; +import de.oliver.fancysitula.api.utils.reflections.ReflectionUtils; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import io.papermc.paper.adventure.PaperAdventure; +import net.kyori.adventure.text.Component; +import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.block.BlockState; +import org.bukkit.craftbukkit.block.CraftBlockState; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ClientboundSetEntityDataPacketImpl extends FS_ClientboundSetEntityDataPacket { + + public ClientboundSetEntityDataPacketImpl(int entityId, List entityData) { + super(entityId, entityData); + } + + @Override + public Object createPacket() { + List> dataValues = new ArrayList<>(); + for (EntityData data : entityData) { + try { + Class entityClass = Class.forName(data.getAccessor().entityClassName()); + net.minecraft.network.syncher.EntityDataAccessor accessor = ReflectionUtils.getStaticField(entityClass, data.getAccessor().accessorFieldName()); + + Object vanillaValue = data.getValue(); + + if (data.getValue() == null) { + continue; + } + + if (data.getValue() instanceof Component c) { + vanillaValue = PaperAdventure.asVanilla(c); + } + + if (data.getValue() instanceof ItemStack i) { + vanillaValue = net.minecraft.world.item.ItemStack.fromBukkitCopy(i); + } + + if (data.getValue() instanceof BlockState b) { + vanillaValue = ((CraftBlockState) b).getHandle(); + } + + dataValues.add(SynchedEntityData.DataValue.create(accessor, vanillaValue)); + } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } + + return new ClientboundSetEntityDataPacket(entityId, dataValues); + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundSetEntityDataPacket packet = (ClientboundSetEntityDataPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetEquipmentPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetEquipmentPacketImpl.java new file mode 100644 index 00000000..0530362f --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetEquipmentPacketImpl.java @@ -0,0 +1,45 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import com.mojang.datafixers.util.Pair; +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundSetEquipmentPacket; +import de.oliver.fancysitula.api.utils.FS_EquipmentSlot; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.EquipmentSlot; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ClientboundSetEquipmentPacketImpl extends FS_ClientboundSetEquipmentPacket { + + public ClientboundSetEquipmentPacketImpl(int entityId, Map equipment) { + super(entityId, equipment); + } + + @Override + public Object createPacket() { + List> slots = new ArrayList<>(); + + for (Map.Entry entry : equipment.entrySet()) { + EquipmentSlot equipmentSlot = net.minecraft.world.entity.EquipmentSlot.byName(entry.getKey().name().toLowerCase()); + net.minecraft.world.item.ItemStack itemStack = CraftItemStack.asNMSCopy(entry.getValue()); + + slots.add(Pair.of(equipmentSlot, itemStack)); + } + + return new ClientboundSetEquipmentPacket(entityId, slots); + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundSetEquipmentPacket packet = (ClientboundSetEquipmentPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetPassengersPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetPassengersPacketImpl.java new file mode 100644 index 00000000..689f7081 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundSetPassengersPacketImpl.java @@ -0,0 +1,45 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundSetPassengersPacket; +import de.oliver.fancysitula.api.utils.reflections.ReflectionUtils; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; +import net.minecraft.server.level.ServerPlayer; + +import java.util.List; + +public class ClientboundSetPassengersPacketImpl extends FS_ClientboundSetPassengersPacket { + + public ClientboundSetPassengersPacketImpl(int entityId, List passengers) { + super(entityId, passengers); + } + + + @Override + public Object createPacket() { + int[] passengers = new int[this.passengers.size()]; + for (int i = 0; i < this.passengers.size(); i++) { + passengers[i] = this.passengers.get(i); + } + + try { + ClientboundSetPassengersPacket packet = ReflectionUtils.createUnsafeInstance(ClientboundSetPassengersPacket.class); + ReflectionUtils.setFinalField(packet, "vehicle", entityId); + ReflectionUtils.setFinalField(packet, "passengers", passengers); + return packet; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundSetPassengersPacket packet = (ClientboundSetPassengersPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundShowDialogPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundShowDialogPacketImpl.java new file mode 100644 index 00000000..998d048d --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundShowDialogPacketImpl.java @@ -0,0 +1,276 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.dialogs.FS_CommonDialogData; +import de.oliver.fancysitula.api.dialogs.FS_Dialog; +import de.oliver.fancysitula.api.dialogs.FS_DialogAction; +import de.oliver.fancysitula.api.dialogs.actions.FS_CommonButtonData; +import de.oliver.fancysitula.api.dialogs.actions.FS_DialogActionButton; +import de.oliver.fancysitula.api.dialogs.actions.FS_DialogCustomAction; +import de.oliver.fancysitula.api.dialogs.body.FS_DialogBody; +import de.oliver.fancysitula.api.dialogs.body.FS_DialogItemBody; +import de.oliver.fancysitula.api.dialogs.body.FS_DialogTextBody; +import de.oliver.fancysitula.api.dialogs.inputs.*; +import de.oliver.fancysitula.api.dialogs.types.FS_ConfirmationDialog; +import de.oliver.fancysitula.api.dialogs.types.FS_DialogListDialog; +import de.oliver.fancysitula.api.dialogs.types.FS_MultiActionDialog; +import de.oliver.fancysitula.api.dialogs.types.FS_NoticeDialog; +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundShowDialogPacket; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import io.papermc.paper.adventure.PaperAdventure; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.common.ClientboundShowDialogPacket; +import net.minecraft.resources.Identifier; +import net.minecraft.server.dialog.*; +import net.minecraft.server.dialog.action.Action; +import net.minecraft.server.dialog.action.CustomAll; +import net.minecraft.server.dialog.body.DialogBody; +import net.minecraft.server.dialog.body.ItemBody; +import net.minecraft.server.dialog.body.PlainMessage; +import net.minecraft.server.dialog.input.*; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class ClientboundShowDialogPacketImpl extends FS_ClientboundShowDialogPacket { + + public ClientboundShowDialogPacketImpl(FS_Dialog dialog) { + super(dialog); + } + + @Override + public Object createPacket() { + Holder holder = Holder.direct(toNms(dialog)); + return new ClientboundShowDialogPacket(holder); + } + + @Override + protected void sendPacketTo(FS_RealPlayer player) { + ClientboundShowDialogPacket packet = (ClientboundShowDialogPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } + + private Dialog toNms(FS_Dialog dialog) { + if (dialog instanceof FS_NoticeDialog notice) { + return noticeToNms(notice); + } else if (dialog instanceof FS_ConfirmationDialog confirmation) { + return confirmationToNms(confirmation); + } else if (dialog instanceof FS_DialogListDialog dialogList) { + return dialogListToNms(dialogList); + } else if (dialog instanceof FS_MultiActionDialog multiActionDialog) { + return multiActionDialogToNms(multiActionDialog); + } + + return null; + } + + private Dialog noticeToNms(FS_NoticeDialog notice) { + CommonDialogData common = commonToNms(notice.getDialogData()); + ActionButton actionButton = actionButtonToNms(notice.getActionButton()); + + return new NoticeDialog(common, actionButton); + } + + private Dialog confirmationToNms(FS_ConfirmationDialog notice) { + CommonDialogData common = commonToNms(notice.getDialogData()); + ActionButton yes = actionButtonToNms(notice.getYesButton()); + ActionButton no = actionButtonToNms(notice.getNoButton()); + + return new ConfirmationDialog(common, yes, no); + } + + private Dialog dialogListToNms(FS_DialogListDialog dialogList) { + CommonDialogData common = commonToNms(dialogList.getDialogData()); + List> dialogs = new ArrayList<>(); + + for (FS_Dialog dialog : dialogList.getDialogs()) { + dialogs.add(Holder.direct(toNms(dialog))); + } + + HolderSet dialogSet = HolderSet.direct(dialogs); + + Optional exitButton = dialogList.getExitButton() != null ? + Optional.of(actionButtonToNms(dialogList.getExitButton())) : + Optional.empty(); + + return new DialogListDialog(common, dialogSet, exitButton, dialogList.getColumns(), dialogList.getButtonWidth()); + } + + private Dialog multiActionDialogToNms(FS_MultiActionDialog multiActionDialog) { + CommonDialogData common = commonToNms(multiActionDialog.getDialogData()); + List actionButtons = new ArrayList<>(); + + for (FS_DialogActionButton actionButton : multiActionDialog.getActions()) { + actionButtons.add(actionButtonToNms(actionButton)); + } + + Optional exitAction = multiActionDialog.getExitAction() != null ? + Optional.of(actionButtonToNms(multiActionDialog.getExitAction())) : + Optional.empty(); + + return new MultiActionDialog(common, actionButtons, exitAction, multiActionDialog.getColumns()); + } + + private CommonDialogData commonToNms(FS_CommonDialogData dialogData) { + Component title = PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(dialogData.getTitle())); + + Optional externalTitle = dialogData.getExternalTitle() != null ? + Optional.of(PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(dialogData.getExternalTitle()))) : + Optional.empty(); + + return new CommonDialogData( + title, + externalTitle, + dialogData.isCanCloseWithEscape(), + dialogData.isPause(), + actionToNms(dialogData.getAfterAction()), + bodyToNms(dialogData.getBody()), + inputsToNms(dialogData.getInputs()) + ); + } + + private DialogAction actionToNms(FS_DialogAction dialogAction) { + return switch (dialogAction) { + case CLOSE -> DialogAction.CLOSE; + case NONE -> DialogAction.NONE; + case WAIT_FOR_RESPONSE -> DialogAction.WAIT_FOR_RESPONSE; + }; + } + + private List bodyToNms(List bodies) { + List nmsBodies = new ArrayList<>(); + + for (FS_DialogBody body : bodies) { + if (body instanceof FS_DialogTextBody textBody) { + nmsBodies.add(new PlainMessage( + PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(textBody.getText())), + textBody.getWidth() + )); + } else if (body instanceof FS_DialogItemBody itemBody) { + Optional description = itemBody.getDescription() != null ? + Optional.of(new PlainMessage( + PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(itemBody.getDescription().getText())), + itemBody.getDescription().getWidth() + )) : + Optional.empty(); + + nmsBodies.add(new ItemBody( + CraftItemStack.asNMSCopy(itemBody.getItem()), + description, + itemBody.isShowDecorations(), + itemBody.isShowTooltip(), + itemBody.getWidth(), + itemBody.getHeight() + )); + } + } + + return nmsBodies; + } + + private List inputsToNms(List inputs) { + List nmsInputs = new ArrayList<>(); + + for (FS_DialogInput input : inputs) { + String key = input.getKey(); + + InputControl control = null; + if (input.getControl() instanceof FS_DialogBooleanInput booleanInput) { + control = new BooleanInput( + PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(booleanInput.getLabel())), + booleanInput.isInitial(), + booleanInput.getOnTrue(), + booleanInput.getOnFalse() + ); + } else if (input.getControl() instanceof FS_DialogNumberRangeInput numberRangeInput) { + control = new NumberRangeInput( + numberRangeInput.getWidth(), + PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(numberRangeInput.getLabel())), + numberRangeInput.getLabelFormat(), + new NumberRangeInput.RangeInfo( + numberRangeInput.getStart(), + numberRangeInput.getEnd(), + numberRangeInput.getInitial() != null ? Optional.of(numberRangeInput.getInitial()) : Optional.empty(), + numberRangeInput.getStep() != null ? Optional.of(numberRangeInput.getStep()) : Optional.empty() + ) + ); + } else if (input.getControl() instanceof FS_DialogSingleOptionInput singleOptionInput) { + List nmsEntries = new ArrayList<>(); + for (FS_DialogSingleOptionInput.Entry entry : singleOptionInput.getEntries()) { + nmsEntries.add(new SingleOptionInput.Entry( + entry.getId(), + entry.getDisplay() != null ? Optional.of(PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(entry.getDisplay()))) : Optional.empty(), + entry.isInitial() + )); + } + + control = new SingleOptionInput( + singleOptionInput.getWidth(), + nmsEntries, + PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(singleOptionInput.getLabel())), + singleOptionInput.isLabelVisible() + ); + } else if (input.getControl() instanceof FS_DialogTextInput textInput) { + control = new TextInput( + textInput.getWidth(), + PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(textInput.getLabel())), + textInput.isLabelVisible(), + textInput.getInitial(), + textInput.getMaxLength(), + Optional.empty() + ); + } + + nmsInputs.add(new Input(key, control)); + } + + return nmsInputs; + } + + private ActionButton actionButtonToNms(FS_DialogActionButton actionButton) { + CommonButtonData buttonData = commonButtonDataToNms(actionButton.getButtonData()); + + Action action = null; + if (actionButton.getAction() instanceof FS_DialogCustomAction customAction) { + Key idKey = Key.key("fancysitula", customAction.getId()); + Identifier idLocation = PaperAdventure.asVanilla(idKey); + + Optional additions; + if (customAction.getAdditions() != null) { + CompoundTag tag = new CompoundTag(); + customAction.getAdditions().forEach(tag::putString); + additions = Optional.of(tag); + } else { + additions = Optional.empty(); + } + + action = new CustomAll(idLocation, additions); + } + + Optional optionalAction = action != null ? + Optional.of(action) : + Optional.empty(); + + return new ActionButton(buttonData, optionalAction); + } + + private CommonButtonData commonButtonDataToNms(FS_CommonButtonData commonButtonData) { + Component label = PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(commonButtonData.getLabel())); + Optional tooltip = commonButtonData.getTooltip() != null ? + Optional.of(PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(commonButtonData.getTooltip()))) : + Optional.empty(); + int width = commonButtonData.getWidth(); + + return new CommonButtonData(label, tooltip, width); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundTeleportEntityPacketImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundTeleportEntityPacketImpl.java new file mode 100644 index 00000000..51c62161 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/packets/ClientboundTeleportEntityPacketImpl.java @@ -0,0 +1,43 @@ +package de.oliver.fancysitula.versions.v1_21_11.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundTeleportEntityPacket; +import de.oliver.fancysitula.versions.v1_21_11.utils.VanillaPlayerAdapter; +import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.phys.Vec3; + +import java.util.Set; + +public class ClientboundTeleportEntityPacketImpl extends FS_ClientboundTeleportEntityPacket { + + public ClientboundTeleportEntityPacketImpl(int entityId, double x, double y, double z, float yaw, float pitch, boolean onGround) { + super(entityId, x, y, z, yaw, pitch, onGround); + } + + @Override + public Object createPacket() { + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket( + entityId, + new PositionMoveRotation( + new Vec3(x, y, z), + Vec3.ZERO, + yaw, + pitch + ), + Set.of(), + onGround + ); + + return packet; + } + + @Override + public void sendPacketTo(FS_RealPlayer player) { + ClientboundTeleportEntityPacket packet = (ClientboundTeleportEntityPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/GameProfileImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/GameProfileImpl.java new file mode 100644 index 00000000..39b7332c --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/GameProfileImpl.java @@ -0,0 +1,33 @@ +package de.oliver.fancysitula.versions.v1_21_11.utils; + +import com.mojang.authlib.GameProfile; +import de.oliver.fancysitula.api.utils.FS_GameProfile; + +import java.util.Map; + +public class GameProfileImpl { + + public static GameProfile asVanilla(FS_GameProfile gameProfile) { + GameProfile gf = new GameProfile(gameProfile.getUUID(), gameProfile.getName()); + + for (Map.Entry entry : gameProfile.getProperties().entrySet()) { + FS_GameProfile.Property property = entry.getValue(); + + gf.properties().put(entry.getKey(), new com.mojang.authlib.properties.Property(property.name(), property.value(), property.signature())); + } + + return gf; + } + + public static FS_GameProfile fromVanilla(GameProfile gameProfile) { + FS_GameProfile fsGameProfile = new FS_GameProfile(gameProfile.id(), gameProfile.name()); + + for (Map.Entry entry : gameProfile.properties().entries()) { + com.mojang.authlib.properties.Property property = entry.getValue(); + + fsGameProfile.getProperties().put(entry.getKey(), new FS_GameProfile.Property(property.name(), property.value(), property.signature())); + } + + return fsGameProfile; + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/PacketListenerImpl.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/PacketListenerImpl.java new file mode 100644 index 00000000..9e626b3f --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/PacketListenerImpl.java @@ -0,0 +1,110 @@ +package de.oliver.fancysitula.versions.v1_21_11.utils; + +import de.oliver.fancysitula.api.packets.FS_ServerboundCustomClickActionPacket; +import de.oliver.fancysitula.api.packets.FS_ServerboundPacket; +import de.oliver.fancysitula.api.utils.FS_PacketListener; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; +import io.papermc.paper.adventure.PaperAdventure; +import net.minecraft.nbt.StringTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.common.ServerboundCustomClickActionPacket; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PacketListenerImpl extends FS_PacketListener { + + private static final String PIPELINE_NAME = "fancysitula-packet-injector"; + + public PacketListenerImpl(FS_ServerboundPacket.Type packet) { + super(packet); + } + + @Override + public void inject(Player player) { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + + Channel channel = serverPlayer.connection.connection.channel; + + if (channel.pipeline().get(PIPELINE_NAME) != null) { + return; + } + + channel.pipeline().addAfter("decoder", PIPELINE_NAME, new MessageToMessageDecoder>() { + @Override + protected void decode(ChannelHandlerContext ctx, Packet msg, List out) { + out.add(msg); + + FS_ServerboundPacket.Type packetType = getPacketType(msg); + if (packetType == null) { + return; // Unsupported packet type + } + + if (packet == FS_ServerboundPacket.Type.ALL) { + FS_ServerboundPacket fsPacket = convert(packetType, msg); + PacketReceivedEvent packetReceivedEvent = new PacketReceivedEvent(fsPacket, player); + listeners.forEach(listener -> listener.accept(packetReceivedEvent)); + return; + } + + if (packet == packetType) { + FS_ServerboundPacket fsPacket = convert(packetType, msg); + PacketReceivedEvent packetReceivedEvent = new PacketReceivedEvent(fsPacket, player); + listeners.forEach(listener -> listener.accept(packetReceivedEvent)); + } + } + }); + } + + private FS_ServerboundPacket.Type getPacketType(Packet packet) { + String className = packet.getClass().getSimpleName(); + for (FS_ServerboundPacket.Type type : FS_ServerboundPacket.Type.values()) { + if (type.getPacketClassName().equalsIgnoreCase(className)) { + return type; + } + } + + return null; + } + + private FS_ServerboundPacket convert(FS_ServerboundPacket.Type type, Packet packet) { + switch (type) { + case CUSTOM_CLICK_ACTION -> { + ServerboundCustomClickActionPacket customClickActionPacket = (ServerboundCustomClickActionPacket) packet; + + Map payload = new HashMap<>(); + if (customClickActionPacket.payload().isPresent() && customClickActionPacket.payload().get().asCompound().isPresent()) { + customClickActionPacket.payload().get().asCompound().get().forEach((k, v) -> { + if (v.getType().getName().equals(StringTag.TYPE.getName())) { + if (v.asString().isPresent()) { + payload.put(k, v.asString().get()); + } + } else if (v.getType().getName().equals(net.minecraft.nbt.ByteTag.TYPE.getName())) { + if (v.asBoolean().isPresent()) { + payload.put(k, String.valueOf(v.asBoolean().get())); + } else if (v.asByte().isPresent()) { + payload.put(k, String.valueOf(v.asByte().get())); + } + } else { + payload.put(k, v.toString()); + } + }); + } + + return new FS_ServerboundCustomClickActionPacket( + type, + PaperAdventure.asAdventure(customClickActionPacket.id()), + payload + ); + } + // Add more cases for other packet types as needed + default -> throw new IllegalArgumentException("Unsupported packet type: " + type); + } + } +} diff --git a/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/VanillaPlayerAdapter.java b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/VanillaPlayerAdapter.java new file mode 100644 index 00000000..ab2780e0 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/main/java/de/oliver/fancysitula/versions/v1_21_11/utils/VanillaPlayerAdapter.java @@ -0,0 +1,12 @@ +package de.oliver.fancysitula.versions.v1_21_11.utils; + +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class VanillaPlayerAdapter { + + public static ServerPlayer asVanilla(Player p) { + return ((CraftPlayer) p).getHandle(); + } +} diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundAddEntityPacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundAddEntityPacketImplTest.java new file mode 100644 index 00000000..bd429275 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundAddEntityPacketImplTest.java @@ -0,0 +1,65 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.api.utils.AngelConverter; +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundAddEntityPacketImpl; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import org.bukkit.entity.EntityType; + +import java.util.UUID; + +class ClientboundAddEntityPacketImplTest { + + //TODO: Fix this test (registry problems) + // @Test + void createPacket() { + int entityId = 10000; + UUID entityUUID = UUID.randomUUID(); + EntityType entityType = EntityType.PIG; + + double x = 5; + double y = 57; + double z = 203; + + float yaw = 142; + float pitch = 247; + float headYaw = 90; + + int velocityX = 0; + int velocityY = 0; + int velocityZ = 0; + + int data = 0; + + ClientboundAddEntityPacketImpl packet = new ClientboundAddEntityPacketImpl( + entityId, + entityUUID, + entityType, + x, + y, + z, + yaw, + pitch, + headYaw, + velocityX, + velocityY, + velocityZ, + data + ); + + ClientboundAddEntityPacket createdPacket = (ClientboundAddEntityPacket) packet.createPacket(); + + assert createdPacket.getId() == entityId; + assert createdPacket.getUUID().equals(entityUUID); + assert createdPacket.getType().getDescriptionId().equals(entityType.getKey().getKey()); + assert createdPacket.getX() == x; + assert createdPacket.getY() == y; + assert createdPacket.getZ() == z; + assert createdPacket.getYRot() == AngelConverter.degreesToVanillaByte(yaw); + assert createdPacket.getXRot() == AngelConverter.degreesToVanillaByte(pitch); + assert createdPacket.getYHeadRot() == AngelConverter.degreesToVanillaByte(headYaw); + assert createdPacket.getMovement().x == velocityX; + assert createdPacket.getMovement().y == velocityY; + assert createdPacket.getMovement().z == velocityZ; + assert createdPacket.getData() == data; + } +} \ No newline at end of file diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundClearDialogPacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundClearDialogPacketImplTest.java new file mode 100644 index 00000000..2c00dfbc --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundClearDialogPacketImplTest.java @@ -0,0 +1,15 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundClearDialogPacketImpl; +import org.junit.jupiter.api.Test; + +public class ClientboundClearDialogPacketImplTest { + + @Test + void createPacket() { + ClientboundClearDialogPacketImpl packet = new ClientboundClearDialogPacketImpl(); + assert packet.createPacket() != null : "Packet creation failed"; +// assert packet.equals(ClientboundClearDialogPacket.INSTANCE); + } + +} diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundPlayerInfoRemovePacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundPlayerInfoRemovePacketImplTest.java new file mode 100644 index 00000000..6a9cad4c --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundPlayerInfoRemovePacketImplTest.java @@ -0,0 +1,23 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundPlayerInfoRemovePacketImpl; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.UUID; + +class ClientboundPlayerInfoRemovePacketImplTest { + + @Test + void createPacket() { + List uuids = List.of(UUID.randomUUID(), UUID.randomUUID()); + + ClientboundPlayerInfoRemovePacketImpl packet = new ClientboundPlayerInfoRemovePacketImpl(uuids); + ClientboundPlayerInfoRemovePacket vanillaPacket = (ClientboundPlayerInfoRemovePacket) packet.createPacket(); + + for (UUID uuid : uuids) { + assert vanillaPacket.profileIds().contains(uuid); + } + } +} \ No newline at end of file diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundPlayerInfoUpdatePacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundPlayerInfoUpdatePacketImplTest.java new file mode 100644 index 00000000..5a3b3971 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundPlayerInfoUpdatePacketImplTest.java @@ -0,0 +1,62 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.api.packets.FS_ClientboundPlayerInfoUpdatePacket; +import de.oliver.fancysitula.api.utils.FS_GameProfile; +import de.oliver.fancysitula.api.utils.FS_GameType; +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundPlayerInfoUpdatePacketImpl; +import net.kyori.adventure.text.Component; +import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.UUID; + +class ClientboundPlayerInfoUpdatePacketImplTest { + + @Test + void createPacket() { + // Setup packet + EnumSet actions = EnumSet.noneOf(FS_ClientboundPlayerInfoUpdatePacket.Action.class); + actions.add(FS_ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + actions.add(FS_ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME); + actions.add(FS_ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED); + + FS_GameProfile gameProfile = new FS_GameProfile(UUID.randomUUID(), "Test name"); + boolean listed = true; + int latency = 42; + FS_GameType gameMode = FS_GameType.SURVIVAL; + Component displayName = Component.text("Test displayname"); + + List entries = new ArrayList<>(); + entries.add(new FS_ClientboundPlayerInfoUpdatePacket.Entry( + gameProfile.getUUID(), + gameProfile, + listed, + latency, + gameMode, + displayName + )); + + ClientboundPlayerInfoUpdatePacketImpl packet = new ClientboundPlayerInfoUpdatePacketImpl(actions, entries); + + ClientboundPlayerInfoUpdatePacket createdPacket = (ClientboundPlayerInfoUpdatePacket) packet.createPacket(); + + assert createdPacket.entries().size() == 1; + assert createdPacket.actions().size() == 3; + + // check entry + ClientboundPlayerInfoUpdatePacket.Entry entry = createdPacket.entries().getFirst(); + assert entry.profile().id().equals(gameProfile.getUUID()); + assert entry.profile().name().equals(gameProfile.getName()); + assert entry.listed() == listed; + assert entry.latency() == latency; + assert entry.gameMode().getId() == gameMode.getId(); + + // check actions + assert createdPacket.actions().contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + assert createdPacket.actions().contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME); + assert createdPacket.actions().contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_LISTED); + } +} \ No newline at end of file diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundRemoveEntitiesPacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundRemoveEntitiesPacketImplTest.java new file mode 100644 index 00000000..846f45cb --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundRemoveEntitiesPacketImplTest.java @@ -0,0 +1,21 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundRemoveEntitiesPacketImpl; +import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; +import org.junit.jupiter.api.Test; + +import java.util.List; + +class ClientboundRemoveEntitiesPacketImplTest { + + @Test + void createPacket() { + List entityIds = List.of(95, 120, 154, 187); + + ClientboundRemoveEntitiesPacketImpl packet = new ClientboundRemoveEntitiesPacketImpl(entityIds); + ClientboundRemoveEntitiesPacket createdPacket = (ClientboundRemoveEntitiesPacket) packet.createPacket(); + + assert createdPacket.getEntityIds().size() == entityIds.size(); + assert createdPacket.getEntityIds().containsAll(entityIds); + } +} \ No newline at end of file diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundRotateHeadPacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundRotateHeadPacketImplTest.java new file mode 100644 index 00000000..f6f38409 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundRotateHeadPacketImplTest.java @@ -0,0 +1,21 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.api.utils.reflections.ReflectionUtils; +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundRotateHeadPacketImpl; +import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket; +import org.junit.jupiter.api.Test; + +class ClientboundRotateHeadPacketImplTest { + + @Test + void createPacket() throws Exception { + int entityId = 184; + float headYaw = 45; + + ClientboundRotateHeadPacketImpl packet = new ClientboundRotateHeadPacketImpl(entityId, (byte) headYaw); + ClientboundRotateHeadPacket createdPacket = (ClientboundRotateHeadPacket) packet.createPacket(); + + assert ReflectionUtils.getField(createdPacket, "entityId").equals(entityId); + assert createdPacket.getYHeadRot() == headYaw; + } +} \ No newline at end of file diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetEntityDataPacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetEntityDataPacketImplTest.java new file mode 100644 index 00000000..ce7358f1 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetEntityDataPacketImplTest.java @@ -0,0 +1,29 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.api.packets.FS_ClientboundSetEntityDataPacket; +import de.oliver.fancysitula.api.utils.entityData.FS_TextDisplayData; +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundSetEntityDataPacketImpl; +import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; + +import java.util.List; + +class ClientboundSetEntityDataPacketImplTest { + + //TODO: Fix this test (using registry) +// @Test + void createPacket() { + int entityId = 712; + List entityData = List.of( + new FS_ClientboundSetEntityDataPacket.EntityData( + FS_TextDisplayData.TEXT, + "Hello, World!" + ) + ); + + ClientboundSetEntityDataPacketImpl packet = new ClientboundSetEntityDataPacketImpl(entityId, entityData); + ClientboundSetEntityDataPacket createdPacket = (ClientboundSetEntityDataPacket) packet.createPacket(); + + assert createdPacket.id() == entityId; + assert createdPacket.packedItems().size() == 1; + } +} \ No newline at end of file diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetEquipmentPacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetEquipmentPacketImplTest.java new file mode 100644 index 00000000..7f736f56 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetEquipmentPacketImplTest.java @@ -0,0 +1,29 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.api.utils.FS_EquipmentSlot; +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundSetEquipmentPacketImpl; +import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.Map; + +class ClientboundSetEquipmentPacketImplTest { + + //TODO: Fix this test (registry problems) + // @Test + void createPacket() { + // Setup packet + Map equipment = Map.of( + FS_EquipmentSlot.MAINHAND, new ItemStack(Material.DIAMOND_SWORD), + FS_EquipmentSlot.OFFHAND, new ItemStack(Material.SHIELD), + FS_EquipmentSlot.HEAD, new ItemStack(Material.DIAMOND_HELMET) + ); + + ClientboundSetEquipmentPacketImpl packet = new ClientboundSetEquipmentPacketImpl(42, equipment); + ClientboundSetEquipmentPacket createdPacket = (ClientboundSetEquipmentPacket) packet.createPacket(); + + assert createdPacket.getEntity() == 42; + assert createdPacket.getSlots().size() == 3; + } +} \ No newline at end of file diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetPassengersPacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetPassengersPacketImplTest.java new file mode 100644 index 00000000..61d42019 --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundSetPassengersPacketImplTest.java @@ -0,0 +1,29 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundSetPassengersPacketImpl; +import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class ClientboundSetPassengersPacketImplTest { + + @Test + void createPacket() { + // Setup packet + int vehicleID = 712; + List passengers = new ArrayList<>(); + passengers.add(571); + passengers.add(572); + + ClientboundSetPassengersPacketImpl packet = new ClientboundSetPassengersPacketImpl(vehicleID, passengers); + ClientboundSetPassengersPacket createdPacket = (ClientboundSetPassengersPacket) packet.createPacket(); + + // Check packet + assert createdPacket.getVehicle() == vehicleID; + assert createdPacket.getPassengers().length == 2; + assert createdPacket.getPassengers()[0] == 571; + assert createdPacket.getPassengers()[1] == 572; + } +} diff --git a/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundTeleportEntityPacketImplTest.java b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundTeleportEntityPacketImplTest.java new file mode 100644 index 00000000..f1d19cbc --- /dev/null +++ b/libraries/packets/implementations/1_21_11/src/test/java/de/oliver/fancysitula/versions/v1_21_9/packets/ClientboundTeleportEntityPacketImplTest.java @@ -0,0 +1,31 @@ +package de.oliver.fancysitula.versions.v1_21_9.packets; + +import de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundTeleportEntityPacketImpl; +import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; +import org.junit.jupiter.api.Test; + +class ClientboundTeleportEntityPacketImplTest { + + @Test + void createPacket() { + int entityId = 4313; + double x = 15.0; + double y = 57.0; + double z = -27.0; + float yaw = 90.0f; + float pitch = 45.0f; + boolean onGround = true; + + ClientboundTeleportEntityPacketImpl packet = new ClientboundTeleportEntityPacketImpl(entityId, x, y, z, yaw, pitch, onGround); + ClientboundTeleportEntityPacket createdPacket = (ClientboundTeleportEntityPacket) packet.createPacket(); + + assert createdPacket != null; + assert createdPacket.id() == entityId; + assert createdPacket.change().position().x == x; + assert createdPacket.change().position().y == y; + assert createdPacket.change().position().z == z; + assert createdPacket.change().xRot() == pitch; + assert createdPacket.change().yRot() == yaw; + assert createdPacket.onGround() == onGround; + } +} \ No newline at end of file diff --git a/libraries/packets/packets-api/src/main/java/de/oliver/fancysitula/api/utils/ServerVersion.java b/libraries/packets/packets-api/src/main/java/de/oliver/fancysitula/api/utils/ServerVersion.java index 74af3693..07e418aa 100644 --- a/libraries/packets/packets-api/src/main/java/de/oliver/fancysitula/api/utils/ServerVersion.java +++ b/libraries/packets/packets-api/src/main/java/de/oliver/fancysitula/api/utils/ServerVersion.java @@ -7,6 +7,7 @@ import java.util.List; public enum ServerVersion { + v1_21_11("1.21.11", 774), v1_21_10("1.21.10", 773), v1_21_9("1.21.9", 773), v1_21_8("1.21.8", 772), diff --git a/libraries/packets/src/main/java/de/oliver/fancysitula/factories/PacketFactory.java b/libraries/packets/src/main/java/de/oliver/fancysitula/factories/PacketFactory.java index cedd8bfd..3797c19e 100644 --- a/libraries/packets/src/main/java/de/oliver/fancysitula/factories/PacketFactory.java +++ b/libraries/packets/src/main/java/de/oliver/fancysitula/factories/PacketFactory.java @@ -28,6 +28,9 @@ public class PacketFactory { List entries ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundPlayerInfoUpdatePacketImpl(actions, entries); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundPlayerInfoUpdatePacketImpl(actions, entries); } @@ -73,6 +76,9 @@ public class PacketFactory { int velocityZ, int data) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundAddEntityPacketImpl(entityId, entityUUID, entityType, x, y, z, yaw, pitch, headYaw, velocityX, velocityY, velocityZ, data); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundAddEntityPacketImpl(entityId, entityUUID, entityType, x, y, z, yaw, pitch, headYaw, velocityX, velocityY, velocityZ, data); } @@ -105,6 +111,9 @@ public class PacketFactory { List uuids ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundPlayerInfoRemovePacketImpl(uuids); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundPlayerInfoRemovePacketImpl(uuids); } @@ -137,6 +146,9 @@ public class PacketFactory { List entityIds ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundRemoveEntitiesPacketImpl(entityIds); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundRemoveEntitiesPacketImpl(entityIds); } @@ -181,6 +193,9 @@ public class PacketFactory { boolean onGround ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundTeleportEntityPacketImpl(entityId, x, y, z, yaw, pitch, onGround); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundTeleportEntityPacketImpl(entityId, x, y, z, yaw, pitch, onGround); } @@ -215,6 +230,9 @@ public class PacketFactory { float headYaw ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundRotateHeadPacketImpl(entityId, headYaw); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundRotateHeadPacketImpl(entityId, headYaw); } @@ -249,6 +267,9 @@ public class PacketFactory { List entityData ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundSetEntityDataPacketImpl(entityId, entityData); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundSetEntityDataPacketImpl(entityId, entityData); } @@ -283,6 +304,9 @@ public class PacketFactory { Map equipment ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundSetEquipmentPacketImpl(entityId, equipment); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundSetEquipmentPacketImpl(entityId, equipment); } @@ -317,6 +341,9 @@ public class PacketFactory { List passengers ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundSetPassengersPacketImpl(entityId, passengers); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundSetPassengersPacketImpl(entityId, passengers); } @@ -354,6 +381,9 @@ public class PacketFactory { FS_ClientboundCreateOrUpdateTeamPacket.CreateTeam createTeam ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, createTeam); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, createTeam); } @@ -390,6 +420,9 @@ public class PacketFactory { FS_ClientboundCreateOrUpdateTeamPacket.RemoveTeam removeTeam ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeTeam); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeTeam); } @@ -426,6 +459,9 @@ public class PacketFactory { FS_ClientboundCreateOrUpdateTeamPacket.UpdateTeam updateTeam ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, updateTeam); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, updateTeam); } @@ -462,6 +498,9 @@ public class PacketFactory { FS_ClientboundCreateOrUpdateTeamPacket.AddEntity addEntity ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, addEntity); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, addEntity); } @@ -498,6 +537,9 @@ public class PacketFactory { FS_ClientboundCreateOrUpdateTeamPacket.RemoveEntity removeEntity ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeEntity); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeEntity); } @@ -531,6 +573,9 @@ public class PacketFactory { FS_Dialog dialog ) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundShowDialogPacketImpl(dialog); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundShowDialogPacketImpl(dialog); } @@ -549,6 +594,9 @@ public class PacketFactory { */ public FS_ClientboundClearDialogPacket createClearDialogPacket() { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.packets.ClientboundClearDialogPacketImpl(); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.packets.ClientboundClearDialogPacketImpl(); } diff --git a/libraries/packets/src/main/java/de/oliver/fancysitula/factories/PacketListenerFactory.java b/libraries/packets/src/main/java/de/oliver/fancysitula/factories/PacketListenerFactory.java index 5744a164..657844f7 100644 --- a/libraries/packets/src/main/java/de/oliver/fancysitula/factories/PacketListenerFactory.java +++ b/libraries/packets/src/main/java/de/oliver/fancysitula/factories/PacketListenerFactory.java @@ -8,6 +8,9 @@ public class PacketListenerFactory { public FS_PacketListener createPacketListener(FS_ServerboundPacket.Type packet) { switch (ServerVersion.getCurrentVersion()) { + case v1_21_11 -> { + return new de.oliver.fancysitula.versions.v1_21_11.utils.PacketListenerImpl(packet); + } case v1_21_9, v1_21_10 -> { return new de.oliver.fancysitula.versions.v1_21_9.utils.PacketListenerImpl(packet); } diff --git a/settings.gradle.kts b/settings.gradle.kts index 83b5b4cb..1c69e4e9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -47,6 +47,7 @@ include(":libraries:packets:implementations:1_21_4") include(":libraries:packets:implementations:1_21_5") include(":libraries:packets:implementations:1_21_6") include(":libraries:packets:implementations:1_21_9") +include(":libraries:packets:implementations:1_21_11") include(":tools:deployment")