From 2a44874458fba950e9156aad479f604a9a4ba19a Mon Sep 17 00:00:00 2001 From: rosiecube <53262103+rosiecube@users.noreply.github.com> Date: Thu, 10 Dec 2020 05:09:14 +0900 Subject: [PATCH 01/24] Fix Bedrock ItemEntity Y position bug (#1636) Setting motion while on the ground causes visual issues. Additionally, there is an offset difference in the movement of an item entity. --- .../geysermc/connector/entity/ItemEntity.java | 17 +++++++++++++++-- .../connector/entity/type/EntityType.java | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/ItemEntity.java b/connector/src/main/java/org/geysermc/connector/entity/ItemEntity.java index 41308a0d..4a69c834 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/ItemEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/ItemEntity.java @@ -36,7 +36,20 @@ import org.geysermc.connector.network.translators.item.ItemTranslator; public class ItemEntity extends Entity { public ItemEntity(long entityId, long geyserId, EntityType entityType, Vector3f position, Vector3f motion, Vector3f rotation) { - super(entityId, geyserId, entityType, position, motion, rotation); + super(entityId, geyserId, entityType, position.add(0d, entityType.getOffset(), 0d), motion, rotation); + } + + @Override + public void setMotion(Vector3f motion) { + if (isOnGround()) + motion = Vector3f.from(motion.getX(), 0, motion.getZ()); + + super.setMotion(motion); + } + + @Override + public void moveAbsolute(GeyserSession session, Vector3f position, Vector3f rotation, boolean isOnGround, boolean teleported) { + super.moveAbsolute(session, position.add(0d, this.entityType.getOffset(), 0d), rotation, isOnGround, teleported); } @Override @@ -44,7 +57,7 @@ public class ItemEntity extends Entity { if (entityMetadata.getId() == 7) { AddItemEntityPacket itemPacket = new AddItemEntityPacket(); itemPacket.setRuntimeEntityId(geyserId); - itemPacket.setPosition(position); + itemPacket.setPosition(position.add(0d, this.entityType.getOffset(), 0d)); itemPacket.setMotion(motion); itemPacket.setUniqueEntityId(geyserId); itemPacket.setFromFishing(false); diff --git a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java index a77d3504..3e6b6c72 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java +++ b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java @@ -100,7 +100,7 @@ public enum EntityType { ARMOR_STAND(ArmorStandEntity.class, 61, 1.975f, 0.5f), TRIPOD_CAMERA(Entity.class, 62, 0f), PLAYER(PlayerEntity.class, 63, 1.8f, 0.6f, 0.6f, 1.62f), - ITEM(ItemEntity.class, 64, 0.25f, 0.25f), + ITEM(ItemEntity.class, 64, 0.25f, 0.25f, 0.25f, 0.125f), PRIMED_TNT(TNTEntity.class, 65, 0.98f, 0.98f, 0.98f, 0f, "minecraft:tnt"), FALLING_BLOCK(FallingBlockEntity.class, 66, 0.98f, 0.98f), MOVING_BLOCK(Entity.class, 67, 0f), From 91cdda95db625b77bf364002d0109cbf5797757d Mon Sep 17 00:00:00 2001 From: rtm516 Date: Wed, 9 Dec 2020 20:14:12 +0000 Subject: [PATCH 02/24] Change version in query to use a more informative string (#1635) * Change version in query to use a more informative string * Fix removal of string * Cleaner implementation of version * Fix build * Make more explicit what we're replacing Co-authored-by: Camotoy <20743703+DoctorMacc@users.noreply.github.com> --- connector/pom.xml | 16 ++++++++++++---- .../org/geysermc/connector/GeyserConnector.java | 1 + .../connector/network/QueryPacketHandler.java | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/connector/pom.xml b/connector/pom.xml index 20b8b99d..b1f08810 100644 --- a/connector/pom.xml +++ b/connector/pom.xml @@ -230,8 +230,12 @@ - VERSION = ".*" - VERSION = "${project.version} (git-${git.branch}-${git.commit.id.abbrev})" + String VERSION = ".*" + String VERSION = "${project.version} (" + GIT_VERSION + ")" + + + String GIT_VERSION = ".*" + String GIT_VERSION = "git-${git.branch}-${git.commit.id.abbrev}" @@ -249,8 +253,12 @@ - VERSION = ".*" - VERSION = "DEV" + String VERSION = ".*" + String VERSION = "DEV" + + + String GIT_VERSION = ".*" + String GIT_VERSION = "DEV" diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 96c70898..1bfa700f 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -86,6 +86,7 @@ public class GeyserConnector { .enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES); public static final String NAME = "Geyser"; + public static final String GIT_VERSION = "DEV"; // A fallback for running in IDEs public static final String VERSION = "DEV"; // A fallback for running in IDEs private static final String IP_REGEX = "\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b"; diff --git a/connector/src/main/java/org/geysermc/connector/network/QueryPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/QueryPacketHandler.java index 510bba2d..00f94853 100644 --- a/connector/src/main/java/org/geysermc/connector/network/QueryPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/QueryPacketHandler.java @@ -174,7 +174,7 @@ public class QueryPacketHandler { gameData.put("hostname", motd); gameData.put("gametype", "SMP"); gameData.put("game_id", "MINECRAFT"); - gameData.put("version", BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); + gameData.put("version", GeyserConnector.NAME + " (" + GeyserConnector.GIT_VERSION + ") " + BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); gameData.put("plugins", ""); gameData.put("map", map); gameData.put("numplayers", currentPlayerCount); From 87c52ad52448523453d6fdfe5dfdabcd006ad5bb Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+DoctorMacc@users.noreply.github.com> Date: Thu, 10 Dec 2020 11:13:36 -0500 Subject: [PATCH 03/24] Add a config option for toggling showing coordinates (#1645) --- .../geysermc/connector/configuration/GeyserConfiguration.java | 2 ++ .../connector/configuration/GeyserJacksonConfiguration.java | 3 +++ .../org/geysermc/connector/network/session/GeyserSession.java | 2 +- connector/src/main/resources/config.yml | 3 +++ 4 files changed, 9 insertions(+), 1 deletion(-) 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 963385c9..dfa30ae9 100644 --- a/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java +++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java @@ -71,6 +71,8 @@ public interface GeyserConfiguration { boolean isShowCooldown(); + boolean isShowCoordinates(); + String getDefaultLocale(); Path getFloodgateKeyPath(); diff --git a/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java b/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java index 0ff80895..67fa0449 100644 --- a/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java +++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java @@ -89,6 +89,9 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration @JsonProperty("show-cooldown") private boolean showCooldown = true; + @JsonProperty("show-coordinates") + private boolean showCoordinates = true; + @JsonProperty("allow-third-party-ears") private boolean allowThirdPartyEars = false; 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 79e47b1a..8ac0b743 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 @@ -673,7 +673,7 @@ public class GeyserSession implements CommandSender { startGamePacket.setLightningLevel(0); startGamePacket.setMultiplayerGame(true); startGamePacket.setBroadcastingToLan(true); - startGamePacket.getGamerules().add(new GameRuleData<>("showcoordinates", true)); + startGamePacket.getGamerules().add(new GameRuleData<>("showcoordinates", connector.getConfig().isShowCoordinates())); startGamePacket.setPlatformBroadcastMode(GamePublishSetting.PUBLIC); startGamePacket.setXblBroadcastMode(GamePublishSetting.PUBLIC); startGamePacket.setCommandsEnabled(!connector.getConfig().isXboxAchievementsEnabled()); diff --git a/connector/src/main/resources/config.yml b/connector/src/main/resources/config.yml index 5c22037d..dc61feb7 100644 --- a/connector/src/main/resources/config.yml +++ b/connector/src/main/resources/config.yml @@ -90,6 +90,9 @@ allow-third-party-ears: false # Allow a fake cooldown indicator to be sent. Bedrock players do not see a cooldown as they still use 1.8 combat show-cooldown: true +# Controls if coordinates are shown to players. +show-coordinates: true + # The default locale if we dont have the one the client requested. Uncomment to not use the default system language. # default-locale: en_us From 39a11da7e5d8db3559112028a8d967ebe301cf26 Mon Sep 17 00:00:00 2001 From: Kooldude183 <33386263+Kooldude183@users.noreply.github.com> Date: Thu, 10 Dec 2020 14:13:54 -0800 Subject: [PATCH 04/24] Fix resource pack description in config (#1649) --- connector/src/main/resources/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/connector/src/main/resources/config.yml b/connector/src/main/resources/config.yml index dc61feb7..bdb21216 100644 --- a/connector/src/main/resources/config.yml +++ b/connector/src/main/resources/config.yml @@ -122,8 +122,8 @@ allow-custom-skulls: true above-bedrock-nether-building: false # Force clients to load all resource packs if there are any. -# If set to false it allows the user to disconnect from the server if they don't -# want to download the resource packs +# If set to false, it allows the user to connect to the server even if they don't +# want to download the resource packs. force-resource-packs: true # Allows Xbox achievements to be unlocked. From bb21d054597a86380f2d8fe229f3af048e0d3666 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Fri, 11 Dec 2020 12:55:19 -0500 Subject: [PATCH 05/24] Update README to show all supported versions (#1647) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab1ff24a..6ad83dd5 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have now joined us here! -### Currently supporting Minecraft Bedrock v1.16.100 and Minecraft Java v1.16.4. +### Currently supporting Minecraft Bedrock v1.16.100/v1.16.101/v1.16.200 and Minecraft Java v1.16.4. ## Setting Up Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set up Geyser. From f19922ecf09c88f59d573da52be69c79bd53855f Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Fri, 11 Dec 2020 12:55:37 -0500 Subject: [PATCH 06/24] EnderCrystalEntity: don't appear to be on fire if fire is below (#1651) --- .../java/org/geysermc/connector/entity/EnderCrystalEntity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/connector/src/main/java/org/geysermc/connector/entity/EnderCrystalEntity.java b/connector/src/main/java/org/geysermc/connector/entity/EnderCrystalEntity.java index 4b665683..0459ea85 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/EnderCrystalEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/EnderCrystalEntity.java @@ -39,6 +39,8 @@ public class EnderCrystalEntity extends Entity { public EnderCrystalEntity(long entityId, long geyserId, EntityType entityType, Vector3f position, Vector3f motion, Vector3f rotation) { super(entityId, geyserId, entityType, position, motion, rotation); + // Bedrock 1.16.100+ - prevents the entity from appearing on fire itself when fire is underneath it + metadata.getFlags().setFlag(EntityFlag.FIRE_IMMUNE, true); } @Override From 047bf5f0f473c48d2b452fc4dfe1cdb11a0f9d7b Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Fri, 11 Dec 2020 17:06:33 -0600 Subject: [PATCH 07/24] Fix armor stand rotation (Closes #1634) --- .../connector/entity/living/ArmorStandEntity.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/living/ArmorStandEntity.java b/connector/src/main/java/org/geysermc/connector/entity/living/ArmorStandEntity.java index b61aeda9..aadbfc78 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/living/ArmorStandEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/living/ArmorStandEntity.java @@ -53,7 +53,7 @@ public class ArmorStandEntity extends LivingEntity { position = position.add(0d, entityType.getHeight() * (isSmall ? 0.55d : 1d), 0d); } - super.moveAbsolute(session, position, rotation, isOnGround, teleported); + super.moveAbsolute(session, position, Vector3f.from(rotation.getX(), rotation.getX(), rotation.getX()), isOnGround, teleported); } @Override @@ -95,4 +95,10 @@ public class ArmorStandEntity extends LivingEntity { } super.updateBedrockMetadata(entityMetadata, session); } + + @Override + public void spawnEntity(GeyserSession session) { + this.rotation = Vector3f.from(rotation.getX(), rotation.getX(), rotation.getX()); + super.spawnEntity(session); + } } From a60ab4e80ece023ab885e1bdca6b44d6778a27b6 Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Fri, 11 Dec 2020 17:15:49 -0600 Subject: [PATCH 08/24] Fix colored particles (Closes #1627) --- .../translators/java/world/JavaSpawnParticleTranslator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaSpawnParticleTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaSpawnParticleTranslator.java index 4620fc11..61651b0b 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaSpawnParticleTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaSpawnParticleTranslator.java @@ -78,7 +78,7 @@ public class JavaSpawnParticleTranslator extends PacketTranslator Date: Sat, 12 Dec 2020 00:45:41 -0600 Subject: [PATCH 09/24] Handle keepalives better (Closes #965) Bedrock cuts off the last 3 digits consistently every time, meaning that the keepalive returned from bedrock is never fully accurate. However, if we multiply the value by 1000, then divide by 1000 when sending back to java, the proper value is returned. --- .../geysermc/connector/network/session/GeyserSession.java | 6 ------ .../bedrock/BedrockNetworkStackLatencyTranslator.java | 4 +--- .../network/translators/java/JavaKeepAliveTranslator.java | 3 +-- 3 files changed, 2 insertions(+), 11 deletions(-) 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 8ac0b743..36b14a1e 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 @@ -196,12 +196,6 @@ public class GeyserSession implements CommandSender { @Setter private long lastWindowCloseTime = 0; - /** - * Saves the timestamp of the last keep alive packet - */ - @Setter - private long lastKeepAliveTimestamp = 0; - @Setter private VillagerTrade[] villagerTrades; @Setter diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java index d480b526..13f2ea3c 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java @@ -39,8 +39,6 @@ public class BedrockNetworkStackLatencyTranslator extends PacketTranslator Date: Fri, 11 Dec 2020 22:46:29 -0800 Subject: [PATCH 10/24] Update todo list in README.md (#1656) --- README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6ad83dd5..a599e3ea 100644 --- a/README.md +++ b/README.md @@ -34,16 +34,19 @@ Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set - Test Server: `test.geysermc.org` port `25565` for Java and `19132` for Bedrock ## What's Left to be Added/Fixed -- The Following Inventories - - [ ] Enchantment Table (as a proper GUI) - - [ ] Beacon - - [ ] Cartography Table - - [ ] Stonecutter - - [ ] Structure Block - - [ ] Horse Inventory - - [ ] Loom - - [ ] Smithing Table +- Lecterns +- Near-perfect movement (to the point where anticheat on large servers is unlikely to ban you) +- Resource pack conversion/CustomModelData - Some Entity Flags +- The Following Inventories + - Enchantment Table (as a proper GUI) + - Beacon + - Cartography Table + - Stonecutter + - Structure Block + - Horse Inventory + - Loom + - Smithing Table ## Compiling 1. Clone the repo to your computer From 31209be79ef08b3d7577d44cf67eba117050fc2e Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sat, 12 Dec 2020 01:22:57 -0600 Subject: [PATCH 11/24] Ensure spawn radius is always 0 on the client's end Fixes #1496 to the best of my knowledge. Any issue regarding the spawnpoint being off in terms of radius is up to the server at this point - would not be an us situation here. --- .../org/geysermc/connector/network/session/GeyserSession.java | 2 ++ 1 file changed, 2 insertions(+) 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 36b14a1e..9f6b8eb2 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 @@ -385,6 +385,8 @@ public class GeyserSession implements CommandSender { // Don't let the client modify the inventory on death // Setting this to true allows keep inventory to work if enabled but doesn't break functionality being false gamerulePacket.getGameRules().add(new GameRuleData<>("keepinventory", true)); + // Ensure client doesn't try and do anything funky; the server handles this for us + gamerulePacket.getGameRules().add(new GameRuleData<>("spawnradius", 0)); upstream.sendPacket(gamerulePacket); } From 655e218115e017a75ac4d162e35f8d464ea7563e Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sat, 12 Dec 2020 01:45:54 -0600 Subject: [PATCH 12/24] Add settings command for settings menu as it broke in the settings screen in 1.16.100 --- .../connector/command/CommandManager.java | 1 + .../command/defaults/SettingsCommand.java | 68 +++++++++++++++++++ .../connector/utils/SettingsUtils.java | 3 + 3 files changed, 72 insertions(+) create mode 100644 connector/src/main/java/org/geysermc/connector/command/defaults/SettingsCommand.java diff --git a/connector/src/main/java/org/geysermc/connector/command/CommandManager.java b/connector/src/main/java/org/geysermc/connector/command/CommandManager.java index 822b6dea..44e3830b 100644 --- a/connector/src/main/java/org/geysermc/connector/command/CommandManager.java +++ b/connector/src/main/java/org/geysermc/connector/command/CommandManager.java @@ -50,6 +50,7 @@ public abstract class CommandManager { registerCommand(new OffhandCommand(connector, "offhand", "geyser.commands.offhand.desc", "geyser.command.offhand")); registerCommand(new DumpCommand(connector, "dump", "geyser.commands.dump.desc", "geyser.command.dump")); registerCommand(new VersionCommand(connector, "version", "geyser.commands.version.desc", "geyser.command.version")); + registerCommand(new SettingsCommand(connector, "settings", "geyser.commands.settings.desc", "geyser.command.settings")); registerCommand(new StatisticsCommand(connector, "statistics", "geyser.commands.statistics.desc", "geyser.command.statistics")); } diff --git a/connector/src/main/java/org/geysermc/connector/command/defaults/SettingsCommand.java b/connector/src/main/java/org/geysermc/connector/command/defaults/SettingsCommand.java new file mode 100644 index 00000000..8f09c774 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/command/defaults/SettingsCommand.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2019-2020 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.command.defaults; + +import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.command.CommandSender; +import org.geysermc.connector.command.GeyserCommand; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.utils.SettingsUtils; + +public class SettingsCommand extends GeyserCommand { + + private final GeyserConnector connector; + + public SettingsCommand(GeyserConnector connector, String name, String description, String permission) { + super(name, description, permission); + + this.connector = connector; + } + + @Override + public void execute(CommandSender sender, String[] args) { + // Make sure the sender is a Bedrock edition client + GeyserSession session = null; + if (sender instanceof GeyserSession) { + session = (GeyserSession) sender; + } else { + // Needed for Spigot - sender is not an instance of GeyserSession + for (GeyserSession otherSession : connector.getPlayers()) { + if (sender.getName().equals(otherSession.getPlayerEntity().getUsername())) { + session = otherSession; + break; + } + } + } + if (session == null) return; + SettingsUtils.buildForm(session); + session.sendForm(session.getSettingsForm(), SettingsUtils.SETTINGS_FORM_ID); + } + + @Override + public boolean isExecutableOnConsole() { + return false; + } +} diff --git a/connector/src/main/java/org/geysermc/connector/utils/SettingsUtils.java b/connector/src/main/java/org/geysermc/connector/utils/SettingsUtils.java index eaf71058..28523782 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/SettingsUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/SettingsUtils.java @@ -112,6 +112,9 @@ public class SettingsUtils { settingsForm.setResponse(response); CustomFormResponse settingsResponse = (CustomFormResponse) settingsForm.getResponse(); + if (settingsResponse == null) { + return false; + } int offset = 0; offset++; // Client settings title From 41cb593dc43ae3058c552f2302d726f172ee6a9d Mon Sep 17 00:00:00 2001 From: RednedEpic Date: Sat, 12 Dec 2020 01:48:12 -0600 Subject: [PATCH 13/24] Update langauges submodule --- connector/src/main/resources/languages | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/resources/languages b/connector/src/main/resources/languages index 1e2815bd..1a007668 160000 --- a/connector/src/main/resources/languages +++ b/connector/src/main/resources/languages @@ -1 +1 @@ -Subproject commit 1e2815bdd9c78fa6865656db0d8b580b20aa87f1 +Subproject commit 1a00766840baf1f512d98f5a75c177c8bcfba6f3 From 799f6341c86545ef795e46caea17dfa0d5cc6102 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Sun, 13 Dec 2020 23:03:11 -0500 Subject: [PATCH 14/24] Fix Netty dependency usage on Velocity (#1672) --- bootstrap/velocity/pom.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/bootstrap/velocity/pom.xml b/bootstrap/velocity/pom.xml index 86de99ba..2fedca71 100644 --- a/bootstrap/velocity/pom.xml +++ b/bootstrap/velocity/pom.xml @@ -93,7 +93,16 @@ com.google.code.gson:* - io.netty:* + + io.netty:netty-transport-native-epoll:* + io.netty:netty-transport-native-unix-common:* + io.netty:netty-transport-native-kqueue:* + io.netty:netty-handler:* + io.netty:netty-common:* + io.netty:netty-buffer:* + io.netty:netty-resolver:* + io.netty:netty-transport:* + io.netty:netty-codec:* org.slf4j:* org.ow2.asm:* From 8b5ef7478c6b64685e78159ad4338aa27c103809 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Mon, 14 Dec 2020 15:47:17 -0500 Subject: [PATCH 15/24] Fix PS4 behavior with NetworkStackLatencyTranslator (#1678) --- .../BedrockNetworkStackLatencyTranslator.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java index 13f2ea3c..2e1a87ca 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockNetworkStackLatencyTranslator.java @@ -30,6 +30,7 @@ import com.nukkitx.protocol.bedrock.packet.NetworkStackLatencyPacket; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.Translator; +import org.geysermc.floodgate.util.DeviceOS; /** * Used to send the keep alive packet back to the server @@ -39,6 +40,16 @@ public class BedrockNetworkStackLatencyTranslator extends PacketTranslator Date: Tue, 15 Dec 2020 01:22:18 +0200 Subject: [PATCH 16/24] Add What can't be fixed and info about player heads (#1680) * Add What can't be fixed and info about player heads * Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a599e3ea..2033a66e 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,11 @@ Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set - Loom - Smithing Table +## What can't be fixed +The following things can't be fixed because of Bedrock limitations. They might be fixable in the future, but not as of now. + +- Custom heads in inventories + ## Compiling 1. Clone the repo to your computer 2. [Install Maven](https://maven.apache.org/install.html) From 55cf7d1c540064eb7df18d8f50dc86734954667d Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Mon, 14 Dec 2020 18:22:31 -0500 Subject: [PATCH 17/24] Fix more scoreboard crashing and oddities (#1665) * Various fixes * Apply updateType fix as well * Slight optimization --- .../org/geysermc/connector/scoreboard/Score.java | 12 +++++++++--- .../geysermc/connector/scoreboard/Scoreboard.java | 5 ++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/scoreboard/Score.java b/connector/src/main/java/org/geysermc/connector/scoreboard/Score.java index e5f97b45..668cd73d 100644 --- a/connector/src/main/java/org/geysermc/connector/scoreboard/Score.java +++ b/connector/src/main/java/org/geysermc/connector/scoreboard/Score.java @@ -36,8 +36,14 @@ public final class Score { private final String name; private ScoreInfo cachedInfo; - private ScoreData currentData; - private ScoreData cachedData; + /** + * Changes that have been made since the last cached data. + */ + private Score.ScoreData currentData; + /** + * The data that is currently displayed to the Bedrock client. + */ + private Score.ScoreData cachedData; public Score(long id, String name) { this.id = id; @@ -79,7 +85,7 @@ public final class Score { } public UpdateType getUpdateType() { - return cachedData != null ? cachedData.updateType : currentData.updateType; + return currentData.updateType; } public Score setUpdateType(UpdateType updateType) { diff --git a/connector/src/main/java/org/geysermc/connector/scoreboard/Scoreboard.java b/connector/src/main/java/org/geysermc/connector/scoreboard/Scoreboard.java index 8eaa2e27..a389a373 100644 --- a/connector/src/main/java/org/geysermc/connector/scoreboard/Scoreboard.java +++ b/connector/src/main/java/org/geysermc/connector/scoreboard/Scoreboard.java @@ -189,7 +189,10 @@ public final class Scoreboard { remove = false; } - if (score.shouldUpdate()) { + if (objectiveRemove && score.getCachedData() != null) { + // This score has been sent to the client and needs to be removed since the objective is being removed + remove = true; + } else if (score.shouldUpdate()) { score.update(objective.getObjectiveName()); } From aed1eef6e183e4b42beb42181f15343999f8f3e0 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Tue, 15 Dec 2020 11:24:02 -0500 Subject: [PATCH 18/24] Update Adventure and fix some legacy hover events (#1681) --- connector/pom.xml | 12 +++++++++--- .../network/translators/chat/MessageTranslator.java | 13 +++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/connector/pom.xml b/connector/pom.xml index b1f08810..b71fdcb6 100644 --- a/connector/pom.xml +++ b/connector/pom.xml @@ -153,19 +153,25 @@ net.kyori adventure-api - 4.2.0 + 4.3.0 compile net.kyori adventure-text-serializer-gson - 4.2.0 + 4.3.0 compile net.kyori adventure-text-serializer-legacy - 4.2.0 + 4.3.0 + compile + + + net.kyori + adventure-text-serializer-gson-legacy-impl + 4.3.0 compile diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/chat/MessageTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/chat/MessageTranslator.java index 79ce856a..32a9d6e0 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/chat/MessageTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/chat/MessageTranslator.java @@ -25,26 +25,32 @@ package org.geysermc.connector.network.translators.chat; +import com.github.steveice10.mc.protocol.data.DefaultComponentSerializer; import com.github.steveice10.mc.protocol.data.game.scoreboard.TeamColor; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.text.serializer.gson.legacyimpl.NBTLegacyHoverEventSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.utils.LanguageUtils; -import java.util.*; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; public class MessageTranslator { // These are used for handling the translations of the messages private static final TranslatableComponentRenderer RENDERER = TranslatableComponentRenderer.usingTranslationSource(new MinecraftTranslationRegistry()); - // Construct our own {@link GsonComponentSerializer} encase we need to change anything + // Construct our own {@link GsonComponentSerializer} since we need to change a setting private static final GsonComponentSerializer GSON_SERIALIZER = GsonComponentSerializer.builder() + // Specify that we may be expecting legacy hover events + .legacyHoverEventSerializer(NBTLegacyHoverEventSerializer.get()) .build(); // Store team colors for player names @@ -61,6 +67,9 @@ public class MessageTranslator { TEAM_FORMATS.put(TeamColor.BOLD, TextDecoration.BOLD); TEAM_FORMATS.put(TeamColor.STRIKETHROUGH, TextDecoration.STRIKETHROUGH); TEAM_FORMATS.put(TeamColor.ITALIC, TextDecoration.ITALIC); + + // Tell MCProtocolLib to use our serializer + DefaultComponentSerializer.set(GSON_SERIALIZER); } /** From 988fd66a85fbe6f0175dccaa99ddd981ef68931c Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Tue, 15 Dec 2020 13:09:40 -0500 Subject: [PATCH 19/24] Fix boat movement on land (#1668) * Fix boat movement on land 1.16.100 appears to now take advantage of two newer entity metadata properties, IS_BUOYANT and BUOYANCY_DATA. Without the former, moving on land will not work properly. With the former and without the latter, moving in water no longer works. * Use offset kind of --- .../geysermc/connector/entity/BoatEntity.java | 14 ++++++++++++++ .../network/session/GeyserSession.java | 11 +++++++++++ .../bedrock/BedrockAnimateTranslator.java | 18 +++++++----------- .../BedrockMoveEntityAbsoluteTranslator.java | 10 +++++++++- .../JavaEntitySetPassengersTranslator.java | 9 ++++++--- 5 files changed, 47 insertions(+), 15 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java b/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java index c067416d..5e1fd005 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java @@ -35,6 +35,16 @@ import java.util.concurrent.TimeUnit; public class BoatEntity extends Entity { + /** + * Required when IS_BUOYANT is sent in order for boats to work in the water.
+ * + * Taken from BDS 1.16.200, with the modification of simulate_waves since Java doesn't bob the boat up and down + * like Bedrock. + */ + private static final String BUOYANCY_DATA = "{\"apply_gravity\":true,\"base_buoyancy\":1.0,\"big_wave_probability\":0.02999999932944775," + + "\"big_wave_speed\":10.0,\"drag_down_on_buoyancy_removed\":0.0,\"liquid_blocks\":[\"minecraft:water\"," + + "\"minecraft:flowing_water\"],\"simulate_waves\":false}}"; + private boolean isPaddlingLeft; private float paddleTimeLeft; private boolean isPaddlingRight; @@ -45,6 +55,10 @@ public class BoatEntity extends Entity { public BoatEntity(long entityId, long geyserId, EntityType entityType, Vector3f position, Vector3f motion, Vector3f rotation) { super(entityId, geyserId, entityType, position.add(0d, entityType.getOffset(), 0d), motion, rotation.add(90, 0, 90)); + + // Required to be able to move on land 1.16.200+ or apply gravity not in the water 1.16.100+ + metadata.put(EntityData.IS_BUOYANT, (byte) 1); + metadata.put(EntityData.BUOYANCY_DATA, BUOYANCY_DATA); } @Override 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 9f6b8eb2..cd420025 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 @@ -219,6 +219,17 @@ public class GeyserSession implements CommandSender { @Setter private long lastHitTime; + /** + * Saves if the client is steering left on a boat. + */ + @Setter + private boolean steeringLeft; + /** + * Saves if the client is steering right on a boat. + */ + @Setter + private boolean steeringRight; + /** * Store the last time the player interacted. Used to fix a right-click spam bug. * See https://github.com/GeyserMC/Geyser/issues/503 for context. diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java index 012582da..0bedaa71 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java @@ -25,23 +25,19 @@ package org.geysermc.connector.network.translators.bedrock; -import org.geysermc.connector.network.session.GeyserSession; -import org.geysermc.connector.network.translators.PacketTranslator; -import org.geysermc.connector.network.translators.Translator; - import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientSteerBoatPacket; import com.nukkitx.protocol.bedrock.packet.AnimatePacket; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.network.translators.Translator; import java.util.concurrent.TimeUnit; @Translator(packet = AnimatePacket.class) public class BedrockAnimateTranslator extends PacketTranslator { - private boolean isSteeringLeft; - private boolean isSteeringRight; - @Override public void translate(AnimatePacket packet, GeyserSession session) { // Stop the player sending animations before they have fully spawned into the server @@ -61,13 +57,13 @@ public class BedrockAnimateTranslator extends PacketTranslator { // These two might need to be flipped, but my recommendation is getting moving working first case ROW_LEFT: // Packet value is a float of how long one has been rowing, so we convert that into a boolean - isSteeringLeft = packet.getRowingTime() > 0.0; - ClientSteerBoatPacket steerLeftPacket = new ClientSteerBoatPacket(isSteeringRight, isSteeringLeft); + session.setSteeringLeft(packet.getRowingTime() > 0.0); + ClientSteerBoatPacket steerLeftPacket = new ClientSteerBoatPacket(session.isSteeringLeft(), session.isSteeringRight()); session.sendDownstreamPacket(steerLeftPacket); break; case ROW_RIGHT: - isSteeringRight = packet.getRowingTime() > 0.0; - ClientSteerBoatPacket steerRightPacket = new ClientSteerBoatPacket(isSteeringRight, isSteeringLeft); + session.setSteeringRight(packet.getRowingTime() > 0.0); + ClientSteerBoatPacket steerRightPacket = new ClientSteerBoatPacket(session.isSteeringLeft(), session.isSteeringRight()); session.sendDownstreamPacket(steerRightPacket); break; } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMoveEntityAbsoluteTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMoveEntityAbsoluteTranslator.java index fd5e71e9..e1d87f19 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMoveEntityAbsoluteTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMoveEntityAbsoluteTranslator.java @@ -27,6 +27,8 @@ package org.geysermc.connector.network.translators.bedrock; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientVehicleMovePacket; import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; +import org.geysermc.connector.entity.BoatEntity; +import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.Translator; @@ -39,8 +41,14 @@ public class BedrockMoveEntityAbsoluteTranslator extends PacketTranslator 1)); } else { From 82179797ab872896ffd303ac25d9f69e85f31db4 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Wed, 16 Dec 2020 12:50:16 -0500 Subject: [PATCH 20/24] Add proper ominous banner translation (#1692) The ominous banner is a separate banner type in Bedrock. If we detect the ominous banner pattern, then we set the ominous banner type in NBT. This process is also checked vice-versa, allowing the ominous banner to be pulled from the Bedrock creative menu. --- .../item/translators/BannerTranslator.java | 50 +++++++++++++++++-- .../entity/BannerBlockEntityTranslator.java | 8 ++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/translators/BannerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/translators/BannerTranslator.java index 14b93436..5e5bc354 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/item/translators/BannerTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/translators/BannerTranslator.java @@ -45,8 +45,39 @@ import java.util.stream.Collectors; @ItemRemapper public class BannerTranslator extends ItemTranslator { + /** + * Holds what a Java ominous banner pattern looks like. + * + * Translating the patterns over to Bedrock does not work effectively, but Bedrock has a dedicated type for + * ominous banners that we set instead. This variable is used to detect Java ominous banner patterns, and apply + * the correct ominous banner pattern if Bedrock pulls the item from creative. + */ + public static final ListTag OMINOUS_BANNER_PATTERN; + private final List appliedItems; + static { + OMINOUS_BANNER_PATTERN = new ListTag("Patterns"); + // Construct what an ominous banner is supposed to look like + OMINOUS_BANNER_PATTERN.add(getPatternTag("mr", 9)); + OMINOUS_BANNER_PATTERN.add(getPatternTag("bs", 8)); + OMINOUS_BANNER_PATTERN.add(getPatternTag("cs", 7)); + OMINOUS_BANNER_PATTERN.add(getPatternTag("bo", 8)); + OMINOUS_BANNER_PATTERN.add(getPatternTag("ms", 15)); + OMINOUS_BANNER_PATTERN.add(getPatternTag("hh", 8)); + OMINOUS_BANNER_PATTERN.add(getPatternTag("mc", 8)); + OMINOUS_BANNER_PATTERN.add(getPatternTag("bo", 15)); + } + + private static CompoundTag getPatternTag(String pattern, int color) { + StringTag patternType = new StringTag("Pattern", pattern); + IntTag colorTag = new IntTag("Color", color); + CompoundTag tag = new CompoundTag(""); + tag.put(patternType); + tag.put(colorTag); + return tag; + } + public BannerTranslator() { appliedItems = ItemRegistry.ITEM_ENTRIES.values() .stream() @@ -62,7 +93,7 @@ public class BannerTranslator extends ItemTranslator { */ public static NbtList convertBannerPattern(ListTag patterns) { List tagsList = new ArrayList<>(); - for (com.github.steveice10.opennbt.tag.builtin.Tag patternTag : patterns.getValue()) { + for (Tag patternTag : patterns.getValue()) { NbtMap newPatternTag = getBedrockBannerPattern((CompoundTag) patternTag); if (newPatternTag != null) { tagsList.add(newPatternTag); @@ -134,7 +165,13 @@ public class BannerTranslator extends ItemTranslator { ListTag patterns = blockEntityTag.get("Patterns"); NbtMapBuilder builder = itemData.getTag().toBuilder(); - builder.put("Patterns", convertBannerPattern(patterns)); + if (patterns.equals(OMINOUS_BANNER_PATTERN)) { + // Remove the current patterns and set the ominous banner type + builder.remove("Patterns"); + builder.putInt("Type", 1); + } else { + builder.put("Patterns", convertBannerPattern(patterns)); + } itemData = ItemData.of(itemData.getId(), itemData.getDamage(), itemData.getCount(), builder.build()); } @@ -151,7 +188,14 @@ public class BannerTranslator extends ItemTranslator { ItemStack itemStack = super.translateToJava(itemData, itemEntry); NbtMap nbtTag = itemData.getTag(); - if (nbtTag.containsKey("Patterns", NbtType.COMPOUND)) { + if (nbtTag.containsKey("Type", NbtType.INT) && nbtTag.getInt("Type") == 1) { + // Ominous banner pattern + itemStack.getNbt().remove("Type"); + CompoundTag blockEntityTag = new CompoundTag("BlockEntityTag"); + blockEntityTag.put(OMINOUS_BANNER_PATTERN); + + itemStack.getNbt().put(blockEntityTag); + } else if (nbtTag.containsKey("Patterns", NbtType.COMPOUND)) { List patterns = nbtTag.getList("Patterns", NbtType.COMPOUND); CompoundTag blockEntityTag = new CompoundTag("BlockEntityTag"); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/world/block/entity/BannerBlockEntityTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/world/block/entity/BannerBlockEntityTranslator.java index f5e1d594..b5979479 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/world/block/entity/BannerBlockEntityTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/world/block/entity/BannerBlockEntityTranslator.java @@ -47,7 +47,13 @@ public class BannerBlockEntityTranslator extends BlockEntityTranslator implement if (tag.contains("Patterns")) { ListTag patterns = tag.get("Patterns"); - builder.put("Patterns", BannerTranslator.convertBannerPattern(patterns)); + if (patterns.equals(BannerTranslator.OMINOUS_BANNER_PATTERN)) { + // This is an ominous banner; don't try to translate the raw patterns (it doesn't translate correctly) + // and tell the Bedrock client that this is an ominous banner + builder.putInt("Type", 1); + } else { + builder.put("Patterns", BannerTranslator.convertBannerPattern(patterns)); + } } if (tag.contains("CustomName")) { From 02d99380d3b2af566d8a509ac1798dd3d8ca0bd1 Mon Sep 17 00:00:00 2001 From: Kooldude183 <33386263+Kooldude183@users.noreply.github.com> Date: Thu, 17 Dec 2020 08:58:25 -0800 Subject: [PATCH 21/24] Add info about clickable links in "What can't be fixed" (#1687) * Add info about clickable links in "What can't be fixed" * Add "Glowing effect" --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2033a66e..4f6a6d43 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set The following things can't be fixed because of Bedrock limitations. They might be fixable in the future, but not as of now. - Custom heads in inventories +- Clickable links in chat +- Glowing effect ## Compiling 1. Clone the repo to your computer From 9f6182f8df9dbf9d162cf05316221770699cfede Mon Sep 17 00:00:00 2001 From: qlow <20094418+qlow@users.noreply.github.com> Date: Thu, 17 Dec 2020 17:58:49 +0100 Subject: [PATCH 22/24] Added a simple way to get a player by their xuid (#1642) * Added IGeyserPingPassthrough#getPingInformation(InetSocketAddress) to make logging of the pinging IPs possible * Added GeyserConnector#getPlayerByXboxUuid * Added GeyserConnector#getPlayerByUuid and added some javadocs * Update connector/src/main/java/org/geysermc/connector/GeyserConnector.java Co-authored-by: rtm516 * Update connector/src/main/java/org/geysermc/connector/GeyserConnector.java Co-authored-by: rtm516 * Update GeyserConnector.java * Update SkinManager.java * Update SkinProvider.java * Renamed getPlayerByXboxUuid to getPlayerByXuid Co-authored-by: qlow Co-authored-by: rtm516 --- .../geysermc/connector/GeyserConnector.java | 39 ++++++++++++++++--- .../geysermc/connector/skin/SkinManager.java | 18 ++++----- .../geysermc/connector/skin/SkinProvider.java | 10 ++--- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 1bfa700f..05040a86 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -44,6 +44,7 @@ import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.BiomeTranslator; import org.geysermc.connector.network.translators.EntityIdentifierRegistry; import org.geysermc.connector.network.translators.PacketTranslatorRegistry; +import org.geysermc.connector.network.translators.collision.CollisionTranslator; import org.geysermc.connector.network.translators.effect.EffectRegistry; import org.geysermc.connector.network.translators.item.ItemRegistry; import org.geysermc.connector.network.translators.item.ItemTranslator; @@ -54,7 +55,6 @@ import org.geysermc.connector.network.translators.sound.SoundRegistry; import org.geysermc.connector.network.translators.world.WorldManager; import org.geysermc.connector.network.translators.world.block.BlockTranslator; import org.geysermc.connector.network.translators.world.block.entity.BlockEntityTranslator; -import org.geysermc.connector.network.translators.collision.CollisionTranslator; import org.geysermc.connector.network.translators.world.block.entity.SkullBlockEntityTranslator; import org.geysermc.connector.utils.DimensionUtils; import org.geysermc.connector.utils.LanguageUtils; @@ -67,10 +67,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -326,6 +323,38 @@ public class GeyserConnector { players.remove(player); } + /** + * Gets a player by their current UUID + * + * @param uuid the uuid + * @return the player or null if there is no player online with this UUID + */ + public GeyserSession getPlayerByUuid(UUID uuid) { + for (GeyserSession session : players) { + if (session.getPlayerEntity().getUuid().equals(uuid)) { + return session; + } + } + + return null; + } + + /** + * Gets a player by their Xbox user identifier + * + * @param xboxUuid the Xbox user identifier + * @return the player or null if there is no player online with this xuid + */ + public GeyserSession getPlayerByXuid(String xuid) { + for (GeyserSession session : players) { + if (session.getAuthData() != null && session.getAuthData().getXboxUUID().equals(xuid)) { + return session; + } + } + + return null; + } + public static GeyserConnector start(PlatformType platformType, GeyserBootstrap bootstrap) { return new GeyserConnector(platformType, bootstrap); } diff --git a/connector/src/main/java/org/geysermc/connector/skin/SkinManager.java b/connector/src/main/java/org/geysermc/connector/skin/SkinManager.java index db8f2592..a08f567a 100644 --- a/connector/src/main/java/org/geysermc/connector/skin/SkinManager.java +++ b/connector/src/main/java/org/geysermc/connector/skin/SkinManager.java @@ -81,11 +81,10 @@ public class SkinManager { // This attempts to find the xuid of the player so profile images show up for xbox accounts String xuid = ""; - for (GeyserSession player : GeyserConnector.getInstance().getPlayers()) { - if (player.getPlayerEntity().getUuid().equals(uuid)) { - xuid = player.getAuthData().getXboxUUID(); - break; - } + GeyserSession player = GeyserConnector.getInstance().getPlayerByUuid(uuid); + + if (player != null) { + xuid = player.getAuthData().getXboxUUID(); } PlayerListPacket.Entry entry; @@ -268,11 +267,10 @@ public class SkinManager { // return default skin with default cape when texture data is invalid String skinUrl = isAlex ? SkinProvider.EMPTY_SKIN_ALEX.getTextureUrl() : SkinProvider.EMPTY_SKIN.getTextureUrl(); if ("steve".equals(skinUrl) || "alex".equals(skinUrl)) { - for (GeyserSession session : GeyserConnector.getInstance().getPlayers()) { - if (session.getPlayerEntity().getUuid().equals(profile.getId())) { - skinUrl = session.getClientData().getSkinId(); - break; - } + GeyserSession session = GeyserConnector.getInstance().getPlayerByUuid(profile.getId()); + + if (session != null) { + skinUrl = session.getClientData().getSkinId(); } } return new GameProfileData(skinUrl, SkinProvider.EMPTY_CAPE.getTextureUrl(), isAlex); diff --git a/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java b/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java index 11719868..948e4b37 100644 --- a/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java +++ b/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java @@ -144,12 +144,10 @@ public class SkinProvider { String newSkinUrl = skinUrl; if ("steve".equals(skinUrl) || "alex".equals(skinUrl)) { - // TODO: Don't have a for loop for this? Have a proper map? - for (GeyserSession session : GeyserConnector.getInstance().getPlayers()) { - if (session.getPlayerEntity().getUuid().equals(playerId)) { - newSkinUrl = session.getClientData().getSkinId(); - break; - } + GeyserSession session = GeyserConnector.getInstance().getPlayerByUuid(playerId); + + if (session != null) { + newSkinUrl = session.getClientData().getSkinId(); } } From ce9cd92b2e1790e7d9dfd1f67791847d35886608 Mon Sep 17 00:00:00 2001 From: rtm516 Date: Thu, 17 Dec 2020 17:25:38 +0000 Subject: [PATCH 23/24] Update GeyserConnector.java to fix JavaDoc (#1701) --- .../src/main/java/org/geysermc/connector/GeyserConnector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 05040a86..5b447b26 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -342,7 +342,7 @@ public class GeyserConnector { /** * Gets a player by their Xbox user identifier * - * @param xboxUuid the Xbox user identifier + * @param xuid the Xbox user identifier * @return the player or null if there is no player online with this xuid */ public GeyserSession getPlayerByXuid(String xuid) { From c92150013f01a99ff36470eb67a7aa86d0ddb243 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Thu, 17 Dec 2020 14:10:58 -0500 Subject: [PATCH 24/24] Allow /help to work even if command suggestions are disabled (#1703) * Allow /help to work even if command suggestions are disabled This sends a minimal available commands packet to permit /help sending to the server. * Fix whitespace * Just send an empty packet * Change variable name --- .../bedrock/BedrockTextTranslator.java | 2 +- .../java/JavaDeclareCommandsTranslator.java | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockTextTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockTextTranslator.java index e4a76569..955a9a53 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockTextTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockTextTranslator.java @@ -38,7 +38,7 @@ public class BedrockTextTranslator extends PacketTranslator { @Override public void translate(TextPacket packet, GeyserSession session) { - String message = packet.getMessage().replaceAll("^\\.", "/").trim(); + String message = packet.getMessage(); if (MessageTranslator.isTooLong(message, session)) { return; diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareCommandsTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareCommandsTranslator.java index 8f524336..2247b55b 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareCommandsTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareCommandsTranslator.java @@ -52,9 +52,14 @@ public class JavaDeclareCommandsTranslator extends PacketTranslator commandData = new ArrayList<>(); Int2ObjectMap commands = new Int2ObjectOpenHashMap<>(); Int2ObjectMap> commandArgs = new Int2ObjectOpenHashMap<>(); @@ -83,14 +88,14 @@ public class JavaDeclareCommandsTranslator extends PacketTranslator flags = new ArrayList<>(); + List flags = Collections.emptyList(); // Loop through all the found commands for (int commandID : commands.keySet()) { String commandName = commands.get(commandID); // Create a basic alias - CommandEnumData aliases = new CommandEnumData( commandName + "Aliases", new String[] { commandName.toLowerCase() }, false); + CommandEnumData aliases = new CommandEnumData(commandName + "Aliases", new String[] { commandName.toLowerCase() }, false); // Get and parse all params CommandParamData[][] params = getParams(packet.getNodes()[commandID], packet.getNodes()); @@ -102,9 +107,7 @@ public class JavaDeclareCommandsTranslator extends PacketTranslator