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 f58571dc9..50ec067b9 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -46,13 +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.lang.reflect.Field; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; public class GeyserConnector implements Connector { @@ -84,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(); } @@ -95,7 +99,6 @@ 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); @@ -126,6 +129,8 @@ public class GeyserConnector implements Connector { shutdown(); } + logger.setDebug(config.isDebugMode()); + Toolbox.CACHED_PALLETE.array(); TranslatorsInit.start(); @@ -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/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..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,15 +25,16 @@ 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; 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; import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.utils.MessageUtils; import java.net.InetSocketAddress; @@ -53,20 +54,31 @@ 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"); - 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; } @@ -77,7 +89,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 db28f369c..ede584cb4 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.BedrockPacketHandler; import com.nukkitx.protocol.bedrock.packet.*; @@ -49,10 +51,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; } @@ -85,7 +86,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()); @@ -107,299 +108,315 @@ 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()); - return false; + connector.getLogger().debug("Handled packet: " + packet.getClass().getSimpleName()); + switch (packet.getAction()) { + case SWING_ARM: + ClientPlayerSwingArmPacket swingArmPacket = new ClientPlayerSwingArmPacket(Hand.MAIN_HAND); + session.getDownstream().getSession().send(swingArmPacket); + } + return true; } @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); + 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; } @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()); + + 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); @@ -409,493 +426,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/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index fa3ed6caa..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 @@ -27,26 +27,26 @@ package org.geysermc.connector.network.session; import com.github.steveice10.mc.protocol.MinecraftProtocol; import com.github.steveice10.packetlib.Client; -import com.github.steveice10.mc.auth.exception.request.RequestException; 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.tcp.TcpSessionFactory; import com.nukkitx.network.util.DisconnectReason; -import com.nukkitx.protocol.MinecraftSession; import com.nukkitx.protocol.PlayerSession; import com.nukkitx.protocol.bedrock.BedrockServerSession; -import com.nukkitx.protocol.bedrock.packet.AdventureSettingsPacket; +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.session.cache.ScoreboardCache; 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; @@ -59,23 +59,25 @@ public class GeyserSession implements PlayerSession { @Getter private Client downstream; + private final GeyserSession THIS = this; + @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) { - MinecraftProtocol protocol = null; - try { - protocol = new MinecraftProtocol(connector.getConfig().getRemote().getEmail(), connector.getConfig().getRemote().getPassword()); - } catch (RequestException e) { - e.printStackTrace(); - } + MinecraftProtocol protocol = new MinecraftProtocol(authenticationData.getName()); downstream = new Client(remoteServer.getAddress(), remoteServer.getPort(), protocol, new TcpSessionFactory()); downstream.getSession().addListener(new SessionAdapter() { @@ -92,7 +94,7 @@ public class GeyserSession implements PlayerSession { @Override public void packetReceived(PacketReceivedEvent event) { - Registry.JAVA.translate(event.getPacket().getClass(), event.getPacket(), GeyserSession.this); + Registry.JAVA.translate(event.getPacket().getClass(), event.getPacket(), THIS); } }); @@ -131,8 +133,29 @@ public class GeyserSession implements PlayerSession { authenticationData = new AuthenticationData(name, uuid, xboxUUID); } - public BedrockServerSession getUpstream() { - return upstream; + @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 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/Registry.java b/connector/src/main/java/org/geysermc/connector/network/translators/Registry.java index 463453d15..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<>(); @@ -48,7 +47,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/java/org/geysermc/connector/network/translators/TranslatorsInit.java b/connector/src/main/java/org/geysermc/connector/network/translators/TranslatorsInit.java index f9a205ac6..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 @@ -26,32 +26,39 @@ 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.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; +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.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; 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.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; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.HashMap; public class TranslatorsInit { + private static final CompoundTag EMPTY_TAG = CompoundTagBuilder.builder().buildRootTag(); private static final byte[] EMPTY_LEVEL_CHUNK_DATA; @@ -72,6 +79,10 @@ public class TranslatorsInit { public static void start() { addLoginPackets(); addChatPackets(); + addTitlePackets(); + addTimePackets(); + addEntityPackets(); + addScoreboardPackets(); } private static void addLoginPackets() { @@ -132,15 +143,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); @@ -151,14 +157,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); }); } @@ -193,22 +196,215 @@ public class TranslatorsInit { }); } - private static byte[] empty(byte[] b, Vector2i pos) { - ByteBuf by = Unpooled.buffer(); + public static void addTitlePackets() { + Registry.add(ServerTitlePacket.class, (packet, session) -> { + SetTitlePacket titlePacket = new SetTitlePacket(); - GeyserUtils.writePEChunkCoord(by, pos); + 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; + } - return by.array(); + titlePacket.setFadeInTime(packet.getFadeIn()); + titlePacket.setFadeOutTime(packet.getFadeOut()); + titlePacket.setStayTime(packet.getStay()); + + session.getUpstream().sendPacket(titlePacket); + }); } - private static class CanWriteToBB extends ByteArrayOutputStream { + public static void addTimePackets() { + Registry.add(ServerUpdateTimePacket.class, (packet, session) -> { + SetTimePacket setTimePacket = new SetTimePacket(); + setTimePacket.setTime((int) Math.abs(packet.getTime())); - CanWriteToBB() { - super(8192); - } - - void writeTo(ByteBuf buf) { - buf.writeBytes(super.buf, 0, super.count); - } + 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); + }); + } + + 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; + + } +} 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/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)); } 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 diff --git a/connector/src/main/resources/config.yml b/connector/src/main/resources/config.yml index 307a9f6d6..a0794510c 100644 --- a/connector/src/main/resources/config.yml +++ b/connector/src/main/resources/config.yml @@ -30,6 +30,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 +