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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user