From e4f2ccaedc2994ae5cb52856ca0a454b46f4b8ba Mon Sep 17 00:00:00 2001 From: angushushu Date: Thu, 6 Nov 2025 19:58:39 -0500 Subject: [PATCH 1/3] make it work first --- .gitignore | 5 +- build.gradle.kts | 6 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../minecraft/nms/jukebox/JukeboxFactory.java | 13 +++- nms/versions/21_3/build.gradle.kts | 13 ++++ .../minecraft/nms/jukebox/versions/V21_3.java | 78 +++++++++++++++++++ nms/versions/21_4/build.gradle.kts | 13 ++++ .../minecraft/nms/jukebox/versions/V21_4.java | 78 +++++++++++++++++++ nms/versions/21_5/build.gradle.kts | 12 +++ .../minecraft/nms/jukebox/versions/V21_5.java | 78 +++++++++++++++++++ settings.gradle | 5 +- 11 files changed, 298 insertions(+), 5 deletions(-) create mode 100644 nms/versions/21_3/build.gradle.kts create mode 100644 nms/versions/21_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_3.java create mode 100644 nms/versions/21_4/build.gradle.kts create mode 100644 nms/versions/21_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_4.java create mode 100644 nms/versions/21_5/build.gradle.kts create mode 100644 nms/versions/21_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_5.java diff --git a/.gitignore b/.gitignore index f239bef..b8be6c7 100644 --- a/.gitignore +++ b/.gitignore @@ -119,4 +119,7 @@ run/ /libs -lombok.config \ No newline at end of file +lombok.config + +# temp files +/tmp \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 133f6a4..ca853e0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { id("io.github.goooler.shadow") version "8.1.7" id("io.freefair.lombok") version "8.6" id("net.minecrell.plugin-yml.bukkit") version "0.6.0" - id("io.papermc.paperweight.userdev") version "1.7.1" apply false + id("io.papermc.paperweight.userdev") version "1.7.7" apply false } bukkit { @@ -69,4 +69,8 @@ dependencies { api(project(":nms:versions:20_5", "reobf")) api(project(":nms:versions:21", "reobf")) api(project(":nms:versions:21_2", "reobf")) + // 21_3, 21_4, 21_5 使用纯 Bukkit API,不需要 reobf + api(project(":nms:versions:21_3")) + api(project(":nms:versions:21_4")) + api(project(":nms:versions:21_5")) } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d18421..81aa1c0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/nms/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/JukeboxFactory.java b/nms/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/JukeboxFactory.java index ca7309e..c7dedf8 100644 --- a/nms/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/JukeboxFactory.java +++ b/nms/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/JukeboxFactory.java @@ -24,8 +24,19 @@ public class JukeboxFactory { case "1.21.3": className = START_PATH + "V21_2"; break; + case "1.21.4": + className = START_PATH + "V21_3"; + break; + case "1.21.5": + className = START_PATH + "V21_4"; + break; + case "1.21.6": + case "1.21.7": + case "1.21.8": + case "1.21.9": + case "1.21.10": default: - className = null; + className = START_PATH + "V21_5"; break; } } else if (iV == 20) { diff --git a/nms/versions/21_3/build.gradle.kts b/nms/versions/21_3/build.gradle.kts new file mode 100644 index 0000000..44fbb33 --- /dev/null +++ b/nms/versions/21_3/build.gradle.kts @@ -0,0 +1,13 @@ +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") +} + +dependencies { + // 使用纯 Bukkit API,不需要 NMS + compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") +} + diff --git a/nms/versions/21_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_3.java b/nms/versions/21_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_3.java new file mode 100644 index 0000000..16ec989 --- /dev/null +++ b/nms/versions/21_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_3.java @@ -0,0 +1,78 @@ +package ru.spliterash.musicbox.minecraft.nms.jukebox.versions; + +import org.bukkit.block.Jukebox; +import org.bukkit.inventory.ItemStack; +import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; + +import java.lang.reflect.Method; +import java.lang.reflect.Field; + +public class V21_3 implements IJukebox { + private final Object tileEntity; + private final Class craftItemStackClass; + private final Class nmsItemStackClass; + + public V21_3(Jukebox jukebox) { + try { + Class blockEntityClass = Class.forName("net.minecraft.world.level.block.entity.BlockEntity"); + Object foundTileEntity = null; + + Class current = jukebox.getClass(); + while (current != null && foundTileEntity == null) { + for (Field field : current.getDeclaredFields()) { + if (blockEntityClass.isAssignableFrom(field.getType())) { + field.setAccessible(true); + foundTileEntity = field.get(jukebox); + break; + } + } + current = current.getSuperclass(); + } + + if (foundTileEntity == null) { + throw new NoSuchFieldException("Unable to locate BlockEntity field on CraftJukebox"); + } + + tileEntity = foundTileEntity; + + craftItemStackClass = Class.forName("org.bukkit.craftbukkit.inventory.CraftItemStack"); + nmsItemStackClass = Class.forName("net.minecraft.world.item.ItemStack"); + } catch (Exception e) { + throw new RuntimeException("Failed to initialize V21_3", e); + } + } + + public void setJukebox(ItemStack item) { + try { + Method asNMSCopy = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class); + Object converted = asNMSCopy.invoke(null, item); + + Method setSongItem = tileEntity.getClass().getMethod("setSongItemWithoutPlaying", nmsItemStackClass, long.class); + setSongItem.invoke(tileEntity, converted, 0L); + } catch (Exception e) { + throw new RuntimeException("Failed to set jukebox item", e); + } + } + + public ItemStack getJukebox() { + try { + Method getTheItem = tileEntity.getClass().getMethod("getTheItem"); + Object nmsItem = getTheItem.invoke(tileEntity); + + if (nmsItem == null) { + return null; + } + + Method isEmpty = nmsItem.getClass().getMethod("isEmpty"); + boolean empty = (boolean) isEmpty.invoke(nmsItem); + if (empty) { + return null; + } + + Method asBukkitCopy = craftItemStackClass.getMethod("asBukkitCopy", nmsItemStackClass); + return (ItemStack) asBukkitCopy.invoke(null, nmsItem); + } catch (Exception e) { + throw new RuntimeException("Failed to get jukebox item", e); + } + } +} diff --git a/nms/versions/21_4/build.gradle.kts b/nms/versions/21_4/build.gradle.kts new file mode 100644 index 0000000..44fbb33 --- /dev/null +++ b/nms/versions/21_4/build.gradle.kts @@ -0,0 +1,13 @@ +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") +} + +dependencies { + // 使用纯 Bukkit API,不需要 NMS + compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") +} + diff --git a/nms/versions/21_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_4.java b/nms/versions/21_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_4.java new file mode 100644 index 0000000..6c6d8aa --- /dev/null +++ b/nms/versions/21_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_4.java @@ -0,0 +1,78 @@ +package ru.spliterash.musicbox.minecraft.nms.jukebox.versions; + +import org.bukkit.block.Jukebox; +import org.bukkit.inventory.ItemStack; +import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; + +import java.lang.reflect.Method; +import java.lang.reflect.Field; + +public class V21_4 implements IJukebox { + private final Object tileEntity; + private final Class craftItemStackClass; + private final Class nmsItemStackClass; + + public V21_4(Jukebox jukebox) { + try { + Class blockEntityClass = Class.forName("net.minecraft.world.level.block.entity.BlockEntity"); + Object foundTileEntity = null; + + Class current = jukebox.getClass(); + while (current != null && foundTileEntity == null) { + for (Field field : current.getDeclaredFields()) { + if (blockEntityClass.isAssignableFrom(field.getType())) { + field.setAccessible(true); + foundTileEntity = field.get(jukebox); + break; + } + } + current = current.getSuperclass(); + } + + if (foundTileEntity == null) { + throw new NoSuchFieldException("Unable to locate BlockEntity field on CraftJukebox"); + } + + tileEntity = foundTileEntity; + + craftItemStackClass = Class.forName("org.bukkit.craftbukkit.inventory.CraftItemStack"); + nmsItemStackClass = Class.forName("net.minecraft.world.item.ItemStack"); + } catch (Exception e) { + throw new RuntimeException("Failed to initialize V21_4", e); + } + } + + public void setJukebox(ItemStack item) { + try { + Method asNMSCopy = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class); + Object converted = asNMSCopy.invoke(null, item); + + Method setSongItem = tileEntity.getClass().getMethod("setSongItemWithoutPlaying", nmsItemStackClass, long.class); + setSongItem.invoke(tileEntity, converted, 0L); + } catch (Exception e) { + throw new RuntimeException("Failed to set jukebox item", e); + } + } + + public ItemStack getJukebox() { + try { + Method getTheItem = tileEntity.getClass().getMethod("getTheItem"); + Object nmsItem = getTheItem.invoke(tileEntity); + + if (nmsItem == null) { + return null; + } + + Method isEmpty = nmsItem.getClass().getMethod("isEmpty"); + boolean empty = (boolean) isEmpty.invoke(nmsItem); + if (empty) { + return null; + } + + Method asBukkitCopy = craftItemStackClass.getMethod("asBukkitCopy", nmsItemStackClass); + return (ItemStack) asBukkitCopy.invoke(null, nmsItem); + } catch (Exception e) { + throw new RuntimeException("Failed to get jukebox item", e); + } + } +} diff --git a/nms/versions/21_5/build.gradle.kts b/nms/versions/21_5/build.gradle.kts new file mode 100644 index 0000000..2c2d057 --- /dev/null +++ b/nms/versions/21_5/build.gradle.kts @@ -0,0 +1,12 @@ +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") +} + +dependencies { + compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") +} + diff --git a/nms/versions/21_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_5.java b/nms/versions/21_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_5.java new file mode 100644 index 0000000..5925b9e --- /dev/null +++ b/nms/versions/21_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_5.java @@ -0,0 +1,78 @@ +package ru.spliterash.musicbox.minecraft.nms.jukebox.versions; + +import org.bukkit.block.Jukebox; +import org.bukkit.inventory.ItemStack; +import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; + +import java.lang.reflect.Method; +import java.lang.reflect.Field; + +public class V21_5 implements IJukebox { + private final Object tileEntity; + private final Class craftItemStackClass; + private final Class nmsItemStackClass; + + public V21_5(Jukebox jukebox) { + try { + Class blockEntityClass = Class.forName("net.minecraft.world.level.block.entity.BlockEntity"); + Object foundTileEntity = null; + + Class current = jukebox.getClass(); + while (current != null && foundTileEntity == null) { + for (Field field : current.getDeclaredFields()) { + if (blockEntityClass.isAssignableFrom(field.getType())) { + field.setAccessible(true); + foundTileEntity = field.get(jukebox); + break; + } + } + current = current.getSuperclass(); + } + + if (foundTileEntity == null) { + throw new NoSuchFieldException("Unable to locate BlockEntity field on CraftJukebox"); + } + + tileEntity = foundTileEntity; + + craftItemStackClass = Class.forName("org.bukkit.craftbukkit.inventory.CraftItemStack"); + nmsItemStackClass = Class.forName("net.minecraft.world.item.ItemStack"); + } catch (Exception e) { + throw new RuntimeException("Failed to initialize V21_5", e); + } + } + + public void setJukebox(ItemStack item) { + try { + Method asNMSCopy = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class); + Object converted = asNMSCopy.invoke(null, item); + + Method setSongItem = tileEntity.getClass().getMethod("setSongItemWithoutPlaying", nmsItemStackClass, long.class); + setSongItem.invoke(tileEntity, converted, 0L); + } catch (Exception e) { + throw new RuntimeException("Failed to set jukebox item", e); + } + } + + public ItemStack getJukebox() { + try { + Method getTheItem = tileEntity.getClass().getMethod("getTheItem"); + Object nmsItem = getTheItem.invoke(tileEntity); + + if (nmsItem == null) { + return null; + } + + Method isEmpty = nmsItem.getClass().getMethod("isEmpty"); + boolean empty = (boolean) isEmpty.invoke(nmsItem); + if (empty) { + return null; + } + + Method asBukkitCopy = craftItemStackClass.getMethod("asBukkitCopy", nmsItemStackClass); + return (ItemStack) asBukkitCopy.invoke(null, nmsItem); + } catch (Exception e) { + throw new RuntimeException("Failed to get jukebox item", e); + } + } +} diff --git a/settings.gradle b/settings.gradle index 231ae22..73012c9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,4 +14,7 @@ include "nms:versions:20_2" include "nms:versions:20_3" include "nms:versions:20_5" include "nms:versions:21" -include "nms:versions:21_2" \ No newline at end of file +include "nms:versions:21_2" +include "nms:versions:21_3" +include "nms:versions:21_4" +include "nms:versions:21_5" \ No newline at end of file From 8cc4a4539afcc6d576e3f10d959d4b1abfb353e8 Mon Sep 17 00:00:00 2001 From: angushushu Date: Thu, 6 Nov 2025 22:37:35 -0500 Subject: [PATCH 2/3] use bundle --- build.gradle.kts | 11 ++- gradle/wrapper/gradle-wrapper.properties | 2 +- nms/versions/20_5/build.gradle.kts | 16 ++++- nms/versions/21_3/build.gradle.kts | 7 +- .../minecraft/nms/jukebox/versions/V21_3.java | 72 ++++--------------- nms/versions/21_4/build.gradle.kts | 7 +- .../minecraft/nms/jukebox/versions/V21_4.java | 72 ++++--------------- nms/versions/21_5/build.gradle.kts | 6 +- .../minecraft/nms/jukebox/versions/V21_5.java | 72 ++++--------------- 9 files changed, 71 insertions(+), 194 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index ca853e0..b3a8d8c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,9 +1,9 @@ plugins { `java-library` - id("io.github.goooler.shadow") version "8.1.7" + id("com.gradleup.shadow") version "8.3.9" id("io.freefair.lombok") version "8.6" id("net.minecrell.plugin-yml.bukkit") version "0.6.0" - id("io.papermc.paperweight.userdev") version "1.7.7" apply false + id("io.papermc.paperweight.userdev") version "2.0.0-beta.18" apply false } bukkit { @@ -66,10 +66,9 @@ dependencies { api(project(":nms:versions:20_1", "reobf")) api(project(":nms:versions:20_2", "reobf")) api(project(":nms:versions:20_3", "reobf")) - api(project(":nms:versions:20_5", "reobf")) - api(project(":nms:versions:21", "reobf")) - api(project(":nms:versions:21_2", "reobf")) - // 21_3, 21_4, 21_5 使用纯 Bukkit API,不需要 reobf + api(project(":nms:versions:20_5")) + api(project(":nms:versions:21")) + api(project(":nms:versions:21_2")) api(project(":nms:versions:21_3")) api(project(":nms:versions:21_4")) api(project(":nms:versions:21_5")) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 81aa1c0..63e0e83 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/nms/versions/20_5/build.gradle.kts b/nms/versions/20_5/build.gradle.kts index d649fda..6e85b89 100644 --- a/nms/versions/20_5/build.gradle.kts +++ b/nms/versions/20_5/build.gradle.kts @@ -1,12 +1,24 @@ plugins { id("io.papermc.paperweight.userdev") } + java { toolchain.languageVersion.set(JavaLanguageVersion.of(21)) } + repositories { - maven("https://repo.minebench.de") //kiory fix + maven("https://repo.papermc.io/repository/maven-public/") } + dependencies { - paperweight.paperDevBundle("1.20.5-R0.1-SNAPSHOT") + paperweight.paperDevBundle("1.20.5-R0.1-SNAPSHOT") { + exclude(group = "net.kyori") + } + + // 手动添加稳定版本的 adventure 依赖 + compileOnly("net.kyori:adventure-api:4.17.0") + compileOnly("net.kyori:adventure-text-minimessage:4.17.0") + compileOnly("net.kyori:adventure-text-serializer-gson:4.17.0") + compileOnly("net.kyori:adventure-text-serializer-legacy:4.17.0") + compileOnly("net.kyori:adventure-text-serializer-plain:4.17.0") } \ No newline at end of file diff --git a/nms/versions/21_3/build.gradle.kts b/nms/versions/21_3/build.gradle.kts index 44fbb33..a619168 100644 --- a/nms/versions/21_3/build.gradle.kts +++ b/nms/versions/21_3/build.gradle.kts @@ -1,3 +1,7 @@ +plugins { + id("io.papermc.paperweight.userdev") +} + java { toolchain.languageVersion.set(JavaLanguageVersion.of(21)) } @@ -7,7 +11,6 @@ repositories { } dependencies { - // 使用纯 Bukkit API,不需要 NMS - compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") + paperweight.paperDevBundle("1.21.4-R0.1-SNAPSHOT") } diff --git a/nms/versions/21_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_3.java b/nms/versions/21_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_3.java index 16ec989..9922074 100644 --- a/nms/versions/21_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_3.java +++ b/nms/versions/21_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_3.java @@ -1,78 +1,30 @@ package ru.spliterash.musicbox.minecraft.nms.jukebox.versions; +import net.minecraft.world.level.block.entity.JukeboxBlockEntity; import org.bukkit.block.Jukebox; +import org.bukkit.craftbukkit.block.CraftJukebox; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; -import java.lang.reflect.Method; -import java.lang.reflect.Field; - public class V21_3 implements IJukebox { - private final Object tileEntity; - private final Class craftItemStackClass; - private final Class nmsItemStackClass; + private final JukeboxBlockEntity tileEntity; public V21_3(Jukebox jukebox) { - try { - Class blockEntityClass = Class.forName("net.minecraft.world.level.block.entity.BlockEntity"); - Object foundTileEntity = null; - - Class current = jukebox.getClass(); - while (current != null && foundTileEntity == null) { - for (Field field : current.getDeclaredFields()) { - if (blockEntityClass.isAssignableFrom(field.getType())) { - field.setAccessible(true); - foundTileEntity = field.get(jukebox); - break; - } - } - current = current.getSuperclass(); - } - - if (foundTileEntity == null) { - throw new NoSuchFieldException("Unable to locate BlockEntity field on CraftJukebox"); - } - - tileEntity = foundTileEntity; - - craftItemStackClass = Class.forName("org.bukkit.craftbukkit.inventory.CraftItemStack"); - nmsItemStackClass = Class.forName("net.minecraft.world.item.ItemStack"); - } catch (Exception e) { - throw new RuntimeException("Failed to initialize V21_3", e); - } + CraftJukebox craft = (CraftJukebox) jukebox; + tileEntity = craft.getTileEntity(); } public void setJukebox(ItemStack item) { - try { - Method asNMSCopy = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class); - Object converted = asNMSCopy.invoke(null, item); - - Method setSongItem = tileEntity.getClass().getMethod("setSongItemWithoutPlaying", nmsItemStackClass, long.class); - setSongItem.invoke(tileEntity, converted, 0L); - } catch (Exception e) { - throw new RuntimeException("Failed to set jukebox item", e); - } + net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); + tileEntity.setSongItemWithoutPlaying(converted, 0); } public ItemStack getJukebox() { - try { - Method getTheItem = tileEntity.getClass().getMethod("getTheItem"); - Object nmsItem = getTheItem.invoke(tileEntity); - - if (nmsItem == null) { - return null; - } - - Method isEmpty = nmsItem.getClass().getMethod("isEmpty"); - boolean empty = (boolean) isEmpty.invoke(nmsItem); - if (empty) { - return null; - } + net.minecraft.world.item.ItemStack nmsItem = tileEntity.getTheItem(); + if (nmsItem == null || nmsItem.isEmpty()) + return null; - Method asBukkitCopy = craftItemStackClass.getMethod("asBukkitCopy", nmsItemStackClass); - return (ItemStack) asBukkitCopy.invoke(null, nmsItem); - } catch (Exception e) { - throw new RuntimeException("Failed to get jukebox item", e); - } + return CraftItemStack.asBukkitCopy(nmsItem); } } diff --git a/nms/versions/21_4/build.gradle.kts b/nms/versions/21_4/build.gradle.kts index 44fbb33..7332788 100644 --- a/nms/versions/21_4/build.gradle.kts +++ b/nms/versions/21_4/build.gradle.kts @@ -1,3 +1,7 @@ +plugins { + id("io.papermc.paperweight.userdev") +} + java { toolchain.languageVersion.set(JavaLanguageVersion.of(21)) } @@ -7,7 +11,6 @@ repositories { } dependencies { - // 使用纯 Bukkit API,不需要 NMS - compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") + paperweight.paperDevBundle("1.21.5-R0.1-SNAPSHOT") } diff --git a/nms/versions/21_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_4.java b/nms/versions/21_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_4.java index 6c6d8aa..68b1347 100644 --- a/nms/versions/21_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_4.java +++ b/nms/versions/21_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_4.java @@ -1,78 +1,30 @@ package ru.spliterash.musicbox.minecraft.nms.jukebox.versions; +import net.minecraft.world.level.block.entity.JukeboxBlockEntity; import org.bukkit.block.Jukebox; +import org.bukkit.craftbukkit.block.CraftJukebox; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; -import java.lang.reflect.Method; -import java.lang.reflect.Field; - public class V21_4 implements IJukebox { - private final Object tileEntity; - private final Class craftItemStackClass; - private final Class nmsItemStackClass; + private final JukeboxBlockEntity tileEntity; public V21_4(Jukebox jukebox) { - try { - Class blockEntityClass = Class.forName("net.minecraft.world.level.block.entity.BlockEntity"); - Object foundTileEntity = null; - - Class current = jukebox.getClass(); - while (current != null && foundTileEntity == null) { - for (Field field : current.getDeclaredFields()) { - if (blockEntityClass.isAssignableFrom(field.getType())) { - field.setAccessible(true); - foundTileEntity = field.get(jukebox); - break; - } - } - current = current.getSuperclass(); - } - - if (foundTileEntity == null) { - throw new NoSuchFieldException("Unable to locate BlockEntity field on CraftJukebox"); - } - - tileEntity = foundTileEntity; - - craftItemStackClass = Class.forName("org.bukkit.craftbukkit.inventory.CraftItemStack"); - nmsItemStackClass = Class.forName("net.minecraft.world.item.ItemStack"); - } catch (Exception e) { - throw new RuntimeException("Failed to initialize V21_4", e); - } + CraftJukebox craft = (CraftJukebox) jukebox; + tileEntity = craft.getBlockEntity(); } public void setJukebox(ItemStack item) { - try { - Method asNMSCopy = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class); - Object converted = asNMSCopy.invoke(null, item); - - Method setSongItem = tileEntity.getClass().getMethod("setSongItemWithoutPlaying", nmsItemStackClass, long.class); - setSongItem.invoke(tileEntity, converted, 0L); - } catch (Exception e) { - throw new RuntimeException("Failed to set jukebox item", e); - } + net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); + tileEntity.setSongItemWithoutPlaying(converted, 0); } public ItemStack getJukebox() { - try { - Method getTheItem = tileEntity.getClass().getMethod("getTheItem"); - Object nmsItem = getTheItem.invoke(tileEntity); - - if (nmsItem == null) { - return null; - } - - Method isEmpty = nmsItem.getClass().getMethod("isEmpty"); - boolean empty = (boolean) isEmpty.invoke(nmsItem); - if (empty) { - return null; - } + net.minecraft.world.item.ItemStack nmsItem = tileEntity.getTheItem(); + if (nmsItem == null || nmsItem.isEmpty()) + return null; - Method asBukkitCopy = craftItemStackClass.getMethod("asBukkitCopy", nmsItemStackClass); - return (ItemStack) asBukkitCopy.invoke(null, nmsItem); - } catch (Exception e) { - throw new RuntimeException("Failed to get jukebox item", e); - } + return CraftItemStack.asBukkitCopy(nmsItem); } } diff --git a/nms/versions/21_5/build.gradle.kts b/nms/versions/21_5/build.gradle.kts index 2c2d057..49837f6 100644 --- a/nms/versions/21_5/build.gradle.kts +++ b/nms/versions/21_5/build.gradle.kts @@ -1,3 +1,7 @@ +plugins { + id("io.papermc.paperweight.userdev") +} + java { toolchain.languageVersion.set(JavaLanguageVersion.of(21)) } @@ -7,6 +11,6 @@ repositories { } dependencies { - compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT") + paperweight.paperDevBundle("1.21.10-R0.1-SNAPSHOT") } diff --git a/nms/versions/21_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_5.java b/nms/versions/21_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_5.java index 5925b9e..a7f88f6 100644 --- a/nms/versions/21_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_5.java +++ b/nms/versions/21_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_5.java @@ -1,78 +1,30 @@ package ru.spliterash.musicbox.minecraft.nms.jukebox.versions; +import net.minecraft.world.level.block.entity.JukeboxBlockEntity; import org.bukkit.block.Jukebox; +import org.bukkit.craftbukkit.block.CraftJukebox; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; -import java.lang.reflect.Method; -import java.lang.reflect.Field; - public class V21_5 implements IJukebox { - private final Object tileEntity; - private final Class craftItemStackClass; - private final Class nmsItemStackClass; + private final JukeboxBlockEntity tileEntity; public V21_5(Jukebox jukebox) { - try { - Class blockEntityClass = Class.forName("net.minecraft.world.level.block.entity.BlockEntity"); - Object foundTileEntity = null; - - Class current = jukebox.getClass(); - while (current != null && foundTileEntity == null) { - for (Field field : current.getDeclaredFields()) { - if (blockEntityClass.isAssignableFrom(field.getType())) { - field.setAccessible(true); - foundTileEntity = field.get(jukebox); - break; - } - } - current = current.getSuperclass(); - } - - if (foundTileEntity == null) { - throw new NoSuchFieldException("Unable to locate BlockEntity field on CraftJukebox"); - } - - tileEntity = foundTileEntity; - - craftItemStackClass = Class.forName("org.bukkit.craftbukkit.inventory.CraftItemStack"); - nmsItemStackClass = Class.forName("net.minecraft.world.item.ItemStack"); - } catch (Exception e) { - throw new RuntimeException("Failed to initialize V21_5", e); - } + CraftJukebox craft = (CraftJukebox) jukebox; + tileEntity = craft.getBlockEntity(); } public void setJukebox(ItemStack item) { - try { - Method asNMSCopy = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class); - Object converted = asNMSCopy.invoke(null, item); - - Method setSongItem = tileEntity.getClass().getMethod("setSongItemWithoutPlaying", nmsItemStackClass, long.class); - setSongItem.invoke(tileEntity, converted, 0L); - } catch (Exception e) { - throw new RuntimeException("Failed to set jukebox item", e); - } + net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); + tileEntity.setSongItemWithoutPlaying(converted, 0); } public ItemStack getJukebox() { - try { - Method getTheItem = tileEntity.getClass().getMethod("getTheItem"); - Object nmsItem = getTheItem.invoke(tileEntity); - - if (nmsItem == null) { - return null; - } - - Method isEmpty = nmsItem.getClass().getMethod("isEmpty"); - boolean empty = (boolean) isEmpty.invoke(nmsItem); - if (empty) { - return null; - } + net.minecraft.world.item.ItemStack nmsItem = tileEntity.getTheItem(); + if (nmsItem == null || nmsItem.isEmpty()) + return null; - Method asBukkitCopy = craftItemStackClass.getMethod("asBukkitCopy", nmsItemStackClass); - return (ItemStack) asBukkitCopy.invoke(null, nmsItem); - } catch (Exception e) { - throw new RuntimeException("Failed to get jukebox item", e); - } + return CraftItemStack.asBukkitCopy(nmsItem); } } From e7c33713bd875a35d8ca1663dc2ae96611dc90f9 Mon Sep 17 00:00:00 2001 From: angushushu Date: Tue, 18 Nov 2025 00:02:37 -0500 Subject: [PATCH 3/3] fix material issue --- nms/versions/20_5/build.gradle.kts | 12 +++--------- plugin/build.gradle.kts | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/nms/versions/20_5/build.gradle.kts b/nms/versions/20_5/build.gradle.kts index 6e85b89..07ad1ee 100644 --- a/nms/versions/20_5/build.gradle.kts +++ b/nms/versions/20_5/build.gradle.kts @@ -8,17 +8,11 @@ java { repositories { maven("https://repo.papermc.io/repository/maven-public/") + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") } dependencies { - paperweight.paperDevBundle("1.20.5-R0.1-SNAPSHOT") { - exclude(group = "net.kyori") - } + paperweight.paperDevBundle("1.20.6-R0.1-SNAPSHOT") - // 手动添加稳定版本的 adventure 依赖 - compileOnly("net.kyori:adventure-api:4.17.0") - compileOnly("net.kyori:adventure-text-minimessage:4.17.0") - compileOnly("net.kyori:adventure-text-serializer-gson:4.17.0") - compileOnly("net.kyori:adventure-text-serializer-legacy:4.17.0") - compileOnly("net.kyori:adventure-text-serializer-plain:4.17.0") + compileOnly(project(":nms:shared")) } \ No newline at end of file diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 77690f4..fa3a4da 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -7,7 +7,7 @@ dependencies { compileOnly("com.github.MilkBowl:VaultAPI:1.7") compileOnly("com.github.koca2000:NoteBlockAPI:1.6.1") - api("com.github.cryptomorin:XSeries:11.0.0") + api("com.github.cryptomorin:XSeries:13.5.1") api("io.github.bananapuncher714:nbteditor:7.19.0") api("org.bstats:bstats-bukkit:3.0.2")