diff --git a/src/main/java/fr/themode/minestom/Main.java b/src/main/java/fr/themode/minestom/Main.java index d7a97c89d..6e4e3386a 100644 --- a/src/main/java/fr/themode/minestom/Main.java +++ b/src/main/java/fr/themode/minestom/Main.java @@ -39,7 +39,7 @@ public class Main { blockManager = new BlockManager(); entityManager = new EntityManager(); - blockManager.registerBlock("stone", StoneBlock::new); + blockManager.registerBlock(StoneBlock::new); server = new TCPServer(new MinecraftProtocol()).addHandler(new ServerHandler() { @Override diff --git a/src/main/java/fr/themode/minestom/instance/BlockManager.java b/src/main/java/fr/themode/minestom/instance/BlockManager.java index 07b30ab7e..acf460a0c 100644 --- a/src/main/java/fr/themode/minestom/instance/BlockManager.java +++ b/src/main/java/fr/themode/minestom/instance/BlockManager.java @@ -6,14 +6,23 @@ import java.util.function.Supplier; public class BlockManager { - private Map blocks = new HashMap<>(); + private Map blocksInternalId = new HashMap<>(); + private Map blocksId = new HashMap<>(); - public void registerBlock(String id, Supplier blocks) { - this.blocks.put(id, blocks.get()); + public void registerBlock(Supplier blocks) { + CustomBlock customBlock = blocks.get(); + String identifier = customBlock.getIdentifier(); + int id = customBlock.getId(); + this.blocksInternalId.put(id, customBlock); + this.blocksId.put(identifier, customBlock); } - public CustomBlock getBlock(String id) { - return this.blocks.get(id); + public CustomBlock getBlock(String identifier) { + return blocksId.get(identifier); + } + + public CustomBlock getBlock(int id) { + return blocksInternalId.get(id); } } diff --git a/src/main/java/fr/themode/minestom/instance/Chunk.java b/src/main/java/fr/themode/minestom/instance/Chunk.java index 5df4493ec..5066ec1f9 100644 --- a/src/main/java/fr/themode/minestom/instance/Chunk.java +++ b/src/main/java/fr/themode/minestom/instance/Chunk.java @@ -18,7 +18,7 @@ public class Chunk { private int chunkX, chunkZ; private Biome biome; private short[] blocksId = new short[CHUNK_SIZE]; - private String[] customBlocks = new String[CHUNK_SIZE]; + private int[] customBlocks = new int[CHUNK_SIZE]; public Chunk(Biome biome, int chunkX, int chunkZ) { this.biome = biome; @@ -30,23 +30,27 @@ public class Chunk { int index = getIndex(x, y, z); this.blocksId[index] = blockId; if (blockId == 0) { - this.customBlocks[index] = null; + this.customBlocks[index] = 0; } } protected void setBlock(byte x, byte y, byte z, String blockId) { - int index = getIndex(x, y, z); CustomBlock customBlock = Main.getBlockManager().getBlock(blockId); + if (customBlock == null) + throw new IllegalArgumentException("The block " + blockId + " does not exist or isn't registered"); + + int index = getIndex(x, y, z); this.blocksId[index] = customBlock.getType(); - this.customBlocks[index] = blockId; + this.customBlocks[index] = customBlock.getId(); } public short getBlockId(byte x, byte y, byte z) { return this.blocksId[getIndex(x, y, z)]; } - public String getCustomBlockId(byte x, byte y, byte z) { - return this.customBlocks[getIndex(x, y, z)]; + public CustomBlock getCustomBlock(byte x, byte y, byte z) { + int id = this.customBlocks[getIndex(x, y, z)]; + return id != 0 ? Main.getBlockManager().getBlock(id) : null; } public void addEntity(Entity entity) { diff --git a/src/main/java/fr/themode/minestom/instance/CustomBlock.java b/src/main/java/fr/themode/minestom/instance/CustomBlock.java index b8cf21000..eaf2f7a94 100644 --- a/src/main/java/fr/themode/minestom/instance/CustomBlock.java +++ b/src/main/java/fr/themode/minestom/instance/CustomBlock.java @@ -2,20 +2,28 @@ package fr.themode.minestom.instance; import fr.themode.minestom.entity.Player; +import java.util.concurrent.atomic.AtomicInteger; + public abstract class CustomBlock { - private short type; + private static final AtomicInteger idCounter = new AtomicInteger(); - public CustomBlock(short type) { - this.type = type; + private int id; + + public CustomBlock() { + this.id = idCounter.incrementAndGet(); } + public abstract short getType(); + + public abstract String getIdentifier(); + /* Time in ms */ public abstract int getBreakDelay(Player player); - public short getType() { - return type; + public int getId() { + return id; } } diff --git a/src/main/java/fr/themode/minestom/instance/Instance.java b/src/main/java/fr/themode/minestom/instance/Instance.java index 733c7dc89..4fae0e7dd 100644 --- a/src/main/java/fr/themode/minestom/instance/Instance.java +++ b/src/main/java/fr/themode/minestom/instance/Instance.java @@ -19,7 +19,7 @@ public class Instance { private GroupedCollections creatures = new GroupedCollections<>(new CopyOnWriteArrayList()); private GroupedCollections players = new GroupedCollections<>(new CopyOnWriteArrayList()); - private Set chunksSet = new CopyOnWriteArraySet<>(); + private Set chunksSet = new CopyOnWriteArraySet<>(); // TODO change for a map with position as key and chunk as value public Instance(UUID uniqueId) { this.uniqueId = uniqueId; @@ -46,9 +46,9 @@ public class Instance { return chunk.getBlockId((byte) (x % 16), (byte) y, (byte) (z % 16)); } - public String getCustomBlockId(int x, int y, int z) { + public CustomBlock getCustomBlock(int x, int y, int z) { Chunk chunk = getChunkAt(x, z); - return chunk.getCustomBlockId((byte) (x % 16), (byte) y, (byte) (z % 16)); + return chunk.getCustomBlock((byte) (x % 16), (byte) y, (byte) (z % 16)); } public BlockBatch createBlockBatch() { diff --git a/src/main/java/fr/themode/minestom/instance/demo/StoneBlock.java b/src/main/java/fr/themode/minestom/instance/demo/StoneBlock.java index 4aab1a8e1..3a047ad52 100644 --- a/src/main/java/fr/themode/minestom/instance/demo/StoneBlock.java +++ b/src/main/java/fr/themode/minestom/instance/demo/StoneBlock.java @@ -5,12 +5,18 @@ import fr.themode.minestom.instance.CustomBlock; public class StoneBlock extends CustomBlock { - public StoneBlock() { - super((short) 1); + @Override + public short getType() { + return 1; + } + + @Override + public String getIdentifier() { + return "stone_block"; } @Override public int getBreakDelay(Player player) { return 750; } -} +} \ No newline at end of file diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerBlockPlacementPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerBlockPlacementPacket.java index 9d657c84e..597b45b2a 100644 --- a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerBlockPlacementPacket.java +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerBlockPlacementPacket.java @@ -25,7 +25,7 @@ public class ClientPlayerBlockPlacementPacket implements ClientPlayPacket { int offsetY = blockFace == ClientPlayerDiggingPacket.BlockFace.BOTTOM ? -1 : blockFace == ClientPlayerDiggingPacket.BlockFace.TOP ? 1 : 0; int offsetZ = blockFace == ClientPlayerDiggingPacket.BlockFace.NORTH ? -1 : blockFace == ClientPlayerDiggingPacket.BlockFace.SOUTH ? 1 : 0; - instance.setBlock(position.getX() + offsetX, position.getY() + offsetY, position.getZ() + offsetZ, "stone"); + instance.setBlock(position.getX() + offsetX, position.getY() + offsetY, position.getZ() + offsetZ, "stone_block"); player.getInventory().refreshSlot(player.getHeldSlot()); // TODO consume block in hand for survival players /*Random random = new Random(); diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerDiggingPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerDiggingPacket.java index ab817efb6..5186e6558 100644 --- a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerDiggingPacket.java +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerDiggingPacket.java @@ -1,7 +1,6 @@ package fr.themode.minestom.net.packet.client.play; import fr.adamaq01.ozao.net.Buffer; -import fr.themode.minestom.Main; import fr.themode.minestom.entity.GameMode; import fr.themode.minestom.entity.Player; import fr.themode.minestom.instance.CustomBlock; @@ -30,9 +29,8 @@ public class ClientPlayerDiggingPacket implements ClientPlayPacket { } else if (player.getGameMode() == GameMode.SURVIVAL) { Instance instance = player.getInstance(); if (instance != null) { - String customBlockId = instance.getCustomBlockId(position.getX(), position.getY(), position.getZ()); - if (customBlockId != null) { - CustomBlock customBlock = Main.getBlockManager().getBlock(customBlockId); + CustomBlock customBlock = instance.getCustomBlock(position.getX(), position.getY(), position.getZ()); + if (customBlock != null) { player.refreshTargetBlock(customBlock, position); addEffect(player); } else {