mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-30 20:39:10 +00:00
fix(core): 修复由于papermc/paper#12347导致的版本兼容性问题
This commit is contained in:
@@ -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("发送失败");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user