From 9d9611cbbf7ccebd5e63fed748475c613a201b97 Mon Sep 17 00:00:00 2001 From: EOT3000 <43685885+EOT3000@users.noreply.github.com> Date: Sun, 21 Jul 2019 15:48:36 -0400 Subject: [PATCH 01/10] Start chunk conversions --- .../network/UpstreamPacketHandler.java | 11 +++++++ .../network/translators/TranslatorsInit.java | 21 +----------- .../org/geysermc/connector/utils/Chunks.java | 33 +++++++++++++++++++ .../connector/utils/MessageUtils.java | 4 +++ 4 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 connector/src/main/java/org/geysermc/connector/utils/Chunks.java diff --git a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java index c278cfd42..92c9aa7fb 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -407,7 +407,18 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { public boolean handle(TextPacket packet) { System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + if(packet.getMessage().charAt(0) == '.') { + + ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage().replace(".", "/")); + + session.getDownstream().getSession().send(chatPacket); + + return true; + + } + ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage()); + session.getDownstream().getSession().send(chatPacket); return true; 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 f9a205ac6..1c1d25f90 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 @@ -167,7 +167,7 @@ public class TranslatorsInit { TextPacket textPacket = new TextPacket(); textPacket.setPlatformChatId(""); textPacket.setSourceName(""); - textPacket.setXuid(session.getAuthenticationData().getXboxUUID()); + textPacket.setXuid(""); switch (packet.getType()) { case CHAT: textPacket.setType(TextPacket.Type.CHAT); @@ -192,23 +192,4 @@ public class TranslatorsInit { session.getUpstream().sendPacket(textPacket); }); } - - private static byte[] empty(byte[] b, Vector2i pos) { - ByteBuf by = Unpooled.buffer(); - - GeyserUtils.writePEChunkCoord(by, pos); - - return by.array(); - } - - private static class CanWriteToBB extends ByteArrayOutputStream { - - CanWriteToBB() { - super(8192); - } - - void writeTo(ByteBuf buf) { - buf.writeBytes(super.buf, 0, super.count); - } - } } diff --git a/connector/src/main/java/org/geysermc/connector/utils/Chunks.java b/connector/src/main/java/org/geysermc/connector/utils/Chunks.java new file mode 100644 index 000000000..9edd0393b --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/utils/Chunks.java @@ -0,0 +1,33 @@ +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 lombok.AccessLevel; +import lombok.AllArgsConstructor; + +import java.util.Objects; + +public class Chunks { + + public ChunkData getData(Column c) { + Objects.requireNonNull(c); + + int count = 0; + + for(Chunk chunk : c.getChunks()) { + if(chunk != null) { + count++; + } + } + + return null; + } + + @AllArgsConstructor(access = AccessLevel.PACKAGE) + public static final class ChunkData { + public final int count; + + public final byte[] bytes; + + } +} 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 6cdac23a5..af499ff7e 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/MessageUtils.java @@ -30,6 +30,10 @@ public class MessageUtils { strings.add(""); } + if (translation.getTranslationKey().equals("command.context.here")) { + strings.add(" - no permission or invalid command!"); + } + for (int j = 0; j < getTranslationParams(translation.getTranslationParams()).size(); j++) { strings.add(getTranslationParams(translation.getTranslationParams()).get(j)); } From 75d38abe1d1c95bf636a2eb372504ca904fd0c10 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 21 Jul 2019 15:39:03 -0500 Subject: [PATCH 02/10] Add hand animations --- .../network/UpstreamPacketHandler.java | 9 ++++++- .../network/translators/TranslatorsInit.java | 26 ------------------- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java index c278cfd42..6d0a082f1 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -25,7 +25,9 @@ package org.geysermc.connector.network; +import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.packet.ingame.client.ClientChatPacket; +import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket; import com.nimbusds.jose.JWSObject; import com.nukkitx.protocol.bedrock.handler.BatchHandler; import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler; @@ -120,7 +122,12 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { @Override public boolean handle(AnimatePacket packet) { System.out.println("Handled packet: " + packet.getClass().getSimpleName()); - return false; + switch (packet.getAction()) { + case SWING_ARM: + ClientPlayerSwingArmPacket swingArmPacket = new ClientPlayerSwingArmPacket(Hand.MAIN_HAND); + session.getDownstream().getSession().send(swingArmPacket); + } + return true; } @Override 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 f9a205ac6..4a4cc888a 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 @@ -26,7 +26,6 @@ package org.geysermc.connector.network.translators; import com.flowpowered.math.vector.Vector2f; -import com.flowpowered.math.vector.Vector2i; import com.flowpowered.math.vector.Vector3f; import com.flowpowered.math.vector.Vector3i; import com.github.steveice10.mc.protocol.data.message.TranslationMessage; @@ -36,20 +35,14 @@ import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.NbtUtils; import com.nukkitx.nbt.stream.NBTOutputStream; import com.nukkitx.nbt.tag.CompoundTag; -import com.nukkitx.network.VarInts; import com.nukkitx.protocol.bedrock.data.GamePublishSetting; import com.nukkitx.protocol.bedrock.data.GameRule; import com.nukkitx.protocol.bedrock.packet.*; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufOutputStream; -import io.netty.buffer.Unpooled; -import org.geysermc.connector.utils.GeyserUtils; import org.geysermc.connector.utils.MessageUtils; import org.geysermc.connector.utils.Toolbox; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.HashMap; public class TranslatorsInit { private static final CompoundTag EMPTY_TAG = CompoundTagBuilder.builder().buildRootTag(); @@ -192,23 +185,4 @@ public class TranslatorsInit { session.getUpstream().sendPacket(textPacket); }); } - - private static byte[] empty(byte[] b, Vector2i pos) { - ByteBuf by = Unpooled.buffer(); - - GeyserUtils.writePEChunkCoord(by, pos); - - return by.array(); - } - - private static class CanWriteToBB extends ByteArrayOutputStream { - - CanWriteToBB() { - super(8192); - } - - void writeTo(ByteBuf buf) { - buf.writeBytes(super.buf, 0, super.count); - } - } } From 49dc3bbe6049c68073b0128462bbb749ce1cfd0b Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 21 Jul 2019 15:53:56 -0500 Subject: [PATCH 03/10] Add translators for title/subtitle/actionbar --- .../network/translators/TranslatorsInit.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) 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 4a4cc888a..64cf9fb1d 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 @@ -31,6 +31,7 @@ import com.flowpowered.math.vector.Vector3i; import com.github.steveice10.mc.protocol.data.message.TranslationMessage; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.ServerTitlePacket; import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.NbtUtils; import com.nukkitx.nbt.stream.NBTOutputStream; @@ -65,6 +66,7 @@ public class TranslatorsInit { public static void start() { addLoginPackets(); addChatPackets(); + addTitlePackets(); } private static void addLoginPackets() { @@ -185,4 +187,36 @@ public class TranslatorsInit { session.getUpstream().sendPacket(textPacket); }); } + + public static void addTitlePackets() { + Registry.add(ServerTitlePacket.class, (packet, session) -> { + SetTitlePacket titlePacket = new SetTitlePacket(); + + switch (packet.getAction()) { + case TITLE: + titlePacket.setType(SetTitlePacket.Type.SET_TITLE); + titlePacket.setText(packet.getTitle().getFullText()); + break; + case SUBTITLE: + titlePacket.setType(SetTitlePacket.Type.SET_SUBTITLE); + titlePacket.setText(packet.getSubtitle().getFullText()); + break; + case CLEAR: + case RESET: + titlePacket.setType(SetTitlePacket.Type.RESET_TITLE); + titlePacket.setText(""); + break; + case ACTION_BAR: + titlePacket.setType(SetTitlePacket.Type.SET_ACTIONBAR_MESSAGE); + titlePacket.setText(packet.getActionBar().getFullText()); + break; + } + + titlePacket.setFadeInTime(packet.getFadeIn()); + titlePacket.setFadeOutTime(packet.getFadeOut()); + titlePacket.setStayTime(packet.getStay()); + + session.getUpstream().sendPacket(titlePacket); + }); + } } From d0347c537d0de5c71411ac1de9140700f1d9f865 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 21 Jul 2019 16:18:20 -0500 Subject: [PATCH 04/10] Add debug option to prevent console spam --- .../java/org/geysermc/api/logger/Logger.java | 7 + .../geysermc/connector/GeyserConnector.java | 7 +- .../configuration/GeyserConfiguration.java | 3 + .../connector/console/GeyserLogger.java | 12 +- .../network/ConnectorServerEventHandler.java | 2 +- .../network/UpstreamPacketHandler.java | 271 +++++++++--------- .../network/translators/Registry.java | 2 +- connector/src/main/resources/config.yml | 3 + 8 files changed, 159 insertions(+), 148 deletions(-) diff --git a/api/src/main/java/org/geysermc/api/logger/Logger.java b/api/src/main/java/org/geysermc/api/logger/Logger.java index de836d6ad..7643f2801 100644 --- a/api/src/main/java/org/geysermc/api/logger/Logger.java +++ b/api/src/main/java/org/geysermc/api/logger/Logger.java @@ -61,4 +61,11 @@ public interface Logger { * @param message the message to log */ void debug(String message); + + /** + * Sets if the logger should print debug messages + * + * @param debug if the logger should print debug messages + */ + void setDebug(boolean debug); } diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 3c4879f19..6d2735d0a 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -49,7 +49,6 @@ import org.geysermc.connector.plugin.GeyserPluginManager; import org.geysermc.connector.utils.Toolbox; import java.io.*; -import java.lang.reflect.Field; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -95,12 +94,9 @@ public class GeyserConnector implements Connector { instance = this; this.generalThreadPool = Executors.newScheduledThreadPool(32); //TODO: Make configurable value - this.logger = GeyserLogger.DEFAULT; - ConsoleCommandReader consoleReader = new ConsoleCommandReader(this); - consoleReader.startConsole(); logger.info("******************************************"); @@ -128,12 +124,13 @@ public class GeyserConnector implements Connector { shutdown(); } + logger.setDebug(config.isDebugMode()); + Toolbox.CACHED_PALLETE.array(); TranslatorsInit.start(); commandMap = new GeyserCommandMap(this); - remoteServer = new RemoteJavaServer(config.getRemote().getAddress(), config.getRemote().getPort()); Geyser.setConnector(this); diff --git a/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java index 5cdb2c7ad..fad955051 100644 --- a/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java +++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java @@ -39,4 +39,7 @@ public class GeyserConfiguration { @JsonProperty("max-players") private int maxPlayers; + + @JsonProperty("debug-mode") + private boolean debugMode; } \ No newline at end of file diff --git a/connector/src/main/java/org/geysermc/connector/console/GeyserLogger.java b/connector/src/main/java/org/geysermc/connector/console/GeyserLogger.java index da76a3086..1debdedc1 100644 --- a/connector/src/main/java/org/geysermc/connector/console/GeyserLogger.java +++ b/connector/src/main/java/org/geysermc/connector/console/GeyserLogger.java @@ -37,12 +37,11 @@ import java.util.logging.*; public class GeyserLogger implements org.geysermc.api.logger.Logger { private boolean colored = true; - private boolean debug = true; + private boolean debug = false; public static final GeyserLogger DEFAULT = new GeyserLogger(); private GeyserLogger() { - ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.INFO); consoleHandler.setFormatter(new SimpleFormatter() { @@ -117,7 +116,9 @@ public class GeyserLogger implements org.geysermc.api.logger.Logger { @Override public void debug(String message) { waitFor(); - System.out.println(printConsole(ChatColor.GRAY + message, colored)); + + if (debug) + System.out.println(printConsole(ChatColor.GRAY + message, colored)); } private synchronized void waitFor() { @@ -130,4 +131,9 @@ public class GeyserLogger implements org.geysermc.api.logger.Logger { public static String printConsole(String message, boolean colors) { return colors ? ChatColor.toANSI(message + ChatColor.RESET) : ChatColor.stripColors(message + ChatColor.RESET); } + + @Override + public void setDebug(boolean debug) { + this.debug = debug; + } } diff --git a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java index ae1b779b6..68e47447f 100644 --- a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java @@ -53,7 +53,7 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler { @Override public BedrockPong onQuery(InetSocketAddress inetSocketAddress) { - GeyserLogger.DEFAULT.info(inetSocketAddress + " has pinged you!"); + GeyserLogger.DEFAULT.debug(inetSocketAddress + " has pinged you!"); GeyserConfiguration config = connector.getConfig(); BedrockPong pong = new BedrockPong(); pong.setEdition("MCPE"); diff --git a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java index 6d0a082f1..8b588e6f4 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -52,10 +52,9 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { @Override public boolean handle(LoginPacket loginPacket) { - System.err.println("Handled " + loginPacket.getClass().getSimpleName()); // TODO: Implement support for multiple protocols if (loginPacket.getProtocolVersion() != GeyserConnector.BEDROCK_PACKET_CODEC.getProtocolVersion()) { - System.out.println("unsupported"); + connector.getLogger().debug("unsupported"); session.getUpstream().disconnect("Unsupported Bedrock version. Are you running an outdated version?"); return true; } @@ -78,12 +77,8 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { return true; } - - PlayStatusPacket playStatus = new PlayStatusPacket(); - playStatus.setStatus(PlayStatusPacket.Status.LOGIN_SUCCESS); - session.getUpstream().sendPacketImmediately(playStatus); ResourcePacksInfoPacket resourcePacksInfo = new ResourcePacksInfoPacket(); @@ -93,7 +88,7 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { @Override public boolean handle(ResourcePackClientResponsePacket textPacket) { - System.err.println("Handled " + textPacket.getClass().getSimpleName()); + connector.getLogger().debug("Handled " + textPacket.getClass().getSimpleName()); switch (textPacket.getStatus()) { case COMPLETED: session.connect(connector.getRemoteServer()); @@ -115,13 +110,13 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { @Override public boolean handle(AdventureSettingsPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AnimatePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); switch (packet.getAction()) { case SWING_ARM: ClientPlayerSwingArmPacket swingArmPacket = new ClientPlayerSwingArmPacket(Hand.MAIN_HAND); @@ -132,55 +127,55 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { @Override public boolean handle(BlockEntityDataPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(BlockPickRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(BookEditPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ClientCacheBlobStatusPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ClientCacheMissResponsePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ClientCacheStatusPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ClientToServerHandshakePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(CommandBlockUpdatePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(CommandRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); ClientChatPacket chatPacket = new ClientChatPacket(packet.getCommand()); session.getDownstream().getSession().send(chatPacket); @@ -190,229 +185,229 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { @Override public boolean handle(ContainerClosePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(CraftingEventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(EntityEventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(EntityFallPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(EntityPickRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(EventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(InteractPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(InventoryContentPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(InventorySlotPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(InventoryTransactionPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ItemFrameDropItemPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(LabTablePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(LecternUpdatePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(LevelEventGenericPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(LevelSoundEventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(LevelSoundEvent3Packet packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(MapInfoRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(MobArmorEquipmentPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(MobEquipmentPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ModalFormResponsePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(MoveEntityAbsolutePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(MovePlayerPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(NetworkStackLatencyPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PhotoTransferPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PlayerActionPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PlayerHotbarPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PlayerInputPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PlayerSkinPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PurchaseReceiptPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(RequestChunkRadiusPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ResourcePackChunkRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(RiderJumpPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ServerSettingsRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetDefaultGameTypePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetLocalPlayerAsInitializedPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetPlayerGameTypePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SubClientLoginPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(TextPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage()); session.getDownstream().getSession().send(chatPacket); @@ -422,493 +417,493 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { @Override public boolean handle(AddBehaviorTreePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AddEntityPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AddHangingEntityPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AddItemEntityPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AddPaintingPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AddPlayerPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AvailableCommandsPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(BlockEventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(BossEventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(CameraPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ChangeDimensionPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ChunkRadiusUpdatedPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ClientboundMapItemDataPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(CommandOutputPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ContainerOpenPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ContainerSetDataPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(CraftingDataPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(DisconnectPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ExplodePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(LevelChunkPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(GameRulesChangedPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(GuiDataPickItemPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(HurtArmorPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AutomationClientConnectPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(LevelEventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(MapCreateLockedCopyPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(MobEffectPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ModalFormRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(MoveEntityDeltaPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(NpcRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(OnScreenTextureAnimationPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PlayerListPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PlaySoundPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(PlayStatusPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(RemoveEntityPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(RemoveObjectivePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ResourcePackChunkDataPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ResourcePackDataInfoPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ResourcePacksInfoPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ResourcePackStackPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(RespawnPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ScriptCustomEventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ServerSettingsResponsePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ServerToClientHandshakePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetCommandsEnabledPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetDifficultyPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetDisplayObjectivePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetEntityDataPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetEntityLinkPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetEntityMotionPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetHealthPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetLastHurtByPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetScoreboardIdentityPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetScorePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetSpawnPositionPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetTimePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SetTitlePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ShowCreditsPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ShowProfilePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(ShowStoreOfferPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SimpleEventPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SpawnExperienceOrbPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(StartGamePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(StopSoundPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(StructureBlockUpdatePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(StructureTemplateDataExportRequestPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(StructureTemplateDataExportResponsePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(TakeItemEntityPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(TransferPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(UpdateAttributesPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(UpdateBlockPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(UpdateBlockPropertiesPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(UpdateBlockSyncedPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(UpdateEquipPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(UpdateSoftEnumPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(UpdateTradePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(AvailableEntityIdentifiersPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(BiomeDefinitionListPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(LevelSoundEvent2Packet packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(NetworkChunkPublisherUpdatePacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(SpawnParticleEffectPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } @Override public boolean handle(VideoStreamConnectPacket packet) { - System.out.println("Handled packet: " + packet.getClass().getSimpleName()); + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); return false; } } \ No newline at end of file diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java b/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java index 463453d15..082947886 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java @@ -48,7 +48,7 @@ public class Registry { try { ((BiConsumer) JAVA.MAP.get(clazz)).accept(p, s); } catch (NullPointerException e) { - GeyserLogger.DEFAULT.warning("could not translate packet " + p.getClass().getSimpleName()); + GeyserLogger.DEFAULT.debug("could not translate packet " + p.getClass().getSimpleName()); } } } diff --git a/connector/src/main/resources/config.yml b/connector/src/main/resources/config.yml index 699683ebb..885e5cf7c 100644 --- a/connector/src/main/resources/config.yml +++ b/connector/src/main/resources/config.yml @@ -27,6 +27,9 @@ ping-passthrough: false # Maximum amount of players that can connect max-players: 100 +# If debug messages should be sent through console +debug-mode: false + From 82f56a7c345b1640dfa20294000723c83f6c59fc Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 21 Jul 2019 17:22:56 -0500 Subject: [PATCH 05/10] Code cleanups --- .../network/ConnectorServerEventHandler.java | 4 --- .../network/UpstreamPacketHandler.java | 1 - .../network/translators/Registry.java | 3 +- .../network/translators/TranslatorsInit.java | 15 +++------- .../geysermc/connector/plugin/PluginYML.java | 1 + .../org/geysermc/connector/utils/Toolbox.java | 28 ++----------------- 6 files changed, 8 insertions(+), 44 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java index 68e47447f..f80a6f4a8 100644 --- a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java @@ -29,7 +29,6 @@ import com.nukkitx.protocol.bedrock.BedrockPong; import com.nukkitx.protocol.bedrock.BedrockServerEventHandler; import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.v361.Bedrock_v361; -import org.geysermc.api.Geyser; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.console.GeyserLogger; @@ -77,7 +76,4 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler { bedrockServerSession.addDisconnectHandler((x) -> GeyserLogger.DEFAULT.warning("Bedrock user with ip: " + bedrockServerSession.getAddress().getAddress() + " has disconnected for reason " + x)); bedrockServerSession.setPacketCodec(Bedrock_v361.V361_CODEC); } - - - } \ No newline at end of file diff --git a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java index 8b588e6f4..a331f50d4 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -29,7 +29,6 @@ import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.packet.ingame.client.ClientChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket; import com.nimbusds.jose.JWSObject; -import com.nukkitx.protocol.bedrock.handler.BatchHandler; import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler; import com.nukkitx.protocol.bedrock.packet.*; import net.minidev.json.JSONArray; diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java b/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java index 082947886..ad0e8c21a 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java @@ -26,16 +26,15 @@ package org.geysermc.connector.network.translators; import com.github.steveice10.packetlib.packet.Packet; -import org.geysermc.api.Geyser; import org.geysermc.connector.console.GeyserLogger; import org.geysermc.connector.network.session.GeyserSession; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; -import java.util.function.Consumer; public class Registry { + private final Map, BiConsumer> MAP = new HashMap<>(); public static final Registry JAVA = new Registry<>(); 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 64cf9fb1d..5c18b44d7 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 @@ -46,6 +46,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; public class TranslatorsInit { + private static final CompoundTag EMPTY_TAG = CompoundTagBuilder.builder().buildRootTag(); private static final byte[] EMPTY_LEVEL_CHUNK_DATA; @@ -127,15 +128,10 @@ public class TranslatorsInit { session.getUpstream().sendPacket(startGamePacket); Vector3f pos = new Vector3f(0, 0, 0); - int chunkX = pos.getFloorX() >> 4; - int chunkZ = pos.getFloorZ() >> 4; - for (int x = -3; x < 3; x++) { - for (int z = -3; z < 3; z++) { - LevelChunkPacket data = new LevelChunkPacket(); data.setChunkX(chunkX + x); data.setChunkZ(chunkZ + z); @@ -146,14 +142,11 @@ public class TranslatorsInit { session.getUpstream().sendPacketImmediately(data); } - } - PlayStatusPacket packet1 = new PlayStatusPacket(); - - packet1.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); - - session.getUpstream().sendPacket(packet1); + PlayStatusPacket playStatusPacket = new PlayStatusPacket(); + playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); + session.getUpstream().sendPacket(playStatusPacket); }); } diff --git a/connector/src/main/java/org/geysermc/connector/plugin/PluginYML.java b/connector/src/main/java/org/geysermc/connector/plugin/PluginYML.java index 6da174818..154253692 100644 --- a/connector/src/main/java/org/geysermc/connector/plugin/PluginYML.java +++ b/connector/src/main/java/org/geysermc/connector/plugin/PluginYML.java @@ -28,6 +28,7 @@ package org.geysermc.connector.plugin; import com.fasterxml.jackson.annotation.JsonProperty; public class PluginYML { + @JsonProperty("name") String name; diff --git a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java index f7dfc4804..4a54bb018 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java +++ b/connector/src/main/java/org/geysermc/connector/utils/Toolbox.java @@ -11,12 +11,10 @@ import java.io.InputStream; import java.util.*; public class Toolbox { + static { - InputStream stream = Toolbox.class.getClassLoader().getResourceAsStream("cached_pallete.json"); - ObjectMapper mapper = new ObjectMapper(); - ArrayList> entries = new ArrayList<>(); try { @@ -26,9 +24,7 @@ public class Toolbox { } ByteBuf b = Unpooled.buffer(); - VarInts.writeUnsignedInt(b, entries.size()); - for (Map e : entries) { BedrockUtils.writeString(b, (String) e.get("name")); b.writeShortLE((int) e.get("data")); @@ -37,16 +33,12 @@ public class Toolbox { CACHED_PALLETE = b; - - - InputStream stream2 = Toolbox.class.getClassLoader().getResourceAsStream("items.json"); if (stream2 == null) { throw new AssertionError("Items Table not found"); } ObjectMapper mapper2 = new ObjectMapper(); - ArrayList s = new ArrayList<>(); try { s = mapper2.readValue(stream2, ArrayList.class); @@ -55,26 +47,11 @@ public class Toolbox { } ArrayList l = new ArrayList<>(); - - for(HashMap e : s) { + for (HashMap e : s) { l.add(new StartGamePacket.ItemEntry((String) e.get("name"), (short) ((int) e.get("id")))); } ITEMS = l; - - /*ByteBuf serializer; - - serializer = Unpooled.buffer(); - serializer.writeShortLE(1); - GeyserUtils.writeVarIntByteArray(serializer, (chunkdata) -> { - GeyserUtils.writeEmptySubChunk(chunkdata); - chunkdata.writeZero(512); - chunkdata.writeZero(256); - chunkdata.writeByte(0); - }); - - EMPTY_CHUNK = GeyserUtils.readAllBytes(serializer);*/ - } public static final Collection ITEMS; @@ -82,5 +59,4 @@ public class Toolbox { public static final ByteBuf CACHED_PALLETE; //public static final byte[] EMPTY_CHUNK; - } \ No newline at end of file From a01a07aee35d094fcc83d2e6e6bd847f5490a342 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 21 Jul 2019 17:36:45 -0500 Subject: [PATCH 06/10] Add time translator --- .../network/translators/TranslatorsInit.java | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 5c18b44d7..55107a5a3 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 @@ -32,6 +32,7 @@ import com.github.steveice10.mc.protocol.data.message.TranslationMessage; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerTitlePacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTimePacket; import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.NbtUtils; import com.nukkitx.nbt.stream.NBTOutputStream; @@ -68,6 +69,7 @@ public class TranslatorsInit { addLoginPackets(); addChatPackets(); addTitlePackets(); + addTimePackets(); } private static void addLoginPackets() { @@ -212,4 +214,13 @@ public class TranslatorsInit { session.getUpstream().sendPacket(titlePacket); }); } + + public static void addTimePackets() { + Registry.add(ServerUpdateTimePacket.class, (packet, session) -> { + SetTimePacket setTimePacket = new SetTimePacket(); + setTimePacket.setTime((int) Math.abs(packet.getTime())); + + session.getUpstream().sendPacket(setTimePacket); + }); + } } From 58819ea9ceba53dd9157e2c0bb853a4df826bb17 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 21 Jul 2019 18:52:30 -0500 Subject: [PATCH 07/10] Finish ping-passthrough option --- .../geysermc/connector/GeyserConnector.java | 9 +++++ .../network/ConnectorServerEventHandler.java | 21 ++++++++-- .../thread/PingPassthroughThread.java | 40 +++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 connector/src/main/java/org/geysermc/connector/thread/PingPassthroughThread.java diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 6d2735d0a..50ec067b9 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -46,12 +46,14 @@ import org.geysermc.connector.network.remote.RemoteJavaServer; import org.geysermc.connector.network.translators.TranslatorsInit; import org.geysermc.connector.plugin.GeyserPluginLoader; import org.geysermc.connector.plugin.GeyserPluginManager; +import org.geysermc.connector.thread.PingPassthroughThread; import org.geysermc.connector.utils.Toolbox; import java.io.*; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; public class GeyserConnector implements Connector { @@ -83,6 +85,9 @@ public class GeyserConnector implements Connector { @Getter private final ScheduledExecutorService generalThreadPool; + @Getter + private PingPassthroughThread passthroughThread; + public static void main(String[] args) { instance = new GeyserConnector(); } @@ -138,6 +143,10 @@ public class GeyserConnector implements Connector { pluginManager = new GeyserPluginManager(new GeyserPluginLoader(this)); pluginManager.getLoader().loadPlugins(); + passthroughThread = new PingPassthroughThread(this); + if (config.isPingPassthrough()) + generalThreadPool.scheduleAtFixedRate(passthroughThread, 1, 1, TimeUnit.SECONDS); + BedrockServer bedrockServer = new BedrockServer(new InetSocketAddress(config.getBedrock().getAddress(), config.getBedrock().getPort())); bedrockServer.setHandler(new ConnectorServerEventHandler(this)); bedrockServer.bind().whenComplete((avoid, throwable) -> { diff --git a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java index f80a6f4a8..b43025acf 100644 --- a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java @@ -25,6 +25,7 @@ package org.geysermc.connector.network; +import com.github.steveice10.mc.protocol.data.status.ServerStatusInfo; import com.nukkitx.protocol.bedrock.BedrockPong; import com.nukkitx.protocol.bedrock.BedrockServerEventHandler; import com.nukkitx.protocol.bedrock.BedrockServerSession; @@ -33,6 +34,7 @@ import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.console.GeyserLogger; import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.utils.MessageUtils; import java.net.InetSocketAddress; @@ -56,16 +58,27 @@ public class ConnectorServerEventHandler implements BedrockServerEventHandler { GeyserConfiguration config = connector.getConfig(); BedrockPong pong = new BedrockPong(); pong.setEdition("MCPE"); - pong.setMotd(config.getBedrock().getMotd1()); - pong.setSubMotd(config.getBedrock().getMotd2()); - pong.setPlayerCount(2); - pong.setMaximumPlayerCount(config.getMaxPlayers()); pong.setGameType("Default"); pong.setNintendoLimited(false); pong.setProtocolVersion(GeyserConnector.BEDROCK_PACKET_CODEC.getProtocolVersion()); pong.setVersion("1.12.0"); pong.setIpv4Port(19132); + if (connector.getConfig().isPingPassthrough()) { + ServerStatusInfo serverInfo = connector.getPassthroughThread().getInfo(); + + if (serverInfo != null) { + pong.setMotd(MessageUtils.getBedrockMessage(serverInfo.getDescription())); + pong.setSubMotd(config.getBedrock().getMotd2()); + pong.setPlayerCount(serverInfo.getPlayerInfo().getOnlinePlayers()); + pong.setMaximumPlayerCount(serverInfo.getPlayerInfo().getMaxPlayers()); + } + } else { + pong.setPlayerCount(1); + pong.setMaximumPlayerCount(config.getMaxPlayers()); + pong.setMotd(config.getBedrock().getMotd1()); + pong.setSubMotd(config.getBedrock().getMotd2()); + } return pong; } diff --git a/connector/src/main/java/org/geysermc/connector/thread/PingPassthroughThread.java b/connector/src/main/java/org/geysermc/connector/thread/PingPassthroughThread.java new file mode 100644 index 000000000..ce7e54a0b --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/thread/PingPassthroughThread.java @@ -0,0 +1,40 @@ +package org.geysermc.connector.thread; + +import com.github.steveice10.mc.protocol.MinecraftConstants; +import com.github.steveice10.mc.protocol.MinecraftProtocol; +import com.github.steveice10.mc.protocol.data.SubProtocol; +import com.github.steveice10.mc.protocol.data.status.ServerStatusInfo; +import com.github.steveice10.mc.protocol.data.status.handler.ServerInfoHandler; +import com.github.steveice10.packetlib.Client; +import com.github.steveice10.packetlib.tcp.TcpSessionFactory; +import lombok.Getter; +import org.geysermc.connector.GeyserConnector; + +public class PingPassthroughThread implements Runnable { + + private GeyserConnector connector; + + public PingPassthroughThread(GeyserConnector connector) { + this.connector = connector; + } + + @Getter + private ServerStatusInfo info; + + private Client client; + + @Override + public void run() { + try { + this.client = new Client(connector.getConfig().getRemote().getAddress(), connector.getConfig().getRemote().getPort(), new MinecraftProtocol(SubProtocol.STATUS), new TcpSessionFactory()); + this.client.getSession().setFlag(MinecraftConstants.SERVER_INFO_HANDLER_KEY, (ServerInfoHandler) (session, info) -> { + this.info = info; + this.client.getSession().disconnect(null); + }); + + client.getSession().connect(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } +} From ccb52007fc46fbbf7f3be7a4bc01acb762bf4101 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 21 Jul 2019 19:52:20 -0500 Subject: [PATCH 08/10] Allow connected sessions to run Geyser commands --- .../network/UpstreamPacketHandler.java | 16 +++++----- .../network/session/GeyserSession.java | 30 +++++++++++++++++-- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java index 757fc714e..44d69aaea 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -176,8 +176,13 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { public boolean handle(CommandRequestPacket packet) { connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); - ClientChatPacket chatPacket = new ClientChatPacket(packet.getCommand()); - session.getDownstream().getSession().send(chatPacket); + String command = packet.getCommand().replace("/", ""); + if (connector.getCommandMap().getCommands().containsKey(command)) { + connector.getCommandMap().runCommand(session, command); + } else { + ClientChatPacket chatPacket = new ClientChatPacket(packet.getCommand()); + session.getDownstream().getSession().send(chatPacket); + } return true; } @@ -408,18 +413,13 @@ public class UpstreamPacketHandler implements BedrockPacketHandler { public boolean handle(TextPacket packet) { connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); - if(packet.getMessage().charAt(0) == '.') { - + if (packet.getMessage().charAt(0) == '.') { ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage().replace(".", "/")); - session.getDownstream().getSession().send(chatPacket); - return true; - } ClientChatPacket chatPacket = new ClientChatPacket(packet.getMessage()); - session.getDownstream().getSession().send(chatPacket); return true; diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index 42f965479..07a40f4fb 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -31,20 +31,21 @@ import com.github.steveice10.packetlib.event.session.ConnectedEvent; import com.github.steveice10.packetlib.event.session.DisconnectedEvent; import com.github.steveice10.packetlib.event.session.PacketReceivedEvent; import com.github.steveice10.packetlib.event.session.SessionAdapter; -import com.github.steveice10.packetlib.packet.Packet; import com.github.steveice10.packetlib.tcp.TcpSessionFactory; import com.nukkitx.network.util.DisconnectReason; import com.nukkitx.protocol.PlayerSession; import com.nukkitx.protocol.bedrock.BedrockServerSession; +import com.nukkitx.protocol.bedrock.packet.TextPacket; import lombok.AllArgsConstructor; import lombok.Getter; +import org.geysermc.api.command.CommandSender; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.network.remote.RemoteJavaServer; import org.geysermc.connector.network.translators.Registry; import java.util.UUID; -public class GeyserSession implements PlayerSession { +public class GeyserSession implements PlayerSession, CommandSender { private GeyserConnector connector; @@ -126,6 +127,31 @@ public class GeyserSession implements PlayerSession { authenticationData = new AuthenticationData(name, uuid, xboxUUID); } + @Override + public String getName() { + return authenticationData.getName(); + } + + @Override + public void sendMessage(String message) { + TextPacket textPacket = new TextPacket(); + textPacket.setPlatformChatId(""); + textPacket.setSourceName(""); + textPacket.setXuid(""); + textPacket.setType(TextPacket.Type.CHAT); + textPacket.setNeedsTranslation(false); + textPacket.setMessage(message); + + upstream.sendPacket(textPacket); + } + + @Override + public void sendMessage(String[] messages) { + for (String message : messages) { + sendMessage(message); + } + } + @Getter @AllArgsConstructor public class AuthenticationData { From a2633ea76c2a2eeddb8ccea37060051ac83536ca Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sun, 21 Jul 2019 20:11:55 -0500 Subject: [PATCH 09/10] Add some entity translators --- .../network/translators/TranslatorsInit.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) 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 55107a5a3..61e2b1354 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 @@ -32,6 +32,10 @@ import com.github.steveice10.mc.protocol.data.message.TranslationMessage; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerTitlePacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityTeleportPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityVelocityPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTimePacket; import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.NbtUtils; @@ -70,6 +74,7 @@ public class TranslatorsInit { addChatPackets(); addTitlePackets(); addTimePackets(); + addEntityPackets(); } private static void addLoginPackets() { @@ -223,4 +228,47 @@ public class TranslatorsInit { session.getUpstream().sendPacket(setTimePacket); }); } + + public static void addEntityPackets() { + Registry.add(ServerEntityPositionPacket.class, (packet, session) -> { + MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket(); + moveEntityPacket.setRuntimeEntityId(packet.getEntityId()); + moveEntityPacket.setPosition(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ())); + moveEntityPacket.setRotation(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ())); + moveEntityPacket.setOnGround(packet.isOnGround()); + moveEntityPacket.setTeleported(false); + + session.getUpstream().sendPacket(moveEntityPacket); + }); + + Registry.add(ServerEntityPositionRotationPacket.class, (packet, session) -> { + MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket(); + moveEntityPacket.setRuntimeEntityId(packet.getEntityId()); + moveEntityPacket.setPosition(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ())); + moveEntityPacket.setRotation(new Vector3f(packet.getMovementX(), packet.getMovementY(), packet.getMovementZ())); + moveEntityPacket.setOnGround(true); + moveEntityPacket.setTeleported(false); + + session.getUpstream().sendPacket(moveEntityPacket); + }); + + Registry.add(ServerEntityTeleportPacket.class, (packet, session) -> { + MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket(); + moveEntityPacket.setRuntimeEntityId(packet.getEntityId()); + moveEntityPacket.setPosition(new Vector3f(packet.getX(), packet.getY(), packet.getZ())); + moveEntityPacket.setRotation(new Vector3f(packet.getX(), packet.getY(), packet.getZ())); + moveEntityPacket.setOnGround(packet.isOnGround()); + moveEntityPacket.setTeleported(true); + + session.getUpstream().sendPacket(moveEntityPacket); + }); + + Registry.add(ServerEntityVelocityPacket.class, (packet, session) -> { + SetEntityMotionPacket entityMotionPacket = new SetEntityMotionPacket(); + entityMotionPacket.setRuntimeEntityId(packet.getEntityId()); + entityMotionPacket.setMotion(new Vector3f(packet.getMotionX(), packet.getMotionY(), packet.getMotionZ())); + + session.getUpstream().sendPacket(entityMotionPacket); + }); + } } From 00a2b4fc0ccb849aa1d8562eb94f569696abe634 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Mon, 22 Jul 2019 01:52:56 -0500 Subject: [PATCH 10/10] Start work on scoreboard translation --- .../network/session/GeyserSession.java | 6 + .../session/cache/ScoreboardCache.java | 51 +++++++ .../network/translators/TranslatorsInit.java | 136 ++++++++++++++++++ .../network/translators/scoreboard/Score.java | 67 +++++++++ .../translators/scoreboard/Scoreboard.java | 127 ++++++++++++++++ .../scoreboard/ScoreboardObjective.java | 126 ++++++++++++++++ 6 files changed, 513 insertions(+) create mode 100644 connector/src/main/java/org/geysermc/connector/network/session/cache/ScoreboardCache.java create mode 100644 connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/Score.java create mode 100644 connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/Scoreboard.java create mode 100644 connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/ScoreboardObjective.java diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index 07a40f4fb..e6136352f 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -41,6 +41,7 @@ import lombok.Getter; import org.geysermc.api.command.CommandSender; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.network.remote.RemoteJavaServer; +import org.geysermc.connector.network.session.cache.ScoreboardCache; import org.geysermc.connector.network.translators.Registry; import java.util.UUID; @@ -63,11 +64,16 @@ public class GeyserSession implements PlayerSession, CommandSender { @Getter private AuthenticationData authenticationData; + @Getter + private ScoreboardCache scoreboardCache; + private boolean closed; public GeyserSession(GeyserConnector connector, BedrockServerSession bedrockServerSession) { this.connector = connector; this.upstream = bedrockServerSession; + + this.scoreboardCache = new ScoreboardCache(this); } public void connect(RemoteJavaServer remoteServer) { diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/ScoreboardCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/ScoreboardCache.java new file mode 100644 index 000000000..fb5bc7ba7 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/ScoreboardCache.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2019 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.network.session.cache; + +import com.nukkitx.protocol.bedrock.packet.RemoveObjectivePacket; +import lombok.Getter; +import lombok.Setter; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.scoreboard.Scoreboard; + +public class ScoreboardCache { + + private GeyserSession session; + + public ScoreboardCache(GeyserSession session) { + this.session = session; + } + + @Getter + @Setter + private Scoreboard scoreboard; + + public void removeScoreboard() { + RemoveObjectivePacket removeObjectivePacket = new RemoveObjectivePacket(); + removeObjectivePacket.setObjectiveId(scoreboard.getObjective().getObjectiveName()); + session.getUpstream().sendPacket(removeObjectivePacket); + } +} 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 61e2b1354..ca0af7eaf 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 @@ -28,6 +28,7 @@ package org.geysermc.connector.network.translators; import com.flowpowered.math.vector.Vector2f; import com.flowpowered.math.vector.Vector3f; import com.flowpowered.math.vector.Vector3i; +import com.github.steveice10.mc.protocol.data.game.scoreboard.ObjectiveAction; import com.github.steveice10.mc.protocol.data.message.TranslationMessage; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; @@ -36,6 +37,9 @@ import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntit import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityPositionRotationPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityTeleportPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityVelocityPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.scoreboard.ServerDisplayScoreboardPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.scoreboard.ServerScoreboardObjectivePacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.scoreboard.ServerUpdateScorePacket; import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTimePacket; import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.NbtUtils; @@ -44,6 +48,9 @@ import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.protocol.bedrock.data.GamePublishSetting; import com.nukkitx.protocol.bedrock.data.GameRule; import com.nukkitx.protocol.bedrock.packet.*; +import org.geysermc.connector.network.session.cache.ScoreboardCache; +import org.geysermc.connector.network.translators.scoreboard.Scoreboard; +import org.geysermc.connector.network.translators.scoreboard.ScoreboardObjective; import org.geysermc.connector.utils.MessageUtils; import org.geysermc.connector.utils.Toolbox; @@ -75,6 +82,7 @@ public class TranslatorsInit { addTitlePackets(); addTimePackets(); addEntityPackets(); + addScoreboardPackets(); } private static void addLoginPackets() { @@ -271,4 +279,132 @@ public class TranslatorsInit { session.getUpstream().sendPacket(entityMotionPacket); }); } + + public static void addScoreboardPackets() { + Registry.add(ServerDisplayScoreboardPacket.class, (packet, session) -> { + try { + ScoreboardCache cache = session.getScoreboardCache(); + Scoreboard scoreboard = new Scoreboard(session); + + /* + if (cache.getScoreboard() != null) + cache.setScoreboard(scoreboard); + */ + System.out.println("added scoreboard " + packet.getScoreboardName()); + // scoreboard.onUpdate(); + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + + Registry.add(ServerScoreboardObjectivePacket.class, (packet, session) -> { + try { + ScoreboardCache cache = session.getScoreboardCache(); + Scoreboard scoreboard = new Scoreboard(session); + if (cache.getScoreboard() != null) + scoreboard = cache.getScoreboard(); + + + System.out.println("new objective registered with " + packet.getName()); + if (packet.getAction() == ObjectiveAction.ADD || packet.getAction() == ObjectiveAction.UPDATE) { + ScoreboardObjective objective = scoreboard.registerNewObjective(packet.getName()); + objective.setDisplaySlot(ScoreboardObjective.DisplaySlot.SIDEBAR); + objective.setDisplayName(packet.getDisplayName().getFullText()); + } else { + scoreboard.unregisterObjective(packet.getDisplayName().getFullText()); + } + + scoreboard.onUpdate(); + cache.setScoreboard(scoreboard); + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + + Registry.add(ServerUpdateScorePacket.class, (packet, session) -> { + try { + ScoreboardCache cache = session.getScoreboardCache(); + Scoreboard scoreboard = new Scoreboard(session); + if (cache.getScoreboard() != null) + scoreboard = cache.getScoreboard(); + + ScoreboardObjective objective = scoreboard.getObjective(packet.getObjective()); + if (objective == null) { + objective = scoreboard.registerNewObjective(packet.getObjective()); + } + + System.out.println(packet.getEntry() + " <-> objective = " + packet.getObjective() + " val " + packet.getValue()); + switch (packet.getAction()) { + case REMOVE: + objective.registerScore(packet.getObjective(), packet.getEntry(), packet.getValue(), SetScorePacket.Action.REMOVE); + break; + case ADD_OR_UPDATE: + objective.registerScore(packet.getObjective(), packet.getEntry(), packet.getValue(), SetScorePacket.Action.SET); + break; + } + + cache.setScoreboard(scoreboard); + scoreboard.onUpdate(); + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + } + + /* + public static void addScoreboardPackets() { + Registry.add(ServerDisplayScoreboardPacket.class, (packet, session) -> { + SetDisplayObjectivePacket objectivePacket = new SetDisplayObjectivePacket(); + objectivePacket.setCriteria("dummy"); + objectivePacket.setDisplaySlot("sidebar"); + objectivePacket.setDisplayName(packet.getScoreboardName()); + objectivePacket.setSortOrder(1); + objectivePacket.setObjectiveId(UUID.randomUUID().toString()); // uhh + + session.getUpstream().sendPacket(objectivePacket); + + System.out.println("added scoreboard " + packet.getScoreboardName()); + }); + + Registry.add(ServerScoreboardObjectivePacket.class, (packet, session) -> { + if (packet.getAction() == ObjectiveAction.REMOVE) { + RemoveObjectivePacket objectivePacket = new RemoveObjectivePacket(); + objectivePacket.setObjectiveId(packet.getDisplayName().getFullText()); + + session.getUpstream().sendPacket(objectivePacket); + } else { + SetDisplayObjectivePacket objectivePacket = new SetDisplayObjectivePacket(); + objectivePacket.setCriteria("dummy"); + objectivePacket.setDisplaySlot("sidebar"); + objectivePacket.setDisplayName(packet.getDisplayName().getFullText()); + objectivePacket.setSortOrder(1); + objectivePacket.setObjectiveId(packet.getName()); // uhh + + session.getUpstream().sendPacket(objectivePacket); + } + + System.out.println("new objective registered with " + packet.getName()); + }); + + Registry.add(ServerUpdateScorePacket.class, (packet, session) -> { + if (packet.getAction() == ScoreboardAction.ADD_OR_UPDATE) { + SetDisplayObjectivePacket objectivePacket = new SetDisplayObjectivePacket(); + objectivePacket.setObjectiveId(packet.getObjective()); + objectivePacket.setDisplaySlot("sidebar"); + objectivePacket.setCriteria("dummy"); + objectivePacket.setDisplayName(packet.getEntry()); + objectivePacket.setSortOrder(1); + + session.getUpstream().sendPacket(objectivePacket); + } else { + RemoveObjectivePacket objectivePacket = new RemoveObjectivePacket(); + objectivePacket.setObjectiveId(packet.getObjective()); + + session.getUpstream().sendPacket(objectivePacket); + } + + System.out.println(packet.getEntry() + " <-> objective = " + packet.getObjective() + " val " + packet.getValue()); + }); + } + */ } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/Score.java b/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/Score.java new file mode 100644 index 000000000..44937bbc2 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/Score.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2019 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.network.translators.scoreboard; + +import com.nukkitx.protocol.bedrock.packet.SetScorePacket; +import lombok.Getter; +import lombok.Setter; + +import java.util.Random; + +/** + * Adapted from: https://github.com/Ragnok123/GTScoreboard + */ +public class Score { + + @Getter + @Setter + private int score; + + @Getter + private long scoreboardId; + + private ScoreboardObjective objective; + private String fakePlayer; + private long id; + private boolean isFake; + + @Getter + @Setter + private SetScorePacket.Action action = SetScorePacket.Action.SET; + + private boolean modified = false; + + @Getter + @Setter + private String fakeId; + + public Score(ScoreboardObjective objective, String fakePlayer) { + scoreboardId = -new Random().nextLong(); + objective = objective; + fakePlayer = fakePlayer; + isFake = true; + } +} diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/Scoreboard.java b/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/Scoreboard.java new file mode 100644 index 000000000..c3714f969 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/Scoreboard.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2019 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.network.translators.scoreboard; + +import com.nukkitx.protocol.bedrock.data.ScoreInfo; +import com.nukkitx.protocol.bedrock.packet.RemoveObjectivePacket; +import com.nukkitx.protocol.bedrock.packet.SetDisplayObjectivePacket; +import com.nukkitx.protocol.bedrock.packet.SetScorePacket; +import lombok.Getter; +import org.geysermc.connector.network.session.GeyserSession; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +/** + * Adapted from: https://github.com/Ragnok123/GTScoreboard + */ +public class Scoreboard { + + @Getter + private ScoreboardObjective objective; + + private GeyserSession session; + + private long id; + private Map objectiveMap = new HashMap(); + + public Scoreboard(GeyserSession session) { + this.session = session; + + id = new Random().nextLong(); + } + + public ScoreboardObjective registerNewObjective(String objectiveName) { + ScoreboardObjective objective = new ScoreboardObjective(); + objective.setObjectiveName(objectiveName); + this.objective = objective; + if (!objectiveMap.containsKey(objectiveName)) { + objectiveMap.put(objectiveName, objective); + } + + return objective; + } + + public ScoreboardObjective getObjective(String objectiveName) { + ScoreboardObjective objective = null; + if (objectiveMap.containsKey(objectiveName) && this.objective.getObjectiveName().contains(objectiveName)) { + objective = this.objective; + } + + return objective; + } + + public void setObjective(String objectiveName) { + if (objectiveMap.containsKey(objectiveName)) + objective = objectiveMap.get(objectiveName); + } + + public void unregisterObjective(String objectiveName) { + if (!objectiveMap.containsKey(objectiveName)) + return; + + if (objective.getObjectiveName().equals(objective)) { + objective = null; + } + + objectiveMap.remove(objectiveName); + } + + public void onUpdate() { + RemoveObjectivePacket removeObjectivePacket = new RemoveObjectivePacket(); + removeObjectivePacket.setObjectiveId(objective.getObjectiveName()); + session.getUpstream().sendPacket(removeObjectivePacket); + + SetDisplayObjectivePacket displayObjectivePacket = new SetDisplayObjectivePacket(); + displayObjectivePacket.setObjectiveId(objective.getObjectiveName()); + displayObjectivePacket.setDisplayName(objective.getDisplayName()); + displayObjectivePacket.setCriteria("dummy"); + displayObjectivePacket.setDisplaySlot(ScoreboardObjective.DisplaySlot.SIDEBAR.name()); + displayObjectivePacket.setSortOrder(1); + session.getUpstream().sendPacket(displayObjectivePacket); + + Map fakeMap = new HashMap(); + for (Map.Entry entry : objective.getScores().entrySet()) { + fakeMap.put(entry.getKey(), entry.getValue()); + } + + for (Score score : fakeMap.values()) { + ScoreInfo scoreInfo = new ScoreInfo(score.getScoreboardId(), objective.getObjectiveName(), score.getScore(), score.getFakeId()); + + SetScorePacket setScorePacket = new SetScorePacket(); + setScorePacket.setAction(score.getAction()); + setScorePacket.setInfos(Arrays.asList(scoreInfo)); + session.getUpstream().sendPacket(setScorePacket); + + if (score.getAction() == SetScorePacket.Action.REMOVE) { + String id = score.getFakeId(); + objective.getScores().remove(id); + } + } + } +} diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/ScoreboardObjective.java b/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/ScoreboardObjective.java new file mode 100644 index 000000000..d2178070a --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/scoreboard/ScoreboardObjective.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2019 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.network.translators.scoreboard; + +import com.nukkitx.protocol.bedrock.packet.SetScorePacket; +import lombok.Getter; +import lombok.Setter; +import org.geysermc.connector.console.GeyserLogger; + +import java.util.HashMap; +import java.util.Map; + +/** + * Adapted from: https://github.com/Ragnok123/GTScoreboard + */ +public class ScoreboardObjective { + + @Getter + @Setter + private int scoreboardTick = 0; + + @Getter + @Setter + private String objectiveName; + + @Getter + @Setter + private DisplaySlot displaySlot; + + @Getter + @Setter + private String displayName; + + @Getter + private Map scores = new HashMap(); + + public void registerScore(String id, String fake, int value) { + registerScore(id, fake, value, SetScorePacket.Action.SET); + } + + public void registerScore(String id, String fake, int value, SetScorePacket.Action action) { + Score score = new Score(this, fake); + score.setScore(value); + score.setFakeId(id); + score.setAction(action); + if (!scores.containsKey(id)) { + scores.put(id, score); + } else { + setScore(id, value); + } + } + + public void setScore(String id, int value) { + if (scores.containsKey(id)) { + Score modifiedScore = scores.get(id); + modifiedScore.setScore(value); + scores.remove(id); + scores.put(id, modifiedScore); + } + } + + public void setScoreText(String id, String text) { + if (scores.containsKey(id)) { + Score oldScore = scores.get(id); + oldScore.setAction(SetScorePacket.Action.REMOVE); + oldScore.setFakeId(id + "_old_changed"); + + Score newScore = new Score(this, text); + newScore.setScore(oldScore.getScore()); + newScore.setFakeId(id); + scores.remove(id); + scores.put(id, newScore); + scores.put(id + "_old_changed", oldScore); + } + } + + public int getScore(String id) { + int i = 0; + if (scores.containsKey(id)) { + Score score = scores.get(id); + i = score.getScore(); + } + + return i; + } + + public void resetScore(String id) { + if (scores.containsKey(id)) { + Score modifiedScore = scores.get(id); + modifiedScore.setAction(SetScorePacket.Action.REMOVE); + scores.remove(id); + scores.put(id, modifiedScore); + } + } + + public enum DisplaySlot { + + SIDEBAR, + LIST, + BELOWNAME; + + } +}