packets: add support for 1.21.5

This commit is contained in:
Oliver
2025-03-27 18:27:34 +01:00
parent 2b8affdcf4
commit 41e7c4bcfc
30 changed files with 966 additions and 5 deletions

View File

@@ -34,6 +34,9 @@ More packets will be added when needed / requested (contributions are welcome).
FancySitula will support the latest Minecraft version and additional older versions. The following versions are FancySitula will support the latest Minecraft version and additional older versions. The following versions are
supported: supported:
- [x] 1.21.5
- [x] 1.21.4
- [x] 1.21.2 / 1.21.3
- [x] 1.21.1 - [x] 1.21.1
- [x] 1.21 - [x] 1.21
- [x] 1.20.6 - [x] 1.20.6

View File

@@ -3,7 +3,7 @@ plugins {
} }
dependencies { dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.21.5-R0.1-SNAPSHOT")
compileOnly("de.oliver.FancyAnalytics:logger:0.0.6") compileOnly("de.oliver.FancyAnalytics:logger:0.0.6")
} }

View File

@@ -7,6 +7,7 @@ import java.util.List;
public enum ServerVersion { public enum ServerVersion {
v1_21_5("1.21.5", 770),
v1_21_4("1.21.4", 769), v1_21_4("1.21.4", 769),
v1_21_3("1.21.3", 768), v1_21_3("1.21.3", 768),
v1_21_1("1.21.1", 767), v1_21_1("1.21.1", 767),

View File

@@ -18,10 +18,11 @@ allprojects {
} }
dependencies { dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.21.5-R0.1-SNAPSHOT")
implementation(project(":libraries:packets:api")) implementation(project(":libraries:packets:api"))
implementation(project(":libraries:packets:factories")) implementation(project(":libraries:packets:factories"))
implementation(project(":libraries:packets:implementations:1_21_5"))
implementation(project(":libraries:packets:implementations:1_21_4")) implementation(project(":libraries:packets:implementations:1_21_4"))
implementation(project(":libraries:packets:implementations:1_21_3")) implementation(project(":libraries:packets:implementations:1_21_3"))
implementation(project(":libraries:packets:implementations:1_20_6")) implementation(project(":libraries:packets:implementations:1_20_6"))

View File

@@ -3,11 +3,12 @@ plugins {
} }
dependencies { dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.21.5-R0.1-SNAPSHOT")
compileOnly(project(":libraries:packets:api")) compileOnly(project(":libraries:packets:api"))
compileOnly(project(":libraries:packets:implementations:1_20_6")) compileOnly(project(":libraries:packets:implementations:1_20_6"))
compileOnly(project(":libraries:packets:implementations:1_21_3")) compileOnly(project(":libraries:packets:implementations:1_21_3"))
compileOnly(project(":libraries:packets:implementations:1_21_4")) compileOnly(project(":libraries:packets:implementations:1_21_4"))
compileOnly(project(":libraries:packets:implementations:1_21_5"))
} }
tasks { tasks {

View File

@@ -26,6 +26,9 @@ public class PacketFactory {
ServerVersion serverVersion, EnumSet<FS_ClientboundPlayerInfoUpdatePacket.Action> actions, ServerVersion serverVersion, EnumSet<FS_ClientboundPlayerInfoUpdatePacket.Action> actions,
List<FS_ClientboundPlayerInfoUpdatePacket.Entry> entries) { List<FS_ClientboundPlayerInfoUpdatePacket.Entry> entries) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundPlayerInfoUpdatePacketImpl(actions, entries);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundPlayerInfoUpdatePacketImpl(actions, entries); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundPlayerInfoUpdatePacketImpl(actions, entries);
} }
@@ -74,6 +77,9 @@ public class PacketFactory {
int velocityZ, int velocityZ,
int data) { int data) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundAddEntityPacketImpl(entityId, entityUUID, entityType, x, y, z, yaw, pitch, headYaw, velocityX, velocityY, velocityZ, data);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundAddEntityPacketImpl(entityId, entityUUID, entityType, x, y, z, yaw, pitch, headYaw, velocityX, velocityY, velocityZ, data); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundAddEntityPacketImpl(entityId, entityUUID, entityType, x, y, z, yaw, pitch, headYaw, velocityX, velocityY, velocityZ, data);
} }
@@ -118,6 +124,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundPlayerInfoRemovePacket createPlayerInfoRemovePacket(ServerVersion serverVersion, List<UUID> uuids) { public FS_ClientboundPlayerInfoRemovePacket createPlayerInfoRemovePacket(ServerVersion serverVersion, List<UUID> uuids) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundPlayerInfoRemovePacketImpl(uuids);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundPlayerInfoRemovePacketImpl(uuids); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundPlayerInfoRemovePacketImpl(uuids);
} }
@@ -165,6 +174,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundRemoveEntitiesPacket createRemoveEntitiesPacket(ServerVersion serverVersion, List<Integer> entityIds) { public FS_ClientboundRemoveEntitiesPacket createRemoveEntitiesPacket(ServerVersion serverVersion, List<Integer> entityIds) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundRemoveEntitiesPacketImpl(entityIds);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundRemoveEntitiesPacketImpl(entityIds); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundRemoveEntitiesPacketImpl(entityIds);
} }
@@ -209,6 +221,9 @@ public class PacketFactory {
boolean onGround boolean onGround
) { ) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundTeleportEntityPacketImpl(entityId, x, y, z, yaw, pitch, onGround);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundTeleportEntityPacketImpl(entityId, x, y, z, yaw, pitch, onGround); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundTeleportEntityPacketImpl(entityId, x, y, z, yaw, pitch, onGround);
} }
@@ -253,6 +268,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundRotateHeadPacket createRotateHeadPacket(ServerVersion serverVersion, int entityId, float headYaw) { public FS_ClientboundRotateHeadPacket createRotateHeadPacket(ServerVersion serverVersion, int entityId, float headYaw) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundRotateHeadPacketImpl(entityId, headYaw);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundRotateHeadPacketImpl(entityId, headYaw); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundRotateHeadPacketImpl(entityId, headYaw);
} }
@@ -285,6 +303,9 @@ public class PacketFactory {
public FS_ClientboundSetEntityDataPacket createSetEntityDataPacket( public FS_ClientboundSetEntityDataPacket createSetEntityDataPacket(
ServerVersion serverVersion, int entityId, List<FS_ClientboundSetEntityDataPacket.EntityData> entityData) { ServerVersion serverVersion, int entityId, List<FS_ClientboundSetEntityDataPacket.EntityData> entityData) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundSetEntityDataPacketImpl(entityId, entityData);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundSetEntityDataPacketImpl(entityId, entityData); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundSetEntityDataPacketImpl(entityId, entityData);
} }
@@ -316,6 +337,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundSetEquipmentPacket createSetEquipmentPacket(ServerVersion serverVersion, int entityId, Map<FS_EquipmentSlot, ItemStack> equipment) { public FS_ClientboundSetEquipmentPacket createSetEquipmentPacket(ServerVersion serverVersion, int entityId, Map<FS_EquipmentSlot, ItemStack> equipment) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundSetEquipmentPacketImpl(entityId, equipment);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundSetEquipmentPacketImpl(entityId, equipment); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundSetEquipmentPacketImpl(entityId, equipment);
} }
@@ -348,6 +372,9 @@ public class PacketFactory {
public FS_ClientboundSetPassengersPacket createSetPassengersPacket( public FS_ClientboundSetPassengersPacket createSetPassengersPacket(
ServerVersion serverVersion, int entityId, List<Integer> passengers) { ServerVersion serverVersion, int entityId, List<Integer> passengers) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundSetPassengersPacketImpl(entityId, passengers);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundSetPassengersPacketImpl(entityId, passengers); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundSetPassengersPacketImpl(entityId, passengers);
} }
@@ -383,6 +410,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.CreateTeam createTeam) { public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.CreateTeam createTeam) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, createTeam);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, createTeam); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, createTeam);
} }
@@ -418,6 +448,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.RemoveTeam removeTeam) { public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.RemoveTeam removeTeam) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeTeam);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeTeam); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeTeam);
} }
@@ -453,6 +486,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.UpdateTeam updateTeam) { public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.UpdateTeam updateTeam) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, updateTeam);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, updateTeam); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, updateTeam);
} }
@@ -488,6 +524,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.AddEntity addEntity) { public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.AddEntity addEntity) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, addEntity);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, addEntity); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, addEntity);
} }
@@ -523,6 +562,9 @@ public class PacketFactory {
*/ */
public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.RemoveEntity removeEntity) { public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.RemoveEntity removeEntity) {
switch (serverVersion) { switch (serverVersion) {
case v1_21_5 -> {
return new de.oliver.fancysitula.versions.v1_21_5.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeEntity);
}
case v1_21_4 -> { case v1_21_4 -> {
return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeEntity); return new de.oliver.fancysitula.versions.v1_21_4.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeEntity);
} }

View File

@@ -0,0 +1,22 @@
plugins {
id("java-library")
id("io.papermc.paperweight.userdev")
}
paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.MOJANG_PRODUCTION
dependencies {
paperweight.paperDevBundle("1.21.5-no-moonrise-SNAPSHOT")
compileOnly(project(":libraries:packets:api"))
testImplementation(project(":libraries:packets:api"))
testImplementation("org.junit.jupiter:junit-jupiter-api:5.12.1")
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.12.1")
testImplementation("org.junit.platform:junit-platform-console-standalone:1.12.1")
}
tasks {
test {
useJUnitPlatform()
}
}

View File

@@ -0,0 +1,48 @@
package de.oliver.fancysitula.versions.v1_21_5.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_5.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);
}
}

View File

@@ -0,0 +1,128 @@
package de.oliver.fancysitula.versions.v1_21_5.packets;
import de.oliver.fancysitula.api.entities.FS_RealPlayer;
import de.oliver.fancysitula.api.packets.FS_ClientboundCreateOrUpdateTeamPacket;
import de.oliver.fancysitula.versions.v1_21_5.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);
}
}

View File

@@ -0,0 +1,30 @@
package de.oliver.fancysitula.versions.v1_21_5.packets;
import de.oliver.fancysitula.api.entities.FS_RealPlayer;
import de.oliver.fancysitula.api.packets.FS_ClientboundPlayerInfoRemovePacket;
import de.oliver.fancysitula.versions.v1_21_5.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<UUID> 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);
}
}

View File

@@ -0,0 +1,54 @@
package de.oliver.fancysitula.versions.v1_21_5.packets;
import de.oliver.fancysitula.api.entities.FS_RealPlayer;
import de.oliver.fancysitula.api.packets.FS_ClientboundPlayerInfoUpdatePacket;
import de.oliver.fancysitula.versions.v1_21_5.utils.GameProfileImpl;
import de.oliver.fancysitula.versions.v1_21_5.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<Action> actions, List<Entry> entries) {
super(actions, entries);
}
@Override
public Object createPacket() {
EnumSet<ClientboundPlayerInfoUpdatePacket.Action> vanillaActions = EnumSet.noneOf(ClientboundPlayerInfoUpdatePacket.Action.class);
for (FS_ClientboundPlayerInfoUpdatePacket.Action action : actions) {
vanillaActions.add(ClientboundPlayerInfoUpdatePacket.Action.valueOf(action.name()));
}
List<ClientboundPlayerInfoUpdatePacket.Entry> 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);
}
}

View File

@@ -0,0 +1,37 @@
package de.oliver.fancysitula.versions.v1_21_5.packets;
import de.oliver.fancysitula.api.entities.FS_RealPlayer;
import de.oliver.fancysitula.api.packets.FS_ClientboundRemoveEntitiesPacket;
import de.oliver.fancysitula.versions.v1_21_5.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<Integer> 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);
}
}

View File

@@ -0,0 +1,38 @@
package de.oliver.fancysitula.versions.v1_21_5.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_5.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);
}
}

View File

@@ -0,0 +1,67 @@
package de.oliver.fancysitula.versions.v1_21_5.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_5.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> entityData) {
super(entityId, entityData);
}
@Override
public Object createPacket() {
List<SynchedEntityData.DataValue<?>> dataValues = new ArrayList<>();
for (EntityData data : entityData) {
try {
Class<?> entityClass = Class.forName(data.getAccessor().entityClassName());
net.minecraft.network.syncher.EntityDataAccessor<Object> 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);
}
}

View File

@@ -0,0 +1,45 @@
package de.oliver.fancysitula.versions.v1_21_5.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_5.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<FS_EquipmentSlot, ItemStack> equipment) {
super(entityId, equipment);
}
@Override
public Object createPacket() {
List<Pair<net.minecraft.world.entity.EquipmentSlot, net.minecraft.world.item.ItemStack>> slots = new ArrayList<>();
for (Map.Entry<FS_EquipmentSlot, ItemStack> 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);
}
}

View File

@@ -0,0 +1,45 @@
package de.oliver.fancysitula.versions.v1_21_5.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_5.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<Integer> 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);
}
}

View File

@@ -0,0 +1,43 @@
package de.oliver.fancysitula.versions.v1_21_5.packets;
import de.oliver.fancysitula.api.entities.FS_RealPlayer;
import de.oliver.fancysitula.api.packets.FS_ClientboundTeleportEntityPacket;
import de.oliver.fancysitula.versions.v1_21_5.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);
}
}

View File

@@ -0,0 +1,33 @@
package de.oliver.fancysitula.versions.v1_21_5.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<String, FS_GameProfile.Property> entry : gameProfile.getProperties().entrySet()) {
FS_GameProfile.Property property = entry.getValue();
gf.getProperties().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.getId(), gameProfile.getName());
for (Map.Entry<String, com.mojang.authlib.properties.Property> entry : gameProfile.getProperties().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;
}
}

View File

@@ -0,0 +1,12 @@
package de.oliver.fancysitula.versions.v1_21_5.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();
}
}

View File

@@ -0,0 +1,65 @@
package de.oliver.fancysitula.versions.v1_21_4.packets;
import de.oliver.fancysitula.api.utils.AngelConverter;
import de.oliver.fancysitula.versions.v1_21_5.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.getXa() == velocityX;
assert createdPacket.getYa() == velocityY;
assert createdPacket.getZa() == velocityZ;
assert createdPacket.getData() == data;
}
}

View File

@@ -0,0 +1,23 @@
package de.oliver.fancysitula.versions.v1_21_4.packets;
import de.oliver.fancysitula.versions.v1_21_5.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<UUID> 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);
}
}
}

View File

@@ -0,0 +1,62 @@
package de.oliver.fancysitula.versions.v1_21_4.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_5.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<FS_ClientboundPlayerInfoUpdatePacket.Action> 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<FS_ClientboundPlayerInfoUpdatePacket.Entry> 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().getId().equals(gameProfile.getUUID());
assert entry.profile().getName().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);
}
}

View File

@@ -0,0 +1,21 @@
package de.oliver.fancysitula.versions.v1_21_4.packets;
import de.oliver.fancysitula.versions.v1_21_5.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<Integer> 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);
}
}

View File

@@ -0,0 +1,21 @@
package de.oliver.fancysitula.versions.v1_21_4.packets;
import de.oliver.fancysitula.api.utils.reflections.ReflectionUtils;
import de.oliver.fancysitula.versions.v1_21_5.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;
}
}

View File

@@ -0,0 +1,29 @@
package de.oliver.fancysitula.versions.v1_21_4.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_5.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<FS_ClientboundSetEntityDataPacket.EntityData> 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;
}
}

View File

@@ -0,0 +1,29 @@
package de.oliver.fancysitula.versions.v1_21_4.packets;
import de.oliver.fancysitula.api.utils.FS_EquipmentSlot;
import de.oliver.fancysitula.versions.v1_21_5.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<FS_EquipmentSlot, ItemStack> 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;
}
}

View File

@@ -0,0 +1,29 @@
package de.oliver.fancysitula.versions.v1_21_4.packets;
import de.oliver.fancysitula.versions.v1_21_5.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<Integer> 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;
}
}

View File

@@ -0,0 +1,31 @@
package de.oliver.fancysitula.versions.v1_21_4.packets;
import de.oliver.fancysitula.versions.v1_21_5.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;
}
}

View File

@@ -17,7 +17,7 @@ repositories {
} }
dependencies { dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.21.5-R0.1-SNAPSHOT")
implementation(project(":libraries:packets:api")) implementation(project(":libraries:packets:api"))
implementation(project(":libraries:packets:factories")) implementation(project(":libraries:packets:factories"))
@@ -39,7 +39,7 @@ paper {
tasks { tasks {
runServer { runServer {
minecraftVersion("1.21.4") minecraftVersion("1.21.5")
} }
shadowJar { shadowJar {

View File

@@ -21,6 +21,7 @@ include(":libraries:packets:implementations:1_21")
include(":libraries:packets:implementations:1_21_1") include(":libraries:packets:implementations:1_21_1")
include(":libraries:packets:implementations:1_21_3") include(":libraries:packets:implementations:1_21_3")
include(":libraries:packets:implementations:1_21_4") include(":libraries:packets:implementations:1_21_4")
include(":libraries:packets:implementations:1_21_5")
include(":libraries:packets:test_plugin") include(":libraries:packets:test_plugin")