9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-31 12:56:28 +00:00

fix(core): 修复由于papermc/paper#12347导致的版本兼容性问题

This commit is contained in:
jhqwqmc
2025-05-31 14:25:37 +08:00
parent b82e1a9fa7
commit 483df4c911
7 changed files with 72 additions and 44 deletions

View File

@@ -1,34 +1,18 @@
package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
import net.momirealms.craftengine.bukkit.util.Reflections;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.incendo.cloud.Command;
import org.incendo.cloud.bukkit.parser.NamespacedKeyParser;
import org.incendo.cloud.context.CommandContext;
import org.incendo.cloud.context.CommandInput;
import org.incendo.cloud.parser.standard.BooleanParser;
import org.incendo.cloud.parser.standard.StringParser;
import org.incendo.cloud.suggestion.Suggestion;
import org.incendo.cloud.suggestion.SuggestionProvider;
import org.incendo.cloud.parser.standard.FloatParser;
import java.util.Collection;
import java.util.HashSet;
import java.util.concurrent.CompletableFuture;
import java.lang.reflect.InvocationTargetException;
public class TestCommand extends BukkitCommandFeature<CommandSender> {
public static final Collection<Suggestion> TARGET_BLOCK_SUGGESTIONS = new HashSet<>();
static {
for (Material material : Material.values()) {
TARGET_BLOCK_SUGGESTIONS.add(Suggestion.suggestion(material.getKey().toString()));
}
}
public TestCommand(CraftEngineCommandManager<CommandSender> commandManager, CraftEngine plugin) {
super(commandManager, plugin);
@@ -38,19 +22,17 @@ public class TestCommand extends BukkitCommandFeature<CommandSender> {
public Command.Builder<? extends CommandSender> assembleCommand(org.incendo.cloud.CommandManager<CommandSender> manager, Command.Builder<CommandSender> builder) {
return builder
.senderType(Player.class)
.required("reset", BooleanParser.booleanParser())
.required("setTag", NamespacedKeyParser.namespacedKeyParser())
.required("targetBlock", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() {
@Override
public @NonNull CompletableFuture<? extends @NonNull Iterable<? extends @NonNull Suggestion>> suggestionsFuture(@NonNull CommandContext<Object> context, @NonNull CommandInput input) {
return CompletableFuture.completedFuture(TARGET_BLOCK_SUGGESTIONS);
}
}))
.required("tickRate", FloatParser.floatParser())
.required("isFrozen", BooleanParser.booleanParser())
.handler(context -> {
Player player = context.sender();
player.sendMessage("开始测试");
NamespacedKey key = context.get("setTag");
player.sendMessage("结束测试");
float tickRate = context.get("tickRate");
boolean isFrozen = context.get("isFrozen");
try {
plugin().adapt(player).sendPacket(Reflections.constructor$ClientboundTickingStatePacket.newInstance(tickRate, isFrozen), true);
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
player.sendMessage("发送失败");
}
});
}

View File

@@ -138,6 +138,13 @@ public class PacketConsumers {
}
}
private static BukkitNetworkManager.Handlers simpleAddEntityHandler(EntityPacketHandler handler) {
return (user, event) -> {
FriendlyByteBuf buf = event.getBuffer();
user.entityPacketHandlers().putIfAbsent(buf.readVarInt(), handler);
};
}
public static void initBlocks(Map<Integer, Integer> map, int registrySize) {
mappings = new int[registrySize];
for (int i = 0; i < registrySize; i++) {
@@ -349,7 +356,7 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> BLOCK_UPDATE = (user, event) -> {
try {
FriendlyByteBuf buf = event.getBuffer();
BlockPos pos = buf.readBlockPos(buf);
BlockPos pos = buf.readBlockPos();
int before = buf.readVarInt();
if (user.clientModEnabled() && !BlockStateUtils.isVanillaBlock(before)) {
return;
@@ -373,7 +380,7 @@ public class PacketConsumers {
FriendlyByteBuf buf = event.getBuffer();
int eventId = buf.readInt();
if (eventId != WorldEvents.BLOCK_BREAK_EFFECT) return;
BlockPos blockPos = buf.readBlockPos(buf);
BlockPos blockPos = buf.readBlockPos();
int state = buf.readInt();
boolean global = buf.readBoolean();
int newState = remap(state);
@@ -2286,10 +2293,4 @@ public class PacketConsumers {
}
};
private static BukkitNetworkManager.Handlers simpleAddEntityHandler(EntityPacketHandler handler) {
return (user, event) -> {
FriendlyByteBuf buf = event.getBuffer();
user.entityPacketHandlers().putIfAbsent(buf.readVarInt(), handler);
};
}
}

View File

@@ -1,6 +1,7 @@
package net.momirealms.craftengine.bukkit.plugin.user;
import com.google.common.collect.Lists;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
@@ -8,6 +9,7 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.gui.CraftEngineInventoryHolder;
import net.momirealms.craftengine.bukkit.plugin.network.payload.DiscardedPayload;
import net.momirealms.craftengine.bukkit.util.*;
import net.momirealms.craftengine.bukkit.world.BukkitWorld;
import net.momirealms.craftengine.core.block.BlockSettings;
@@ -282,6 +284,11 @@ public class BukkitServerPlayer extends Player {
platformPlayer().closeInventory();
}
@Override
public void sendPacket(Object packet) {
this.nettyChannel().writeAndFlush(packet);
}
@Override
public void sendPacket(Object packet, boolean immediately) {
this.plugin.networkManager().sendPacket(this, packet, immediately);
@@ -291,9 +298,14 @@ public class BukkitServerPlayer extends Player {
public void sendCustomPayload(Key channel, byte[] data) {
try {
Object channelKey = KeyUtils.toResourceLocation(channel);
Object dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, data);
Object dataPayload;
if (DiscardedPayload.useNewMethod) {
dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, data);
} else {
dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, Unpooled.wrappedBuffer(data));
}
Object responsePacket = Reflections.constructor$ClientboundCustomPayloadPacket.newInstance(dataPayload);
this.nettyChannel().writeAndFlush(responsePacket);
this.sendPacket(responsePacket);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to send custom payload to " + name(), e);
}
@@ -304,7 +316,7 @@ public class BukkitServerPlayer extends Player {
try {
Object reason = ComponentUtils.adventureToMinecraft(message);
Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance(reason);
this.nettyChannel().writeAndFlush(kickPacket);
this.sendPacket(kickPacket);
this.nettyChannel().disconnect();
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to kick " + name(), e);

View File

@@ -7005,4 +7005,15 @@ public class Reflections {
clazz$AbstractContainerMenu, int.class, new String[]{"incrementStateId", "k"}
)
);
public static final Class<?> clazz$ClientboundTickingStatePacket =
ReflectionUtils.getClazz(
BukkitReflectionUtils.assembleMCClass(
"network.protocol.game.ClientboundTickingStatePacket"
)
);
public static final Constructor<?> constructor$ClientboundTickingStatePacket = Optional.ofNullable(clazz$ClientboundTickingStatePacket)
.map(it -> ReflectionUtils.getConstructor(it, float.class, boolean.class))
.orElse(null);
}