diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java index e899291a4..c80db2fe4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java @@ -52,7 +52,7 @@ public final class CraftEngineFurniture { public static BukkitFurniture place(Location location, Key furnitureId) { CustomFurniture furniture = byId(furnitureId); if (furniture == null) return null; - return place(location, furnitureId, furniture.getAnyPlacement()); + return place(location, furnitureId, furniture.getAnyAnchorType()); } /** diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/AbstractCanSurviveBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/AbstractCanSurviveBlockBehavior.java index 8b30ef6b3..75d0ebf53 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/AbstractCanSurviveBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/AbstractCanSurviveBlockBehavior.java @@ -65,7 +65,7 @@ public abstract class AbstractCanSurviveBlockBehavior extends BukkitBlockBehavio public void onPlace(Object thisBlock, Object[] args, Callable superMethod) throws Exception { Object world = args[1]; Object blockPos = args[2]; - CoreReflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + FastNMS.INSTANCE.method$LevelAccessor$scheduleTick(world, blockPos, thisBlock, 2); } @Override @@ -86,7 +86,7 @@ public abstract class AbstractCanSurviveBlockBehavior extends BukkitBlockBehavio return state; } if (this.delay != 0) { - CoreReflections.method$LevelAccessor$scheduleTick.invoke(level, blockPos, thisBlock, this.delay); + FastNMS.INSTANCE.method$LevelAccessor$scheduleTick(level, blockPos, thisBlock, this.delay); return state; } if (!canSurvive(thisBlock, new Object[] {state, level, blockPos}, () -> true)) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java index f04aed908..3e7cc6771 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -36,7 +36,7 @@ public class FallingBlockBehavior extends BukkitBlockBehavior { public void onPlace(Object thisBlock, Object[] args, Callable superMethod) throws Exception { Object world = args[1]; Object blockPos = args[2]; - CoreReflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + FastNMS.INSTANCE.method$LevelAccessor$scheduleTick(world, blockPos, thisBlock, 2); } @Override @@ -50,7 +50,7 @@ public class FallingBlockBehavior extends BukkitBlockBehavior { world = args[3]; blockPos = args[4]; } - CoreReflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + FastNMS.INSTANCE.method$LevelAccessor$scheduleTick(world, blockPos, thisBlock, 2); return args[0]; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java index 3be6e4894..ddf3a3c64 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LampBlockBehavior.java @@ -62,7 +62,7 @@ public class LampBlockBehavior extends BukkitBlockBehavior { boolean lit = state.get(this.litProperty); if (lit != FastNMS.INSTANCE.method$SignalGetter$hasNeighborSignal(world, blockPos)) { if (lit) { - CoreReflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 4); + FastNMS.INSTANCE.method$LevelAccessor$scheduleTick(world, blockPos, thisBlock, 4); } else { // TODO Call Event FastNMS.INSTANCE.method$LevelWriter$setBlock(world, blockPos, state.cycle(this.litProperty).customBlockState().handle(), 2); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java index 1914f43cc..29d203086 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java @@ -85,7 +85,7 @@ public class LeavesBlockBehavior extends WaterLoggedBlockBehavior { LeavesBlockBehavior behavior = optionalBehavior.get(); int distance = behavior.getDistanceAt(neighborState) + 1; if (distance != 1 || behavior.getDistance(thisState) != distance) { - CoreReflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 1); + FastNMS.INSTANCE.method$LevelAccessor$scheduleTick(world, blockPos, thisBlock, 1); } } } 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 7002c5216..78a776bb0 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 @@ -32,7 +32,7 @@ import java.util.*; public class BukkitFurniture implements Furniture { private final Key id; private final CustomFurniture furniture; - private final AnchorType anchorType; + private final CustomFurniture.Placement placement; private FurnitureExtraData extraData; // location private final Location location; @@ -61,7 +61,7 @@ public class BukkitFurniture implements Furniture { this.id = furniture.id(); this.extraData = extraData; this.baseEntityId = baseEntity.getEntityId(); - this.anchorType = extraData.anchorType().orElse(furniture.getAnyPlacement()); + this.location = baseEntity.getLocation(); this.baseEntity = new WeakReference<>(baseEntity); this.furniture = furniture; @@ -70,7 +70,7 @@ public class BukkitFurniture implements Furniture { List mainEntityIds = new IntArrayList(); mainEntityIds.add(this.baseEntityId); - CustomFurniture.Placement placement = furniture.getPlacement(anchorType); + this.placement = furniture.getValidPlacement(extraData.anchorType().orElseGet(furniture::getAnyAnchorType)); // bind external furniture Optional optionalExternal = placement.externalModel(); if (optionalExternal.isPresent()) { @@ -171,7 +171,7 @@ public class BukkitFurniture implements Furniture { @NotNull public Location dropLocation() { - Optional dropOffset = config().getPlacement(this.anchorType).dropOffset(); + Optional dropOffset = this.placement.dropOffset(); if (dropOffset.isEmpty()) { return location(); } @@ -275,7 +275,7 @@ public class BukkitFurniture implements Furniture { @Override public @NotNull AnchorType anchorType() { - return this.anchorType; + return this.placement.anchorType(); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index 2841ed4d2..c102a457c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -70,7 +70,7 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { public BukkitFurniture place(Location location, CustomFurniture furniture, FurnitureExtraData extraData, boolean playSound) { Optional optionalAnchorType = extraData.anchorType(); if (optionalAnchorType.isEmpty() || !furniture.isAllowedPlacement(optionalAnchorType.get())) { - extraData.anchorType(furniture.getAnyPlacement()); + extraData.anchorType(furniture.getAnyAnchorType()); } Entity furnitureEntity = EntityUtils.spawnEntity(location.getWorld(), location, EntityType.ITEM_DISPLAY, entity -> { ItemDisplay display = (ItemDisplay) entity; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java index fefddcf71..7e87edf34 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java @@ -165,4 +165,9 @@ public class ComponentItemWrapper implements ItemWrapper { public void count(int amount) { this.item.setAmount(Math.max(amount, 0)); } + + @Override + public void shrink(int amount) { + count(count() - amount); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java index 3bb4d5932..4615433fc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java @@ -8,18 +8,9 @@ import org.bukkit.inventory.ItemStack; public class LegacyItemWrapper implements ItemWrapper { private final RtagItem rtagItem; - private int count; - public LegacyItemWrapper(RtagItem rtagItem, int count) { + public LegacyItemWrapper(RtagItem rtagItem) { this.rtagItem = rtagItem; - this.count = count; - } - - @Override - public ItemStack getItem() { - ItemStack itemStack = this.rtagItem.getItem(); - itemStack.setAmount(this.count); - return itemStack; } public boolean setTag(Object value, Object... path) { @@ -49,12 +40,12 @@ public class LegacyItemWrapper implements ItemWrapper { } public int count() { - return this.count; + return getItem().getAmount(); } public void count(int amount) { if (amount < 0) amount = 0; - this.count = amount; + getItem().setAmount(amount); } public Object getExactTag(Object... path) { @@ -75,9 +66,12 @@ public class LegacyItemWrapper implements ItemWrapper { @Override public ItemStack load() { - ItemStack itemStack = this.rtagItem.load(); - itemStack.setAmount(Math.max(this.count, 0)); - return itemStack; + return this.rtagItem.load(); + } + + @Override + public ItemStack getItem() { + return this.rtagItem.getItem(); } @Override @@ -87,6 +81,13 @@ public class LegacyItemWrapper implements ItemWrapper { @Override public ItemWrapper copyWithCount(int count) { - return new LegacyItemWrapper(new RtagItem(this.rtagItem.loadCopy()), count); + ItemStack copied = this.rtagItem.loadCopy(); + copied.setAmount(count); + return new LegacyItemWrapper(new RtagItem(copied)); + } + + @Override + public void shrink(int amount) { + this.count(count() - amount); } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java index a30c6bb03..b38f4c65b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java @@ -11,6 +11,7 @@ public class BukkitItemBehaviors extends ItemBehaviors { public static final Key WATER_BUCKET_ITEM = Key.from("craftengine:water_bucket_item"); public static final Key BUCKET_ITEM = Key.from("craftengine:bucket_item"); public static final Key FLINT_AND_STEEL_ITEM = Key.from("craftengine:flint_and_steel_item"); + public static final Key COMPOSTABLE_ITEM = Key.from("craftengine:compostable_item"); public static void init() { register(EMPTY, EmptyItemBehavior.FACTORY); @@ -20,5 +21,6 @@ public class BukkitItemBehaviors extends ItemBehaviors { register(WATER_BUCKET_ITEM, WaterBucketItemBehavior.FACTORY); register(BUCKET_ITEM, BucketItemBehavior.FACTORY); register(FLINT_AND_STEEL_ITEM, FlintAndSteelItemBehavior.FACTORY); + register(COMPOSTABLE_ITEM, CompostableItemBehavior.FACTORY); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/CompostableItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/CompostableItemBehavior.java new file mode 100644 index 000000000..25a02d9f3 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/CompostableItemBehavior.java @@ -0,0 +1,80 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.EventUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.world.BukkitBlockInWorld; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.world.WorldEvents; +import org.bukkit.GameEvent; +import org.bukkit.World; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Levelled; +import org.bukkit.entity.Entity; +import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.util.Vector; + +import java.nio.file.Path; +import java.util.Map; + +public class CompostableItemBehavior extends ItemBehavior { + public static final Factory FACTORY = new Factory(); + private final double chance; + + public CompostableItemBehavior(double chance) { + this.chance = chance; + } + + @Override + public InteractionResult useOnBlock(UseOnContext context) { + BukkitBlockInWorld block = (BukkitBlockInWorld) context.getLevel().getBlockAt(context.getClickedPos()); + BlockData blockData = block.block().getBlockData(); + Object blockOwner = BlockStateUtils.getBlockOwner(BlockStateUtils.blockDataToBlockState(blockData)); + if (blockOwner != MBlocks.COMPOSTER) return InteractionResult.PASS; + if (!(blockData instanceof Levelled levelled)) { + return InteractionResult.PASS; + } + int maxLevel = levelled.getMaximumLevel(); + int currentLevel = levelled.getLevel(); + if (currentLevel >= maxLevel) return InteractionResult.PASS; + boolean willRaise = (currentLevel == 0) && (this.chance > 0) || (RandomUtils.generateRandomDouble(0, 1) < this.chance); + + if (willRaise) { + levelled.setLevel(currentLevel + 1); + EntityChangeBlockEvent event = new EntityChangeBlockEvent((Entity) context.getPlayer().platformPlayer(), block.block(), levelled); + if (EventUtils.fireAndCheckCancel(event)) { + return InteractionResult.FAIL; + } + block.block().setBlockData(levelled); + } + + context.getLevel().levelEvent(WorldEvents.COMPOSTER_COMPOSTS, context.getClickedPos(), willRaise ? 1 : 0); + ((World) context.getLevel().platformWorld()).sendGameEvent((Entity) context.getPlayer().platformPlayer(), GameEvent.BLOCK_CHANGE, new Vector(block.x() + 0.5, block.y() + 0.5, block.z() + 0.5)); + if (currentLevel + 1 == 7) { + FastNMS.INSTANCE.method$LevelAccessor$scheduleTick(context.getLevel().serverWorld(), LocationUtils.toBlockPos(context.getClickedPos()), blockOwner, 20); + } + if (!context.getPlayer().canInstabuild()) { + context.getItem().shrink(1); + } + context.getPlayer().swingHand(context.getHand()); + return InteractionResult.SUCCESS; + } + + public static class Factory implements ItemBehaviorFactory { + @Override + public ItemBehavior create(Pack pack, Path path, Key key, Map arguments) { + double chance = ResourceConfigUtils.getAsDouble(arguments.getOrDefault("chance", 0.55), "chance"); + return new CompostableItemBehavior(chance); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java index d5564d351..d5fd85366 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -32,7 +32,7 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected LegacyItemWrapper wrapInternal(ItemStack item) { - return new LegacyItemWrapper(new RtagItem(item), item.getAmount()); + return new LegacyItemWrapper(new RtagItem(item)); } @Override @@ -308,10 +308,10 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected LegacyItemWrapper mergeCopy(LegacyItemWrapper item1, LegacyItemWrapper item2) { Object itemStack = ItemObject.copy(item2.getLiteralObject()); - ItemObject.setCustomDataTag(itemStack, TagCompound.clone(ItemObject.getCustomDataTag(item1.getLiteralObject()))); + ItemObject.setCustomDataTag(itemStack, TagCompound.clone(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item1.getLiteralObject()))); // one more step than vanilla - TagCompound.merge(ItemObject.getCustomDataTag(itemStack), ItemObject.getCustomDataTag(item2.getLiteralObject()), true, true); - return new LegacyItemWrapper(new RtagItem(ItemObject.asCraftMirror(itemStack)), item2.count()); + TagCompound.merge(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(itemStack), FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item2.getLiteralObject()), true, true); + return new LegacyItemWrapper(new RtagItem(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(itemStack))); } @Override @@ -326,7 +326,7 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected LegacyItemWrapper transmuteCopy(LegacyItemWrapper item, Key newItem, int amount) { Object newItemStack = FastNMS.INSTANCE.constructor$ItemStack(FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ITEM, KeyUtils.toResourceLocation(newItem)), amount); - ItemObject.setCustomDataTag(newItemStack, TagCompound.clone(ItemObject.getCustomDataTag(item.getLiteralObject()))); - return new LegacyItemWrapper(new RtagItem(ItemObject.asCraftMirror(newItemStack)), amount); + ItemObject.setCustomDataTag(newItemStack, TagCompound.clone(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item.getLiteralObject()))); + return new LegacyItemWrapper(new RtagItem(ItemObject.asCraftMirror(newItemStack))); } } \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java index 2c6e0cf6f..de86d8189 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java @@ -73,7 +73,7 @@ public class DebugStickListener implements Listener { ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.empty").arguments(Component.text(blockId))), true); player.sendPacket(systemChatPacket, false); } else { - LegacyItemWrapper wrapped = new LegacyItemWrapper(new RtagItem(itemInHand), itemInHand.getAmount()); + LegacyItemWrapper wrapped = new LegacyItemWrapper(new RtagItem(itemInHand)); Object storedData = wrapped.getJavaTag("craftengine:debug_stick_state"); if (storedData == null) storedData = new HashMap<>(); if (storedData instanceof Map map) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSpawnFurnitureCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSpawnFurnitureCommand.java index 70914aa49..a6333f2d5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSpawnFurnitureCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSpawnFurnitureCommand.java @@ -54,7 +54,7 @@ public class DebugSpawnFurnitureCommand extends BukkitCommandFeature section) { if (byId.containsKey(id)) { - throw new LocalizedResourceConfigException("warning.config.furniture.duplicate", path, id); + throw new LocalizedResourceConfigException("warning.config.furniture.duplicate"); } EnumMap placements = new EnumMap<>(AnchorType.class); Map placementMap = MiscUtils.castToMap(ResourceConfigUtils.requireNonNullOrThrow(section.get("placement"), "warning.config.furniture.missing_placement"), false); + if (placementMap.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.furniture.missing_placement"); + } for (Map.Entry entry : placementMap.entrySet()) { // anchor type AnchorType anchorType = AnchorType.valueOf(entry.getKey().toUpperCase(Locale.ENGLISH)); @@ -133,6 +136,7 @@ public abstract class AbstractFurnitureManager implements FurnitureManager { Map ruleSection = MiscUtils.castToMap(placementArguments.get("rules"), true); if (ruleSection != null) { placements.put(anchorType, new CustomFurniture.Placement( + anchorType, elements.toArray(new FurnitureElement[0]), hitboxes.toArray(new HitBox[0]), ResourceConfigUtils.getOrDefault(ruleSection.get("rotation"), o -> RotationRule.valueOf(o.toString().toUpperCase(Locale.ENGLISH)), RotationRule.ANY), @@ -142,6 +146,7 @@ public abstract class AbstractFurnitureManager implements FurnitureManager { )); } else { placements.put(anchorType, new CustomFurniture.Placement( + anchorType, elements.toArray(new FurnitureElement[0]), hitboxes.toArray(new HitBox[0]), RotationRule.ANY, diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java index 5357caabb..294e58dda 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java @@ -26,12 +26,14 @@ public interface CustomFurniture { @Nullable LootTable lootTable(); - AnchorType getAnyPlacement(); + AnchorType getAnyAnchorType(); boolean isAllowedPlacement(AnchorType anchorType); Placement getPlacement(AnchorType anchorType); + Placement getValidPlacement(AnchorType anchorType); + interface Builder { Builder id(Key id); @@ -47,7 +49,8 @@ public interface CustomFurniture { CustomFurniture build(); } - record Placement(FurnitureElement[] elements, + record Placement(AnchorType anchorType, + FurnitureElement[] elements, HitBox[] hitBoxes, RotationRule rotationRule, AlignmentRule alignmentRule, diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java index a0945a5ab..be0e995d5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -439,4 +439,9 @@ public class AbstractItem, I> implements Item { public byte[] toByteArray() { return this.factory.toByteArray(this.item); } + + @Override + public void shrink(int amount) { + this.item.shrink(amount); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java index 8953777a7..adbc45d3e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java @@ -181,6 +181,8 @@ public interface Item { Item transmuteCopy(Key another, int count); + void shrink(int amount); + default Item transmuteCopy(Key another) { return transmuteCopy(another, this.count()); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java index 5383fb97c..27164ea29 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java @@ -13,4 +13,6 @@ public interface ItemWrapper { void count(int amount); ItemWrapper copyWithCount(int count); + + void shrink(int amount); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/World.java b/core/src/main/java/net/momirealms/craftengine/core/world/World.java index f49424a47..1a20bf82d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/World.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/World.java @@ -47,6 +47,8 @@ public interface World { playBlockSound(location, data.id(), data.volume(), data.pitch()); } + void levelEvent(int id, BlockPos pos, int data); + void spawnParticle(Position location, Key particle, int count, double xOffset, double yOffset, double zOffset, double speed, @Nullable ParticleData extraData, @NotNull Context context); long time(); diff --git a/gradle.properties b/gradle.properties index 743d06f81..5ead891b5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.67.9 +nms_helper_version=0.67.10 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23