diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 84f73cb..362a730 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -1,59 +1,27 @@ -name: Build and Release +name: Build on: + pull_request: push: - tags: [ '*' ] # Запуск при создании тега - + branches: [master] + tags: ['*'] +permissions: + contents: read jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: - java-version: '11' - distribution: 'temurin' - - name: Build with Gradle - uses: gradle/gradle-build-action@937999e9cc2425eddc7fd62d1053baf041147db7 - with: - arguments: build - - name: Upload Build Artifact - uses: actions/upload-artifact@v4 + java-version: '25' + distribution: temurin + - uses: gradle/actions/setup-gradle@v4 + - name: Test and build + run: bash ./gradlew --no-daemon clean :plugin:test build + - uses: actions/upload-artifact@v4 with: name: musicbox path: | - build/libs/MusicBox*-all.jar - - release: - needs: build - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - name: Download Build Artifact - uses: actions/download-artifact@v4 - with: - name: musicbox - path: build/libs/ - - name: Get Artifact Filename - id: get_filename - run: echo "FILENAME=$(basename build/libs/MusicBox*-all.jar)" >> $GITHUB_ENV - - name: Create GitHub Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: Release ${{ github.ref }} - draft: false - prerelease: false - - name: Upload Release Asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: build/libs/${{ env.FILENAME }} - asset_name: ${{ env.FILENAME }} - asset_content_type: application/java-archive \ No newline at end of file + build/libs/MusicBox-*.jar + !build/libs/*-thin.jar + if-no-files-found: error diff --git a/README.md b/README.md index a840cd1..16d31e4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,46 @@ +# MusicBox for Paper + +MCCitiesNetwork's modernization of [MusicBox by Spliterash](https://github.com/Spliterash/MusicBox). +MusicBox plays NoteBlockAPI songs through discs, jukeboxes, signs, player +playlists, and its music GUI. + +Requires **Java 25**, **Paper 26.3+**, and **NoteBlockAPI 1.6.3**. Commands use +Cloud's native Paper integration. Older Minecraft versions are no longer +supported. Vault is optional for configured economy features. + +Build and run the regression suite: + +```sh +./gradlew clean :plugin:test build +``` + +To verify Cloud's native bootstrap against an unpacked Paper 26.3 runtime, +create a text file containing one absolute runtime/library JAR path per line, +then run: + +```sh +./gradlew :plugin:paperRuntimeTest -PpaperRuntimeClasspathFile=/path/to/runtime-classpath.txt +``` + +This optional check initializes the real Minecraft registries and Cloud mappings +without starting a server. Runtime JARs are supplied locally and are not bundled +in the plugin or test fixtures. + +Install the shaded JAR from `build/libs` with NoteBlockAPI. The +[data compatibility reference](docs/data-compatibility.md) describes retained +identifiers, metadata, and storage formats. +New installations add their own `.nbs` files under `plugins/MusicBox/songs`. + +## Attribution and licensing + +This fork retains upstream history and attribution to Spliterash. Upstream does +not currently declare a repository-wide license; this fork does not assign a +new license to upstream code. File-specific copyright and license notices are +retained, including sk89q's notice in `SourcedBlockRedstoneEvent.java`. +The upstream example music is excluded from the built plugin. + +## Original upstream README + # MusicBox Этот плагин добавляет на сервер новые пластинки, таблички, и много чего другого. Полное описание можно посмотреть на spigot diff --git a/build.gradle.kts b/build.gradle.kts index 133f6a4..46be7d3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,72 +1,24 @@ plugins { `java-library` - 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("com.gradleup.shadow") version "9.4.0" } - -bukkit { - name = "MusicBox" - main = "ru.spliterash.musicbox.MusicBox" - apiVersion = "1.13" - authors = listOf("Spliterash") - depend = listOf("NoteBlockAPI") - softDepend = listOf("Vault") - commands { - register("musicbox") - } -} - -group = "ru.spliterash" - +group = "com.minecraftcitiesnetwork" +version = "3.0.0-SNAPSHOT" allprojects { - apply(plugin = "java-library"); - apply(plugin = "io.freefair.lombok") - - version = "2.1.4" - + group = "com.minecraftcitiesnetwork" + version = rootProject.version repositories { mavenCentral() - mavenLocal() - + maven("https://repo.papermc.io/repository/maven-public/") maven("https://jitpack.io") - maven("https://repo.codemc.org/repository/maven-public") - maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") - maven("https://oss.sonatype.org/content/groups/public/") - maven("https://repo.clojars.org/") - } - - dependencies { - compileOnly("org.jetbrains:annotations:24.0.1") } } - - -val startPath = "ru.spliterash.musicbox.shadow." +dependencies { implementation(project(":plugin")) } tasks.shadowJar { - relocate("com.cryptomorin.xseries", startPath + "xseries") - relocate("org.bstats", startPath + "bstats") - relocate("io.github.bananapuncher714.nbteditor", startPath + "nbteditor") + archiveClassifier.set("") + relocate("org.incendo", "com.minecraftcitiesnetwork.musicbox.internal.cloud") + relocate("org.bstats", "com.minecraftcitiesnetwork.musicbox.internal.bstats") + mergeServiceFiles() } - +tasks.jar { archiveClassifier.set("thin") } tasks.assemble { dependsOn(tasks.shadowJar) } - -dependencies { - api(project(":plugin")) - api(project(":nms")) - api(project(":nms:shared")) - api(project(":nms:versions:12")) - api(project(":nms:versions:13-16")) - api(project(":nms:versions:17")) - api(project(":nms:versions:18")) - api(project(":nms:versions:19_2", "reobf")) - api(project(":nms:versions:19_3", "reobf")) - api(project(":nms:versions:19_4", "reobf")) - 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")) -} diff --git a/docs/data-compatibility.md b/docs/data-compatibility.md new file mode 100644 index 0000000..f67069a --- /dev/null +++ b/docs/data-compatibility.md @@ -0,0 +1,36 @@ +# Data compatibility + +MusicBox retains its plugin name and `plugins/MusicBox` data directory. Moving +Java packages to `com.minecraftcitiesnetwork.musicbox` does not change the item +namespace `musicbox:song_hash`. + +## Songs and identifiers + +Song and folder IDs remain the signed Java `String.hashCode()` of +`File.getPath()`. Working-directory, plugins-directory argument, filename, and +folder changes can therefore invalidate existing references even when they +point to equivalent filesystem locations. Native Paper and Bukkit plugin loaders +construct the MusicBox data-folder path in the same way. + +New installations supply their own `.nbs` files under `plugins/MusicBox/songs`. +The built plugin does not contain the upstream example music. + +## Player playlists and signs + +SQLite tables remain `playlists`, `playlist_song`, and `signs`. Numeric IDs, +ownership, signed song hashes, and ordering retain their existing representation. +Unavailable song references survive reads and saves. Saved sign locations remain +stored until restoration succeeds, including when the referenced world is absent. +Existing config keys and language files remain supported. + +Music signs retain `MASTER`, `ID:`, `CHEST:`, and +`LIST:` references, flags `R`, `E`, `P`, and `I`, and saved locations +in `worldName|x|y|z` format. + +## Disc metadata + +New discs use the integer `musicbox:song_hash` persistent-data key, matching +existing MusicBox discs. Historical raw `song_hash` tags are also read without +rewriting the item, including tags migrated by Minecraft into +`minecraft:custom_data`. These formats remain readable by the corresponding +older MusicBox implementation; plugin and world state must remain consistent. diff --git a/gradle.properties b/gradle.properties index babb056..005e033 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -org.gradle.jvmargs='-Dfile.encoding=UTF-8' \ No newline at end of file +org.gradle.jvmargs=-Dfile.encoding=UTF-8 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d18421..f50f69e 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-9.4.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/nms/build.gradle.kts b/nms/build.gradle.kts deleted file mode 100644 index 32fe69c..0000000 --- a/nms/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ -java { - targetCompatibility = JavaVersion.VERSION_1_8 - sourceCompatibility = JavaVersion.VERSION_1_8 -} - -dependencies { - compileOnly("org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT") - - api(project("shared")) -} \ No newline at end of file diff --git a/nms/shared/build.gradle.kts b/nms/shared/build.gradle.kts deleted file mode 100644 index 2ef12fc..0000000 --- a/nms/shared/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -java { - targetCompatibility = JavaVersion.VERSION_1_8 - sourceCompatibility = JavaVersion.VERSION_1_8 -} - -dependencies{ - compileOnly("org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/NMSUtils.java b/nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/NMSUtils.java deleted file mode 100644 index b33d4f4..0000000 --- a/nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/NMSUtils.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.spliterash.musicbox.minecraft.nms; - -import org.bukkit.Bukkit; - -public class NMSUtils { - - public static int parseMajorVersion(String raw) { - int firstDotIndex = raw.indexOf("."); - - raw = raw.substring(firstDotIndex + 1); - - int secondDotIndex = raw.indexOf("."); - - if (secondDotIndex != -1) - raw = raw.substring(0, secondDotIndex); - - return Integer.parseInt(raw); - } - - public static String getRawVersion() { - String strVersion = Bukkit.getVersion(); - - int start = strVersion.indexOf("(MC: ") + 5; - - strVersion = strVersion.substring(start); - - int end = strVersion.indexOf(")"); - - strVersion = strVersion.substring(0, end); - - return strVersion; - } - - public static int getVersion() { - return parseMajorVersion(getRawVersion()); - } -} diff --git a/nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/OldNmsUtils.java b/nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/OldNmsUtils.java deleted file mode 100644 index 1846d6a..0000000 --- a/nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/OldNmsUtils.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.spliterash.musicbox.minecraft.nms; - -import lombok.experimental.UtilityClass; -import org.bukkit.Bukkit; - -@UtilityClass -public class OldNmsUtils { - public Class getNMSClass(String first, String nmsClassString) throws ClassNotFoundException { - String name = first + "." + getOldNmsPackage() + "." + nmsClassString; - return Class.forName(name); - } - - public static String getOldNmsPackage() { - return Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; - } -} 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 deleted file mode 100644 index ca7309e..0000000 --- a/nms/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/JukeboxFactory.java +++ /dev/null @@ -1,101 +0,0 @@ -package ru.spliterash.musicbox.minecraft.nms.jukebox; - -import org.bukkit.block.Jukebox; -import ru.spliterash.musicbox.minecraft.nms.NMSUtils; - -import java.lang.reflect.InvocationTargetException; - -public class JukeboxFactory { - private static final String START_PATH = "ru.spliterash.musicbox.minecraft.nms.jukebox.versions."; - private static final Class clazz; - - static { - String raw = NMSUtils.getRawVersion(); - int iV = NMSUtils.parseMajorVersion(raw); - - String className; - if (iV == 21) { - switch (raw) { - case "1.21": - case "1.21.1": - className = START_PATH + "V21"; - break; - case "1.21.2": - case "1.21.3": - className = START_PATH + "V21_2"; - break; - default: - className = null; - break; - } - } else if (iV == 20) { - switch (raw) { - case "1.20": - case "1.20.1": - className = START_PATH + "V20_1"; - break; - case "1.20.2": - className = START_PATH + "V20_2"; - break; - case "1.20.3": - case "1.20.4": - className = START_PATH + "V20_3"; - break; - case "1.20.5": - case "1.20.6": - default: - className = START_PATH + "V20_5"; - break; - } - } else if (iV == 19) { - switch (raw) { - case "1.19.2": - className = START_PATH + "V19_2"; - break; - case "1.19.3": - className = START_PATH + "V19_3"; - break; - case "1.19.4": - className = START_PATH + "V19_4"; - break; - default: - className = null; - break; - } - } else if (iV == 18) - className = START_PATH + "V18"; - else if (iV == 17) - className = START_PATH + "V17"; - else if (iV >= 13) - className = START_PATH + "V13_16"; - else if (iV == 12) - className = START_PATH + "V12"; - else - className = null; - - if (className == null) - throw new IllegalArgumentException("Unsupported version: " + raw); - Class tmpClass = null; - try { - //noinspection unchecked - tmpClass = (Class) Class.forName(className); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } finally { - clazz = tmpClass; - } - } - - public static boolean jukeboxAvailable() { - return clazz != null; - } - - public static IJukebox getJukebox(Jukebox jukebox) { - try { - return clazz.getConstructor(Jukebox.class).newInstance(jukebox); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | - NoSuchMethodException e) { - throw new RuntimeException(e); - } - } -} diff --git a/nms/versions/12/build.gradle.kts b/nms/versions/12/build.gradle.kts deleted file mode 100644 index 29729ae..0000000 --- a/nms/versions/12/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -java{ - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} -dependencies { - compileOnly("org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/12/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V12.java b/nms/versions/12/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V12.java deleted file mode 100644 index 4ea153f..0000000 --- a/nms/versions/12/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V12.java +++ /dev/null @@ -1,58 +0,0 @@ -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 ru.spliterash.musicbox.minecraft.nms.OldNmsUtils; - -import java.lang.reflect.Method; - -public class V12 implements IJukebox { - - private final Object tile_entity; - - public V12(Jukebox box) throws Exception { - Method m = OldNmsUtils.getNMSClass("org.bukkit.craftbukkit", "block.CraftBlockEntityState").getDeclaredMethod("getTileEntity"); - m.setAccessible(true); - this.tile_entity = m.invoke(box); - } - - public Object toCraft(ItemStack item) throws Exception { - Method toVanilaItem = OldNmsUtils.getNMSClass( - "org.bukkit.craftbukkit", - "inventory.CraftItemStack") - .getMethod("asNMSCopy", ItemStack.class); - return toVanilaItem.invoke(null, item); - } - - public ItemStack fromCraft(Object vanilaItem) throws Exception { - Method toBukkitItem = OldNmsUtils.getNMSClass( - "org.bukkit.craftbukkit", - "inventory.CraftItemStack") - .getMethod("asBukkitCopy", OldNmsUtils.getNMSClass("net.minecraft.server", "ItemStack")); - return (ItemStack) toBukkitItem.invoke(null, vanilaItem); - } - - @Override - public void setJukebox(ItemStack item) { - try { - Object vanilaItem = this.toCraft(item); - Method m = this.tile_entity.getClass().getMethod("setRecord", vanilaItem.getClass()); - m.invoke(this.tile_entity, vanilaItem); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - @Override - public ItemStack getJukebox() { - try { - Method m = tile_entity.getClass().getMethod("getRecord"); - Object vanilaItem = m.invoke(this.tile_entity); - return fromCraft(vanilaItem); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/nms/versions/13-16/build.gradle.kts b/nms/versions/13-16/build.gradle.kts deleted file mode 100644 index d39208b..0000000 --- a/nms/versions/13-16/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -java{ - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} -dependencies { - compileOnly("org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/13-16/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V13_16.java b/nms/versions/13-16/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V13_16.java deleted file mode 100644 index 084f5a3..0000000 --- a/nms/versions/13-16/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V13_16.java +++ /dev/null @@ -1,57 +0,0 @@ -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 ru.spliterash.musicbox.minecraft.nms.OldNmsUtils; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -public class V13_16 implements IJukebox { - private final Object tile_entity; - - public V13_16(Jukebox box) throws Exception { - Field f = OldNmsUtils.getNMSClass("org.bukkit.craftbukkit", "block.CraftBlockEntityState").getDeclaredField("tileEntity"); - f.setAccessible(true); - this.tile_entity = f.get(box); - } - - public Object toCraft(ItemStack item) throws Exception { - Method toVanilaItem = OldNmsUtils.getNMSClass( - "org.bukkit.craftbukkit", - "inventory.CraftItemStack") - .getMethod("asNMSCopy", ItemStack.class); - return toVanilaItem.invoke(null, item); - } - - public ItemStack fromCraft(Object vanilaItem) throws Exception { - Method toBukkitItem = OldNmsUtils.getNMSClass( - "org.bukkit.craftbukkit", - "inventory.CraftItemStack") - .getMethod("asBukkitCopy", OldNmsUtils.getNMSClass("net.minecraft.server", "ItemStack")); - return (ItemStack) toBukkitItem.invoke(null, vanilaItem); - } - - public void setJukebox(ItemStack item) { - try { - Object vanilaItem = this.toCraft(item); - Method m = this.tile_entity.getClass().getMethod("setRecord", vanilaItem.getClass()); - m.invoke(this.tile_entity, vanilaItem); - } catch (Exception var4) { - var4.printStackTrace(); - } - - } - - public ItemStack getJukebox() { - try { - Method m = this.tile_entity.getClass().getMethod("getRecord"); - Object vanilaItem = m.invoke(this.tile_entity); - return this.fromCraft(vanilaItem); - } catch (Exception var3) { - var3.printStackTrace(); - return null; - } - } -} diff --git a/nms/versions/17/build.gradle.kts b/nms/versions/17/build.gradle.kts deleted file mode 100644 index d39208b..0000000 --- a/nms/versions/17/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -java{ - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} -dependencies { - compileOnly("org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/17/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V17.java b/nms/versions/17/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V17.java deleted file mode 100644 index eab99c1..0000000 --- a/nms/versions/17/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V17.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.spliterash.musicbox.minecraft.nms.jukebox.versions; - -import org.bukkit.block.Jukebox; -import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.minecraft.nms.OldNmsUtils; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -public class V17 implements IJukebox { - - private final Object tile_entity; - - public V17(Jukebox jukebox) throws ClassNotFoundException, IllegalAccessException, NoSuchFieldException { - Field f = OldNmsUtils.getNMSClass("org.bukkit.craftbukkit", "block.CraftBlockEntityState").getDeclaredField("tileEntity"); - f.setAccessible(true); - this.tile_entity = f.get(jukebox); - } - - - public Object toCraft(ItemStack item) throws Exception { - Method toVanilaItem = OldNmsUtils.getNMSClass( - "org.bukkit.craftbukkit", - "inventory.CraftItemStack") - .getMethod("asNMSCopy", ItemStack.class); - return toVanilaItem.invoke(null, item); - } - - public ItemStack fromCraft(Object vanilaItem) throws Exception { - Method toBukkitItem = OldNmsUtils.getNMSClass( - "org.bukkit.craftbukkit", - "inventory.CraftItemStack") - .getMethod("asBukkitCopy", Class.forName("net.minecraft.world.item.ItemStack")); - return (ItemStack) toBukkitItem.invoke(null, vanilaItem); - } - - public void setJukebox(ItemStack item) { - try { - Object vanilaItem = this.toCraft(item); - Method m = this.tile_entity.getClass().getMethod("setRecord", vanilaItem.getClass()); - m.invoke(this.tile_entity, vanilaItem); - } catch (Exception var4) { - var4.printStackTrace(); - } - - } - - public ItemStack getJukebox() { - try { - Method m = this.tile_entity.getClass().getMethod("getRecord"); - Object vanilaItem = m.invoke(this.tile_entity); - return this.fromCraft(vanilaItem); - } catch (Exception var3) { - var3.printStackTrace(); - return null; - } - } -} diff --git a/nms/versions/18/build.gradle b/nms/versions/18/build.gradle deleted file mode 100644 index 6c2780f..0000000 --- a/nms/versions/18/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} -dependencies { - compileOnly("org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/18/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V18.java b/nms/versions/18/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V18.java deleted file mode 100644 index a1194e9..0000000 --- a/nms/versions/18/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V18.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.spliterash.musicbox.minecraft.nms.jukebox.versions; - -import org.bukkit.block.Jukebox; -import org.bukkit.inventory.CraftingInventory; -import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.minecraft.nms.OldNmsUtils; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -public class V18 implements IJukebox { - - private final Object tile_entity; - - public V18(Jukebox jukebox) throws ClassNotFoundException, IllegalAccessException, NoSuchFieldException { - Field f = OldNmsUtils.getNMSClass("org.bukkit.craftbukkit", "block.CraftBlockEntityState").getDeclaredField("tileEntity"); - f.setAccessible(true); - this.tile_entity = f.get(jukebox); - } - - - public Object toCraft(ItemStack item) throws Exception { - Method toVanilaItem = OldNmsUtils.getNMSClass( - "org.bukkit.craftbukkit", - "inventory.CraftItemStack") - .getMethod("asNMSCopy", ItemStack.class); - return toVanilaItem.invoke(null, item); - } - - public ItemStack fromCraft(Object vanilaItem) throws Exception { - Method toBukkitItem = OldNmsUtils.getNMSClass( - "org.bukkit.craftbukkit", - "inventory.CraftItemStack") - .getMethod("asBukkitCopy", Class.forName("net.minecraft.world.item.ItemStack")); - return (ItemStack) toBukkitItem.invoke(null, vanilaItem); - } - - public void setJukebox(ItemStack item) { - try { - Object vanilaItem = this.toCraft(item); - Method m = this.tile_entity.getClass().getMethod("a", vanilaItem.getClass()); - m.invoke(this.tile_entity, vanilaItem); - } catch (Exception var4) { - var4.printStackTrace(); - } - - } - - public ItemStack getJukebox() { - try { - Method m = this.tile_entity.getClass().getMethod("c"); - Object vanilaItem = m.invoke(this.tile_entity); - return this.fromCraft(vanilaItem); - } catch (Exception var3) { - var3.printStackTrace(); - return null; - } - } -} diff --git a/nms/versions/19_2/build.gradle.kts b/nms/versions/19_2/build.gradle.kts deleted file mode 100644 index 722e781..0000000 --- a/nms/versions/19_2/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) -} -dependencies { - paperweight.paperDevBundle("1.19.2-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/19_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_2.java b/nms/versions/19_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_2.java deleted file mode 100644 index 0682c33..0000000 --- a/nms/versions/19_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_2.java +++ /dev/null @@ -1,31 +0,0 @@ -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.v1_19_R1.block.CraftJukebox; -import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; - -public class V19_2 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V19_2(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setRecord(converted); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getRecord(); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/19_3/build.gradle.kts b/nms/versions/19_3/build.gradle.kts deleted file mode 100644 index 96116db..0000000 --- a/nms/versions/19_3/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) -} -dependencies { - paperweight.paperDevBundle("1.19.3-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/19_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_3.java b/nms/versions/19_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_3.java deleted file mode 100644 index e141b96..0000000 --- a/nms/versions/19_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_3.java +++ /dev/null @@ -1,31 +0,0 @@ -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.v1_19_R2.block.CraftJukebox; -import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; - -public class V19_3 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V19_3(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setRecord(converted); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getRecord(); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/19_4/build.gradle.kts b/nms/versions/19_4/build.gradle.kts deleted file mode 100644 index 171ce83..0000000 --- a/nms/versions/19_4/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) -} -dependencies { - paperweight.paperDevBundle("1.19.4-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/19_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_4.java b/nms/versions/19_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_4.java deleted file mode 100644 index 815193c..0000000 --- a/nms/versions/19_4/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V19_4.java +++ /dev/null @@ -1,31 +0,0 @@ -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.v1_19_R3.block.CraftJukebox; -import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; - -public class V19_4 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V19_4(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setRecordWithoutPlaying(converted); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getItem(0); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/20_1/build.gradle.kts b/nms/versions/20_1/build.gradle.kts deleted file mode 100644 index e784bed..0000000 --- a/nms/versions/20_1/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) -} -dependencies { - paperweight.paperDevBundle("1.20.1-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/20_1/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_1.java b/nms/versions/20_1/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_1.java deleted file mode 100644 index f3572be..0000000 --- a/nms/versions/20_1/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_1.java +++ /dev/null @@ -1,31 +0,0 @@ -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.v1_20_R1.block.CraftJukebox; -import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; - -public class V20_1 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V20_1(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setRecordWithoutPlaying(converted); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getItem(0); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/20_2/build.gradle.kts b/nms/versions/20_2/build.gradle.kts deleted file mode 100644 index 9a45f6e..0000000 --- a/nms/versions/20_2/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) -} -dependencies { - paperweight.paperDevBundle("1.20.2-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/20_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_2.java b/nms/versions/20_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_2.java deleted file mode 100644 index bace961..0000000 --- a/nms/versions/20_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_2.java +++ /dev/null @@ -1,31 +0,0 @@ -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.v1_20_R2.block.CraftJukebox; -import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; - -public class V20_2 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V20_2(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setRecordWithoutPlaying(converted); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getItem(0); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/20_3/build.gradle.kts b/nms/versions/20_3/build.gradle.kts deleted file mode 100644 index 95a2496..0000000 --- a/nms/versions/20_3/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) -} -dependencies { - paperweight.paperDevBundle("1.20.3-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/20_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_3.java b/nms/versions/20_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_3.java deleted file mode 100644 index de223c6..0000000 --- a/nms/versions/20_3/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_3.java +++ /dev/null @@ -1,31 +0,0 @@ -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.v1_20_R3.block.CraftJukebox; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; - -public class V20_3 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V20_3(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setRecordWithoutPlaying(converted); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getItem(0); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/20_5/build.gradle.kts b/nms/versions/20_5/build.gradle.kts deleted file mode 100644 index d649fda..0000000 --- a/nms/versions/20_5/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(21)) -} -repositories { - maven("https://repo.minebench.de") //kiory fix -} -dependencies { - paperweight.paperDevBundle("1.20.5-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/20_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_5.java b/nms/versions/20_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_5.java deleted file mode 100644 index 28829b8..0000000 --- a/nms/versions/20_5/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V20_5.java +++ /dev/null @@ -1,31 +0,0 @@ -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; - -public class V20_5 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V20_5(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setRecordWithoutPlaying(converted); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getItem(0); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/21/build.gradle.kts b/nms/versions/21/build.gradle.kts deleted file mode 100644 index f5e70b1..0000000 --- a/nms/versions/21/build.gradle.kts +++ /dev/null @@ -1,9 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(21)) -} -dependencies { - paperweight.paperDevBundle("1.21-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/21/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21.java b/nms/versions/21/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21.java deleted file mode 100644 index 506438e..0000000 --- a/nms/versions/21/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21.java +++ /dev/null @@ -1,31 +0,0 @@ -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; - -public class V21 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V21(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setSongItemWithoutPlaying(converted, 0); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getItem(0); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/21_2/build.gradle.kts b/nms/versions/21_2/build.gradle.kts deleted file mode 100644 index 9091588..0000000 --- a/nms/versions/21_2/build.gradle.kts +++ /dev/null @@ -1,10 +0,0 @@ -plugins { - id("io.papermc.paperweight.userdev") -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(21)) -} -dependencies { - // 1.21.2 нет, но нарушать порядок версий у себя я не хочу, так что давайте представим что тут 1.21.2 - paperweight.paperDevBundle("1.21.3-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/nms/versions/21_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_2.java b/nms/versions/21_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_2.java deleted file mode 100644 index d5c856b..0000000 --- a/nms/versions/21_2/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/versions/V21_2.java +++ /dev/null @@ -1,31 +0,0 @@ -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; - -public class V21_2 implements IJukebox { - private final JukeboxBlockEntity tileEntity; - - public V21_2(Jukebox jukebox) { - CraftJukebox craft = (CraftJukebox) jukebox; - tileEntity = craft.getTileEntity(); - } - - public void setJukebox(ItemStack item) { - net.minecraft.world.item.ItemStack converted = CraftItemStack.asNMSCopy(item); - tileEntity.setSongItemWithoutPlaying(converted, 0); - - } - - public ItemStack getJukebox() { - net.minecraft.world.item.ItemStack nmsItem = tileEntity.getItem(0); - if (nmsItem.isEmpty()) - return null; - - return CraftItemStack.asBukkitCopy(nmsItem); - } -} diff --git a/nms/versions/build.gradle b/nms/versions/build.gradle deleted file mode 100644 index 3c54948..0000000 --- a/nms/versions/build.gradle +++ /dev/null @@ -1,5 +0,0 @@ -subprojects { - dependencies { - compileOnly project(":nms:shared") - } -} \ No newline at end of file diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 77690f4..9a137bb 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -1,18 +1,44 @@ -java { - targetCompatibility = JavaVersion.VERSION_1_8 - sourceCompatibility = JavaVersion.VERSION_1_8 -} +plugins { `java-library` } +java { toolchain.languageVersion.set(JavaLanguageVersion.of(25)) } +tasks.withType().configureEach { options.encoding = "UTF-8"; options.release.set(25) } dependencies { - compileOnly("org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT") - compileOnly("com.github.MilkBowl:VaultAPI:1.7") - compileOnly("com.github.koca2000:NoteBlockAPI:1.6.1") - - api("com.github.cryptomorin:XSeries:11.0.0") - api("io.github.bananapuncher714:nbteditor:7.19.0") - api("org.bstats:bstats-bukkit:3.0.2") - - api(project(":nms")) - - compileOnly("org.yaml:snakeyaml:2.0") + compileOnly("io.papermc.paper:paper-api:26.3.build.206-stable") + compileOnly("com.github.MilkBowl:VaultAPI:1.7") { isTransitive = false } + compileOnly("com.github.koca2000:NoteBlockAPI:1.6.3") { isTransitive = false } + compileOnly("org.projectlombok:lombok:1.18.42") + annotationProcessor("org.projectlombok:lombok:1.18.42") + implementation("org.incendo:cloud-paper:2.0.1") + compileOnly("net.kyori:adventure-nbt:4.26.1") + testImplementation("net.kyori:adventure-nbt:4.26.1") + testImplementation("com.github.MilkBowl:VaultAPI:1.7") { isTransitive = false } + implementation("org.bstats:bstats-bukkit:3.0.2") + testImplementation(platform("org.junit:junit-bom:5.14.1")) + testImplementation("org.junit.jupiter:junit-jupiter") + testImplementation("org.mockito:mockito-core:5.21.0") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testImplementation("io.papermc.paper:paper-api:26.3.build.206-stable") + testImplementation("com.github.koca2000:NoteBlockAPI:1.6.3") { isTransitive = false } + testImplementation("org.xerial:sqlite-jdbc:3.50.3.0") +} +tasks.test { useJUnitPlatform { excludeTags("paper-runtime") } } +tasks.processResources { + exclude("songs/**") + filesMatching("paper-plugin.yml") { expand("version" to rootProject.version) } +} -} \ No newline at end of file +// Optional integration check against an unpacked Paper runtime and its library jars. +// The classpath file contains one absolute jar path per line; no server is started. +tasks.register("paperRuntimeTest") { + group = "verification" + description = "Initializes Cloud's native Paper mappings against supplied runtime jars without starting a server" + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + files( + providers.gradleProperty("paperRuntimeClasspathFile").map { file(it).readLines().filter(String::isNotBlank) } + ) + useJUnitPlatform { includeTags("paper-runtime") } + val probeDirectory = providers.gradleProperty("paperRuntimeWorkingDirectory") + .map { file(it) }.getOrElse(layout.buildDirectory.dir("paper-runtime-test").get().asFile) + workingDir = probeDirectory + doFirst { probeDirectory.mkdirs() } + maxHeapSize = "2g" +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/Handler.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/Handler.java similarity index 75% rename from plugin/src/main/java/ru/spliterash/musicbox/Handler.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/Handler.java index 6fcb556..f88f75a 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/Handler.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/Handler.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox; +package com.minecraftcitiesnetwork.musicbox; import com.xxmicloxx.NoteBlockAPI.event.SongEndEvent; import org.bukkit.ChatColor; @@ -18,44 +18,22 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; -import ru.spliterash.musicbox.customPlayers.abstracts.AbstractBlockPlayer; -import ru.spliterash.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; -import ru.spliterash.musicbox.customPlayers.objects.SignPlayer; -import ru.spliterash.musicbox.customPlayers.objects.jukebox.JukeboxPlayer; -import ru.spliterash.musicbox.events.SourcedBlockRedstoneEvent; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.minecraft.nms.versionutils.VersionUtilsFactory; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.utils.FaceUtils; -import ru.spliterash.musicbox.utils.RedstoneUtils; -import ru.spliterash.musicbox.utils.StringUtils; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import com.minecraftcitiesnetwork.musicbox.customPlayers.abstracts.AbstractBlockPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.objects.SignPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.objects.jukebox.JukeboxPlayer; +import com.minecraftcitiesnetwork.musicbox.events.SourcedBlockRedstoneEvent; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.minecraft.BlockAccess; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.utils.FaceUtils; +import com.minecraftcitiesnetwork.musicbox.utils.RedstoneUtils; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; + import java.util.Optional; import java.util.Set; -import java.util.function.Consumer; public class Handler implements Listener { - private static Consumer chunkCanceller; - - static { - try { - //noinspection JavaReflectionMemberAccess - Method method = ChunkUnloadEvent.class.getMethod("setCancelled", boolean.class); - - chunkCanceller = event -> { - try { - method.invoke(event, true); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - }; - } catch (NoSuchMethodException e) { - chunkCanceller = event -> event.getChunk().load(); - } - } - @EventHandler(ignoreCancelled = true) public void onExit(PlayerQuitEvent e) { PlayerWrapper @@ -75,17 +53,18 @@ public void onEditEnd(SignChangeEvent e) { String secondLine = e.getLine(1); if (secondLine == null || !secondLine.equalsIgnoreCase("[music]")) return; - BlockFace face = VersionUtilsFactory.getInstance().getRotation(e.getBlock()); + BlockFace face = new BlockAccess().getRotation(e.getBlock()); if (FaceUtils.isValidFace(face)) return; e.getPlayer().sendMessage(Lang.WRONG_SIGN_FACE.toString()); - VersionUtilsFactory.getInstance().setRotation(e.getBlock(), FaceUtils.normalizeFace(face)); + new BlockAccess().setRotation(e.getBlock(), FaceUtils.normalizeFace(face)); } @EventHandler(ignoreCancelled = true) public void onSongEnd(SongEndEvent e) { - if (e.getSongPlayer() instanceof MusicBoxSongPlayer) { + if (!MusicBox.getInstance().isLoaded()) return; + if (e.getSongPlayer() instanceof MusicBoxSongPlayer && !((MusicBoxSongPlayer) e.getSongPlayer()).isDestroyed()) { ((MusicBoxSongPlayer) e.getSongPlayer()).onSongEnd(); } } @@ -106,8 +85,7 @@ public void onChunkUnload(ChunkUnloadEvent e) { if (player instanceof SignPlayer) { SignPlayer signPlayer = (SignPlayer) player; if (signPlayer.isPreventDestroy()) { - chunkCanceller.accept(e); - return; + continue; } } player.destroy(); @@ -131,6 +109,7 @@ public void onRedstoneCB(SourcedBlockRedstoneEvent e) { @EventHandler(ignoreCancelled = true) public void onInteract(PlayerInteractEvent e) { + if (e.useInteractedBlock() == org.bukkit.event.Event.Result.DENY) return; if (!MusicBox.getInstance().isLoaded()) { return; } @@ -148,11 +127,11 @@ public void onInteract(PlayerInteractEvent e) { Jukebox jukebox = (Jukebox) b.getState(); ItemStack item = e.getItem(); if (e.getPlayer().isSneaking()) { - if (item == null) { + if (item == null && AbstractBlockPlayer.findByLocation(jukebox.getLocation()) != null) { + e.setCancelled(true); JukeboxPlayer.onSneakingClick(jukebox, e.getPlayer()); } } else { - jukebox.eject(); JukeboxPlayer.onJukeboxClick(jukebox, item, e); } } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/Lang.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/Lang.java similarity index 99% rename from plugin/src/main/java/ru/spliterash/musicbox/Lang.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/Lang.java index 52a64a5..22dda08 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/Lang.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/Lang.java @@ -1,12 +1,12 @@ -package ru.spliterash.musicbox; +package com.minecraftcitiesnetwork.musicbox; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.ChatColor; import org.bukkit.configuration.file.YamlConfiguration; -import ru.spliterash.musicbox.utils.ComponentUtils; -import ru.spliterash.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.utils.ComponentUtils; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; import java.io.File; import java.io.IOException; diff --git a/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/MusicBox.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/MusicBox.java new file mode 100644 index 0000000..49e6dd1 --- /dev/null +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/MusicBox.java @@ -0,0 +1,110 @@ +package com.minecraftcitiesnetwork.musicbox; + +import lombok.Getter; +import org.bstats.bukkit.Metrics; +import org.bstats.charts.SingleLineChart; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import com.minecraftcitiesnetwork.musicbox.commands.MusicBoxExecutor; +import com.minecraftcitiesnetwork.musicbox.customPlayers.abstracts.AbstractBlockPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.MusicBoxSongPlayerModel; +import com.minecraftcitiesnetwork.musicbox.customPlayers.objects.SignPlayer; +import com.minecraftcitiesnetwork.musicbox.db.DatabaseLoader; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; + +import java.io.File; +import java.io.FileInputStream; +import java.util.List; +import java.util.stream.Collectors; + +@Getter +public final class MusicBox extends JavaPlugin { + @Getter + private static MusicBox instance; + private MusicBoxConfig configObject; + private boolean loaded = false; + private Metrics bStats; + + @Override + public void onEnable() { + instance = this; + saveDefaultValues(); + new MusicBoxExecutor().register(this); + Bukkit.getPluginManager().registerEvents(new Handler(), this); + reloadPlugin(); + } + + public void sendMessage(String pex, String noPexMessage, String message) { + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.hasPermission(pex)) + player.sendMessage(message); + else + player.sendMessage(noPexMessage); + } + } + + private void saveDefaultValues() { + saveDefaultConfig(); + new File(getDataFolder(), "songs").mkdirs(); + } + + public void reloadPlugin() { + com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils.checkPrimary(); + loaded = false; + savePreventedPlayers(); + destroyAllPlayers(); + try (FileInputStream input = new FileInputStream(new File(getDataFolder(), "config.yml"))) { + configObject = MusicBoxConfig.parseConfig(input); + } catch (java.io.IOException e) { + throw new RuntimeException(e); + } + DatabaseLoader.reload(); + Lang.reload(new File(getDataFolder(), "lang"), configObject.getLang()); + PlayerWrapper.clearAll(); + MusicBoxSongManager.reload(new File(getDataFolder(), "songs")); + GUIActions.reloadGUI(); + + + if (!configObject.isBStats() && bStats != null) { + bStats.shutdown(); + bStats = null; + } + if (configObject.isBStats() && bStats == null) { + bStats = new Metrics(this, 8766); + bStats.addCustomChart( + new SingleLineChart( + "song_count", + () -> MusicBoxSongManager.getAllSongs().size()) + ); + } + loaded = true; + SignPlayer.restorePreventedPlayers(); + } + + public void destroyAllPlayers() { + MusicBoxSongPlayerModel.destroyAll(); + PlayerWrapper.clearAll(); + } + + @Override + public void onDisable() { + loaded = false; + try { + savePreventedPlayers(); + } finally { + destroyAllPlayers(); + if (bStats != null) bStats.shutdown(); + } + } + + private void savePreventedPlayers() { + if (!DatabaseLoader.isInitialized()) return; + List signLocations = SignPlayer.getPreventedPlayers().stream() + .map(AbstractBlockPlayer::getLocation).collect(Collectors.toList()); + DatabaseLoader.getBase().savePreventedSigns(signLocations); + } +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/MusicBoxConfig.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/MusicBoxConfig.java similarity index 92% rename from plugin/src/main/java/ru/spliterash/musicbox/MusicBoxConfig.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/MusicBoxConfig.java index 035bd6e..d47748f 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/MusicBoxConfig.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/MusicBoxConfig.java @@ -1,11 +1,11 @@ -package ru.spliterash.musicbox; +package com.minecraftcitiesnetwork.musicbox; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.introspector.BeanAccess; -import ru.spliterash.musicbox.utils.YamlSupportUtils; +import com.minecraftcitiesnetwork.musicbox.utils.YamlSupportUtils; import java.io.InputStream; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/MusicBoxExecutor.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/MusicBoxExecutor.java similarity index 54% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/MusicBoxExecutor.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/MusicBoxExecutor.java index 0ede07e..05475ee 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/MusicBoxExecutor.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/MusicBoxExecutor.java @@ -1,24 +1,30 @@ -package ru.spliterash.musicbox.commands; +package com.minecraftcitiesnetwork.musicbox.commands; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.commands.subcommands.*; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.utils.ArrayUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.commands.subcommands.*; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.utils.ArrayUtils; import java.util.*; import java.util.stream.Collectors; -public class MusicBoxExecutor implements TabExecutor { +public class MusicBoxExecutor { private final Map subs = new HashMap<>(); + private final java.util.function.BooleanSupplier loaded; + + MusicBoxExecutor(Map commands, java.util.function.BooleanSupplier loaded) { + this.subs.putAll(commands); + this.loaded = loaded; + } public MusicBoxExecutor() { + this.loaded = () -> MusicBox.getInstance().isLoaded(); subs.put("shop", new ShopExecutor()); subs.put("give", new GiveExecutor()); @@ -30,9 +36,10 @@ public MusicBoxExecutor() { subs.put("silent", new SilentExecutor()); } - @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (!MusicBox.getInstance().isLoaded()) { + boolean recoveryReload = args.length > 0 && args[0].equalsIgnoreCase("reload") + && sender.hasPermission("musicbox.admin"); + if (!loaded.getAsBoolean() && !recoveryReload) { sender.sendMessage(ChatColor.RED + "Plugin not loaded, please wait or check console if wait too long"); return true; } @@ -49,7 +56,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St sendHelp(sender); return true; } - SubCommand executor = subs.get(args[0]); + SubCommand executor = subs.get(args[0].toLowerCase(Locale.ROOT)); if (executor == null) { sendHelp(sender); return true; @@ -62,6 +69,36 @@ public boolean onCommand(CommandSender sender, Command command, String label, St return true; } + public void register(MusicBox plugin) { + var manager = org.incendo.cloud.paper.PaperCommandManager.builder() + .executionCoordinator(org.incendo.cloud.execution.ExecutionCoordinator.simpleCoordinator()) + .buildOnEnable(plugin); + register(manager); + } + + void register(org.incendo.cloud.CommandManager manager) { + manager.command(manager.commandBuilder("musicbox") + .permission("musicbox.use") + .handler(ctx -> onCommand(ctx.sender().getSender(), null, "musicbox", new String[0]))); + for (var entry : subs.entrySet()) { + String name = entry.getKey(); + var builder = manager.commandBuilder("musicbox").literal(name) + .permission(source -> org.incendo.cloud.permission.PermissionResult.of( + source.getSender().hasPermission("musicbox.use") && entry.getValue().canExecute(source.getSender()), + org.incendo.cloud.permission.Permission.of("musicbox.use"))); + manager.command(builder.handler(ctx -> onCommand(ctx.sender().getSender(), null, "musicbox", new String[]{name}))); + manager.command(builder.required("arguments", org.incendo.cloud.parser.standard.StringParser.greedyStringParser(), + (ctx, input) -> { + String rest = input.remainingInput(); + String[] args = (name + " " + rest).split(" ", -1); + return java.util.concurrent.CompletableFuture.completedFuture(onTabComplete(ctx.sender().getSender(), null, "musicbox", args).stream() + .map(org.incendo.cloud.suggestion.Suggestion::suggestion).toList()); + }) + .handler(ctx -> onCommand(ctx.sender().getSender(), null, "musicbox", + (name + " " + ctx.get("arguments")).split(" ")))); + } + } + public void sendHelp(CommandSender sender) { sender.sendMessage(Lang.COMMAND_HELP.toArray()); if (sender.hasPermission("musicbox.shop")) { @@ -75,7 +112,6 @@ public void sendHelp(CommandSender sender) { } } - @Override public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { if (args.length <= 1) { List tabComplete = new LinkedList<>(); diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/SubCommand.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/SubCommand.java similarity index 88% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/SubCommand.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/SubCommand.java index 24d1522..f7ba5fa 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/SubCommand.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/SubCommand.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.commands; +package com.minecraftcitiesnetwork.musicbox.commands; import org.bukkit.command.CommandSender; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/AbstractSelect.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/AbstractSelect.java similarity index 88% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/AbstractSelect.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/AbstractSelect.java index 4cff8c2..63185da 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/AbstractSelect.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/AbstractSelect.java @@ -1,14 +1,14 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.commands.SubCommand; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.MusicBoxSongManager; -import ru.spliterash.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.commands.SubCommand; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; import java.util.Collections; import java.util.List; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/GiveExecutor.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/GiveExecutor.java similarity index 68% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/GiveExecutor.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/GiveExecutor.java index fa2ae11..663ea48 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/GiveExecutor.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/GiveExecutor.java @@ -1,10 +1,10 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; public class GiveExecutor extends AbstractSelect { public GiveExecutor() { diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/GiveSingleExecutor.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/GiveSingleExecutor.java similarity index 70% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/GiveSingleExecutor.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/GiveSingleExecutor.java index c61988f..2b30479 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/GiveSingleExecutor.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/GiveSingleExecutor.java @@ -1,10 +1,10 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; public class GiveSingleExecutor extends AbstractSelect { public GiveSingleExecutor() { diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/PlayExecutor.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/PlayExecutor.java similarity index 62% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/PlayExecutor.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/PlayExecutor.java index b6074c3..eb56850 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/PlayExecutor.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/PlayExecutor.java @@ -1,11 +1,11 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.commands.MusicBoxExecutor; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.commands.MusicBoxExecutor; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; public class PlayExecutor extends AbstractSelect { public PlayExecutor() { diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/PlaylistExecutor.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/PlaylistExecutor.java similarity index 69% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/PlaylistExecutor.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/PlaylistExecutor.java index c9f566a..836963a 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/PlaylistExecutor.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/PlaylistExecutor.java @@ -1,13 +1,13 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.commands.SubCommand; -import ru.spliterash.musicbox.db.model.PlayerPlayListModel; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.commands.SubCommand; +import com.minecraftcitiesnetwork.musicbox.db.model.PlayerPlayListModel; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; public class PlaylistExecutor implements SubCommand { @Override diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ReloadExecutor.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ReloadExecutor.java similarity index 65% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ReloadExecutor.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ReloadExecutor.java index a10d18f..2ca7161 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ReloadExecutor.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ReloadExecutor.java @@ -1,15 +1,15 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.commands.SubCommand; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.commands.SubCommand; public class ReloadExecutor implements SubCommand { @Override public void execute(CommandSender sender, String[] args) { - Bukkit.getScheduler().runTaskAsynchronously(MusicBox.getInstance(), () -> { + Bukkit.getScheduler().runTask(MusicBox.getInstance(), () -> { MusicBox.getInstance().reloadPlugin(); sender.sendMessage(ChatColor.GREEN + "Reloaded"); }); diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ShopExecutor.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ShopExecutor.java similarity index 68% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ShopExecutor.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ShopExecutor.java index 111295a..3f4cde4 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ShopExecutor.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ShopExecutor.java @@ -1,10 +1,10 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; public class ShopExecutor extends AbstractSelect { public ShopExecutor() { diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ShutUp.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ShutUp.java similarity index 80% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ShutUp.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ShutUp.java index 6f04bf2..13d3b97 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/ShutUp.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/ShutUp.java @@ -1,14 +1,14 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.commands.MusicBoxExecutor; -import ru.spliterash.musicbox.commands.SubCommand; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.commands.MusicBoxExecutor; +import com.minecraftcitiesnetwork.musicbox.commands.SubCommand; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; import java.util.Collections; import java.util.List; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/SilentExecutor.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/SilentExecutor.java similarity index 88% rename from plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/SilentExecutor.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/SilentExecutor.java index 23b3b90..5eace41 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/commands/subcommands/SilentExecutor.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/commands/subcommands/SilentExecutor.java @@ -1,13 +1,13 @@ -package ru.spliterash.musicbox.commands.subcommands; +package com.minecraftcitiesnetwork.musicbox.commands.subcommands; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.commands.SubCommand; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.commands.SubCommand; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; import java.util.Collections; import java.util.List; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/abstracts/AbstractBlockPlayer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/abstracts/AbstractBlockPlayer.java similarity index 78% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/abstracts/AbstractBlockPlayer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/abstracts/AbstractBlockPlayer.java index 33a53a7..63af3d4 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/abstracts/AbstractBlockPlayer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/abstracts/AbstractBlockPlayer.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.customPlayers.abstracts; +package com.minecraftcitiesnetwork.musicbox.customPlayers.abstracts; import com.xxmicloxx.NoteBlockAPI.songplayer.PositionSongPlayer; import lombok.Getter; @@ -6,14 +6,14 @@ import org.bukkit.World; import org.bukkit.plugin.IllegalPluginAccessException; import org.bukkit.scheduler.BukkitRunnable; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; -import ru.spliterash.musicbox.customPlayers.interfaces.PositionPlayer; -import ru.spliterash.musicbox.customPlayers.models.MusicBoxSongPlayerModel; -import ru.spliterash.musicbox.customPlayers.models.RangePlayerModel; -import ru.spliterash.musicbox.utils.BukkitUtils; -import ru.spliterash.musicbox.utils.SignUtils; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PositionPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.MusicBoxSongPlayerModel; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.RangePlayerModel; +import com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils; +import com.minecraftcitiesnetwork.musicbox.utils.SignUtils; import java.util.*; import java.util.stream.Collectors; @@ -41,19 +41,11 @@ public AbstractBlockPlayer(IPlayList list, Location location, int range) { new BukkitRunnable() { @Override public void run() { - while (!isDestroyed()) { - rangePlayerModel.tick(); - every100MillisAsync(); - try { - //noinspection BusyWait - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - break; - } - } + if (isDestroyed()) { cancel(); return; } + rangePlayerModel.tick(); + every100MillisAsync(); } - }.runTaskAsynchronously(MusicBox.getInstance()); + }.runTaskTimer(MusicBox.getInstance(), 2L, 2L); } public static T findByLocation(Location location) { diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/IPlayList.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/IPlayList.java similarity index 90% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/IPlayList.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/IPlayList.java index 548c0b3..658c105 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/IPlayList.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/IPlayList.java @@ -1,6 +1,6 @@ -package ru.spliterash.musicbox.customPlayers.interfaces; +package com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; import java.util.List; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/MusicBoxSongPlayer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/MusicBoxSongPlayer.java similarity index 83% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/MusicBoxSongPlayer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/MusicBoxSongPlayer.java index 49c9dd8..e790147 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/MusicBoxSongPlayer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/MusicBoxSongPlayer.java @@ -1,9 +1,9 @@ -package ru.spliterash.musicbox.customPlayers.interfaces; +package com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces; import com.xxmicloxx.NoteBlockAPI.songplayer.SongPlayer; -import ru.spliterash.musicbox.customPlayers.models.MusicBoxSongPlayerModel; -import ru.spliterash.musicbox.gui.song.SPControlGUI; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.MusicBoxSongPlayerModel; +import com.minecraftcitiesnetwork.musicbox.gui.song.SPControlGUI; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; import java.util.Set; import java.util.UUID; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/PlayerSongPlayer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/PlayerSongPlayer.java similarity index 70% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/PlayerSongPlayer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/PlayerSongPlayer.java index 3b6bff1..e5433d9 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/PlayerSongPlayer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/PlayerSongPlayer.java @@ -1,6 +1,6 @@ -package ru.spliterash.musicbox.customPlayers.interfaces; +package com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces; -import ru.spliterash.musicbox.customPlayers.models.PlayerPlayerModel; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.PlayerPlayerModel; /** * Название идиотское, согласен diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/PositionPlayer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/PositionPlayer.java similarity index 71% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/PositionPlayer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/PositionPlayer.java index 2a8e6ad..72f939e 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/interfaces/PositionPlayer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/interfaces/PositionPlayer.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.customPlayers.interfaces; +package com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces; import org.bukkit.Location; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/MusicBoxSongPlayerModel.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/MusicBoxSongPlayerModel.java similarity index 65% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/MusicBoxSongPlayerModel.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/MusicBoxSongPlayerModel.java index 7f65c79..268df79 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/MusicBoxSongPlayerModel.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/MusicBoxSongPlayerModel.java @@ -1,16 +1,14 @@ -package ru.spliterash.musicbox.customPlayers.models; +package com.minecraftcitiesnetwork.musicbox.customPlayers.models; import com.xxmicloxx.NoteBlockAPI.songplayer.SongPlayer; import lombok.Getter; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; -import ru.spliterash.musicbox.gui.song.SPControlGUI; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; +import com.minecraftcitiesnetwork.musicbox.gui.song.SPControlGUI; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; -import java.lang.reflect.Field; import java.util.*; -import java.util.concurrent.locks.Lock; import java.util.function.Function; @Getter @@ -20,6 +18,7 @@ public class MusicBoxSongPlayerModel { private final IPlayList playList; private final Function nextSongRunnable; private boolean run = false; + private boolean stopped = false; /** * @param songPlayer плеер который связан с этой моделью @@ -34,7 +33,7 @@ public MusicBoxSongPlayerModel(MusicBoxSongPlayer songPlayer, IPlayList playList } public static void destroyAll() { - all.forEach(a -> a.getMusicBoxSongPlayer().destroy()); + new ArrayList<>(all).forEach(a -> a.getMusicBoxSongPlayer().destroy()); all.clear(); } @@ -57,6 +56,7 @@ public void runPlayer() { * Вызывается при вызове {@link SongPlayer#destroy()} */ public void destroy() { + stopped = true; if (controlGUI != null) controlGUI.close(); } @@ -73,46 +73,11 @@ public SPControlGUI getControlGUI() { } // Немного чернухи - private static final Field lockField; - - private static final Field playersField; - - static { - try { - playersField = SongPlayer.class.getDeclaredField("playerList"); - lockField = SongPlayer.class.getDeclaredField("lock"); - playersField.setAccessible(true); - lockField.setAccessible(true); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } - } - - private Lock getLock() throws IllegalAccessException { - return (Lock) lockField.get(musicBoxSongPlayer); - } - - private Map getPlayers() throws IllegalAccessException { - //noinspection unchecked - return (Map) playersField.get(musicBoxSongPlayer); - } - public void setPlayers(Collection players) { - try { - Map map = getPlayers(); - if (map.keySet().containsAll(players) && !players.isEmpty()) - return; - Lock lock = getLock(); - lock.lock(); - try { - map.clear(); - players.forEach(p -> map.put(p, true)); - } finally { - lock.unlock(); - } - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } + SongPlayer api = musicBoxSongPlayer.getApiPlayer(); + Set current = new HashSet<>(api.getPlayerUUIDs()); + current.stream().filter(id -> !players.contains(id)).forEach(api::removePlayer); + players.stream().filter(id -> !current.contains(id)).forEach(api::addPlayer); } /** @@ -128,12 +93,13 @@ private void acceptNext() { * Вызывается из event'a */ public void onSongEnd() { - startNext(); + com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils.runSyncTask(this::startNext); } private boolean nextCreated = false; public void createNextPlayer() { + if (stopped || nextCreated || musicBoxSongPlayer.isDestroyed() || !MusicBox.getInstance().isLoaded()) return; nextCreated = true; getMusicBoxSongPlayer().destroy(); acceptNext(); @@ -152,6 +118,7 @@ public void pingSongEnded() { } public void startNext() { + if (stopped || nextCreated || musicBoxSongPlayer.isDestroyed() || !MusicBox.getInstance().isLoaded()) return; if (playList.tryNext()) { createNextPlayer(); } else diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/PlayerPlayerModel.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PlayerPlayerModel.java similarity index 81% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/PlayerPlayerModel.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PlayerPlayerModel.java index a8e6ae6..db13832 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/PlayerPlayerModel.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PlayerPlayerModel.java @@ -1,9 +1,9 @@ -package ru.spliterash.musicbox.customPlayers.models; +package com.minecraftcitiesnetwork.musicbox.customPlayers.models; import com.xxmicloxx.NoteBlockAPI.songplayer.SongPlayer; import lombok.Getter; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; /** * Небольшая модель @@ -37,7 +37,7 @@ public void nextTick(int all, int current) { } double progress = (double) current / (double) all; if (progress >= 0 && progress <= 1) { - wrapper.setBarProgress(progress); + com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils.runSyncTask(() -> wrapper.setBarProgress(progress)); } } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/PositionPlayerModel.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PositionPlayerModel.java similarity index 59% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/PositionPlayerModel.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PositionPlayerModel.java index 5e72476..8289dea 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/PositionPlayerModel.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PositionPlayerModel.java @@ -1,8 +1,8 @@ -package ru.spliterash.musicbox.customPlayers.models; +package com.minecraftcitiesnetwork.musicbox.customPlayers.models; import lombok.Getter; -import ru.spliterash.musicbox.customPlayers.interfaces.PositionPlayer; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PositionPlayer; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; @Getter public class PositionPlayerModel { diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/RangePlayerModel.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/RangePlayerModel.java similarity index 85% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/RangePlayerModel.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/RangePlayerModel.java index 5813592..933bb72 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/models/RangePlayerModel.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/RangePlayerModel.java @@ -1,13 +1,13 @@ -package ru.spliterash.musicbox.customPlayers.models; +package com.minecraftcitiesnetwork.musicbox.customPlayers.models; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; -import ru.spliterash.musicbox.customPlayers.interfaces.PositionPlayer; -import ru.spliterash.musicbox.customPlayers.objects.SpeakerPlayer; -import ru.spliterash.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PositionPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.objects.SpeakerPlayer; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; import java.util.HashSet; import java.util.Set; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/RadioPlayer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/RadioPlayer.java similarity index 73% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/RadioPlayer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/RadioPlayer.java index 394872e..78f2c0a 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/RadioPlayer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/RadioPlayer.java @@ -1,15 +1,15 @@ -package ru.spliterash.musicbox.customPlayers.objects; +package com.minecraftcitiesnetwork.musicbox.customPlayers.objects; import com.xxmicloxx.NoteBlockAPI.songplayer.RadioSongPlayer; import lombok.Getter; import org.bukkit.entity.Player; import org.bukkit.plugin.IllegalPluginAccessException; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.customPlayers.interfaces.PlayerSongPlayer; -import ru.spliterash.musicbox.customPlayers.models.MusicBoxSongPlayerModel; -import ru.spliterash.musicbox.customPlayers.models.PlayerPlayerModel; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.utils.SongUtils; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PlayerSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.MusicBoxSongPlayerModel; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.PlayerPlayerModel; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.utils.SongUtils; /** * Проигрыватель для игрока diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/SignPlayer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SignPlayer.java similarity index 69% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/SignPlayer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SignPlayer.java index 62da47a..b276a7c 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/SignPlayer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SignPlayer.java @@ -1,6 +1,6 @@ -package ru.spliterash.musicbox.customPlayers.objects; +package com.minecraftcitiesnetwork.musicbox.customPlayers.objects; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -10,15 +10,15 @@ import org.bukkit.block.BlockState; import org.bukkit.block.Sign; import org.jetbrains.annotations.NotNull; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.customPlayers.abstracts.AbstractBlockPlayer; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.db.DatabaseLoader; -import ru.spliterash.musicbox.minecraft.nms.versionutils.VersionUtils; -import ru.spliterash.musicbox.minecraft.nms.versionutils.VersionUtilsFactory; -import ru.spliterash.musicbox.utils.BukkitUtils; -import ru.spliterash.musicbox.utils.FaceUtils; -import ru.spliterash.musicbox.utils.SignUtils; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.customPlayers.abstracts.AbstractBlockPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.db.DatabaseLoader; + +import com.minecraftcitiesnetwork.musicbox.minecraft.BlockAccess; +import com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils; +import com.minecraftcitiesnetwork.musicbox.utils.FaceUtils; +import com.minecraftcitiesnetwork.musicbox.utils.SignUtils; import java.util.List; import java.util.Set; @@ -41,8 +41,10 @@ private SignPlayer(IPlayList list, int range, Sign sign) { super(list, sign.getLocation(), range); this.sign = sign; preventDestroy = sign.getLine(3).contains("P"); - if (preventDestroy) + if (preventDestroy) { getRangePlayerModel().setAutoDestroyMillis(0); + getLocation().getChunk().addPluginChunkTicket(MusicBox.getInstance()); + } setupInfoSign(); } @@ -105,12 +107,17 @@ public static void restorePreventedPlayers() { List locations = DatabaseLoader.getBase().getPreventedSigns(); for (Location location : locations) { BukkitUtils.runSyncTask(() -> { - @NotNull BlockState b = location.getBlock().getState(); - if (b instanceof Sign) { - Sign sign = (Sign) b; - if (isPlayerSign(sign)) { - createSign(sign); + try { + BlockState state = location.getBlock().getState(); + if (state instanceof Sign sign && isPlayerSign(sign)) { + SignUtils.parseSignPlaylist(sign).ifPresent(list -> { + new SignPlayer(list, SignUtils.parseSignRange(sign), sign); + if (AbstractBlockPlayer.findByLocation(location) != null) + DatabaseLoader.getBase().acknowledgePreventedSign(location); + }); } + } catch (RuntimeException ex) { + MusicBox.getInstance().getLogger().warning("Unable to restore a saved music sign; retaining its database row: " + ex.getClass().getSimpleName()); } }); } @@ -120,15 +127,25 @@ public static boolean isPlayerSign(Sign s) { return s.getLine(1).startsWith(SignPlayer.SIGN_SECOND_LINE); } + @Override + public void destroy() { + if (isDestroyed()) return; + org.bukkit.Chunk chunk = getLocation().getChunk(); + super.destroy(); + if (preventDestroy && getPreventedPlayers().stream().noneMatch(player -> + BukkitUtils.inChunk(player.getLocation(), chunk.getWorld(), chunk.getX(), chunk.getZ()))) + chunk.removePluginChunkTicket(MusicBox.getInstance()); + } + private void pingLever() { BukkitUtils.runSyncTask(() -> { @NotNull Block block = getTargetLocation().getBlock(); - BlockFace face = VersionUtilsFactory.getInstance().getRotation(block); + BlockFace face = new BlockAccess().getRotation(block); face = FaceUtils.invertFace(face); @NotNull Block leverBlock = block.getRelative(face, 2); - if (XMaterial.matchXMaterial(leverBlock.getType()) == XMaterial.LEVER) { - VersionUtils utils = VersionUtilsFactory.getInstance(); + if (leverBlock.getType() == Material.LEVER) { + BlockAccess utils = new BlockAccess(); utils.setLever(leverBlock, true); Bukkit.getScheduler().runTaskLater(MusicBox.getInstance(), () -> utils.setLever(leverBlock, false), 10); diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/SpeakerPlayer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SpeakerPlayer.java similarity index 67% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/SpeakerPlayer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SpeakerPlayer.java index 708b3e6..e5a1683 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/SpeakerPlayer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SpeakerPlayer.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.customPlayers.objects; +package com.minecraftcitiesnetwork.musicbox.customPlayers.objects; import com.xxmicloxx.NoteBlockAPI.songplayer.EntitySongPlayer; import lombok.Getter; @@ -8,15 +8,15 @@ import org.bukkit.plugin.IllegalPluginAccessException; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.customPlayers.interfaces.PlayerSongPlayer; -import ru.spliterash.musicbox.customPlayers.interfaces.PositionPlayer; -import ru.spliterash.musicbox.customPlayers.models.MusicBoxSongPlayerModel; -import ru.spliterash.musicbox.customPlayers.models.PlayerPlayerModel; -import ru.spliterash.musicbox.customPlayers.models.RangePlayerModel; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.utils.SongUtils; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PlayerSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PositionPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.MusicBoxSongPlayerModel; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.PlayerPlayerModel; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.RangePlayerModel; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.utils.SongUtils; /** * Проигрыватель для игрока @@ -44,18 +44,10 @@ public SpeakerPlayer(IPlayList list, PlayerWrapper wrapper) { task = new BukkitRunnable() { @Override public void run() { - while (!isDestroyed()) { - rangeModel.tick(); - try { - //noinspection BusyWait - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - break; - } - } + if (isDestroyed()) { cancel(); return; } + rangeModel.tick(); } - }.runTaskAsynchronously(MusicBox.getInstance()); + }.runTaskTimer(MusicBox.getInstance(), 2L, 2L); } @Override @@ -66,6 +58,7 @@ public void destroy() { } catch (IllegalPluginAccessException ex) { // ПОФИК } + if (task != null) task.cancel(); rangeModel.destroy(); model.destroy(); musicBoxModel.destroy(); @@ -94,8 +87,11 @@ private void spawnNote(int tick, Player player) { .stream() .anyMatch(l -> l.getNote(tick) != null) ) { - Location spawnLocation = player.getLocation().add(0, 2.3, 0); - player.getWorld().spawnParticle(Particle.NOTE, spawnLocation, 1); + com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils.runSyncTask(() -> { + if (isDestroyed() || !player.isOnline()) return; + Location spawnLocation = player.getLocation().add(0, 2.3, 0); + player.getWorld().spawnParticle(Particle.NOTE, spawnLocation, 1); + }); } } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlayer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlayer.java similarity index 62% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlayer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlayer.java index 984e42f..c50defe 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlayer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlayer.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.customPlayers.objects.jukebox; +package com.minecraftcitiesnetwork.musicbox.customPlayers.objects.jukebox; import lombok.Getter; import org.bukkit.Location; @@ -9,22 +9,24 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.customPlayers.abstracts.AbstractBlockPlayer; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.minecraft.nms.jukebox.JukeboxFactory; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.MusicBoxSongManager; -import ru.spliterash.musicbox.utils.BukkitUtils; -import ru.spliterash.musicbox.utils.SignUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.customPlayers.abstracts.AbstractBlockPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.minecraft.jukebox.JukeboxFactory; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils; +import com.minecraftcitiesnetwork.musicbox.utils.SignUtils; @Getter public class JukeboxPlayer extends AbstractBlockPlayer { private Location infoSign; + private final int playingSongHash; private JukeboxPlayer(IPlayList list, int range, Jukebox box) { super(list, box.getLocation(), range); + playingSongHash = list.getCurrent().getHash(); SignUtils .findSign(box.getLocation()) .ifPresent(s -> { @@ -35,26 +37,29 @@ private JukeboxPlayer(IPlayList list, int range, Jukebox box) { public static void onJukeboxClick(Jukebox jukebox, ItemStack clickedItem, PlayerInteractEvent e) { JukeboxPlayer sp = AbstractBlockPlayer.findByLocation(jukebox.getLocation()); - if (clickedItem == null && sp == null) + if (clickedItem == null || clickedItem.getType().isAir()) { + if (sp != null) { + e.setCancelled(true); + sp.destroy(); + jukebox.eject(); + } return; - if (sp != null) { - sp.destroy(); } - if (clickedItem == null) - return; MusicBoxSong song = MusicBoxSongManager.findByItem(clickedItem).orElse(null); if (song == null) { + if (sp != null) sp.destroy(); return; } - if (JukeboxFactory.jukeboxAvailable()) { - e.setCancelled(true); - e.getPlayer().getInventory().setItemInMainHand(null); - JukeboxFactory.getJukebox(jukebox).setJukebox(clickedItem); - - createNew(jukebox); - } else { - e.getPlayer().sendMessage(Lang.JUKEBOX_NOT_SUPPORTED.toString()); - } + e.setCancelled(true); + if (sp != null) sp.destroy(); + jukebox.eject(); + ItemStack inserted = clickedItem.clone(); + inserted.setAmount(1); + JukeboxFactory.getJukebox(jukebox).setJukebox(inserted); + ItemStack remaining = clickedItem.clone(); + remaining.setAmount(remaining.getAmount() - 1); + e.getPlayer().getInventory().setItemInMainHand(remaining.getAmount() == 0 ? null : remaining); + createNew(jukebox); } private static void createNew(Jukebox jukebox) { @@ -97,11 +102,16 @@ public static void onRedstone(Jukebox box, Block source, int power) { protected void every100MillisAsync() { BukkitUtils.runSyncTask(() -> { Block b = getTargetLocation().getBlock(); - if (!(b.getState() instanceof Jukebox)) + if (!(b.getState() instanceof Jukebox box) || !hasPlayingRecord(box, playingSongHash)) destroy(); }); } + static boolean hasPlayingRecord(Jukebox box, int playingHash) { + return MusicBoxSongManager.findByItem(box.getInventory().getItem(0)) + .map(record -> record.getHash() == playingHash).orElse(false); + } + @Override protected JukeboxPlayer runNextSong(IPlayList list) { @NotNull BlockState state = getTargetLocation().getBlock().getState(); diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistImpl.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistImpl.java similarity index 95% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistImpl.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistImpl.java index 8393656..e829ce0 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistImpl.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistImpl.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.customPlayers.objects.jukebox; +package com.minecraftcitiesnetwork.musicbox.customPlayers.objects.jukebox; import lombok.AllArgsConstructor; import lombok.Getter; @@ -11,13 +11,13 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.minecraft.nms.jukebox.IJukebox; -import ru.spliterash.musicbox.minecraft.nms.jukebox.JukeboxFactory; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.MusicBoxSongManager; -import ru.spliterash.musicbox.utils.FaceUtils; -import ru.spliterash.musicbox.utils.ItemUtils; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.minecraft.jukebox.IJukebox; +import com.minecraftcitiesnetwork.musicbox.minecraft.jukebox.JukeboxFactory; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.utils.FaceUtils; +import com.minecraftcitiesnetwork.musicbox.utils.ItemUtils; import java.util.Collections; import java.util.LinkedList; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistInitException.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistInitException.java similarity index 67% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistInitException.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistInitException.java index 3256b05..f32e246 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistInitException.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxPlaylistInitException.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.customPlayers.objects.jukebox; +package com.minecraftcitiesnetwork.musicbox.customPlayers.objects.jukebox; public class JukeboxPlaylistInitException extends Exception { public JukeboxPlaylistInitException(String message) { diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/playlist/ListPlaylist.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/playlist/ListPlaylist.java similarity index 83% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/playlist/ListPlaylist.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/playlist/ListPlaylist.java index 1dff858..fb99a53 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/playlist/ListPlaylist.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/playlist/ListPlaylist.java @@ -1,9 +1,9 @@ -package ru.spliterash.musicbox.customPlayers.playlist; +package com.minecraftcitiesnetwork.musicbox.customPlayers.playlist; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.utils.classes.PeekList; -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.utils.classes.PeekList; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; import java.util.List; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/playlist/SingletonPlayList.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/playlist/SingletonPlayList.java similarity index 85% rename from plugin/src/main/java/ru/spliterash/musicbox/customPlayers/playlist/SingletonPlayList.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/playlist/SingletonPlayList.java index 33b4231..8ef1ebf 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/customPlayers/playlist/SingletonPlayList.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/customPlayers/playlist/SingletonPlayList.java @@ -1,8 +1,8 @@ -package ru.spliterash.musicbox.customPlayers.playlist; +package com.minecraftcitiesnetwork.musicbox.customPlayers.playlist; import lombok.RequiredArgsConstructor; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; import java.util.Collections; import java.util.List; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/db/AbstractBase.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/AbstractBase.java similarity index 85% rename from plugin/src/main/java/ru/spliterash/musicbox/db/AbstractBase.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/AbstractBase.java index 42360c0..28d418c 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/db/AbstractBase.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/AbstractBase.java @@ -1,17 +1,17 @@ -package ru.spliterash.musicbox.db; +package com.minecraftcitiesnetwork.musicbox.db; import lombok.Cleanup; import org.bukkit.Bukkit; import org.bukkit.Location; import org.intellij.lang.annotations.Language; import org.jetbrains.annotations.Nullable; -import ru.spliterash.musicbox.db.model.PlayerPlayListModel; -import ru.spliterash.musicbox.db.utils.NamedParamStatement; -import ru.spliterash.musicbox.db.utils.ResultSetRow; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.MusicBoxSongManager; -import ru.spliterash.musicbox.utils.BukkitUtils; -import ru.spliterash.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.db.model.PlayerPlayListModel; +import com.minecraftcitiesnetwork.musicbox.db.utils.NamedParamStatement; +import com.minecraftcitiesnetwork.musicbox.db.utils.ResultSetRow; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; import java.io.IOException; import java.io.InputStream; @@ -148,6 +148,7 @@ private void largeQuery() { */ public void savePlayList(PlayerPlayListModel list) { largeQuery(); + List hashes = list.songHashesForSave(); @Language("SQL") String query; try (Connection connection = getConnection()) { @@ -173,11 +174,9 @@ public void savePlayList(PlayerPlayListModel list) { update(connection, "DELETE from playlist_song where playlists_id = ?", list.getId()); } - if (list.getSongs().size() > 0) { - List argsList = list - .getSongs() + if (!hashes.isEmpty()) { + List argsList = hashes .stream() - .map(MusicBoxSong::getHash) .map(h -> new Object[]{ list.getId(), h, @@ -191,6 +190,7 @@ public void savePlayList(PlayerPlayListModel list) { updateBatch(connection, "INSERT INTO playlist_song (playlists_id, song_hash,pos) values (?,?,?)", argsList); } connection.commit(); + list.rememberPersistedHashes(hashes); } catch (SQLException throwables) { throw new RuntimeException(throwables); } @@ -237,25 +237,21 @@ private List extractPlayList(List set) { list.add(m); return m; }); - MusicBoxSongManager - .findSongByHash(row.getInt("song_hash")) - .ifPresent(s -> model.getSongs().add(s)); + if (row.getInt("song_hash") != null) { + int hash = row.getInt("song_hash"); + model.getOriginalSongHashes().add(hash); + MusicBoxSongManager.findSongByHash(hash).ifPresentOrElse( + song -> model.getSongs().add(song), + () -> model.getUnresolvedSongs().put(model.getOriginalSongHashes().size() - 1, hash)); + } } - list - .removeIf(l -> { - if (l.getSongs().size() == 0) { - l.delete(); - return true; - } else - return false; - }); return list; } public List getPlayLists(UUID playerUUID) { - List result = query("SELECT p.id, p.owner,p.name, ps.song_hash\n" + - "from playlist_song ps\n" + - "join playlists p on ps.playlists_id = p.id\n" + + List result = query("SELECT p.id, p.owner,p.name, ps.song_hash, ps.pos\n" + + "from playlists p\n" + + "left join playlist_song ps on ps.playlists_id = p.id\n" + "where p.owner = ?" + "order by pos ", playerUUID.toString()); @@ -275,9 +271,9 @@ public void deleteMe(PlayerPlayListModel model) { @Nullable public PlayerPlayListModel getPlayListById(int id) { - List result = query("SELECT p.id, p.owner,p.name, ps.song_hash\n" + - "from playlist_song ps\n" + - "join playlists p on ps.playlists_id = p.id\n" + + List result = query("SELECT p.id, p.owner,p.name, ps.song_hash, ps.pos\n" + + "from playlists p\n" + + "left join playlist_song ps on ps.playlists_id = p.id\n" + "where p.id = ?" + "order by pos ", id); @@ -289,7 +285,7 @@ public PlayerPlayListModel getPlayListById(int id) { } /** - * Возвращает список сохранённых табличек, и сразу же удаляет его + * Reads restorable signs without deleting rows for unavailable worlds or songs. */ public List getPreventedSigns() { try { @@ -302,14 +298,17 @@ public List getPreventedSigns() { if (location != null) list.add(location); } - //noinspection SqlWithoutWhere - statement.executeUpdate("DELETE FROM signs"); + // Acknowledge each successfully restored sign separately. return list; } catch (SQLException throwables) { throw new RuntimeException(throwables); } } + public void acknowledgePreventedSign(Location location) { + update("DELETE FROM signs WHERE location = ?", BukkitUtils.locationToString(location)); + } + public void savePreventedSigns(Collection locations) { try { @Cleanup @@ -320,7 +319,7 @@ public void savePreventedSigns(Collection locations) { .map(BukkitUtils::locationToString) .map(str -> new String[]{str}) .collect(Collectors.toList()); - updateBatch(connection, "INSERT INTO signs (location) values (?)", argsList); + updateBatch(connection, "INSERT OR IGNORE INTO signs (location) values (?)", argsList); connection.commit(); } catch (SQLException throwables) { throw new RuntimeException(throwables); diff --git a/plugin/src/main/java/ru/spliterash/musicbox/db/DatabaseLoader.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/DatabaseLoader.java similarity index 70% rename from plugin/src/main/java/ru/spliterash/musicbox/db/DatabaseLoader.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/DatabaseLoader.java index 18880db..eddc4f8 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/db/DatabaseLoader.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/DatabaseLoader.java @@ -1,8 +1,8 @@ -package ru.spliterash.musicbox.db; +package com.minecraftcitiesnetwork.musicbox.db; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.db.types.SQLite; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.db.types.SQLite; import java.io.File; @@ -15,6 +15,8 @@ public static void reload() { instance = new DatabaseLoader(); } + public static boolean isInitialized() { return instance != null; } + public static AbstractBase getBase() { return instance.base; } diff --git a/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/model/PlayerPlayListModel.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/model/PlayerPlayListModel.java new file mode 100644 index 0000000..474da73 --- /dev/null +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/model/PlayerPlayListModel.java @@ -0,0 +1,92 @@ +package com.minecraftcitiesnetwork.musicbox.db.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import com.minecraftcitiesnetwork.musicbox.db.DatabaseLoader; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.factory.ListContainerFactory; + +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Getter +@Setter +@AllArgsConstructor +public class PlayerPlayListModel implements SongContainer { + private int id; + private final UUID owner; + private String name; + private final List songs = new LinkedList<>(); + + // Original positions of unavailable songs survive reads and subsequent edits. + private final java.util.Map unresolvedSongs = new java.util.TreeMap<>(); + + private final List originalSongHashes = new java.util.ArrayList<>(); + + public List songHashesForSave() { + List hashes = new java.util.ArrayList<>(); + songs.forEach(song -> hashes.add(song.getHash())); + java.util.Set resolved = new java.util.HashSet<>(hashes); + int previousUnknownIndex = -1; + for (var entry : unresolvedSongs.entrySet()) { + int hash = entry.getValue(); + if (resolved.contains(hash)) continue; + int insertion = hashes.size(); + // Keep missing references before their next surviving original neighbour. + for (int i = entry.getKey() + 1; i < originalSongHashes.size(); i++) { + int candidate = originalSongHashes.get(i); + if (resolved.contains(candidate)) { + insertion = hashes.indexOf(candidate); + break; + } + } + insertion = Math.max(insertion, previousUnknownIndex + 1); + hashes.add(insertion, hash); + previousUnknownIndex = insertion; + } + return hashes; + } + + public void rememberPersistedHashes(List hashes) { + java.util.Set missing = new java.util.HashSet<>(unresolvedSongs.values()); + songs.forEach(song -> missing.remove(song.getHash())); + originalSongHashes.clear(); + originalSongHashes.addAll(hashes); + unresolvedSongs.clear(); + for (int i = 0; i < hashes.size(); i++) { + if (missing.contains(hashes.get(i))) unresolvedSongs.put(i, hashes.get(i)); + } + } + + /** + * Возращает владельца если тот в сети + */ + public Optional getOwnerWrapper() { + Player player = Bukkit.getPlayer(owner); + if (player == null) + return Optional.empty(); + else + return Optional.of(PlayerWrapper.getInstance(player)); + } + + public void save() { + DatabaseLoader.getBase().savePlayList(this); + } + + public void delete() { + DatabaseLoader.getBase().deleteMe(this); + } + + @Override + public String getNameId() { + return ListContainerFactory.NAME + ":" + id; + } + +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/db/types/SQLite.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/types/SQLite.java similarity index 85% rename from plugin/src/main/java/ru/spliterash/musicbox/db/types/SQLite.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/types/SQLite.java index 1318e07..eb6248e 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/db/types/SQLite.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/types/SQLite.java @@ -1,11 +1,9 @@ -package ru.spliterash.musicbox.db.types; +package com.minecraftcitiesnetwork.musicbox.db.types; -import ru.spliterash.musicbox.db.AbstractBase; +import com.minecraftcitiesnetwork.musicbox.db.AbstractBase; import java.io.File; import java.io.IOException; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/db/utils/NamedParamStatement.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/utils/NamedParamStatement.java similarity index 96% rename from plugin/src/main/java/ru/spliterash/musicbox/db/utils/NamedParamStatement.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/utils/NamedParamStatement.java index dd3a60c..b13087b 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/db/utils/NamedParamStatement.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/utils/NamedParamStatement.java @@ -1,7 +1,7 @@ -package ru.spliterash.musicbox.db.utils; +package com.minecraftcitiesnetwork.musicbox.db.utils; import org.intellij.lang.annotations.Language; -import ru.spliterash.musicbox.db.AbstractBase; +import com.minecraftcitiesnetwork.musicbox.db.AbstractBase; import java.sql.Connection; import java.sql.PreparedStatement; @@ -87,4 +87,4 @@ public void setValues(String key, T[] values) { Set set = Arrays.stream(values).collect(Collectors.toSet()); map.put(key, set); } -} \ No newline at end of file +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/db/utils/ResultSetRow.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/utils/ResultSetRow.java similarity index 92% rename from plugin/src/main/java/ru/spliterash/musicbox/db/utils/ResultSetRow.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/utils/ResultSetRow.java index 1129e7c..e0a8df5 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/db/utils/ResultSetRow.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/db/utils/ResultSetRow.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.db.utils; +package com.minecraftcitiesnetwork.musicbox.db.utils; import lombok.Builder; import lombok.Singular; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/events/SourcedBlockRedstoneEvent.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/events/SourcedBlockRedstoneEvent.java similarity index 97% rename from plugin/src/main/java/ru/spliterash/musicbox/events/SourcedBlockRedstoneEvent.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/events/SourcedBlockRedstoneEvent.java index eaf6460..26cd7d6 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/events/SourcedBlockRedstoneEvent.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/events/SourcedBlockRedstoneEvent.java @@ -14,7 +14,7 @@ * see . */ -package ru.spliterash.musicbox.events; +package com.minecraftcitiesnetwork.musicbox.events; import org.bukkit.block.Block; import org.bukkit.event.HandlerList; @@ -67,4 +67,4 @@ public HandlerList getHandlers() { public static HandlerList getHandlerList() { return handlers; } -} \ No newline at end of file +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/gui/GUIActions.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/GUIActions.java similarity index 89% rename from plugin/src/main/java/ru/spliterash/musicbox/gui/GUIActions.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/GUIActions.java index faa2ca4..1ce6729 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/gui/GUIActions.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/GUIActions.java @@ -1,31 +1,31 @@ -package ru.spliterash.musicbox.gui; +package com.minecraftcitiesnetwork.musicbox.gui; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import lombok.experimental.UtilityClass; import org.bukkit.ChatColor; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.customPlayers.interfaces.PlayerSongPlayer; -import ru.spliterash.musicbox.customPlayers.objects.SignPlayer; -import ru.spliterash.musicbox.customPlayers.playlist.ListPlaylist; -import ru.spliterash.musicbox.customPlayers.playlist.SingletonPlayList; -import ru.spliterash.musicbox.db.model.PlayerPlayListModel; -import ru.spliterash.musicbox.gui.playlist.PlayListEditorGUI; -import ru.spliterash.musicbox.gui.playlist.PlayListListGUI; -import ru.spliterash.musicbox.gui.song.SongContainerGUI; -import ru.spliterash.musicbox.minecraft.gui.InventoryAction; -import ru.spliterash.musicbox.minecraft.gui.actions.ClickAction; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.MusicBoxSongManager; -import ru.spliterash.musicbox.song.songContainers.containers.SingletonContainer; -import ru.spliterash.musicbox.song.songContainers.types.FullSongContainer; -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; -import ru.spliterash.musicbox.utils.EconomyUtils; -import ru.spliterash.musicbox.utils.ItemUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PlayerSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.objects.SignPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.playlist.ListPlaylist; +import com.minecraftcitiesnetwork.musicbox.customPlayers.playlist.SingletonPlayList; +import com.minecraftcitiesnetwork.musicbox.db.model.PlayerPlayListModel; +import com.minecraftcitiesnetwork.musicbox.gui.playlist.PlayListEditorGUI; +import com.minecraftcitiesnetwork.musicbox.gui.playlist.PlayListListGUI; +import com.minecraftcitiesnetwork.musicbox.gui.song.SongContainerGUI; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.InventoryAction; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.actions.ClickAction; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.containers.SingletonContainer; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.FullSongContainer; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; +import com.minecraftcitiesnetwork.musicbox.utils.EconomyUtils; +import com.minecraftcitiesnetwork.musicbox.utils.ItemUtils; import java.util.HashMap; import java.util.List; @@ -34,8 +34,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static ru.spliterash.musicbox.gui.song.SongContainerGUI.BarButton; -import static ru.spliterash.musicbox.gui.song.SongContainerGUI.SongGUIParams; +import static com.minecraftcitiesnetwork.musicbox.gui.song.SongContainerGUI.BarButton; +import static com.minecraftcitiesnetwork.musicbox.gui.song.SongContainerGUI.SongGUIParams; /** * Класс для больших кусков кода связанных с GUI @@ -107,7 +107,7 @@ private static BarButton silentButton() { @Override public ItemStack getItemStack(PlayerWrapper wrapper) { String status = wrapper.isSilent() ? Lang.ENABLE.toString() : Lang.DISABLE.toString(); - return ItemUtils.createStack(XMaterial.FIREWORK_STAR, Lang.SILENT_MODE.toString(), Lang.SILENT_MODE_LORE.toList("{status}", status)); + return ItemUtils.createStack(Material.FIREWORK_STAR, Lang.SILENT_MODE.toString(), Lang.SILENT_MODE_LORE.toList("{status}", status)); } @Override @@ -151,7 +151,7 @@ private void giveDisc(PlayerWrapper wrapper, SongContainerGUI.SongGUIData songs = model.getSongs(); int start = 45 * page; - PeekList list = new PeekList<>(BukkitUtils.DISCS); + PeekList list = new PeekList<>(BukkitUtils.DISCS); for (int i = 0; i + start < songs.size() && i < 45; i++) { int arrayIndex = i + start; MusicBoxSong song = songs.get(arrayIndex); @@ -53,7 +53,7 @@ public void open(int page) { } gui.addItem( 47, - ItemUtils.createStack(XMaterial.PISTON, Lang.SHUFFLE_PLAYLIST.toString(), null), + ItemUtils.createStack(Material.PISTON, Lang.SHUFFLE_PLAYLIST.toString(), null), new ClickAction( () -> { Collections.shuffle(model.getSongs()); @@ -63,7 +63,7 @@ public void open(int page) { ); gui.addItem( 48, - ItemUtils.createStack(XMaterial.SUNFLOWER, Lang.ADD_MUSIC_TO_PLAYLIST_ITEM.toString(), Lang.DONT_FORGET_TO_SAVE.toList()), + ItemUtils.createStack(Material.SUNFLOWER, Lang.ADD_MUSIC_TO_PLAYLIST_ITEM.toString(), Lang.DONT_FORGET_TO_SAVE.toList()), new ClickAction( () -> GUIActions.openPlayListAdder(wrapper, this) ) @@ -74,7 +74,7 @@ public void open(int page) { } gui.addItem( 49, - ItemUtils.createStack(XMaterial.PAPER, Lang.SAVE_PLAYLIST_CHANGE.toString(), lore), + ItemUtils.createStack(Material.PAPER, Lang.SAVE_PLAYLIST_CHANGE.toString(), lore), new ClickAction( () -> { if (model.getSongs().size() > 0) { @@ -98,7 +98,7 @@ public void open(int page) { ); gui.addItem( 51, - ItemUtils.createStack(XMaterial.BARRIER, Lang.DELETE_PLAYLIST.toString("{playlist}", model.getName()), null), + ItemUtils.createStack(Material.BARRIER, Lang.DELETE_PLAYLIST.toString("{playlist}", model.getName()), null), new ClickAction( () -> { model.delete(); @@ -112,12 +112,12 @@ public void open(int page) { if (page > 0) gui.addItem( 45, - ItemUtils.createStack(XMaterial.MAGMA_CREAM, Lang.BACK.toString(), null), + ItemUtils.createStack(Material.MAGMA_CREAM, Lang.BACK.toString(), null), new ClickAction(() -> open(page - 1))); if ((last - 1) > page) gui.addItem( 53, - ItemUtils.createStack(XMaterial.MAGMA_CREAM, Lang.NEXT.toString(), null), + ItemUtils.createStack(Material.MAGMA_CREAM, Lang.NEXT.toString(), null), new ClickAction(() -> open(page + 1))); } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/gui/playlist/PlayListListGUI.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/playlist/PlayListListGUI.java similarity index 70% rename from plugin/src/main/java/ru/spliterash/musicbox/gui/playlist/PlayListListGUI.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/playlist/PlayListListGUI.java index ca69257..d0ca8ad 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/gui/playlist/PlayListListGUI.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/playlist/PlayListListGUI.java @@ -1,20 +1,20 @@ -package ru.spliterash.musicbox.gui.playlist; +package com.minecraftcitiesnetwork.musicbox.gui.playlist; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.db.DatabaseLoader; -import ru.spliterash.musicbox.db.model.PlayerPlayListModel; -import ru.spliterash.musicbox.minecraft.gui.GUI; -import ru.spliterash.musicbox.minecraft.gui.InventoryAction; -import ru.spliterash.musicbox.minecraft.gui.actions.ClickAction; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.MusicBoxSongManager; -import ru.spliterash.musicbox.utils.ItemUtils; -import ru.spliterash.musicbox.utils.StringUtils; -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.db.DatabaseLoader; +import com.minecraftcitiesnetwork.musicbox.db.model.PlayerPlayListModel; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.GUI; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.InventoryAction; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.actions.ClickAction; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.utils.ItemUtils; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; import java.util.List; import java.util.function.Function; @@ -60,7 +60,7 @@ public void openPage(int page, Function onSelect if (extraLore != null) lore.addAll(extraLore.apply(element)); ItemStack stack = ItemUtils.createStack( - XMaterial.PAPER, + Material.PAPER, Lang.PLAYLIST_NAME.toString("{name}", element.getName()), lore); gui.addItem(i, stack, onSelect.apply(element)); @@ -68,7 +68,7 @@ public void openPage(int page, Function onSelect // Создать новый плейлист gui.addItem( 49, - ItemUtils.createStack(XMaterial.SUGAR, Lang.CREATE_NEW_PLAYLIST.toString(), null), + ItemUtils.createStack(Material.SUGAR, Lang.CREATE_NEW_PLAYLIST.toString(), null), new ClickAction(() -> { Player p = wrapper.getPlayer(); p.closeInventory(); @@ -78,19 +78,19 @@ public void openPage(int page, Function onSelect // Главный плейлист gui.addItem( 46, - ItemUtils.createStack(XMaterial.DIAMOND, Lang.MASTER_PLAYLIST.toString(), Lang.MASTER_PLAYLIST_LORE.toList()), + ItemUtils.createStack(Material.DIAMOND, Lang.MASTER_PLAYLIST.toString(), Lang.MASTER_PLAYLIST_LORE.toList()), onSelect.apply(MusicBoxSongManager.getMasterContainer()) ); // Пагинация if (page > 0) gui.addItem( 45, - ItemUtils.createStack(XMaterial.MAGMA_CREAM, Lang.BACK.toString(), null), + ItemUtils.createStack(Material.MAGMA_CREAM, Lang.BACK.toString(), null), new ClickAction(() -> openPage(page - 1, onSelect, extraLore))); if ((lastPage - 1) > page) gui.addItem( 53, - ItemUtils.createStack(XMaterial.MAGMA_CREAM, Lang.NEXT.toString(), null), + ItemUtils.createStack(Material.MAGMA_CREAM, Lang.NEXT.toString(), null), new ClickAction(() -> openPage( page + 1, onSelect, extraLore))); } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/gui/song/SPControlGUI.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/song/SPControlGUI.java similarity index 76% rename from plugin/src/main/java/ru/spliterash/musicbox/gui/song/SPControlGUI.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/song/SPControlGUI.java index 64ce95d..1616d29 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/gui/song/SPControlGUI.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/song/SPControlGUI.java @@ -1,24 +1,24 @@ -package ru.spliterash.musicbox.gui.song; +package com.minecraftcitiesnetwork.musicbox.gui.song; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; -import ru.spliterash.musicbox.customPlayers.models.MusicBoxSongPlayerModel; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.minecraft.gui.GUI; -import ru.spliterash.musicbox.minecraft.gui.InventoryAction; -import ru.spliterash.musicbox.minecraft.gui.actions.ClickAction; -import ru.spliterash.musicbox.minecraft.gui.actions.PlayerClickAction; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.utils.BukkitUtils; -import ru.spliterash.musicbox.utils.ItemUtils; -import ru.spliterash.musicbox.utils.SongUtils; -import ru.spliterash.musicbox.utils.StringUtils; -import ru.spliterash.musicbox.utils.classes.PeekList; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.models.MusicBoxSongPlayerModel; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.GUI; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.InventoryAction; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.actions.ClickAction; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.actions.PlayerClickAction; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils; +import com.minecraftcitiesnetwork.musicbox.utils.ItemUtils; +import com.minecraftcitiesnetwork.musicbox.utils.SongUtils; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.utils.classes.PeekList; import java.util.Collections; import java.util.List; @@ -49,7 +49,7 @@ public void refresh() { List prev = list.getPrevSongs(4); Collections.reverse(prev); List next = list.getNextSongs(4); - PeekList peekList = new PeekList<>(BukkitUtils.DISCS); + PeekList peekList = new PeekList<>(BukkitUtils.DISCS); int startFrom = 4 - prev.size(); for (ListIterator iterator = prev.listIterator(); iterator.hasNext(); ) { int i = iterator.nextIndex() + startFrom; @@ -75,7 +75,7 @@ public void updateControlButtons() { } } - private void addDiscItem(int index, MusicBoxSong song, PeekList peekList, boolean playNow, int songNum) { + private void addDiscItem(int index, MusicBoxSong song, PeekList peekList, boolean playNow, int songNum) { gui.addItem(index, song.getSongStack(peekList.getAndNext(), SongUtils.getSongName(songNum, song, playNow), playNow ? Lang.SONG_PANEL_NOW_PLAY.toList() : Lang.SONG_PANEL_SWITH_TO.toList(), @@ -106,11 +106,11 @@ private void updateRewind() { for (int i = 0; i < 9; i++) { int currentIndex = i + 9; short chunkStart = (short) (i * chunkSize); - XMaterial material; + Material material; if (currentTick >= chunkStart) { - material = XMaterial.WHITE_STAINED_GLASS_PANE; + material = Material.WHITE_STAINED_GLASS_PANE; } else { - material = XMaterial.GRAY_STAINED_GLASS_PANE; + material = Material.GRAY_STAINED_GLASS_PANE; } String[] rewindReplaceArray = new String[]{ "{percent}", String.valueOf((int) Math.floor(((double) chunkStart / (double) allTicks) * 100)), @@ -145,7 +145,7 @@ public void open(Player p) { public void close() { closed = true; - ItemStack close = ItemUtils.createStack(XMaterial.RED_STAINED_GLASS_PANE, Lang.CLOSE.toString(), null); + ItemStack close = ItemUtils.createStack(Material.RED_STAINED_GLASS_PANE, Lang.CLOSE.toString(), null); InventoryAction action = new PlayerClickAction(HumanEntity::closeInventory); for (int i = 0; i < gui.getInventory().getSize(); i++) { gui.addItem(i, close, action); diff --git a/plugin/src/main/java/ru/spliterash/musicbox/gui/song/SongContainerGUI.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/song/SongContainerGUI.java similarity index 88% rename from plugin/src/main/java/ru/spliterash/musicbox/gui/song/SongContainerGUI.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/song/SongContainerGUI.java index 5a9388d..05ef0bf 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/gui/song/SongContainerGUI.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/gui/song/SongContainerGUI.java @@ -1,23 +1,23 @@ -package ru.spliterash.musicbox.gui.song; +package com.minecraftcitiesnetwork.musicbox.gui.song; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.minecraft.gui.GUI; -import ru.spliterash.musicbox.minecraft.gui.InventoryAction; -import ru.spliterash.musicbox.minecraft.gui.actions.ClickAction; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.songContainers.types.FullSongContainer; -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; -import ru.spliterash.musicbox.utils.BukkitUtils; -import ru.spliterash.musicbox.utils.ItemUtils; -import ru.spliterash.musicbox.utils.classes.PeekList; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.GUI; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.InventoryAction; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.actions.ClickAction; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.FullSongContainer; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; +import com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils; +import com.minecraftcitiesnetwork.musicbox.utils.ItemUtils; +import com.minecraftcitiesnetwork.musicbox.utils.classes.PeekList; import java.util.Collections; import java.util.LinkedList; @@ -70,7 +70,7 @@ public void openPage(int page, SongGUIParams params) { FullSongContainer container = this.container; - PeekList list = new PeekList<>(BukkitUtils.DISCS); + PeekList list = new PeekList<>(BukkitUtils.DISCS); List songs = container.getSongs(); MusicBoxSong playerSong = wrapper.getActivePlayer() != null ? wrapper.getActivePlayer().getMusicBoxSong() : null; /* @@ -161,7 +161,7 @@ public void openPage(int page, SongGUIParams params) { gui.addItem( 46, - ItemUtils.createStack(XMaterial.TORCH, Lang.PARENT_CONTAINER.toString(), null), + ItemUtils.createStack(Material.TORCH, Lang.PARENT_CONTAINER.toString(), null), new ClickAction(() -> new SongContainerGUI((FullSongContainer) container.getParentContainer(), wrapper) .openPage(0, params)) ); @@ -170,12 +170,12 @@ public void openPage(int page, SongGUIParams params) { if (page > 0) gui.addItem( 45, - ItemUtils.createStack(XMaterial.MAGMA_CREAM, Lang.BACK.toString(), null), + ItemUtils.createStack(Material.MAGMA_CREAM, Lang.BACK.toString(), null), new ClickAction(() -> openPage(page - 1, params))); if ((pageCount - 1) > page) gui.addItem( 53, - ItemUtils.createStack(XMaterial.MAGMA_CREAM, Lang.NEXT.toString(), null), + ItemUtils.createStack(Material.MAGMA_CREAM, Lang.NEXT.toString(), null), new ClickAction(() -> openPage( page + 1, params))); diff --git a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/NewVersion.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/BlockAccess.java similarity index 81% rename from plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/NewVersion.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/BlockAccess.java index 459550b..4d18daa 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/NewVersion.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/BlockAccess.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.minecraft.nms.versionutils; +package com.minecraftcitiesnetwork.musicbox.minecraft; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -7,8 +7,7 @@ import org.bukkit.block.data.Powerable; import org.bukkit.block.data.Rotatable; -public class NewVersion implements VersionUtils { - @Override +public class BlockAccess { public BlockFace getRotation(Block block) { MyRotate rotate = MyRotate.by(block.getBlockData()); @@ -18,7 +17,6 @@ public BlockFace getRotation(Block block) { } - @Override public void setRotation(Block block, BlockFace face) { MyRotate rotate = MyRotate.by(block.getBlockData()); @@ -29,7 +27,6 @@ public void setRotation(Block block, BlockFace face) { block.setBlockData(rotate.getData(), false); } - @Override public void setLever(Block block, boolean powered) { if (block.getBlockData() instanceof Powerable) { Powerable data = (Powerable) block.getBlockData(); @@ -63,18 +60,15 @@ private BlockFaceRotate(Directional directional) { this.directional = directional; } - @Override - public void setRotate(BlockFace rotate) { + public void setRotate(BlockFace rotate) { directional.setFacing(rotate); } - @Override - public BlockFace getRotate() { + public BlockFace getRotate() { return directional.getFacing(); } - @Override - public BlockData getData() { + public BlockData getData() { return directional; } } @@ -86,18 +80,15 @@ private RotatableRotate(Rotatable rotatable) { this.rotatable = rotatable; } - @Override - public void setRotate(BlockFace rotate) { + public void setRotate(BlockFace rotate) { this.rotatable.setRotation(rotate); } - @Override - public BlockFace getRotate() { + public BlockFace getRotate() { return this.rotatable.getRotation(); } - @Override - public BlockData getData() { + public BlockData getData() { return rotatable; } } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/GUI.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/GUI.java similarity index 90% rename from plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/GUI.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/GUI.java index 26c4bfe..8248a41 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/GUI.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/GUI.java @@ -1,7 +1,7 @@ -package ru.spliterash.musicbox.minecraft.gui; +package com.minecraftcitiesnetwork.musicbox.minecraft.gui; -import com.cryptomorin.xseries.XSound; +import org.bukkit.Sound; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -11,8 +11,8 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.utils.BukkitUtils; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils; import java.util.HashMap; import java.util.Map; @@ -88,7 +88,7 @@ public void onInventoryClick(InventoryClickEvent e) { InventoryAction action = runnableMap.get(e.getSlot()); if (action == null) return; - XSound.UI_BUTTON_CLICK.play(e.getWhoClicked()); + e.getWhoClicked().getWorld().playSound(e.getWhoClicked().getLocation(), Sound.UI_BUTTON_CLICK, 1f, 1f); action.onEvent(e); } @@ -106,4 +106,4 @@ public GUI cloneWithNewTitle(String title) { return gui; } -} \ No newline at end of file +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/InventoryAction.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/InventoryAction.java similarity index 69% rename from plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/InventoryAction.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/InventoryAction.java index cc73b52..e8447c9 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/InventoryAction.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/InventoryAction.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.minecraft.gui; +package com.minecraftcitiesnetwork.musicbox.minecraft.gui; import org.bukkit.event.inventory.InventoryClickEvent; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/actions/ClickAction.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/actions/ClickAction.java similarity index 85% rename from plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/actions/ClickAction.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/actions/ClickAction.java index db24492..335f922 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/actions/ClickAction.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/actions/ClickAction.java @@ -1,7 +1,7 @@ -package ru.spliterash.musicbox.minecraft.gui.actions; +package com.minecraftcitiesnetwork.musicbox.minecraft.gui.actions; import org.bukkit.event.inventory.InventoryClickEvent; -import ru.spliterash.musicbox.minecraft.gui.InventoryAction; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.InventoryAction; import java.util.Optional; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/actions/PlayerClickAction.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/actions/PlayerClickAction.java similarity index 88% rename from plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/actions/PlayerClickAction.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/actions/PlayerClickAction.java index 934da72..3d71ac8 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/gui/actions/PlayerClickAction.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/gui/actions/PlayerClickAction.java @@ -1,8 +1,8 @@ -package ru.spliterash.musicbox.minecraft.gui.actions; +package com.minecraftcitiesnetwork.musicbox.minecraft.gui.actions; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; -import ru.spliterash.musicbox.minecraft.gui.InventoryAction; +import com.minecraftcitiesnetwork.musicbox.minecraft.gui.InventoryAction; import java.util.Optional; import java.util.function.Consumer; diff --git a/nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/IJukebox.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/jukebox/IJukebox.java similarity index 78% rename from nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/IJukebox.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/jukebox/IJukebox.java index d9ed67c..0b2644c 100644 --- a/nms/shared/src/main/java/ru/spliterash/musicbox/minecraft/nms/jukebox/IJukebox.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/jukebox/IJukebox.java @@ -1,9 +1,9 @@ -package ru.spliterash.musicbox.minecraft.nms.jukebox; +package com.minecraftcitiesnetwork.musicbox.minecraft.jukebox; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import java.lang.reflect.Method; + public interface IJukebox { default boolean isEmpty() { diff --git a/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/jukebox/JukeboxFactory.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/jukebox/JukeboxFactory.java new file mode 100644 index 0000000..3f39864 --- /dev/null +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/minecraft/jukebox/JukeboxFactory.java @@ -0,0 +1,18 @@ +package com.minecraftcitiesnetwork.musicbox.minecraft.jukebox; + +import org.bukkit.block.Jukebox; +import org.bukkit.inventory.ItemStack; + +public final class JukeboxFactory { + private JukeboxFactory() {} + public static boolean jukeboxAvailable() { return true; } + public static IJukebox getJukebox(Jukebox jukebox) { + return new IJukebox() { + public void setJukebox(ItemStack item) { + jukebox.getInventory().setItem(0, item); + jukebox.stopPlaying(); + } + public ItemStack getJukebox() { return jukebox.getInventory().getItem(0); } + }; + } +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/players/PlayerWrapper.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/players/PlayerWrapper.java similarity index 87% rename from plugin/src/main/java/ru/spliterash/musicbox/players/PlayerWrapper.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/players/PlayerWrapper.java index 8937665..44cdf57 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/players/PlayerWrapper.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/players/PlayerWrapper.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.players; +package com.minecraftcitiesnetwork.musicbox.players; import lombok.AccessLevel; import lombok.Getter; @@ -9,19 +9,19 @@ import org.bukkit.boss.BossBar; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.MusicBoxConfig; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; -import ru.spliterash.musicbox.customPlayers.interfaces.PlayerSongPlayer; -import ru.spliterash.musicbox.customPlayers.objects.RadioPlayer; -import ru.spliterash.musicbox.customPlayers.objects.SpeakerPlayer; -import ru.spliterash.musicbox.customPlayers.playlist.ListPlaylist; -import ru.spliterash.musicbox.customPlayers.playlist.SingletonPlayList; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; -import ru.spliterash.musicbox.utils.BukkitUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.MusicBoxConfig; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.MusicBoxSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PlayerSongPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.objects.RadioPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.objects.SpeakerPlayer; +import com.minecraftcitiesnetwork.musicbox.customPlayers.playlist.ListPlaylist; +import com.minecraftcitiesnetwork.musicbox.customPlayers.playlist.SingletonPlayList; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; +import com.minecraftcitiesnetwork.musicbox.utils.BukkitUtils; import java.util.Optional; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSong.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSong.java similarity index 84% rename from plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSong.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSong.java index 84193e1..550368a 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSong.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSong.java @@ -1,15 +1,15 @@ -package ru.spliterash.musicbox.song; +package com.minecraftcitiesnetwork.musicbox.song; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import com.xxmicloxx.NoteBlockAPI.model.Song; import com.xxmicloxx.NoteBlockAPI.utils.NBSDecoder; import lombok.Getter; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.utils.*; -import ru.spliterash.musicbox.utils.nbt.NBTFactory; -import ru.spliterash.musicbox.utils.nbt.NbtConstants; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.utils.*; +import com.minecraftcitiesnetwork.musicbox.utils.nbt.NBTFactory; +import com.minecraftcitiesnetwork.musicbox.utils.nbt.NbtConstants; import java.io.File; import java.lang.ref.WeakReference; @@ -49,11 +49,11 @@ public int getDuration() { return (int) Math.floor(length / speed); } - public ItemStack getSongStack(XMaterial material) { + public ItemStack getSongStack(Material material) { return getSongStack(material, Collections.emptyList(), false); } - public ItemStack getSongStack(XMaterial material, List extraLines, boolean glow) { + public ItemStack getSongStack(Material material, List extraLines, boolean glow) { return getSongStack(material, Lang.SONG_NAME.toString("{song}", getName()), extraLines, glow); } @@ -61,8 +61,8 @@ public ItemStack getSongStack(XMaterial material, List extraLines, boole * @param material Какой материал использовать * @return Айтем с этим материалом */ - public ItemStack getSongStack(XMaterial material, String itemName, List extraLines, boolean glow) { - ItemStack stack = material.parseItem(); + public ItemStack getSongStack(Material material, String itemName, List extraLines, boolean glow) { + ItemStack stack = new ItemStack(material); ItemMeta meta = stack.getItemMeta(); meta.setDisplayName(itemName); List list = ArrayUtils.replaceOrRemove(Lang.SONG_LORE.toList(), hoverMap); diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSongContainer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSongContainer.java similarity index 84% rename from plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSongContainer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSongContainer.java index 34a122b..f3bd7ac 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSongContainer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSongContainer.java @@ -1,20 +1,20 @@ -package ru.spliterash.musicbox.song; +package com.minecraftcitiesnetwork.musicbox.song; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import lombok.Getter; import org.bukkit.ChatColor; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.gui.song.SongContainerGUI; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.songContainers.factory.FolderContainerFactory; -import ru.spliterash.musicbox.song.songContainers.types.FullSongContainer; -import ru.spliterash.musicbox.song.songContainers.types.SubSongContainer; -import ru.spliterash.musicbox.utils.FileUtils; -import ru.spliterash.musicbox.utils.JavaUtils; -import ru.spliterash.musicbox.utils.StringUtils; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.gui.song.SongContainerGUI; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.factory.FolderContainerFactory; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.FullSongContainer; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SubSongContainer; +import com.minecraftcitiesnetwork.musicbox.utils.FileUtils; +import com.minecraftcitiesnetwork.musicbox.utils.JavaUtils; +import com.minecraftcitiesnetwork.musicbox.utils.StringUtils; import java.io.File; import java.io.IOException; @@ -106,7 +106,7 @@ public ItemStack getItemStack() { } public ItemStack getItemStack(List extraLines) { - ItemStack chest = XMaterial.CHEST.parseItem(); + ItemStack chest = new ItemStack(Material.CHEST); ItemMeta meta = chest.getItemMeta(); meta.setDisplayName(Lang.FOLDER_FORMAT.toString("{folder}", getName())); List tempLore; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSongManager.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSongManager.java similarity index 82% rename from plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSongManager.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSongManager.java index e746207..abf8cf2 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/MusicBoxSongManager.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/MusicBoxSongManager.java @@ -1,15 +1,15 @@ -package ru.spliterash.musicbox.song; +package com.minecraftcitiesnetwork.musicbox.song; import lombok.Getter; import lombok.experimental.UtilityClass; import org.bukkit.inventory.ItemStack; -import ru.spliterash.musicbox.song.songContainers.SongContainerFactory; -import ru.spliterash.musicbox.song.songContainers.factory.FolderContainerFactory; -import ru.spliterash.musicbox.song.songContainers.factory.ListContainerFactory; -import ru.spliterash.musicbox.song.songContainers.factory.SingletonContainerFactory; -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; -import ru.spliterash.musicbox.utils.nbt.NBTFactory; -import ru.spliterash.musicbox.utils.nbt.NbtConstants; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.SongContainerFactory; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.factory.FolderContainerFactory; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.factory.ListContainerFactory; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.factory.SingletonContainerFactory; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; +import com.minecraftcitiesnetwork.musicbox.utils.nbt.NBTFactory; +import com.minecraftcitiesnetwork.musicbox.utils.nbt.NbtConstants; import java.io.File; import java.util.*; @@ -24,7 +24,7 @@ public class MusicBoxSongManager { private final SongContainer masterContainer = new MasterContainer(); // Для быстрого поиска @Getter - private List allSongs; + private List allSongs = Collections.emptyList(); @Getter private MusicBoxSongContainer rootContainer; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/SongNullException.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/SongNullException.java similarity index 71% rename from plugin/src/main/java/ru/spliterash/musicbox/song/SongNullException.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/SongNullException.java index 2bf119a..fef7f40 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/SongNullException.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/SongNullException.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.song; +package com.minecraftcitiesnetwork.musicbox.song; public class SongNullException extends RuntimeException { public SongNullException(String s) { diff --git a/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/SongContainerFactory.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/SongContainerFactory.java new file mode 100644 index 0000000..cf4c4c9 --- /dev/null +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/SongContainerFactory.java @@ -0,0 +1,9 @@ +package com.minecraftcitiesnetwork.musicbox.song.songContainers; + +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; + +public interface SongContainerFactory { + String getKey(); + + T parseContainer(int id); +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/containers/SingletonContainer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/containers/SingletonContainer.java similarity index 68% rename from plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/containers/SingletonContainer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/containers/SingletonContainer.java index 3538397..1b7a2d2 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/containers/SingletonContainer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/containers/SingletonContainer.java @@ -1,9 +1,9 @@ -package ru.spliterash.musicbox.song.songContainers.containers; +package com.minecraftcitiesnetwork.musicbox.song.songContainers.containers; import lombok.RequiredArgsConstructor; -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.songContainers.factory.SingletonContainerFactory; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.types.SongContainer; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.factory.SingletonContainerFactory; import java.util.Collections; import java.util.List; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/FolderContainerFactory.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/FolderContainerFactory.java similarity index 57% rename from plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/FolderContainerFactory.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/FolderContainerFactory.java index 24bbf15..2a31ca0 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/FolderContainerFactory.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/FolderContainerFactory.java @@ -1,8 +1,8 @@ -package ru.spliterash.musicbox.song.songContainers.factory; +package com.minecraftcitiesnetwork.musicbox.song.songContainers.factory; -import ru.spliterash.musicbox.song.MusicBoxSongContainer; -import ru.spliterash.musicbox.song.MusicBoxSongManager; -import ru.spliterash.musicbox.song.songContainers.SongContainerFactory; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongContainer; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.SongContainerFactory; public class FolderContainerFactory implements SongContainerFactory { public static final String NAME = "CHEST"; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/ListContainerFactory.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/ListContainerFactory.java similarity index 53% rename from plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/ListContainerFactory.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/ListContainerFactory.java index 6bb95f8..b0d6b84 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/ListContainerFactory.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/ListContainerFactory.java @@ -1,8 +1,8 @@ -package ru.spliterash.musicbox.song.songContainers.factory; +package com.minecraftcitiesnetwork.musicbox.song.songContainers.factory; -import ru.spliterash.musicbox.db.DatabaseLoader; -import ru.spliterash.musicbox.db.model.PlayerPlayListModel; -import ru.spliterash.musicbox.song.songContainers.SongContainerFactory; +import com.minecraftcitiesnetwork.musicbox.db.DatabaseLoader; +import com.minecraftcitiesnetwork.musicbox.db.model.PlayerPlayListModel; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.SongContainerFactory; public class ListContainerFactory implements SongContainerFactory { public static String NAME = "LIST"; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/SingletonContainerFactory.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/SingletonContainerFactory.java similarity index 57% rename from plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/SingletonContainerFactory.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/SingletonContainerFactory.java index fb0711d..37d174e 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/factory/SingletonContainerFactory.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/factory/SingletonContainerFactory.java @@ -1,8 +1,8 @@ -package ru.spliterash.musicbox.song.songContainers.factory; +package com.minecraftcitiesnetwork.musicbox.song.songContainers.factory; -import ru.spliterash.musicbox.song.MusicBoxSongManager; -import ru.spliterash.musicbox.song.songContainers.SongContainerFactory; -import ru.spliterash.musicbox.song.songContainers.containers.SingletonContainer; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.SongContainerFactory; +import com.minecraftcitiesnetwork.musicbox.song.songContainers.containers.SingletonContainer; public class SingletonContainerFactory implements SongContainerFactory { public static String NAME = "ID"; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/FullSongContainer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/FullSongContainer.java similarity index 82% rename from plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/FullSongContainer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/FullSongContainer.java index eccc514..333d20f 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/FullSongContainer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/FullSongContainer.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.song.songContainers.types; +package com.minecraftcitiesnetwork.musicbox.song.songContainers.types; import org.bukkit.inventory.ItemStack; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/SongContainer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/SongContainer.java similarity index 80% rename from plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/SongContainer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/SongContainer.java index adaff44..97897ca 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/SongContainer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/SongContainer.java @@ -1,6 +1,6 @@ -package ru.spliterash.musicbox.song.songContainers.types; +package com.minecraftcitiesnetwork.musicbox.song.songContainers.types; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; import java.util.ArrayList; import java.util.Collections; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/SubSongContainer.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/SubSongContainer.java similarity index 79% rename from plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/SubSongContainer.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/SubSongContainer.java index a0c75f8..b278b3d 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/types/SubSongContainer.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/song/songContainers/types/SubSongContainer.java @@ -1,7 +1,7 @@ -package ru.spliterash.musicbox.song.songContainers.types; +package com.minecraftcitiesnetwork.musicbox.song.songContainers.types; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.MusicBoxSongContainer; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongContainer; import java.util.LinkedList; import java.util.List; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/ArrayUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ArrayUtils.java similarity index 97% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/ArrayUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ArrayUtils.java index 80a71dc..ad56c1e 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/ArrayUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ArrayUtils.java @@ -1,6 +1,5 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; -import com.cryptomorin.xseries.XMaterial; import lombok.experimental.UtilityClass; import java.lang.reflect.Array; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/BukkitUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/BukkitUtils.java similarity index 82% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/BukkitUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/BukkitUtils.java index f0160e8..e541aec 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/BukkitUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/BukkitUtils.java @@ -1,6 +1,6 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -11,7 +11,7 @@ import org.bukkit.metadata.MetadataValue; import org.bukkit.metadata.Metadatable; import org.jetbrains.annotations.Nullable; -import ru.spliterash.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.MusicBox; import java.util.Arrays; import java.util.Collections; @@ -21,23 +21,23 @@ @UtilityClass public class BukkitUtils { - public final List DISCS = Collections.unmodifiableList( + public final List DISCS = Collections.unmodifiableList( Arrays.asList( - XMaterial.MUSIC_DISC_13, - XMaterial.MUSIC_DISC_BLOCKS, - XMaterial.MUSIC_DISC_CAT, - XMaterial.MUSIC_DISC_CHIRP, - XMaterial.MUSIC_DISC_FAR, - XMaterial.MUSIC_DISC_MALL, - XMaterial.MUSIC_DISC_MELLOHI, - XMaterial.MUSIC_DISC_STAL, - XMaterial.MUSIC_DISC_STRAD, - XMaterial.MUSIC_DISC_WAIT, - XMaterial.MUSIC_DISC_WARD + Material.MUSIC_DISC_13, + Material.MUSIC_DISC_BLOCKS, + Material.MUSIC_DISC_CAT, + Material.MUSIC_DISC_CHIRP, + Material.MUSIC_DISC_FAR, + Material.MUSIC_DISC_MALL, + Material.MUSIC_DISC_MELLOHI, + Material.MUSIC_DISC_STAL, + Material.MUSIC_DISC_STRAD, + Material.MUSIC_DISC_WAIT, + Material.MUSIC_DISC_WARD ) ); - public XMaterial getRandomDisc() { + public Material getRandomDisc() { return ArrayUtils.getRandom(DISCS); } @@ -125,8 +125,8 @@ public static boolean inChunk(Location location, World chunkWorld, int chunkX, i return false; int xp = chunkX * 16; // must multiple by 16 to get the blocks location int zp = chunkZ * 16; // must multiple by 16 to get the blocks location - int x = -9314; - int z = -931; + int x = location.getBlockX(); + int z = location.getBlockZ(); return (xp <= x) && (xp + 15 >= x) && (zp <= z) && (zp + 15 >= z); } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/ComponentUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ComponentUtils.java similarity index 96% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/ComponentUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ComponentUtils.java index 6521d3c..48095d8 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/ComponentUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ComponentUtils.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; import lombok.experimental.UtilityClass; import net.md_5.bungee.api.chat.BaseComponent; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/EconomyUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/EconomyUtils.java similarity index 52% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/EconomyUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/EconomyUtils.java index 829ee10..a6accbf 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/EconomyUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/EconomyUtils.java @@ -1,26 +1,24 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; import lombok.experimental.UtilityClass; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.MusicBox; @UtilityClass public class EconomyUtils { - private final Economy eco; - - static { - if (Bukkit.getPluginManager().isPluginEnabled("Vault")) - eco = Bukkit.getServicesManager().getRegistration(Economy.class).getProvider(); - else - eco = null; + private Economy provider() { + if (!Bukkit.getPluginManager().isPluginEnabled("Vault")) return null; + var registration = Bukkit.getServicesManager().getRegistration(Economy.class); + return registration == null ? null : registration.getProvider(); } public boolean isEnable() { - return MusicBox.getInstance().getConfigObject().getEconomy().isEnable(); + return MusicBox.getInstance().getConfigObject() != null + && MusicBox.getInstance().getConfigObject().getEconomy().isEnable() + && provider() != null; } public double getDiscPrice() { @@ -28,20 +26,24 @@ public double getDiscPrice() { } public double getBalance(Player player) { - return eco.getBalance(player); + Economy eco = provider(); + return isEnable() && eco != null ? eco.getBalance(player) : 0; } public boolean hasMoney(Player player, double money) { + if (!isEnable()) return false; double currentMoney = getBalance(player); return (currentMoney - money) >= 0; } public boolean buyNoMessage(Player player, double price) { - return eco.withdrawPlayer(player, price).transactionSuccess(); + Economy eco = provider(); + return isEnable() && eco != null && eco.withdrawPlayer(player, price).transactionSuccess(); } public boolean canBuy(Player player, double price) { + if (!isEnable()) return false; double currentMoney = getBalance(player); double moneyLeft = currentMoney - price; if (moneyLeft >= 0) { diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/FaceUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/FaceUtils.java similarity index 98% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/FaceUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/FaceUtils.java index fcda979..ad11e0a 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/FaceUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/FaceUtils.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; import lombok.experimental.UtilityClass; import org.bukkit.Location; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/FileUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/FileUtils.java similarity index 91% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/FileUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/FileUtils.java index 6b31e77..0c74b92 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/FileUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/FileUtils.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; import lombok.experimental.UtilityClass; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/ItemUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ItemUtils.java similarity index 91% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/ItemUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ItemUtils.java index 949ac9f..f1288f0 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/ItemUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/ItemUtils.java @@ -1,9 +1,8 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; + -import com.cryptomorin.xseries.XEnchantment; -import com.cryptomorin.xseries.XMaterial; -import lombok.experimental.UtilityClass; import org.bukkit.Material; +import lombok.experimental.UtilityClass; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemFlag; @@ -19,7 +18,7 @@ @UtilityClass public class ItemUtils { - private final Enchantment enchantment = XEnchantment.BLAST_PROTECTION.getEnchant(); + private final Enchantment enchantment = Enchantment.BLAST_PROTECTION; public ItemStack glow(ItemStack stack) { ItemMeta meta = stack.getItemMeta(); @@ -29,8 +28,8 @@ public ItemStack glow(ItemStack stack) { return stack; } - public ItemStack createStack(XMaterial material, String name, @Nullable List lore) { - ItemStack stack = material.parseItem(); + public ItemStack createStack(Material material, String name, @Nullable List lore) { + ItemStack stack = new ItemStack(material); ItemMeta meta = stack.getItemMeta(); meta.setDisplayName(name); if (lore != null) @@ -50,10 +49,10 @@ public ItemStack unGlow(ItemStack item) { return item; } - public List getEndWith(String endWith) { - return Arrays.stream(XMaterial.values()) + public List getEndWith(String endWith) { + return Arrays.stream(Material.values()) .filter(s -> s.name().endsWith(endWith)) - .filter(XMaterial::isSupported) + .collect(Collectors.toList()); } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/JavaUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/JavaUtils.java similarity index 89% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/JavaUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/JavaUtils.java index 61a5c08..d3baadc 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/JavaUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/JavaUtils.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; import lombok.experimental.UtilityClass; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/RedstoneUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/RedstoneUtils.java similarity index 65% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/RedstoneUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/RedstoneUtils.java index 9341668..4ef3808 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/RedstoneUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/RedstoneUtils.java @@ -1,13 +1,13 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; -import com.cryptomorin.xseries.XMaterial; +import org.bukkit.Material; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import ru.spliterash.musicbox.events.SourcedBlockRedstoneEvent; -import ru.spliterash.musicbox.minecraft.nms.versionutils.VersionUtilsFactory; +import com.minecraftcitiesnetwork.musicbox.events.SourcedBlockRedstoneEvent; +import com.minecraftcitiesnetwork.musicbox.minecraft.BlockAccess; import java.util.HashSet; import java.util.Set; @@ -18,36 +18,36 @@ @SuppressWarnings({"unused"}) @UtilityClass public class RedstoneUtils { - private final Set isRedstoneBlock = new HashSet<>(); + private final Set isRedstoneBlock = new HashSet<>(); static { - isRedstoneBlock.add(XMaterial.POWERED_RAIL); - isRedstoneBlock.add(XMaterial.DETECTOR_RAIL); - isRedstoneBlock.add(XMaterial.STICKY_PISTON); - isRedstoneBlock.add(XMaterial.PISTON); - isRedstoneBlock.add(XMaterial.LEVER); - isRedstoneBlock.add(XMaterial.STONE_PRESSURE_PLATE); + isRedstoneBlock.add(Material.POWERED_RAIL); + isRedstoneBlock.add(Material.DETECTOR_RAIL); + isRedstoneBlock.add(Material.STICKY_PISTON); + isRedstoneBlock.add(Material.PISTON); + isRedstoneBlock.add(Material.LEVER); + isRedstoneBlock.add(Material.STONE_PRESSURE_PLATE); isRedstoneBlock.addAll(ItemUtils.getEndWith("_PRESSURE_PLATE")); - isRedstoneBlock.add(XMaterial.REDSTONE_TORCH); - isRedstoneBlock.add(XMaterial.REDSTONE_WALL_TORCH); - isRedstoneBlock.add(XMaterial.REDSTONE_WIRE); + isRedstoneBlock.add(Material.REDSTONE_TORCH); + isRedstoneBlock.add(Material.REDSTONE_WALL_TORCH); + isRedstoneBlock.add(Material.REDSTONE_WIRE); isRedstoneBlock.addAll(ItemUtils.getEndWith("DOOR")); - isRedstoneBlock.add(XMaterial.TNT); - isRedstoneBlock.add(XMaterial.DISPENSER); - isRedstoneBlock.add(XMaterial.NOTE_BLOCK); - isRedstoneBlock.add(XMaterial.REPEATER); - isRedstoneBlock.add(XMaterial.TRIPWIRE_HOOK); - isRedstoneBlock.add(XMaterial.COMMAND_BLOCK); + isRedstoneBlock.add(Material.TNT); + isRedstoneBlock.add(Material.DISPENSER); + isRedstoneBlock.add(Material.NOTE_BLOCK); + isRedstoneBlock.add(Material.REPEATER); + isRedstoneBlock.add(Material.TRIPWIRE_HOOK); + isRedstoneBlock.add(Material.COMMAND_BLOCK); isRedstoneBlock.addAll(ItemUtils.getEndWith("_BUTTON")); - isRedstoneBlock.add(XMaterial.TRAPPED_CHEST); - isRedstoneBlock.add(XMaterial.HEAVY_WEIGHTED_PRESSURE_PLATE); - isRedstoneBlock.add(XMaterial.LIGHT_WEIGHTED_PRESSURE_PLATE); - isRedstoneBlock.add(XMaterial.COMPARATOR); - isRedstoneBlock.add(XMaterial.REDSTONE_BLOCK); - isRedstoneBlock.add(XMaterial.HOPPER); - isRedstoneBlock.add(XMaterial.ACTIVATOR_RAIL); - isRedstoneBlock.add(XMaterial.DROPPER); - isRedstoneBlock.add(XMaterial.DAYLIGHT_DETECTOR); + isRedstoneBlock.add(Material.TRAPPED_CHEST); + isRedstoneBlock.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE); + isRedstoneBlock.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE); + isRedstoneBlock.add(Material.COMPARATOR); + isRedstoneBlock.add(Material.REDSTONE_BLOCK); + isRedstoneBlock.add(Material.HOPPER); + isRedstoneBlock.add(Material.ACTIVATOR_RAIL); + isRedstoneBlock.add(Material.DROPPER); + isRedstoneBlock.add(Material.DAYLIGHT_DETECTOR); } @@ -58,7 +58,7 @@ public class RedstoneUtils { * @return true if the block uses Redstone */ @SuppressWarnings("BooleanMethodIsAlwaysInverted") - public boolean isRedstoneBlock(XMaterial id) { + public boolean isRedstoneBlock(Material id) { return isRedstoneBlock.contains(id); } @@ -84,30 +84,30 @@ public void handleRedstoneForBlock(Block block, int oldLevel, int newLevel) { // yet been updated, so we're going to do this very ugly thing of // faking the value with the new one whenever the data value of this // block is requested -- it is quite ugly - switch (XMaterial.matchXMaterial(block.getType())) { + switch (block.getType()) { case REDSTONE_WIRE: - XMaterial above = XMaterial.matchXMaterial(world.getBlockAt(x, y + 1, z).getType()); - - XMaterial westSide = XMaterial.matchXMaterial(world.getBlockAt(x, y, z + 1).getType()); - XMaterial westSideAbove = XMaterial.matchXMaterial(world.getBlockAt(x, y + 1, z + 1).getType()); - XMaterial westSideBelow = XMaterial.matchXMaterial(world.getBlockAt(x, y - 1, z + 1).getType()); - XMaterial eastSide = XMaterial.matchXMaterial(world.getBlockAt(x, y, z - 1).getType()); - XMaterial eastSideAbove = XMaterial.matchXMaterial(world.getBlockAt(x, y + 1, z - 1).getType()); - XMaterial eastSideBelow = XMaterial.matchXMaterial(world.getBlockAt(x, y - 1, z - 1).getType()); - - XMaterial northSide = XMaterial.matchXMaterial(world.getBlockAt(x - 1, y, z).getType()); - XMaterial northSideAbove = XMaterial.matchXMaterial(world.getBlockAt(x - 1, y + 1, z).getType()); - XMaterial northSideBelow = XMaterial.matchXMaterial(world.getBlockAt(x - 1, y - 1, z).getType()); - XMaterial southSide = XMaterial.matchXMaterial(world.getBlockAt(x + 1, y, z).getType()); - XMaterial southSideAbove = XMaterial.matchXMaterial(world.getBlockAt(x + 1, y + 1, z).getType()); - XMaterial southSideBelow = XMaterial.matchXMaterial(world.getBlockAt(x + 1, y - 1, z).getType()); + Material above = world.getBlockAt(x, y + 1, z).getType(); + + Material westSide = world.getBlockAt(x, y, z + 1).getType(); + Material westSideAbove = world.getBlockAt(x, y + 1, z + 1).getType(); + Material westSideBelow = world.getBlockAt(x, y - 1, z + 1).getType(); + Material eastSide = world.getBlockAt(x, y, z - 1).getType(); + Material eastSideAbove = world.getBlockAt(x, y + 1, z - 1).getType(); + Material eastSideBelow = world.getBlockAt(x, y - 1, z - 1).getType(); + + Material northSide = world.getBlockAt(x - 1, y, z).getType(); + Material northSideAbove = world.getBlockAt(x - 1, y + 1, z).getType(); + Material northSideBelow = world.getBlockAt(x - 1, y - 1, z).getType(); + Material southSide = world.getBlockAt(x + 1, y, z).getType(); + Material southSideAbove = world.getBlockAt(x + 1, y + 1, z).getType(); + Material southSideBelow = world.getBlockAt(x + 1, y - 1, z).getType(); // Make sure that the wire points to only this block if (!isRedstoneBlock(westSide) && !isRedstoneBlock(eastSide) - && (!isRedstoneBlock(westSideAbove) || westSide == XMaterial.AIR || above != XMaterial.AIR) - && (!isRedstoneBlock(eastSideAbove) || eastSide == XMaterial.AIR || above != XMaterial.AIR) - && (!isRedstoneBlock(westSideBelow) || westSide != XMaterial.AIR) - && (!isRedstoneBlock(eastSideBelow) || eastSide != XMaterial.AIR)) { + && (!isRedstoneBlock(westSideAbove) || westSide == Material.AIR || above != Material.AIR) + && (!isRedstoneBlock(eastSideAbove) || eastSide == Material.AIR || above != Material.AIR) + && (!isRedstoneBlock(westSideBelow) || westSide != Material.AIR) + && (!isRedstoneBlock(eastSideBelow) || eastSide != Material.AIR)) { // Possible blocks north / south handleDirectWireInput(x - 1, y, z, block, oldLevel, newLevel); handleDirectWireInput(x + 1, y, z, block, oldLevel, newLevel); @@ -116,10 +116,10 @@ public void handleRedstoneForBlock(Block block, int oldLevel, int newLevel) { } if (!isRedstoneBlock(northSide) && !isRedstoneBlock(southSide) - && (!isRedstoneBlock(northSideAbove) || northSide == XMaterial.AIR || above != XMaterial.AIR) - && (!isRedstoneBlock(southSideAbove) || southSide == XMaterial.AIR || above != XMaterial.AIR) - && (!isRedstoneBlock(northSideBelow) || northSide != XMaterial.AIR) - && (!isRedstoneBlock(southSideBelow) || southSide != XMaterial.AIR)) { + && (!isRedstoneBlock(northSideAbove) || northSide == Material.AIR || above != Material.AIR) + && (!isRedstoneBlock(southSideAbove) || southSide == Material.AIR || above != Material.AIR) + && (!isRedstoneBlock(northSideBelow) || northSide != Material.AIR) + && (!isRedstoneBlock(southSideBelow) || southSide != Material.AIR)) { // Possible blocks west / east handleDirectWireInput(x, y, z - 1, block, oldLevel, newLevel); handleDirectWireInput(x, y, z + 1, block, oldLevel, newLevel); @@ -135,9 +135,9 @@ public void handleRedstoneForBlock(Block block, int oldLevel, int newLevel) { return; case REPEATER: case COMPARATOR: - BlockFace f = VersionUtilsFactory.getInstance().getRotation(block); + BlockFace f = new BlockAccess().getRotation(block); handleDirectWireInput(x + f.getModX(), y, z + f.getModZ(), block, oldLevel, newLevel); - if (XMaterial.matchXMaterial(block.getRelative(f).getType()) != XMaterial.AIR) { + if (block.getRelative(f).getType() != Material.AIR) { handleDirectWireInput(x + f.getModX(), y - 1, z + f.getModZ(), block, oldLevel, newLevel); handleDirectWireInput(x + f.getModX(), y + 1, z + f.getModZ(), block, oldLevel, newLevel); handleDirectWireInput(x + f.getModX() + 1, y - 1, z + f.getModZ(), block, oldLevel, newLevel); @@ -154,7 +154,7 @@ public void handleRedstoneForBlock(Block block, int oldLevel, int newLevel) { case SPRUCE_BUTTON: case STONE_BUTTON: case LEVER: - BlockFace face = VersionUtilsFactory.getInstance().getRotation(block); + BlockFace face = new BlockAccess().getRotation(block); if (face != null) { face = face.getOppositeFace(); handleDirectWireInput(x + face.getModX() * 2, y + face.getModY() * 2, z + face.getModZ() * 2, block, oldLevel, newLevel); @@ -204,7 +204,7 @@ public boolean sameBlock(org.bukkit.Location a, org.bukkit.Location b) { } public int getPin(Block sign, Block source) { - BlockFace signFace = VersionUtilsFactory.getInstance().getRotation(sign); + BlockFace signFace = new BlockAccess().getRotation(sign); // Если каким то образом табличка стоит неправильно или сигнал идёт сверху if (!FaceUtils.isValidFace(signFace)) return 0; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/SignUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/SignUtils.java similarity index 89% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/SignUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/SignUtils.java index e47805f..9d32959 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/SignUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/SignUtils.java @@ -1,14 +1,14 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; import lombok.experimental.UtilityClass; import net.md_5.bungee.api.ChatColor; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.Sign; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.customPlayers.playlist.ListPlaylist; -import ru.spliterash.musicbox.song.MusicBoxSongManager; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.customPlayers.playlist.ListPlaylist; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; import java.util.List; import java.util.Optional; @@ -23,6 +23,7 @@ public Optional parseSignPlaylist(Sign sign) { boolean rand = sign.getLine(3).contains("R"); return MusicBoxSongManager .getContainerById(StringUtils.strip(songId)) + .filter(c -> !c.getAllSongs().isEmpty()) .map(c -> ListPlaylist.fromContainer(c, rand, hasEnd(sign))); } diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/SongUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/SongUtils.java similarity index 83% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/SongUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/SongUtils.java index 9cbeb21..6038b82 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/SongUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/SongUtils.java @@ -1,14 +1,14 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; import com.xxmicloxx.NoteBlockAPI.model.Note; import com.xxmicloxx.NoteBlockAPI.model.Song; import lombok.experimental.UtilityClass; -import ru.spliterash.musicbox.Lang; -import ru.spliterash.musicbox.MusicBox; -import ru.spliterash.musicbox.customPlayers.interfaces.IPlayList; -import ru.spliterash.musicbox.customPlayers.interfaces.PlayerSongPlayer; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.IPlayList; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.PlayerSongPlayer; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; import java.util.ArrayList; import java.util.Collection; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/StringUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/StringUtils.java similarity index 97% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/StringUtils.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/StringUtils.java index 4eb1e72..1d176bf 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/StringUtils.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/StringUtils.java @@ -1,9 +1,9 @@ -package ru.spliterash.musicbox.utils; +package com.minecraftcitiesnetwork.musicbox.utils; import lombok.experimental.UtilityClass; import org.bukkit.ChatColor; import org.jetbrains.annotations.NotNull; -import ru.spliterash.musicbox.Lang; +import com.minecraftcitiesnetwork.musicbox.Lang; import java.io.IOException; import java.io.InputStream; diff --git a/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/YamlSupportUtils.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/YamlSupportUtils.java new file mode 100644 index 0000000..d79b8ca --- /dev/null +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/YamlSupportUtils.java @@ -0,0 +1,13 @@ +package com.minecraftcitiesnetwork.musicbox.utils; + +import lombok.experimental.UtilityClass; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor; +import com.minecraftcitiesnetwork.musicbox.MusicBoxConfig; + +@UtilityClass +public class YamlSupportUtils { + public CustomClassLoaderConstructor createCustomClassLoaderConstructor() { + return new CustomClassLoaderConstructor(MusicBoxConfig.class, MusicBoxConfig.class.getClassLoader(), new LoaderOptions()); + } +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/classes/Pair.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/classes/Pair.java similarity index 71% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/classes/Pair.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/classes/Pair.java index 462c404..dfa7476 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/classes/Pair.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/classes/Pair.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.utils.classes; +package com.minecraftcitiesnetwork.musicbox.utils.classes; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/classes/PeekList.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/classes/PeekList.java similarity index 98% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/classes/PeekList.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/classes/PeekList.java index bbc085b..fd30ae3 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/classes/PeekList.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/classes/PeekList.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.utils.classes; +package com.minecraftcitiesnetwork.musicbox.utils.classes; import lombok.Getter; diff --git a/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/BukkitNbtHandler.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/BukkitNbtHandler.java new file mode 100644 index 0000000..506cf18 --- /dev/null +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/BukkitNbtHandler.java @@ -0,0 +1,39 @@ +package com.minecraftcitiesnetwork.musicbox.utils.nbt; + +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; +import net.kyori.adventure.nbt.BinaryTagIO; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +public class BukkitNbtHandler implements NBTHandler { + @Override + public ItemStack setNbt(ItemStack item, String key, Integer value) { + ItemStack newItem = item.clone(); + + ItemMeta meta = newItem.getItemMeta(); + meta.getPersistentDataContainer().set(NamespacedKey.fromString("musicbox:" + key), PersistentDataType.INTEGER, value); + newItem.setItemMeta(meta); + + return newItem; + } + + @Override + public int getNbt(ItemStack item, String key) { + if (item == null || !item.hasItemMeta()) return 0; + ItemMeta meta = item.getItemMeta(); + Integer value = meta.getPersistentDataContainer().get(NamespacedKey.fromString("musicbox:" + key), PersistentDataType.INTEGER); + if (value != null) return value; + // Read historical raw tags after Minecraft has migrated them to custom_data. + // Never rewrite the original item; new discs continue using musicbox:song_hash. + try { + var root = BinaryTagIO.reader().read(new ByteArrayInputStream(item.serializeAsBytes()), BinaryTagIO.Compression.GZIP); + int hash = root.getCompound("components").getCompound("minecraft:custom_data").getInt(key); + return hash != 0 ? hash : root.getCompound("tag").getInt(key); + } catch (IOException | IllegalArgumentException ex) { + return 0; + } + } +} diff --git a/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NBTFactory.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NBTFactory.java new file mode 100644 index 0000000..9c0ad0d --- /dev/null +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NBTFactory.java @@ -0,0 +1,6 @@ +package com.minecraftcitiesnetwork.musicbox.utils.nbt; + +public final class NBTFactory { + private NBTFactory() {} + public static final NBTHandler NBT_HANDLER = new BukkitNbtHandler(); +} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NBTHandler.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NBTHandler.java similarity index 76% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NBTHandler.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NBTHandler.java index ca63037..48e4082 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NBTHandler.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NBTHandler.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.utils.nbt; +package com.minecraftcitiesnetwork.musicbox.utils.nbt; import org.bukkit.inventory.ItemStack; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NbtConstants.java b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NbtConstants.java similarity index 60% rename from plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NbtConstants.java rename to plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NbtConstants.java index 8fbf6e4..70cf304 100644 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NbtConstants.java +++ b/plugin/src/main/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/NbtConstants.java @@ -1,4 +1,4 @@ -package ru.spliterash.musicbox.utils.nbt; +package com.minecraftcitiesnetwork.musicbox.utils.nbt; public class NbtConstants { public static final String NBT_NAME = "song_hash"; diff --git a/plugin/src/main/java/ru/spliterash/musicbox/MusicBox.java b/plugin/src/main/java/ru/spliterash/musicbox/MusicBox.java deleted file mode 100644 index b1516b6..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/MusicBox.java +++ /dev/null @@ -1,146 +0,0 @@ -package ru.spliterash.musicbox; - -import lombok.Getter; -import org.bstats.bukkit.Metrics; -import org.bstats.charts.SingleLineChart; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.command.PluginCommand; -import org.bukkit.command.TabExecutor; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.java.JavaPlugin; -import ru.spliterash.musicbox.commands.MusicBoxExecutor; -import ru.spliterash.musicbox.customPlayers.abstracts.AbstractBlockPlayer; -import ru.spliterash.musicbox.customPlayers.models.MusicBoxSongPlayerModel; -import ru.spliterash.musicbox.customPlayers.objects.SignPlayer; -import ru.spliterash.musicbox.db.DatabaseLoader; -import ru.spliterash.musicbox.gui.GUIActions; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSongManager; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.Enumeration; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.stream.Collectors; - -@Getter -public final class MusicBox extends JavaPlugin { - @Getter - private static MusicBox instance; - private MusicBoxConfig configObject; - private boolean loaded = false; - private Metrics bStats; - - @Override - public void onEnable() { - instance = this; - saveDefaultValues(); - registerCommand("musicbox", new MusicBoxExecutor()); - Bukkit.getPluginManager().registerEvents(new Handler(), this); - Bukkit.getScheduler().runTaskAsynchronously(this, this::reloadPlugin); - } - - public void sendMessage(String pex, String noPexMessage, String message) { - for (Player player : Bukkit.getOnlinePlayers()) { - if (player.hasPermission(pex)) - player.sendMessage(message); - else - player.sendMessage(noPexMessage); - } - } - - private void saveDefaultValues() { - boolean firstRun = !getDataFolder().isDirectory(); - saveDefaultConfig(); - if (firstRun) - saveMyMusic(); - } - - @SuppressWarnings("SameParameterValue") - private void registerCommand(String command, TabExecutor executor) { - PluginCommand cmd = getCommand(command); - //noinspection ConstantConditions - cmd.setExecutor(executor); - cmd.setTabCompleter(executor); - } - - public void reloadPlugin() { - loaded = false; - destroyAllPlayers(); - try { - configObject = MusicBoxConfig.parseConfig(new FileInputStream(new File(getDataFolder(), "config.yml"))); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - DatabaseLoader.reload(); - Lang.reload(new File(getDataFolder(), "lang"), configObject.getLang()); - PlayerWrapper.clearAll(); - MusicBoxSongManager.reload(new File(getDataFolder(), "songs")); - GUIActions.reloadGUI(); - ItemStack stack; - - - if (configObject.isBStats() && bStats == null) { - bStats = new Metrics(this, 8766); - bStats.addCustomChart( - new SingleLineChart( - "song_count", - () -> MusicBoxSongManager.getAllSongs().size()) - ); - } - loaded = true; - SignPlayer.restorePreventedPlayers(); - } - - public void destroyAllPlayers() { - MusicBoxSongPlayerModel.destroyAll(); - PlayerWrapper.clearAll(); - } - - @Override - public void onDisable() { - List signLocations = SignPlayer - .getPreventedPlayers() - .stream() - .map(AbstractBlockPlayer::getLocation) - .collect(Collectors.toList()); - if (signLocations.size() > 0) - DatabaseLoader.getBase().savePreventedSigns(signLocations); - destroyAllPlayers(); - } - - private void saveMyMusic() { - try { - java.util.jar.JarFile jar = new java.util.jar.JarFile(getFile()); - Enumeration enumEntries = jar.entries(); - while (enumEntries.hasMoreElements()) { - JarEntry entry = enumEntries.nextElement(); - File realFile = new File(getDataFolder(), entry.getName()); - if (!entry.getName().startsWith("songs/")) - continue; - if (entry.isDirectory()) { // if its a directory, create it - //noinspection ResultOfMethodCallIgnored - realFile.mkdir(); - continue; - } - // get the input stream - - try (java.io.InputStream in = jar.getInputStream(entry); java.io.FileOutputStream out = new java.io.FileOutputStream(realFile)) { - byte[] buffer = new byte[4096]; - int n; - while (-1 != (n = in.read(buffer))) { - out.write(buffer, 0, n); - } - } - } - jar.close(); - } catch (Exception ex) { - ex.printStackTrace(); - - } - } -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/db/model/PlayerPlayListModel.java b/plugin/src/main/java/ru/spliterash/musicbox/db/model/PlayerPlayListModel.java deleted file mode 100644 index 35d2ae4..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/db/model/PlayerPlayListModel.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.spliterash.musicbox.db.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import ru.spliterash.musicbox.db.DatabaseLoader; -import ru.spliterash.musicbox.players.PlayerWrapper; -import ru.spliterash.musicbox.song.MusicBoxSong; -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; -import ru.spliterash.musicbox.song.songContainers.factory.ListContainerFactory; - -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -@Getter -@Setter -@AllArgsConstructor -public class PlayerPlayListModel implements SongContainer { - private int id; - private final UUID owner; - private String name; - private final List songs = new LinkedList<>(); - - /** - * Возращает владельца если тот в сети - */ - public Optional getOwnerWrapper() { - Player player = Bukkit.getPlayer(owner); - if (player == null) - return Optional.empty(); - else - return Optional.of(PlayerWrapper.getInstance(player)); - } - - public void save() { - DatabaseLoader.getBase().savePlayList(this); - } - - public void delete() { - DatabaseLoader.getBase().deleteMe(this); - } - - @Override - public String getNameId() { - return ListContainerFactory.NAME + ":" + id; - } - -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/OldVersion.java b/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/OldVersion.java deleted file mode 100644 index 7d36e10..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/OldVersion.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.spliterash.musicbox.minecraft.nms.versionutils; - -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; -import org.bukkit.material.Directional; -import org.bukkit.material.Lever; -import org.bukkit.material.MaterialData; - -@SuppressWarnings("deprecation") -public class OldVersion implements VersionUtils { - - @Override - public BlockFace getRotation(Block block) { - BlockState state = block.getState(); - MaterialData data = state.getData(); - if (data instanceof org.bukkit.material.Directional) - return ((org.bukkit.material.Directional) data).getFacing(); - else - return null; - } - - @Override - public void setRotation(Block block, BlockFace face) { - BlockState state = block.getState(); - MaterialData data = state.getData(); - if (data instanceof org.bukkit.material.Directional) { - ((Directional) data).setFacingDirection(face); - state.setData(data); - state.update(true, true); - } - } - - @Override - public void setLever(Block block, boolean powered) { - BlockState state = block.getState(); - MaterialData data = state.getData(); - if (data instanceof Lever) { - Lever lever = (Lever) data; - lever.setPowered(powered); - state.setData(lever); - state.update(true, true); - } - } -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/VersionUtils.java b/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/VersionUtils.java deleted file mode 100644 index 5b4652a..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/VersionUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.spliterash.musicbox.minecraft.nms.versionutils; - -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; - -public interface VersionUtils { - - BlockFace getRotation(Block block); - - void setRotation(Block block, BlockFace face); - - void setLever(Block block, boolean powered); -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/VersionUtilsFactory.java b/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/VersionUtilsFactory.java deleted file mode 100644 index 6edd9cb..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/minecraft/nms/versionutils/VersionUtilsFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.spliterash.musicbox.minecraft.nms.versionutils; - -import lombok.Getter; -import ru.spliterash.musicbox.minecraft.nms.NMSUtils; - -public class VersionUtilsFactory { - @Getter - private static final VersionUtils instance; - - static { - int iV = NMSUtils.getVersion(); - if (iV >= 13) { - instance = new NewVersion(); - } else { - instance = new OldVersion(); - } - } - -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/SongContainerFactory.java b/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/SongContainerFactory.java deleted file mode 100644 index 06d8fb5..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/song/songContainers/SongContainerFactory.java +++ /dev/null @@ -1,9 +0,0 @@ -package ru.spliterash.musicbox.song.songContainers; - -import ru.spliterash.musicbox.song.songContainers.types.SongContainer; - -public interface SongContainerFactory { - String getKey(); - - T parseContainer(int id); -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/YamlSupportUtils.java b/plugin/src/main/java/ru/spliterash/musicbox/utils/YamlSupportUtils.java deleted file mode 100644 index 1bc7b60..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/YamlSupportUtils.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.spliterash.musicbox.utils; - -import lombok.SneakyThrows; -import lombok.experimental.UtilityClass; -import org.yaml.snakeyaml.LoaderOptions; -import org.yaml.snakeyaml.constructor.CustomClassLoaderConstructor; -import ru.spliterash.musicbox.MusicBoxConfig; - -import java.lang.reflect.Constructor; - -@UtilityClass -public class YamlSupportUtils { - @SneakyThrows - @SuppressWarnings("JavaReflectionMemberAccess") - public static CustomClassLoaderConstructor createCustomClassLoaderConstructor() { - try { - Constructor constructor = CustomClassLoaderConstructor.class.getConstructor(Class.class, ClassLoader.class); - return (CustomClassLoaderConstructor) constructor.newInstance(MusicBoxConfig.class, MusicBoxConfig.class.getClassLoader()); - } catch (NoSuchMethodException e){ - return new CustomClassLoaderConstructor(MusicBoxConfig.class, MusicBoxConfig.class.getClassLoader(), new LoaderOptions()); - } - } -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/BukkitNbtHandler.java b/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/BukkitNbtHandler.java deleted file mode 100644 index 82c24c8..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/BukkitNbtHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package ru.spliterash.musicbox.utils.nbt; - -import org.bukkit.NamespacedKey; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.tags.ItemTagType; -import org.jetbrains.annotations.Nullable; -import ru.spliterash.musicbox.MusicBox; - -public class BukkitNbtHandler implements NBTHandler { - @Override - public ItemStack setNbt(ItemStack item, String key, Integer value) { - ItemStack newItem = item.clone(); - - ItemMeta meta = newItem.getItemMeta(); - meta.getCustomTagContainer().setCustomTag(new NamespacedKey(MusicBox.getInstance(), key), ItemTagType.INTEGER, value); - newItem.setItemMeta(meta); - - return newItem; - } - - @Override - public @Nullable int getNbt(ItemStack item, String key) { - ItemMeta meta = item.getItemMeta(); - Integer value = meta.getCustomTagContainer().getCustomTag(new NamespacedKey(MusicBox.getInstance(), key), ItemTagType.INTEGER); - if (value == null) - value = 0; - - return value; - } -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NBTFactory.java b/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NBTFactory.java deleted file mode 100644 index 5bf300b..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NBTFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.spliterash.musicbox.utils.nbt; - -import ru.spliterash.musicbox.minecraft.nms.NMSUtils; - -public class NBTFactory { - public static final NBTHandler NBT_HANDLER; - - static { - String raw = NMSUtils.getRawVersion(); - int iV = NMSUtils.parseMajorVersion(raw); - - if (iV >= 13) { - NBT_HANDLER = new BukkitNbtHandler(); - } else { - NBT_HANDLER = new NbtEditorHandler(); - } - } - -} diff --git a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NbtEditorHandler.java b/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NbtEditorHandler.java deleted file mode 100644 index b28558b..0000000 --- a/plugin/src/main/java/ru/spliterash/musicbox/utils/nbt/NbtEditorHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.spliterash.musicbox.utils.nbt; - -import io.github.bananapuncher714.nbteditor.NBTEditor; -import org.bukkit.inventory.ItemStack; - -public class NbtEditorHandler implements NBTHandler { - @Override - public ItemStack setNbt(ItemStack item, String key, Integer value) { - return NBTEditor.set(item, value, key); - } - - @Override - public int getNbt(ItemStack item, String key) { - return NBTEditor.getInt(item, key); - } -} diff --git a/plugin/src/main/resources/paper-plugin.yml b/plugin/src/main/resources/paper-plugin.yml new file mode 100644 index 0000000..ac42c98 --- /dev/null +++ b/plugin/src/main/resources/paper-plugin.yml @@ -0,0 +1,15 @@ +name: MusicBox +version: '${version}' +main: com.minecraftcitiesnetwork.musicbox.MusicBox +api-version: '26.3' +authors: [Spliterash, MCCitiesNetwork] +dependencies: + server: + NoteBlockAPI: + load: BEFORE + required: true + join-classpath: true + Vault: + load: BEFORE + required: false + join-classpath: true diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/InteractionGuardTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/InteractionGuardTest.java new file mode 100644 index 0000000..78c3b65 --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/InteractionGuardTest.java @@ -0,0 +1,29 @@ +package com.minecraftcitiesnetwork.musicbox; + +import org.bukkit.block.Block; +import org.bukkit.event.Event; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.junit.jupiter.api.Test; +import static org.mockito.Mockito.*; + +class InteractionGuardTest { + @Test void protectedClickDoesNotReadOrMutateBlock() { + var event=mock(PlayerInteractEvent.class); + when(event.useInteractedBlock()).thenReturn(Event.Result.DENY); + new Handler().onInteract(event); + verify(event,never()).getClickedBlock(); + } + @Test void offhandDoesNotInsertOrEjectDisc() { + try(var statics=mockStatic(MusicBox.class)) { + var plugin=mock(MusicBox.class); statics.when(MusicBox::getInstance).thenReturn(plugin); + when(plugin.isLoaded()).thenReturn(true); + var event=mock(PlayerInteractEvent.class); var block=mock(Block.class); + when(event.getAction()).thenReturn(Action.RIGHT_CLICK_BLOCK); + when(event.getClickedBlock()).thenReturn(block); when(event.getHand()).thenReturn(EquipmentSlot.OFF_HAND); + new Handler().onInteract(event); + verifyNoInteractions(block); + } + } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/commands/CloudCommandsTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/commands/CloudCommandsTest.java new file mode 100644 index 0000000..5f55593 --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/commands/CloudCommandsTest.java @@ -0,0 +1,57 @@ +package com.minecraftcitiesnetwork.musicbox.commands; + +import io.papermc.paper.command.brigadier.CommandSourceStack; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.internal.CommandRegistrationHandler; +import org.junit.jupiter.api.Test; +import java.util.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class CloudCommandsTest { + static class Manager extends CommandManager { + Manager() { super(ExecutionCoordinator.simpleCoordinator(), CommandRegistrationHandler.nullCommandRegistrationHandler()); } + @Override public boolean hasPermission(CommandSourceStack source, String permission) { + return source.getSender().hasPermission(permission); + } + } + @Test void cloudDispatchesNoArgsAndGreedyArgumentsToExistingCommand() { + var command = mock(SubCommand.class); + var sender = mock(CommandSender.class); + when(sender.hasPermission("musicbox.use")).thenReturn(true); + when(command.canExecute(sender)).thenReturn(true); + var source = mock(CommandSourceStack.class); when(source.getSender()).thenReturn(sender); + var manager = new Manager(); + new MusicBoxExecutor(Map.of("play",command), () -> true).register(manager); + manager.commandExecutor().executeCommand(source,"musicbox play").join(); + verify(command).execute(eq(sender),aryEq(new String[0])); + manager.commandExecutor().executeCommand(source,"musicbox play PlayerOne a song with spaces").join(); + verify(command).execute(eq(sender),aryEq(new String[]{"PlayerOne","a","song","with","spaces"})); + } + @Test void deniedSubcommandOrRootPermissionCannotDispatch() { + var command = mock(SubCommand.class); + var sender = mock(CommandSender.class); + var source = mock(CommandSourceStack.class); when(source.getSender()).thenReturn(sender); + var manager = new Manager(); + new MusicBoxExecutor(Map.of("reload",command), () -> true).register(manager); + assertThrows(Exception.class, () -> manager.commandExecutor().executeCommand(source,"musicbox reload").join()); + when(sender.hasPermission("musicbox.use")).thenReturn(true); + assertThrows(Exception.class, () -> manager.commandExecutor().executeCommand(source,"musicbox reload").join()); + verify(command,never()).execute(any(),any()); + } + @Test void administratorCanReloadAfterFailedLoad() { + var command = mock(SubCommand.class); + var sender = mock(CommandSender.class); + when(sender.hasPermission("musicbox.use")).thenReturn(true); + when(sender.hasPermission("musicbox.admin")).thenReturn(true); + when(command.canExecute(sender)).thenReturn(true); + var source = mock(CommandSourceStack.class); when(source.getSender()).thenReturn(sender); + var manager = new Manager(); + new MusicBoxExecutor(Map.of("reload",command), () -> false).register(manager); + manager.commandExecutor().executeCommand(source,"musicbox reload").join(); + verify(command).execute(eq(sender),aryEq(new String[0])); + } + private static String[] aryEq(String[] expected) { return org.mockito.AdditionalMatchers.aryEq(expected); } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/commands/PaperBootstrapTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/commands/PaperBootstrapTest.java new file mode 100644 index 0000000..08cbb4f --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/commands/PaperBootstrapTest.java @@ -0,0 +1,68 @@ +package com.minecraftcitiesnetwork.musicbox.commands; + +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import io.papermc.paper.plugin.configuration.PluginMeta; +import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.plugin.PluginManager; +import org.bukkit.NamespacedKey; +import org.mockito.MockedStatic; +import org.incendo.cloud.bukkit.internal.CraftBukkitReflection; +import org.incendo.cloud.bukkit.internal.MinecraftArgumentTypes; +import org.incendo.cloud.bukkit.parser.ItemStackParser; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.paper.PaperCommandManager; +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** Exercises the actual eager Cloud mappings, rather than a standalone command-manager substitute. */ +@Tag("paper-runtime") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +class PaperBootstrapTest { + private static MockedStatic bukkit; + private static Server server; + @BeforeAll static void initializeMinecraftRegistriesWithoutStartingServer() throws Exception { + Class.forName("net.minecraft.SharedConstants").getMethod("tryDetectVersion").invoke(null); + Class.forName("net.minecraft.server.Bootstrap").getMethod("bootStrap").invoke(null); + // Supply the real CraftServer type/version without constructing a server instance. + server = (Server) mock(Class.forName("org.bukkit.craftbukkit.CraftServer")); + when(server.getMinecraftVersion()).thenReturn("26.3"); + bukkit = mockStatic(Bukkit.class); + bukkit.when(Bukkit::getServer).thenReturn(server); + } + + @AfterAll static void releaseBukkitBoundary() { if (bukkit != null) bukkit.close(); } + + @Test @Order(1) void uuidMappingResolvesFromRealMinecraftRegistry() { + assertEquals("net.minecraft.commands.arguments.UuidArgument", + MinecraftArgumentTypes.getClassByKey(NamespacedKey.minecraft("uuid")).getName()); + assertEquals(26, CraftBukkitReflection.MAJOR_REVISION); + } + + @Test @Order(2) void itemParserInitializesRealCraftItemStackConversion() { + assertNotNull(new ItemStackParser<>()); + } + + @Test @Order(3) @SuppressWarnings("unchecked") + void nativePaperManagerAndMusicBoxCommandsInitialize() { + var plugin = mock(MusicBox.class); + var metadata = mock(PluginMeta.class); + when(metadata.getName()).thenReturn("MusicBox"); + when(plugin.getPluginMeta()).thenReturn(metadata); + when(plugin.isEnabled()).thenReturn(true); + when(plugin.getName()).thenReturn("MusicBox"); + var pluginManager = mock(PluginManager.class); + when(server.getPluginManager()).thenReturn(pluginManager); + when(pluginManager.getPlugin("MusicBox")).thenReturn(plugin); + when(plugin.getLifecycleManager()).thenReturn(mock(LifecycleEventManager.class)); + var manager = PaperCommandManager.builder() + .executionCoordinator(ExecutionCoordinator.simpleCoordinator()) + .buildOnEnable(plugin); + new MusicBoxExecutor().register(manager); + assertTrue(manager.hasBrigadierManager()); + assertEquals(17, manager.commands().size()); + } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PlaybackLifecycleTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PlaybackLifecycleTest.java new file mode 100644 index 0000000..5523803 --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/models/PlaybackLifecycleTest.java @@ -0,0 +1,43 @@ +package com.minecraftcitiesnetwork.musicbox.customPlayers.models; + +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.customPlayers.interfaces.*; +import org.junit.jupiter.api.Test; +import static org.mockito.Mockito.*; + +class PlaybackLifecycleTest { + @Test void queuedEndAfterStopCannotAdvancePlaylistOrCreatePlayer() { + var player=mock(MusicBoxSongPlayer.class); var list=mock(IPlayList.class); + var next=mock(java.util.function.Function.class); + var model=new MusicBoxSongPlayerModel(player,list,next); + model.destroy(); + model.startNext(); model.createNextPlayer(); + verifyNoInteractions(list,next); + } + @Test void normalEndAdvancesOnceWhilePluginIsLoaded() { + var player=mock(MusicBoxSongPlayer.class); var list=mock(IPlayList.class); + when(list.tryNext()).thenReturn(true); + java.util.function.Function next=mock(java.util.function.Function.class); + var model=new MusicBoxSongPlayerModel(player,list,next); + try(var statics=mockStatic(MusicBox.class)) { + var plugin=mock(MusicBox.class); statics.when(MusicBox::getInstance).thenReturn(plugin); + when(plugin.isLoaded()).thenReturn(true); + model.startNext(); model.startNext(); + verify(list,times(1)).tryNext(); verify(next,times(1)).apply(list); + verify(player,times(1)).destroy(); + } + } + @Test void destroyedPlayerCannotAdvanceAndUnloadedPluginCannotAdvance() { + var player=mock(MusicBoxSongPlayer.class); var list=mock(IPlayList.class); + var next=mock(java.util.function.Function.class); + var model=new MusicBoxSongPlayerModel(player,list,next); + when(player.isDestroyed()).thenReturn(true); + model.startNext(); + verifyNoInteractions(list,next); + when(player.isDestroyed()).thenReturn(false); + try(var statics=mockStatic(MusicBox.class)) { + var plugin=mock(MusicBox.class); statics.when(MusicBox::getInstance).thenReturn(plugin); + model.startNext(); verifyNoInteractions(list,next); + } + } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SignRestorationTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SignRestorationTest.java new file mode 100644 index 0000000..004dff8 --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/SignRestorationTest.java @@ -0,0 +1,42 @@ +package com.minecraftcitiesnetwork.musicbox.customPlayers.objects; + +import com.minecraftcitiesnetwork.musicbox.MusicBox; +import com.minecraftcitiesnetwork.musicbox.db.*; +import com.minecraftcitiesnetwork.musicbox.db.model.PlayerPlayListModel; +import com.minecraftcitiesnetwork.musicbox.utils.SignUtils; +import org.bukkit.*; +import org.bukkit.block.*; +import org.junit.jupiter.api.Test; +import java.util.*; +import java.util.logging.Logger; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class SignRestorationTest { + @Test void emptyMasterAndMissingSongPlaylistAreNotConstructedAsPlayers() { + var sign=mock(Sign.class); + when(sign.getLine(1)).thenReturn(SignPlayer.SIGN_SECOND_LINE); + when(sign.getLine(3)).thenReturn("P"); when(sign.getLine(0)).thenReturn("MASTER"); + assertTrue(SignUtils.parseSignPlaylist(sign).isEmpty()); + try(var loader=mockStatic(DatabaseLoader.class)) { + var database=mock(AbstractBase.class); loader.when(DatabaseLoader::getBase).thenReturn(database); + when(database.getPlayListById(7)).thenReturn(new PlayerPlayListModel(7,UUID.randomUUID(),"Synthetic")); + when(sign.getLine(0)).thenReturn("LIST:7"); + assertTrue(SignUtils.parseSignPlaylist(sign).isEmpty()); + } + } + @Test void failedSignDoesNotPreventLaterRestorationAttemptsOrAcknowledgeRows() { + try(var loader=mockStatic(DatabaseLoader.class); var bukkit=mockStatic(Bukkit.class); var statics=mockStatic(MusicBox.class)) { + var database=mock(AbstractBase.class); loader.when(DatabaseLoader::getBase).thenReturn(database); + bukkit.when(Bukkit::isPrimaryThread).thenReturn(true); + var plugin=mock(MusicBox.class); statics.when(MusicBox::getInstance).thenReturn(plugin); + when(plugin.getLogger()).thenReturn(Logger.getAnonymousLogger()); + var bad=mock(Location.class); var later=mock(Location.class); var block=mock(Block.class); + when(database.getPreventedSigns()).thenReturn(List.of(bad,later)); + when(bad.getBlock()).thenThrow(new IllegalStateException("Synthetic inaccessible block")); + when(later.getBlock()).thenReturn(block); when(block.getState()).thenReturn(mock(BlockState.class)); + assertDoesNotThrow(SignPlayer::restorePreventedPlayers); + verify(later).getBlock(); verify(database,never()).acknowledgePreventedSign(any()); + } + } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxInteractionTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxInteractionTest.java new file mode 100644 index 0000000..1874197 --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/customPlayers/objects/jukebox/JukeboxInteractionTest.java @@ -0,0 +1,65 @@ +package com.minecraftcitiesnetwork.musicbox.customPlayers.objects.jukebox; + +import com.minecraftcitiesnetwork.musicbox.*; +import com.minecraftcitiesnetwork.musicbox.customPlayers.abstracts.AbstractBlockPlayer; +import com.minecraftcitiesnetwork.musicbox.song.*; +import org.bukkit.Material; +import org.bukkit.block.Jukebox; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.*; +import org.junit.jupiter.api.Test; +import java.util.Optional; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class JukeboxInteractionTest { + @Test void insertionConsumesOneAndLeavesRemainingStackInHand() { + try(var songs=mockStatic(MusicBoxSongManager.class); var statics=mockStatic(MusicBox.class); var blocks=mockStatic(AbstractBlockPlayer.class); + var lists=mockConstruction(JukeboxPlaylistImpl.class); var players=mockConstruction(JukeboxPlayer.class)) { + var song=mock(MusicBoxSong.class); var held=mock(ItemStack.class); + when(held.getType()).thenReturn(mock(Material.class)); + songs.when(() -> MusicBoxSongManager.findByItem(held)).thenReturn(Optional.of(song)); + var inserted=mock(ItemStack.class); var remaining=mock(ItemStack.class); + when(held.clone()).thenReturn(inserted,remaining); when(remaining.getAmount()).thenReturn(3,2); + var box=mock(Jukebox.class); var inventory=mock(JukeboxInventory.class); when(box.getInventory()).thenReturn(inventory); + var player=mock(Player.class); var playerInventory=mock(PlayerInventory.class); when(player.getInventory()).thenReturn(playerInventory); + var event=mock(PlayerInteractEvent.class); when(event.getPlayer()).thenReturn(player); + var plugin=mock(MusicBox.class); var config=mock(MusicBoxConfig.class); + statics.when(MusicBox::getInstance).thenReturn(plugin); when(plugin.getConfigObject()).thenReturn(config); + JukeboxPlayer.onJukeboxClick(box,held,event); + verify(event).setCancelled(true); verify(box).eject(); + verify(inserted).setAmount(1); verify(remaining).setAmount(2); + verify(inventory).setItem(0,inserted); verify(box).stopPlaying(); + verify(playerInventory).setItemInMainHand(remaining); verify(held,never()).setAmount(anyInt()); + assertEquals(1,players.constructed().size()); + } + } + @Test void ordinaryItemStopsCustomPlaybackAndLeavesVanillaInteractionUntouched() { + try(var songs=mockStatic(MusicBoxSongManager.class); var blocks=mockStatic(AbstractBlockPlayer.class)) { + var box=mock(Jukebox.class); var active=mock(JukeboxPlayer.class); + blocks.when(() -> AbstractBlockPlayer.findByLocation(box.getLocation())).thenReturn(active); + var held=mock(ItemStack.class); when(held.getType()).thenReturn(mock(Material.class)); + songs.when(() -> MusicBoxSongManager.findByItem(held)).thenReturn(Optional.empty()); + var event=mock(PlayerInteractEvent.class); + JukeboxPlayer.onJukeboxClick(box,held,event); + verify(active).destroy(); verify(event,never()).setCancelled(anyBoolean()); + verify(box,never()).eject(); verify(held,never()).setAmount(anyInt()); + } + } + @Test void liveRecordRemovalOrReplacementDoesNotMatchOriginalPlayingSong() { + try(var songs=mockStatic(MusicBoxSongManager.class)) { + var box=mock(Jukebox.class); var inventory=mock(JukeboxInventory.class); when(box.getInventory()).thenReturn(inventory); + var stack=mock(ItemStack.class); when(inventory.getItem(0)).thenReturn(stack); + var original=mock(MusicBoxSong.class); when(original.getHash()).thenReturn(111); + songs.when(() -> MusicBoxSongManager.findByItem(stack)).thenReturn(Optional.of(original)); + assertTrue(JukeboxPlayer.hasPlayingRecord(box,111)); + var replacement=mock(MusicBoxSong.class); when(replacement.getHash()).thenReturn(222); + songs.when(() -> MusicBoxSongManager.findByItem(stack)).thenReturn(Optional.of(replacement)); + assertFalse(JukeboxPlayer.hasPlayingRecord(box,111)); + when(inventory.getItem(0)).thenReturn(null); + songs.when(() -> MusicBoxSongManager.findByItem(null)).thenReturn(Optional.empty()); + assertFalse(JukeboxPlayer.hasPlayingRecord(box,111)); + } + } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/db/DataRetentionTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/db/DataRetentionTest.java new file mode 100644 index 0000000..9cdbe14 --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/db/DataRetentionTest.java @@ -0,0 +1,121 @@ +package com.minecraftcitiesnetwork.musicbox.db; + +import com.minecraftcitiesnetwork.musicbox.db.types.SQLite; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSongManager; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.io.TempDir; +import org.mockito.MockedStatic; + +import java.nio.file.Path; +import java.sql.*; +import java.util.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class DataRetentionTest { + @TempDir Path directory; + private SQLite database; + private String url; + private MockedStatic bukkit; + private static final UUID OWNER = UUID.fromString("00000000-0000-0000-0000-000000000197"); + + @BeforeEach void setup() throws Exception { + bukkit = mockStatic(Bukkit.class); + bukkit.when(Bukkit::isPrimaryThread).thenReturn(false); + var file = directory.resolve("synthetic.db").toFile(); + database = new SQLite(file); + url = "jdbc:sqlite:" + file; + songs(List.of()); + execute("INSERT INTO playlists(id,owner,name) VALUES(7,'" + OWNER + "','Synthetic playlist')"); + } + @AfterEach void cleanup() throws Exception { songs(List.of()); bukkit.close(); } + + private void songs(List songs) throws Exception { + var field = MusicBoxSongManager.class.getDeclaredField("allSongs"); + field.setAccessible(true); + field.set(null, songs); + } + private void execute(String sql) throws Exception { + try (var c = DriverManager.getConnection(url); var s = c.createStatement()) { s.executeUpdate(sql); } + } + private List storedHashes() throws Exception { + try (var c = DriverManager.getConnection(url); var s = c.createStatement(); + var r = s.executeQuery("SELECT song_hash FROM playlist_song WHERE playlists_id=7 ORDER BY pos")) { + List result = new ArrayList<>(); + while (r.next()) result.add(r.getInt(1)); + return result; + } + } + private int count(String table) throws Exception { + try (var c = DriverManager.getConnection(url); var s = c.createStatement(); + var r = s.executeQuery("SELECT count(*) FROM " + table)) { r.next(); return r.getInt(1); } + } + + @Test void completelyMissingSongsRemainOnReadAndResave() throws Exception { + execute("INSERT INTO playlist_song VALUES(7,-301,0),(7,902,1)"); + var model = database.getPlayListById(7); + assertNotNull(model); + assertTrue(model.getSongs().isEmpty()); + assertEquals(List.of(-301,902), storedHashes()); + assertEquals(1, database.getPlayLists(OWNER).size()); + model.setName("Renamed while files unavailable"); + database.savePlayList(model); + assertEquals(List.of(-301,902), storedHashes()); + assertEquals(1, count("playlists")); + } + + @Test void partiallyResolvedResaveRetainsUnknownHashesInOrder() throws Exception { + var first = mock(MusicBoxSong.class); when(first.getHash()).thenReturn(111); + var last = mock(MusicBoxSong.class); when(last.getHash()).thenReturn(333); + songs(List.of(first,last)); + execute("INSERT INTO playlist_song VALUES(7,-301,0),(7,111,1),(7,902,2),(7,333,3)"); + var model = database.getPlayListById(7); + assertEquals(List.of(first,last), model.getSongs()); + database.savePlayList(model); + assertEquals(List.of(-301,111,902,333), storedHashes()); + model.getSongs().remove(first); + database.savePlayList(model); + assertEquals(List.of(-301,902,333), storedHashes()); + database.savePlayList(model); + assertEquals(List.of(-301,902,333), storedHashes()); + var reloaded = database.getPlayListById(7); + database.savePlayList(reloaded); + assertEquals(List.of(-301,902,333), storedHashes()); + } + + @Test void sparsePersistedPositionsKeepMissingSongBeforeItsSurvivingNeighbour() throws Exception { + var song = mock(MusicBoxSong.class); when(song.getHash()).thenReturn(222); + songs(List.of(song)); + execute("INSERT INTO playlist_song VALUES(7,-301,10),(7,222,20),(7,902,40)"); + var model = database.getPlayListById(7); + database.savePlayList(model); + assertEquals(List.of(-301,222,902), storedHashes()); + database.savePlayList(database.getPlayListById(7)); + assertEquals(List.of(-301,222,902), storedHashes()); + } + + @Test void emptyPlaylistStillExists() { + assertNotNull(database.getPlayListById(7)); + assertEquals(1,database.getPlayLists(OWNER).size()); + } + + @Test void signReadsRetainMissingWorldAndOnlyAcknowledgedRowIsRemoved() throws Exception { + var world = mock(World.class); when(world.getName()).thenReturn("synthetic_world"); + bukkit.when(() -> Bukkit.getWorld("synthetic_world")).thenReturn(world); + execute("INSERT INTO signs VALUES('synthetic_world|10.5|65.0|-3.5'),('absent_world|1.0|2.0|3.0')"); + var locations = database.getPreventedSigns(); + assertEquals(1,locations.size()); + assertEquals(2,count("signs")); + database.savePreventedSigns(locations); + database.savePreventedSigns(locations); + assertEquals(2,count("signs")); + database.acknowledgePreventedSign(locations.getFirst()); + assertEquals(1,count("signs")); + assertTrue(database.getPreventedSigns().isEmpty()); + assertEquals(1,count("signs")); + } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/song/SyntheticSongTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/song/SyntheticSongTest.java new file mode 100644 index 0000000..422c30a --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/song/SyntheticSongTest.java @@ -0,0 +1,49 @@ +package com.minecraftcitiesnetwork.musicbox.song; + +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.io.*; +import java.nio.file.*; +import java.nio.charset.StandardCharsets; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class SyntheticSongTest { + @TempDir Path directory; + private void number(DataOutputStream out,int value,int bytes) throws IOException { + for(int i=0;i>> (8*i)); + } + private void text(DataOutputStream out,String text) throws IOException { + byte[] bytes=text.getBytes(StandardCharsets.UTF_8); number(out,bytes.length,4); out.write(bytes); + } + @Test void decodesOriginalSyntheticNbsAndRetainsPathBasedIdentifiers() throws Exception { + var file=directory.resolve("synthetic.nbs"); + try(var out=new DataOutputStream(Files.newOutputStream(file))) { + number(out,2,2); number(out,1,2); + text(out,"Synthetic melody"); text(out,"Test author"); text(out,"Original author"); text(out,"One synthetic note"); + number(out,1000,2); out.write(new byte[]{0,10,4}); + for(int i=0;i<5;i++) number(out,0,4); + text(out,""); number(out,1,2); number(out,1,2); out.write(new byte[]{0,45}); + number(out,0,2); number(out,0,2); text(out,"Test layer"); out.writeByte(100); out.writeByte(0); + } + try(var bukkit=mockStatic(Bukkit.class)) { + var server=mock(Server.class); when(server.getVersion()).thenReturn("Synthetic Paper (MC: 26.3)"); + bukkit.when(Bukkit::getServer).thenReturn(server); + bukkit.when(Bukkit::getVersion).thenReturn("Synthetic Paper (MC: 26.3)"); + com.minecraftcitiesnetwork.musicbox.Lang.reload(directory.resolve("lang").toFile(),"en"); + var relative=Path.of("").toAbsolutePath().relativize(directory).toFile(); + var container=new MusicBoxSongContainer(relative,null); + assertEquals(relative.getPath().hashCode(),container.getHash()); + assertEquals(1,container.getSongs().size()); + var song=container.getSongs().getFirst(); + assertEquals("Synthetic melody",song.getName()); + assertEquals(2,song.getLength()); assertEquals(10f,song.getSpeed()); + assertEquals(new File(relative,"synthetic.nbs").getPath().hashCode(),song.getHash()); + assertNotEquals(file.toFile().getPath().hashCode(),song.getHash()); + var note=song.getSong().getLayerHashMap().get(0).getNote(0); + assertNotNull(note); assertEquals(45,note.getKey()); assertEquals(0,note.getInstrument()); + } + } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/utils/EconomyAvailabilityTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/utils/EconomyAvailabilityTest.java new file mode 100644 index 0000000..51718eb --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/utils/EconomyAvailabilityTest.java @@ -0,0 +1,41 @@ +package com.minecraftcitiesnetwork.musicbox.utils; + +import com.minecraftcitiesnetwork.musicbox.*; +import com.minecraftcitiesnetwork.musicbox.gui.GUIActions; +import com.minecraftcitiesnetwork.musicbox.players.PlayerWrapper; +import com.minecraftcitiesnetwork.musicbox.song.MusicBoxSong; +import net.milkbowl.vault.economy.Economy; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.*; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class EconomyAvailabilityTest { + @Test void missingProviderDoesNotPoisonUtilityAndLaterRegistrationIsRecognized() { + try(var bukkit=mockStatic(Bukkit.class); var statics=mockStatic(MusicBox.class)) { + var plugin=mock(MusicBox.class); var config=mock(MusicBoxConfig.class); + var settings=mock(MusicBoxConfig.EconomySetting.class); + statics.when(MusicBox::getInstance).thenReturn(plugin); when(plugin.getConfigObject()).thenReturn(config); + when(config.getEconomy()).thenReturn(settings); when(settings.isEnable()).thenReturn(true); + when(settings.getPrice()).thenReturn(12.5); + var plugins=mock(PluginManager.class); var services=mock(ServicesManager.class); + bukkit.when(Bukkit::getPluginManager).thenReturn(plugins); bukkit.when(Bukkit::getServicesManager).thenReturn(services); + when(plugins.isPluginEnabled("Vault")).thenReturn(true); + assertEquals(12.5,EconomyUtils.getDiscPrice()); assertFalse(EconomyUtils.isEnable()); + var player=mock(Player.class); assertFalse(EconomyUtils.canBuy(player,12.5)); + var wrapper=mock(PlayerWrapper.class); var song=mock(MusicBoxSong.class); + GUIActions.openShopInventory(wrapper); GUIActions.playerBuyMusic(wrapper,song); + verifyNoInteractions(wrapper,song); + var economy=mock(Economy.class); + RegisteredServiceProvider registration=mock(RegisteredServiceProvider.class); + when(registration.getProvider()).thenReturn(economy); + when(services.getRegistration(Economy.class)).thenReturn(registration); + assertTrue(EconomyUtils.isEnable()); + when(settings.isEnable()).thenReturn(false); + assertFalse(EconomyUtils.buyNoMessage(player,12.5)); + verify(economy,never()).withdrawPlayer(any(Player.class),anyDouble()); + } + } +} diff --git a/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/DiscDataTest.java b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/DiscDataTest.java new file mode 100644 index 0000000..a11659a --- /dev/null +++ b/plugin/src/test/java/com/minecraftcitiesnetwork/musicbox/utils/nbt/DiscDataTest.java @@ -0,0 +1,51 @@ +package com.minecraftcitiesnetwork.musicbox.utils.nbt; + +import net.kyori.adventure.nbt.*; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.*; +import org.junit.jupiter.api.Test; +import java.io.ByteArrayOutputStream; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class DiscDataTest { + private final BukkitNbtHandler handler = new BukkitNbtHandler(); + private ItemStack item(CompoundBinaryTag root) throws Exception { + var bytes = new ByteArrayOutputStream(); + BinaryTagIO.writer().write(root, bytes, BinaryTagIO.Compression.GZIP); + var item = mock(ItemStack.class); var meta = mock(ItemMeta.class); + when(item.hasItemMeta()).thenReturn(true); when(item.getItemMeta()).thenReturn(meta); + when(meta.getPersistentDataContainer()).thenReturn(mock(PersistentDataContainer.class)); + when(item.serializeAsBytes()).thenReturn(bytes.toByteArray()); + return item; + } + @Test void pdcKeepsRollbackNamespaceAndTakesPrecedence() throws Exception { + var item = item(CompoundBinaryTag.empty()); + when(item.getItemMeta().getPersistentDataContainer().get(NamespacedKey.fromString("musicbox:song_hash"), PersistentDataType.INTEGER)).thenReturn(-197); + assertEquals(-197, handler.getNbt(item,"song_hash")); + verify(item,never()).serializeAsBytes(); + var clone = mock(ItemStack.class); when(item.clone()).thenReturn(clone); + var meta = mock(ItemMeta.class); when(clone.getItemMeta()).thenReturn(meta); + var pdc = mock(PersistentDataContainer.class); when(meta.getPersistentDataContainer()).thenReturn(pdc); + assertSame(clone,handler.setNbt(item,"song_hash",12345)); + verify(pdc).set(NamespacedKey.fromString("musicbox:song_hash"),PersistentDataType.INTEGER,12345); + verify(item,never()).setItemMeta(any()); + } + @Test void rawCustomDataAndOldTagAreReadWithoutRewriting() throws Exception { + var tag = CompoundBinaryTag.builder().putInt("song_hash",-123456).build(); + var modern = item(CompoundBinaryTag.builder().put("components", CompoundBinaryTag.builder().put("minecraft:custom_data",tag).build()).build()); + var legacy = item(CompoundBinaryTag.builder().put("tag",tag).build()); + assertEquals(-123456,handler.getNbt(modern,"song_hash")); + assertEquals(-123456,handler.getNbt(legacy,"song_hash")); + verify(modern,never()).setItemMeta(any()); verify(legacy,never()).setItemMeta(any()); + } + @Test void absentOrMalformedDataDoesNotIdentifySong() throws Exception { + assertEquals(0,handler.getNbt(null,"song_hash")); + var item = item(CompoundBinaryTag.empty()); + assertEquals(0,handler.getNbt(item,"song_hash")); + when(item.serializeAsBytes()).thenReturn(new byte[]{1,2,3}); + assertEquals(0,handler.getNbt(item,"song_hash")); + } +} diff --git a/settings.gradle b/settings.gradle index 231ae22..c6ccfdc 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,17 +1,2 @@ rootProject.name = 'MusicBox' - -include "plugin" -include "nms:shared" -include "nms:versions:12" -include "nms:versions:13-16" -include "nms:versions:17" -include "nms:versions:18" -include "nms:versions:19_2" -include "nms:versions:19_3" -include "nms:versions:19_4" -include "nms:versions:20_1" -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 'plugin'