From db8a93b910c6b419fdf75cdd6e86e1a0fdc68964 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Sat, 18 May 2024 15:21:50 -0400 Subject: [PATCH 01/15] Upgrade gradle from v7.3.3 to v7.6.4** Upgraded from: v7.3.3 -> v7.4 -> v7.4.1 -> v7.4.2 -> v7.5 -> v7.5.1 -> v7.6 -> v7.6.1 -> v7.6.2 -> v7.6.3 -> v7.6.4\ Preparing for Gradle v8.x --- docs/changelog_v3.3.x.md | 29 +++++++++++++++--- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 61624 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 28 +++++++++++------ gradlew.bat | 15 +++++---- gradlew8.bat | 2 +- .../Spiget_v1.4.2.prison-build.jar | Bin 7 files changed, 55 insertions(+), 22 deletions(-) rename prison-spigot/lib/{ => disabled}/Spiget_v1.4.2.prison-build.jar (100%) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 8f050a6c3..b9f64c5e1 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -14,9 +14,14 @@ These change logs represent the work that has been going on within prison. -# 3.3.0-alpha.17a 2024-04-29 +# 3.3.0-alpha.17a 2024-05-18 +* **Upgrade gradle from v7.3.3 to v7.6.4** + Upgraded from: v7.3.3 -> v7.4 -> v7.4.1 -> v7.4.2 + -> v7.5 -> v7.5.1 -> v7.6 -> v7.6.1 -> v7.6.2 -> v7.6.3 -> v7.6.4\ + Preparing for Gradle v8.x + **v3.3.0-alpha.17a 2024-04-29** @@ -29,9 +34,7 @@ These change logs represent the work that has been going on within prison. * **Initial setup of the GUI tools messages that are at the bottom of a page.** Setup the handling of the messages and added the messages to all of the language files. -Support for prior, current, and next page. Also close. - - +Support for prior, current, and next page. Also c * **Update the plugin.yml and removed the permissions configs since they were generating errors (lack of a schema) and the perms and handled through the prison command handler.** @@ -1962,7 +1965,7 @@ The major issue here was that mines were being reset in the middle of a reset ac * **Made many changes to the default configurations of the autoFeatures.** This is to try to make it easier to use prison by using more of the settings that are most useful. -Added more comments to make it easier to understand these settings too. +Added more comments to make it easier to understand these settings too.f * **Release v3.3.0-alpha.8d 2022-02-20** @@ -2442,3 +2445,19 @@ v3.2.6, v3.3.0-alpha.1, v3.3.0-alpha.2, v3.2.7, v3.3.0-alpha.3 Start on the alpha.1 release. + + +------- +------- Upgrading Gradle: +------- + + Use the following for a list of version for upgrading to: + https://gradle.org/releases/ + + * gradlew wrapper --gradle-version=7.4 :: Sets the new wrapper version + * gradlew --version :: Will actually install the new version + * gradlew build :: Will build project with the new version to ensure all is good. If build is good, then you can try to upgrade to the next version. + + + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..afba109285af78dbd2a1d187e33ac4f87c76e392 100644 GIT binary patch delta 36947 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

h3Y5Ua5>0<>`e@0qkQ+|8VA&>!KrR0;1 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 GO8pnEgtf;2 delta 35088 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/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd32c..93e3f59f1 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/gradlew8.bat b/gradlew8.bat index 37eea68fa..95f576820 100644 --- a/gradlew8.bat +++ b/gradlew8.bat @@ -1 +1 @@ -./gradlew build -Dorg.gradle.java.home="C:\Program Files\Java\jdk-1.8_411" --stacktrace %* \ No newline at end of file +./gradlew -Dorg.gradle.java.home="C:\Program Files\Java\jdk-1.8_411" %* \ No newline at end of file diff --git a/prison-spigot/lib/Spiget_v1.4.2.prison-build.jar b/prison-spigot/lib/disabled/Spiget_v1.4.2.prison-build.jar similarity index 100% rename from prison-spigot/lib/Spiget_v1.4.2.prison-build.jar rename to prison-spigot/lib/disabled/Spiget_v1.4.2.prison-build.jar From 5702985c7927e4e85586b2c65d39ecbecf26af5b Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Sat, 18 May 2024 15:23:50 -0400 Subject: [PATCH 02/15] Upgrade gradle from v7.3.3 to v7.6.4** Upgraded from: v7.3.3 -> v7.4 -> v7.4.1 -> v7.4.2 -> v7.5 -> v7.5.1 -> v7.6 -> v7.6.1 -> v7.6.2 -> v7.6.3 -> v7.6.4\ Preparing for Gradle v8.x --- settings.gradle | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/settings.gradle b/settings.gradle index 7b7f2ca03..d4605610e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -17,7 +17,20 @@ */ + +/* + * NOTE: Gradle v8.x will no longer auto provision tool chains. The provisioning + * tools must be explicitly specificed. This can be accomplished with + * the use of plugins to help control the toolchainManagement. + * https://docs.gradle.org/current/userguide/toolchains.html#sub:download_repositories + */ +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} + + rootProject.name = 'prison' + include 'prison-core' include 'prison-spigot' /* include 'prison-sponge' */ @@ -32,3 +45,9 @@ include 'prison-worldguard7' /* include 'prison-worldguard8' */ +include 'prison-spigot-alt' + + + + + From 1cdc79a7679581097538be077ee33456211567e8 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Sat, 18 May 2024 15:28:31 -0400 Subject: [PATCH 03/15] Upgrade spiget from v1.4.2 to v1.4.6 --- docs/changelog_v3.3.x.md | 5 ++++ prison-spigot/build.gradle | 49 +++++++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index b9f64c5e1..a0131e345 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -17,6 +17,11 @@ These change logs represent the work that has been going on within prison. # 3.3.0-alpha.17a 2024-05-18 +* **Upgrade spiget from v1.4.2 to v1.4.6** + Was using a jar with v1.4.2 due to their repo going down frequently. + Switched back to pulling through maven and got rid of jar. + + * **Upgrade gradle from v7.3.3 to v7.6.4** Upgraded from: v7.3.3 -> v7.4 -> v7.4.1 -> v7.4.2 -> v7.5 -> v7.5.1 -> v7.6 -> v7.6.1 -> v7.6.2 -> v7.6.3 -> v7.6.4\ diff --git a/prison-spigot/build.gradle b/prison-spigot/build.gradle index baa978ed1..d0f5d6bfb 100644 --- a/prison-spigot/build.gradle +++ b/prison-spigot/build.gradle @@ -105,15 +105,20 @@ dependencies { // implementation 'org.bstats:bstats-bukkit:2.2.1' - // Repo keeps going down: + // NOTE: A couple of years ago, their Repo kept going down so switched to use a jar: + implementation 'org.inventivetalent.spiget-update:bukkit:1.4.6-SNAPSHOT' //implementation 'org.inventivetalent.spiget-update:bukkit:1.4.2-SNAPSHOT' // Using jar instead: lib/Spiget_v1.4.2.prison-build.jar + // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 implementation 'org.apache.commons:commons-lang3:3.12.0' + // https://mvnrepository.com/artifact/com.google.code.gson/gson + implementation 'com.google.code.gson:gson:2.10.1' + /* // https://mvnrepository.com/artifact/com.sk89q.worldedit/worldedit-core @@ -209,11 +214,14 @@ dependencies { compileOnly fileTree(dir: 'lib', include: ['*.jar'], - exclude: ['Spiget_v1.4.2.prison-build.jar', + exclude: [ + //'spiget-update_bukkit-1.4.6-20220613.151608-1', + // 'Spiget_v1.4.2.prison-build.jar', // 'CrazyEnchantments-plugin-api.v1.8-Dev-Build-v8.jar', 'Zenchantments__API_v1.15.2.build4.jar']) implementation fileTree(dir: 'lib', - include: ['Spiget_v1.4.2.prison-build.jar', + include: [ + //'spiget-update_bukkit-1.4.6-20220613.151608-1', // 'CrazyEnchantments-plugin-api.v1.8-Dev-Build-v8.jar', 'Zenchantments__API_v1.15.2.build4.jar']) @@ -253,18 +261,26 @@ processResources { shadowJar { dependencies { + include(project(':prison-core')) + include(project(':prison-mines')) + include(project(':prison-ranks')) + include(project(':prison-sellall')) + include(dependency('org.apache.commons:commons-lang3:3.12.0')) // https://mvnrepository.com/artifact/com.google.code.gson/gson - include(dependency('com.google.code.gson:gson:2.10.1')) + include(dependency('com.google.code.gson:gson:')) //include(dependency('com.google.code.gson:gson:2.8.6')) - include(dependency('org.bstats:bstats-base:3.0.2')) - include(dependency('org.bstats:bstats-bukkit:3.0.2')) + include(dependency('org.bstats:bstats-base:')) + include(dependency('org.bstats:bstats-bukkit:')) +// include(dependency('org.bstats:bstats-base:3.0.2')) +// include(dependency('org.bstats:bstats-bukkit:3.0.2')) // include(dependency('org.bstats:bstats-base:2.2.1')) // include(dependency('org.bstats:bstats-bukkit:2.2.1')) - include(dependency('me.clip:placeholderapi:2.11.2')) + //include(dependency('me.clip:placeholderapi:')) + //include(dependency('me.clip:placeholderapi:2.11.2')) //include(dependency('me.clip:placeholderapi:2.10.9')) // https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries @@ -275,21 +291,22 @@ shadowJar { include(dependency('de.tr7zw:item-nbt-api:')) //include(dependency('de.tr7zw:item-nbt-api-plugin:2.10.0')) - //include(dependency('org.inventivetalent.spiget-update:bukkit:1.4.2-SNAPSHOT')) + include(dependency('org.inventivetalent.spiget-update:bukkit:')) + //include(dependency('org.inventivetalent.spiget-update:core:')) //include(dependency('me.badbones69:crazyenchantments-plugin:1.8-Dev-Build-v8')) - include(project(':prison-core')) - include(project(':prison-mines')) - include(project(':prison-ranks')) - include(project(':prison-sellall')) } - relocate 'org.bstats', 'tech.mcprison.prison.bstats' + // Relocate all libs to the tech.mcprison.prison.libs package: + relocate 'org.bstats', 'tech.mcprison.prison.libs.bstats' + + relocate 'com.google.gson', 'tech.mcprison.prison.libs.gson' - relocate 'org.inventivetalent.update.spiget', 'tech.mcprison.prison.spiget' - relocate 'com.cryptomorin', 'tech.mcprison.prison.cryptomorin' + relocate 'org.inventivetalent.update.spiget', 'tech.mcprison.prison.libs.spiget' + + relocate 'com.cryptomorin', 'tech.mcprison.prison.libs.cryptomorin' - relocate 'de.tr7zw.changeme.nbtapi', 'tech.mcprison.prison.nbtapi' + relocate 'de.tr7zw.changeme.nbtapi', 'tech.mcprison.prison.libs.nbtapi' // relocate 'de.tr7zw.nbtapi', 'tech.mcprison.prison.nbtapi' //relocate 'me.badbones69.crazyenchantments.api.events.BlastUseEvent', 'tech.mcprison.prison.crazyenchantments.api' From 53a35952f37a3d6026fd5f8eb72e9fb0917a364e Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Sat, 18 May 2024 18:33:33 -0400 Subject: [PATCH 04/15] Upgrade gradle from v7.6.4 to v8.7 Upgraded from: v7.6.4 -> v8.0 -> v8.0.2 -> v8.1 -> v8.1.1 -> v8.2 -> v8.3 -> v8.4 -> v8.5 -> v8.6 -> v8.7 v8.3 required a configuration change due to `org.gradle.api.plugins.BasePluginConvention` type has been deprecated and will be removed in gradle v9.x. This is impacting the use of the `build.gradle`'s `archivesBaseNamme`. This is being replaced by the new `base{}` configuration block. v8.3 also required other config changes. --- build.gradle | 62 ++-- docs/changelog_v3.3.x.md | 14 +- gradle/wrapper/gradle-wrapper.jar | Bin 61624 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 29 +- gradlew.bat | 20 +- prison-core/build.gradle | 22 +- .../lib/{ => oldStuff}/json-20230227.jar | Bin prison-sellall/build.gradle | 4 +- prison-spigot-alt/build.gradle | 314 ++++++++++++++++++ .../src/main/resources/plugin.yml | 58 ++++ prison-spigot/build.gradle | 14 +- 12 files changed, 482 insertions(+), 58 deletions(-) rename prison-core/lib/{ => oldStuff}/json-20230227.jar (100%) create mode 100644 prison-spigot-alt/build.gradle create mode 100644 prison-spigot-alt/src/main/resources/plugin.yml diff --git a/build.gradle b/build.gradle index 2e940621c..92b62bc51 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,36 @@ import java.text.SimpleDateFormat import java.util.Date -apply plugin: 'java' + +//apply plugin: 'com.github.johnrengelman.shadow' +//apply plugin: 'java' + + +buildscript { + + repositories { + mavenCentral() + gradlePluginPortal() + + } + + dependencies { + classpath 'com.github.johnrengelman:shadow:8.1.1' + } + +} + +plugins { + + id 'java' + id 'base' + id 'com.github.johnrengelman.shadow' version '8.1.1' +} + + +base { + archivesName = 'Prison' +} compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" @@ -27,6 +56,8 @@ ext.targetArchiveClassifier = 'Java1.8' //ext.targetArchiveClassifier = 'Java16' + + // Lists all versions of java that are available to the toolchain // $ ./gradlew -q javaToolchains @@ -85,29 +116,18 @@ Example: The spigot build artifact is: ========================================================================== """ -buildscript { - - repositories { - mavenCentral() - - maven { url "https://plugins.gradle.org/m2/" } - } - - dependencies { - classpath 'com.github.jengelman.gradle.plugins:shadow:6.1.0' - } -} subprojects { + apply plugin: 'java' + apply plugin: 'com.github.johnrengelman.shadow' // apply plugin: 'maven' // apply plugin: 'maven-publish' - apply plugin: 'com.github.johnrengelman.shadow' - archivesBaseName = 'Prison' +// archivesBaseName = 'Prison' group = 'tech.mcprison.prison' @@ -121,12 +141,12 @@ subprojects { mavenCentral() // maven { url "https://maven.sk89q.com/repo/" } - maven { - url "https://mvnrepository.com/artifact/org.apache.commons/commons-lang3" - content { - includeGroup 'org.apache.commons' - } - } + //maven { + //url "https://mvnrepository.com/artifact/org.apache.commons/commons-lang3" + //content { + // includeGroup 'org.apache.commons' + //} + //} maven { url "https://mvnrepository.com/artifact" diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index a0131e345..872a6d87f 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -16,6 +16,17 @@ These change logs represent the work that has been going on within prison. # 3.3.0-alpha.17a 2024-05-18 +* **Upgraded John Rengelman's shadow, a gradle plugin, from v6.1.0 to v8.1.1** + + + +* **Upgrade gradle from v7.6.4 to v8.7** + Upgraded from: v7.6.4 -> v8.0 -> v8.0.2 -> v8.1 -> v8.1.1 + -> v8.2 -> v8.3 -> v8.4 -> v8.5 -> v8.6 -> v8.7 + v8.3 required a configuration change due to `org.gradle.api.plugins.BasePluginConvention` type has been deprecated and will be removed in gradle v9.x. This is impacting the use of the `build.gradle`'s `archivesBaseNamme`. This is being replaced by the new `base{}` configuration block. + v8.3 also required other config changes. + + * **Upgrade spiget from v1.4.2 to v1.4.6** Was using a jar with v1.4.2 due to their repo going down frequently. @@ -24,8 +35,9 @@ These change logs represent the work that has been going on within prison. * **Upgrade gradle from v7.3.3 to v7.6.4** Upgraded from: v7.3.3 -> v7.4 -> v7.4.1 -> v7.4.2 - -> v7.5 -> v7.5.1 -> v7.6 -> v7.6.1 -> v7.6.2 -> v7.6.3 -> v7.6.4\ + -> v7.5 -> v7.5.1 -> v7.6 -> v7.6.1 -> v7.6.2 -> v7.6.3 -> v7.6.4 Preparing for Gradle v8.x + Around v7.5.1 required a change to auto provisioning **v3.3.0-alpha.17a 2024-04-29** diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index afba109285af78dbd2a1d187e33ac4f87c76e392..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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

NnX)EH+Nua)3Y(c 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�Zy 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5c00f617e..e7646dead 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d6..1aa94a426 100644 --- a/gradlew +++ b/gradlew @@ -83,10 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f1..25da30dbd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/prison-core/build.gradle b/prison-core/build.gradle index d7aee16cf..014640fd0 100644 --- a/prison-core/build.gradle +++ b/prison-core/build.gradle @@ -17,7 +17,7 @@ */ apply plugin: 'eclipse' -apply plugin: 'idea' +//apply plugin: 'idea' apply plugin: 'java' compileJava.options.encoding = 'UTF-8' @@ -39,8 +39,9 @@ dependencies { //implementation 'org.json:json:20230227' implementation fileTree(dir: 'lib', - include: ['PrivateBin-java-1.1-SNAPSHOT.jar', - 'json-20230227.jar']) + include: ['PrivateBin-java-1.1-SNAPSHOT.jar' + // , 'json-20230227.jar' + ]) } @@ -57,18 +58,21 @@ shadowJar { include(dependency('org.apache.commons:commons-lang3:3.12.0')) // https://mvnrepository.com/artifact/com.google.code.gson/gson - include(dependency('com.google.code.gson:gson:2.10.1')) + include(dependency('com.google.code.gson:gson:')) //include(dependency('com.google.code.gson:gson:2.8.6')) - include(dependency('org.json:json:20230227')) - include(dependency('com.github.InstantlyMoist:privatebin-java-api:*')) + //include(dependency('org.json:json:20230227')) + + include(dependency('com.github.InstantlyMoist:privatebin-java-api:')) } - relocate 'org.json', 'tech.mcprison.prison.orgjson' - relocate 'com.github.InstantlyMoist', 'tech.mcprison.prison.privatebin8' + //relocate 'org.json', 'tech.mcprison.prison.libs.orgjson' + + // For privatebin wrapper: Paste: + relocate 'nl.kyllian', 'tech.mcprison.prison.libs.privatebin' - classifier 'API' + //classifier 'API' archiveVersion = null } diff --git a/prison-core/lib/json-20230227.jar b/prison-core/lib/oldStuff/json-20230227.jar similarity index 100% rename from prison-core/lib/json-20230227.jar rename to prison-core/lib/oldStuff/json-20230227.jar diff --git a/prison-sellall/build.gradle b/prison-sellall/build.gradle index 3b895b999..c0b6b76f8 100644 --- a/prison-sellall/build.gradle +++ b/prison-sellall/build.gradle @@ -19,7 +19,7 @@ group 'tech.mcprison' apply plugin: 'eclipse' -apply plugin: 'idea' +//apply plugin: 'idea' apply plugin: 'java' compileJava.options.encoding = 'UTF-8' @@ -62,7 +62,7 @@ shadowJar { // include(dependency('org.apache.commons:commons-lang3:3.12.0')) // include(dependency('com.google.code.gson:gson:2.8.6')) } - classifier 'API' + //classifier 'API' archiveVersion = null } diff --git a/prison-spigot-alt/build.gradle b/prison-spigot-alt/build.gradle new file mode 100644 index 000000000..255458369 --- /dev/null +++ b/prison-spigot-alt/build.gradle @@ -0,0 +1,314 @@ +/* + * Prison is a Minecraft plugin for the prison game mode. + * Copyright (C) 2017 The Prison Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +group 'tech.mcprison' + +apply plugin: 'java' + +compileJava.options.encoding = 'UTF-8' +compileTestJava.options.encoding = "UTF-8" + + +// NOTE: The sourceCompatibility will be removed in gradle v9.x. +// Not going to worry about this, since this sub-proect is not being used. +// More info: +// https://docs.gradle.org/8.3/userguide/upgrading_version_8.html#java_convention_deprecation +//sourceCompatibility = 17 + +repositories { + mavenCentral() + + // net.luckperm.api: + maven { url = "https://hub.spigotmc.org/nexus/content/groups/public" } + + // The following houses many repos, so don't limit to just luckperms: + // net.milkbowl, be.maximvdw, org.bstats:bstats-bukkit + maven { url = "https://repo.lucko.me/" } + + maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { url = "https://nexus.hc.to/content/repositories/pub_releases" } + + maven { url = "https://repo.codemc.org/repository/maven-public/" } + //maven { url = "https://repo.inventivetalent.org/content/groups/public/" } + + +// NOTE: mvdw support has been removed from prison since PAPI works with it: +// maven { +// url = "https://repo.mvdw-software.be/content/groups/public/" +// content { +// includeGroup 'be.maximvdw' +// } +// } + maven { + url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' + content { + includeGroup 'me.clip' + } + } + maven { url = "https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/" } + + + maven { + url = 'https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries' + content { + includeGroup 'com.github.cryptomorin' + } + } + + + maven { + name = "CodeMC" + url = uri("https://repo.codemc.io/repository/maven-public/") +// url = 'https://repo.codemc.io/service/rest/repository/browse/maven-public/de/tr7zw/item-nbt-api-plugin' +// url = 'https://mvnrepository.com/artifact/de.tr7zw/item-nbt-api-plugin' + content { + includeGroup 'de.tr7zw' + } + } + + + maven { url 'https://jitpack.io' } + + + // maven { url = 'https://repo.pcgamingfreaks.at/repository/maven-everything' } + // maven { url = 'https://maven.enginehub.org/repo/' } + // maven { url = "https://nexus.badbones69.com/repository/maven-releases/" } + +} + + + +dependencies { + implementation project(':prison-core') + implementation project(':prison-mines') + implementation project(':prison-ranks') + implementation project(':prison-sellall') + implementation project(':prison-spigot') + + // implementation project(':prison-worldguard6') + + + // https://mvnrepository.com/artifact/org.bstats/bstats-base + // https://mvnrepository.com/artifact/org.bstats/bstats-bukkit +// implementation 'org.bstats:bstats-base:3.0.2' +// implementation 'org.bstats:bstats-bukkit:3.0.2' +// implementation 'org.bstats:bstats-base:2.2.1' +// implementation 'org.bstats:bstats-bukkit:2.2.1' + + + // Repo keeps going down: + //implementation 'org.inventivetalent.spiget-update:bukkit:1.4.2-SNAPSHOT' + // Using jar instead: lib/Spiget_v1.4.2.prison-build.jar + + + // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 +// implementation 'org.apache.commons:commons-lang3:3.12.0' + + + +/* + // https://mvnrepository.com/artifact/com.sk89q.worldedit/worldedit-core + implementation 'com.sk89q.worldedit:worldedit-core:7.2.15' + + // https://mvnrepository.com/artifact/com.sk89q.worldedit/worldedit-bukkit + compileOnly 'com.sk89q.worldedit:worldedit-bukkit:7.2.15' + + + // https://mvnrepository.com/artifact/com.sk89q.worldguard/worldguard-core + compileOnly 'com.sk89q.worldguard:worldguard-core:7.0.8' + + // https://mvnrepository.com/artifact/com.sk89q.worldguard/worldguard-bukkit + compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.8' + + // https://mvnrepository.com/artifact/com.sk89q.worldguard.worldguard-libs/core + implementation 'com.sk89q.worldguard.worldguard-libs:core:7.0.8' +*/ + + + + +// compileOnly 'me.clip:placeholderapi:2.11.5' + //compileOnly 'me.clip:placeholderapi:2.11.2' + //compileOnly 'me.clip:placeholderapi:2.10.9' + + // Repo may be hosted: https://hub.spigotmc.org/nexus/content/groups/public/ + // But do not see v5.0 +// compileOnly 'net.luckperms:api:5.0' + + // https://mvnrepository.com/artifact/me.lucko.luckperms/luckperms-api +// compileOnly 'me.lucko.luckperms:luckperms-api:4.4' + + + + // https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries +// implementation 'com.github.cryptomorin:XSeries:9.10.0' + + + +// This includes 535KB when all we need is 1 class! +// implementation 'me.badbones69:crazyenchantments-plugin:1.8-Dev-Build-v8' + + + // 1.9.4-R0.1-SNAPSHOT has been the version used for a long time: +// compileOnly 'org.spigotmc:spigot-api:1.9.4-R0.1-SNAPSHOT' + // 1.12.2-R0.1-SNAPSHOT works well: +// compileOnly 'org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT' + // 1.13.2 fails since deprecated functions have been removed. +// compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' + + + +// NOTE: The repo is no longer resolving to the correct resources: +// compileOnly 'at.pcgamingfreaks:Minepacks-API:2.3.22' +// compileOnly 'at.pcgamingfreaks:Minepacks-API:2.3.21.3' + + + // https://mvnrepository.com/artifact/com.github.MilkBowl/VaultAPI +// compileOnly 'com.github.MilkBowl:VaultAPI:1.7.1' + +// compileOnly('be.maximvdw:MVdWPlaceholderAPI:2.5.2-SNAPSHOT'){ +// exclude group: 'org.spigotmc' +// } + + // compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.1' + + + // NOTE: mavenrepository.com is not the offical repo. + // NOTE: This item-nbt MUST use the API and not the plugin version! + // Good: https://repo.codemc.io/service/rest/repository/browse/maven-public/de/tr7zw/item-nbt-api/ + // Bad?: https://repo.codemc.io/service/rest/repository/browse/maven-public/de/tr7zw/item-nbt-api-plugin/2.11.3/ + // NOTE: This maven repo was failing to be accessable during online builds. So added to the /lib. + // https://github.com/tr7zw/Item-NBT-API/wiki/Using-Gradle + // https://www.spigotmc.org/resources/nbt-api.7939/ + // https://mvnrepository.com/artifact/de.tr7zw/item-nbt-api-plugin +// implementation 'de.tr7zw:item-nbt-api:2.12.2' +// implementation 'de.tr7zw:item-nbt-api:2.12.0' + + + // https://github.com/LoneDev6/API-ItemsAdder#-packages + // https://github.com/LoneDev6/API-ItemsAdder/tags +// compileOnly 'com.github.LoneDev6:API-ItemsAdder:3.5.0b' +// compileOnly 'com.github.LoneDev6:API-ItemsAdder:3.2.5' + + + + compileOnly fileTree(dir: 'lib', include: ['*.jar'], + exclude: ['Spiget_v1.4.2.prison-build.jar', + // 'CrazyEnchantments-plugin-api.v1.8-Dev-Build-v8.jar', + 'Zenchantments__API_v1.15.2.build4.jar']) + implementation fileTree(dir: 'lib', + include: ['Spiget_v1.4.2.prison-build.jar', + // 'CrazyEnchantments-plugin-api.v1.8-Dev-Build-v8.jar', + 'Zenchantments__API_v1.15.2.build4.jar']) + + +// compile fileTree(dir: 'lib', include: ['SPIGET__BUKKIT-1.4.2-SNAPSHOT.jar']) + +// compileOnly fileTree(dir: 'lib', include: ['*.jar'], exclude: ['TokenEnchantAPI-15.5.0.jar']) +// compile fileTree(dir: 'lib', include: ['TokenEnchantAPI-18.5.0.jar']) + + + + testImplementation group: 'junit', name: 'junit', version: '4.12' + +} + +/* +clean { + delete "${rootProject.name}.jar" +} +*/ + +processResources { + from(sourceSets.main.resources.srcDirs) { + expand 'version': project.version + include 'plugin.yml' + } + + from(sourceSets.main.resources.srcDirs) { + exclude 'plugin.yml' + } + + // Need to have includ duplicates for the version to be updated in the plugin.yml file. + // Also the final build is actually smaller with include. + duplicatesStrategy = DuplicatesStrategy.INCLUDE // allow duplicates +// duplicatesStrategy = DuplicatesStrategy.EXCLUDE // do not allow duplicates +} + +shadowJar { + dependsOn(project(':prison-spigot').shadowJar) + + dependencies { + // include(dependency('org.apache.commons:commons-lang3:')) + + // https://mvnrepository.com/artifact/com.google.code.gson/gson +// include(dependency('com.google.code.gson:gson:')) + + + // include(dependency('org.bstats:bstats-base:')) + // include(dependency('org.bstats:bstats-bukkit:')) + + +// include(dependency('me.clip:placeholderapi:')) + + // https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries +// include(dependency('com.github.cryptomorin:XSeries:')) + + + // https://mvnrepository.com/artifact/de.tr7zw/item-nbt-api-plugin +// include(dependency('de.tr7zw:item-nbt-api:')) + + + //include(dependency('org.inventivetalent.spiget-update:bukkit:1.4.2-SNAPSHOT')) + //include(dependency('me.badbones69:crazyenchantments-plugin:1.8-Dev-Build-v8')) + +// include(project(':prison-core')) +// include(project(':prison-mines')) +// include(project(':prison-ranks')) +// include(project(':prison-sellall')) +// include(project(':prison-spigot')) + } + + + + + + relocate 'tech.mcprison.prison', 'tech.mcprison.prison.alt' + + relocate 'org.bstats', 'tech.mcprison.prison.alt.bstats' + + relocate 'org.inventivetalent.update.spiget', 'tech.mcprison.prison.alt.spiget' + relocate 'com.cryptomorin', 'tech.mcprison.prison.alt.cryptomorin' + + relocate 'de.tr7zw.changeme.nbtapi', 'tech.mcprison.prison.alt.nbtapi' + relocate 'de.tr7zw.nbtapi', 'tech.mcprison.prison.alt.nbtapi' + + //relocate 'me.badbones69.crazyenchantments.api.events.BlastUseEvent', 'tech.mcprison.prison.alt.crazyenchantments.api' + + + archiveAppendix = 'alt' + archiveClassifier = '' +// archiveClassifier = project.property('targetArchiveClassifier') +// archiveClassifier = 'java1.8' + + +// minimize() +} + + +build.dependsOn(shadowJar) diff --git a/prison-spigot-alt/src/main/resources/plugin.yml b/prison-spigot-alt/src/main/resources/plugin.yml new file mode 100644 index 000000000..a24af7f6b --- /dev/null +++ b/prison-spigot-alt/src/main/resources/plugin.yml @@ -0,0 +1,58 @@ +--- +name: PrisonAlt +prefix: PrisonAlt +description: This is an alt build of Prison. +website: https://prison.jar-mc.com +version: ${version} +# Older versions than 1.13 will ignore this, but this will allow 1.13 and up to use newer block types? +api-version: 1.13 +api: v1.13 +main: tech.mcprison.prison.alt.spigot.SpigotPrison +author: RoyalBlueRanger +authors: + - RoyalBlueRanger + - AnonymousGCA (GABRYCA) + - Madog24 + - SirFaizdat (creator) + - Perksey + - Norbik1004 + - ValdemarF + - Camouflage100 + - GladiatorMC +softdepend: + - Prison + - Essentials + - EssentialsX + - Vault + - ProtocolLib + - LuckPerms + - WorldEdit + - WorldGuard + - Multiverse-Core + - Multiworld + - MVdWPlaceholderAPI + - PlaceholderAPI + - Multiverse + - FastAsyncWorldEdit + - PermissionsEx + - GroupManagerX + - GemsEconomy + - TokenEnchant + - CMI + - CMILib + - CMIEInjector + - CMIPaperLib + - Economy_CMI + - mcMMO + - PlotSquared + - AnimatedScoreboard + - ViaRewind + - Citizens + - OldCombatMMechanics + - ShopGUIPlus + - EliteMobs + - CombatLogX + - ExaltedEconomy + - CoinsEngineEconomy + - SaneEconomy + - EdPrison diff --git a/prison-spigot/build.gradle b/prison-spigot/build.gradle index d0f5d6bfb..f52a3dc50 100644 --- a/prison-spigot/build.gradle +++ b/prison-spigot/build.gradle @@ -16,9 +16,19 @@ * along with this program. If not, see . */ -group 'tech.mcprison' -apply plugin: 'java' +plugins { + id 'java' + id 'base' +} + +//apply plugin: 'java' + +base { + archivesName = 'Prison' +} + +group 'tech.mcprison' compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" From 80c9858c7e233fb2d1f6453f6168a1451676bfd9 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Sat, 18 May 2024 18:37:34 -0400 Subject: [PATCH 05/15] Spiget: Updated the way prison handles spiget by now submitting a task with a 5 second delay. This also moves it out of the SpigotPrison class. --- docs/changelog_v3.3.x.md | 6 ++ .../mcprison/prison/spigot/SpigotPrison.java | 58 ++++++++------- .../spiget/PrisonSpigetUpdateCallback.java | 50 +++++++++++++ .../spiget/PrisonSpigetUpdateCheckTask.java | 74 +++++++++++++++++++ 4 files changed, 162 insertions(+), 26 deletions(-) create mode 100644 prison-spigot/src/main/java/tech/mcprison/prison/spigot/spiget/PrisonSpigetUpdateCallback.java create mode 100644 prison-spigot/src/main/java/tech/mcprison/prison/spigot/spiget/PrisonSpigetUpdateCheckTask.java diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 872a6d87f..10d4a18bc 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -16,6 +16,12 @@ These change logs represent the work that has been going on within prison. # 3.3.0-alpha.17a 2024-05-18 + +* **Spiget: Updated the way prison handles spiget by now submitting a task with a 5 second delay.** +The messages are more helpful now. +This also moves it out of the SpigotPrison class. + + * **Upgraded John Rengelman's shadow, a gradle plugin, from v6.1.0 to v8.1.1** diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/SpigotPrison.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/SpigotPrison.java index 718717da2..d9710006d 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/SpigotPrison.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/SpigotPrison.java @@ -33,14 +33,11 @@ import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; -import org.inventivetalent.update.spiget.SpigetUpdate; -import org.inventivetalent.update.spiget.UpdateCallback; import tech.mcprison.prison.Prison; import tech.mcprison.prison.PrisonAPI; import tech.mcprison.prison.PrisonCommand; import tech.mcprison.prison.PrisonCommand.RegisteredPluginsData; -import tech.mcprison.prison.alerts.Alerts; import tech.mcprison.prison.autofeatures.AutoFeaturesWrapper; import tech.mcprison.prison.backups.PrisonBackups; import tech.mcprison.prison.integration.Integration; @@ -95,7 +92,7 @@ import tech.mcprison.prison.spigot.placeholder.PlaceHolderAPIIntegration; import tech.mcprison.prison.spigot.sellall.SellAllUtil; import tech.mcprison.prison.spigot.slime.SlimeBlockFunEventListener; -import tech.mcprison.prison.spigot.spiget.BluesSpigetSemVerComparator; +import tech.mcprison.prison.spigot.spiget.PrisonSpigetUpdateCheckTask; import tech.mcprison.prison.spigot.tasks.PrisonInitialStartupTask; import tech.mcprison.prison.spigot.tasks.SpigotPrisonDelayedStartupTask; import tech.mcprison.prison.spigot.utils.PrisonUtilsMineBombs; @@ -889,35 +886,44 @@ public static String stripColor(String format){ /** * Checks to see if there is a newer version of prison that has been released. * It checks based upon what is deployed to spigotmc.org. + * + * This submits a task that will check for updates about 5 seconds + * after prison starts up. */ private void initUpdater() { if (!getConfig().getBoolean("check-updates")) { return; // Don't check if they don't want it } -// String currentVersion = getDescription().getVersion(); - - SpigetUpdate updater = new SpigetUpdate(this, Prison.SPIGOTMC_ORG_PROJECT_ID); -// SpigetUpdate updater = new SpigetUpdate(this, 1223); + PrisonSpigetUpdateCheckTask updateCheck = new PrisonSpigetUpdateCheckTask(); + updateCheck.submit(); - BluesSpigetSemVerComparator aRealSemVerComparator = new BluesSpigetSemVerComparator(); - updater.setVersionComparator( aRealSemVerComparator ); -// updater.setVersionComparator(VersionComparator.EQUAL); - - updater.checkForUpdate(new UpdateCallback() { - @Override - public void updateAvailable(String newVersion, String downloadUrl, - boolean hasDirectDownload) { - Alerts.getInstance().sendAlert( - "&3%s is now available. &7Go to the &lSpigot&r&7 page to download the latest release with new features and fixes :)", - newVersion); - } - - @Override - public void upToDate() { - // Plugin is up-to-date - } - }); +//// String currentVersion = getDescription().getVersion(); +// +// SpigetUpdate updater = new SpigetUpdate(this, Prison.SPIGOTMC_ORG_PROJECT_ID); +//// SpigetUpdate updater = new SpigetUpdate(this, 1223); +// +// +// BluesSpigetSemVerComparator aRealSemVerComparator = new BluesSpigetSemVerComparator(); +// updater.setVersionComparator( aRealSemVerComparator ); +//// updater.setVersionComparator(VersionComparator.EQUAL); +// +// updater.checkForUpdate( new PrisonSpigetUpdateCallback() ); +// +//// updater.checkForUpdate(new UpdateCallback() { +//// @Override +//// public void updateAvailable(String newVersion, String downloadUrl, +//// boolean hasDirectDownload) { +//// Alerts.getInstance().sendAlert( +//// "&3%s is now available. &7Go to the &lSpigot&r&7 page to download the latest release with new features and fixes :)", +//// newVersion); +//// } +//// +//// @Override +//// public void upToDate() { +//// // Plugin is up-to-date +//// } +//// }); } private void initDataDir() { diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/spiget/PrisonSpigetUpdateCallback.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/spiget/PrisonSpigetUpdateCallback.java new file mode 100644 index 000000000..65e92f740 --- /dev/null +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/spiget/PrisonSpigetUpdateCallback.java @@ -0,0 +1,50 @@ +package tech.mcprison.prison.spigot.spiget; + +import tech.mcprison.prison.Prison; +import tech.mcprison.prison.alerts.Alerts; +import tech.mcprison.prison.output.Output; + +public class PrisonSpigetUpdateCallback + implements org.inventivetalent.update.spiget.UpdateCallback { + + @Override + public void upToDate() { + + String currentVersion = Prison.get().getPlatform().getPluginVersion(); + + String msg = String.format( + "&dPrison is up to date! " + + "&bCurrent version: &6%s. " + + "&7Visit our discord server to get help and find " + + "pre-release versions. ", + currentVersion + ); + + Output.get().logInfo( msg ); + + + } + + @Override + public void updateAvailable(String newVersion, String downloadUrl, + boolean hasDirectDownload ) { + + String currentVersion = Prison.get().getPlatform().getPluginVersion(); + + String msg = String.format( + "&dA new version of Prison is now available! " + + "&bCurrent version: &6%s &bNew Version: &6%s&b. " + + "&7Go to &lSpigotmc.org&r&7 to download the " + + "latest release with new features and fixes. :)", + currentVersion, + newVersion, + downloadUrl + ); + + Output.get().logInfo( msg ); + + Alerts.getInstance().sendAlert( msg ); + + } + +} diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/spiget/PrisonSpigetUpdateCheckTask.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/spiget/PrisonSpigetUpdateCheckTask.java new file mode 100644 index 000000000..d53812af4 --- /dev/null +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/spiget/PrisonSpigetUpdateCheckTask.java @@ -0,0 +1,74 @@ +package tech.mcprison.prison.spigot.spiget; + +import org.inventivetalent.update.spiget.SpigetUpdate; + +import tech.mcprison.prison.Prison; +import tech.mcprison.prison.spigot.SpigotPrison; +import tech.mcprison.prison.tasks.PrisonRunnable; +import tech.mcprison.prison.tasks.PrisonTaskSubmitter; + +public class PrisonSpigetUpdateCheckTask + implements PrisonRunnable { + + private long delayTicks = 5 * 20; // 5 seconds + + private int taskId = 0; + + + public PrisonSpigetUpdateCheckTask() { + super(); + } + + public void submit() { + + taskId = PrisonTaskSubmitter.runTaskLater(this, delayTicks ); + } + + @Override + public void run() { + + SpigotPrison plugin = SpigotPrison.getInstance(); + + SpigetUpdate updater = new SpigetUpdate( plugin, Prison.SPIGOTMC_ORG_PROJECT_ID); +// SpigetUpdate updater = new SpigetUpdate(this, 1223); + + + BluesSpigetSemVerComparator aRealSemVerComparator = new BluesSpigetSemVerComparator(); + updater.setVersionComparator( aRealSemVerComparator ); +// updater.setVersionComparator(VersionComparator.EQUAL); + + updater.checkForUpdate( new PrisonSpigetUpdateCallback() ); + + +// updater.checkForUpdate(new UpdateCallback() { +// @Override +// public void updateAvailable(String newVersion, String downloadUrl, +// boolean hasDirectDownload) { +// Alerts.getInstance().sendAlert( +// "&3%s is now available. &7Go to the &lSpigot&r&7 page to download the latest release with new features and fixes :)", +// newVersion); +// } +// +// @Override +// public void upToDate() { +// // Plugin is up-to-date +// } +// }); + + } + + public long getDelayTicks() { + return delayTicks; + } + public void setDelayTicks(long delayTicks) { + this.delayTicks = delayTicks; + } + + public int getTaskId() { + return taskId; + } + public void setTaskId(int taskId) { + this.taskId = taskId; + } + +} From 0a927791e7546ad3a1a8367b5dbc7c5c5c267c86 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Sun, 19 May 2024 02:44:15 -0400 Subject: [PATCH 06/15] Gradle: Updated the gradle config to enable the use of the new dependencyResolutionManagement with use of the .toml file to contain all of the references and versions. This allows the single point of defining and declaring the versions, plus it allows for bundling of libraries to simplify the libs references in the sub-projects. Keeping old commented out settings in this commit, and will clean it up in a future commit. Want to keep it for future comparisons to help troubleshoot if needed. --- build.gradle | 23 +++++++-- gradle/libs.versions.toml | 89 +++++++++++++++++++++++++++++++++ prison-core/build.gradle | 15 +++++- prison-mines/build.gradle | 6 +-- prison-misc/build.gradle | 7 ++- prison-ranks/build.gradle | 2 + prison-sellall/build.gradle | 3 +- prison-spigot/build.gradle | 98 +++++++++++++++++++++++++------------ settings.gradle | 50 +++++++++++++++++++ 9 files changed, 251 insertions(+), 42 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/build.gradle b/build.gradle index 92b62bc51..007fdfd39 100644 --- a/build.gradle +++ b/build.gradle @@ -41,6 +41,8 @@ plugins { id 'java' id 'base' + +// alias(libs.plugins.shadow) id 'com.github.johnrengelman.shadow' version '8.1.1' } @@ -161,18 +163,31 @@ subprojects { } dependencies { - implementation 'org.apache.commons:commons-lang3:3.12.0' + + implementation( libs.commons.lang3 ) + + implementation( libs.gson ) + implementation( libs.guava ) + + //implementation( libs.spiget ) + + //implementation( libs.bundles.bstats ) + + testImplementation( libs.junit ) + + + //implementation 'org.apache.commons:commons-lang3:3.12.0' // https://mvnrepository.com/artifact/com.google.guava/guava - implementation 'com.google.guava:guava:31.1-jre' + //implementation 'com.google.guava:guava:31.1-jre' //implementation 'com.google.guava:guava:19.0' // https://mvnrepository.com/artifact/com.google.code.gson/gson - implementation 'com.google.code.gson:gson:2.10.1' + //implementation 'com.google.code.gson:gson:2.10.1' //include(dependency('com.google.code.gson:gson:2.8.6')) - testImplementation 'junit:junit:4.12' + //testImplementation 'junit:junit:4.12' } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..a97b63cc5 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,89 @@ +# This file was generated by the Gradle 'init' task. +# +# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format +# + +# For Gradle v2.0 Java 8: Shadow v? +# For Gradle v5.0 Java 11: Shadow v5.0 +# For Gradle v7.3 Java 17: Shadow v7.1.2 Groovy: def v3.0.9 +# For Gradle v8.5: Java 21: Shadow v8.x Groovy: def v3.0.17 + + +# https://mvnrepository.com/artifact/com.google.code.gson/gson +# https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 +# https://mvnrepository.com/artifact/com.google.guava/guava +# +# Note: papi has two possible URLs: The second one is the offical but the repo does not work well. +# com.github.placeholderapi:placeholderapi +# me.clip:placeholderapi +# +# + + +[versions] +shadow = "8.1.1" + +bstats = "3.0.2" +commons-lang3 = "3.12.0" +groovy = "3.0.9" +gson = "2.10.1" +spiget = "1.4.6-SNAPSHOT" +xseries = "9.10.0" +junit = "4.12" +guava = "31.1-jre" +spigotApi = "1.13.2-R0.1-SNAPSHOT" + +nbtApi = "2.12.2" +papi = "2.11.5" +vault = "1.7.1" + +luckperms-v4 = "4.4" +luckperms-v5 = "5.0" + + +[libraries] +bstats-base = { module = "org.bstats:bstats-base", version.ref = "bstats" } +bstats-bucket = { module = "org.bstats:bstats-bukkit", version.ref = "bstats" } + +commons-lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "commons-lang3" } + +gson = { module = "com.google.code.gson:gson", version.ref = "gson" } +guava = { module = "com.google.guava:guava", version.ref = "guava" } + +junit = { module = "junit:junit", version.ref = "junit" } + +nbtApi = { module = "de.tr7zw:item-nbt-api", version.ref = "nbtApi" } + +papi = { module = "com.github.placeholderapi:placeholderapi", version.ref = "papi" } +#papi = { module = "me.clip:placeholderapi", version.ref = "papi" } + +luckperms-v4 = { module = "me.lucko.luckperms:luckperms-api", version.ref = "luckperms-v4" } +luckperms-v5 = { module = "net.luckperms:api", version.ref = "luckperms-v5" } + +spiget = { module = "org.inventivetalent.spiget-update:bukkit", version.ref = "spiget" } + +spigotApi = { module = "org.spigotmc:spigot-api", version.ref = "spigotApi" } + + +vault = { module = "com.github.MilkBowl:VaultAPI", version.ref = "vault" } +xseries = { module = "com.github.cryptomorin:XSeries", version.ref = "xseries" } + + + +# direct version: +# gson = { module = "com.google.code.gson:gson", version = "2.9.1" } + + + + + + +[plugins] +shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" } + + + + +[bundles] +bstats = ["bstats-base", "bstats-bucket"] + diff --git a/prison-core/build.gradle b/prison-core/build.gradle index 014640fd0..bca2d9e55 100644 --- a/prison-core/build.gradle +++ b/prison-core/build.gradle @@ -23,14 +23,25 @@ apply plugin: 'java' compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" +/* repositories { mavenCentral() //maven { url = "https://jitpack.io" } } +*/ dependencies { - implementation 'org.apache.commons:commons-lang3:3.12.0' + + + implementation( libs.commons.lang3 ) + + implementation( libs.gson ) + + + +// implementation 'org.apache.commons:commons-lang3:3.12.0' +// implementation( libs.bundles.groovy ) // https://github.com/InstantlyMoist/privatebin-java-api @@ -55,7 +66,7 @@ processResources { shadowJar { dependencies { - include(dependency('org.apache.commons:commons-lang3:3.12.0')) + include(dependency('org.apache.commons:commons-lang3:')) // https://mvnrepository.com/artifact/com.google.code.gson/gson include(dependency('com.google.code.gson:gson:')) diff --git a/prison-mines/build.gradle b/prison-mines/build.gradle index 57678c339..036ddb538 100644 --- a/prison-mines/build.gradle +++ b/prison-mines/build.gradle @@ -7,9 +7,9 @@ compileTestJava.options.encoding = "UTF-8" //sourceCompatibility = 1.8 -repositories { - mavenCentral() -} +//repositories { +// mavenCentral() +//} dependencies { implementation project(':prison-core') diff --git a/prison-misc/build.gradle b/prison-misc/build.gradle index 5d17da6d5..6f80c1b10 100644 --- a/prison-misc/build.gradle +++ b/prison-misc/build.gradle @@ -30,7 +30,7 @@ compileTestJava.options.encoding = "UTF-8" repositories { - mavenCentral() + //mavenCentral() maven { @@ -43,6 +43,8 @@ repositories { includeGroup 'org.spigotmc' } } + + /* As Spigot-API depends on the BungeeCord ChatComponent-API, we need to add the Sonatype OSS repository, as Gradle, @@ -75,6 +77,9 @@ dependencies { // implementation project(':prison-sellall') + //compileOnly( libs.spigotApi ) + + // https://mvnrepository.com/artifact/org.jetbrains/annotations implementation 'org.jetbrains:annotations:24.0.1' diff --git a/prison-ranks/build.gradle b/prison-ranks/build.gradle index 57678c339..351635a5e 100644 --- a/prison-ranks/build.gradle +++ b/prison-ranks/build.gradle @@ -7,9 +7,11 @@ compileTestJava.options.encoding = "UTF-8" //sourceCompatibility = 1.8 +/* repositories { mavenCentral() } +*/ dependencies { implementation project(':prison-core') diff --git a/prison-sellall/build.gradle b/prison-sellall/build.gradle index c0b6b76f8..100575dfa 100644 --- a/prison-sellall/build.gradle +++ b/prison-sellall/build.gradle @@ -25,6 +25,7 @@ apply plugin: 'java' compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" +/* repositories { mavenCentral() @@ -38,7 +39,7 @@ repositories { // } } - +*/ dependencies { diff --git a/prison-spigot/build.gradle b/prison-spigot/build.gradle index f52a3dc50..06e41c985 100644 --- a/prison-spigot/build.gradle +++ b/prison-spigot/build.gradle @@ -36,19 +36,28 @@ compileTestJava.options.encoding = "UTF-8" //sourceCompatibility = 1.8 repositories { - mavenCentral() +// mavenCentral() - // net.luckperm.api: + // spigot-api: +/* maven { + url = "https://hub.spigotmc.org/nexus/content/groups/public" + content { + includeGroup 'org.spigotmc' + includeGroup 'org.bukkit' + } + } +*/ + maven { url = "https://hub.spigotmc.org/nexus/content/groups/public" } // The following houses many repos, so don't limit to just luckperms: // net.milkbowl, be.maximvdw, org.bstats:bstats-bukkit - maven { url = "https://repo.lucko.me/" } +// maven { url = "https://repo.lucko.me/" } - maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } - maven { url = "https://nexus.hc.to/content/repositories/pub_releases" } +// maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } +// maven { url = "https://nexus.hc.to/content/repositories/pub_releases" } - maven { url = "https://repo.codemc.org/repository/maven-public/" } +// maven { url = "https://repo.codemc.org/repository/maven-public/" } //maven { url = "https://repo.inventivetalent.org/content/groups/public/" } @@ -59,21 +68,22 @@ repositories { // includeGroup 'be.maximvdw' // } // } - maven { - url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' - content { - includeGroup 'me.clip' - } - } - maven { url = "https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/" } + +// maven { +// url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' +// content { +// includeGroup 'me.clip' +// } +// } +// maven { url = "https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/" } - maven { - url = 'https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries' - content { - includeGroup 'com.github.cryptomorin' - } - } +// maven { +// url = 'https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries' +// content { +// includeGroup 'com.github.cryptomorin' +// } +// } maven { @@ -103,31 +113,54 @@ dependencies { implementation project(':prison-mines') implementation project(':prison-ranks') implementation project(':prison-sellall') + + + implementation( libs.commons.lang3 ) + + implementation( libs.gson ) + + implementation( libs.spiget ) + + implementation( libs.bundles.bstats ) + + + compileOnly( libs.spigotApi ) + + compileOnly( libs.luckperms.v4 ) + compileOnly( libs.luckperms.v5 ) + + compileOnly( libs.papi ) + + compileOnly( libs.vault ) + implementation( libs.xseries ) + + implementation( libs.nbtApi ) + // implementation project(':prison-worldguard6') // https://mvnrepository.com/artifact/org.bstats/bstats-base // https://mvnrepository.com/artifact/org.bstats/bstats-bukkit - implementation 'org.bstats:bstats-base:3.0.2' - implementation 'org.bstats:bstats-bukkit:3.0.2' +// implementation 'org.bstats:bstats-base:3.0.2' +// implementation 'org.bstats:bstats-bukkit:3.0.2' // implementation 'org.bstats:bstats-base:2.2.1' // implementation 'org.bstats:bstats-bukkit:2.2.1' // NOTE: A couple of years ago, their Repo kept going down so switched to use a jar: - implementation 'org.inventivetalent.spiget-update:bukkit:1.4.6-SNAPSHOT' +// implementation 'org.inventivetalent.spiget-update:bukkit:1.4.6-SNAPSHOT' //implementation 'org.inventivetalent.spiget-update:bukkit:1.4.2-SNAPSHOT' // Using jar instead: lib/Spiget_v1.4.2.prison-build.jar // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 - implementation 'org.apache.commons:commons-lang3:3.12.0' + //implementation 'org.apache.commons:commons-lang3:3.12.0' // https://mvnrepository.com/artifact/com.google.code.gson/gson - implementation 'com.google.code.gson:gson:2.10.1' +// implementation 'com.google.code.gson:gson:2.10.1' /* @@ -151,21 +184,21 @@ dependencies { - compileOnly 'me.clip:placeholderapi:2.11.5' +// compileOnly 'me.clip:placeholderapi:2.11.5' //compileOnly 'me.clip:placeholderapi:2.11.2' //compileOnly 'me.clip:placeholderapi:2.10.9' // Repo may be hosted: https://hub.spigotmc.org/nexus/content/groups/public/ // But do not see v5.0 - compileOnly 'net.luckperms:api:5.0' +// compileOnly 'net.luckperms:api:5.0' // https://mvnrepository.com/artifact/me.lucko.luckperms/luckperms-api - compileOnly 'me.lucko.luckperms:luckperms-api:4.4' +// compileOnly 'me.lucko.luckperms:luckperms-api:4.4' // https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries - implementation 'com.github.cryptomorin:XSeries:9.10.0' +// implementation 'com.github.cryptomorin:XSeries:9.10.0' // implementation 'com.github.cryptomorin:XSeries:9.8.0' //implementation 'com.github.cryptomorin:XSeries:9.4.0' //implementation 'com.github.cryptomorin:XSeries:9.2.0' @@ -181,7 +214,7 @@ dependencies { // 1.12.2-R0.1-SNAPSHOT works well: // compileOnly 'org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT' // 1.13.2 fails since deprecated functions have been removed. - compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' +// compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' @@ -191,7 +224,7 @@ dependencies { // https://mvnrepository.com/artifact/com.github.MilkBowl/VaultAPI - compileOnly 'com.github.MilkBowl:VaultAPI:1.7.1' +// compileOnly 'com.github.MilkBowl:VaultAPI:1.7.1' //compileOnly 'net.milkbowl.vault:VaultAPI:1.7.0' // compileOnly('be.maximvdw:MVdWPlaceholderAPI:2.5.2-SNAPSHOT'){ @@ -209,7 +242,7 @@ dependencies { // https://github.com/tr7zw/Item-NBT-API/wiki/Using-Gradle // https://www.spigotmc.org/resources/nbt-api.7939/ // https://mvnrepository.com/artifact/de.tr7zw/item-nbt-api-plugin - implementation 'de.tr7zw:item-nbt-api:2.12.2' +// implementation 'de.tr7zw:item-nbt-api:2.12.2' // implementation 'de.tr7zw:item-nbt-api:2.12.0' // implementation 'de.tr7zw:item-nbt-api-plugin:2.11.2' // implementation 'de.tr7zw:item-nbt-api-plugin:2.10.0' @@ -275,6 +308,9 @@ shadowJar { include(project(':prison-mines')) include(project(':prison-ranks')) include(project(':prison-sellall')) + + + include(dependency('org.apache.commons:commons-lang3:3.12.0')) diff --git a/settings.gradle b/settings.gradle index d4605610e..cc935729b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -29,6 +29,56 @@ plugins { } +// https://docs.gradle.org/current/userguide/platforms.html +// https://docs.gradle.org/current/userguide/declaring_repositories.html#sub:centralized-repository-declaration +dependencyResolutionManagement { + repositories { + mavenCentral() + + // spigot-api: + maven { + url = "https://hub.spigotmc.org/nexus/content/groups/public" + content { + includeGroup 'org.spigotmc' + includeGroup 'org.bukkit' + } + } + + + // The following houses many repos, so don't limit to just luckperms: + // net.milkbowl, be.maximvdw, org.bstats:bstats-bukkit + maven { url = "https://repo.lucko.me/" } + + // ?? libraries: + maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { url = "https://nexus.hc.to/content/repositories/pub_releases" } + + // item-nbt-api: + maven { url = "https://repo.codemc.org/repository/maven-public/" } + + maven { url = "https://repo.inventivetalent.org/content/groups/public/" } + + + maven { url 'https://jitpack.io' } + + + +// maven { +// url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' +// content { +// includeGroup 'me.clip' +// } +// } + + } + + versionCatalogs { + libs { + + } + } +} + rootProject.name = 'prison' include 'prison-core' From 2932bb1929258088fcc35c0a7fc6117615e2f207 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Sun, 19 May 2024 23:39:42 -0400 Subject: [PATCH 07/15] Placeholders: The placeholder api call from PlaceholderAPI is passing a null OfflinePlayer object. Not sure why this has never been an issue before, but added support for null OfflnePlayers. --- docs/changelog_v3.3.x.md | 7 ++++++- .../PlaceHolderAPIIntegrationUppercaseWrapper.java | 2 +- .../placeholder/PlaceHolderAPIIntegrationWrapper.java | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 10d4a18bc..35d958e36 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -14,7 +14,12 @@ These change logs represent the work that has been going on within prison. -# 3.3.0-alpha.17a 2024-05-18 +# 3.3.0-alpha.17a 2024-05-19 + + +* **Placeholders: The placeholder api call from PlaceholderAPI is passing a null OfflinePlayer object.** +Not sure why this has never been an issue before, but added support for null OfflnePlayers. + * **Spiget: Updated the way prison handles spiget by now submitting a task with a 5 second delay.** diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/placeholder/PlaceHolderAPIIntegrationUppercaseWrapper.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/placeholder/PlaceHolderAPIIntegrationUppercaseWrapper.java index 1672ced92..da133e074 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/placeholder/PlaceHolderAPIIntegrationUppercaseWrapper.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/placeholder/PlaceHolderAPIIntegrationUppercaseWrapper.java @@ -82,7 +82,7 @@ public String onRequest(OfflinePlayer player, String identifier) { // identifier = PlaceholderManager.PRISON_PLACEHOLDER_PREFIX_EXTENDED + identifier; // } - UUID playerUuid = player.getUniqueId(); + UUID playerUuid = player == null ? null : player.getUniqueId(); String results = Prison.get().getPlatform().getPlaceholders() .placeholderTranslate( playerUuid, player.getName(), identifier ); diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/placeholder/PlaceHolderAPIIntegrationWrapper.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/placeholder/PlaceHolderAPIIntegrationWrapper.java index ff3b13354..8c3d1a6b4 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/placeholder/PlaceHolderAPIIntegrationWrapper.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/placeholder/PlaceHolderAPIIntegrationWrapper.java @@ -81,7 +81,7 @@ public String onRequest(OfflinePlayer player, String identifier) { // identifier = PlaceholderManager.PRISON_PLACEHOLDER_PREFIX_EXTENDED + identifier; // } - UUID playerUuid = player.getUniqueId(); + UUID playerUuid = player == null ? null : player.getUniqueId(); String results = Prison.get().getPlatform().getPlaceholders() .placeholderTranslate( playerUuid, player.getName(), identifier ); From 37a0123964278fc9fee84ccba060cc3a4d1491ac Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Mon, 20 May 2024 02:22:27 -0400 Subject: [PATCH 08/15] Gradle: A few more adjustments to add a few more items to the libs.versions.toml. --- docs/changelog_v3.3.x.md | 8 +++++++- gradle/libs.versions.toml | 6 ++++++ prison-core/build.gradle | 9 +++++---- prison-core/lib/{oldStuff => }/json-20230227.jar | Bin prison-spigot/build.gradle | 14 +++++++++++++- 5 files changed, 31 insertions(+), 6 deletions(-) rename prison-core/lib/{oldStuff => }/json-20230227.jar (100%) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 35d958e36..e3269309d 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -14,7 +14,13 @@ These change logs represent the work that has been going on within prison. -# 3.3.0-alpha.17a 2024-05-19 +# 3.3.0-alpha.17a 2024-05-20 + + + + +* **Gradle: A few more adjustments to add a few more items to the libs.versions.toml.** + * **Placeholders: The placeholder api call from PlaceholderAPI is passing a null OfflinePlayer object.** diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a97b63cc5..ef07addbc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -40,6 +40,10 @@ vault = "1.7.1" luckperms-v4 = "4.4" luckperms-v5 = "5.0" +itemsAdder = "3.5.0b" + + + [libraries] bstats-base = { module = "org.bstats:bstats-base", version.ref = "bstats" } @@ -60,6 +64,8 @@ papi = { module = "com.github.placeholderapi:placeholderapi", version.ref = "pap luckperms-v4 = { module = "me.lucko.luckperms:luckperms-api", version.ref = "luckperms-v4" } luckperms-v5 = { module = "net.luckperms:api", version.ref = "luckperms-v5" } +itemsAdder = { module = "com.github.LoneDev6:API-ItemsAdder", version.ref = "itemsAdder" } + spiget = { module = "org.inventivetalent.spiget-update:bukkit", version.ref = "spiget" } spigotApi = { module = "org.spigotmc:spigot-api", version.ref = "spigotApi" } diff --git a/prison-core/build.gradle b/prison-core/build.gradle index bca2d9e55..0fc2edb1d 100644 --- a/prison-core/build.gradle +++ b/prison-core/build.gradle @@ -47,11 +47,11 @@ dependencies { // https://github.com/InstantlyMoist/privatebin-java-api //implementation 'com.github.InstantlyMoist:privatebin-java-api:1.0.2' - //implementation 'org.json:json:20230227' + implementation 'org.json:json:20230227' implementation fileTree(dir: 'lib', include: ['PrivateBin-java-1.1-SNAPSHOT.jar' - // , 'json-20230227.jar' + , 'json-20230227.jar' ]) } @@ -77,11 +77,12 @@ shadowJar { include(dependency('com.github.InstantlyMoist:privatebin-java-api:')) } - //relocate 'org.json', 'tech.mcprison.prison.libs.orgjson' - // For privatebin wrapper: Paste: relocate 'nl.kyllian', 'tech.mcprison.prison.libs.privatebin' + // Used with privatebin: + relocate 'org.json', 'tech.mcprison.prison.libs.orgjson' + //classifier 'API' archiveVersion = null diff --git a/prison-core/lib/oldStuff/json-20230227.jar b/prison-core/lib/json-20230227.jar similarity index 100% rename from prison-core/lib/oldStuff/json-20230227.jar rename to prison-core/lib/json-20230227.jar diff --git a/prison-spigot/build.gradle b/prison-spigot/build.gradle index 06e41c985..0b6cdb78b 100644 --- a/prison-spigot/build.gradle +++ b/prison-spigot/build.gradle @@ -136,6 +136,9 @@ dependencies { implementation( libs.nbtApi ) + // https://github.com/LoneDev6/API-ItemsAdder#-packages + // https://github.com/LoneDev6/API-ItemsAdder/tags + compileOnly( libs.itemsAdder ) // implementation project(':prison-worldguard6') @@ -251,7 +254,7 @@ dependencies { // https://github.com/LoneDev6/API-ItemsAdder#-packages // https://github.com/LoneDev6/API-ItemsAdder/tags - compileOnly 'com.github.LoneDev6:API-ItemsAdder:3.5.0b' +// compileOnly 'com.github.LoneDev6:API-ItemsAdder:3.5.0b' // compileOnly 'com.github.LoneDev6:API-ItemsAdder:3.2.5' @@ -355,6 +358,15 @@ shadowJar { relocate 'de.tr7zw.changeme.nbtapi', 'tech.mcprison.prison.libs.nbtapi' // relocate 'de.tr7zw.nbtapi', 'tech.mcprison.prison.nbtapi' + + // For privatebin wrapper: Paste: + relocate 'nl.kyllian', 'tech.mcprison.prison.libs.privatebin' + + // Used with privatebin: + relocate 'org.json', 'tech.mcprison.prison.libs.orgjson' + + + //relocate 'me.badbones69.crazyenchantments.api.events.BlastUseEvent', 'tech.mcprison.prison.crazyenchantments.api' From dc5a8ce2331ce90895de1f6780cb1d7bf881392b Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Mon, 20 May 2024 03:02:46 -0400 Subject: [PATCH 09/15] Gradle: Removed a lot of the older commented out settings. See prior commits to better understand how things were setup before, or for references. --- build.gradle | 29 --------- docs/changelog_v3.3.x.md | 2 + prison-core/build.gradle | 22 ------- prison-mines/build.gradle | 8 +-- prison-misc/build.gradle | 18 ------ prison-ranks/build.gradle | 10 --- prison-sellall/build.gradle | 23 ------- prison-spigot/build.gradle | 121 +----------------------------------- settings.gradle | 6 +- 9 files changed, 9 insertions(+), 230 deletions(-) diff --git a/build.gradle b/build.gradle index 007fdfd39..eca3fcf16 100644 --- a/build.gradle +++ b/build.gradle @@ -19,9 +19,6 @@ import java.text.SimpleDateFormat import java.util.Date -//apply plugin: 'com.github.johnrengelman.shadow' -//apply plugin: 'java' - buildscript { @@ -122,7 +119,6 @@ Example: The spigot build artifact is: subprojects { - apply plugin: 'java' apply plugin: 'com.github.johnrengelman.shadow' // apply plugin: 'maven' @@ -143,18 +139,10 @@ subprojects { mavenCentral() // maven { url "https://maven.sk89q.com/repo/" } - //maven { - //url "https://mvnrepository.com/artifact/org.apache.commons/commons-lang3" - //content { - // includeGroup 'org.apache.commons' - //} - //} maven { url "https://mvnrepository.com/artifact" - } - } @@ -169,25 +157,8 @@ subprojects { implementation( libs.gson ) implementation( libs.guava ) - //implementation( libs.spiget ) - - //implementation( libs.bundles.bstats ) - testImplementation( libs.junit ) - - //implementation 'org.apache.commons:commons-lang3:3.12.0' - - // https://mvnrepository.com/artifact/com.google.guava/guava - //implementation 'com.google.guava:guava:31.1-jre' - - //implementation 'com.google.guava:guava:19.0' - - // https://mvnrepository.com/artifact/com.google.code.gson/gson - //implementation 'com.google.code.gson:gson:2.10.1' - //include(dependency('com.google.code.gson:gson:2.8.6')) - - //testImplementation 'junit:junit:4.12' } } diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index e3269309d..2cbaa2b14 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -17,6 +17,8 @@ These change logs represent the work that has been going on within prison. # 3.3.0-alpha.17a 2024-05-20 +* **Gradle: Removed a lot of the older commented out settings.** +See prior commits to better understand how things were setup before, or for references. * **Gradle: A few more adjustments to add a few more items to the libs.versions.toml.** diff --git a/prison-core/build.gradle b/prison-core/build.gradle index 0fc2edb1d..8deb786e6 100644 --- a/prison-core/build.gradle +++ b/prison-core/build.gradle @@ -16,37 +16,16 @@ * along with this program. If not, see . */ -apply plugin: 'eclipse' -//apply plugin: 'idea' -apply plugin: 'java' compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" -/* -repositories { - mavenCentral() - - //maven { url = "https://jitpack.io" } -} -*/ - dependencies { - implementation( libs.commons.lang3 ) implementation( libs.gson ) - - -// implementation 'org.apache.commons:commons-lang3:3.12.0' -// implementation( libs.bundles.groovy ) - - - // https://github.com/InstantlyMoist/privatebin-java-api - //implementation 'com.github.InstantlyMoist:privatebin-java-api:1.0.2' - implementation 'org.json:json:20230227' implementation fileTree(dir: 'lib', @@ -70,7 +49,6 @@ shadowJar { // https://mvnrepository.com/artifact/com.google.code.gson/gson include(dependency('com.google.code.gson:gson:')) - //include(dependency('com.google.code.gson:gson:2.8.6')) //include(dependency('org.json:json:20230227')) diff --git a/prison-mines/build.gradle b/prison-mines/build.gradle index 036ddb538..5f24da4ac 100644 --- a/prison-mines/build.gradle +++ b/prison-mines/build.gradle @@ -1,16 +1,10 @@ group 'tech.mcprison' -apply plugin: 'java' +//apply plugin: 'java' compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" -//sourceCompatibility = 1.8 - -//repositories { -// mavenCentral() -//} - dependencies { implementation project(':prison-core') testImplementation group: 'junit', name: 'junit', version: '4.12' diff --git a/prison-misc/build.gradle b/prison-misc/build.gradle index 6f80c1b10..f7695a752 100644 --- a/prison-misc/build.gradle +++ b/prison-misc/build.gradle @@ -18,20 +18,10 @@ group 'tech.mcprison' -apply plugin: 'java' - compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" -//sourceCompatibility = 1.8 - - -// https://www.spigotmc.org/wiki/spigot-gradle/ - - repositories { - //mavenCentral() - maven { url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' @@ -77,9 +67,6 @@ dependencies { // implementation project(':prison-sellall') - //compileOnly( libs.spigotApi ) - - // https://mvnrepository.com/artifact/org.jetbrains/annotations implementation 'org.jetbrains:annotations:24.0.1' @@ -87,10 +74,5 @@ dependencies { compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' - testImplementation group: 'junit', name: 'junit', version: '4.12' - } - - - diff --git a/prison-ranks/build.gradle b/prison-ranks/build.gradle index 351635a5e..cc15db280 100644 --- a/prison-ranks/build.gradle +++ b/prison-ranks/build.gradle @@ -1,18 +1,8 @@ group 'tech.mcprison' -apply plugin: 'java' - compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" -//sourceCompatibility = 1.8 - -/* -repositories { - mavenCentral() -} -*/ - dependencies { implementation project(':prison-core') testImplementation group: 'junit', name: 'junit', version: '4.12' diff --git a/prison-sellall/build.gradle b/prison-sellall/build.gradle index 100575dfa..4b47bc2a0 100644 --- a/prison-sellall/build.gradle +++ b/prison-sellall/build.gradle @@ -18,29 +18,10 @@ group 'tech.mcprison' -apply plugin: 'eclipse' -//apply plugin: 'idea' -apply plugin: 'java' compileJava.options.encoding = 'UTF-8' compileTestJava.options.encoding = "UTF-8" -/* -repositories { - mavenCentral() - - maven { url = "https://repo.codemc.org/repository/maven-public/" } - -// maven { -// url = 'https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries' -// content { -// includeGroup 'com.github.cryptomorin' -// } -// } - -} -*/ - dependencies { implementation project(':prison-core') @@ -48,14 +29,11 @@ dependencies { implementation project(':prison-ranks') - // https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries // implementation 'com.github.cryptomorin:XSeries:9.10.0' - testImplementation group: 'junit', name: 'junit', version: '4.12' - } shadowJar { @@ -63,7 +41,6 @@ shadowJar { // include(dependency('org.apache.commons:commons-lang3:3.12.0')) // include(dependency('com.google.code.gson:gson:2.8.6')) } - //classifier 'API' archiveVersion = null } diff --git a/prison-spigot/build.gradle b/prison-spigot/build.gradle index 0b6cdb78b..2a6f8150e 100644 --- a/prison-spigot/build.gradle +++ b/prison-spigot/build.gradle @@ -22,7 +22,6 @@ plugins { id 'base' } -//apply plugin: 'java' base { archivesName = 'Prison' @@ -36,55 +35,9 @@ compileTestJava.options.encoding = "UTF-8" //sourceCompatibility = 1.8 repositories { -// mavenCentral() - - // spigot-api: -/* maven { - url = "https://hub.spigotmc.org/nexus/content/groups/public" - content { - includeGroup 'org.spigotmc' - includeGroup 'org.bukkit' - } - } -*/ maven { url = "https://hub.spigotmc.org/nexus/content/groups/public" } - // The following houses many repos, so don't limit to just luckperms: - // net.milkbowl, be.maximvdw, org.bstats:bstats-bukkit -// maven { url = "https://repo.lucko.me/" } - -// maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } -// maven { url = "https://nexus.hc.to/content/repositories/pub_releases" } - -// maven { url = "https://repo.codemc.org/repository/maven-public/" } - //maven { url = "https://repo.inventivetalent.org/content/groups/public/" } - - -// NOTE: mvdw support has been removed from prison since PAPI works with it: -// maven { -// url = "https://repo.mvdw-software.be/content/groups/public/" -// content { -// includeGroup 'be.maximvdw' -// } -// } - -// maven { -// url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' -// content { -// includeGroup 'me.clip' -// } -// } -// maven { url = "https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/" } - - -// maven { -// url = 'https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries' -// content { -// includeGroup 'com.github.cryptomorin' -// } -// } - maven { name = "CodeMC" @@ -143,27 +96,6 @@ dependencies { // implementation project(':prison-worldguard6') - // https://mvnrepository.com/artifact/org.bstats/bstats-base - // https://mvnrepository.com/artifact/org.bstats/bstats-bukkit -// implementation 'org.bstats:bstats-base:3.0.2' -// implementation 'org.bstats:bstats-bukkit:3.0.2' -// implementation 'org.bstats:bstats-base:2.2.1' -// implementation 'org.bstats:bstats-bukkit:2.2.1' - - - // NOTE: A couple of years ago, their Repo kept going down so switched to use a jar: -// implementation 'org.inventivetalent.spiget-update:bukkit:1.4.6-SNAPSHOT' - //implementation 'org.inventivetalent.spiget-update:bukkit:1.4.2-SNAPSHOT' - // Using jar instead: lib/Spiget_v1.4.2.prison-build.jar - - - - // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 - //implementation 'org.apache.commons:commons-lang3:3.12.0' - - - // https://mvnrepository.com/artifact/com.google.code.gson/gson -// implementation 'com.google.code.gson:gson:2.10.1' /* @@ -185,11 +117,6 @@ dependencies { */ - - -// compileOnly 'me.clip:placeholderapi:2.11.5' - //compileOnly 'me.clip:placeholderapi:2.11.2' - //compileOnly 'me.clip:placeholderapi:2.10.9' // Repo may be hosted: https://hub.spigotmc.org/nexus/content/groups/public/ // But do not see v5.0 @@ -212,13 +139,6 @@ dependencies { // implementation 'me.badbones69:crazyenchantments-plugin:1.8-Dev-Build-v8' - // 1.9.4-R0.1-SNAPSHOT has been the version used for a long time: -// compileOnly 'org.spigotmc:spigot-api:1.9.4-R0.1-SNAPSHOT' - // 1.12.2-R0.1-SNAPSHOT works well: -// compileOnly 'org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT' - // 1.13.2 fails since deprecated functions have been removed. -// compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' - // NOTE: The repo is no longer resolving to the correct resources: @@ -226,16 +146,6 @@ dependencies { // compileOnly 'at.pcgamingfreaks:Minepacks-API:2.3.21.3' - // https://mvnrepository.com/artifact/com.github.MilkBowl/VaultAPI -// compileOnly 'com.github.MilkBowl:VaultAPI:1.7.1' - //compileOnly 'net.milkbowl.vault:VaultAPI:1.7.0' - -// compileOnly('be.maximvdw:MVdWPlaceholderAPI:2.5.2-SNAPSHOT'){ -// exclude group: 'org.spigotmc' -// } - - // compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.1' - // NOTE: mavenrepository.com is not the offical repo. // NOTE: This item-nbt MUST use the API and not the plugin version! @@ -246,17 +156,8 @@ dependencies { // https://www.spigotmc.org/resources/nbt-api.7939/ // https://mvnrepository.com/artifact/de.tr7zw/item-nbt-api-plugin // implementation 'de.tr7zw:item-nbt-api:2.12.2' -// implementation 'de.tr7zw:item-nbt-api:2.12.0' -// implementation 'de.tr7zw:item-nbt-api-plugin:2.11.2' -// implementation 'de.tr7zw:item-nbt-api-plugin:2.10.0' -// implementation 'de.tr7zw:item-nbt-api-plugin:2.9.2' - // https://github.com/LoneDev6/API-ItemsAdder#-packages - // https://github.com/LoneDev6/API-ItemsAdder/tags -// compileOnly 'com.github.LoneDev6:API-ItemsAdder:3.5.0b' -// compileOnly 'com.github.LoneDev6:API-ItemsAdder:3.2.5' - compileOnly fileTree(dir: 'lib', include: ['*.jar'], @@ -272,12 +173,6 @@ dependencies { 'Zenchantments__API_v1.15.2.build4.jar']) -// compile fileTree(dir: 'lib', include: ['SPIGET__BUKKIT-1.4.2-SNAPSHOT.jar']) - -// compileOnly fileTree(dir: 'lib', include: ['*.jar'], exclude: ['TokenEnchantAPI-15.5.0.jar']) -// compile fileTree(dir: 'lib', include: ['TokenEnchantAPI-18.5.0.jar']) - - testImplementation group: 'junit', name: 'junit', version: '4.12' @@ -302,7 +197,7 @@ processResources { // Need to have includ duplicates for the version to be updated in the plugin.yml file. // Also the final build is actually smaller with include. duplicatesStrategy = DuplicatesStrategy.INCLUDE // allow duplicates -// duplicatesStrategy = DuplicatesStrategy.EXCLUDE // do not allow duplicates + //duplicatesStrategy = DuplicatesStrategy.EXCLUDE // do not allow duplicates } shadowJar { @@ -312,25 +207,16 @@ shadowJar { include(project(':prison-ranks')) include(project(':prison-sellall')) - - include(dependency('org.apache.commons:commons-lang3:3.12.0')) // https://mvnrepository.com/artifact/com.google.code.gson/gson include(dependency('com.google.code.gson:gson:')) - //include(dependency('com.google.code.gson:gson:2.8.6')) include(dependency('org.bstats:bstats-base:')) include(dependency('org.bstats:bstats-bukkit:')) -// include(dependency('org.bstats:bstats-base:3.0.2')) -// include(dependency('org.bstats:bstats-bukkit:3.0.2')) -// include(dependency('org.bstats:bstats-base:2.2.1')) -// include(dependency('org.bstats:bstats-bukkit:2.2.1')) //include(dependency('me.clip:placeholderapi:')) - //include(dependency('me.clip:placeholderapi:2.11.2')) - //include(dependency('me.clip:placeholderapi:2.10.9')) // https://mvnrepository.com/artifact/com.github.cryptomorin/XSeries include(dependency('com.github.cryptomorin:XSeries:')) @@ -338,10 +224,10 @@ shadowJar { // https://mvnrepository.com/artifact/de.tr7zw/item-nbt-api-plugin include(dependency('de.tr7zw:item-nbt-api:')) - //include(dependency('de.tr7zw:item-nbt-api-plugin:2.10.0')) include(dependency('org.inventivetalent.spiget-update:bukkit:')) //include(dependency('org.inventivetalent.spiget-update:core:')) + //include(dependency('me.badbones69:crazyenchantments-plugin:1.8-Dev-Build-v8')) } @@ -356,7 +242,6 @@ shadowJar { relocate 'com.cryptomorin', 'tech.mcprison.prison.libs.cryptomorin' relocate 'de.tr7zw.changeme.nbtapi', 'tech.mcprison.prison.libs.nbtapi' -// relocate 'de.tr7zw.nbtapi', 'tech.mcprison.prison.nbtapi' // For privatebin wrapper: Paste: @@ -367,7 +252,7 @@ shadowJar { - //relocate 'me.badbones69.crazyenchantments.api.events.BlastUseEvent', 'tech.mcprison.prison.crazyenchantments.api' + //relocate 'me.badbones69.crazyenchantments.api.events.BlastUseEvent', 'tech.mcprison.prison.libs.crazyenchantments.api' archiveAppendix = '' diff --git a/settings.gradle b/settings.gradle index cc935729b..2a3209af7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -49,9 +49,9 @@ dependencyResolutionManagement { // net.milkbowl, be.maximvdw, org.bstats:bstats-bukkit maven { url = "https://repo.lucko.me/" } - // ?? libraries: - maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } - maven { url = "https://nexus.hc.to/content/repositories/pub_releases" } + // ?? libraries: used in prison-spigot-alt so not needed here: + //maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } + //maven { url = "https://nexus.hc.to/content/repositories/pub_releases" } // item-nbt-api: maven { url = "https://repo.codemc.org/repository/maven-public/" } From 2f8c873c457d057c0cb6d4c2f1231b06315b30ee Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Mon, 20 May 2024 03:59:43 -0400 Subject: [PATCH 10/15] Player Cache: There was a report of a concurrent modification exception. This is very rare and generally should not happen. The keySet is part of the original TreeMap collection, so the fix here is to take all keys and put them in a new collection so they are then disconnected from the original TreeSet. This will prevent a concurrent modification exception if there is an action to add or remove users from the user cache, since the user cache remains active and cannot be locked with a synchronization for any amount of time, other than then smallest possible. The standard solution with dealing with this TreeSet collection would be to synchronize the whole activity of saving the dirty elements of the player cache. Unfortunately, that will cause blocking transactions when player events try to access the player cache. Therefore it's a balance game of trying to protect the player cache with the minimal amount of synchronizations, but allow the least amount of I/O blocking for all other processes that are trying to use it. Hopefully this is sufficient to allow it all to work without conflict, and to be able to provide enough protection. --- docs/changelog_v3.3.x.md | 9 +++++++++ .../cache/PlayerCacheSaveAllPlayersTask.java | 15 ++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 2cbaa2b14..6fd867848 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -17,6 +17,15 @@ These change logs represent the work that has been going on within prison. # 3.3.0-alpha.17a 2024-05-20 + +* **Player Cache: There was a report of a concurrent modification exception.** +This is very rare and generally should not happen. +The keySet is part of the original TreeMap collection, so the fix here is to take all keys and put them in a new collection so they are then disconnected from the original TreeSet. +This will prevent a concurrent modification exception if there is an action to add or remove users from the user cache, since the user cache remains active and cannot be locked with a synchronization for any amount of time, other than then smallest possible. +The standard solution with dealing with this TreeSet collection would be to synchronize the whole activity of saving the dirty elements of the player cache. Unfortunately, that will cause blocking transactions when player events try to access the player cache. Therefore it's a balance game of trying to protect the player cache with the minimal amount of synchronizations, but allow the least amount of I/O blocking for all other processes that are trying to use it. +Hopefully this is sufficient to allow it all to work without conflict, and to be able to provide enough protection. + + * **Gradle: Removed a lot of the older commented out settings.** See prior commits to better understand how things were setup before, or for references. diff --git a/prison-core/src/main/java/tech/mcprison/prison/cache/PlayerCacheSaveAllPlayersTask.java b/prison-core/src/main/java/tech/mcprison/prison/cache/PlayerCacheSaveAllPlayersTask.java index 6f6c0c32e..917540f79 100644 --- a/prison-core/src/main/java/tech/mcprison/prison/cache/PlayerCacheSaveAllPlayersTask.java +++ b/prison-core/src/main/java/tech/mcprison/prison/cache/PlayerCacheSaveAllPlayersTask.java @@ -2,7 +2,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TreeSet; import tech.mcprison.prison.Prison; import tech.mcprison.prison.output.Output; @@ -62,15 +64,18 @@ public void run() PlayerCache.PLAYER_CACHE_TIME_TO_LIVE_VALUE_SEC ); - Set keys = pCache.getPlayers().keySet(); + Map syncMap = pCache.getPlayers(); + + Set keys = new TreeSet<>( syncMap.keySet() ); for ( String key : keys ) { PlayerCachePlayerData playerData = null; - synchronized ( pCache.getPlayers() ) { - - playerData = pCache.getPlayers().get( key ); + synchronized ( syncMap ) { + if ( syncMap.containsKey( key ) ) { + playerData = syncMap.get( key ); + } } if ( playerData != null ) { @@ -115,7 +120,7 @@ public void run() } } - synchronized ( pCache.getPlayers() ) { + synchronized ( syncMap ) { for ( PlayerCachePlayerData playerData : purge ) { try { From a0b991b1a55fd07d4e6b00bbe36c18fe3bcc34a4 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Mon, 20 May 2024 05:00:02 -0400 Subject: [PATCH 11/15] Economy: Added a feature to check if a player has an economy account. Currently this is not being used outside of the economy integrations, but it can be used to help suppress initial startup messages where players do not have an account, which will help prevent flooding a lot of messages to the console for some servers. --- docs/changelog_v3.3.x.md | 4 ++++ .../EconomyCurrencyIntegration.java | 2 ++ .../integration/EconomyIntegration.java | 2 ++ .../spigot/economies/CoinsEngineEconomy.java | 19 +++++++++++++++++- .../economies/CoinsEngineEconomyWrapper.java | 6 +++--- .../spigot/economies/EdPrisonEconomy.java | 20 +++++++++++++++++-- .../economies/EdPrisonEconomyWrapper.java | 2 +- .../spigot/economies/EssEconomyWrapper.java | 9 +++++++-- .../spigot/economies/EssentialsEconomy.java | 6 ++++++ .../prison/spigot/economies/GemsEconomy.java | 20 ++++++++++++++++++- .../spigot/economies/GemsEconomyWrapper.java | 9 +++++++-- .../prison/spigot/economies/SaneEconomy.java | 6 ++++++ .../spigot/economies/SaneEconomyWrapper.java | 18 ++++++++++++----- .../prison/spigot/economies/VaultEconomy.java | 7 +++++++ .../spigot/economies/VaultEconomyWrapper.java | 14 ++++++------- 15 files changed, 120 insertions(+), 24 deletions(-) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 6fd867848..9d27a4f06 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -18,6 +18,10 @@ These change logs represent the work that has been going on within prison. +* **Economy: Added a feature to check if a player has an economy account.** +Currently this is not being used outside of the economy integrations, but it can be used to help suppress initial startup messages where players do not have an account, which will help prevent flooding a lot of messages to the console for some servers. + + * **Player Cache: There was a report of a concurrent modification exception.** This is very rare and generally should not happen. The keySet is part of the original TreeMap collection, so the fix here is to take all keys and put them in a new collection so they are then disconnected from the original TreeSet. diff --git a/prison-core/src/main/java/tech/mcprison/prison/integration/EconomyCurrencyIntegration.java b/prison-core/src/main/java/tech/mcprison/prison/integration/EconomyCurrencyIntegration.java index 34baea931..daa6f58af 100644 --- a/prison-core/src/main/java/tech/mcprison/prison/integration/EconomyCurrencyIntegration.java +++ b/prison-core/src/main/java/tech/mcprison/prison/integration/EconomyCurrencyIntegration.java @@ -27,6 +27,8 @@ public boolean hasCurrency( String currency ) { public abstract boolean supportedCurrency( String currency ); + public abstract boolean hasAccount( Player player ); + public abstract double getBalance( Player player, String currency ); public abstract boolean setBalance( Player player, double amount, String currency ); diff --git a/prison-core/src/main/java/tech/mcprison/prison/integration/EconomyIntegration.java b/prison-core/src/main/java/tech/mcprison/prison/integration/EconomyIntegration.java index 1cd42d4fb..dc9042f95 100644 --- a/prison-core/src/main/java/tech/mcprison/prison/integration/EconomyIntegration.java +++ b/prison-core/src/main/java/tech/mcprison/prison/integration/EconomyIntegration.java @@ -16,6 +16,8 @@ public EconomyIntegration( String keyName, String providerName ) { } + public abstract boolean hasAccount( Player player ); + /** * Returns the player's current balance. * diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/CoinsEngineEconomy.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/CoinsEngineEconomy.java index 0538d6682..95de2fc10 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/CoinsEngineEconomy.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/CoinsEngineEconomy.java @@ -61,17 +61,34 @@ public double getBalance(Player player) { return amount; } + @Override + public boolean hasAccount( Player player ) { + return true; + } + @Override public double getBalance(Player player, String currencyName) { double amount = 0; if ( wrapper != null ) { synchronized ( wrapper ) { - amount = wrapper.getBalance(player, currencyName); + amount = wrapper.getBalance(player, currencyName, false); } } return amount; } + +// @Override +// public double getBalance(Player player, String currencyName, boolean quite) { +// double amount = 0; +// if ( wrapper != null ) { +// +// synchronized ( wrapper ) { +// amount = wrapper.getBalance(player, currencyName, quite); +// } +// } +// return amount; +// } @Override public boolean setBalance(Player player, double amount) { diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/CoinsEngineEconomyWrapper.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/CoinsEngineEconomyWrapper.java index e1d248e57..c3e7fca1c 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/CoinsEngineEconomyWrapper.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/CoinsEngineEconomyWrapper.java @@ -39,15 +39,15 @@ public boolean supportedCurrency( String currencyName ) { public Currency getCurrency( String currencyNamme ) { return CoinsEngineAPI.getCurrency( currencyNamme ); } - + public double getBalance(Player player) { Output.get().logWarn( "CoinsEngineEconomy getBalance() - Fail: MUST include a currencyName."); - return getBalance(player, null); + return getBalance(player, null, false); } - public double getBalance(Player player, String currencyName) { + public double getBalance(Player player, String currencyName, boolean quite ) { double results = 0; if (economy != null && player instanceof SpigotPlayer ) { diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EdPrisonEconomy.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EdPrisonEconomy.java index 5e19a8f53..aaad214de 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EdPrisonEconomy.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EdPrisonEconomy.java @@ -69,7 +69,11 @@ public boolean supportedCurrency( String currencyName ) { return supported; } - + + @Override + public boolean hasAccount( Player player ) { + return true; + } @Override public double getBalance(Player player) { @@ -84,11 +88,23 @@ public double getBalance(Player player, String currencyName) { if ( wrapper != null ) { synchronized ( wrapper ) { - amount = wrapper.getBalance(player, currencyName); + amount = wrapper.getBalance(player, currencyName, false); } } return amount; } + +// @Override +// public double getBalance(Player player, String currencyName, boolean quite) { +// double amount = 0; +// if ( wrapper != null ) { +// +// synchronized ( wrapper ) { +// amount = wrapper.getBalance(player, currencyName, quite); +// } +// } +// return amount; +// } @Override public boolean setBalance(Player player, double amount) { diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EdPrisonEconomyWrapper.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EdPrisonEconomyWrapper.java index 3b6fef589..33181f97b 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EdPrisonEconomyWrapper.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EdPrisonEconomyWrapper.java @@ -62,7 +62,7 @@ public boolean supportedCurrency( String currencyName ) { // return getBalance(player, null); // } - public double getBalance(Player player, String currencyName) { + public double getBalance(Player player, String currencyName, boolean quite) { double results = 0; if ( isEnabled() && currencyName != null ) { results = economy.getEco(player.getUUID(), currencyName); diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EssEconomyWrapper.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EssEconomyWrapper.java index f3392f4f4..595461b22 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EssEconomyWrapper.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EssEconomyWrapper.java @@ -36,10 +36,15 @@ * @author Faizaan A. Datoo */ class EssEconomyWrapper { + + + public boolean hasAccount( Player player ) { + return Economy.playerExists( player.getName() ); + } double getBalance(Player player) { try { - if ( Economy.playerExists( player.getName() ) ) { + if ( hasAccount( player ) ) { return Economy.getMoneyExact(player.getName()).doubleValue(); } @@ -54,7 +59,7 @@ class EssEconomyWrapper { void setBalance(Player player, double amount) { try { - if ( Economy.playerExists( player.getName() ) ) { + if ( hasAccount( player ) ) { Economy.setMoney(player.getName(), new BigDecimal(amount)); } else { diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EssentialsEconomy.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EssentialsEconomy.java index 520e4d63c..2109b5841 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EssentialsEconomy.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/EssentialsEconomy.java @@ -99,6 +99,12 @@ public void integrate() { addDebugInfo( "9" ); } + + @Override + public boolean hasAccount( Player player ) { + return wrapper.hasAccount( player ); + } + @Override public double getBalance(Player player) { return wrapper.getBalance(player); diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/GemsEconomy.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/GemsEconomy.java index 24543f422..f53cc40d9 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/GemsEconomy.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/GemsEconomy.java @@ -49,6 +49,12 @@ public boolean supportedCurrency( String currencyName ) { return supported; } + + @Override + public boolean hasAccount( Player player ) { + return wrapper.hasAccount( player ); + } + @Override public double getBalance(Player player) { double amount = 0; @@ -67,12 +73,24 @@ public double getBalance(Player player, String currencyName) { if ( wrapper != null ) { synchronized ( wrapper ) { - amount = wrapper.getBalance(player, currencyName); + amount = wrapper.getBalance(player, currencyName, false); } } return amount; } +// @Override +// public double getBalance(Player player, String currencyName, boolean quite) { +// double amount = 0; +// if ( wrapper != null ) { +// +// synchronized ( wrapper ) { +// amount = wrapper.getBalance(player, currencyName, quite); +// } +// } +// return amount; +// } + @Override public boolean setBalance(Player player, double amount) { boolean results = false; diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/GemsEconomyWrapper.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/GemsEconomyWrapper.java index 260a45016..085044645 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/GemsEconomyWrapper.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/GemsEconomyWrapper.java @@ -88,11 +88,16 @@ private Object getCurrencyRefection( String currencyName ) { // return currency; // } + + public boolean hasAccount( Player player ) { + return true; + } + public double getBalance(Player player) { - return getBalance(player, null); + return getBalance(player, null, false); } - public double getBalance(Player player, String currencyName) { + public double getBalance(Player player, String currencyName, boolean quite) { double results = 0; if (economy != null) { if ( currencyName == null ) { diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/SaneEconomy.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/SaneEconomy.java index dc50b3c77..5a78538bb 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/SaneEconomy.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/SaneEconomy.java @@ -36,6 +36,12 @@ public void integrate() { } } + + @Override + public boolean hasAccount( Player player ) { + return econWrapper.hasAccount( player ); + } + @Override public double getBalance(Player player) { return econWrapper.getBalance(player); diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/SaneEconomyWrapper.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/SaneEconomyWrapper.java index b93c5b6e1..5db58dc76 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/SaneEconomyWrapper.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/SaneEconomyWrapper.java @@ -23,17 +23,25 @@ public SaneEconomyWrapper(String providerName) { } } + + public boolean hasAccount( Player player ) { + + EconomablePlayer p = toEconomablePlayer(player); + + return p != null && economyManager.accountExists( p ); + } + public double getBalance(Player player) { double result = 0; try { - EconomablePlayer p = toEconomablePlayer(player); - if ( p == null || !economyManager.accountExists( p ) ) { + if ( !hasAccount( player ) ) { player.sendMessage( "Economy Error: You don't have an account."); } else { + EconomablePlayer p = toEconomablePlayer(player); result = economyManager.getBalance( p ); } } @@ -47,14 +55,14 @@ public double getBalance(Player player) { public void setBalance(Player player, double amount) { try { - EconomablePlayer p = toEconomablePlayer(player); - if ( p == null || !economyManager.accountExists( p ) ) { + if ( !hasAccount( player ) ) { player.sendMessage( "Economy Error: You don't have an account."); } else { - economyManager.setBalance(toEconomablePlayer(player), amount); + EconomablePlayer p = toEconomablePlayer(player); + economyManager.setBalance( p, amount); } } diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/VaultEconomy.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/VaultEconomy.java index 9217bbfdb..42bfef372 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/VaultEconomy.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/VaultEconomy.java @@ -52,6 +52,13 @@ public void integrate() { addDebugInfo( "6" ); } + + @Override + public boolean hasAccount( Player player ) { + boolean sendWarning = false; + return econWrapper.hasAccount( player, sendWarning ); + } + @Override public double getBalance(Player player) { if (hasIntegrated()) { diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/VaultEconomyWrapper.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/VaultEconomyWrapper.java index c63eb72d6..540a96036 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/VaultEconomyWrapper.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/economies/VaultEconomyWrapper.java @@ -69,7 +69,7 @@ public VaultEconomyWrapper(String providerName ) { * @param player * @return */ - public boolean hasAccount( Player player ) { + public boolean hasAccount( Player player, boolean sendWarning ) { boolean hasAccount = false; OfflinePlayer oPlayer = getOfflinePlayer( player ); @@ -79,7 +79,7 @@ public boolean hasAccount( Player player ) { } catch (Exception e) { - if ( !hasNoAccount.contains(player) ) { + if ( sendWarning && !hasNoAccount.contains(player) ) { Output.get().logInfo( String.format( "Vault economy: Player %s does not have an econ account. " @@ -150,7 +150,7 @@ private OfflinePlayer getOfflinePlayer(Player player) { public double getBalance(Player player) { double results = 0; - boolean hasAccount = hasAccount(player); + boolean hasAccount = hasAccount(player, true); if ( economy != null && !hasAccount ) { player.sendMessage( "Economy Error: You don't have an account."); @@ -200,7 +200,7 @@ public double getBalance(Player player) { public boolean setBalance(Player player, double amount) { boolean results = false; - boolean hasAccount = hasAccount(player); + boolean hasAccount = hasAccount(player, true); if ( economy != null && !hasAccount ) { player.sendMessage( "Economy Error: You don't have an account."); @@ -242,7 +242,7 @@ public boolean setBalance(Player player, double amount) { public boolean addBalance(Player player, double amount) { boolean results = false; - boolean hasAccount = hasAccount(player); + boolean hasAccount = hasAccount(player, true); if ( amount < 0 ) { results = removeBalance( player, amount ); @@ -300,7 +300,7 @@ public boolean removeBalance(Player player, double amount) { amount *= -1; } - boolean hasAccount = hasAccount(player); + boolean hasAccount = hasAccount(player, true); if ( economy != null && !hasAccount ) { player.sendMessage( "Economy Error: You don't have an account."); @@ -352,7 +352,7 @@ public boolean removeBalance(Player player, double amount) { public boolean canAfford(Player player, double amount) { boolean results = false; - boolean hasAccount = hasAccount(player); + boolean hasAccount = hasAccount(player, true); if ( economy != null && !hasAccount ) { player.sendMessage( "Economy Error: You don't have an account."); From 615ef23779c0f30a972ab9899de9c7b140fde705 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Mon, 20 May 2024 12:54:35 -0400 Subject: [PATCH 12/15] Gradle updates: Upgraded XSeries from v9.10.0 to v10.0.0 Upgraded nbtApi from v2.12.2 to v2.12.4 Upgraded luckperms-v5 from v5.0 to v5.4 --- docs/changelog_v3.3.x.md | 5 +++++ gradle/libs.versions.toml | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 9d27a4f06..06e671cac 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -17,6 +17,11 @@ These change logs represent the work that has been going on within prison. # 3.3.0-alpha.17a 2024-05-20 +* **Gradle updates:** +Upgraded XSeries from v9.10.0 to v10.0.0 +Upgraded nbtApi from v2.12.2 to v2.12.4 +Upgraded luckperms-v5 from v5.0 to v5.4 + * **Economy: Added a feature to check if a player has an economy account.** Currently this is not being used outside of the economy integrations, but it can be used to help suppress initial startup messages where players do not have an account, which will help prevent flooding a lot of messages to the console for some servers. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ef07addbc..62104e59f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,17 +28,17 @@ commons-lang3 = "3.12.0" groovy = "3.0.9" gson = "2.10.1" spiget = "1.4.6-SNAPSHOT" -xseries = "9.10.0" +xseries = "10.0.0" junit = "4.12" guava = "31.1-jre" spigotApi = "1.13.2-R0.1-SNAPSHOT" -nbtApi = "2.12.2" +nbtApi = "2.12.4" papi = "2.11.5" vault = "1.7.1" luckperms-v4 = "4.4" -luckperms-v5 = "5.0" +luckperms-v5 = "5.4" itemsAdder = "3.5.0b" From 9d8ff14916f9bca512ddeca54f1b661f1685cc6b Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Mon, 20 May 2024 12:56:16 -0400 Subject: [PATCH 13/15] Obsolete blocks: Marked an enum as @Deprecated to suppress a compile warning. This has not real impact on anything. --- docs/changelog_v3.3.x.md | 3 +++ .../main/java/tech/mcprison/prison/util/ObsoleteBlockType.java | 1 + 2 files changed, 4 insertions(+) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 06e671cac..23ba98d90 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -17,6 +17,9 @@ These change logs represent the work that has been going on within prison. # 3.3.0-alpha.17a 2024-05-20 +* **Obsolete blocks: Marked an enum as @Deprecated to suppress a compile warning.** This has not real impact on anything. + + * **Gradle updates:** Upgraded XSeries from v9.10.0 to v10.0.0 Upgraded nbtApi from v2.12.2 to v2.12.4 diff --git a/prison-core/src/main/java/tech/mcprison/prison/util/ObsoleteBlockType.java b/prison-core/src/main/java/tech/mcprison/prison/util/ObsoleteBlockType.java index ea5e72875..cbf4e6c34 100644 --- a/prison-core/src/main/java/tech/mcprison/prison/util/ObsoleteBlockType.java +++ b/prison-core/src/main/java/tech/mcprison/prison/util/ObsoleteBlockType.java @@ -51,6 +51,7 @@ * @since API 1.0 * @deprecated since v3.2.6 */ +@Deprecated public enum ObsoleteBlockType { /** From 86afca556a9057f644dcd14444b7bb1fc8289455 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Mon, 20 May 2024 12:57:54 -0400 Subject: [PATCH 14/15] Player Ranks GUI: Fixed an issue with the code not using the correct defaults for NoRankAccess when no value is provided in the configs. --- docs/changelog_v3.3.x.md | 3 +++ .../prison/spigot/gui/rank/SpigotPlayerRanksGUI.java | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 23ba98d90..33887f48a 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -17,6 +17,9 @@ These change logs represent the work that has been going on within prison. # 3.3.0-alpha.17a 2024-05-20 +* **Player Ranks GUI: Fixed an issue with the code not using the correct defaults for NoRankAccess when no value is provided in the configs.** + + * **Obsolete blocks: Marked an enum as @Deprecated to suppress a compile warning.** This has not real impact on anything. diff --git a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/gui/rank/SpigotPlayerRanksGUI.java b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/gui/rank/SpigotPlayerRanksGUI.java index a0624bb19..c2d46b010 100644 --- a/prison-spigot/src/main/java/tech/mcprison/prison/spigot/gui/rank/SpigotPlayerRanksGUI.java +++ b/prison-spigot/src/main/java/tech/mcprison/prison/spigot/gui/rank/SpigotPlayerRanksGUI.java @@ -166,8 +166,11 @@ public void open() { // Not sure how you want to represent this: String materialHasStr = guiConfig.getString("Options.Ranks.MaterialType.HasRankAccess", "TRIPWIRE_HOOK"); XMaterial materialHas = XMaterial.matchXMaterial( materialHasStr ).orElse(null); - XMaterial materialHasNot = XMaterial.matchXMaterial( - guiConfig.getString("Options.Ranks.MaterialType.NoRankAccess")).orElse(null); + + String materialHasNotStr = guiConfig.getString("Options.Ranks.MaterialType.NoRankAccess", "REDSTONE_BLOCK"); + XMaterial materialHasNot = XMaterial.matchXMaterial( + materialHasNotStr != null ? materialHasNotStr : "REDSTONE_BLOCK" + ).orElse(null); List configCustomLore = guiConfig.getStringList("EditableLore.Ranks"); From 986886b3e639229f1553700e73b92f23ff4fa891 Mon Sep 17 00:00:00 2001 From: rbluer <665978+rbluer@users.noreply.github.com> Date: Mon, 20 May 2024 14:42:12 -0400 Subject: [PATCH 15/15] Prison v3.3.0-alpha.18 2024-05-20 Updates focused on the builds and libraries that prison uses. Supports Spigot v1.20.6 and Paper v1.20.6. --- docs/changelog_v3.3.x.md | 10 +- docs/prison_changelog_v3.3.0-alpha.14.md | 2 +- docs/prison_changelog_v3.3.0-alpha.15.md | 2 +- docs/prison_changelog_v3.3.0-alpha.16.md | 2 +- docs/prison_changelog_v3.3.0-alpha.18.md | 264 +++++++++++++++++++++++ docs/prison_changelogs.md | 1 + docs/prison_chnagelog_v3.3.0-alpha.17.md | 2 +- docs/prison_docs_000_toc.md | 17 +- gradle.properties | 2 +- 9 files changed, 290 insertions(+), 12 deletions(-) create mode 100644 docs/prison_changelog_v3.3.0-alpha.18.md diff --git a/docs/changelog_v3.3.x.md b/docs/changelog_v3.3.x.md index 33887f48a..9aec9d4f7 100644 --- a/docs/changelog_v3.3.x.md +++ b/docs/changelog_v3.3.x.md @@ -14,7 +14,15 @@ These change logs represent the work that has been going on within prison. -# 3.3.0-alpha.17a 2024-05-20 +# 3.3.0-alpha.18 2024-05-20 + + + + +**Prison v3.3.0-alpha.18 2024-05-20** + +This version has been tested and confirmed to be working with Spigot v1.20.6 and Paper v1.20.6. + * **Player Ranks GUI: Fixed an issue with the code not using the correct defaults for NoRankAccess when no value is provided in the configs.** diff --git a/docs/prison_changelog_v3.3.0-alpha.14.md b/docs/prison_changelog_v3.3.0-alpha.14.md index 202b8f027..3020a36a6 100644 --- a/docs/prison_changelog_v3.3.0-alpha.14.md +++ b/docs/prison_changelog_v3.3.0-alpha.14.md @@ -4,7 +4,7 @@ ## Build logs - **[v3.3.0-alpha - Current](changelog_v3.3.x.md)** - - [v3.2.0 through v3.3.0-alpha.16](prison_changelogs.md) + - [v3.2.0 through v3.3.0-alpha.18](prison_changelogs.md) These build logs represent the work that has been going on within prison. diff --git a/docs/prison_changelog_v3.3.0-alpha.15.md b/docs/prison_changelog_v3.3.0-alpha.15.md index 44cf900a5..05004085e 100644 --- a/docs/prison_changelog_v3.3.0-alpha.15.md +++ b/docs/prison_changelog_v3.3.0-alpha.15.md @@ -4,7 +4,7 @@ ## Build logs - **[v3.3.0-alpha - Current](changelog_v3.3.x.md)** - - [v3.2.0 through v3.3.0-alpha.16](prison_changelogs.md) + - [v3.2.0 through v3.3.0-alpha.18](prison_changelogs.md) These build logs represent the work that has been going on within prison. diff --git a/docs/prison_changelog_v3.3.0-alpha.16.md b/docs/prison_changelog_v3.3.0-alpha.16.md index 69d13a70e..48debc744 100644 --- a/docs/prison_changelog_v3.3.0-alpha.16.md +++ b/docs/prison_changelog_v3.3.0-alpha.16.md @@ -4,7 +4,7 @@ ## Build logs - **[v3.3.0-alpha - Current](changelog_v3.3.x.md)** - - [v3.2.0 through v3.3.0-alpha.16](prison_changelogs.md) + - [v3.2.0 through v3.3.0-alpha.18](prison_changelogs.md) These build logs represent the work that has been going on within prison. diff --git a/docs/prison_changelog_v3.3.0-alpha.18.md b/docs/prison_changelog_v3.3.0-alpha.18.md new file mode 100644 index 000000000..61b2d86f2 --- /dev/null +++ b/docs/prison_changelog_v3.3.0-alpha.18.md @@ -0,0 +1,264 @@ +[Prison Documents - Table of Contents](prison_docs_000_toc.md) + +## Prison Build Logs for v3.3.x + +## Build logs + - **[v3.3.0-alpha - Current](changelog_v3.3.x.md)** + - [v3.2.0 through v3.3.0-alpha.18](prison_changelogs.md) + + +These build logs represent the work that has been going on within prison. + + + + +# 3.3.0-alpha.18 2024-05-20 + + +**Prison-3.3.0-alpha.18.jar** + +This version of prison works with Spigot v1.20.6 and Paper v1.20.6. + +The whole prison build environment was rewrote and updated to provide for a cleaner and more modern way to use dependencies within Gradle. + +In combination with updating most of the libraries and other dependencies, this resolved many issues that were initially preventing prison from working with Spigot v1.20.5 and v1.20.6. + + +* Gradle updates: Upgraded from v7.3.3 to v8.7. Had to upgrade 22 times to reach v8.7. With gradle, if there is a future breaking change in the configs, it warns you in the before the next release. So incremental upgrading helps ensure the configs are fixed and functional before moving on to the next release. + +* Upgraded Spiget from v1.4.2 to 1.4.6. This checks prison's version for updates. +Had to also rewrite the code using Spiget because the older build tools were having issues handling anonymous classes when building the final jar file with shadow. + +* Upgraded shadow from v6.10 to v8.1.1 2 +Shadow v8.x could only be used with gradle v8.x + +* Placeholders: There was an odd issue with placeholders when a discord plugin was using papi. For some reason, that plugin was sending the placeholders with null players. Now checks for nulls. Since it was a non-standard way of using papi, there may be other issues? + +* PlayerCache: Slight modification in getting the keySet so it will not be tied to the original PlayerCache's TreeMap. This will eliminate the possibilities of a concurrent modification exception if new players are brought online or unloaded. + +* Economies: Added a feature for external functions to be able to check if the player has an account. It's not being used yet, but it can be used to bypass code (and messages) if a player does not have an account. + + + + +# 3.3.0-alpha.18 2024-05-20 + + + +**Prison v3.3.0-alpha.18 2024-05-20** + +This version has been tested and confirmed to be working with Spigot v1.20.6 and Paper v1.20.6. + + + + **Player Ranks GUI: Fixed an issue with the code not using the correct defaults for NoRankAccess when no value is provided in the configs.** + + + + **Obsolete blocks: Marked an enum as @Deprecated to suppress a compile warning.** This has not real impact on anything. + + + + **Gradle updates:** + +pgraded XSeries from v9.10.0 to v10.0.0 + +pgraded nbtApi from v2.12.2 to v2.12.4 + +pgraded luckperms-v5 from v5.0 to v5.4 + + + + **Economy: Added a feature to check if a player has an economy account.** + +urrently this is not being used outside of the economy integrations, but it can be used to help suppress initial startup messages where players do not have an account, which will help prevent flooding a lot of messages to the console for some servers. + + + + **Player Cache: There was a report of a concurrent modification exception.** + +his is very rare and generally should not happen. + +he keySet is part of the original TreeMap collection, so the fix here is to take all keys and put them in a new collection so they are then disconnected from the original TreeSet. + +his will prevent a concurrent modification exception if there is an action to add or remove users from the user cache, since the user cache remains active and cannot be locked with a synchronization for any amount of time, other than then smallest possible. + +he standard solution with dealing with this TreeSet collection would be to synchronize the whole activity of saving the dirty elements of the player cache. Unfortunately, that will cause blocking transactions when player events try to access the player cache. Therefore it's a balance game of trying to protect the player cache with the minimal amount of synchronizations, but allow the least amount of I/O blocking for all other processes that are trying to use it. + +opefully this is sufficient to allow it all to work without conflict, and to be able to provide enough protection. + + + + **Gradle: Removed a lot of the older commented out settings.** + +ee prior commits to better understand how things were setup before, or for references. + + + + **Gradle: A few more adjustments to add a few more items to the libs.versions.toml.** + + + + + **Placeholders: The placeholder api call from PlaceholderAPI is passing a null OfflinePlayer object.** + +ot sure why this has never been an issue before, but added support for null OfflnePlayers. + + + + + **Spiget: Updated the way prison handles spiget by now submitting a task with a 5 second delay.** + +he messages are more helpful now. + +his also moves it out of the SpigotPrison class. + + + + **Upgraded John Rengelman's shadow, a gradle plugin, from v6.1.0 to v8.1.1** + + + + + + **Upgrade gradle from v7.6.4 to v8.7** + + Upgraded from: v7.6.4 -> v8.0 -> v8.0.2 -> v8.1 -> v8.1.1 + + -> v8.2 -> v8.3 -> v8.4 -> v8.5 -> v8.6 -> v8.7 + + v8.3 required a configuration change due to `org.gradle.api.plugins.BasePluginConvention` type has been deprecated and will be removed in gradle v9.x. This is impacting the use of the `build.gradle`'s `archivesBaseNamme`. This is being replaced by the new `base{}` configuration block. + + v8.3 also required other config changes. + + + + + + **Upgrade spiget from v1.4.2 to v1.4.6** + + Was using a jar with v1.4.2 due to their repo going down frequently. + + Switched back to pulling through maven and got rid of jar. + + + + + **Upgrade gradle from v7.3.3 to v7.6.4** + + Upgraded from: v7.3.3 -> v7.4 -> v7.4.1 -> v7.4.2 + + -> v7.5 -> v7.5.1 -> v7.6 -> v7.6.1 -> v7.6.2 -> v7.6.3 -> v7.6.4 + + Preparing for Gradle v8.x + + Around v7.5.1 required a change to auto provisioning + + + + +*v3.3.0-alpha.17a 2024-04-29** + + + + **GUI settings: Update them to remove unused stuff.** + + + + **GUI Tools messages: refined the messages and hooked them up.** + + + + **Initial setup of the GUI tools messages that are at the bottom of a page.** + +etup the handling of the messages and added the messages to all of the language files. + +upport for prior, current, and next page. Also c + + **Update the plugin.yml and removed the permissions configs since they were generating errors (lack of a schema) and the perms and handled through the prison command handler.** + + + + + **CustomItems: Fixed an issue when CustomItems is a plugin on the server, but the plugin fails to load.** + +herefore the problem was fixed to allow a failed CustomItems loading to bypass being setup and loaded for prison. + +CustomItems.isEnabled()` must exist and return a value of true before the integration is enabled. + + + + **XSeries XMaterials: Update to XSeries v9.10.0 from v9.9.0.** + +ad issues with case sensitivity when using `valueOf()`, which was changed to `matchXMaterial().orElse(null)` which resolves a few issues. + +Materials v9.10.0 sets up support for spigot 1.20.5. There may be more changes as spigot stabilizes. + +he issue with using `valueOf("green_wool")` would not find any matches since the enum case must match the string value exactly. So `valueOf("GREEN_WOOL")` would have worked. This was fixed to help eliminate possible issues with configuring the server. + + + + **Auto features: normal drop processing: Added a new feature to check inventory for being full, and if it is, then display the messages.** + + + + + **Auto features: Inventory full chat notification: bug fix. This fixes using the wrong player object.** + +t now use prison's player object so the color codes are properly translated. + + + + **Placeholders: bug fix: When using a search from the console which included a player name, it was generating an invalid cast to a SpigotPlayer object when it wasn't related to that class due to the player being offline.** + + + + **GUI: ranks and mines: setup and enable a new default access block type that can be used if that rank or mine has not been specifically specified.** + + + + **GUI: tool bar's prior page and next page: Suppress the page buttons if there is only one page worth of gui content. ** + + + + **GUI: Player ranks: Fixed a bug where clicking on a rank in the player's gui was trying to run an empty command, which was generating an invalid command error.** + +gnores the command running if the command is either null or blank. + + + + + **Update to plugin.yml since some soft dependencies were missing.** + + + + **Economies: fixed the display of too many economy related messages, including eliminating logging of messages for offline players.** + +he vault economy check for offline players, will now only show one informational message if a player is not setup in the economy. + + + + **GUI Player ranks: The setting for Options.Ranks.MaterialType.NoRankAccess was not hooked up properly so it was not really working.** + +he config creation was wrong. Also fixed the code that was generating the gui. + + + + **RankPlayer and topn ranking: This may not have an impact overall, but for both the default and prestiges ladders, they are defaulting to a value of -1 when performing a comparison between players.** + + + + **Update privatebin-java-api to a newer release that now does a better job with a failure to use the correct protocol.** + +t identifies what TLS version is being used, and if TLSv1.3 is missing, then it will indicate that the java version needs to be updated. + +s a fallback, if the privatebin cannot be used, it is now using the older paste.helpch.at service. But if it does, the resulting documents are not purged and not encrypted. + + + + **Economy: EdPrison's economy. Added support for use of EdPrison's economy and custom currencies.** + +his will allow prison to use EdPrison's economy does not also use another established economy that is accessible through vault, or multi-currency. + + + diff --git a/docs/prison_changelogs.md b/docs/prison_changelogs.md index 5b67fdb73..189d308f2 100644 --- a/docs/prison_changelogs.md +++ b/docs/prison_changelogs.md @@ -22,6 +22,7 @@ These build logs represent the work that has been going on within prison. - Future updates will be under the v3.3.x release + - [v3.3.3-alpha.18 - 2024-05-20](prison_changelog_v3.3.0-alpha.18.md)   - [v3.3.3-alpha.17 - 2024-04-20](prison_changelog_v3.3.0-alpha.17.md)   - [v3.3.3-alpha.16 - 2023-11-18](prison_changelog_v3.3.0-alpha.16.md)   - [v3.3.3-alpha.15 - 2023-07-07](prison_changelog_v3.3.0-alpha.15.md)   diff --git a/docs/prison_chnagelog_v3.3.0-alpha.17.md b/docs/prison_chnagelog_v3.3.0-alpha.17.md index 08b51b908..346f63ef9 100644 --- a/docs/prison_chnagelog_v3.3.0-alpha.17.md +++ b/docs/prison_chnagelog_v3.3.0-alpha.17.md @@ -4,7 +4,7 @@ ## Build logs - **[v3.3.0-alpha - Current](changelog_v3.3.x.md)** - - [v3.2.0 through v3.3.0-alpha.17](prison_changelogs.md) + - [v3.2.0 through v3.3.0-alpha.18](prison_changelogs.md) These build logs represent the work that has been going on within prison. diff --git a/docs/prison_docs_000_toc.md b/docs/prison_docs_000_toc.md index 66e1cd54a..d1ab73d46 100644 --- a/docs/prison_docs_000_toc.md +++ b/docs/prison_docs_000_toc.md @@ -2,7 +2,7 @@


-*Documented updated: 2023-11-18* +*Documented updated: 2024-05-20* ## Project Related @@ -20,7 +20,7 @@ ## Build logs - **[v3.3.0-alpha - Current](changelog_v3.3.x.md)** - - [v3.2.0 through v3.2.11](prison_changelogs.md) + - [v3.2.0 through v3.2.18](prison_changelogs.md) @@ -28,16 +28,21 @@
-# Prison Supports Spigot 1.8 through Spigot 1.20.x+ -# Prison Supports Java 1.8 though Java 20+ -# Prison is created for the Spigot Platform, and works on other platforms based upon Spigot +# Prison Supports Spigot 1.8 through Spigot 1.20.6 and + +# Prison Supports Java 1.8 though Java 21+ +# Prison is created for the Spigot Platform, and works on other platforms based upon Spigot, tested with Paper 1.20.6 too. -Prison supports Spigot 1.20.x, along with Java 1.8 through Java 20. At this time there hasn't been any reports of incompatibilities. Since prison is using a library to support the correct blocks for the version of the server that you are running, we are limited to when updates are released for that library. Luckily they have had a couple of releases and we have applied them to the latest alpha releases. So if you are wanting to maximize the new Spigot 1.20 experience, please upgrade to the latest alpha release as found on our discord server in the #alpha channel. +Prison supports Spigot 1.20.x, along with Java 1.8 through Java 21. + +Prison is using a library to support the correct blocks for the version of the server that you are running, so we are limited to when updates are released for that library. Generally though, they are quick to get updates posted. + ### Newer features and updates in Prison: +NOTE: This list has not been updated in a while... + * Prison's AutoFeatures was redesigned to support more Event Listener Priorities. This means prison is more flexible and will work with more plugins, using them the way you want to. Some of the new priorities are `ACCESS` so you can use Prison's Mine and Teleport Access by Rank without having to use Prison's block handlers. This bypasses the need to configure WorldGuard regions for access to the mines that are linked to Prison Ranks. * Now supports RevEnchants, both with Prison handling the block break events, and with RevEnchants handling the events. diff --git a/gradle.properties b/gradle.properties index 9a99620df..040b338b6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ ## # This is actually the "correct" place to define the version for the project. ## # Used within build.gradle with ${project.version}. ## # Can be overridden on the command line: gradle -Pversion=3.2.1-alpha.3 -version=3.3.0-alpha.17a +version=3.3.0-alpha.18