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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user