9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-26 18:39:20 +00:00

Removed BlockstateHitbox

This commit is contained in:
Arubik
2025-07-03 12:15:02 -05:00
parent 5820df9208
commit c3b49c95ab
4 changed files with 0 additions and 209 deletions

View File

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

View File

@@ -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<BlockStateWrapper> lazyBlockState;
private final boolean dropContainer;
private WorldPosition placedPosition;
private BlockStateWrapper originalBlockState;
public BlockStateHitBox(Seat[] seats, Vector3f position, LazyReference<BlockStateWrapper> lazyBlockState,
boolean canUseOn, boolean blocksBuilding, boolean canBeHitByProjectile, boolean dropContainer) {
super(seats, position, canUseOn, blocksBuilding, canBeHitByProjectile);
this.lazyBlockState = lazyBlockState;
this.dropContainer = dropContainer;
}
public LazyReference<BlockStateWrapper> 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<Object, Boolean> packets, Consumer<Collider> collider,
BiConsumer<Integer, AABB> 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<AABB> 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<Integer> 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<String, Object> 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<BlockStateWrapper> lazyBlockState = LazyReference.lazyReference(
() -> CraftEngine.instance().blockManager().createPackedBlockState(blockStateString));
return new BlockStateHitBox(
HitBoxFactory.getSeats(arguments),
position,
lazyBlockState,
canUseOn,
blocksBuilding,
canBeHitByProjectile,
dropContainer
);
}
}
}

View File

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

View File

@@ -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<HitBoxFactory> holder = ((WritableRegistry<HitBoxFactory>) BuiltInRegistries.HITBOX_FACTORY)