mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-26 02:19:23 +00:00
改进资源包结果处理行为
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -58,10 +58,6 @@ public interface NetWorkUser {
|
||||
|
||||
void addResourcePackUUID(UUID uuid);
|
||||
|
||||
ProtocolVersion protocolVersion();
|
||||
|
||||
void setProtocolVersion(int protocolVersion);
|
||||
|
||||
void setServerSideRealPackUUID(UUID uuid);
|
||||
|
||||
UUID getServerSideRealPackUUID();
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user