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..8569c77 --- /dev/null +++ b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffset.java @@ -0,0 +1,18 @@ +package me.iwareq.fakeinventories.block.offset; + +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/FakeBlockOffset.java b/src/main/java/me/iwareq/fakeinventories/block/offset/FakeBlockOffsets.java similarity index 70% 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..72a5f70 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,16 @@ -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 { +/** + * Ready-made offsets for fake blocks. + */ +public enum FakeBlockOffsets implements FakeBlockOffset { + /** + * Standard block offset. + */ STANDARD { @Override public Vector3 getOffset(Player player) { @@ -15,12 +21,13 @@ public Vector3 getOffset(Player player) { return offset; } }, + /** + * Geyser-like block offset. + */ GEYSER { @Override public Vector3 getOffset(Player player) { return InventoryUtils.findAvailableOffset(player); } - }; - - public abstract Vector3 getOffset(Player player); + } }