From c307b91b1060851fc1b3950b47276979d305e549 Mon Sep 17 00:00:00 2001 From: EOT3000 <43685885+EOT3000@users.noreply.github.com> Date: Mon, 18 Nov 2019 21:47:28 -0500 Subject: [PATCH] Attempt to fix signs. Partly worked --- .../network/translators/BlockEntityUtils.java | 18 ++-- .../blockentity/SignDataMapper.java | 36 +++---- .../JavaUpdateTileEntityPacketTranslator.java | 9 +- .../geysermc/connector/utils/ChunkUtils.java | 51 +++++----- .../connector/utils/MessageUtils.java | 98 ++++++++++++++----- 5 files changed, 127 insertions(+), 85 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/BlockEntityUtils.java b/connector/src/main/java/org/geysermc/connector/network/translators/BlockEntityUtils.java index 6096ede89..bb9100c12 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/BlockEntityUtils.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/BlockEntityUtils.java @@ -1,5 +1,7 @@ package org.geysermc.connector.network.translators; +import com.nukkitx.nbt.CompoundTagBuilder; +import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.IntTag; import com.nukkitx.nbt.tag.StringTag; import com.nukkitx.nbt.tag.Tag; @@ -83,11 +85,9 @@ public class BlockEntityUtils { return null; } - public static List> getExtraTags(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag) { - List> list = new ArrayList<>(); - + public static CompoundTag getExtraTags(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag) { try { - MAPPINGS.get(tag.get("id").getValue()).getExtraTags(tag); + return 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(); @@ -95,17 +95,11 @@ public class BlockEntityUtils { 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 CompoundTagBuilder.builder().intTag("x", x).intTag("y", y).intTag("z", z).stringTag("id" , id).build(""); } - - return list; } public static abstract class ExtraDataMapper { - public abstract List> getExtraTags(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag); + public abstract CompoundTag getExtraTags(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag); } } 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 index 868dda5ae..3bf279d57 100644 --- 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 @@ -1,35 +1,37 @@ 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 com.nukkitx.nbt.CompoundTagBuilder; import org.geysermc.connector.network.translators.BlockEntityUtils; - -import java.util.ArrayList; -import java.util.List; +import org.geysermc.connector.utils.MessageUtils; public class SignDataMapper extends BlockEntityUtils.ExtraDataMapper { @Override - public List> getExtraTags(CompoundTag tag) { - List> list = new ArrayList<>(); + public com.nukkitx.nbt.tag.CompoundTag getExtraTags(CompoundTag tag) { + String text = c(tag.get("Text1").getValue().toString()) + "\n" + + c(tag.get("Text2").getValue().toString()) + "\n" + + c(tag.get("Text3").getValue().toString()) + "\n" + + c(tag.get("Text4").getValue().toString()); - 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)); + System.out.println(text); - list.add(new StringTag("id", id)); + return CompoundTagBuilder.builder() + .stringTag("id", id) + .stringTag("Text", text) + .intTag("x", x) + .intTag("y", y) + .intTag("z", z) + .build(""); + } - return list; + //One letter name because I rly don't want to make the code at the top more than whats already there. + private String c(String string) { + return MessageUtils.getBedrockMessage(string); } } 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 index a8b1e3a59..88d389e17 100644 --- 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 @@ -4,13 +4,10 @@ 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 @@ -18,12 +15,8 @@ public class JavaUpdateTileEntityPacketTranslator extends PacketTranslator> map = new HashMap<>(); - for(Tag tag : BlockEntityUtils.getExtraTags(packet.getNbt())) { - map.put(tag.getName(), tag); - } - bedrock.setData(new CompoundTag("", map)); + bedrock.setData(BlockEntityUtils.getExtraTags(packet.getNbt())); 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 daefb7ba0..35baa9e55 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java @@ -2,8 +2,11 @@ package org.geysermc.connector.utils; import com.github.steveice10.mc.protocol.data.game.chunk.Chunk; import com.github.steveice10.mc.protocol.data.game.chunk.Column; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; import com.github.steveice10.mc.protocol.data.game.world.block.BlockState; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.nukkitx.math.vector.Vector3i; +import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.NbtUtils; import com.nukkitx.nbt.stream.NBTOutputStream; import com.nukkitx.nbt.tag.IntTag; @@ -15,8 +18,7 @@ import org.geysermc.connector.network.translators.block.BlockEntry; import org.geysermc.connector.world.chunk.ChunkSection; import java.io.ByteArrayOutputStream; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class ChunkUtils { @@ -27,30 +29,7 @@ public class ChunkUtils { int chunkSectionCount = chunks.length; chunkData.sections = new ChunkSection[chunkSectionCount]; - - for(CompoundTag tag : column.getTileEntities()) { - System.out.println(tag.get("id").getValue()); - } - //Start work on block entities - try { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - NBTOutputStream nbtStream = NbtUtils.createNetworkWriter(stream); - - for (CompoundTag tag : column.getTileEntities()) { - Map> map = new HashMap<>(); - - for(Tag extra : BlockEntityUtils.getExtraTags(tag)) { - map.put(extra.getName(), extra); - } - - nbtStream.write(new com.nukkitx.nbt.tag.CompoundTag("", map)); - } - - chunkData.blockEntities = stream.toByteArray(); - - } catch (Exception e) { - e.printStackTrace(); - } + List tiles = new ArrayList<>(Arrays.asList(column.getTileEntities())); for (int chunkY = 0; chunkY < chunkSectionCount; chunkY++) { chunkData.sections[chunkY] = new ChunkSection(); @@ -78,6 +57,26 @@ public class ChunkUtils { } } } + + //Start work on block entities + try { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + NBTOutputStream nbtStream = NbtUtils.createNetworkWriter(stream); + + for (CompoundTag tag : tiles) { + try { + nbtStream.write(BlockEntityUtils.getExtraTags(tag)); + } catch (Exception e) { + System.out.println(tag); + } + } + + chunkData.blockEntities = stream.toByteArray(); + + } catch (Exception e) { + e.printStackTrace(); + } + return chunkData; } diff --git a/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java b/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java index af499ff7e..3a364788b 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java @@ -11,9 +11,22 @@ import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class MessageUtils { + static { + Map pre = new HashMap<>(); + + for(ChatFormat format : ChatFormat.values()) { + pre.put(format.name().toLowerCase(), format); + } + + FORMATS = pre; + } + + private static final Map FORMATS; public static List getTranslationParams(Message[] messages) { List strings = new ArrayList(); @@ -77,6 +90,43 @@ public class MessageUtils { return builder.toString(); } + public static String getBedrockMessage(String message) { + JsonParser parser = new JsonParser(); + JsonObject object = parser.parse(message).getAsJsonObject(); + + String ret = ""; + + if(object.has("color")) { + ret+=ChatColor.valueOf(object.getAsJsonObject().get("color").getAsString().toUpperCase()); + } + for(String string : FORMATS.keySet()) { + if(object.has(string) && object.get(string).getAsBoolean()) { + ret+=getFormat(FORMATS.get(string)); + } + } + + if(object.has("extra")) { + for(JsonElement element : object.get("extra").getAsJsonArray()) { + if(element.isJsonObject()) { + if(object.has("color")) { + ret+=ChatColor.valueOf(object.getAsJsonObject().get("color").getAsString().toUpperCase()); + } + for(String string : FORMATS.keySet()) { + if(object.has(string) && object.get(string).getAsBoolean()) { + ret+=getFormat(FORMATS.get(string)); + } + } + } else { + ret+=element.getAsString(); + } + } + } + + ret+=object.get("text").getAsString(); + + return ret; + } + private static String getColor(ChatColor color) { String base = "\u00a7"; switch (color) { @@ -141,28 +191,7 @@ public class MessageUtils { private static String getFormat(List formats) { String str = ""; for (ChatFormat cf : formats) { - String base = "\u00a7"; - switch (cf) { - case OBFUSCATED: - base += "k"; - break; - case BOLD: - base += "l"; - break; - case STRIKETHROUGH: - base += "m"; - break; - case UNDERLINED: - base += "n"; - break; - case ITALIC: - base += "o"; - break; - default: - break; - } - - str += base; + str += getFormat(cf); } return str; @@ -208,4 +237,29 @@ public class MessageUtils { return object; } + + public static final String getFormat(ChatFormat cf) { + String base = "\u00a7"; + switch (cf) { + case OBFUSCATED: + base += "k"; + break; + case BOLD: + base += "l"; + break; + case STRIKETHROUGH: + base += "m"; + break; + case UNDERLINED: + base += "n"; + break; + case ITALIC: + base += "o"; + break; + default: + break; + } + + return base; + } }