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

修复1.21.7资源包加载

This commit is contained in:
XiaoMoMi
2025-07-01 04:25:18 +08:00
parent ca74157fac
commit ab9f4d4596
11 changed files with 76 additions and 33 deletions

View File

@@ -270,7 +270,7 @@ public class BukkitCraftEngine extends CraftEngine {
@Override
public String serverVersion() {
return Bukkit.getServer().getBukkitVersion().split("-")[0];
return VersionHelper.MINECRAFT_VERSION.version();
}
@Override

View File

@@ -2288,7 +2288,6 @@ public class PacketConsumers {
if (!url.equals(BukkitPackManager.FAKE_URL)) {
return;
}
event.setCancelled(true);
UUID packUUID = FastNMS.INSTANCE.field$ClientboundResourcePackPushPacket$uuid(packet);
ResourcePackHost host = CraftEngine.instance().packManager().resourcePackHost();
@@ -2302,6 +2301,8 @@ public class PacketConsumers {
user.sendPacket(newPacket, true);
user.addResourcePackUUID(data.uuid());
}
user.remainingConfigurationStagePacks().set(dataList.size());
user.setServerSideRealPackUUID(packUUID);
}).exceptionally(throwable -> {
CraftEngine.instance().logger().warn("Failed to handle ClientboundResourcePackPushPacket", throwable);
user.simulatePacket(FastNMS.INSTANCE.constructor$ServerboundResourcePackPacket$SUCCESSFULLY_LOADED(packUUID));
@@ -2334,19 +2335,38 @@ public class PacketConsumers {
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> RESOURCE_PACK_RESPONSE = (user, event, packet) -> {
try {
if (user.sentResourcePack() || !Config.sendPackOnJoin() || !Config.kickOnDeclined()) return;
Object action = NetworkReflections.methodHandle$ServerboundResourcePackPacket$actionGetter.invokeExact(packet);
if (!Config.sendPackOnJoin()) return;
Object action = FastNMS.INSTANCE.field$ServerboundResourcePackPacket$action(packet);
if (action == null) return;
if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$DECLINED
|| action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD) {
Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance(
ComponentUtils.adventureToMinecraft(Component.translatable("multiplayer.requiredTexturePrompt.disconnect")));
user.sendPacket(kickPacket, true);
user.nettyChannel().disconnect();
return;
if (VersionHelper.isOrAbove1_20_3()) {
UUID uuid = FastNMS.INSTANCE.field$ServerboundResourcePackPacket$id(packet);
if (!user.isResourcePackLoading(uuid)) {
// 不是CraftEngine发送的资源包,不管
return;
}
}
if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$SUCCESSFULLY_LOADED) {
user.setSentResourcePack(true);
// 检查是否是拒绝或失败
if (Config.kickOnDeclined()) {
if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$DECLINED
|| action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD) {
Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance(
ComponentUtils.adventureToMinecraft(Component.translatable("multiplayer.requiredTexturePrompt.disconnect")));
user.sendPacket(kickPacket, true);
user.nettyChannel().disconnect();
return;
}
}
// 将对于1.20.3+适当时间转义为正确的uuid
if (VersionHelper.isOrAbove1_20_3()) {
UUID realUUID = user.getServerSideRealPackUUID();
if (realUUID != null && action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$SUCCESSFULLY_LOADED) {
int remaining = user.remainingConfigurationStagePacks().decrementAndGet();
if (remaining == 0) {
event.setCancelled(true);
user.simulatePacket(FastNMS.INSTANCE.constructor$ServerboundResourcePackPacket$SUCCESSFULLY_LOADED(realUUID));
user.setServerSideRealPackUUID(null);
}
}
}
} catch (Throwable e) {
CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket", e);

View File

@@ -1315,7 +1315,6 @@ public final class NetworkReflections {
public static final MethodHandle methodHandle$ServerboundEditBookPacket$pagesGetter;
public static final MethodHandle methodHandle$ServerboundEditBookPacket$titleGetter;
public static final MethodHandle methodHandle$ServerboundEditBookPacket$slotGetter;
public static final MethodHandle methodHandle$ServerboundResourcePackPacket$actionGetter;
public static final MethodHandle methodHandle$ClientboundEntityEventPacket$entityIdGetter;
public static final MethodHandle methodHandle$ClientboundEntityEventPacket$eventIdGetter;
public static final MethodHandle methodHandle$ClientIntentionPacket$protocolVersionGetter;
@@ -1385,10 +1384,6 @@ public final class NetworkReflections {
ReflectionUtils.unreflectGetter(field$ServerboundEditBookPacket$slot)
.asType(MethodType.methodType(int.class, Object.class))
);
methodHandle$ServerboundResourcePackPacket$actionGetter = requireNonNull(
ReflectionUtils.unreflectGetter(field$ServerboundResourcePackPacket$action)
.asType(MethodType.methodType(Object.class, Object.class))
);
methodHandle$ClientboundEntityEventPacket$entityIdGetter = requireNonNull(
ReflectionUtils.unreflectGetter(field$ClientboundEntityEventPacket$entityId)
.asType(MethodType.methodType(int.class, Object.class))

View File

@@ -55,6 +55,7 @@ import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class BukkitServerPlayer extends Player {
private final BukkitCraftEngine plugin;
@@ -68,7 +69,7 @@ public class BukkitServerPlayer extends Player {
private ConnectionState decoderState;
private ConnectionState encoderState;
private final Set<UUID> resourcePackUUID = Collections.synchronizedSet(new HashSet<>());
private boolean sentResourcePack = !Config.sendPackOnJoin();
private final AtomicInteger remainingConfigurationStagePacks = new AtomicInteger(0);
// some references
private Reference<org.bukkit.entity.Player> playerRef;
private Reference<Object> serverPlayerRef;
@@ -108,6 +109,7 @@ public class BukkitServerPlayer extends Player {
private double cachedInteractionRange;
// cooldown data
private CooldownData cooldownData;
private UUID serverSideRealPackUUID;
private final Map<Integer, EntityPacketHandler> entityTypeView = new ConcurrentHashMap<>();
@@ -873,6 +875,11 @@ public class BukkitServerPlayer extends Player {
}
}
@Override
public boolean isResourcePackLoading(UUID uuid) {
return this.resourcePackUUID.contains(uuid);
}
@Override
public ProtocolVersion protocolVersion() {
return this.protocolVersion;
@@ -884,13 +891,18 @@ public class BukkitServerPlayer extends Player {
}
@Override
public boolean sentResourcePack() {
return this.sentResourcePack;
public AtomicInteger remainingConfigurationStagePacks() {
return this.remainingConfigurationStagePacks;
}
@Override
public void setSentResourcePack(boolean sentResourcePack) {
this.sentResourcePack = sentResourcePack;
public void setServerSideRealPackUUID(UUID uuid) {
this.serverSideRealPackUUID = uuid;
}
@Override
public UUID getServerSideRealPackUUID() {
return this.serverSideRealPackUUID;
}
@Override