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

改进资源包结果处理行为

This commit is contained in:
XiaoMoMi
2025-07-05 02:35:21 +08:00
parent c0ba2392ee
commit cbca13146c
8 changed files with 24 additions and 59 deletions

View File

@@ -1,6 +1,5 @@
package net.momirealms.craftengine.bukkit.plugin.network;
import com.google.gson.JsonObject;
import io.netty.buffer.ByteBuf;
import io.netty.channel.*;
import io.netty.handler.codec.MessageToMessageDecoder;
@@ -117,8 +116,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
// set up mod channel
this.plugin.javaPlugin().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.javaPlugin(), MOD_CHANNEL, this);
this.plugin.javaPlugin().getServer().getMessenger().registerOutgoingPluginChannel(this.plugin.javaPlugin(), MOD_CHANNEL);
// 配置via频道
this.plugin.javaPlugin().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.javaPlugin(), VIA_CHANNEL, this);
// Inject server channel
try {
Object server = CoreReflections.method$MinecraftServer$getServer.invoke(null);
@@ -153,8 +150,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerNMSPacketConsumer(PacketConsumers.EDIT_BOOK, NetworkReflections.clazz$ServerboundEditBookPacket);
registerNMSPacketConsumer(PacketConsumers.CUSTOM_PAYLOAD, NetworkReflections.clazz$ServerboundCustomPayloadPacket);
registerNMSPacketConsumer(PacketConsumers.RESOURCE_PACK_PUSH, NetworkReflections.clazz$ClientboundResourcePackPushPacket);
registerNMSPacketConsumer(PacketConsumers.HANDSHAKE_C2S, NetworkReflections.clazz$ClientIntentionPacket);
registerNMSPacketConsumer(PacketConsumers.LOGIN_ACKNOWLEDGED, NetworkReflections.clazz$ServerboundLoginAcknowledgedPacket);
registerNMSPacketConsumer(PacketConsumers.RESOURCE_PACK_RESPONSE, NetworkReflections.clazz$ServerboundResourcePackPacket);
registerNMSPacketConsumer(PacketConsumers.ENTITY_EVENT, NetworkReflections.clazz$ClientboundEntityEventPacket);
registerNMSPacketConsumer(PacketConsumers.MOVE_POS_AND_ROTATE_ENTITY, NetworkReflections.clazz$ClientboundMoveEntityPacket$PosRot);
@@ -242,14 +237,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
@Override
public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, byte @NotNull [] message) {
if (channel.equals(VIA_CHANNEL)) {
BukkitServerPlayer user = this.plugin.adapt(player);
if (user != null) {
JsonObject payload = GsonHelper.get().fromJson(new String(message), JsonObject.class);
int version = payload.get("version").getAsInt();
user.setProtocolVersion(version);
}
}
}
@Override

View File

@@ -1253,9 +1253,6 @@ public class PacketConsumers {
player.setConnectionState(ConnectionState.PLAY);
Object dimensionKey;
if (!VersionHelper.isOrAbove1_20_2()) {
if (BukkitNetworkManager.hasViaVersion()) {
user.setProtocolVersion(CraftEngine.instance().compatibilityManager().getPlayerProtocolVersion(player.uuid()));
}
dimensionKey = NetworkReflections.methodHandle$ClientboundLoginPacket$dimensionGetter.invokeExact(packet);
} else {
Object commonInfo = NetworkReflections.methodHandle$ClientboundLoginPacket$commonPlayerSpawnInfoGetter.invokeExact(packet);
@@ -1280,7 +1277,7 @@ public class PacketConsumers {
// When the hotbar is full, the latest creative mode inventory can only be accessed when the player opens the inventory screen. Currently, it is not worth further handling this issue.
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> SET_CREATIVE_SLOT = (user, event, packet) -> {
try {
if (user.protocolVersion().isVersionNewerThan(ProtocolVersion.V1_21_4)) return;
if (VersionHelper.isOrAbove1_21_4()) return;
if (!user.isOnline()) return;
BukkitServerPlayer player = (BukkitServerPlayer) user;
if (VersionHelper.isFolia()) {
@@ -2321,26 +2318,6 @@ public class PacketConsumers {
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> HANDSHAKE_C2S = (user, event, packet) -> {
try {
if (BukkitNetworkManager.hasViaVersion()) return;
int protocolVersion = (int) NetworkReflections.methodHandle$ClientIntentionPacket$protocolVersionGetter.invokeExact(packet);
user.setProtocolVersion(protocolVersion);
} catch (Throwable e) {
CraftEngine.instance().logger().warn("Failed to handle ClientIntentionPacket", e);
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> LOGIN_ACKNOWLEDGED = (user, event, packet) -> {
try {
if (BukkitNetworkManager.hasViaVersion()) {
user.setProtocolVersion(CraftEngine.instance().compatibilityManager().getPlayerProtocolVersion(user.uuid()));
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ServerboundLoginAcknowledgedPacket", e);
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> RESOURCE_PACK_RESPONSE = (user, event, packet) -> {
try {
if (!Config.sendPackOnJoin()) return;
@@ -2353,10 +2330,20 @@ public class PacketConsumers {
return;
}
}
// 检查是否是拒绝或失败
// 检查是否是拒绝
if (Config.kickOnDeclined()) {
if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$DECLINED
|| action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD) {
if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$DECLINED) {
Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance(
ComponentUtils.adventureToMinecraft(Component.translatable("multiplayer.requiredTexturePrompt.disconnect")));
user.sendPacket(kickPacket, true);
user.nettyChannel().disconnect();
return;
}
}
// 检查是否失败
if (Config.kickOnFailedApply()) {
if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD
|| (VersionHelper.isOrAbove1_20_3() && action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$INVALID_URL)) {
Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance(
ComponentUtils.adventureToMinecraft(Component.translatable("multiplayer.requiredTexturePrompt.disconnect")));
user.sendPacket(kickPacket, true);

View File

@@ -29,7 +29,6 @@ import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.context.CooldownData;
import net.momirealms.craftengine.core.plugin.network.ConnectionState;
import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler;
import net.momirealms.craftengine.core.plugin.network.ProtocolVersion;
import net.momirealms.craftengine.core.sound.SoundSource;
import net.momirealms.craftengine.core.util.Direction;
import net.momirealms.craftengine.core.util.Key;
@@ -59,8 +58,7 @@ import java.util.concurrent.atomic.AtomicInteger;
public class BukkitServerPlayer extends Player {
private final BukkitCraftEngine plugin;
// handshake
private ProtocolVersion protocolVersion = ProtocolVersion.UNKNOWN;
// connection state
private final Channel channel;
private ChannelHandler connection;
@@ -880,16 +878,6 @@ public class BukkitServerPlayer extends Player {
return this.resourcePackUUID.contains(uuid);
}
@Override
public ProtocolVersion protocolVersion() {
return this.protocolVersion;
}
@Override
public void setProtocolVersion(int protocolVersion) {
this.protocolVersion = ProtocolVersion.getById(protocolVersion);
}
@Override
public AtomicInteger remainingConfigurationStagePacks() {
return this.remainingConfigurationStagePacks;

View File

@@ -5,7 +5,8 @@ import net.momirealms.craftengine.core.plugin.config.Config;
import java.util.UUID;
public class ResourcePackUtils {
public final class ResourcePackUtils {
private ResourcePackUtils() {}
public static Object createPacket(UUID uuid, String url, String hash) {
return FastNMS.INSTANCE.constructor$ClientboundResourcePackPushPacket(uuid, url, hash, Config.kickOnDeclined(), ComponentUtils.adventureToMinecraft(Config.resourcePackPrompt()));

View File

@@ -76,6 +76,7 @@ resource-pack:
# Send the resource pack on joining the server
send-on-join: true
kick-if-declined: true
kick-if-failed-to-apply: true
prompt: "<yellow>To fully experience our server,<newline>please accept our custom resource pack.</yellow>"
# If you are hosting the resource pack by yourself, replace `localhost` with your server ip otherwise it would only work on your local pc
# If using BungeeCord or Velocity, consider using a proxy-side plugin to handle resource pack delivery.

View File

@@ -87,6 +87,7 @@ public class Config {
protected String resource_pack$overlay_format;
protected boolean resource_pack$delivery$kick_if_declined;
protected boolean resource_pack$delivery$kick_if_failed_to_apply;
protected boolean resource_pack$delivery$send_on_join;
protected boolean resource_pack$delivery$resend_on_upload;
protected boolean resource_pack$delivery$auto_upload;
@@ -247,6 +248,7 @@ public class Config {
resource_pack$delivery$send_on_join = config.getBoolean("resource-pack.delivery.send-on-join", true);
resource_pack$delivery$resend_on_upload = config.getBoolean("resource-pack.delivery.resend-on-upload", true);
resource_pack$delivery$kick_if_declined = config.getBoolean("resource-pack.delivery.kick-if-declined", true);
resource_pack$delivery$kick_if_failed_to_apply = config.getBoolean("resource-pack.delivery.kick-if-failed-to-apply", true);
resource_pack$delivery$auto_upload = config.getBoolean("resource-pack.delivery.auto-upload", true);
resource_pack$delivery$file_to_upload = resolvePath(config.getString("resource-pack.delivery.file-to-upload", "./generated/resource_pack.zip"));
resource_pack$send$prompt = AdventureHelper.miniMessage().deserialize(config.getString("resource-pack.delivery.prompt", "<yellow>To fully experience our server, please accept our custom resource pack.</yellow>"));
@@ -501,6 +503,10 @@ public class Config {
return instance.resource_pack$delivery$kick_if_declined;
}
public static boolean kickOnFailedApply() {
return instance.resource_pack$delivery$kick_if_failed_to_apply;
}
public static Component resourcePackPrompt() {
return instance.resource_pack$send$prompt;
}

View File

@@ -58,10 +58,6 @@ public interface NetWorkUser {
void addResourcePackUUID(UUID uuid);
ProtocolVersion protocolVersion();
void setProtocolVersion(int protocolVersion);
void setServerSideRealPackUUID(UUID uuid);
UUID getServerSideRealPackUUID();

View File

@@ -8,7 +8,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Predicate;
public class MiscUtils {