diff --git a/README.md b/README.md
index 2033a66ed..4f6a6d434 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
diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
index 05531264b..85e3ef753 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;
@@ -72,10 +72,7 @@ import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.security.Key;
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;
@@ -344,6 +341,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 xuid 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/network/translators/bedrock/BedrockTextTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockTextTranslator.java
index e4a765694..955a9a539 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/item/translators/BannerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/translators/BannerTranslator.java
index 14b934362..5e5bc3542 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/java/JavaDeclareCommandsTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareCommandsTranslator.java
index 8f5243366..2247b55be 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