diff --git a/connector/src/main/java/org/geysermc/connector/utils/BlockEntityUtils.java b/connector/src/main/java/org/geysermc/connector/network/translators/BlockEntityUtils.java similarity index 69% rename from connector/src/main/java/org/geysermc/connector/utils/BlockEntityUtils.java rename to connector/src/main/java/org/geysermc/connector/network/translators/BlockEntityUtils.java index 45a97f6ec..6096ede89 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/BlockEntityUtils.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/BlockEntityUtils.java @@ -1,9 +1,17 @@ -package org.geysermc.connector.utils; +package org.geysermc.connector.network.translators; -import com.nukkitx.nbt.tag.CompoundTag; +import com.nukkitx.nbt.tag.IntTag; +import com.nukkitx.nbt.tag.StringTag; import com.nukkitx.nbt.tag.Tag; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class BlockEntityUtils { + static final Map MAPPINGS = new HashMap<>(); + public static final String CHEST = "Chest"; public static final String ENDER_CHEST = "EnderChest"; public static final String FURNACE = "Furnace"; @@ -75,5 +83,29 @@ public class BlockEntityUtils { return null; } - //public static Tag getExtraData(CompoundTag tag) + public static List> getExtraTags(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag) { + List> list = new ArrayList<>(); + + try { + MAPPINGS.get(tag.get("id").getValue()).getExtraTags(tag); + } catch (Exception e) { + int x = ((Number) tag.getValue().get("x").getValue()).intValue(); + int y = ((Number) tag.getValue().get("y").getValue()).intValue(); + int z = ((Number) tag.getValue().get("z").getValue()).intValue(); + + String id = BlockEntityUtils.getBedrockID((String) tag.get("id").getValue()); + + list.add(new IntTag("x", x)); + list.add(new IntTag("y", y)); + list.add(new IntTag("z", z)); + + list.add(new StringTag("id", id)); + } + + return list; + } + + public static abstract class ExtraDataMapper { + public abstract List> getExtraTags(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag); + } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java b/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java index d4bc5b45e..582ac5698 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java @@ -48,6 +48,7 @@ import com.nukkitx.protocol.bedrock.packet.*; import lombok.Getter; import org.geysermc.connector.network.translators.bedrock.*; import org.geysermc.connector.network.translators.block.BlockTranslator; +import org.geysermc.connector.network.translators.blockentity.SignDataMapper; import org.geysermc.connector.network.translators.inventory.GenericInventoryTranslator; import org.geysermc.connector.network.translators.inventory.InventoryTranslator; import org.geysermc.connector.network.translators.item.ItemTranslator; @@ -141,6 +142,7 @@ public class TranslatorsInit { Registry.registerJava(ServerTeamPacket.class, new JavaTeamTranslator()); Registry.registerJava(ServerBlockChangePacket.class, new JavaBlockChangeTranslator()); Registry.registerJava(ServerMultiBlockChangePacket.class, new JavaMultiBlockChangeTranslator()); + Registry.registerJava(ServerUpdateTileEntityPacket.class, new JavaUpdateTileEntityPacketTranslator()); Registry.registerJava(ServerOpenWindowPacket.class, new OpenWindowPacketTranslator()); @@ -154,6 +156,8 @@ public class TranslatorsInit { Registry.registerBedrock(InteractPacket.class, new BedrockInteractTranslator()); Registry.registerBedrock(TextPacket.class, new BedrockTextTranslator()); + BlockEntityUtils.MAPPINGS.put("minecraft:sign", new SignDataMapper()); + itemTranslator = new ItemTranslator(); blockTranslator = new BlockTranslator(); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/blockentity/SignDataMapper.java b/connector/src/main/java/org/geysermc/connector/network/translators/blockentity/SignDataMapper.java new file mode 100644 index 000000000..868dda5ae --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/blockentity/SignDataMapper.java @@ -0,0 +1,35 @@ +package org.geysermc.connector.network.translators.blockentity; + +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.nukkitx.nbt.tag.IntTag; +import com.nukkitx.nbt.tag.StringTag; +import com.nukkitx.nbt.tag.Tag; +import org.geysermc.connector.network.translators.BlockEntityUtils; + +import java.util.ArrayList; +import java.util.List; + +public class SignDataMapper extends BlockEntityUtils.ExtraDataMapper { + @Override + public List> getExtraTags(CompoundTag tag) { + List> list = new ArrayList<>(); + + list.add(new StringTag("Text", tag.get("Text1").getValue().toString() + "\n" + + tag.get("Text2").getValue().toString() + "\n" + + tag.get("Text3").getValue().toString() + "\n" + + tag.get("Text4").getValue().toString())); + int x = ((Number) tag.getValue().get("x").getValue()).intValue(); + int y = ((Number) tag.getValue().get("y").getValue()).intValue(); + int z = ((Number) tag.getValue().get("z").getValue()).intValue(); + + String id = BlockEntityUtils.getBedrockID((String) tag.get("id").getValue()); + + list.add(new IntTag("x", x)); + list.add(new IntTag("y", y)); + list.add(new IntTag("z", z)); + + list.add(new StringTag("id", id)); + + return list; + } +} diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaUpdateTileEntityPacketTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaUpdateTileEntityPacketTranslator.java new file mode 100644 index 000000000..a8b1e3a59 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaUpdateTileEntityPacketTranslator.java @@ -0,0 +1,31 @@ +package org.geysermc.connector.network.translators.java.entity; + +import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; +import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTileEntityPacket; +import com.nukkitx.math.vector.Vector3i; +import com.nukkitx.nbt.tag.CompoundTag; +import com.nukkitx.nbt.tag.Tag; +import com.nukkitx.protocol.bedrock.packet.BlockEntityDataPacket; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.BlockEntityUtils; +import org.geysermc.connector.network.translators.PacketTranslator; +import java.util.HashMap; +import java.util.Map; + +public class JavaUpdateTileEntityPacketTranslator extends PacketTranslator { + @Override + public void translate(ServerUpdateTileEntityPacket packet, GeyserSession session) { + BlockEntityDataPacket bedrock = new BlockEntityDataPacket(); + + Position pos = packet.getPosition(); + Map> map = new HashMap<>(); + + for(Tag tag : BlockEntityUtils.getExtraTags(packet.getNbt())) { + map.put(tag.getName(), tag); + } + bedrock.setData(new CompoundTag("", map)); + bedrock.setBlockPosition(Vector3i.from(pos.getX(), pos.getY(), pos.getZ())); + + session.getUpstream().sendPacketImmediately(bedrock); + } +} diff --git a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java index 7d27b4a22..daefb7ba0 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java @@ -9,6 +9,7 @@ import com.nukkitx.nbt.stream.NBTOutputStream; import com.nukkitx.nbt.tag.IntTag; import com.nukkitx.nbt.tag.StringTag; import com.nukkitx.nbt.tag.Tag; +import org.geysermc.connector.network.translators.BlockEntityUtils; import org.geysermc.connector.network.translators.TranslatorsInit; import org.geysermc.connector.network.translators.block.BlockEntry; import org.geysermc.connector.world.chunk.ChunkSection; @@ -38,19 +39,9 @@ public class ChunkUtils { for (CompoundTag tag : column.getTileEntities()) { Map> map = new HashMap<>(); - int x = ((Number) tag.getValue().get("x").getValue()).intValue(); - int y = ((Number) tag.getValue().get("y").getValue()).intValue(); - int z = ((Number) tag.getValue().get("z").getValue()).intValue(); - - String id = BlockEntityUtils.getBedrockID((String) tag.get("id").getValue()); - - System.out.println(id); - - map.put("x", new IntTag("x", x)); - map.put("y", new IntTag("y", y)); - map.put("z", new IntTag("z", z)); - - map.put("id", new StringTag("id", id)); + for(Tag extra : BlockEntityUtils.getExtraTags(tag)) { + map.put(extra.getName(), extra); + } nbtStream.write(new com.nukkitx.nbt.tag.CompoundTag("", map)); }