diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index add64ec6f..9aa93a442 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -160,9 +160,8 @@ image: title: true bossbar: true container: true - # TODO: toast: true + team: true # TODO: name: true - # TODO: team: true emoji: {} diff --git a/bukkit/loader/src/main/resources/craft-engine.properties b/bukkit/loader/src/main/resources/craft-engine.properties index 01e0b0244..96d51b50e 100644 --- a/bukkit/loader/src/main/resources/craft-engine.properties +++ b/bukkit/loader/src/main/resources/craft-engine.properties @@ -25,6 +25,7 @@ snake-yaml=${snake_yaml_version} adventure-text-minimessage=${adventure_bundle_version} adventure-text-serializer-gson=${adventure_bundle_version} adventure-text-serializer-json=${adventure_bundle_version} +adventure-text-serializer-json-legacy-impl=${adventure_bundle_version} netty-codec-http=${netty_version} ahocorasick=${ahocorasick_version} lz4=${lz4_version} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index 0b7a822c2..834abb7b1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; -import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; @@ -9,7 +8,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Shulker; -import org.bukkit.persistence.PersistentDataType; import org.incendo.cloud.Command; import java.util.Collection; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 9b81c210e..bc6324a65 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -160,6 +160,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TEAM_1_20_3 : PacketConsumers.TEAM_1_20, this.packetIds.clientboundSetPlayerTeamPacket()); registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 464aa795d..215ffbb95 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -31,7 +31,6 @@ import net.momirealms.craftengine.core.world.chunk.Palette; import net.momirealms.craftengine.core.world.chunk.PalettedContainer; import net.momirealms.craftengine.core.world.chunk.packet.MCSection; import net.momirealms.sparrow.nbt.Tag; -import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer; import org.bukkit.*; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; @@ -242,6 +241,165 @@ public class PacketConsumers { } }; + public static final BiConsumer TEAM_1_20_3 = (user, event) -> { + if (!Config.interceptTeam()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + String name = buf.readUtf(); + byte method = buf.readByte(); + if (method != 2 && method != 0) { + return; + } + Tag displayName = buf.readNbt(false); + if (displayName == null) return; + byte friendlyFlags = buf.readByte(); + String nameTagVisibility = buf.readUtf(40); + String collisionRule = buf.readUtf(40); + int color = buf.readVarInt(); + Tag prefix = buf.readNbt(false); + if (prefix == null) return; + Tag suffix = buf.readNbt(false); + if (suffix == null) return; + + Map tokens1 = CraftEngine.instance().imageManager().matchTags(displayName.getAsString()); + Map tokens2 = CraftEngine.instance().imageManager().matchTags(prefix.getAsString()); + Map tokens3 = CraftEngine.instance().imageManager().matchTags(suffix.getAsString()); + if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return; + event.setChanged(true); + + List entities; + if (method == 0) { + entities = buf.readStringList(); + } else { + entities = null; + } + + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(name); + buf.writeByte(method); + + if (!tokens1.isEmpty()) { + Component component = AdventureHelper.tagToComponent(displayName); + for (Map.Entry token : tokens1.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeNbt(AdventureHelper.componentToTag(component), false); + } else { + buf.writeNbt(displayName, false); + } + + buf.writeByte(friendlyFlags); + buf.writeUtf(nameTagVisibility); + buf.writeUtf(collisionRule); + buf.writeVarInt(color); + + if (!tokens2.isEmpty()) { + Component component = AdventureHelper.tagToComponent(prefix); + for (Map.Entry token : tokens2.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeNbt(AdventureHelper.componentToTag(component), false); + } else { + buf.writeNbt(prefix, false); + } + + if (!tokens3.isEmpty()) { + Component component = AdventureHelper.tagToComponent(suffix); + for (Map.Entry token : tokens3.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeNbt(AdventureHelper.componentToTag(component), false); + } else { + buf.writeNbt(suffix, false); + } + + if (entities != null) { + buf.writeStringList(entities); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetPlayerTeamPacket", e); + } + }; + + public static final BiConsumer TEAM_1_20 = (user, event) -> { + if (!Config.interceptTeam()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + String name = buf.readUtf(); + byte method = buf.readByte(); + if (method != 2 && method != 0) { + return; + } + String displayName = buf.readUtf(); + byte friendlyFlags = buf.readByte(); + String nameTagVisibility = buf.readUtf(40); + String collisionRule = buf.readUtf(40); + int color = buf.readVarInt(); + String prefix = buf.readUtf(); + String suffix = buf.readUtf(); + + Map tokens1 = CraftEngine.instance().imageManager().matchTags(displayName); + Map tokens2 = CraftEngine.instance().imageManager().matchTags(prefix); + Map tokens3 = CraftEngine.instance().imageManager().matchTags(suffix); + if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return; + event.setChanged(true); + + List entities; + if (method == 0) { + entities = buf.readStringList(); + } else { + entities = null; + } + + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(name); + buf.writeByte(method); + + if (!tokens1.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(displayName); + for (Map.Entry token : tokens1.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeUtf(AdventureHelper.componentToJson(component)); + } else { + buf.writeUtf(displayName); + } + + buf.writeByte(friendlyFlags); + buf.writeUtf(nameTagVisibility); + buf.writeUtf(collisionRule); + buf.writeVarInt(color); + + if (!tokens2.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(prefix); + for (Map.Entry token : tokens2.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeUtf(AdventureHelper.componentToJson(component)); + } else { + buf.writeUtf(prefix); + } + + if (!tokens3.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(suffix); + for (Map.Entry token : tokens3.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeUtf(AdventureHelper.componentToJson(component)); + } else { + buf.writeUtf(suffix); + } + + if (entities != null) { + buf.writeStringList(entities); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetPlayerTeamPacket", e); + } + }; + public static final BiConsumer BOSS_EVENT_1_20 = (user, event) -> { if (!Config.interceptBossBar()) return; try { @@ -301,7 +459,7 @@ public class PacketConsumers { if (nbt == null) return; Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; - Component component = NBTComponentSerializer.nbt().deserialize(nbt); + Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } @@ -314,7 +472,7 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeUUID(uuid); buf.writeVarInt(actionType); - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); buf.writeFloat(health); buf.writeVarInt(color); buf.writeVarInt(division); @@ -325,7 +483,7 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = NBTComponentSerializer.nbt().deserialize(nbt); + Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } @@ -333,7 +491,7 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeUUID(uuid); buf.writeVarInt(actionType); - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e); @@ -344,12 +502,12 @@ public class PacketConsumers { if (!Config.interceptSystemChat()) return; try { FriendlyByteBuf buf = event.getBuffer(); - String json = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); + String jsonOrPlainString = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(jsonOrPlainString); if (tokens.isEmpty()) return; boolean overlay = buf.readBoolean(); event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(json); + Component component = AdventureHelper.jsonToComponent(jsonOrPlainString); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } @@ -372,13 +530,13 @@ public class PacketConsumers { if (tokens.isEmpty()) return; boolean overlay = buf.readBoolean(); event.setChanged(true); - Component component = NBTComponentSerializer.nbt().deserialize(nbt); + Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); buf.writeBoolean(overlay); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e); @@ -414,13 +572,13 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = NBTComponentSerializer.nbt().deserialize(nbt); + Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e); } @@ -455,13 +613,13 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = NBTComponentSerializer.nbt().deserialize(nbt); + Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e); } @@ -496,13 +654,13 @@ public class PacketConsumers { Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; event.setChanged(true); - Component component = NBTComponentSerializer.nbt().deserialize(nbt); + Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } buf.clear(); buf.writeVarInt(event.packetID()); - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e); } @@ -558,20 +716,20 @@ public class PacketConsumers { buf.clear(); buf.writeVarInt(event.packetID()); if (!tokens1.isEmpty()) { - Component component = NBTComponentSerializer.nbt().deserialize(nbt1); + Component component = AdventureHelper.tagToComponent(nbt1); for (Map.Entry token : tokens1.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); } else { buf.writeNbt(nbt1, false); } if (!tokens2.isEmpty()) { - Component component = NBTComponentSerializer.nbt().deserialize(nbt2); + Component component = AdventureHelper.tagToComponent(nbt2); for (Map.Entry token : tokens2.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); } else { buf.writeNbt(nbt2, false); } @@ -614,7 +772,7 @@ public class PacketConsumers { if (nbt == null) return; Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; - Component component = NBTComponentSerializer.nbt().deserialize(nbt); + Component component = AdventureHelper.tagToComponent(nbt); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } @@ -622,7 +780,7 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeVarInt(containerId); buf.writeVarInt(type); - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeNbt(AdventureHelper.componentToTag(component), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); } @@ -1397,7 +1555,6 @@ public class PacketConsumers { } }; - public static final BiConsumer SET_ENTITY_DATA = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index cba589e6e..94a48dfb5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -31,4 +31,6 @@ public interface PacketIds { int clientboundSystemChatPacket(); int clientboundTabListPacket(); + + int clientboundSetPlayerTeamPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index 68b07152f..1b6e1940e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -78,4 +78,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundTabListPacket() { return 101; } + + @Override + public int clientboundSetPlayerTeamPacket() { + return 90; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index 9773d7cb5..e1e38c1d6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -78,4 +78,9 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundTabListPacket() { return 104; } + + @Override + public int clientboundSetPlayerTeamPacket() { + return 92; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index c6d0a66ca..5d1150145 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -78,4 +78,9 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundTabListPacket() { return 106; } + + @Override + public int clientboundSetPlayerTeamPacket() { + return 94; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index 75b6566e3..46d3d3fd4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -78,4 +78,9 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundTabListPacket() { return 109; } + + @Override + public int clientboundSetPlayerTeamPacket() { + return 96; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index 5dc7fa843..f91749a2d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -78,4 +78,9 @@ public class PacketIds1_21 implements PacketIds { public int clientboundTabListPacket() { return PacketIdFinder.clientboundByName("minecraft:tab_list"); } + + @Override + public int clientboundSetPlayerTeamPacket() { + return PacketIdFinder.clientboundByName("minecraft:set_player_team"); + } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 2819c5ff8..896447ad4 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -25,6 +25,7 @@ dependencies { compileOnly("net.kyori:adventure-text-serializer-gson:${rootProject.properties["adventure_bundle_version"]}") { exclude("com.google.code.gson", "gson") } + compileOnly("net.kyori:adventure-text-serializer-json-legacy-impl:${rootProject.properties["adventure_bundle_version"]}") // Command compileOnly("org.incendo:cloud-core:${rootProject.properties["cloud_core_version"]}") compileOnly("org.incendo:cloud-minecraft-extras:${rootProject.properties["cloud_minecraft_extras_version"]}") @@ -46,7 +47,6 @@ dependencies { compileOnly("org.lz4:lz4-java:${rootProject.properties["lz4_version"]}") // Commons IO compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}") - compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}") // Data Fixer Upper compileOnly("com.mojang:datafixerupper:${rootProject.properties["datafixerupper_version"]}") // Aho-Corasick java implementation diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 64b0a6569..6634f8462 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -282,7 +282,7 @@ public abstract class CraftEngine implements Plugin { Dependencies.SNAKE_YAML, Dependencies.BOOSTED_YAML, Dependencies.MINIMESSAGE, - Dependencies.TEXT_SERIALIZER_GSON, + Dependencies.TEXT_SERIALIZER_GSON, Dependencies.TEXT_SERIALIZER_GSON_LEGACY, Dependencies.TEXT_SERIALIZER_JSON, Dependencies.AHO_CORASICK, Dependencies.LZ4 diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 5aaffc694..c3ad70649 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -128,6 +128,7 @@ public class Config { protected boolean image$intercept_packets$title; protected boolean image$intercept_packets$bossbar; protected boolean image$intercept_packets$container; + protected boolean image$intercept_packets$team; public Config(CraftEngine plugin) { this.plugin = plugin; @@ -290,6 +291,7 @@ public class Config { image$intercept_packets$title = config.getBoolean("image.intercept-packets.title", true); image$intercept_packets$bossbar = config.getBoolean("image.intercept-packets.bossbar", true); image$intercept_packets$container = config.getBoolean("image.intercept-packets.container", true); + image$intercept_packets$team = config.getBoolean("image.intercept-packets.team", true); Class modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); if (modClazz != null) { @@ -614,6 +616,10 @@ public class Config { return instance.image$intercept_packets$container; } + public static boolean interceptTeam() { + return instance.image$intercept_packets$team; + } + public YamlDocument loadOrCreateYamlData(String fileName) { File file = new File(this.plugin.dataFolderFile(), fileName); if (!file.exists()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java index e8de100b2..6a70db819 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java @@ -200,6 +200,13 @@ public class Dependencies { "adventure-text-serializer-gson", List.of(Relocation.of("adventure", "net{}kyori{}adventure")) ); + public static final Dependency TEXT_SERIALIZER_GSON_LEGACY = new Dependency( + "adventure-text-serializer-json-legacy-impl", + "net{}kyori", + "adventure-text-serializer-json-legacy-impl", + "adventure-text-serializer-json-legacy-impl", + List.of(Relocation.of("adventure", "net{}kyori{}adventure")) + ); public static final Dependency TEXT_SERIALIZER_JSON = new Dependency( "adventure-text-serializer-json", "net{}kyori", diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java index 3442aa6e6..2a365d14d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -7,6 +7,10 @@ import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.text.serializer.json.JSONOptions; +import net.kyori.adventure.text.serializer.json.legacyimpl.NBTLegacyHoverEventSerializer; +import net.momirealms.sparrow.nbt.Tag; +import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer; /** * Helper class for handling Adventure components and related functionalities. @@ -16,11 +20,18 @@ public class AdventureHelper { private final MiniMessage miniMessage; private final MiniMessage miniMessageStrict; private final GsonComponentSerializer gsonComponentSerializer; + private final NBTComponentSerializer nbtComponentSerializer; private AdventureHelper() { this.miniMessage = MiniMessage.builder().build(); this.miniMessageStrict = MiniMessage.builder().strict(true).build(); - this.gsonComponentSerializer = GsonComponentSerializer.builder().build(); + GsonComponentSerializer.Builder builder = GsonComponentSerializer.builder(); + if (!VersionHelper.isVersionNewerThan1_20_5()) { + builder.legacyHoverEventSerializer(NBTLegacyHoverEventSerializer.get()); + builder.editOptions((b) -> b.value(JSONOptions.EMIT_HOVER_SHOW_ENTITY_ID_AS_INT_ARRAY, false)); + } + this.gsonComponentSerializer = builder.build(); + this.nbtComponentSerializer = NBTComponentSerializer.builder().build(); } private static class SingletonHolder { @@ -54,6 +65,15 @@ public class AdventureHelper { return getInstance().gsonComponentSerializer; } + /** + * Retrieves the NBTComponentSerializer instance. + * + * @return the NBTComponentSerializer instance + */ + public static NBTComponentSerializer getNBT() { + return getInstance().nbtComponentSerializer; + } + /** * Sends a message to an audience. * @@ -134,6 +154,14 @@ public class AdventureHelper { return getGson().serializeToTree(component); } + public static Tag componentToTag(Component component) { + return getNBT().serialize(component); + } + + public static Component tagToComponent(Tag tag) { + return getNBT().deserialize(tag); + } + /** * Checks if a character is a legacy color code. * diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java index 304f24c60..81ceb9719 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java @@ -48,6 +48,22 @@ public class FriendlyByteBuf extends ByteBuf { return BlockPos.of(buf.readLong()); } + public List readStringList() { + int i = this.readVarInt(); + List list = new ArrayList<>(i); + for (int j = 0; j < i; ++j) { + list.add(readUtf()); + } + return list; + } + + public void writeStringList(List list) { + writeVarInt(list.size()); + for (String s : list) { + writeUtf(s); + } + } + public FriendlyByteBuf writeBlockPos(BlockPos pos) { this.writeLong(pos.asLong()); return this; diff --git a/gradle.properties b/gradle.properties index 87061e98c..4001e8005 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,7 +21,7 @@ gson_version=2.11.0 asm_version=9.8 asm_commons_version=9.8 jar_relocator_version=1.7 -adventure_bundle_version=4.19.0 +adventure_bundle_version=4.20.0 adventure_platform_version=4.3.4 cloud_core_version=2.0.0 cloud_services_version=2.0.0 @@ -40,7 +40,7 @@ lz4_version=1.8.0 geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 -sparrow_nbt_version=0.5 +sparrow_nbt_version=0.6.1 sparrow_util_version=0.37 fastutil_version=8.5.15 netty_version=4.1.119.Final