packets: Add support for 1.21.11

This commit is contained in:
Oliver
2025-11-07 13:25:18 +01:00
committed by Oliver
parent fb2beeb5b2
commit 7d5b86fd14
31 changed files with 1390 additions and 0 deletions

View File

@@ -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"))

View File

@@ -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()
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<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_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<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_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<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_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);
}
}

View File

@@ -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> 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_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<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_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<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,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<Dialog> 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<Holder<Dialog>> dialogs = new ArrayList<>();
for (FS_Dialog dialog : dialogList.getDialogs()) {
dialogs.add(Holder.direct(toNms(dialog)));
}
HolderSet<Dialog> dialogSet = HolderSet.direct(dialogs);
Optional<ActionButton> 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<ActionButton> actionButtons = new ArrayList<>();
for (FS_DialogActionButton actionButton : multiActionDialog.getActions()) {
actionButtons.add(actionButtonToNms(actionButton));
}
Optional<ActionButton> 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<Component> 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<DialogBody> bodyToNms(List<FS_DialogBody> bodies) {
List<DialogBody> 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<PlainMessage> 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<Input> inputsToNms(List<FS_DialogInput> inputs) {
List<Input> 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<SingleOptionInput.Entry> 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<CompoundTag> 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<Action> 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<Component> 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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<String, FS_GameProfile.Property> 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<String, com.mojang.authlib.properties.Property> 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;
}
}

View File

@@ -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<Packet<?>>() {
@Override
protected void decode(ChannelHandlerContext ctx, Packet<?> msg, List<Object> 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<String, String> 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);
}
}
}

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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<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_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<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().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);
}
}

View File

@@ -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<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_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;
}
}

View File

@@ -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<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_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<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_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<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_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;
}
}

View File

@@ -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),

View File

@@ -28,6 +28,9 @@ public class PacketFactory {
List<FS_ClientboundPlayerInfoUpdatePacket.Entry> 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<UUID> 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<Integer> 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<FS_ClientboundSetEntityDataPacket.EntityData> 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<FS_EquipmentSlot, ItemStack> 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<Integer> 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();
}

View File

@@ -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);
}