From c3b49c95abf3bf2455692527643669ff31e6f6c2 Mon Sep 17 00:00:00 2001 From: Arubik <102335860+ArubikU@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:15:02 -0500 Subject: [PATCH] Removed BlockstateHitbox --- .../entity/furniture/BukkitFurniture.java | 6 - .../furniture/hitbox/BlockStateHitBox.java | 201 ------------------ .../furniture/hitbox/BukkitHitBoxTypes.java | 1 - .../core/entity/furniture/HitBoxTypes.java | 1 - 4 files changed, 209 deletions(-) delete mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/BlockStateHitBox.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java index d62099b7b..b3aa0479c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java @@ -208,12 +208,6 @@ public class BukkitFurniture implements Furniture { if (!isValid()) { return; } - // Clean up BlockStateHitBoxes before destroying the furniture - for (HitBox hitBox : this.hitBoxes.values()) { - if (hitBox instanceof net.momirealms.craftengine.bukkit.entity.furniture.hitbox.BlockStateHitBox) { - ((net.momirealms.craftengine.bukkit.entity.furniture.hitbox.BlockStateHitBox) hitBox).removePlacedBlock(); - } - } this.baseEntity().remove(); for (Collider entity : this.colliderEntities) { if (entity != null) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/BlockStateHitBox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/BlockStateHitBox.java deleted file mode 100644 index 96ec5c235..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/BlockStateHitBox.java +++ /dev/null @@ -1,201 +0,0 @@ -package net.momirealms.craftengine.bukkit.entity.furniture.hitbox; - -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Supplier; - -import org.bukkit.Material; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; -import org.joml.Quaternionf; -import org.joml.Vector3f; - -import net.momirealms.craftengine.bukkit.util.BlockStateUtils; -import net.momirealms.craftengine.core.block.BlockStateWrapper; -import net.momirealms.craftengine.core.entity.furniture.AbstractHitBox; -import net.momirealms.craftengine.core.entity.furniture.Collider; -import net.momirealms.craftengine.core.entity.furniture.HitBox; -import net.momirealms.craftengine.core.entity.furniture.HitBoxFactory; -import net.momirealms.craftengine.core.entity.furniture.HitBoxTypes; -import net.momirealms.craftengine.core.entity.furniture.Seat; -import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.LazyReference; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import net.momirealms.craftengine.core.world.World; -import net.momirealms.craftengine.core.world.WorldPosition; -import net.momirealms.craftengine.core.world.collision.AABB; - -public class BlockStateHitBox extends AbstractHitBox { - public static final Factory FACTORY = new Factory(); - - private final LazyReference lazyBlockState; - private final boolean dropContainer; - private WorldPosition placedPosition; - private BlockStateWrapper originalBlockState; - - public BlockStateHitBox(Seat[] seats, Vector3f position, LazyReference lazyBlockState, - boolean canUseOn, boolean blocksBuilding, boolean canBeHitByProjectile, boolean dropContainer) { - super(seats, position, canUseOn, blocksBuilding, canBeHitByProjectile); - this.lazyBlockState = lazyBlockState; - this.dropContainer = dropContainer; - } - - public LazyReference blockState() { - return lazyBlockState; - } - - public boolean dropContainer() { - return dropContainer; - } - - @Override - public Key type() { - return HitBoxTypes.BLOCKSTATE; - } - - @Override - public void initPacketsAndColliders(int[] entityId, WorldPosition position, Quaternionf conjugated, - BiConsumer packets, Consumer collider, - BiConsumer aabb) { - Vector3f offset = conjugated.transform(new Vector3f(position())); - World world = position.world(); - int blockX = (int) Math.floor(position.x() + offset.x); - int blockY = (int) Math.floor(position.y() + offset.y); - int blockZ = (int) Math.floor(position.z() - offset.z); - - // Store the placed position for later removal - this.placedPosition = new WorldPosition(world, blockX, blockY, blockZ); - - // Store the original block state before placing our block - try { - // Get the bukkit block data from the world - org.bukkit.World bukkitWorld = (org.bukkit.World) world.platformWorld(); - org.bukkit.block.data.BlockData blockData = bukkitWorld.getBlockAt(blockX, blockY, blockZ).getBlockData(); - this.originalBlockState = BlockStateUtils.toPackedBlockState(blockData); - } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to get original block state", e); - // Fallback to air - this.originalBlockState = CraftEngine.instance().blockManager().createPackedBlockState("minecraft:air"); - } - - // Place the block - BlockStateWrapper blockStateWrapper = lazyBlockState.get(); - if (blockStateWrapper != null) { - world.setBlockAt(blockX, blockY, blockZ, blockStateWrapper, 3); // UPDATE_ALL flags - } - - // If the block can be used on, add AABB for interaction - if (canUseItemOn()) { - aabb.accept(entityId[0], new AABB(blockX, blockY, blockZ, blockX + 1, blockY + 1, blockZ + 1)); - } - } - - @Override - public void initShapeForPlacement(double x, double y, double z, float yaw, Quaternionf conjugated, Consumer aabbs) { - if (blocksBuilding()) { - Vector3f offset = conjugated.transform(new Vector3f(position())); - int blockX = (int) Math.floor(x + offset.x); - int blockY = (int) Math.floor(y + offset.y); - int blockZ = (int) Math.floor(z - offset.z); - aabbs.accept(new AABB(blockX, blockY, blockZ, blockX + 1, blockY + 1, blockZ + 1)); - } - } - - @Override - public int[] acquireEntityIds(Supplier entityIdSupplier) { - return new int[] {entityIdSupplier.get()}; - } - - /** - * Removes the placed block and handles container drops if needed - */ - public void removePlacedBlock() { - if (placedPosition == null) return; - - World world = placedPosition.world(); - int x = (int) placedPosition.x(); - int y = (int) placedPosition.y(); - int z = (int) placedPosition.z(); - - // Drop container contents if the flag is enabled - if (dropContainer) { - dropContainerContents(world, x, y, z); - } - - // Restore the original block state - if (originalBlockState != null) { - world.setBlockAt(x, y, z, originalBlockState, 3); - } else { - // Fallback to air if no original state was stored - BlockStateWrapper airState = CraftEngine.instance().blockManager().createPackedBlockState("minecraft:air"); - if (airState != null) { - world.setBlockAt(x, y, z, airState, 3); - } - } - } - - /** - * Drops the contents of a container block - */ - private void dropContainerContents(World world, int x, int y, int z) { - try { - // Get the bukkit world and block - org.bukkit.World bukkitWorld = (org.bukkit.World) world.platformWorld(); - if (bukkitWorld == null) return; - - org.bukkit.block.Block block = bukkitWorld.getBlockAt(x, y, z); - if (block.getState() instanceof InventoryHolder inventoryHolder) { - org.bukkit.inventory.Inventory inventory = inventoryHolder.getInventory(); - org.bukkit.Location dropLocation = block.getLocation().add(0.5, 0.5, 0.5); - - // Drop all items in the inventory - for (ItemStack itemStack : inventory.getContents()) { - if (itemStack != null && itemStack.getType() != Material.AIR) { - bukkitWorld.dropItemNaturally(dropLocation, itemStack); - } - } - - // Clear the inventory - inventory.clear(); - } - } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to drop container contents for BlockStateHitBox", e); - } - } - - public static class Factory implements HitBoxFactory { - - @Override - public HitBox create(Map arguments) { - Vector3f position = net.momirealms.craftengine.core.util.MiscUtils.getAsVector3f( - arguments.getOrDefault("position", "0"), "position"); - - String blockStateString = ResourceConfigUtils.requireNonEmptyStringOrThrow( - arguments.get("block-state"), "warning.config.furniture.hitbox.blockstate.missing_block_state"); - - boolean canUseOn = ResourceConfigUtils.getAsBoolean( - arguments.getOrDefault("can-use-item-on", false), "can-use-item-on"); - boolean blocksBuilding = ResourceConfigUtils.getAsBoolean( - arguments.getOrDefault("blocks-building", true), "blocks-building"); - boolean canBeHitByProjectile = ResourceConfigUtils.getAsBoolean( - arguments.getOrDefault("can-be-hit-by-projectile", false), "can-be-hit-by-projectile"); - boolean dropContainer = ResourceConfigUtils.getAsBoolean( - arguments.getOrDefault("drop-container", true), "drop-container"); - - LazyReference lazyBlockState = LazyReference.lazyReference( - () -> CraftEngine.instance().blockManager().createPackedBlockState(blockStateString)); - - return new BlockStateHitBox( - HitBoxFactory.getSeats(arguments), - position, - lazyBlockState, - canUseOn, - blocksBuilding, - canBeHitByProjectile, - dropContainer - ); - } - } -} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/BukkitHitBoxTypes.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/BukkitHitBoxTypes.java index 0a152f5ca..dda752638 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/BukkitHitBoxTypes.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/BukkitHitBoxTypes.java @@ -11,6 +11,5 @@ public class BukkitHitBoxTypes extends HitBoxTypes { register(SHULKER, ShulkerHitBox.FACTORY); register(HAPPY_GHAST, HappyGhastHitBox.FACTORY); register(CUSTOM, CustomHitBox.FACTORY); - register(BLOCKSTATE, BlockStateHitBox.FACTORY); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java index ba595b4f7..20c2115f3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBoxTypes.java @@ -16,7 +16,6 @@ public class HitBoxTypes { public static final Key SHULKER = Key.of("minecraft:shulker"); public static final Key HAPPY_GHAST = Key.of("minecraft:happy_ghast"); public static final Key CUSTOM = Key.of("minecraft:custom"); - public static final Key BLOCKSTATE = Key.of("minecraft:blockstate"); public static void register(Key key, HitBoxFactory factory) { Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.HITBOX_FACTORY)