9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 20:39:10 +00:00

feat(network): 添加检测客户端版本

This commit is contained in:
jhqwqmc
2025-04-25 13:16:04 +08:00
parent a381b425d7
commit ad040bed39
9 changed files with 166 additions and 4 deletions

View File

@@ -6,6 +6,7 @@ import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;
import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionProtocol;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20;
@@ -16,10 +17,8 @@ import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.network.ConnectionState;
import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
import net.momirealms.craftengine.core.plugin.network.NetworkManager;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.ListMonitor;
import net.momirealms.craftengine.core.util.TriConsumer;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.craftengine.core.plugin.network.ProtocolVersion;
import net.momirealms.craftengine.core.util.*;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -57,6 +56,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
private final BiConsumer<Object, Object> packetConsumer;
private final BiConsumer<Object, Object> immediatePacketConsumer;
private final BukkitCraftEngine plugin;
private final ViaVersionProtocol viaVersionProtocol;
private final Map<ChannelPipeline, BukkitServerPlayer> users = new ConcurrentHashMap<>();
private final Map<UUID, BukkitServerPlayer> onlineUsers = new ConcurrentHashMap<>();
@@ -77,6 +77,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
instance = this;
hasModelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine") != null;
this.plugin = plugin;
// hook via
this.viaVersionProtocol = new ViaVersionProtocol(Bukkit.getPluginManager().getPlugin("ViaVersion") != null);
// set up packet id
this.packetIds = setupPacketIds();
// register packet handlers
@@ -147,6 +149,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerNMSPacketConsumer(PacketConsumers.EDIT_BOOK, Reflections.clazz$ServerboundEditBookPacket);
registerNMSPacketConsumer(PacketConsumers.CUSTOM_PAYLOAD, Reflections.clazz$ServerboundCustomPayloadPacket);
registerNMSPacketConsumer(PacketConsumers.RESOURCE_PACK_PUSH, Reflections.clazz$ClientboundResourcePackPushPacket);
registerNMSPacketConsumer(PacketConsumers.HANDSHAKE_C2S, Reflections.clazz$ClientIntentionPacket);
registerNMSPacketConsumer(PacketConsumers.LOGIN_ACKNOWLEDGED, Reflections.clazz$ServerboundLoginAcknowledgedPacket);
registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket());
registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket());
registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_21_3() ? PacketConsumers.LEVEL_PARTICLE_1_21_3 : (VersionHelper.isVersionNewerThan1_20_5() ? PacketConsumers.LEVEL_PARTICLE_1_20_5 : PacketConsumers.LEVEL_PARTICLE_1_20), this.packetIds.clientboundLevelParticlesPacket());
@@ -620,4 +624,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
}
return output;
}
public ViaVersionProtocol viaVersionProtocol() {
return this.viaVersionProtocol;
}
}

View File

@@ -10,6 +10,7 @@ import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent;
import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineUtils;
import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionProtocol;
import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager;
import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture;
import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior;
@@ -1248,6 +1249,10 @@ public class PacketConsumers {
player.setConnectionState(ConnectionState.PLAY);
Object dimensionKey;
if (!VersionHelper.isVersionNewerThan1_20_2()) {
ViaVersionProtocol viaVersionProtocol = BukkitNetworkManager.instance().viaVersionProtocol();
if (viaVersionProtocol.hasPlugin()) {
user.setProtocolVersion(viaVersionProtocol.getPlayerProtocolVersion(player.uuid()));
}
dimensionKey = Reflections.field$ClientboundLoginPacket$dimension.get(packet);
} else {
Object commonInfo = Reflections.field$ClientboundLoginPacket$commonPlayerSpawnInfo.get(packet);
@@ -2178,4 +2183,25 @@ public class PacketConsumers {
CraftEngine.instance().logger().warn("Failed to handle ClientboundResourcePackPushPacket", e);
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> HANDSHAKE_C2S = (user, event, packet) -> {
try {
if (BukkitNetworkManager.instance().viaVersionProtocol().hasPlugin()) return;
int protocolVersion = Reflections.field$ClientIntentionPacket$protocolVersion.getInt(packet);
user.setProtocolVersion(protocolVersion);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientIntentionPacket", e);
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> LOGIN_ACKNOWLEDGED = (user, event, packet) -> {
try {
ViaVersionProtocol viaVersionProtocol = BukkitNetworkManager.instance().viaVersionProtocol();
if (viaVersionProtocol.hasPlugin()) {
user.setProtocolVersion(viaVersionProtocol.getPlayerProtocolVersion(user.uuid()));
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ServerboundLoginAcknowledgedPacket", e);
}
};
}

View File

@@ -18,6 +18,7 @@ import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.network.ConnectionState;
import net.momirealms.craftengine.core.plugin.network.ProtocolVersion;
import net.momirealms.craftengine.core.util.Direction;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.VersionHelper;
@@ -39,6 +40,8 @@ import java.util.concurrent.ConcurrentHashMap;
public class BukkitServerPlayer extends Player {
private final BukkitCraftEngine plugin;
// handshake
private ProtocolVersion protocolVersion = ProtocolVersion.UNKNOWN;
// connection state
private final Channel channel;
private String name;
@@ -758,6 +761,16 @@ public class BukkitServerPlayer extends Player {
}
}
@Override
public ProtocolVersion protocolVersion() {
return this.protocolVersion;
}
@Override
public void setProtocolVersion(int protocolVersion) {
this.protocolVersion = ProtocolVersion.getById(protocolVersion);
}
@Override
public void clearView() {
this.entityTypeView.clear();

View File

@@ -6521,4 +6521,23 @@ public class Reflections {
"core.component.DataComponentType"
)
);
public static final Class<?> clazz$ClientIntentionPacket = requireNonNull(
ReflectionUtils.getClazz(
BukkitReflectionUtils.assembleMCClass("network.protocol.handshake.ClientIntentionPacket"),
BukkitReflectionUtils.assembleMCClass("network.protocol.handshake.PacketHandshakingInSetProtocol")
)
);
public static final Field field$ClientIntentionPacket$protocolVersion = requireNonNull(
ReflectionUtils.getDeclaredField(
clazz$ClientIntentionPacket, int.class, VersionHelper.isVersionNewerThan1_20_2() ? 0 : 1
)
);
// 1.20.2+
public static final Class<?> clazz$ServerboundLoginAcknowledgedPacket =
ReflectionUtils.getClazz(
BukkitReflectionUtils.assembleMCClass("network.protocol.login.ServerboundLoginAcknowledgedPacket")
);
}