From 970fa77ceba05082a713a8aa4204fbd50cdeade5 Mon Sep 17 00:00:00 2001 From: CrebsTheCoder Date: Thu, 12 Nov 2026 09:59:45 +0800 Subject: [PATCH 1/2] Lower version requirement --- README.md | 4 +-- build.gradle.kts | 8 +++-- .../api/simple/PlayerSkinManager.java | 3 +- .../general/field/PacketConstructor.java | 34 +++++++++++-------- src/main/resources/plugin.yml | 2 +- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 42788c4..4d0dedf 100644 --- a/README.md +++ b/README.md @@ -46,12 +46,12 @@ Create client-side entities, send packets, and change what individual players se | Dependency | Version | Notes | | :--- | :--- | :--- | -| Paper | **26.3+** | Required | +| Paper | **1.21.11+** | Required | | Skript | **2.17.0+** | Required | | PacketEvents | **2.14.0+** | Required | | [SkBee](https://modrinth.com/plugin/skbee/versions) | **3.26.0+** | Optional; enables the NBT Compound hook | -Only the latest supported Skript and Minecraft versions receive support. Older versions may work, but are not officially supported. +Minecraft 1.21.11 and newer versions supported by the required dependencies are supported. Java 21 or newer is required; use the Java version required by your Paper version. --- diff --git a/build.gradle.kts b/build.gradle.kts index ae6dd38..8a12af7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "org.crebs" -version = "1.0.2" +version = "1.0.4" val mockitoAgent by configurations.creating @@ -27,6 +27,7 @@ repositories { } dependencies { + implementation("org.ow2.asm:asm-tree:9.11.1") implementation("org.bstats:bstats-bukkit:3.2.1") testImplementation(platform("org.junit:junit-bom:6.0.0")) testImplementation("org.junit.jupiter:junit-jupiter") @@ -47,7 +48,7 @@ dependencies { isTransitive = false } implementation("com.github.ShaneBeee:SkriptRegistration:1.5.0") - compileOnly("io.papermc.paper:paper-api:26.3.build.195-stable") { + compileOnly("io.papermc.paper:paper-api:1.21.11-R0.1-SNAPSHOT") { exclude(group = "org.apache.maven", module = "maven-resolver-provider") exclude(group = "org.apache.logging.log4j", module = "log4j-api") } @@ -65,7 +66,7 @@ java { tasks.withType().configureEach { options.encoding = "UTF-8" - options.release.set(25) + options.release.set(21) } tasks.processResources { @@ -78,6 +79,7 @@ tasks.processResources { tasks.shadowJar { archiveClassifier.set("") relocate("org.bstats", "org.crebs.skpackets.libs.bstats") + relocate("org.objectweb.asm", "org.crebs.skpackets.libs.asm") relocate("me.tofaa.entitylib", "org.crebs.skpackets.libs.entitylib") relocate("com.github.shanebeee.skr", "org.crebs.skpackets.libs.skr") mergeServiceFiles() diff --git a/src/main/java/org/crebs/skpackets/api/simple/PlayerSkinManager.java b/src/main/java/org/crebs/skpackets/api/simple/PlayerSkinManager.java index ec7929d..354c4c7 100644 --- a/src/main/java/org/crebs/skpackets/api/simple/PlayerSkinManager.java +++ b/src/main/java/org/crebs/skpackets/api/simple/PlayerSkinManager.java @@ -338,8 +338,7 @@ static void refreshPlayer(Player player) { send( player, new WrapperPlayServerPlayerAbilities( - player.isInvulnerableTo( - org.bukkit.damage.DamageSource.builder(org.bukkit.damage.DamageType.GENERIC).build()) + player.isInvulnerable() || player.getGameMode() == org.bukkit.GameMode.CREATIVE || player.getGameMode() == org.bukkit.GameMode.SPECTATOR, player.isFlying(), diff --git a/src/main/java/org/crebs/skpackets/elements/general/field/PacketConstructor.java b/src/main/java/org/crebs/skpackets/elements/general/field/PacketConstructor.java index d0ced68..9555943 100644 --- a/src/main/java/org/crebs/skpackets/elements/general/field/PacketConstructor.java +++ b/src/main/java/org/crebs/skpackets/elements/general/field/PacketConstructor.java @@ -9,10 +9,10 @@ import org.crebs.skpackets.api.util.field.ConstructionContext; import java.io.IOException; -import java.lang.classfile.Attributes; -import java.lang.classfile.ClassFile; -import java.lang.classfile.MethodModel; -import java.lang.classfile.TypeAnnotation; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.TypeReference; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.MethodNode; import java.lang.invoke.MethodType; import java.lang.reflect.Constructor; import java.lang.reflect.Type; @@ -60,9 +60,11 @@ private static PacketConstructor discover(Class wrapper) { try (var stream = wrapper.getResourceAsStream("/" + wrapper.getName().replace('.', '/') + ".class")) { if (stream == null) throw new IllegalStateException("Cannot read PacketEvents class " + wrapper.getName()); PacketConstructor selected = null; - for (MethodModel model : ClassFile.of().parse(stream.readAllBytes()).methods()) { - if (!model.methodName().equalsString("")) continue; - Constructor constructor = constructors.get(model.methodType().stringValue()); + ClassNode classNode = new ClassNode(); + new ClassReader(stream).accept(classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + for (MethodNode model : classNode.methods) { + if (!model.name.equals("")) continue; + Constructor constructor = constructors.get(model.desc); if (constructor == null || selected != null && constructor.getParameterCount() < selected.arguments().size()) continue; var parameters = constructor.getParameters(); List arguments = new ArrayList<>(); @@ -102,12 +104,16 @@ PacketWrapper create(ConstructionContext values, Map attribute.annotations().stream()), - model.findAttribute(Attributes.runtimeVisibleTypeAnnotations()).stream().flatMap(attribute -> attribute.annotations().stream())) - .anyMatch(annotation -> annotation.targetInfo() instanceof TypeAnnotation.FormalParameterTarget target - && target.formalParameterIndex() == index && annotation.targetPath().isEmpty() - && annotation.annotation().className().stringValue().endsWith("/Nullable;")); + private static boolean nullable(MethodNode model, int index) { + return Stream.of(model.invisibleTypeAnnotations, model.visibleTypeAnnotations) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .anyMatch(annotation -> { + TypeReference target = new TypeReference(annotation.typeRef); + return target.getSort() == TypeReference.METHOD_FORMAL_PARAMETER + && target.getFormalParameterIndex() == index + && (annotation.typePath == null || annotation.typePath.getLength() == 0) + && annotation.desc.endsWith("/Nullable;"); + }); } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 9b5e0b3..cbd5f2f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: skPackets version: '${version}' main: org.crebs.skpackets.SkPackets -api-version: '26.3' +api-version: '1.21.11' description: A packet addon for Skript depend: [Skript, packetevents] softdepend: [SkBee] From 8ad8fef64b7fea9fe923859e42f9922fbc326c8c Mon Sep 17 00:00:00 2001 From: CrebsTheCoder Date: Thu, 12 Nov 2026 11:10:42 +0800 Subject: [PATCH 2/2] Oops skipped a number --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8a12af7..4010a82 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "org.crebs" -version = "1.0.4" +version = "1.0.3" val mockitoAgent by configurations.creating