From 8a7351205258be3ac7c05c740486db1861c07377 Mon Sep 17 00:00:00 2001 From: OliverSchlueter Date: Sat, 3 Aug 2024 12:46:05 +0200 Subject: [PATCH] Add FS_BlockDisplay --- .../api/entities/FS_BlockDisplay.java | 31 +++++++++++++++++++ .../utils/entityData/FS_BlockDisplayData.java | 12 +++++++ .../ClientboundSetEntityDataPacketImpl.java | 6 ++++ .../fancysitula/commands/FancySitulaCMD.java | 22 ++++++++----- 4 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 api/src/main/java/de/oliver/fancysitula/api/entities/FS_BlockDisplay.java create mode 100644 api/src/main/java/de/oliver/fancysitula/api/utils/entityData/FS_BlockDisplayData.java diff --git a/api/src/main/java/de/oliver/fancysitula/api/entities/FS_BlockDisplay.java b/api/src/main/java/de/oliver/fancysitula/api/entities/FS_BlockDisplay.java new file mode 100644 index 0000000..9f139f4 --- /dev/null +++ b/api/src/main/java/de/oliver/fancysitula/api/entities/FS_BlockDisplay.java @@ -0,0 +1,31 @@ +package de.oliver.fancysitula.api.entities; + +import de.oliver.fancysitula.api.packets.FS_ClientboundSetEntityDataPacket; +import de.oliver.fancysitula.api.utils.entityData.FS_BlockDisplayData; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class FS_BlockDisplay extends FS_Display { + + protected FS_ClientboundSetEntityDataPacket.EntityData blockData = new FS_ClientboundSetEntityDataPacket.EntityData(FS_BlockDisplayData.BLOCK, null); + + public FS_BlockDisplay() { + super(EntityType.BLOCK_DISPLAY); + } + + public org.bukkit.block.BlockState getBlock() { + return (org.bukkit.block.BlockState) this.blockData.getValue(); + } + + public void setBlock(org.bukkit.block.BlockState block) { + this.blockData.setValue(block); + } + + @Override + public List getEntityData() { + List entityData = super.getEntityData(); + entityData.add(this.blockData); + return entityData; + } +} diff --git a/api/src/main/java/de/oliver/fancysitula/api/utils/entityData/FS_BlockDisplayData.java b/api/src/main/java/de/oliver/fancysitula/api/utils/entityData/FS_BlockDisplayData.java new file mode 100644 index 0000000..50a5c74 --- /dev/null +++ b/api/src/main/java/de/oliver/fancysitula/api/utils/entityData/FS_BlockDisplayData.java @@ -0,0 +1,12 @@ +package de.oliver.fancysitula.api.utils.entityData; + +import de.oliver.fancysitula.api.packets.FS_ClientboundSetEntityDataPacket; + +public class FS_BlockDisplayData { + + /** + * Use {@link org.bukkit.block.Block} as value + */ + public static final FS_ClientboundSetEntityDataPacket.EntityDataAccessor BLOCK = new FS_ClientboundSetEntityDataPacket.EntityDataAccessor("net.minecraft.world.entity.Display$BlockDisplay", "DATA_BLOCK_STATE_ID"); + +} diff --git a/implementations/1_20_6/src/main/java/de/oliver/fancysitula/versions/v1_20_6/packets/ClientboundSetEntityDataPacketImpl.java b/implementations/1_20_6/src/main/java/de/oliver/fancysitula/versions/v1_20_6/packets/ClientboundSetEntityDataPacketImpl.java index 5f125ed..f9c6d0e 100644 --- a/implementations/1_20_6/src/main/java/de/oliver/fancysitula/versions/v1_20_6/packets/ClientboundSetEntityDataPacketImpl.java +++ b/implementations/1_20_6/src/main/java/de/oliver/fancysitula/versions/v1_20_6/packets/ClientboundSetEntityDataPacketImpl.java @@ -9,6 +9,8 @@ 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; @@ -42,6 +44,10 @@ public Object createPacket() { 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(); diff --git a/test_plugin/src/main/java/de/oliver/fancysitula/commands/FancySitulaCMD.java b/test_plugin/src/main/java/de/oliver/fancysitula/commands/FancySitulaCMD.java index a215a2c..d3e566b 100644 --- a/test_plugin/src/main/java/de/oliver/fancysitula/commands/FancySitulaCMD.java +++ b/test_plugin/src/main/java/de/oliver/fancysitula/commands/FancySitulaCMD.java @@ -1,12 +1,13 @@ package de.oliver.fancysitula.commands; -import de.oliver.fancysitula.api.entities.FS_ItemDisplay; +import de.oliver.fancysitula.api.entities.FS_BlockDisplay; import de.oliver.fancysitula.api.entities.FS_RealPlayer; 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.factories.FancySitula; import net.kyori.adventure.text.Component; +import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -41,12 +42,19 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String s, @NotNul // fakeTextDisplay.setBackground(0xFF00C8FF); // FancySitula.ENTITY_FACTORY.spawnEntityFor(fsPlayer, fakeTextDisplay); - FS_ItemDisplay fakeItemDisplay = new FS_ItemDisplay(); - fakeItemDisplay.setBillboardRenderConstraints((byte) 3); - fakeItemDisplay.setScale(new Vector3f(5f)); - fakeItemDisplay.setLocation(p.getLocation()); - fakeItemDisplay.setItem(p.getInventory().getItemInMainHand()); - FancySitula.ENTITY_FACTORY.spawnEntityFor(fsPlayer, fakeItemDisplay); +// FS_ItemDisplay fakeItemDisplay = new FS_ItemDisplay(); +// fakeItemDisplay.setBillboardRenderConstraints((byte) 3); +// fakeItemDisplay.setScale(new Vector3f(5f)); +// fakeItemDisplay.setLocation(p.getLocation()); +// fakeItemDisplay.setItem(p.getInventory().getItemInMainHand()); +// FancySitula.ENTITY_FACTORY.spawnEntityFor(fsPlayer, fakeItemDisplay); + + FS_BlockDisplay fakeBlockDisplay = new FS_BlockDisplay(); + fakeBlockDisplay.setBillboardRenderConstraints((byte) 3); + fakeBlockDisplay.setScale(new Vector3f(5f)); + fakeBlockDisplay.setLocation(p.getLocation()); + fakeBlockDisplay.setBlock(Material.DIAMOND_BLOCK.createBlockData().createBlockState()); + FancySitula.ENTITY_FACTORY.spawnEntityFor(fsPlayer, fakeBlockDisplay); return true; }