9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 18:09: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

View File

@@ -11,6 +11,8 @@ import net.momirealms.craftengine.core.world.BlockPos;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
public abstract class Player extends AbstractEntity implements NetWorkUser {
private static final Key TYPE = Key.of("minecraft:player");

View File

@@ -9,6 +9,7 @@ import org.jetbrains.annotations.ApiStatus;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
public interface NetWorkUser {
boolean isOnline();
@@ -61,7 +62,11 @@ public interface NetWorkUser {
void setProtocolVersion(int protocolVersion);
boolean sentResourcePack();
void setServerSideRealPackUUID(UUID uuid);
void setSentResourcePack(boolean sentResourcePack);
UUID getServerSideRealPackUUID();
boolean isResourcePackLoading(UUID uuid);
AtomicInteger remainingConfigurationStagePacks();
}

View File

@@ -15,7 +15,8 @@ public enum ProtocolVersion {
V1_21_3(768, "1.21.3"),
V1_21_4(769, "1.21.4"),
V1_21_5(770, "1.21.5"),
V1_21_6(771, "1.21.6");
V1_21_6(771, "1.21.6"),
V1_21_7(772, "1.21.7");
private final int id;
private final String name;

View File

@@ -20,6 +20,7 @@ public final class MinecraftVersion implements Comparable<MinecraftVersion> {
PACK_FORMATS.put(1_21_04, 46);
PACK_FORMATS.put(1_21_05, 55);
PACK_FORMATS.put(1_21_06, 63);
PACK_FORMATS.put(1_21_07, 64); // TODO 1.21.7-rc2
PACK_FORMATS.put(1_99_99, 1000);
}

View File

@@ -17,5 +17,6 @@ public final class MinecraftVersions {
public static final MinecraftVersion V1_21_4 = new MinecraftVersion("1.21.4");
public static final MinecraftVersion V1_21_5 = new MinecraftVersion("1.21.5");
public static final MinecraftVersion V1_21_6 = new MinecraftVersion("1.21.6");
public static final MinecraftVersion V1_21_7 = new MinecraftVersion("1.21.7");
public static final MinecraftVersion FUTURE = new MinecraftVersion("1.99.99");
}

View File

@@ -29,6 +29,7 @@ public class VersionHelper {
private static final boolean v1_21_4;
private static final boolean v1_21_5;
private static final boolean v1_21_6;
private static final boolean v1_21_7;
static {
try (InputStream inputStream = Class.forName("net.minecraft.obfuscate.DontObfuscate").getResourceAsStream("/version.json")) {
@@ -36,7 +37,7 @@ public class VersionHelper {
throw new IOException("Failed to load version.json");
}
JsonObject json = GsonHelper.parseJsonToJsonObject(new String(inputStream.readAllBytes(), StandardCharsets.UTF_8));
String versionString = json.getAsJsonPrimitive("id").getAsString();
String versionString = json.getAsJsonPrimitive("id").getAsString().split("-", 2)[0];
MINECRAFT_VERSION = new MinecraftVersion(versionString);
@@ -44,8 +45,8 @@ public class VersionHelper {
int major = Integer.parseInt(split[1]);
int minor = split.length == 3 ? Integer.parseInt(split[2].split("-", 2)[0]) : 0;
// 2001 = 1.20.1
// 2104 = 1.21.4
// 12001 = 1.20.1
// 12104 = 1.21.4
version = parseVersionToInteger(versionString);
v1_20 = version >= 12000;
@@ -62,6 +63,7 @@ public class VersionHelper {
v1_21_4 = version >= 12104;
v1_21_5 = version >= 12105;
v1_21_6 = version >= 12106;
v1_21_7 = version >= 12107;
majorVersion = major;
minorVersion = minor;
@@ -209,4 +211,8 @@ public class VersionHelper {
public static boolean isOrAbove1_21_6() {
return v1_21_6;
}
public static boolean isOrAbove1_21_7() {
return v1_21_7;
}
}

View File

@@ -2,17 +2,17 @@ org.gradle.jvmargs=-Xmx1G
# Project settings
# Rule: [major update].[feature update].[bug fix]
project_version=0.0.59.1
project_version=0.0.59.2
config_version=40
lang_version=21
project_group=net.momirealms
latest_supported_version=1.21.6
latest_supported_version=1.21.7
# Supported languages
supported_languages=en,zh_cn,zh_tw,es,tr,de
# Dependency settings
paper_version=1.21.6
paper_version=1.21.7
jetbrains_annotations_version=26.0.2
slf4j_version=2.0.17
log4j_version=2.24.3
@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3
snake_yaml_version=2.4
anti_grief_version=0.18
nms_helper_version=1.0.18
nms_helper_version=1.0.19
evalex_version=3.5.0
reactive_streams_version=1.0.4
amazon_awssdk_version=2.31.23