9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 01:49:30 +00:00

feat(block): 让简单存储方块支持被漏斗交互

This commit is contained in:
jhqwqmc
2025-09-13 11:47:11 +08:00
parent 7d567dca54
commit 5eb899f8d3
7 changed files with 55 additions and 10 deletions

View File

@@ -42,6 +42,8 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E
private final SoundData openSound;
private final SoundData closeSound;
private final boolean hasAnalogOutputSignal;
private final boolean canPlaceItem;
private final boolean canTakeItem;
@Nullable
private final Property<Boolean> openProperty;
@@ -51,6 +53,8 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E
SoundData openSound,
SoundData closeSound,
boolean hasAnalogOutputSignal,
boolean canPlaceItem,
boolean canTakeItem,
@Nullable Property<Boolean> openProperty) {
super(customBlock);
this.containerTitle = containerTitle;
@@ -58,6 +62,8 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E
this.openSound = openSound;
this.closeSound = closeSound;
this.hasAnalogOutputSignal = hasAnalogOutputSignal;
this.canPlaceItem = canPlaceItem;
this.canTakeItem = canTakeItem;
this.openProperty = openProperty;
}
@@ -129,6 +135,14 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E
return this.rows;
}
public boolean canPlaceItem() {
return this.canPlaceItem;
}
public boolean canTakeItem() {
return this.canTakeItem;
}
public @Nullable Property<Boolean> openProperty() {
return openProperty;
}
@@ -164,6 +178,17 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E
return this.hasAnalogOutputSignal;
}
@Override
public Object getContainer(Object thisBlock, Object[] args) {
CEWorld ceWorld = BukkitWorldManager.instance().getWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(args[1]));
BlockPos blockPos = LocationUtils.fromBlockPos(args[2]);
BlockEntity blockEntity = ceWorld.getBlockEntityAtIfLoaded(blockPos);
if (blockEntity instanceof SimpleStorageBlockEntity entity) {
return FastNMS.INSTANCE.method$CraftInventory$getInventory(entity.inventory());
}
return null;
}
public static class Factory implements BlockBehaviorFactory {
@SuppressWarnings("unchecked")
@@ -179,8 +204,15 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E
openSound = Optional.ofNullable(sounds.get("open")).map(obj -> SoundData.create(obj, SoundData.SoundValue.FIXED_0_5, SoundData.SoundValue.ranged(0.9f, 1f))).orElse(null);
closeSound = Optional.ofNullable(sounds.get("close")).map(obj -> SoundData.create(obj, SoundData.SoundValue.FIXED_0_5, SoundData.SoundValue.ranged(0.9f, 1f))).orElse(null);
}
Map<String, Object> hopperBehavior = (Map<String, Object>) arguments.get("hopper-behavior");
boolean canPlaceItem = true;
boolean canTakeItem = true;
if (hopperBehavior != null) {
canPlaceItem = ResourceConfigUtils.getAsBoolean(hopperBehavior.getOrDefault("can-place-item", true), "can-place-item");
canTakeItem = ResourceConfigUtils.getAsBoolean(hopperBehavior.getOrDefault("can-take-item", true), "can-take-item");
}
Property<Boolean> property = (Property<Boolean>) block.getProperty("open");
return new SimpleStorageBlockBehavior(block, title, rows, openSound, closeSound, hasAnalogOutputSignal, property);
return new SimpleStorageBlockBehavior(block, title, rows, openSound, closeSound, hasAnalogOutputSignal, canPlaceItem, canTakeItem, property);
}
}
}

View File

@@ -20,7 +20,6 @@ import net.momirealms.craftengine.core.world.BlockPos;
import net.momirealms.craftengine.core.world.Vec3d;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag;
import org.bukkit.Bukkit;
import org.bukkit.GameEvent;
import org.bukkit.GameMode;
import org.bukkit.entity.HumanEntity;
@@ -42,7 +41,8 @@ public class SimpleStorageBlockEntity extends BlockEntity {
super(BukkitBlockEntityTypes.SIMPLE_STORAGE, pos, blockState);
this.behavior = super.blockState.behavior().getAs(SimpleStorageBlockBehavior.class).orElseThrow();
BlockEntityHolder holder = new BlockEntityHolder(this);
this.inventory = Bukkit.createInventory(holder, this.behavior.rows() * 9);
this.inventory = FastNMS.INSTANCE.createCraftEngineWorldlyContainer(holder, this.behavior.rows() * 9, this.behavior.canPlaceItem(), this.behavior.canTakeItem());
holder.setInventory(this.inventory);
}
@Override

View File

@@ -98,7 +98,9 @@ public class BukkitGuiManager implements GuiManager, Listener {
@EventHandler(ignoreCancelled = true)
public void onInventoryClick(InventoryClickEvent event) {
org.bukkit.inventory.Inventory inventory = event.getInventory();
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory))) {
Object container = FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory);
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(container)
|| !container.getClass().getSimpleName().equals("CraftEngineWorldlyContainer")) {
return;
}
if (!(inventory.getHolder() instanceof CraftEngineGUIHolder craftEngineGUIHolder)) {
@@ -116,7 +118,9 @@ public class BukkitGuiManager implements GuiManager, Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOW)
public void onInventoryDrag(InventoryDragEvent event) {
org.bukkit.inventory.Inventory inventory = event.getInventory();
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory))) {
Object container = FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory);
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(container)
|| !container.getClass().getSimpleName().equals("CraftEngineWorldlyContainer")) {
return;
}
if (!(inventory.getHolder() instanceof CraftEngineGUIHolder)) {
@@ -134,7 +138,9 @@ public class BukkitGuiManager implements GuiManager, Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOW)
public void onInventoryClose(InventoryCloseEvent event) {
org.bukkit.inventory.Inventory inventory = event.getInventory();
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory))) {
Object container = FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory);
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(container)
|| !container.getClass().getSimpleName().equals("CraftEngineWorldlyContainer")) {
return;
}
if (!(inventory.getHolder() instanceof BlockEntityHolder holder)) {
@@ -149,7 +155,9 @@ public class BukkitGuiManager implements GuiManager, Listener {
public void onInventoryClose(PlayerQuitEvent event) {
Player player = event.getPlayer();
org.bukkit.inventory.Inventory inventory = player.getInventory();
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory))) {
Object container = FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory);
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(container)
|| !container.getClass().getSimpleName().equals("CraftEngineWorldlyContainer")) {
return;
}
if (!(inventory.getHolder() instanceof BlockEntityHolder holder)) {

View File

@@ -497,7 +497,9 @@ public class BukkitServerPlayer extends Player {
private void updateGUI() {
org.bukkit.inventory.Inventory top = !VersionHelper.isOrAbove1_21() ? LegacyInventoryUtils.getTopInventory(platformPlayer()) : platformPlayer().getOpenInventory().getTopInventory();
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(FastNMS.INSTANCE.method$CraftInventory$getInventory(top))) {
Object container = FastNMS.INSTANCE.method$CraftInventory$getInventory(top);
if (!CraftBukkitReflections.clazz$MinecraftInventory.isInstance(container)
|| !container.getClass().getSimpleName().equals("CraftEngineWorldlyContainer")) {
return;
}
if (top.getHolder() instanceof CraftEngineGUIHolder holder) {

View File

@@ -35,6 +35,9 @@ items:
sounds:
open: minecraft:block.iron_trapdoor.open
close: minecraft:block.iron_trapdoor.close
hopper-behavior:
can-place-item: true
can-take-item: false
states:
properties:
facing:

View File

@@ -105,7 +105,7 @@ public abstract class BlockBehavior {
return 0;
}
// BlockState state, LevelReader world, BlockPos pos
// BlockState state, LevelAccessor level, BlockPos pos
public Object getContainer(Object thisBlock, Object[] args) throws Exception {
return null;
}

View File

@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3
snake_yaml_version=2.5
anti_grief_version=0.20
nms_helper_version=1.0.85
nms_helper_version=1.0.86
evalex_version=3.5.0
reactive_streams_version=1.0.4
amazon_awssdk_version=2.33.1