mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-20 15:39:22 +00:00
添加队伍包拦截
This commit is contained in:
@@ -160,9 +160,8 @@ image:
|
|||||||
title: true
|
title: true
|
||||||
bossbar: true
|
bossbar: true
|
||||||
container: true
|
container: true
|
||||||
# TODO: toast: true
|
team: true
|
||||||
# TODO: name: true
|
# TODO: name: true
|
||||||
# TODO: team: true
|
|
||||||
|
|
||||||
emoji: {}
|
emoji: {}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ snake-yaml=${snake_yaml_version}
|
|||||||
adventure-text-minimessage=${adventure_bundle_version}
|
adventure-text-minimessage=${adventure_bundle_version}
|
||||||
adventure-text-serializer-gson=${adventure_bundle_version}
|
adventure-text-serializer-gson=${adventure_bundle_version}
|
||||||
adventure-text-serializer-json=${adventure_bundle_version}
|
adventure-text-serializer-json=${adventure_bundle_version}
|
||||||
|
adventure-text-serializer-json-legacy-impl=${adventure_bundle_version}
|
||||||
netty-codec-http=${netty_version}
|
netty-codec-http=${netty_version}
|
||||||
ahocorasick=${ahocorasick_version}
|
ahocorasick=${ahocorasick_version}
|
||||||
lz4=${lz4_version}
|
lz4=${lz4_version}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package net.momirealms.craftengine.bukkit.plugin.command.feature;
|
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.bukkit.plugin.command.BukkitCommandFeature;
|
||||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||||
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
|
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.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.entity.Shulker;
|
import org.bukkit.entity.Shulker;
|
||||||
import org.bukkit.persistence.PersistentDataType;
|
|
||||||
import org.incendo.cloud.Command;
|
import org.incendo.cloud.Command;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|||||||
@@ -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.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.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.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.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket());
|
||||||
registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket());
|
registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket());
|
||||||
// registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket());
|
// registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket());
|
||||||
|
|||||||
@@ -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.PalettedContainer;
|
||||||
import net.momirealms.craftengine.core.world.chunk.packet.MCSection;
|
import net.momirealms.craftengine.core.world.chunk.packet.MCSection;
|
||||||
import net.momirealms.sparrow.nbt.Tag;
|
import net.momirealms.sparrow.nbt.Tag;
|
||||||
import net.momirealms.sparrow.nbt.serializer.NBTComponentSerializer;
|
|
||||||
import org.bukkit.*;
|
import org.bukkit.*;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@@ -242,6 +241,165 @@ public class PacketConsumers {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> 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<String, String> tokens1 = CraftEngine.instance().imageManager().matchTags(displayName.getAsString());
|
||||||
|
Map<String, String> tokens2 = CraftEngine.instance().imageManager().matchTags(prefix.getAsString());
|
||||||
|
Map<String, String> tokens3 = CraftEngine.instance().imageManager().matchTags(suffix.getAsString());
|
||||||
|
if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return;
|
||||||
|
event.setChanged(true);
|
||||||
|
|
||||||
|
List<String> 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<String, String> 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<String, String> 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<String, String> 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<NetWorkUser, ByteBufPacketEvent> 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<String, String> tokens1 = CraftEngine.instance().imageManager().matchTags(displayName);
|
||||||
|
Map<String, String> tokens2 = CraftEngine.instance().imageManager().matchTags(prefix);
|
||||||
|
Map<String, String> tokens3 = CraftEngine.instance().imageManager().matchTags(suffix);
|
||||||
|
if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return;
|
||||||
|
event.setChanged(true);
|
||||||
|
|
||||||
|
List<String> 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<String, String> 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<String, String> 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<String, String> 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<NetWorkUser, ByteBufPacketEvent> BOSS_EVENT_1_20 = (user, event) -> {
|
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> BOSS_EVENT_1_20 = (user, event) -> {
|
||||||
if (!Config.interceptBossBar()) return;
|
if (!Config.interceptBossBar()) return;
|
||||||
try {
|
try {
|
||||||
@@ -301,7 +459,7 @@ public class PacketConsumers {
|
|||||||
if (nbt == null) return;
|
if (nbt == null) return;
|
||||||
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
||||||
if (tokens.isEmpty()) return;
|
if (tokens.isEmpty()) return;
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
|
Component component = AdventureHelper.tagToComponent(nbt);
|
||||||
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
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.writeVarInt(event.packetID());
|
||||||
buf.writeUUID(uuid);
|
buf.writeUUID(uuid);
|
||||||
buf.writeVarInt(actionType);
|
buf.writeVarInt(actionType);
|
||||||
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
|
buf.writeNbt(AdventureHelper.componentToTag(component), false);
|
||||||
buf.writeFloat(health);
|
buf.writeFloat(health);
|
||||||
buf.writeVarInt(color);
|
buf.writeVarInt(color);
|
||||||
buf.writeVarInt(division);
|
buf.writeVarInt(division);
|
||||||
@@ -325,7 +483,7 @@ public class PacketConsumers {
|
|||||||
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
||||||
if (tokens.isEmpty()) return;
|
if (tokens.isEmpty()) return;
|
||||||
event.setChanged(true);
|
event.setChanged(true);
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
|
Component component = AdventureHelper.tagToComponent(nbt);
|
||||||
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
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.writeVarInt(event.packetID());
|
||||||
buf.writeUUID(uuid);
|
buf.writeUUID(uuid);
|
||||||
buf.writeVarInt(actionType);
|
buf.writeVarInt(actionType);
|
||||||
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
|
buf.writeNbt(AdventureHelper.componentToTag(component), false);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e);
|
CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e);
|
||||||
@@ -344,12 +502,12 @@ public class PacketConsumers {
|
|||||||
if (!Config.interceptSystemChat()) return;
|
if (!Config.interceptSystemChat()) return;
|
||||||
try {
|
try {
|
||||||
FriendlyByteBuf buf = event.getBuffer();
|
FriendlyByteBuf buf = event.getBuffer();
|
||||||
String json = buf.readUtf();
|
String jsonOrPlainString = buf.readUtf();
|
||||||
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(json);
|
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(jsonOrPlainString);
|
||||||
if (tokens.isEmpty()) return;
|
if (tokens.isEmpty()) return;
|
||||||
boolean overlay = buf.readBoolean();
|
boolean overlay = buf.readBoolean();
|
||||||
event.setChanged(true);
|
event.setChanged(true);
|
||||||
Component component = AdventureHelper.jsonToComponent(json);
|
Component component = AdventureHelper.jsonToComponent(jsonOrPlainString);
|
||||||
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
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;
|
if (tokens.isEmpty()) return;
|
||||||
boolean overlay = buf.readBoolean();
|
boolean overlay = buf.readBoolean();
|
||||||
event.setChanged(true);
|
event.setChanged(true);
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
|
Component component = AdventureHelper.tagToComponent(nbt);
|
||||||
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
||||||
}
|
}
|
||||||
buf.clear();
|
buf.clear();
|
||||||
buf.writeVarInt(event.packetID());
|
buf.writeVarInt(event.packetID());
|
||||||
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
|
buf.writeNbt(AdventureHelper.componentToTag(component), false);
|
||||||
buf.writeBoolean(overlay);
|
buf.writeBoolean(overlay);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e);
|
CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e);
|
||||||
@@ -414,13 +572,13 @@ public class PacketConsumers {
|
|||||||
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
||||||
if (tokens.isEmpty()) return;
|
if (tokens.isEmpty()) return;
|
||||||
event.setChanged(true);
|
event.setChanged(true);
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
|
Component component = AdventureHelper.tagToComponent(nbt);
|
||||||
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
||||||
}
|
}
|
||||||
buf.clear();
|
buf.clear();
|
||||||
buf.writeVarInt(event.packetID());
|
buf.writeVarInt(event.packetID());
|
||||||
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
|
buf.writeNbt(AdventureHelper.componentToTag(component), false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e);
|
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e);
|
||||||
}
|
}
|
||||||
@@ -455,13 +613,13 @@ public class PacketConsumers {
|
|||||||
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
||||||
if (tokens.isEmpty()) return;
|
if (tokens.isEmpty()) return;
|
||||||
event.setChanged(true);
|
event.setChanged(true);
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
|
Component component = AdventureHelper.tagToComponent(nbt);
|
||||||
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
||||||
}
|
}
|
||||||
buf.clear();
|
buf.clear();
|
||||||
buf.writeVarInt(event.packetID());
|
buf.writeVarInt(event.packetID());
|
||||||
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
|
buf.writeNbt(AdventureHelper.componentToTag(component), false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e);
|
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e);
|
||||||
}
|
}
|
||||||
@@ -496,13 +654,13 @@ public class PacketConsumers {
|
|||||||
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
||||||
if (tokens.isEmpty()) return;
|
if (tokens.isEmpty()) return;
|
||||||
event.setChanged(true);
|
event.setChanged(true);
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
|
Component component = AdventureHelper.tagToComponent(nbt);
|
||||||
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
||||||
}
|
}
|
||||||
buf.clear();
|
buf.clear();
|
||||||
buf.writeVarInt(event.packetID());
|
buf.writeVarInt(event.packetID());
|
||||||
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
|
buf.writeNbt(AdventureHelper.componentToTag(component), false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e);
|
CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e);
|
||||||
}
|
}
|
||||||
@@ -558,20 +716,20 @@ public class PacketConsumers {
|
|||||||
buf.clear();
|
buf.clear();
|
||||||
buf.writeVarInt(event.packetID());
|
buf.writeVarInt(event.packetID());
|
||||||
if (!tokens1.isEmpty()) {
|
if (!tokens1.isEmpty()) {
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt1);
|
Component component = AdventureHelper.tagToComponent(nbt1);
|
||||||
for (Map.Entry<String, String> token : tokens1.entrySet()) {
|
for (Map.Entry<String, String> token : tokens1.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
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 {
|
} else {
|
||||||
buf.writeNbt(nbt1, false);
|
buf.writeNbt(nbt1, false);
|
||||||
}
|
}
|
||||||
if (!tokens2.isEmpty()) {
|
if (!tokens2.isEmpty()) {
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt2);
|
Component component = AdventureHelper.tagToComponent(nbt2);
|
||||||
for (Map.Entry<String, String> token : tokens2.entrySet()) {
|
for (Map.Entry<String, String> token : tokens2.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
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 {
|
} else {
|
||||||
buf.writeNbt(nbt2, false);
|
buf.writeNbt(nbt2, false);
|
||||||
}
|
}
|
||||||
@@ -614,7 +772,7 @@ public class PacketConsumers {
|
|||||||
if (nbt == null) return;
|
if (nbt == null) return;
|
||||||
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
Map<String, String> tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString());
|
||||||
if (tokens.isEmpty()) return;
|
if (tokens.isEmpty()) return;
|
||||||
Component component = NBTComponentSerializer.nbt().deserialize(nbt);
|
Component component = AdventureHelper.tagToComponent(nbt);
|
||||||
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
for (Map.Entry<String, String> token : tokens.entrySet()) {
|
||||||
component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue())));
|
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(event.packetID());
|
||||||
buf.writeVarInt(containerId);
|
buf.writeVarInt(containerId);
|
||||||
buf.writeVarInt(type);
|
buf.writeVarInt(type);
|
||||||
buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false);
|
buf.writeNbt(AdventureHelper.componentToTag(component), false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e);
|
CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e);
|
||||||
}
|
}
|
||||||
@@ -1397,7 +1555,6 @@ public class PacketConsumers {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_ENTITY_DATA = (user, event) -> {
|
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_ENTITY_DATA = (user, event) -> {
|
||||||
try {
|
try {
|
||||||
FriendlyByteBuf buf = event.getBuffer();
|
FriendlyByteBuf buf = event.getBuffer();
|
||||||
|
|||||||
@@ -31,4 +31,6 @@ public interface PacketIds {
|
|||||||
int clientboundSystemChatPacket();
|
int clientboundSystemChatPacket();
|
||||||
|
|
||||||
int clientboundTabListPacket();
|
int clientboundTabListPacket();
|
||||||
|
|
||||||
|
int clientboundSetPlayerTeamPacket();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,4 +78,9 @@ public class PacketIds1_20 implements PacketIds {
|
|||||||
public int clientboundTabListPacket() {
|
public int clientboundTabListPacket() {
|
||||||
return 101;
|
return 101;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int clientboundSetPlayerTeamPacket() {
|
||||||
|
return 90;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,4 +78,9 @@ public class PacketIds1_20_2 implements PacketIds {
|
|||||||
public int clientboundTabListPacket() {
|
public int clientboundTabListPacket() {
|
||||||
return 104;
|
return 104;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int clientboundSetPlayerTeamPacket() {
|
||||||
|
return 92;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,4 +78,9 @@ public class PacketIds1_20_3 implements PacketIds {
|
|||||||
public int clientboundTabListPacket() {
|
public int clientboundTabListPacket() {
|
||||||
return 106;
|
return 106;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int clientboundSetPlayerTeamPacket() {
|
||||||
|
return 94;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,4 +78,9 @@ public class PacketIds1_20_5 implements PacketIds {
|
|||||||
public int clientboundTabListPacket() {
|
public int clientboundTabListPacket() {
|
||||||
return 109;
|
return 109;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int clientboundSetPlayerTeamPacket() {
|
||||||
|
return 96;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,4 +78,9 @@ public class PacketIds1_21 implements PacketIds {
|
|||||||
public int clientboundTabListPacket() {
|
public int clientboundTabListPacket() {
|
||||||
return PacketIdFinder.clientboundByName("minecraft:tab_list");
|
return PacketIdFinder.clientboundByName("minecraft:tab_list");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int clientboundSetPlayerTeamPacket() {
|
||||||
|
return PacketIdFinder.clientboundByName("minecraft:set_player_team");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ dependencies {
|
|||||||
compileOnly("net.kyori:adventure-text-serializer-gson:${rootProject.properties["adventure_bundle_version"]}") {
|
compileOnly("net.kyori:adventure-text-serializer-gson:${rootProject.properties["adventure_bundle_version"]}") {
|
||||||
exclude("com.google.code.gson", "gson")
|
exclude("com.google.code.gson", "gson")
|
||||||
}
|
}
|
||||||
|
compileOnly("net.kyori:adventure-text-serializer-json-legacy-impl:${rootProject.properties["adventure_bundle_version"]}")
|
||||||
// Command
|
// Command
|
||||||
compileOnly("org.incendo:cloud-core:${rootProject.properties["cloud_core_version"]}")
|
compileOnly("org.incendo:cloud-core:${rootProject.properties["cloud_core_version"]}")
|
||||||
compileOnly("org.incendo:cloud-minecraft-extras:${rootProject.properties["cloud_minecraft_extras_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"]}")
|
compileOnly("org.lz4:lz4-java:${rootProject.properties["lz4_version"]}")
|
||||||
// Commons IO
|
// Commons IO
|
||||||
compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}")
|
compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}")
|
||||||
compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}")
|
|
||||||
// Data Fixer Upper
|
// Data Fixer Upper
|
||||||
compileOnly("com.mojang:datafixerupper:${rootProject.properties["datafixerupper_version"]}")
|
compileOnly("com.mojang:datafixerupper:${rootProject.properties["datafixerupper_version"]}")
|
||||||
// Aho-Corasick java implementation
|
// Aho-Corasick java implementation
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ public abstract class CraftEngine implements Plugin {
|
|||||||
Dependencies.SNAKE_YAML,
|
Dependencies.SNAKE_YAML,
|
||||||
Dependencies.BOOSTED_YAML,
|
Dependencies.BOOSTED_YAML,
|
||||||
Dependencies.MINIMESSAGE,
|
Dependencies.MINIMESSAGE,
|
||||||
Dependencies.TEXT_SERIALIZER_GSON,
|
Dependencies.TEXT_SERIALIZER_GSON, Dependencies.TEXT_SERIALIZER_GSON_LEGACY,
|
||||||
Dependencies.TEXT_SERIALIZER_JSON,
|
Dependencies.TEXT_SERIALIZER_JSON,
|
||||||
Dependencies.AHO_CORASICK,
|
Dependencies.AHO_CORASICK,
|
||||||
Dependencies.LZ4
|
Dependencies.LZ4
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ public class Config {
|
|||||||
protected boolean image$intercept_packets$title;
|
protected boolean image$intercept_packets$title;
|
||||||
protected boolean image$intercept_packets$bossbar;
|
protected boolean image$intercept_packets$bossbar;
|
||||||
protected boolean image$intercept_packets$container;
|
protected boolean image$intercept_packets$container;
|
||||||
|
protected boolean image$intercept_packets$team;
|
||||||
|
|
||||||
public Config(CraftEngine plugin) {
|
public Config(CraftEngine plugin) {
|
||||||
this.plugin = 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$title = config.getBoolean("image.intercept-packets.title", true);
|
||||||
image$intercept_packets$bossbar = config.getBoolean("image.intercept-packets.bossbar", 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$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);
|
Class<?> modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS);
|
||||||
if (modClazz != null) {
|
if (modClazz != null) {
|
||||||
@@ -614,6 +616,10 @@ public class Config {
|
|||||||
return instance.image$intercept_packets$container;
|
return instance.image$intercept_packets$container;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean interceptTeam() {
|
||||||
|
return instance.image$intercept_packets$team;
|
||||||
|
}
|
||||||
|
|
||||||
public YamlDocument loadOrCreateYamlData(String fileName) {
|
public YamlDocument loadOrCreateYamlData(String fileName) {
|
||||||
File file = new File(this.plugin.dataFolderFile(), fileName);
|
File file = new File(this.plugin.dataFolderFile(), fileName);
|
||||||
if (!file.exists()) {
|
if (!file.exists()) {
|
||||||
|
|||||||
@@ -200,6 +200,13 @@ public class Dependencies {
|
|||||||
"adventure-text-serializer-gson",
|
"adventure-text-serializer-gson",
|
||||||
List.of(Relocation.of("adventure", "net{}kyori{}adventure"))
|
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(
|
public static final Dependency TEXT_SERIALIZER_JSON = new Dependency(
|
||||||
"adventure-text-serializer-json",
|
"adventure-text-serializer-json",
|
||||||
"net{}kyori",
|
"net{}kyori",
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ import net.kyori.adventure.sound.Sound;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
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.
|
* Helper class for handling Adventure components and related functionalities.
|
||||||
@@ -16,11 +20,18 @@ public class AdventureHelper {
|
|||||||
private final MiniMessage miniMessage;
|
private final MiniMessage miniMessage;
|
||||||
private final MiniMessage miniMessageStrict;
|
private final MiniMessage miniMessageStrict;
|
||||||
private final GsonComponentSerializer gsonComponentSerializer;
|
private final GsonComponentSerializer gsonComponentSerializer;
|
||||||
|
private final NBTComponentSerializer nbtComponentSerializer;
|
||||||
|
|
||||||
private AdventureHelper() {
|
private AdventureHelper() {
|
||||||
this.miniMessage = MiniMessage.builder().build();
|
this.miniMessage = MiniMessage.builder().build();
|
||||||
this.miniMessageStrict = MiniMessage.builder().strict(true).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 {
|
private static class SingletonHolder {
|
||||||
@@ -54,6 +65,15 @@ public class AdventureHelper {
|
|||||||
return getInstance().gsonComponentSerializer;
|
return getInstance().gsonComponentSerializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the NBTComponentSerializer instance.
|
||||||
|
*
|
||||||
|
* @return the NBTComponentSerializer instance
|
||||||
|
*/
|
||||||
|
public static NBTComponentSerializer getNBT() {
|
||||||
|
return getInstance().nbtComponentSerializer;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a message to an audience.
|
* Sends a message to an audience.
|
||||||
*
|
*
|
||||||
@@ -134,6 +154,14 @@ public class AdventureHelper {
|
|||||||
return getGson().serializeToTree(component);
|
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.
|
* Checks if a character is a legacy color code.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -48,6 +48,22 @@ public class FriendlyByteBuf extends ByteBuf {
|
|||||||
return BlockPos.of(buf.readLong());
|
return BlockPos.of(buf.readLong());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> readStringList() {
|
||||||
|
int i = this.readVarInt();
|
||||||
|
List<String> list = new ArrayList<>(i);
|
||||||
|
for (int j = 0; j < i; ++j) {
|
||||||
|
list.add(readUtf());
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeStringList(List<String> list) {
|
||||||
|
writeVarInt(list.size());
|
||||||
|
for (String s : list) {
|
||||||
|
writeUtf(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public FriendlyByteBuf writeBlockPos(BlockPos pos) {
|
public FriendlyByteBuf writeBlockPos(BlockPos pos) {
|
||||||
this.writeLong(pos.asLong());
|
this.writeLong(pos.asLong());
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ gson_version=2.11.0
|
|||||||
asm_version=9.8
|
asm_version=9.8
|
||||||
asm_commons_version=9.8
|
asm_commons_version=9.8
|
||||||
jar_relocator_version=1.7
|
jar_relocator_version=1.7
|
||||||
adventure_bundle_version=4.19.0
|
adventure_bundle_version=4.20.0
|
||||||
adventure_platform_version=4.3.4
|
adventure_platform_version=4.3.4
|
||||||
cloud_core_version=2.0.0
|
cloud_core_version=2.0.0
|
||||||
cloud_services_version=2.0.0
|
cloud_services_version=2.0.0
|
||||||
@@ -40,7 +40,7 @@ lz4_version=1.8.0
|
|||||||
geantyref_version=1.3.16
|
geantyref_version=1.3.16
|
||||||
zstd_version=1.5.7-2
|
zstd_version=1.5.7-2
|
||||||
commons_io_version=2.18.0
|
commons_io_version=2.18.0
|
||||||
sparrow_nbt_version=0.5
|
sparrow_nbt_version=0.6.1
|
||||||
sparrow_util_version=0.37
|
sparrow_util_version=0.37
|
||||||
fastutil_version=8.5.15
|
fastutil_version=8.5.15
|
||||||
netty_version=4.1.119.Final
|
netty_version=4.1.119.Final
|
||||||
|
|||||||
Reference in New Issue
Block a user