From ebe03439efb7bffe364e5ae092eac75c47b74802 Mon Sep 17 00:00:00 2001 From: MEFRREEX Date: Tue, 23 Sep 2025 20:37:35 +0400 Subject: [PATCH 1/2] feat: better fake block offset system --- .../me/iwareq/fakeinventories/FakeInventories.java | 8 ++++---- .../java/me/iwareq/fakeinventories/FakeInventory.java | 5 ++++- .../iwareq/fakeinventories/block/DoubleFakeBlock.java | 8 +++----- .../me/iwareq/fakeinventories/block/FakeBlock.java | 11 +++-------- .../iwareq/fakeinventories/block/SingleFakeBlock.java | 4 ++-- .../fakeinventories/block/offset/FakeBlockOffset.java | 8 ++++++++ .../FakeBlockOffsets.java} | 8 +++----- 7 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java rename src/main/java/me/iwareq/fakeinventories/block/{FakeBlockOffset.java => offset/FakeBlockOffsets.java} (81%) diff --git a/src/main/java/me/iwareq/fakeinventories/FakeInventories.java b/src/main/java/me/iwareq/fakeinventories/FakeInventories.java index 561cb2a..c880d54 100644 --- a/src/main/java/me/iwareq/fakeinventories/FakeInventories.java +++ b/src/main/java/me/iwareq/fakeinventories/FakeInventories.java @@ -3,7 +3,6 @@ import cn.nukkit.block.BlockID; import cn.nukkit.blockentity.BlockEntity; import cn.nukkit.event.EventPriority; -import cn.nukkit.event.Listener; import cn.nukkit.event.inventory.InventoryTransactionEvent; import cn.nukkit.inventory.InventoryType; import cn.nukkit.inventory.transaction.action.SlotChangeAction; @@ -12,13 +11,14 @@ import lombok.Getter; import me.iwareq.fakeinventories.block.DoubleFakeBlock; import me.iwareq.fakeinventories.block.FakeBlock; -import me.iwareq.fakeinventories.block.FakeBlockOffset; import me.iwareq.fakeinventories.block.SingleFakeBlock; +import me.iwareq.fakeinventories.block.offset.FakeBlockOffset; +import me.iwareq.fakeinventories.block.offset.FakeBlockOffsets; import java.util.EnumMap; import java.util.Map; -public class FakeInventories extends PluginBase implements Listener { +public class FakeInventories extends PluginBase { @Getter private static FakeInventories instance; @@ -40,7 +40,7 @@ public void onLoad() { FAKE_BLOCKS.put(InventoryType.DROPPER, new SingleFakeBlock(BlockID.DROPPER, InventoryType.DROPPER.getDefaultTitle())); FAKE_BLOCKS.put(InventoryType.HOPPER, new SingleFakeBlock(BlockID.HOPPER_BLOCK, BlockEntity.HOPPER)); FAKE_BLOCKS.put(InventoryType.SHULKER_BOX, new SingleFakeBlock(BlockID.SHULKER_BOX, BlockEntity.SHULKER_BOX)); - FAKE_BLOCK_OFFSET = FakeBlockOffset.valueOf(this.getConfig().getString("fake-block-offset-mode").toUpperCase()); + FAKE_BLOCK_OFFSET = FakeBlockOffsets.valueOf(this.getConfig().getString("fake-block-offset-mode").toUpperCase()); } @Override diff --git a/src/main/java/me/iwareq/fakeinventories/FakeInventory.java b/src/main/java/me/iwareq/fakeinventories/FakeInventory.java index 22870fc..632518b 100644 --- a/src/main/java/me/iwareq/fakeinventories/FakeInventory.java +++ b/src/main/java/me/iwareq/fakeinventories/FakeInventory.java @@ -12,6 +12,7 @@ import lombok.Getter; import lombok.Setter; import me.iwareq.fakeinventories.block.FakeBlock; +import me.iwareq.fakeinventories.block.offset.FakeBlockOffset; import me.iwareq.fakeinventories.util.ItemHandler; import me.iwareq.fakeinventories.util.SimplePlayerHandler; @@ -33,6 +34,7 @@ public class FakeInventory extends BaseInventory { private final Map handlers = new HashMap<>(); private final FakeBlock fakeBlock; + private FakeBlockOffset fakeBlockOffset; public FakeInventory(InventoryType inventoryType) { this(inventoryType, null); @@ -42,11 +44,12 @@ public FakeInventory(InventoryType inventoryType, String title) { super(null, inventoryType); this.title = title == null ? inventoryType.getDefaultTitle() : title; this.fakeBlock = FakeInventories.getFakeBlock(inventoryType); + this.fakeBlockOffset = FakeInventories.getFakeBlockOffset(); } @Override public void onOpen(Player player) { - this.fakeBlock.create(player, this.getTitle()); + this.fakeBlock.create(player, this.fakeBlockOffset.getOffset(player), this.getTitle()); Server.getInstance().getScheduler().scheduleDelayedTask(FakeInventories.getInstance(), () -> { ContainerOpenPacket packet = new ContainerOpenPacket(); diff --git a/src/main/java/me/iwareq/fakeinventories/block/DoubleFakeBlock.java b/src/main/java/me/iwareq/fakeinventories/block/DoubleFakeBlock.java index b921295..5c14f16 100644 --- a/src/main/java/me/iwareq/fakeinventories/block/DoubleFakeBlock.java +++ b/src/main/java/me/iwareq/fakeinventories/block/DoubleFakeBlock.java @@ -16,8 +16,8 @@ public DoubleFakeBlock(int blockId, String tileId) { } @Override - public List getPlacePositions(Player player) { - Vector3 position = player.getPosition().add(this.getOffset(player)).floor(); + public List getPlacePositions(Player player, Vector3 offset) { + Vector3 position = player.getPosition().add(this.correctOffset(offset)).floor(); DimensionData dimension = player.getLevel().getDimensionData(); if (position.getFloorY() >= dimension.getMinHeight() && position.getFloorY() < dimension.getMaxHeight()) { if ((position.getFloorX() & 1) == 1) { @@ -28,9 +28,7 @@ public List getPlacePositions(Player player) { return Collections.emptyList(); } - @Override - public Vector3 getOffset(Player player) { - Vector3 offset = super.getOffset(player); + protected Vector3 correctOffset(Vector3 offset) { offset.x *= 1.5; offset.z *= 1.5; return offset; diff --git a/src/main/java/me/iwareq/fakeinventories/block/FakeBlock.java b/src/main/java/me/iwareq/fakeinventories/block/FakeBlock.java index ae4b090..0ee726f 100644 --- a/src/main/java/me/iwareq/fakeinventories/block/FakeBlock.java +++ b/src/main/java/me/iwareq/fakeinventories/block/FakeBlock.java @@ -3,7 +3,6 @@ import cn.nukkit.Player; import cn.nukkit.level.DimensionData; import cn.nukkit.math.Vector3; -import me.iwareq.fakeinventories.FakeInventories; import java.util.Collections; import java.util.List; @@ -11,22 +10,18 @@ public interface FakeBlock { - void create(Player player, String title); + void create(Player player, Vector3 offset, String title); void remove(Player player); Set getLastPositions(Player player); - default List getPlacePositions(Player player) { - Vector3 position = player.getPosition().add(this.getOffset(player)).floor(); + default List getPlacePositions(Player player, Vector3 offset) { + Vector3 position = player.getPosition().add(offset).floor(); DimensionData dimension = player.getLevel().getDimensionData(); if (position.getFloorY() >= dimension.getMinHeight() && position.getFloorY() < dimension.getMaxHeight()) { return Collections.singletonList(position); } return Collections.emptyList(); } - - default Vector3 getOffset(Player player) { - return FakeInventories.getFakeBlockOffset().getOffset(player); - } } diff --git a/src/main/java/me/iwareq/fakeinventories/block/SingleFakeBlock.java b/src/main/java/me/iwareq/fakeinventories/block/SingleFakeBlock.java index 1905091..76e9de6 100644 --- a/src/main/java/me/iwareq/fakeinventories/block/SingleFakeBlock.java +++ b/src/main/java/me/iwareq/fakeinventories/block/SingleFakeBlock.java @@ -27,8 +27,8 @@ public class SingleFakeBlock implements FakeBlock { protected final Map> lastPositions = new Object2ObjectArrayMap<>(); @Override - public void create(Player player, String title) { - this.createAndGetLastPositions(player).addAll(this.getPlacePositions(player)); + public void create(Player player, Vector3 offset, String title) { + this.createAndGetLastPositions(player).addAll(this.getPlacePositions(player, offset)); this.getLastPositions(player).forEach(position -> { UpdateBlockPacket updateBlockPacket = new UpdateBlockPacket(); updateBlockPacket.blockRuntimeId = GlobalBlockPalette.getOrCreateRuntimeId(player.protocol, this.blockId, 0); diff --git a/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java new file mode 100644 index 0000000..e4733bf --- /dev/null +++ b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java @@ -0,0 +1,8 @@ +package me.iwareq.fakeinventories.block.offset; + +import cn.nukkit.Player; +import cn.nukkit.math.Vector3; + +public interface FakeBlockOffset { + Vector3 getOffset(Player player); +} diff --git a/src/main/java/me/iwareq/fakeinventories/block/FakeBlockOffset.java b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffsets.java similarity index 81% rename from src/main/java/me/iwareq/fakeinventories/block/FakeBlockOffset.java rename to src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffsets.java index 4657c75..25108a9 100644 --- a/src/main/java/me/iwareq/fakeinventories/block/FakeBlockOffset.java +++ b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffsets.java @@ -1,10 +1,10 @@ -package me.iwareq.fakeinventories.block; +package me.iwareq.fakeinventories.block.offset; import cn.nukkit.Player; import cn.nukkit.math.Vector3; import me.iwareq.fakeinventories.util.InventoryUtils; -public enum FakeBlockOffset { +public enum FakeBlockOffsets implements FakeBlockOffset { STANDARD { @Override public Vector3 getOffset(Player player) { @@ -20,7 +20,5 @@ public Vector3 getOffset(Player player) { public Vector3 getOffset(Player player) { return InventoryUtils.findAvailableOffset(player); } - }; - - public abstract Vector3 getOffset(Player player); + } } From 347b1378d60b7e3d84787e97b8a7370a7a03d0a2 Mon Sep 17 00:00:00 2001 From: MEFRREEX Date: Tue, 23 Sep 2025 20:47:06 +0400 Subject: [PATCH 2/2] chore: javadoc --- .../fakeinventories/block/offset/FakeBlockOffset.java | 10 ++++++++++ .../fakeinventories/block/offset/FakeBlockOffsets.java | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java index e4733bf..8569c77 100644 --- a/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java +++ b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java @@ -3,6 +3,16 @@ import cn.nukkit.Player; import cn.nukkit.math.Vector3; +/** + * Interface for defining the offset of a fake block for specific inventory. + */ public interface FakeBlockOffset { + + /** + * Get an offset for the player. + * + * @param player the player + * @return defined offset + */ Vector3 getOffset(Player player); } diff --git a/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffsets.java b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffsets.java index 25108a9..72a5f70 100644 --- a/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffsets.java +++ b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffsets.java @@ -4,7 +4,13 @@ import cn.nukkit.math.Vector3; import me.iwareq.fakeinventories.util.InventoryUtils; +/** + * Ready-made offsets for fake blocks. + */ public enum FakeBlockOffsets implements FakeBlockOffset { + /** + * Standard block offset. + */ STANDARD { @Override public Vector3 getOffset(Player player) { @@ -15,6 +21,9 @@ public Vector3 getOffset(Player player) { return offset; } }, + /** + * Geyser-like block offset. + */ GEYSER { @Override public Vector3 getOffset(Player player) {