9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

适配新版本客户端模组

This commit is contained in:
jhqwqmc
2025-10-26 03:59:29 +08:00
parent a1fd3650bf
commit ff7ce524b0
4 changed files with 85 additions and 8 deletions

View File

@@ -6,6 +6,9 @@ import net.momirealms.craftengine.bukkit.block.behavior.UnsafeCompositeBlockBeha
import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.injector.BlockGenerator; import net.momirealms.craftengine.bukkit.plugin.injector.BlockGenerator;
import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager;
import net.momirealms.craftengine.bukkit.plugin.network.payload.PayloadHelper;
import net.momirealms.craftengine.bukkit.plugin.network.payload.protocol.VisualBlockStatePacket;
import net.momirealms.craftengine.bukkit.plugin.reflection.bukkit.CraftBukkitReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.bukkit.CraftBukkitReflections;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.*; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.*;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
@@ -63,6 +66,8 @@ public final class BukkitBlockManager extends AbstractBlockManager {
private Set<Object> missingHitSounds = Set.of(); private Set<Object> missingHitSounds = Set.of();
private Set<Object> missingStepSounds = Set.of(); private Set<Object> missingStepSounds = Set.of();
private Set<Key> missingInteractSoundBlocks = Set.of(); private Set<Key> missingInteractSoundBlocks = Set.of();
// 缓存的VisualBlockStatePacket
private VisualBlockStatePacket cachedVisualBlockStatePacket;
public BukkitBlockManager(BukkitCraftEngine plugin) { public BukkitBlockManager(BukkitCraftEngine plugin) {
super(plugin, RegistryUtils.currentBlockRegistrySize(), Config.serverSideBlocks()); super(plugin, RegistryUtils.currentBlockRegistrySize(), Config.serverSideBlocks());
@@ -122,6 +127,11 @@ public final class BukkitBlockManager extends AbstractBlockManager {
public void delayedLoad() { public void delayedLoad() {
this.plugin.networkManager().registerBlockStatePacketListeners(this.blockStateMappings); // 重置方块映射表 this.plugin.networkManager().registerBlockStatePacketListeners(this.blockStateMappings); // 重置方块映射表
super.delayedLoad(); super.delayedLoad();
this.cachedVisualBlockStatePacket = VisualBlockStatePacket.create();
for (BukkitServerPlayer player : BukkitNetworkManager.instance().onlineUsers()) {
if (!player.clientModEnabled()) continue;
PayloadHelper.sendData(player, this.cachedVisualBlockStatePacket);
}
} }
@Override @Override
@@ -358,6 +368,10 @@ public final class BukkitBlockManager extends AbstractBlockManager {
return this.cachedUpdateTagsPacket; return this.cachedUpdateTagsPacket;
} }
public VisualBlockStatePacket cachedVisualBlockStatePacket() {
return this.cachedVisualBlockStatePacket;
}
private void markVanillaNoteBlocks() { private void markVanillaNoteBlocks() {
try { try {
Object block = FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.BLOCK, KeyUtils.toResourceLocation(BlockKeys.NOTE_BLOCK)); Object block = FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.BLOCK, KeyUtils.toResourceLocation(BlockKeys.NOTE_BLOCK));

View File

@@ -4,6 +4,7 @@ import io.netty.buffer.Unpooled;
import net.momirealms.craftengine.bukkit.plugin.network.payload.protocol.CancelBlockUpdatePacket; import net.momirealms.craftengine.bukkit.plugin.network.payload.protocol.CancelBlockUpdatePacket;
import net.momirealms.craftengine.bukkit.plugin.network.payload.protocol.ClientBlockStateSizePacket; import net.momirealms.craftengine.bukkit.plugin.network.payload.protocol.ClientBlockStateSizePacket;
import net.momirealms.craftengine.bukkit.plugin.network.payload.protocol.ClientCustomBlockPacket; import net.momirealms.craftengine.bukkit.plugin.network.payload.protocol.ClientCustomBlockPacket;
import net.momirealms.craftengine.bukkit.plugin.network.payload.protocol.VisualBlockStatePacket;
import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.network.ModPacket; import net.momirealms.craftengine.core.plugin.network.ModPacket;
import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
@@ -20,6 +21,7 @@ public class PayloadHelper {
registerDataType(ClientCustomBlockPacket.TYPE, ClientCustomBlockPacket.CODEC); registerDataType(ClientCustomBlockPacket.TYPE, ClientCustomBlockPacket.CODEC);
registerDataType(CancelBlockUpdatePacket.TYPE, CancelBlockUpdatePacket.CODEC); registerDataType(CancelBlockUpdatePacket.TYPE, CancelBlockUpdatePacket.CODEC);
registerDataType(ClientBlockStateSizePacket.TYPE, ClientBlockStateSizePacket.CODEC); registerDataType(ClientBlockStateSizePacket.TYPE, ClientBlockStateSizePacket.CODEC);
registerDataType(VisualBlockStatePacket.TYPE, VisualBlockStatePacket.CODEC);
} }
public static <T extends ModPacket> void registerDataType(ResourceKey<NetworkCodec<FriendlyByteBuf, ? extends ModPacket>> key, NetworkCodec<FriendlyByteBuf, T> codec) { public static <T extends ModPacket> void registerDataType(ResourceKey<NetworkCodec<FriendlyByteBuf, ? extends ModPacket>> key, NetworkCodec<FriendlyByteBuf, T> codec) {

View File

@@ -4,10 +4,13 @@ package net.momirealms.craftengine.bukkit.plugin.network.payload.protocol;
import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TranslationArgument; import net.kyori.adventure.text.TranslationArgument;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.network.payload.PayloadHelper;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections;
import net.momirealms.craftengine.bukkit.plugin.reflection.paper.PaperReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.paper.PaperReflections;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.bukkit.util.RegistryUtils; import net.momirealms.craftengine.bukkit.util.RegistryUtils;
import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.network.ModPacket; import net.momirealms.craftengine.core.plugin.network.ModPacket;
@@ -17,7 +20,7 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.util.*;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public record ClientCustomBlockPacket(int size) implements ModPacket { public record ClientCustomBlockPacket(int vanillaSize, int currentSize) implements ModPacket {
public static final ResourceKey<NetworkCodec<FriendlyByteBuf, ? extends ModPacket>> TYPE = ResourceKey.create( public static final ResourceKey<NetworkCodec<FriendlyByteBuf, ? extends ModPacket>> TYPE = ResourceKey.create(
BuiltInRegistries.MOD_PACKET.key().location(), Key.of("craftengine", "client_custom_block") BuiltInRegistries.MOD_PACKET.key().location(), Key.of("craftengine", "client_custom_block")
); );
@@ -27,11 +30,12 @@ public record ClientCustomBlockPacket(int size) implements ModPacket {
); );
private ClientCustomBlockPacket(FriendlyByteBuf buf) { private ClientCustomBlockPacket(FriendlyByteBuf buf) {
this(buf.readInt()); this(buf.readInt(), buf.readInt());
} }
private void encode(FriendlyByteBuf buf) { private void encode(FriendlyByteBuf buf) {
buf.writeInt(this.size); buf.writeInt(this.vanillaSize);
buf.writeInt(this.currentSize);
} }
@Override @Override
@@ -42,17 +46,27 @@ public record ClientCustomBlockPacket(int size) implements ModPacket {
@Override @Override
public void handle(NetWorkUser user) { public void handle(NetWorkUser user) {
if (user.clientModEnabled()) return; // 防止滥用 if (user.clientModEnabled()) return; // 防止滥用
int serverBlockRegistrySize = RegistryUtils.currentBlockRegistrySize(); int vanillaBlockRegistrySize = BlockStateUtils.vanillaBlockStateCount();
if (this.size != serverBlockRegistrySize) { if (this.vanillaSize != vanillaBlockRegistrySize) {
user.kick(Component.translatable( user.kick(Component.translatable(
"disconnect.craftengine.block_registry_mismatch", "disconnect.craftengine.vanilla_block_registry_mismatch",
TranslationArgument.numeric(this.size), TranslationArgument.numeric(this.vanillaSize),
TranslationArgument.numeric(vanillaBlockRegistrySize)
));
return;
}
int serverBlockRegistrySize = RegistryUtils.currentBlockRegistrySize();
if (this.currentSize != serverBlockRegistrySize) {
user.kick(Component.translatable(
"disconnect.craftengine.current_block_registry_mismatch",
TranslationArgument.numeric(this.currentSize),
TranslationArgument.numeric(serverBlockRegistrySize) TranslationArgument.numeric(serverBlockRegistrySize)
)); ));
return; return;
} }
user.setClientModState(true); user.setClientModState(true);
user.setClientBlockList(new IntIdentityList(this.size)); user.setClientBlockList(new IntIdentityList(this.currentSize));
PayloadHelper.sendData(user, BukkitBlockManager.instance().cachedVisualBlockStatePacket());
if (!VersionHelper.isOrAbove1_20_2()) { if (!VersionHelper.isOrAbove1_20_2()) {
// 因为旧版本没有配置阶段需要重新发送区块 // 因为旧版本没有配置阶段需要重新发送区块
try { try {

View File

@@ -0,0 +1,47 @@
package net.momirealms.craftengine.bukkit.plugin.network.payload.protocol;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.bukkit.util.RegistryUtils;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.network.ModPacket;
import net.momirealms.craftengine.core.plugin.network.codec.NetworkCodec;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceKey;
public record VisualBlockStatePacket(int[] data) implements ModPacket {
public static final ResourceKey<NetworkCodec<FriendlyByteBuf, ? extends ModPacket>> TYPE = ResourceKey.create(
BuiltInRegistries.MOD_PACKET.key().location(), Key.of("craftengine", "visual_block_state")
);
public static final NetworkCodec<FriendlyByteBuf, VisualBlockStatePacket> CODEC = ModPacket.codec(
VisualBlockStatePacket::encode,
VisualBlockStatePacket::new
);
private VisualBlockStatePacket(FriendlyByteBuf buf) {
this(buf.readVarIntArray());
}
private void encode(FriendlyByteBuf buf) {
buf.writeVarIntArray(this.data);
}
@Override
public ResourceKey<NetworkCodec<FriendlyByteBuf, ? extends ModPacket>> type() {
return TYPE;
}
public static VisualBlockStatePacket create() {
int[] mappings = new int[RegistryUtils.currentBlockRegistrySize()];
for (int i = 0; i < Config.serverSideBlocks(); i++) {
ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(i + BlockStateUtils.vanillaBlockStateCount());
if (state.isEmpty()) continue;
mappings[state.customBlockState().registryId()] = state.vanillaBlockState().registryId();
}
return new VisualBlockStatePacket(mappings);
}
}