From b9cef8f567622d8720bcd9c01bc1b9d9b2adbb1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Thu, 19 Dec 2024 00:34:23 +0100 Subject: [PATCH] added block rotation --- .../pixelblock/PixelBlockWorld.java | 13 ++++--- .../pixelblocks/pixelblock/Pixels.java | 34 ++++++++++++++++++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlockWorld.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlockWorld.java index 4521494..0e71cc4 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlockWorld.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlockWorld.java @@ -5,11 +5,13 @@ import eu.mhsl.minecraft.pixelblocks.utils.Direction; import eu.mhsl.minecraft.pixelblocks.utils.LocationUtil; import org.bukkit.*; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Directional; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.generator.ChunkGenerator; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.ArrayList; @@ -90,7 +92,7 @@ public class PixelBlockWorld { return getBorderOrigin().add(worldGrassBorderWidth + pixelsPerBlock, 0, worldGrassBorderWidth + pixelsPerBlock); } - public record PixelData(Vector relativeLocation, BlockData block, double scale) { + public record PixelData(Vector relativeLocation, BlockData block, @Nullable Directional directional, double scale) { } public List getPixels(Direction direction) { @@ -112,10 +114,13 @@ public class PixelBlockWorld { case west -> blockLocation.add(relativeLocation.z(), relativeLocation.y(), (pixelsPerBlock - 1) - relativeLocation.x()); } - BlockData block = blockLocation.getBlock().getBlockData(); + BlockData blockData = blockLocation.getBlock().getBlockData(); + @Nullable Directional directional = blockData instanceof Directional face ? face : null; - if(!block.getMaterial().isEmpty()) { - pixelData.add(new PixelData(relativeLocation.toVector(), block, (double) 1 / pixelsPerBlock)); + if(directional != null) System.out.println(directional); + + if(!blockData.getMaterial().isEmpty()) { + pixelData.add(new PixelData(relativeLocation.toVector(), blockData, directional, (double) 1 / pixelsPerBlock)); } } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/Pixels.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/Pixels.java index 32d6501..14039be 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/Pixels.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/Pixels.java @@ -4,12 +4,17 @@ import eu.mhsl.minecraft.pixelblocks.Main; import eu.mhsl.minecraft.pixelblocks.utils.ListUtil; import org.bukkit.Location; import org.bukkit.NamespacedKey; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Directional; import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.persistence.PersistentDataType; import org.bukkit.util.Transformation; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import java.util.List; import java.util.Objects; @@ -34,12 +39,20 @@ public class Pixels { private void spawnPixel(PixelBlockWorld.PixelData pixelData) { Location pixelBlockLocation = this.parentBlock.getPixelBlockLocation(); Location pixelLocation = pixelBlockLocation.add(pixelData.relativeLocation().multiply(pixelData.scale())); - BlockDisplay entity = (BlockDisplay) pixelBlockLocation.getWorld().spawnEntity(pixelLocation, EntityType.BLOCK_DISPLAY); + Vector3d centerOffset = new Vector3d(0.5, 0.5, 0.5).mul(pixelData.scale()); + BlockDisplay entity = (BlockDisplay) pixelBlockLocation.getWorld().spawnEntity( + pixelLocation.add(Vector.fromJOML(centerOffset)), + EntityType.BLOCK_DISPLAY + ); entity.setBlock(pixelData.block()); + this.setEntityRotation(entity, pixelData.directional()); + Transformation transform = entity.getTransformation(); transform.getScale().set(pixelData.scale()); + transform.getTranslation().set(centerOffset.mul(-1)); entity.setTransformation(transform); + entity.getPersistentDataContainer().set(pixelOfTag, PersistentDataType.STRING, this.parentBlock.getBlockUUID().toString()); } @@ -59,4 +72,23 @@ public class Pixels { .sync(() -> pixels.forEach(Entity::remove)) .execute()); } + + private void setEntityRotation(Entity entity, @Nullable Directional direction) { + if(direction == null) return; + BlockFace blockFace = direction.getFacing(); + float yaw = switch (blockFace) { + case NORTH -> 0; + case SOUTH -> 180; + case WEST -> -90; + case EAST -> 90; + default -> entity.getLocation().getYaw(); + }; + + float pitch = switch (blockFace) { + case UP -> -90; + case DOWN -> 90; + default -> 0; + }; + entity.setRotation(yaw, pitch); + } }