From a8f48aafe9cea61f1868f67d81fc6f7915d819af Mon Sep 17 00:00:00 2001 From: Felix Cravic Date: Sat, 11 Apr 2020 17:21:53 +0200 Subject: [PATCH] Lot of new packets --- src/main/java/fr/themode/demo/PlayerInit.java | 7 +-- .../fr/themode/minestom/instance/Chunk.java | 28 ++++++++--- .../themode/minestom/instance/Instance.java | 7 +++ .../minestom/instance/InstanceContainer.java | 16 ++++++ .../minestom/instance/SharedInstance.java | 5 ++ .../minestom/instance/block/BlockManager.java | 7 +++ .../block/rule/BlockPlacementRule.java | 22 +++++++++ .../listener/TabCompleteListener.java | 14 ++++++ .../manager/PacketListenerManager.java | 1 + .../handler/ClientPlayPacketsHandler.java | 12 +++++ .../play/ClientAdvancementTabPacket.java | 31 ++++++++++++ .../client/play/ClientNameItemPacket.java | 17 +++++++ .../client/play/ClientPickItemPacket.java | 17 +++++++ .../play/ClientResourcePackStatusPacket.java | 22 +++++++++ .../client/play/ClientSelectTradePacket.java | 17 +++++++ .../client/play/ClientSpectatePacket.java | 16 ++++++ .../client/play/ClientSteerBoatPacket.java | 19 +++++++ .../client/play/ClientTabCompletePacket.java | 19 +++++++ ...lientUpdateCommandBlockMinecartPacket.java | 21 ++++++++ .../play/ClientUpdateCommandBlockPacket.java | 29 +++++++++++ .../client/play/ClientUpdateSignPacket.java | 27 ++++++++++ .../client/play/ClientVehicleMovePacket.java | 23 +++++++++ .../server/play/OpenHorseWindowPacket.java | 24 +++++++++ .../packet/server/play/StatisticsPacket.java | 49 +++++++++++++++++++ .../packet/server/play/TabCompletePacket.java | 40 +++++++++++++++ .../packet/server/play/UpdateLightPacket.java | 42 ++++++++++++++++ .../minestom/registry/RegistryMain.java | 9 +++- 27 files changed, 529 insertions(+), 12 deletions(-) create mode 100644 src/main/java/fr/themode/minestom/instance/block/rule/BlockPlacementRule.java create mode 100644 src/main/java/fr/themode/minestom/listener/TabCompleteListener.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientAdvancementTabPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientNameItemPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientPickItemPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientResourcePackStatusPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientSelectTradePacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientSpectatePacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientSteerBoatPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientTabCompletePacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateCommandBlockPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateSignPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/client/play/ClientVehicleMovePacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/server/play/OpenHorseWindowPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/server/play/StatisticsPacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/server/play/TabCompletePacket.java create mode 100644 src/main/java/fr/themode/minestom/net/packet/server/play/UpdateLightPacket.java diff --git a/src/main/java/fr/themode/demo/PlayerInit.java b/src/main/java/fr/themode/demo/PlayerInit.java index 339b1eae7..ff72d54c6 100644 --- a/src/main/java/fr/themode/demo/PlayerInit.java +++ b/src/main/java/fr/themode/demo/PlayerInit.java @@ -1,6 +1,5 @@ package fr.themode.demo; -import fr.themode.demo.entity.ChickenCreature; import fr.themode.demo.generator.ChunkGeneratorDemo; import fr.themode.minestom.MinecraftServer; import fr.themode.minestom.entity.Entity; @@ -79,8 +78,8 @@ public class PlayerInit { p.teleport(player.getPosition()); } - ChickenCreature chickenCreature = new ChickenCreature(player.getPosition()); - chickenCreature.setInstance(player.getInstance()); + //ChickenCreature chickenCreature = new ChickenCreature(player.getPosition()); + //chickenCreature.setInstance(player.getInstance()); }); @@ -96,8 +95,6 @@ public class PlayerInit { player.setGameMode(GameMode.CREATIVE); player.teleport(new Position(0, 66, 0)); - player.sendHeaderFooter("Its the header", "Its the footer", '&'); - /*Random random = new Random(); for (int i = 0; i < 50; i++) { ChickenCreature chickenCreature = new ChickenCreature(); diff --git a/src/main/java/fr/themode/minestom/instance/Chunk.java b/src/main/java/fr/themode/minestom/instance/Chunk.java index f64da7fad..ba9f9ed7e 100644 --- a/src/main/java/fr/themode/minestom/instance/Chunk.java +++ b/src/main/java/fr/themode/minestom/instance/Chunk.java @@ -89,12 +89,11 @@ public class Chunk implements Viewable { setBlock(index, customBlock.getType(), customBlock.getId(), data, updateConsumer); } - private void setBlock(int index, short blockType, short customId, Data data, UpdateConsumer updateConsumer) { + private void setBlock(int index, short blockId, short customId, Data data, UpdateConsumer updateConsumer) { - if (blockType != 0 - || (blockType == 0 && customId != 0 && updateConsumer != null)) { // Allow custom air block for update purpose, refused if no update consumer has been found - int value = (blockType << 16 | customId & 0xFFFF); // Merge blockType and customId to one unique Integer (16/16 bits) - this.blocks.put(index, value); + if (blockId != 0 + || (blockId == 0 && customId != 0 && updateConsumer != null)) { // Allow custom air block for update purpose, refused if no update consumer has been found + refreshBlockValue(index, blockId, customId); } else { // Block has been deleted, clear cache and return @@ -127,7 +126,7 @@ public class Chunk implements Viewable { this.updatableBlocksLastUpdate.remove(index); } - if (isBlockEntity(blockType)) { + if (isBlockEntity(blockId)) { this.blockEntities.add(index); } else { this.blockEntities.remove(index); @@ -162,6 +161,23 @@ public class Chunk implements Viewable { return id != 0 ? BLOCK_MANAGER.getBlock(id) : null; } + protected void refreshBlockValue(int index, short blockId, short customId) { + int value = createBlockValue(blockId, customId); + this.blocks.put(index, value); + } + + protected void refreshBlockValue(int index, short blockId) { + CustomBlock customBlock = getCustomBlock(index); + short customBlockId = customBlock == null ? 0 : customBlock.getId(); + refreshBlockValue(index, blockId, customBlockId); + } + + public int createBlockValue(short blockId, short customId) { + // Merge blockType and customId to one unique Integer (16/16 bits) + int value = (blockId << 16 | customId & 0xFFFF); + return value; + } + private int getBlockValue(int index) { return blocks.getOrDefault(index, 0); } diff --git a/src/main/java/fr/themode/minestom/instance/Instance.java b/src/main/java/fr/themode/minestom/instance/Instance.java index 6d675b834..2be3b136a 100644 --- a/src/main/java/fr/themode/minestom/instance/Instance.java +++ b/src/main/java/fr/themode/minestom/instance/Instance.java @@ -7,6 +7,7 @@ import fr.themode.minestom.data.DataContainer; import fr.themode.minestom.entity.*; import fr.themode.minestom.instance.batch.BlockBatch; import fr.themode.minestom.instance.batch.ChunkBatch; +import fr.themode.minestom.instance.block.Block; import fr.themode.minestom.instance.block.BlockManager; import fr.themode.minestom.instance.block.CustomBlock; import fr.themode.minestom.net.PacketWriterUtils; @@ -41,6 +42,8 @@ public abstract class Instance implements BlockModifier, DataContainer { this.uniqueId = uniqueId; } + public abstract void refreshBlockId(int x, int y, int z, short blockId); + // Used to call BlockBreakEvent and sending particle packet if true public abstract void breakBlock(Player player, BlockPosition blockPosition); @@ -129,6 +132,10 @@ public abstract class Instance implements BlockModifier, DataContainer { return Collections.unmodifiableSet(getEntitiesInChunk(ChunkUtils.getChunkIndex(chunk.getChunkX(), chunk.getChunkZ()))); } + public void refreshBlockId(int x, int y, int z, Block block) { + refreshBlockId(x, y, z, block.getBlockId()); + } + public void loadChunk(int chunkX, int chunkZ) { loadChunk(chunkX, chunkZ, null); } diff --git a/src/main/java/fr/themode/minestom/instance/InstanceContainer.java b/src/main/java/fr/themode/minestom/instance/InstanceContainer.java index 60248fde0..043416162 100644 --- a/src/main/java/fr/themode/minestom/instance/InstanceContainer.java +++ b/src/main/java/fr/themode/minestom/instance/InstanceContainer.java @@ -80,6 +80,22 @@ public class InstanceContainer extends Instance { } } + @Override + public void refreshBlockId(int x, int y, int z, short blockId) { + Chunk chunk = getChunkAt(x, z); + synchronized (chunk) { + byte chunkX = (byte) (x % 16); + byte chunkY = (byte) y; + byte chunkZ = (byte) (z % 16); + int index = SerializerUtils.chunkCoordToIndex(chunkX, chunkY, chunkZ); + + chunk.refreshBlockValue(index, blockId); + + // TODO instead of sending a block change packet each time, cache changed blocks and flush them every tick with a MultiBlockChangePacket + sendBlockChange(chunk, x, y, z, blockId); + } + } + private void callBlockDestroy(Chunk chunk, int index, int x, int y, int z) { CustomBlock previousBlock = chunk.getCustomBlock(index); if (previousBlock != null) { diff --git a/src/main/java/fr/themode/minestom/instance/SharedInstance.java b/src/main/java/fr/themode/minestom/instance/SharedInstance.java index 98cc11d0d..ad8ebbae6 100644 --- a/src/main/java/fr/themode/minestom/instance/SharedInstance.java +++ b/src/main/java/fr/themode/minestom/instance/SharedInstance.java @@ -23,6 +23,11 @@ public class SharedInstance extends Instance { this.instanceContainer = instanceContainer; } + @Override + public void refreshBlockId(int x, int y, int z, short blockId) { + instanceContainer.refreshBlockId(x, y, z, blockId); + } + @Override public void breakBlock(Player player, BlockPosition blockPosition) { instanceContainer.breakBlock(player, blockPosition); diff --git a/src/main/java/fr/themode/minestom/instance/block/BlockManager.java b/src/main/java/fr/themode/minestom/instance/block/BlockManager.java index 6998fa139..e2951d2d8 100644 --- a/src/main/java/fr/themode/minestom/instance/block/BlockManager.java +++ b/src/main/java/fr/themode/minestom/instance/block/BlockManager.java @@ -1,5 +1,6 @@ package fr.themode.minestom.instance.block; +import fr.themode.minestom.instance.block.rule.BlockPlacementRule; import it.unimi.dsi.fastutil.shorts.Short2ObjectMap; import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap; @@ -11,6 +12,8 @@ public class BlockManager { private Short2ObjectMap blocksInternalId = new Short2ObjectOpenHashMap<>(); private Map blocksId = new HashMap<>(); + private Map placementRules = new HashMap<>(); + public void registerCustomBlock(CustomBlock customBlock) { String identifier = customBlock.getIdentifier(); short id = customBlock.getId(); @@ -18,6 +21,10 @@ public class BlockManager { this.blocksId.put(identifier, customBlock); } + public void registerBlockPlacementRule(BlockPlacementRule blockPlacementRule) { + this.placementRules.put(blockPlacementRule.getBlock(), blockPlacementRule); + } + public CustomBlock getBlock(String identifier) { return blocksId.get(identifier); } diff --git a/src/main/java/fr/themode/minestom/instance/block/rule/BlockPlacementRule.java b/src/main/java/fr/themode/minestom/instance/block/rule/BlockPlacementRule.java new file mode 100644 index 000000000..10c683cee --- /dev/null +++ b/src/main/java/fr/themode/minestom/instance/block/rule/BlockPlacementRule.java @@ -0,0 +1,22 @@ +package fr.themode.minestom.instance.block.rule; + +import fr.themode.minestom.instance.Instance; +import fr.themode.minestom.instance.block.Block; +import fr.themode.minestom.utils.BlockPosition; + +public abstract class BlockPlacementRule { + + private Block block; + + public BlockPlacementRule(Block block) { + this.block = block; + } + + public abstract void onPlace(Instance instance, BlockPosition blockPosition); + + public abstract void onNeighborPlace(Instance instance, int offsetX, int offsetY, int offsetZ); + + public Block getBlock() { + return block; + } +} diff --git a/src/main/java/fr/themode/minestom/listener/TabCompleteListener.java b/src/main/java/fr/themode/minestom/listener/TabCompleteListener.java new file mode 100644 index 000000000..8fc4339f7 --- /dev/null +++ b/src/main/java/fr/themode/minestom/listener/TabCompleteListener.java @@ -0,0 +1,14 @@ +package fr.themode.minestom.listener; + +import fr.themode.minestom.entity.Player; +import fr.themode.minestom.net.packet.client.play.ClientTabCompletePacket; + +public class TabCompleteListener { + + public static void listener(ClientTabCompletePacket packet, Player player) { + // TODO when is it called? + System.out.println("text: " + packet.text); + } + + +} diff --git a/src/main/java/fr/themode/minestom/listener/manager/PacketListenerManager.java b/src/main/java/fr/themode/minestom/listener/manager/PacketListenerManager.java index 848884d24..e34794346 100644 --- a/src/main/java/fr/themode/minestom/listener/manager/PacketListenerManager.java +++ b/src/main/java/fr/themode/minestom/listener/manager/PacketListenerManager.java @@ -34,6 +34,7 @@ public class PacketListenerManager { addListener(ClientSettingsPacket.class, SettingsListener::listener); addListener(ClientCreativeInventoryActionPacket.class, CreativeInventoryActionListener::listener); addListener(ClientCraftRecipeRequest.class, RecipeListener::listener); + addListener(ClientTabCompletePacket.class, TabCompleteListener::listener); } public void process(T packet, Player player) { diff --git a/src/main/java/fr/themode/minestom/net/packet/client/handler/ClientPlayPacketsHandler.java b/src/main/java/fr/themode/minestom/net/packet/client/handler/ClientPlayPacketsHandler.java index e6fdb5ace..986e3bbf0 100644 --- a/src/main/java/fr/themode/minestom/net/packet/client/handler/ClientPlayPacketsHandler.java +++ b/src/main/java/fr/themode/minestom/net/packet/client/handler/ClientPlayPacketsHandler.java @@ -9,6 +9,7 @@ public class ClientPlayPacketsHandler extends ClientPacketsHandler { register(0x03, ClientChatMessagePacket.class); register(0x04, ClientStatusPacket.class); register(0x05, ClientSettingsPacket.class); + register(0x06, ClientTabCompletePacket.class); register(0x07, ClientWindowConfirmationPacket.class); register(0x08, ClientClickWindowButtonPacket.class); // Marked as 0x07 on wiki.vg register(0x09, ClientClickWindowPacket.class); @@ -17,19 +18,30 @@ public class ClientPlayPacketsHandler extends ClientPacketsHandler { register(0x0E, ClientUseEntityPacket.class); register(0x0F, ClientKeepAlivePacket.class); + // 0x10 packet not used server-side register(0x11, ClientPlayerPositionPacket.class); register(0x12, ClientPlayerPositionAndLookPacket.class); register(0x13, ClientPlayerLookPacket.class); register(0x14, ClientPlayerPacket.class); + register(0x15, ClientVehicleMovePacket.class); + register(0x16, ClientSteerBoatPacket.class); + register(0x17, ClientPickItemPacket.class); register(0x18, ClientCraftRecipeRequest.class); register(0x19, ClientPlayerAbilitiesPacket.class); register(0x1A, ClientPlayerDiggingPacket.class); register(0x1B, ClientEntityActionPacket.class); register(0x1C, ClientSteerVehiclePacket.class); register(0x1D, ClientRecipeBookData.class); + register(0x1E, ClientNameItemPacket.class); + register(0x1F, ClientResourcePackStatusPacket.class); + register(0x20, ClientAdvancementTabPacket.class); + register(0x21, ClientSelectTradePacket.class); register(0x23, ClientHeldItemChangePacket.class); + register(0x24, ClientUpdateCommandBlockPacket.class); + register(0x25, ClientUpdateCommandBlockMinecartPacket.class); register(0x26, ClientCreativeInventoryActionPacket.class); + register(0x29, ClientUpdateSignPacket.class); register(0x2A, ClientAnimationPacket.class); register(0x2C, ClientPlayerBlockPlacementPacket.class); register(0x2D, ClientUseItemPacket.class); diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientAdvancementTabPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientAdvancementTabPacket.java new file mode 100644 index 000000000..5e3ebe003 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientAdvancementTabPacket.java @@ -0,0 +1,31 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientAdvancementTabPacket extends ClientPlayPacket { + + public Action action; + public String tabIdentifier; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readVarInt(i -> { + action = Action.values()[i]; + if (action == Action.OPENED_TAB) { + reader.readSizedString((string, length) -> { + tabIdentifier = string; + callback.run(); + }); + } else { + callback.run(); + } + }); + } + + public enum Action { + OPENED_TAB, + CLOSED_SCREEN + } + +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientNameItemPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientNameItemPacket.java new file mode 100644 index 000000000..62f655f8f --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientNameItemPacket.java @@ -0,0 +1,17 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientNameItemPacket extends ClientPlayPacket { + + public String itemName; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readSizedString((string, length) -> { + itemName = string; + callback.run(); + }); + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPickItemPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPickItemPacket.java new file mode 100644 index 000000000..cc5732123 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPickItemPacket.java @@ -0,0 +1,17 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientPickItemPacket extends ClientPlayPacket { + + public int slotToUse; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readVarInt(i -> { + slotToUse = i; + callback.run(); + }); + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientResourcePackStatusPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientResourcePackStatusPacket.java new file mode 100644 index 000000000..9d202a840 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientResourcePackStatusPacket.java @@ -0,0 +1,22 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientResourcePackStatusPacket extends ClientPlayPacket { + + public Result result; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readVarInt(i -> { + result = Result.values()[i]; + callback.run(); + }); + } + + public enum Result { + SUCCESS, DECLINED, FAILED_DOWNLOAD, ACCEPTED + } + +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSelectTradePacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSelectTradePacket.java new file mode 100644 index 000000000..5ae3f8c11 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSelectTradePacket.java @@ -0,0 +1,17 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientSelectTradePacket extends ClientPlayPacket { + + public int selectedSlot; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readVarInt(i -> { + selectedSlot = i; + callback.run(); + }); + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSpectatePacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSpectatePacket.java new file mode 100644 index 000000000..42451c45e --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSpectatePacket.java @@ -0,0 +1,16 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +import java.util.UUID; + +public class ClientSpectatePacket extends ClientPlayPacket { + + public UUID targetUuid; + + @Override + public void read(PacketReader reader, Runnable callback) { + // TODO reader uuid + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSteerBoatPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSteerBoatPacket.java new file mode 100644 index 000000000..dba671173 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientSteerBoatPacket.java @@ -0,0 +1,19 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientSteerBoatPacket extends ClientPlayPacket { + + public boolean leftPaddleTurning; + public boolean rightPaddleTurning; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readBoolean(value -> leftPaddleTurning = value); + reader.readBoolean(value -> { + rightPaddleTurning = value; + callback.run(); + }); + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientTabCompletePacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientTabCompletePacket.java new file mode 100644 index 000000000..14aa661e9 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientTabCompletePacket.java @@ -0,0 +1,19 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientTabCompletePacket extends ClientPlayPacket { + + public int transactionId; + public String text; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readVarInt(i -> transactionId = i); + reader.readSizedString((string, length) -> { + text = string; + callback.run(); + }); + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java new file mode 100644 index 000000000..56ab62206 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java @@ -0,0 +1,21 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientUpdateCommandBlockMinecartPacket extends ClientPlayPacket { + + public int entityId; + public String command; + public boolean trackOutput; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readVarInt(i -> entityId = i); + reader.readSizedString((string, length) -> command = string); + reader.readBoolean(value -> { + trackOutput = value; + callback.run(); + }); + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateCommandBlockPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateCommandBlockPacket.java new file mode 100644 index 000000000..7ca794322 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateCommandBlockPacket.java @@ -0,0 +1,29 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; +import fr.themode.minestom.utils.BlockPosition; + +public class ClientUpdateCommandBlockPacket extends ClientPlayPacket { + + public BlockPosition blockPosition; + public String command; + public Mode mode; + public byte flags; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readBlockPosition(blockPosition1 -> blockPosition = blockPosition1); + reader.readSizedString((string, length) -> command = string); + reader.readVarInt(i -> mode = Mode.values()[i]); + reader.readByte(value -> { + flags = value; + callback.run(); + }); + } + + public enum Mode { + SEQUENCE, AUTO, REDSTONE + } + +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateSignPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateSignPacket.java new file mode 100644 index 000000000..03b9c7788 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientUpdateSignPacket.java @@ -0,0 +1,27 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; +import fr.themode.minestom.utils.BlockPosition; + +public class ClientUpdateSignPacket extends ClientPlayPacket { + + public BlockPosition blockPosition; + public String line1; + public String line2; + public String line3; + public String line4; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readBlockPosition(blockPosition1 -> blockPosition = blockPosition1); + reader.readSizedString((string, length) -> line1 = string); + reader.readSizedString((string, length) -> line2 = string); + reader.readSizedString((string, length) -> line3 = string); + reader.readSizedString((string, length) -> { + line4 = string; + callback.run(); + }); + + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientVehicleMovePacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientVehicleMovePacket.java new file mode 100644 index 000000000..b4ae7a120 --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientVehicleMovePacket.java @@ -0,0 +1,23 @@ +package fr.themode.minestom.net.packet.client.play; + +import fr.themode.minestom.net.packet.PacketReader; +import fr.themode.minestom.net.packet.client.ClientPlayPacket; + +public class ClientVehicleMovePacket extends ClientPlayPacket { + + public double x, y, z; + public float yaw, pitch; + + @Override + public void read(PacketReader reader, Runnable callback) { + reader.readDouble(v -> x = v); + reader.readDouble(v -> y = v); + reader.readDouble(v -> z = v); + + reader.readFloat(value -> yaw = value); + reader.readFloat(value -> { + pitch = value; + callback.run(); + }); + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/server/play/OpenHorseWindowPacket.java b/src/main/java/fr/themode/minestom/net/packet/server/play/OpenHorseWindowPacket.java new file mode 100644 index 000000000..b5deae86d --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/server/play/OpenHorseWindowPacket.java @@ -0,0 +1,24 @@ +package fr.themode.minestom.net.packet.server.play; + +import fr.themode.minestom.net.packet.PacketWriter; +import fr.themode.minestom.net.packet.server.ServerPacket; +import fr.themode.minestom.net.packet.server.ServerPacketIdentifier; + +public class OpenHorseWindowPacket implements ServerPacket { + + public byte windowId; + public int slotCount; + public int entityId; + + @Override + public void write(PacketWriter writer) { + writer.writeByte(windowId); + writer.writeVarInt(slotCount); + writer.writeInt(entityId); + } + + @Override + public int getId() { + return ServerPacketIdentifier.OPEN_HORSE_WINDOW; + } +} diff --git a/src/main/java/fr/themode/minestom/net/packet/server/play/StatisticsPacket.java b/src/main/java/fr/themode/minestom/net/packet/server/play/StatisticsPacket.java new file mode 100644 index 000000000..749bd4baa --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/server/play/StatisticsPacket.java @@ -0,0 +1,49 @@ +package fr.themode.minestom.net.packet.server.play; + +import fr.themode.minestom.net.packet.PacketWriter; +import fr.themode.minestom.net.packet.server.ServerPacket; +import fr.themode.minestom.net.packet.server.ServerPacketIdentifier; + +public class StatisticsPacket implements ServerPacket { + + public Statistic[] statistics; + + @Override + public void write(PacketWriter writer) { + writer.writeVarInt(statistics.length); + for (Statistic statistic : statistics) { + statistic.write(writer); + } + } + + @Override + public int getId() { + return ServerPacketIdentifier.STATISTICS; + } + + public enum StatisticCategory { + MINED, + CRAFTED, + USED, + BROKEN, + PICKED_UP, + DROPPED, + KILLED, + KILLED_BY, + CUSTOM + } + + public static class Statistic { + + public StatisticCategory category; + public int statisticIdentifier; + public int value; + + private void write(PacketWriter writer) { + writer.writeVarInt(category.ordinal()); + writer.writeVarInt(statisticIdentifier); + writer.writeVarInt(value); + } + } + +} diff --git a/src/main/java/fr/themode/minestom/net/packet/server/play/TabCompletePacket.java b/src/main/java/fr/themode/minestom/net/packet/server/play/TabCompletePacket.java new file mode 100644 index 000000000..08989fc8a --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/server/play/TabCompletePacket.java @@ -0,0 +1,40 @@ +package fr.themode.minestom.net.packet.server.play; + +import fr.themode.minestom.net.packet.PacketWriter; +import fr.themode.minestom.net.packet.server.ServerPacket; +import fr.themode.minestom.net.packet.server.ServerPacketIdentifier; + +public class TabCompletePacket implements ServerPacket { + + public int transactionId; + public int start; + public int length; + public Match[] matches; + + @Override + public void write(PacketWriter writer) { + writer.writeVarInt(transactionId); + writer.writeVarInt(start); + writer.writeVarInt(length); + + writer.writeVarInt(matches.length); + for (Match match : matches) { + writer.writeSizedString(match.match); + writer.writeBoolean(match.hasTooltip); + if (match.hasTooltip) + writer.writeSizedString(match.tooltip); + } + } + + @Override + public int getId() { + return ServerPacketIdentifier.TAB_COMPLETE; + } + + public static class Match { + public String match; + public boolean hasTooltip; + public String tooltip; // Chat + } + +} diff --git a/src/main/java/fr/themode/minestom/net/packet/server/play/UpdateLightPacket.java b/src/main/java/fr/themode/minestom/net/packet/server/play/UpdateLightPacket.java new file mode 100644 index 000000000..4a79ed47a --- /dev/null +++ b/src/main/java/fr/themode/minestom/net/packet/server/play/UpdateLightPacket.java @@ -0,0 +1,42 @@ +package fr.themode.minestom.net.packet.server.play; + +import fr.themode.minestom.net.packet.PacketWriter; +import fr.themode.minestom.net.packet.server.ServerPacket; +import fr.themode.minestom.net.packet.server.ServerPacketIdentifier; + +public class UpdateLightPacket implements ServerPacket { + + public int chunkX; + public int chunkZ; + + public int skyLightMask; + public int blockLightMask; + + public int emptySkyLightMask; + public int emptyBlockLightMask; + + public byte[] skyLight; + public byte[] blockLight; + + @Override + public void write(PacketWriter writer) { + writer.writeVarInt(chunkX); + writer.writeVarInt(chunkZ); + + writer.writeVarInt(skyLightMask); + writer.writeVarInt(blockLightMask); + + writer.writeVarInt(emptySkyLightMask); + writer.writeVarInt(emptyBlockLightMask); + + writer.writeVarInt(2048); // Always 2048 length + writer.writeBytes(skyLight); + writer.writeVarInt(2048); // Always 2048 length + writer.writeBytes(blockLight); + } + + @Override + public int getId() { + return ServerPacketIdentifier.UPDATE_LIGHT; + } +} diff --git a/src/main/java/fr/themode/minestom/registry/RegistryMain.java b/src/main/java/fr/themode/minestom/registry/RegistryMain.java index 28f8040ff..5db2fd015 100644 --- a/src/main/java/fr/themode/minestom/registry/RegistryMain.java +++ b/src/main/java/fr/themode/minestom/registry/RegistryMain.java @@ -60,7 +60,14 @@ public class RegistryMain { Block block = Block.valueOf(registryItem.name); material.setIdentifier(registryItem.itemId, block); } catch (IllegalArgumentException e) { - material.setIdentifier(registryItem.itemId, null); + switch (material) { + case REDSTONE: + material.setIdentifier(registryItem.itemId, Block.REDSTONE_WIRE); + break; + default: + material.setIdentifier(registryItem.itemId, null); + break; + } } } }