From 67e58bc4293af7b8095d44e811680cddd5840def Mon Sep 17 00:00:00 2001 From: theone1000 Date: Fri, 27 Dec 2019 20:37:45 -0700 Subject: [PATCH] Updated various things. See commit description. --- .gitignore | 3 +- .gitlab-ci.yml | 27 +- build.gradle | 109 ------ dependency-reduced-pom.xml | 190 ++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 55616 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 5 - gradlew | 188 ---------- gradlew.bat | 100 ------ libraries/Skyblock-LegacyChunkSnapshot.jar | Bin 1938 -> 0 bytes pom.xml | 178 +++++++++ settings.gradle | 1 - .../java/com/songoda/skyblock/SkyBlock.java | 68 ++-- .../skyblock/blockscanner/BlockScanner.java | 36 +- .../command/commands/admin/ReloadCommand.java | 7 +- .../commands/admin/RemoveHologramCommand.java | 33 +- .../commands/admin/SetHologramCommand.java | 3 +- .../commands/admin/StackableCommand.java | 9 +- .../commands/island/AcceptCommand.java | 18 +- .../commands/island/UpgradeCommand.java | 1 - .../command/commands/island/ValueCommand.java | 3 +- .../songoda/skyblock/config/FileChecker.java | 28 +- .../songoda/skyblock/config/FileManager.java | 76 ++-- .../skyblock/economy/EconomyManager.java | 58 ++- .../com/songoda/skyblock/island/Island.java | 4 +- .../skyblock/island/IslandManager.java | 15 +- .../levelling/rework/IslandLevelManager.java | 63 +++- .../skyblock/levelling/rework/IslandScan.java | 14 +- .../com/songoda/skyblock/listeners/Block.java | 65 ++-- .../songoda/skyblock/listeners/Interact.java | 339 ++++++++---------- .../com/songoda/skyblock/listeners/Join.java | 51 +-- .../localization/LocalizationManager.java | 64 ++++ .../localization/type/Localization.java | 54 +++ .../type/impl/BlankLocalization.java | 31 ++ .../type/impl/EnumLocalization.java | 46 +++ .../type/impl/MaterialsLocalization.java | 21 ++ .../impl/MaterialsToMaterialLocalization.java | 19 + .../com/songoda/skyblock/menus/Levelling.java | 251 ++++++------- .../skyblock/message/MessageManager.java | 8 +- .../placeholder/PlaceholderManager.java | 2 +- .../playerdata/PlayerDataManager.java | 5 - .../skyblock/scoreboard/Scoreboard.java | 36 +- .../scoreboard/ScoreboardManager.java | 11 - .../songoda/skyblock/stackable/Stackable.java | 41 +-- .../skyblock/stackable/StackableManager.java | 78 ++-- .../skyblock/usercache/UserCacheManager.java | 5 +- .../com/songoda/skyblock/utils/Metrics.java | 72 ++-- .../utils/item/MenuClickRegistry.java | 1 - .../utils/structure/StructureUtil.java | 74 ++-- .../skyblock/utils/version/Materials.java | 108 +++--- src/main/resources/language.yml | 9 + 50 files changed, 1403 insertions(+), 1225 deletions(-) delete mode 100644 build.gradle create mode 100644 dependency-reduced-pom.xml delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100644 gradlew delete mode 100644 gradlew.bat delete mode 100644 libraries/Skyblock-LegacyChunkSnapshot.jar create mode 100644 pom.xml delete mode 100644 settings.gradle create mode 100644 src/main/java/com/songoda/skyblock/localization/LocalizationManager.java create mode 100644 src/main/java/com/songoda/skyblock/localization/type/Localization.java create mode 100644 src/main/java/com/songoda/skyblock/localization/type/impl/BlankLocalization.java create mode 100644 src/main/java/com/songoda/skyblock/localization/type/impl/EnumLocalization.java create mode 100644 src/main/java/com/songoda/skyblock/localization/type/impl/MaterialsLocalization.java create mode 100644 src/main/java/com/songoda/skyblock/localization/type/impl/MaterialsToMaterialLocalization.java diff --git a/.gitignore b/.gitignore index 3703d73a..855b5414 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ hs_err_pid* .project # JDT-specific (Eclipse Java Development Tools) -.classpath \ No newline at end of file +.classpath +/target/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 66fa1d77..60ec2d72 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,22 +1,21 @@ -image: gradle:alpine - -variables: - name: "FabledSkyBlock" - path: "/builds/$CI_PROJECT_PATH" - version: "2.1.0" - -before_script: - - export GRADLE_USER_HOME=`pwd`/.gradle - stages: - build +variables: + name: "FabledSkyblock" + path: "/builds/$CI_PROJECT_PATH" + version: "2.1.0" + build: stage: build + image: maven:3.5.3-jdk-8 script: - - find $path/ -type f -name "*.gradle" -print0 | xargs -0 sed -i -e s/maven-version-number/$version/g - - gradle build - - mv $path/build/libs/*.jar $path/ + - find $path/ -type f -name "*.xml" -print0 | xargs -0 sed -i -e s/maven-version-number/$version/g + - find $path/ -type f -name "*.yml" -print0 | xargs -0 sed -i -e s/maven-version-number/$version/g + - mvn clean package + - find $path/ -depth -path '*original*' -delete + - mv $path/target/*.jar $path/ artifacts: + name: $name-$version paths: - - $path/*.jar + - "$path/*.jar" diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 27f4c44d..00000000 --- a/build.gradle +++ /dev/null @@ -1,109 +0,0 @@ -import org.apache.tools.ant.filters.ReplaceTokens -allprojects { - apply plugin: 'java' - apply plugin: 'eclipse' - group = 'com.songoda.skyblock' - version = 'maven-version-number' -} - -configurations { - shade - compile.extendsFrom shade -} - -repositories { - mavenCentral() - jcenter() - - //Spigot - maven { - url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' - } - - // Bungeecord - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots/' - } - - // Songoda - maven { - url 'http://repo.songoda.com/artifactory/private' - } - - // Mojang - maven { - url 'https://libraries.minecraft.net/' - } - - //Jitpack - maven { - url 'https://jitpack.io' - } - -} - -dependencies { - - // Spigot - implementation (group: 'org.spigotmc', name: 'spigot-api', version: '1.14.4-R0.1-SNAPSHOT') - - // GameProfile's Mojang - implementation (group: 'com.mojang', name: 'authlib', version: '1.5.3') - - // PlaceholderAPI - implementation (group: 'be.maximvdw', name: 'placeholderapi', version: '2.5.1') - implementation (group: 'me.clip', name: 'placeholderapi', version: '2.10.2') - - // Vault - implementation (group: 'net.milkbowl', name: 'vault', version: '1.7.1') - - // Reserve - implementation (group: 'net.tnemc', name: 'Reserve', version: '0.1.3.0') - - // Leaderheads - implementation (group: 'me.robin', name: 'leaderheads', version: '1.0') - - // EpicSpawners - implementation (group: 'com.songoda', name: 'epicspawners', version: '6-pre4') - - // EpicAnchors - implementation (group: 'com.songoda', name: 'EpicAnchors', version: '1.4.2') - - // UltimateStacker - implementation (group: 'com.songoda', name: 'ultimatestacker', version: '1.3.1') - - // WildStacker - implementation (group: 'com.github.OmerBenGera', name: 'WildStackerAPI', version: 'b15') - - // WorldEdit - implementation (group: 'com.sk89q', name: 'worldedit', version: '7.0.0') - - // Apache Commons - shade (group: 'org.apache.commons', name: 'commons-lang3', version: '3.0') - shade (group: 'commons-io', name: 'commons-io', version: '2.5') - - // JSON.org - shade (group: 'org.json', name: 'json', version: '20190722') - - // Songoda Updater - shade (group: 'com.songoda', name: 'songodaupdater', version: '1') - - shade fileTree(dir: 'libraries', include: '*.jar') - -} - -processResources { - filter ReplaceTokens, tokens: ["version": project.property("version")] - from (sourceSets.main.resources.srcDirs) { - include '**/*.yml' - } -} - -jar { - configurations.shade.each { dep -> - from(project.zipTree(dep)){ - exclude 'META-INF', 'META-INF/**' - exclude '**/*.yml' - } - } -} diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml new file mode 100644 index 00000000..84e6c40c --- /dev/null +++ b/dependency-reduced-pom.xml @@ -0,0 +1,190 @@ + + + 4.0.0 + com.songoda + skyblock + 2.1.0 + + + + true + src/main/resources + + + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + maven-shade-plugin + 3.2.1 + + + package + + shade + + + + + + + + + mvdw-software + MVdW Public Repositories + http://repo.mvdw-software.be/content/groups/public/ + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + minecraft-repo + https://libraries.minecraft.net/ + + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + + + jitpack.io + https://jitpack.io + + + reserve-repo + https://dl.bintray.com/theneweconomy/java/ + + + sonatype + https://oss.sonatype.org/content/repositories/snapshots/ + + + private + https://repo.songoda.com/artifactory/private/ + + + + + org.spigotmc + spigot-api + 1.15.1-R0.1-SNAPSHOT + provided + + + commons-lang + commons-lang + + + guava + com.google.guava + + + gson + com.google.code.gson + + + bungeecord-chat + net.md-5 + + + snakeyaml + org.yaml + + + + + me.clip + placeholderapi + 2.9.2 + provided + + + com.github.MilkBowl + VaultAPI + 1.7 + provided + + + bukkit + org.bukkit + + + + + net.tnemc + Reserve + 0.1.3.0 + provided + + + me.robin + leaderheads + 1.0 + provided + + + com.songoda + epicspawners + 6-pre4 + provided + + + com.songoda + EpicAnchors + 1.4.2 + provided + + + com.songoda + ultimatestacker + 1.3.1 + provided + + + com.github.OmerBenGera + WildStackerAPI + b15 + provided + + + com.sk89q + worldedit + 7.0.0 + provided + + + com.mojang + authlib + 1.5.3 + provided + + + log4j-core + org.apache.logging.log4j + + + commons-codec + commons-codec + + + log4j-api + org.apache.logging.log4j + + + guava + com.google.guava + + + gson + com.google.code.gson + + + + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55616 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -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. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 9991c503..00000000 --- a/gradlew.bat +++ /dev/null @@ -1,100 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem http://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -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. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -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. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="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 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/libraries/Skyblock-LegacyChunkSnapshot.jar b/libraries/Skyblock-LegacyChunkSnapshot.jar deleted file mode 100644 index 6cb28256c6c39b3c1f497f545706ccfb36187c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1938 zcmWIWW@h1HVBp|jcq?S)&j18WAOZ+Df!NnI#8KDN&rP41Apow>%C5?9Q$5o=X`lj0 zAQnMZ=E;?7qUY=O+4sz8A8%c~i@e^tTIbH3-yCFc#rVO~M^BlM3`^ogwUq^E zSaNc@to8)FF2gtw)a+4(e8Vyb-~|QobQz|7g|e3C4D)dJAc9=&D?k8 zmVqz#u{=(^FKZk#W1EarvZTeP;heJepy8`#RzB($=T=ZpH z#va9Qo3iGGBsiL05pPL#Zp)o=tz+x+_(zwb3L`g`)gdKNP}&eaBl~3!Fmkh)85r!z zid?tUlH`okB53>u#rj`P5UD$NZS93n2M1YsQNb&D;@^(Vm?5d(GQnhJ6{F{ejP(aTOXrrw$-)h8wZv# za)0N&vSI1t#=cyq<~o@zVYefNd)R-D;{7FT_*r?)Sz)c>sfQ2kBhw@nTzwG-V> z&9m5ABq7=|PdsJ0-^8VfW&(bK{eM-slhh|ZH}YI$Qeq?7m9WQLX6eU7t#e(8VR9#o zBu?#d&!`E|dU)g8CYzE!fimt(i*6c_bB;Lq+xu)X>m22dF59_^BYAGLZ{un3w_yHm1meAc23Rb*|SiFyu`+*Hewr1 zJg4!j+_+`m;&1zQZ_KQ9jXf-$QUAr;#O^QqtyK=Y!#j8MK3%2FtsSxUp6;E*wPBg% zk*ha~FB%YaN!5sFU-s0f7skd9eECP)XYK*gsMRG>ltNaryi6Imy`ctth>Tk(o8 z;x{fM5QQzWVb}^=h+&}6vjXN)tnNV=hPUWNwh3F#N7y6|EDK1t38fqe@MdKL8OQ;I MKEQgzfEC0805(vFYXATM diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..77d7449a --- /dev/null +++ b/pom.xml @@ -0,0 +1,178 @@ + + + 4.0.0 + com.songoda + skyblock + 2.1.0 + + + + src/main/resources + true + + + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + maven-shade-plugin + 3.2.1 + + + package + + shade + + + + + + + + + + mvdw-software + MVdW Public Repositories + http://repo.mvdw-software.be/content/groups/public/ + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + minecraft-repo + https://libraries.minecraft.net/ + + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + + + jitpack.io + https://jitpack.io + + + reserve-repo + https://dl.bintray.com/theneweconomy/java/ + + + sonatype + https://oss.sonatype.org/content/repositories/snapshots/ + + + private + https://repo.songoda.com/artifactory/private/ + + + + + org.spigotmc + spigot-api + 1.15.1-R0.1-SNAPSHOT + provided + + + be.maximvdw + MVdWPlaceholderAPI + 2.1.1-SNAPSHOT + + + org.spigotmc + spigot + + + + + me.clip + placeholderapi + 2.9.2 + provided + + + com.github.MilkBowl + VaultAPI + 1.7 + provided + + + net.tnemc + Reserve + 0.1.3.0 + provided + + + me.robin + leaderheads + 1.0 + provided + + + com.songoda + epicspawners + 6-pre4 + provided + + + com.songoda + EpicAnchors + 1.4.2 + provided + + + com.songoda + ultimatestacker + 1.3.1 + provided + + + com.github.OmerBenGera + WildStackerAPI + b15 + provided + + + com.sk89q + worldedit + 7.0.0 + provided + + + com.mojang + authlib + 1.5.3 + provided + + + org.json + json + 20190722 + compile + + + com.songoda + songodaupdater + 1 + compile + + + org.apache.commons + commons-lang3 + 3.0 + compile + + + commons-io + commons-io + 2.5 + compile + + + diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 0296c83a..00000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'FabledSkyblock' \ No newline at end of file diff --git a/src/main/java/com/songoda/skyblock/SkyBlock.java b/src/main/java/com/songoda/skyblock/SkyBlock.java index e5d78d73..8e985680 100644 --- a/src/main/java/com/songoda/skyblock/SkyBlock.java +++ b/src/main/java/com/songoda/skyblock/SkyBlock.java @@ -1,5 +1,15 @@ package com.songoda.skyblock; +import java.io.File; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.event.HandlerList; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; + import com.songoda.skyblock.api.SkyBlockAPI; import com.songoda.skyblock.ban.BanManager; import com.songoda.skyblock.biome.BiomeManager; @@ -16,7 +26,28 @@ import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.leaderboard.LeaderboardManager; import com.songoda.skyblock.levelling.rework.IslandLevelManager; import com.songoda.skyblock.limit.LimitationInstanceHandler; -import com.songoda.skyblock.listeners.*; +import com.songoda.skyblock.listeners.Block; +import com.songoda.skyblock.listeners.Bucket; +import com.songoda.skyblock.listeners.Chat; +import com.songoda.skyblock.listeners.Death; +import com.songoda.skyblock.listeners.Entity; +import com.songoda.skyblock.listeners.EpicSpawners; +import com.songoda.skyblock.listeners.Food; +import com.songoda.skyblock.listeners.Grow; +import com.songoda.skyblock.listeners.Interact; +import com.songoda.skyblock.listeners.Inventory; +import com.songoda.skyblock.listeners.Item; +import com.songoda.skyblock.listeners.Join; +import com.songoda.skyblock.listeners.Move; +import com.songoda.skyblock.listeners.Portal; +import com.songoda.skyblock.listeners.Projectile; +import com.songoda.skyblock.listeners.Quit; +import com.songoda.skyblock.listeners.Respawn; +import com.songoda.skyblock.listeners.Spawner; +import com.songoda.skyblock.listeners.Teleport; +import com.songoda.skyblock.listeners.UltimateStacker; +import com.songoda.skyblock.listeners.WildStacker; +import com.songoda.skyblock.localization.LocalizationManager; import com.songoda.skyblock.menus.Rollback; import com.songoda.skyblock.menus.admin.Creator; import com.songoda.skyblock.menus.admin.Generator; @@ -38,17 +69,6 @@ import com.songoda.skyblock.world.WorldManager; import com.songoda.skyblock.world.generator.VoidGenerator; import com.songoda.update.Plugin; import com.songoda.update.SongodaUpdate; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.java.JavaPlugin; - -import java.io.File; -import java.util.UUID; public class SkyBlock extends JavaPlugin { @@ -78,6 +98,7 @@ public class SkyBlock extends JavaPlugin { private EconomyManager economyManager; private HologramManager hologramManager; private LimitationInstanceHandler limitationHandler; + private LocalizationManager localizationManager; public static SkyBlock getInstance() { return instance; @@ -94,6 +115,7 @@ public class SkyBlock extends JavaPlugin { instance = this; fileManager = new FileManager(this); + localizationManager = new LocalizationManager(); worldManager = new WorldManager(this); userCacheManager = new UserCacheManager(this); economyManager = new EconomyManager(); @@ -105,8 +127,7 @@ public class SkyBlock extends JavaPlugin { cooldownManager = new CooldownManager(this); limitationHandler = new LimitationInstanceHandler(); - if (fileManager.getConfig(new File(getDataFolder(), "config.yml")).getFileConfiguration() - .getBoolean("Island.Scoreboard.Enable")) { + if (fileManager.getConfig(new File(getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Scoreboard.Enable")) { scoreboardManager = new ScoreboardManager(this); } @@ -117,13 +138,11 @@ public class SkyBlock extends JavaPlugin { structureManager = new StructureManager(this); soundManager = new SoundManager(this); - if (fileManager.getConfig(new File(getDataFolder(), "config.yml")).getFileConfiguration() - .getBoolean("Island.Generator.Enable")) { + if (fileManager.getConfig(new File(getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Generator.Enable")) { generatorManager = new GeneratorManager(this); } - if (fileManager.getConfig(new File(getDataFolder(), "config.yml")).getFileConfiguration() - .getBoolean("Island.Stackable.Enable")) { + if (fileManager.getConfig(new File(getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Stackable.Enable")) { stackableManager = new StackableManager(this); Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> stackableManager.loadSavedStackables(), 5L); } @@ -160,12 +179,9 @@ public class SkyBlock extends JavaPlugin { pluginManager.registerEvents(new Food(this), this); pluginManager.registerEvents(new Grow(this), this); - if (pluginManager.isPluginEnabled("EpicSpawners")) - pluginManager.registerEvents(new EpicSpawners(this), this); - if (pluginManager.isPluginEnabled("WildStacker")) - pluginManager.registerEvents(new WildStacker(this), this); - if (pluginManager.isPluginEnabled("UltimateStacker")) - pluginManager.registerEvents(new UltimateStacker(this), this); + if (pluginManager.isPluginEnabled("EpicSpawners")) pluginManager.registerEvents(new EpicSpawners(this), this); + if (pluginManager.isPluginEnabled("WildStacker")) pluginManager.registerEvents(new WildStacker(this), this); + if (pluginManager.isPluginEnabled("UltimateStacker")) pluginManager.registerEvents(new UltimateStacker(this), this); pluginManager.registerEvents(new Rollback(), this); pluginManager.registerEvents(new Levelling(), this); @@ -335,4 +351,8 @@ public class SkyBlock extends JavaPlugin { public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { return new VoidGenerator(); } + + public LocalizationManager getLocalizationManager() { + return localizationManager; + } } diff --git a/src/main/java/com/songoda/skyblock/blockscanner/BlockScanner.java b/src/main/java/com/songoda/skyblock/blockscanner/BlockScanner.java index f0bebbeb..55314a0f 100644 --- a/src/main/java/com/songoda/skyblock/blockscanner/BlockScanner.java +++ b/src/main/java/com/songoda/skyblock/blockscanner/BlockScanner.java @@ -1,5 +1,6 @@ package com.songoda.skyblock.blockscanner; +import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; @@ -12,6 +13,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChunkSnapshot; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.scheduler.BukkitRunnable; import com.google.common.collect.Lists; @@ -55,10 +58,14 @@ public final class BlockScanner extends BukkitRunnable { private final Queue blocks; private final ScannerTasks tasks; + private int scanY; + private BlockScanner(Map> snapshots, ScannerTasks tasks) { this.blocks = new ConcurrentLinkedQueue<>(); this.tasks = tasks; + FileConfiguration config = SkyBlock.getInstance().getFileManager().getConfig(new File(SkyBlock.getInstance().getDataFolder(), "config.yml")).getFileConfiguration(); + int threadCount = 0; for (Entry> entry : snapshots.entrySet()) { @@ -67,16 +74,37 @@ public final class BlockScanner extends BukkitRunnable { threadCount += parts.size(); + World world = entry.getKey(); + final String env; + + switch (world.getEnvironment()) { + case NETHER: + env = "Nether"; + break; + case THE_END: + env = "End"; + break; + default: + env = "Normal"; + break; + } + + final ConfigurationSection liquidSection = config.getConfigurationSection("Island.World." + env + ".Liquid"); + + System.out.println("LiquidSection: " + liquidSection); + for (List sub : parts) { - queueWork(entry.getKey(), sub); + queueWork(world, liquidSection.getBoolean("Enable") ? liquidSection.getInt("Height") + 1 : 0, sub); } } - + this.threadCount = threadCount; } - private void queueWork(World world, List subList) { + private void queueWork(World world, int scanY, List subList) { + + Bukkit.getServer().getScheduler().runTaskAsynchronously(SkyBlock.getInstance(), () -> { for (ChunkSnapshot shot : subList) { @@ -85,7 +113,7 @@ public final class BlockScanner extends BukkitRunnable { for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { - for (int y = 0; y < 256; y++) { + for (int y = scanY; y < 256; y++) { final Material type = VERSION > 12 ? shot.getBlockType(x, y, z) : MaterialIDHelper.getLegacyMaterial(getBlockTypeID(shot, x, y, z)); diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java index 23535649..373820f9 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java @@ -42,10 +42,8 @@ public class ReloadCommand extends SubCommand { FileManager fileManager = skyblock.getFileManager(); messageManager.sendMessage(sender, - "&cPlease note that this command is not supported and may " + "cause issues that could put the plugin in an unstable state. " - + "If you encounter any issues please stop your server, edit the configuration files, " - + "and then start your server again. This command does NOT reload all the plugin files, only " - + "the config.yml, language.yml, generators.yml, levelling.yml, and limits.yml."); + "&cPlease note that this command is not supported and may " + "cause issues that could put the plugin in an unstable state. " + "If you encounter any issues please stop your server, edit the configuration files, " + + "and then start your server again. This command does NOT reload all the plugin files, only " + "the config.yml, language.yml, generators.yml, levelling.yml, and limits.yml."); Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); FileConfiguration configLoad = config.getFileConfiguration(); @@ -95,6 +93,7 @@ public class ReloadCommand extends SubCommand { }); limitHandler.reloadAll(); + skyblock.getLocalizationManager().reloadAll(); MenuClickRegistry.getInstance().reloadAll(); messageManager.sendMessage(sender, configLoad.getString("Command.Island.Admin.Reload.Reloaded.Message")); diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java index a2789855..d633f768 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java @@ -9,7 +9,8 @@ import com.songoda.skyblock.hologram.HologramType; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.sound.SoundManager; import com.songoda.skyblock.utils.version.Sounds; -import org.apache.commons.lang3.text.WordUtils; + +import org.apache.commons.lang.WordUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; @@ -44,15 +45,15 @@ public class RemoveHologramCommand extends SubCommand { HologramType hologramType = null; switch (args[0].toLowerCase()) { - case "level": - hologramType = HologramType.Level; - break; - case "bank": - hologramType = HologramType.Bank; - break; - case "votes": - hologramType = HologramType.Votes; - break; + case "level": + hologramType = HologramType.Level; + break; + case "bank": + hologramType = HologramType.Bank; + break; + case "votes": + hologramType = HologramType.Votes; + break; } if (hologramType != null) { @@ -60,8 +61,7 @@ public class RemoveHologramCommand extends SubCommand { FileConfiguration locationsConfigLoad = locationsConfig.getFileConfiguration(); if (locationsConfigLoad.getString("Location.Hologram.Leaderboard." + hologramType.name()) == null) { - messageManager.sendMessage(sender, - configLoad.getString("Command.Island.Admin.RemoveHologram.Set.Message")); + messageManager.sendMessage(sender, configLoad.getString("Command.Island.Admin.RemoveHologram.Set.Message")); soundManager.playSound(sender, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); } else { locationsConfigLoad.set("Location.Hologram.Leaderboard." + hologramType.name(), null); @@ -73,8 +73,7 @@ public class RemoveHologramCommand extends SubCommand { } Bukkit.getServer().getScheduler().runTask(skyblock, () -> { - HologramType hologramType1 = HologramType - .valueOf(WordUtils.capitalize(args[0].toLowerCase())); + HologramType hologramType1 = HologramType.valueOf(WordUtils.capitalize(args[0].toLowerCase())); Hologram hologram = hologramManager.getHologram(hologramType1); if (hologram != null) { @@ -82,9 +81,7 @@ public class RemoveHologramCommand extends SubCommand { } }); - messageManager.sendMessage(sender, - configLoad.getString("Command.Island.Admin.RemoveHologram.Removed.Message") - .replace("%type", hologramType.name())); + messageManager.sendMessage(sender, configLoad.getString("Command.Island.Admin.RemoveHologram.Removed.Message").replace("%type", hologramType.name())); soundManager.playSound(sender, Sounds.NOTE_PLING.bukkitSound(), 1.0F, 1.0F); } @@ -113,6 +110,6 @@ public class RemoveHologramCommand extends SubCommand { @Override public String[] getArguments() { - return new String[]{"level", "bank", "votes"}; + return new String[] { "level", "bank", "votes" }; } } diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java index fe29fc36..4f705231 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java @@ -9,7 +9,8 @@ import com.songoda.skyblock.hologram.HologramType; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.sound.SoundManager; import com.songoda.skyblock.utils.version.Sounds; -import org.apache.commons.lang3.text.WordUtils; + +import org.apache.commons.lang.WordUtils; import org.bukkit.Bukkit; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.configuration.file.FileConfiguration; diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java index be606d18..3d22ed19 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java @@ -14,9 +14,11 @@ import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.stackable.Stackable; import com.songoda.skyblock.stackable.StackableManager; import com.songoda.skyblock.utils.StringUtil; +import com.songoda.skyblock.utils.version.Materials; public class StackableCommand extends SubCommand { + @SuppressWarnings("deprecation") @Override public void onCommandByPlayer(Player player, String[] args) { final MessageManager messageManager = skyblock.getMessageManager(); @@ -52,14 +54,15 @@ public class StackableCommand extends SubCommand { } final StackableManager stackableManager = skyblock.getStackableManager(); + final Materials type = Materials.getMaterials(block.getType(), block.getData()); - if (!stackableManager.isStackableMaterial(block.getType())) { + if (!stackableManager.isStackableMaterial(type)) { messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Target.Unstackable")); return; } final Location loc = block.getLocation(); - Stackable stack = stackableManager.getStack(loc, block.getType()); + Stackable stack = stackableManager.getStack(loc, type); if (amount <= 1) { messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Target.Remove-Stack")); @@ -70,7 +73,7 @@ public class StackableCommand extends SubCommand { final int oldSize; if (stack == null) { - stack = new Stackable(loc, block.getType()); + stack = new Stackable(loc, type); stackableManager.addStack(stack); oldSize = 0; } else { diff --git a/src/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java index 3263a7fa..40f66bc4 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java @@ -159,15 +159,7 @@ public class AcceptCommand extends SubCommand { "Scoreboard.Island.Team.Occupied.Displaylines")); } - Map displayVariables = new HashMap<>(); - displayVariables.put("%owner", - configLoad.getString("Scoreboard.Island.Team.Word.Owner")); - displayVariables.put("%operator", configLoad - .getString("Scoreboard.Island.Team.Word.Operator")); - displayVariables.put("%member", - configLoad.getString("Scoreboard.Island.Team.Word.Member")); - - scoreboard.setDisplayVariables(displayVariables); + scoreboard.run(); } } @@ -189,15 +181,7 @@ public class AcceptCommand extends SubCommand { configLoad.getStringList("Scoreboard.Island.Team.Occupied.Displaylines")); } - Map displayVariables = new HashMap<>(); - displayVariables.put("%owner", - configLoad.getString("Scoreboard.Island.Team.Word.Owner")); - displayVariables.put("%operator", - configLoad.getString("Scoreboard.Island.Team.Word.Operator")); - displayVariables.put("%member", - configLoad.getString("Scoreboard.Island.Team.Word.Member")); - scoreboard.setDisplayVariables(displayVariables); scoreboard.run(); } } diff --git a/src/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java index f3f55aa8..b3b0ec65 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java @@ -30,7 +30,6 @@ public class UpgradeCommand extends SubCommand { if (!skyblock.getEconomyManager().isEconomy()) { messageManager.sendMessage(player, configLoad.getString("Command.Island.Upgrade.Disabled.Message")); soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); - return; } diff --git a/src/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java index 7992e63a..89841913 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java @@ -10,7 +10,8 @@ import com.songoda.skyblock.utils.NumberUtil; import com.songoda.skyblock.utils.version.Materials; import com.songoda.skyblock.utils.version.NMSUtil; import com.songoda.skyblock.utils.version.Sounds; -import org.apache.commons.lang3.text.WordUtils; + +import org.apache.commons.lang.WordUtils; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; diff --git a/src/main/java/com/songoda/skyblock/config/FileChecker.java b/src/main/java/com/songoda/skyblock/config/FileChecker.java index aeba61f4..334de872 100644 --- a/src/main/java/com/songoda/skyblock/config/FileChecker.java +++ b/src/main/java/com/songoda/skyblock/config/FileChecker.java @@ -1,9 +1,5 @@ package com.songoda.skyblock.config; -import com.songoda.skyblock.SkyBlock; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - import java.io.IOException; import java.io.InputStreamReader; import java.util.EnumMap; @@ -11,29 +7,29 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import com.songoda.skyblock.SkyBlock; + public class FileChecker { private final FileManager fileManager; private Map loadedFiles; - public FileChecker(SkyBlock skyblock, FileManager fileManager, String configurationFileName, - boolean applyComments) { + public FileChecker(SkyBlock skyblock, FileManager fileManager, String configurationFileName, boolean applyComments) { this.fileManager = fileManager; loadedFiles = new EnumMap<>(File.Type.class); java.io.File configFile = new java.io.File(skyblock.getDataFolder(), configurationFileName); - loadedFiles.put(File.Type.CREATED, - new File(fileManager, configFile, YamlConfiguration.loadConfiguration(configFile))); + loadedFiles.put(File.Type.CREATED, new File(fileManager, configFile, YamlConfiguration.loadConfiguration(configFile))); if (applyComments) { - loadedFiles.put(File.Type.RESOURCE, - new File(null, null, YamlConfiguration.loadConfiguration(new InputStreamReader(fileManager - .getConfigContent(new InputStreamReader(skyblock.getResource(configurationFileName))))))); + loadedFiles.put(File.Type.RESOURCE, new File(null, null, YamlConfiguration.loadConfiguration(new InputStreamReader(fileManager.getConfigContent(new InputStreamReader(skyblock.getResource(configurationFileName))))))); } else { - loadedFiles.put(File.Type.RESOURCE, new File(null, null, YamlConfiguration - .loadConfiguration(new InputStreamReader(skyblock.getResource(configurationFileName))))); + loadedFiles.put(File.Type.RESOURCE, new File(null, null, YamlConfiguration.loadConfiguration(new InputStreamReader(skyblock.getResource(configurationFileName))))); } } @@ -103,8 +99,7 @@ public class FileChecker { configKeys = new HashMap<>(); if (configFile != null && configFile.getName().equals("config.yml")) { - this.configLoad = YamlConfiguration - .loadConfiguration(new InputStreamReader(fileManager.getConfigContent(configFile))); + this.configLoad = YamlConfiguration.loadConfiguration(new InputStreamReader(fileManager.getConfigContent(configFile))); } } @@ -125,7 +120,8 @@ public class FileChecker { } public enum Type { - CREATED, RESOURCE + CREATED, + RESOURCE } } } diff --git a/src/main/java/com/songoda/skyblock/config/FileManager.java b/src/main/java/com/songoda/skyblock/config/FileManager.java index 0ddf9abe..d013732c 100644 --- a/src/main/java/com/songoda/skyblock/config/FileManager.java +++ b/src/main/java/com/songoda/skyblock/config/FileManager.java @@ -1,15 +1,18 @@ package com.songoda.skyblock.config; -import com.google.common.io.ByteStreams; -import com.songoda.skyblock.SkyBlock; -import com.songoda.skyblock.island.IslandWorld; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.*; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.Reader; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.LinkedHashMap; @@ -17,6 +20,16 @@ import java.util.Map; import java.util.Map.Entry; import java.util.logging.Level; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import com.google.common.io.ByteStreams; +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.island.IslandWorld; + public class FileManager { private final SkyBlock skyblock; @@ -32,13 +45,13 @@ public class FileManager { if (!skyblock.getDataFolder().exists()) { skyblock.getDataFolder().mkdir(); } - + File structureDirectory = new File(skyblock.getDataFolder().toString() + "/structures"); if (!structureDirectory.exists()) { structureDirectory.mkdir(); } - + // Will remain null unless WorldEdit is present. File schematicsDirectory = null; @@ -57,17 +70,16 @@ public class FileManager { configFiles.put("generators.yml", new File(skyblock.getDataFolder(), "generators.yml")); configFiles.put("stackables.yml", new File(skyblock.getDataFolder(), "stackables.yml")); configFiles.put("structures.yml", new File(skyblock.getDataFolder(), "structures.yml")); - configFiles.put("structures/default.structure", - new File(skyblock.getDataFolder().toString() + "/structures", "default.structure")); - + configFiles.put("structures/default.structure", new File(skyblock.getDataFolder().toString() + "/structures", "default.structure")); + File oldStructureFile = new File(skyblock.getDataFolder().toString() + "/structures", "default.structure"); oldStructureFile.delete(); for (Entry configEntry : configFiles.entrySet()) { - + String fileName = configEntry.getKey(); File configFile = configEntry.getValue(); - + if (fileName.equals("structures/default.structure")) { configFile.delete(); try { @@ -75,8 +87,7 @@ public class FileManager { } catch (IOException e) { e.printStackTrace(); } - try (InputStream is = skyblock.getResource(fileName); - OutputStream os = new FileOutputStream(configFile)) { + try (InputStream is = skyblock.getResource(fileName); OutputStream os = new FileOutputStream(configFile)) { ByteStreams.copy(is, os); } catch (IOException e) { e.printStackTrace(); @@ -85,8 +96,7 @@ public class FileManager { } if (configFile.exists()) { - if (fileName.equals("config.yml") || fileName.equals("language.yml") - || fileName.equals("settings.yml")) { + if (fileName.equals("config.yml") || fileName.equals("language.yml") || fileName.equals("settings.yml")) { FileChecker fileChecker; if (fileName.equals("config.yml")) { @@ -102,8 +112,7 @@ public class FileManager { } else { try { configFile.createNewFile(); - try (InputStream is = skyblock.getResource(fileName); - OutputStream os = new FileOutputStream(configFile)) { + try (InputStream is = skyblock.getResource(fileName); OutputStream os = new FileOutputStream(configFile)) { ByteStreams.copy(is, os); } @@ -119,12 +128,8 @@ public class FileManager { for (IslandWorld worldList : IslandWorld.values()) { if (mainConfigLoad.getString("World." + worldList.name()) != null) { - configLoad.set("World." + worldList.name() + ".nextAvailableLocation.x", - mainConfigLoad.getDouble( - "World." + worldList.name() + ".nextAvailableLocation.x")); - configLoad.set("World." + worldList.name() + ".nextAvailableLocation.z", - mainConfigLoad.getDouble( - "World." + worldList.name() + ".nextAvailableLocation.z")); + configLoad.set("World." + worldList.name() + ".nextAvailableLocation.x", mainConfigLoad.getDouble("World." + worldList.name() + ".nextAvailableLocation.x")); + configLoad.set("World." + worldList.name() + ".nextAvailableLocation.z", mainConfigLoad.getDouble("World." + worldList.name() + ".nextAvailableLocation.z")); } } @@ -135,8 +140,7 @@ public class FileManager { } } } catch (IOException ex) { - Bukkit.getServer().getLogger().log(Level.WARNING, - "SkyBlock | Error: Unable to create configuration file."); + Bukkit.getServer().getLogger().log(Level.WARNING, "SkyBlock | Error: Unable to create configuration file."); } } } @@ -229,8 +233,7 @@ public class FileManager { while ((currentLine = bufferedReader.readLine()) != null) { if (currentLine.contains("#")) { - addLine = currentLine.replace("[!]", "IMPORTANT").replace(":", "-").replaceFirst("#", - pluginName + "_COMMENT_" + commentNum + ":"); + addLine = currentLine.replace("[!]", "IMPORTANT").replace(":", "-").replaceFirst("#", pluginName + "_COMMENT_" + commentNum + ":"); whole.append(addLine + "\n"); commentNum++; } else { @@ -270,9 +273,7 @@ public class FileManager { for (String line : lines) { if (line.contains(skyblock.getDescription().getName() + "_COMMENT")) { - config.append(line.replace("IMPORTANT", "[!]").replace("\n", "") - .replace(skyblock.getDescription().getName() + "_COMMENT_", "#").replaceAll("[0-9]+:", "") - + "\n"); + config.append(line.replace("IMPORTANT", "[!]").replace("\n", "").replace(skyblock.getDescription().getName() + "_COMMENT_", "#").replaceAll("[0-9]+:", "") + "\n"); } else if (line.contains(":")) { config.append(line + "\n"); } @@ -301,8 +302,7 @@ public class FileManager { configFile = configPath; if (configPath.getName().equals("config.yml")) { - configLoad = YamlConfiguration - .loadConfiguration(new InputStreamReader(fileManager.getConfigContent(configFile))); + configLoad = YamlConfiguration.loadConfiguration(new InputStreamReader(fileManager.getConfigContent(configFile))); } else { configLoad = YamlConfiguration.loadConfiguration(configPath); } diff --git a/src/main/java/com/songoda/skyblock/economy/EconomyManager.java b/src/main/java/com/songoda/skyblock/economy/EconomyManager.java index eefc0136..cfa9443e 100644 --- a/src/main/java/com/songoda/skyblock/economy/EconomyManager.java +++ b/src/main/java/com/songoda/skyblock/economy/EconomyManager.java @@ -1,16 +1,18 @@ package com.songoda.skyblock.economy; -import com.songoda.skyblock.api.event.player.PlayerWithdrawMoneyEvent; -import net.milkbowl.vault.economy.Economy; -import net.milkbowl.vault.permission.Permission; -import net.tnemc.core.Reserve; -import net.tnemc.core.economy.EconomyAPI; +import java.math.BigDecimal; + import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.plugin.RegisteredServiceProvider; -import java.math.BigDecimal; +import com.songoda.skyblock.api.event.player.PlayerWithdrawMoneyEvent; + +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; +import net.tnemc.core.Reserve; +import net.tnemc.core.economy.EconomyAPI; public class EconomyManager { @@ -20,7 +22,7 @@ public class EconomyManager { // Reserve private EconomyAPI reserveEconomy = null; -// private PermissionsAPI reservePermission = null; + // private PermissionsAPI reservePermission = null; public EconomyManager() { setup(); @@ -30,27 +32,22 @@ public class EconomyManager { if (Bukkit.getServer().getPluginManager().getPlugin("Vault") != null) { RegisteredServiceProvider economyRsp = Bukkit.getServer().getServicesManager().getRegistration(Economy.class); - if (economyRsp != null) - this.vaultEconomy = economyRsp.getProvider(); + if (economyRsp != null) this.vaultEconomy = economyRsp.getProvider(); RegisteredServiceProvider permissionRsp = Bukkit.getServer().getServicesManager().getRegistration(Permission.class); - if (permissionRsp != null) - this.vaultPermission = permissionRsp.getProvider(); + if (permissionRsp != null) this.vaultPermission = permissionRsp.getProvider(); } else if (Bukkit.getServer().getPluginManager().getPlugin("Reserve") != null) { - if (Reserve.instance().economyProvided()) - this.reserveEconomy = Reserve.instance().economy(); + if (Reserve.instance().economyProvided()) this.reserveEconomy = Reserve.instance().economy(); -// if (Reserve.instance().permissionsProvided()) -// this.reservePermission = Reserve.instance().permissions(); + // if (Reserve.instance().permissionsProvided()) + // this.reservePermission = Reserve.instance().permissions(); } } public double getBalance(Player player) { - if (this.vaultEconomy != null) - return this.vaultEconomy.getBalance(player); + if (this.vaultEconomy != null) return this.vaultEconomy.getBalance(player); - if (this.reserveEconomy != null) - return this.reserveEconomy.getHoldings(player.getUniqueId()).doubleValue(); + if (this.reserveEconomy != null) return this.reserveEconomy.getHoldings(player.getUniqueId()).doubleValue(); return 0; } @@ -60,30 +57,25 @@ public class EconomyManager { } public void withdraw(Player player, double money) { - if (this.vaultEconomy != null) - this.vaultEconomy.withdrawPlayer(player, money); - else if (this.reserveEconomy != null) - this.reserveEconomy.removeHoldings(player.getUniqueId(), new BigDecimal(money)); + if (this.vaultEconomy != null) this.vaultEconomy.withdrawPlayer(player, money); + else if (this.reserveEconomy != null) this.reserveEconomy.removeHoldings(player.getUniqueId(), new BigDecimal(money)); Bukkit.getServer().getPluginManager().callEvent(new PlayerWithdrawMoneyEvent(player, money)); } public void deposit(Player player, double money) { - if (this.vaultEconomy != null) - this.vaultEconomy.depositPlayer(player, money); - else if (this.reserveEconomy != null) - this.reserveEconomy.addHoldings(player.getUniqueId(), new BigDecimal(money)); + if (this.vaultEconomy != null) this.vaultEconomy.depositPlayer(player, money); + else if (this.reserveEconomy != null) this.reserveEconomy.addHoldings(player.getUniqueId(), new BigDecimal(money)); Bukkit.getServer().getPluginManager().callEvent(new PlayerWithdrawMoneyEvent(player, money)); } public boolean hasPermission(String world, OfflinePlayer offlinePlayer, String perm) { - if (this.vaultPermission != null) - return this.vaultPermission.playerHas(world, offlinePlayer, perm); + if (this.vaultPermission != null) return this.vaultPermission.playerHas(world, offlinePlayer, perm); -// if (this.reservePermission != null) { -// // TODO -// } + // if (this.reservePermission != null) { + // // TODO + // } return false; } @@ -93,6 +85,6 @@ public class EconomyManager { } public boolean isPermission() { - return this.vaultPermission != null/* || this.reservePermission != null*/; + return this.vaultPermission != null/* || this.reservePermission != null */; } } diff --git a/src/main/java/com/songoda/skyblock/island/Island.java b/src/main/java/com/songoda/skyblock/island/Island.java index d9f3f47d..4763028f 100644 --- a/src/main/java/com/songoda/skyblock/island/Island.java +++ b/src/main/java/com/songoda/skyblock/island/Island.java @@ -755,13 +755,13 @@ public class Island { Config config = fileManager .getConfig(new File(skyblock.getDataFolder().toString() + "/island-data", ownerUUID.toString() + ".yml")); - + try { config.getFileConfiguration().save(config.getFile()); } catch (IOException e) { e.printStackTrace(); } - + config = fileManager .getConfig(new File(skyblock.getDataFolder().toString() + "/setting-data", ownerUUID.toString() + ".yml")); FileConfiguration configLoad = config.getFileConfiguration(); diff --git a/src/main/java/com/songoda/skyblock/island/IslandManager.java b/src/main/java/com/songoda/skyblock/island/IslandManager.java index 491fa8e2..c3a357ed 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandManager.java +++ b/src/main/java/com/songoda/skyblock/island/IslandManager.java @@ -25,7 +25,6 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.plugin.IllegalPluginAccessException; -import org.bukkit.scheduler.BukkitRunnable; import com.google.common.base.Preconditions; import com.songoda.skyblock.SkyBlock; @@ -236,7 +235,8 @@ public class IslandManager { Bukkit.getScheduler().runTaskAsynchronously(skyblock, () -> Bukkit.getServer().getPluginManager().callEvent(new IslandCreateEvent(island.getAPIWrapper(), player))); - skyblock.getPlayerDataManager().getPlayerData(player).setIsland(player.getUniqueId()); + data.setIsland(player.getUniqueId()); + data.setOwner(player.getUniqueId()); if (scoreboardManager != null) { Config languageConfig = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); @@ -639,12 +639,6 @@ public class IslandManager { scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Scoreboard.Island.Team.Displayname"))); scoreboard.setDisplayList(configLoad.getStringList("Scoreboard.Island.Team.Empty.Displaylines")); - HashMap displayVariables = new HashMap<>(); - displayVariables.put("%owner", configLoad.getString("Scoreboard.Island.Team.Word.Owner")); - displayVariables.put("%operator", configLoad.getString("Scoreboard.Island.Team.Word.Operator")); - displayVariables.put("%member", configLoad.getString("Scoreboard.Island.Team.Word.Member")); - - scoreboard.setDisplayVariables(displayVariables); scoreboard.run(); } } catch (IllegalPluginAccessException e) { @@ -888,12 +882,7 @@ public class IslandManager { scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Scoreboard.Island.Team.Displayname"))); scoreboard.setDisplayList(configLoad.getStringList("Scoreboard.Island.Team.Occupied.Displaylines")); - HashMap displayVariables = new HashMap<>(); - displayVariables.put("%owner", configLoad.getString("Scoreboard.Island.Team.Word.Owner")); - displayVariables.put("%operator", configLoad.getString("Scoreboard.Island.Team.Word.Operator")); - displayVariables.put("%member", configLoad.getString("Scoreboard.Island.Team.Word.Member")); - scoreboard.setDisplayVariables(displayVariables); } scoreboard.run(); diff --git a/src/main/java/com/songoda/skyblock/levelling/rework/IslandLevelManager.java b/src/main/java/com/songoda/skyblock/levelling/rework/IslandLevelManager.java index e139049f..9291cec7 100644 --- a/src/main/java/com/songoda/skyblock/levelling/rework/IslandLevelManager.java +++ b/src/main/java/com/songoda/skyblock/levelling/rework/IslandLevelManager.java @@ -3,14 +3,18 @@ package com.songoda.skyblock.levelling.rework; import java.io.File; import java.util.ArrayList; import java.util.EnumMap; +import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.block.CreatureSpawner; import org.bukkit.configuration.Configuration; import org.bukkit.configuration.ConfigurationSection; @@ -33,6 +37,20 @@ import com.songoda.skyblock.utils.version.NMSUtil; public final class IslandLevelManager { + private static final Set CHECKED_DOUBLE_TYPES; + + static { + CHECKED_DOUBLE_TYPES = EnumSet.noneOf(Materials.class); + + CHECKED_DOUBLE_TYPES.add(Materials.SUNFLOWER); + CHECKED_DOUBLE_TYPES.add(Materials.LILAC); + CHECKED_DOUBLE_TYPES.add(Materials.LEGACY_DOUBLE_PLANT); + CHECKED_DOUBLE_TYPES.add(Materials.LARGE_FERN); + CHECKED_DOUBLE_TYPES.add(Materials.ROSE_BUSH); + CHECKED_DOUBLE_TYPES.add(Materials.PEONY); + CHECKED_DOUBLE_TYPES.add(Materials.TALL_GRASS); + } + private final static int VERSION = NMSUtil.getVersionNumber(); private Map inScan; private Map worth; @@ -46,6 +64,16 @@ public final class IslandLevelManager { reloadWorth(); } + public static boolean isDoubleCheckedBlock(Block block) { + return CHECKED_DOUBLE_TYPES.contains(parseType(block)); + } + + @SuppressWarnings("deprecation") + private static Materials parseType(Block block) { + final Material blockType = block.getType(); + return VERSION > 12 ? Materials.fromString(blockType.name()) : Materials.requestMaterials(blockType.name(), block.getData()); + } + public void startScan(Player attemptScanner, Island island) { if (!Bukkit.isPrimaryThread()) { @@ -103,7 +131,7 @@ public final class IslandLevelManager { final Materials material = Materials.fromString(key); - if (material.isAvailable() || material.getPostItem() == null) continue; + if (material == null || !material.isAvailable()) continue; worth.put(material, current.getLong("Points")); } @@ -151,23 +179,42 @@ public final class IslandLevelManager { private static final AmountMaterialPair EMPTY = new AmountMaterialPair(null, 0); - @SuppressWarnings("deprecation") - public AmountMaterialPair getAmountAndType(BlockInfo info) { + AmountMaterialPair getAmountAndType(IslandScan scan, BlockInfo info) { - final Block block = info.getWorld().getBlockAt(info.getX(), info.getY(), info.getZ()); - final Material blockType = block.getType(); + Block block = info.getWorld().getBlockAt(info.getX(), info.getY(), info.getZ()); + Material blockType = block.getType(); if (blockType == Material.AIR) return EMPTY; - Materials finalType = VERSION > 12 ? Materials.fromString(blockType.name()) : Materials.requestMaterials(blockType.name(), block.getData()); + Materials finalType = parseType(block); if (finalType == null) return EMPTY; - if (finalType == Materials.SPAWNER) finalType = Materials.getSpawner(((CreatureSpawner) block.getState()).getSpawnedType()); + + final Location blockLocation = block.getLocation(); + + if (scan.getDoubleBlocks().contains(blockLocation)) return EMPTY; + + if (CHECKED_DOUBLE_TYPES.contains(finalType)) { + + final Block belowBlock = block.getRelative(BlockFace.DOWN); + final Materials belowType = parseType(belowBlock); + + if (CHECKED_DOUBLE_TYPES.contains(belowType)) { + block = belowBlock; + blockType = belowType.parseMaterial(); + scan.getDoubleBlocks().add(belowBlock.getLocation()); + } else { + scan.getDoubleBlocks().add(block.getRelative(BlockFace.UP).getLocation()); + } + + } else if (finalType == Materials.SPAWNER) { + finalType = Materials.getSpawner(((CreatureSpawner) block.getState()).getSpawnedType()); + } final List calculators = CalculatorRegistry.getCalculators(blockType); final StackableManager stackableManager = SkyBlock.getInstance().getStackableManager(); - final long stackSize = stackableManager == null ? 0 : stackableManager.getStackSizeOf(block.getLocation(), blockType); + final long stackSize = stackableManager == null ? 0 : stackableManager.getStackSizeOf(blockLocation, finalType); if (calculators == null) { diff --git a/src/main/java/com/songoda/skyblock/levelling/rework/IslandScan.java b/src/main/java/com/songoda/skyblock/levelling/rework/IslandScan.java index dd4a3e85..81c08f44 100644 --- a/src/main/java/com/songoda/skyblock/levelling/rework/IslandScan.java +++ b/src/main/java/com/songoda/skyblock/levelling/rework/IslandScan.java @@ -4,15 +4,18 @@ import java.io.File; import java.text.NumberFormat; import java.util.EnumMap; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Queue; +import java.util.Set; import java.util.stream.Collectors; import org.bukkit.Bukkit; import org.bukkit.ChunkSnapshot; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.configuration.Configuration; import org.bukkit.configuration.file.FileConfiguration; @@ -36,6 +39,7 @@ public final class IslandScan extends BukkitRunnable { private static final NumberFormat FORMATTER = NumberFormat.getInstance();; + private final Set doubleBlocks; private final Island island; private final Map amounts; private final Configuration config; @@ -51,14 +55,14 @@ public final class IslandScan extends BukkitRunnable { this.amounts = new EnumMap<>(Materials.class); this.config = SkyBlock.getInstance().getFileManager().getConfig(new File(SkyBlock.getInstance().getDataFolder(), "language.yml")).getFileConfiguration(); this.runEveryX = config.getInt("Command.Island.Level.Scanning.Progress.Display-Every-X-Scan"); + this.doubleBlocks = new HashSet<>(); } public IslandScan start() { final SkyBlock skyblock = SkyBlock.getInstance(); final FileConfiguration config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration(); - final FileConfiguration islandData = skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), this.island.getOwnerUUID().toString() + ".yml")).getFileConfiguration(); + final FileConfiguration islandData = skyblock.getFileManager().getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), this.island.getOwnerUUID().toString() + ".yml")).getFileConfiguration(); final boolean hasNether = config.getBoolean("Island.World.Nether.Enable") && islandData.getBoolean("Unlocked.Nether", false); final boolean hasEnd = config.getBoolean("Island.World.End.Enable") && islandData.getBoolean("Unlocked.End", false); @@ -109,7 +113,7 @@ public final class IslandScan extends BukkitRunnable { if (scanned == 8500) break; - final AmountMaterialPair pair = SkyBlock.getInstance().getLevellingManager().getAmountAndType(info); + final AmountMaterialPair pair = SkyBlock.getInstance().getLevellingManager().getAmountAndType(this, info); if (pair.getType() != null) { @@ -164,4 +168,8 @@ public final class IslandScan extends BukkitRunnable { snapshots.put(skyblock.getWorldManager().getWorld(world), ChunkUtil.getChunksToScan(island, world).stream().map(org.bukkit.Chunk::getChunkSnapshot).collect(Collectors.toList())); } + public Set getDoubleBlocks() { + return doubleBlocks; + } + } diff --git a/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java index d7f1ed45..04d1f5ce 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -7,7 +7,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.lang.WordUtils; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -85,22 +85,27 @@ public class Block implements Listener { if (!islandManager.hasPermission(player, blockLocation, "Destroy")) { event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } if (stackableManager != null && stackableManager.isStacked(blockLocation)) { - Stackable stackable = stackableManager.getStack(block.getLocation(), block.getType()); + Stackable stackable = stackableManager.getStack(block.getLocation(), Materials.getMaterials(block.getType(), block.getData())); if (stackable != null) { Material material = block.getType(); byte data = block.getData(); int droppedAmount = 0; if (event.getPlayer().isSneaking()) { - droppedAmount = stackable.getSize(); - block.getWorld().dropItemNaturally(blockLocation.clone().add(0.5, 0.5, 0.5), new ItemStack(material, droppedAmount, block.getData())); + Location dropLoc = blockLocation.clone().add(0.5, 0.5, 0.5); + int count = stackable.getSize(); + droppedAmount = count; + while (count > 64) { + dropLoc.getWorld().dropItemNaturally(dropLoc, new ItemStack(material, 64, data)); + count -= 64; + } + dropLoc.getWorld().dropItemNaturally(dropLoc, new ItemStack(material, count, block.getData())); block.setType(Material.AIR); stackable.setSize(0); } else { @@ -146,14 +151,23 @@ public class Block implements Listener { || LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone())) { if (configLoad.getBoolean("Island.Spawn.Protection")) { event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.SpawnProtection.Break.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.SpawnProtection.Break.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } if (event.isCancelled() || !configLoad.getBoolean("Island.Block.Level.Enable")) return; + if (IslandLevelManager.isDoubleCheckedBlock(block)) { + + final org.bukkit.block.Block belowBlock = block.getRelative(BlockFace.DOWN); + + if (IslandLevelManager.isDoubleCheckedBlock(belowBlock)) { + block = belowBlock; + } + + } + final Materials materials; if (block.getType() == Materials.SPAWNER.parseMaterial()) { @@ -189,7 +203,7 @@ public class Block implements Listener { if (!worldManager.isIslandWorld(block.getWorld())) return; Location blockLoc = block.getLocation(); - + Island island = islandManager.getIslandAtLocation(blockLoc); if (island == null) { @@ -198,24 +212,23 @@ public class Block implements Listener { } if (levellingManager.isScanning(island)) { - skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Command.Island.Level.Scanning.BlockPlacing.Message")); + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Command.Island.Level.Scanning.BlockPlacing.Message")); event.setCancelled(true); return; } if (!islandManager.hasPermission(player, blockLoc, "Place")) { event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } - + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); FileConfiguration configLoad = config.getFileConfiguration(); IslandWorld world = worldManager.getIslandWorld(block.getWorld()); - + if (configLoad.getBoolean("Island.WorldBorder.Block") && block.getType() == Material.DISPENSER) { if (!islandManager.isLocationAtIsland(island, blockLoc, world)) { event.setCancelled(true); @@ -238,8 +251,7 @@ public class Block implements Listener { } if (isObstructing) { - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.SpawnProtection.Place.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.SpawnProtection.Place.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); event.setCancelled(true); @@ -254,9 +266,8 @@ public class Block implements Listener { if (limits.isBlockLimitExceeded(player, block, limit)) { Materials material = Materials.getMaterials(block.getType(), block.getData()); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") - .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))).replace("%limit", NumberUtil.formatNumber(limit))); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") + .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))).replace("%limit", NumberUtil.formatNumber(limit))); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); event.setCancelled(true); @@ -338,8 +349,8 @@ public class Block implements Listener { // Filter valid players on the island Set possiblePlayers = new HashSet<>(); for (Player p : Bukkit.getOnlinePlayers()) { - boolean isMember = island.hasRole(IslandRole.Owner, p.getUniqueId()) || island.hasRole(IslandRole.Member, p.getUniqueId()) - || island.hasRole(IslandRole.Coop, p.getUniqueId()) || island.hasRole(IslandRole.Operator, p.getUniqueId()); + boolean isMember = island.hasRole(IslandRole.Owner, p.getUniqueId()) || island.hasRole(IslandRole.Member, p.getUniqueId()) || island.hasRole(IslandRole.Coop, p.getUniqueId()) + || island.hasRole(IslandRole.Operator, p.getUniqueId()); if (isMember && islandManager.isLocationAtIsland(island, p.getLocation(), world)) { possiblePlayers.add(p); } @@ -387,8 +398,7 @@ public class Block implements Listener { IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); for (org.bukkit.block.Block block : event.getBlocks()) { - if (!islandManager.isLocationAtIsland(island, block.getLocation(), world) - || !islandManager.isLocationAtIsland(island, block.getRelative(event.getDirection()).getLocation(), world)) { + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world) || !islandManager.isLocationAtIsland(island, block.getRelative(event.getDirection()).getLocation(), world)) { event.setCancelled(true); return; } @@ -513,8 +523,7 @@ public class Block implements Listener { // Check ice/snow forming if (block.getType() == Material.ICE || block.getType() == Material.SNOW) { - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Weather.IceAndSnow")) - event.setCancelled(true); + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Weather.IceAndSnow")) event.setCancelled(true); return; } @@ -550,8 +559,8 @@ public class Block implements Listener { // Filter valid players on the island. Set possiblePlayers = new HashSet<>(); for (Player player : Bukkit.getOnlinePlayers()) { - boolean isMember = island.hasRole(IslandRole.Owner, player.getUniqueId()) || island.hasRole(IslandRole.Member, player.getUniqueId()) - || island.hasRole(IslandRole.Coop, player.getUniqueId()) || island.hasRole(IslandRole.Operator, player.getUniqueId()); + boolean isMember = island.hasRole(IslandRole.Owner, player.getUniqueId()) || island.hasRole(IslandRole.Member, player.getUniqueId()) || island.hasRole(IslandRole.Coop, player.getUniqueId()) + || island.hasRole(IslandRole.Operator, player.getUniqueId()); if (isMember && islandManager.isLocationAtIsland(island, player.getLocation(), world)) { possiblePlayers.add(player); } diff --git a/src/main/java/com/songoda/skyblock/listeners/Interact.java b/src/main/java/com/songoda/skyblock/listeners/Interact.java index 08edf155..3458ce02 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Interact.java +++ b/src/main/java/com/songoda/skyblock/listeners/Interact.java @@ -1,26 +1,8 @@ package com.songoda.skyblock.listeners; -import com.songoda.skyblock.SkyBlock; -import com.songoda.skyblock.config.FileManager; -import com.songoda.skyblock.island.Island; -import com.songoda.skyblock.island.IslandLevel; -import com.songoda.skyblock.island.IslandManager; -import com.songoda.skyblock.island.IslandWorld; -import com.songoda.skyblock.levelling.rework.IslandLevelManager; -import com.songoda.skyblock.limit.impl.BlockLimitation; -import com.songoda.skyblock.message.MessageManager; -import com.songoda.skyblock.sound.SoundManager; -import com.songoda.skyblock.stackable.Stackable; -import com.songoda.skyblock.stackable.StackableManager; -import com.songoda.skyblock.utils.NumberUtil; -import com.songoda.skyblock.utils.item.InventoryUtil; -import com.songoda.skyblock.utils.structure.StructureUtil; -import com.songoda.skyblock.utils.version.Materials; -import com.songoda.skyblock.utils.version.NMSUtil; -import com.songoda.skyblock.utils.version.Sounds; -import com.songoda.skyblock.world.WorldManager; +import java.io.File; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.lang.WordUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -46,7 +28,25 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; -import java.io.File; +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.config.FileManager; +import com.songoda.skyblock.island.Island; +import com.songoda.skyblock.island.IslandLevel; +import com.songoda.skyblock.island.IslandManager; +import com.songoda.skyblock.island.IslandWorld; +import com.songoda.skyblock.levelling.rework.IslandLevelManager; +import com.songoda.skyblock.limit.impl.BlockLimitation; +import com.songoda.skyblock.message.MessageManager; +import com.songoda.skyblock.sound.SoundManager; +import com.songoda.skyblock.stackable.Stackable; +import com.songoda.skyblock.stackable.StackableManager; +import com.songoda.skyblock.utils.NumberUtil; +import com.songoda.skyblock.utils.item.InventoryUtil; +import com.songoda.skyblock.utils.structure.StructureUtil; +import com.songoda.skyblock.utils.version.Materials; +import com.songoda.skyblock.utils.version.NMSUtil; +import com.songoda.skyblock.utils.version.Sounds; +import com.songoda.skyblock.world.WorldManager; public class Interact implements Listener { @@ -83,8 +83,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "DragonEggUse")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -93,8 +92,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Beacon")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -103,8 +101,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Storage")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -113,8 +110,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Place") || !islandManager.hasPermission(player, block.getLocation(), "Destroy")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -127,16 +123,25 @@ public class Interact implements Listener { if (!skyblock.getIslandManager().hasPermission(player, "Projectile")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } } if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { - if (stackableManager != null && stackableManager.isStackableMaterial(event.getMaterial()) && event.getClickedBlock().getType() == event.getMaterial() && !player.isSneaking() - && islandManager.hasPermission(player, block.getLocation(), "Place") + + final Materials blockType = Materials.getMaterials(event.getClickedBlock().getType(), event.getClickedBlock().getData()); + final Materials heldType; + final ItemStack item = event.getItem(); + + if (item != null && item.getType() != Material.AIR) { + heldType = Materials.getMaterials(event.getItem().getType(), (byte) event.getItem().getDurability()); + } else { + heldType = Materials.AIR; + } + + if (stackableManager != null && stackableManager.isStackableMaterial(heldType) && blockType == heldType && !player.isSneaking() && islandManager.hasPermission(player, block.getLocation(), "Place") && (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Stackable.RequirePermission") || player.hasPermission("fabledskyblock.stackable"))) { if (NMSUtil.getVersionNumber() > 8) { @@ -144,8 +149,8 @@ public class Interact implements Listener { } if (levellingManager.isScanning(island)) { - skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Command.Island.Level.Scanning.BlockPlacing.Message")); + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Command.Island.Level.Scanning.BlockPlacing.Message")); event.setCancelled(true); return; } @@ -157,9 +162,8 @@ public class Interact implements Listener { if (limits.isBlockLimitExceeded(player, block, limit)) { Materials material = Materials.getMaterials(block.getType(), block.getData()); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") - .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))).replace("%limit", NumberUtil.formatNumber(limit))); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") + .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))).replace("%limit", NumberUtil.formatNumber(limit))); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); event.setCancelled(true); @@ -167,11 +171,11 @@ public class Interact implements Listener { } Location location = event.getClickedBlock().getLocation(); - Stackable stackable = stackableManager.getStack(location, event.getMaterial()); + Stackable stackable = stackableManager.getStack(location, blockType); int itemAmount = event.getItem().getAmount(); if (stackable == null) { - stackableManager.addStack(stackable = new Stackable(location, event.getMaterial())); + stackableManager.addStack(stackable = new Stackable(location, blockType)); stackable.setSize(itemAmount + 1); } else { stackable.setSize(stackable.getSize() + itemAmount); @@ -182,7 +186,7 @@ public class Interact implements Listener { FileManager.Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); FileConfiguration configLoad = config.getFileConfiguration(); - + if (!configLoad.getBoolean("Island.Block.Level.Enable")) return; Materials materials = Materials.getMaterials(block.getType(), block.getData()); @@ -218,8 +222,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Destroy")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -228,26 +231,21 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Anvil")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } - } else if (block.getType() == Materials.LEGACY_BED_BLOCK.parseMaterial() || block.getType() == Materials.WHITE_BED.parseMaterial() - || block.getType() == Materials.ORANGE_BED.parseMaterial() || block.getType() == Materials.MAGENTA_BED.parseMaterial() - || block.getType() == Materials.LIGHT_BLUE_BED.parseMaterial() || block.getType() == Materials.YELLOW_BED.parseMaterial() + } else if (block.getType() == Materials.LEGACY_BED_BLOCK.parseMaterial() || block.getType() == Materials.WHITE_BED.parseMaterial() || block.getType() == Materials.ORANGE_BED.parseMaterial() + || block.getType() == Materials.MAGENTA_BED.parseMaterial() || block.getType() == Materials.LIGHT_BLUE_BED.parseMaterial() || block.getType() == Materials.YELLOW_BED.parseMaterial() || block.getType() == Materials.LIME_BED.parseMaterial() || block.getType() == Materials.PINK_BED.parseMaterial() || block.getType() == Materials.GRAY_BED.parseMaterial() - || block.getType() == Materials.LIGHT_GRAY_BED.parseMaterial() || block.getType() == Materials.CYAN_BED.parseMaterial() - || block.getType() == Materials.CYAN_BED.parseMaterial() || block.getType() == Materials.PURPLE_BED.parseMaterial() - || block.getType() == Materials.BLUE_BED.parseMaterial() || block.getType() == Materials.BROWN_BED.parseMaterial() - || block.getType() == Materials.GREEN_BED.parseMaterial() || block.getType() == Materials.RED_BED.parseMaterial() - || block.getType() == Materials.BLACK_BED.parseMaterial()) { + || block.getType() == Materials.LIGHT_GRAY_BED.parseMaterial() || block.getType() == Materials.CYAN_BED.parseMaterial() || block.getType() == Materials.CYAN_BED.parseMaterial() + || block.getType() == Materials.PURPLE_BED.parseMaterial() || block.getType() == Materials.BLUE_BED.parseMaterial() || block.getType() == Materials.BROWN_BED.parseMaterial() + || block.getType() == Materials.GREEN_BED.parseMaterial() || block.getType() == Materials.RED_BED.parseMaterial() || block.getType() == Materials.BLACK_BED.parseMaterial()) { if (!islandManager.hasPermission(player, block.getLocation(), "Bed")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -257,50 +255,43 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Brewing")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } - } else if (block.getType() == Material.CHEST || block.getType() == Material.TRAPPED_CHEST - || (NMSUtil.getVersionNumber() > 9 && (block.getType() == Materials.SHULKER_BOX.parseMaterial() || block.getType() == Materials.BLACK_SHULKER_BOX.parseMaterial() - || block.getType() == Materials.BLUE_SHULKER_BOX.parseMaterial() || block.getType() == Materials.BROWN_SHULKER_BOX.parseMaterial() - || block.getType() == Materials.CYAN_SHULKER_BOX.parseMaterial() || block.getType() == Materials.GRAY_SHULKER_BOX.parseMaterial() - || block.getType() == Materials.GREEN_SHULKER_BOX.parseMaterial() || block.getType() == Materials.LIGHT_BLUE_SHULKER_BOX.parseMaterial() - || block.getType() == Materials.LIGHT_GRAY_SHULKER_BOX.parseMaterial() || block.getType() == Materials.LIME_SHULKER_BOX.parseMaterial() - || block.getType() == Materials.MAGENTA_SHULKER_BOX.parseMaterial() || block.getType() == Materials.ORANGE_SHULKER_BOX.parseMaterial() - || block.getType() == Materials.PINK_SHULKER_BOX.parseMaterial() || block.getType() == Materials.PURPLE_SHULKER_BOX.parseMaterial() - || block.getType() == Materials.RED_SHULKER_BOX.parseMaterial() || block.getType() == Materials.WHITE_SHULKER_BOX.parseMaterial() - || block.getType() == Materials.YELLOW_SHULKER_BOX.parseMaterial()))) { - if (!islandManager.hasPermission(player, block.getLocation(), "Storage")) { - event.setCancelled(true); + } else if (block.getType() == Material.CHEST || block.getType() == Material.TRAPPED_CHEST || (NMSUtil.getVersionNumber() > 9 && (block.getType() == Materials.SHULKER_BOX.parseMaterial() + || block.getType() == Materials.BLACK_SHULKER_BOX.parseMaterial() || block.getType() == Materials.BLUE_SHULKER_BOX.parseMaterial() || block.getType() == Materials.BROWN_SHULKER_BOX.parseMaterial() + || block.getType() == Materials.CYAN_SHULKER_BOX.parseMaterial() || block.getType() == Materials.GRAY_SHULKER_BOX.parseMaterial() || block.getType() == Materials.GREEN_SHULKER_BOX.parseMaterial() + || block.getType() == Materials.LIGHT_BLUE_SHULKER_BOX.parseMaterial() || block.getType() == Materials.LIGHT_GRAY_SHULKER_BOX.parseMaterial() || block.getType() == Materials.LIME_SHULKER_BOX.parseMaterial() + || block.getType() == Materials.MAGENTA_SHULKER_BOX.parseMaterial() || block.getType() == Materials.ORANGE_SHULKER_BOX.parseMaterial() || block.getType() == Materials.PINK_SHULKER_BOX.parseMaterial() + || block.getType() == Materials.PURPLE_SHULKER_BOX.parseMaterial() || block.getType() == Materials.RED_SHULKER_BOX.parseMaterial() || block.getType() == Materials.WHITE_SHULKER_BOX.parseMaterial() + || block.getType() == Materials.YELLOW_SHULKER_BOX.parseMaterial()))) { + if (!islandManager.hasPermission(player, block.getLocation(), "Storage")) { + event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - return; - } - } else + return; + } + } else if (block.getType() == Materials.CRAFTING_TABLE.parseMaterial()) { if (!islandManager.hasPermission(player, block.getLocation(), "Workbench")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } - } else if (block.getType() == Material.BIRCH_DOOR || block.getType() == Material.ACACIA_DOOR || block.getType() == Material.DARK_OAK_DOOR - || block.getType() == Material.JUNGLE_DOOR || block.getType() == Material.SPRUCE_DOOR || block.getType() == Materials.LEGACY_WOODEN_DOOR.parseMaterial() - || block.getType() == Materials.OAK_DOOR.parseMaterial()) { + } else if (block.getType() == Material.BIRCH_DOOR || block.getType() == Material.ACACIA_DOOR || block.getType() == Material.DARK_OAK_DOOR || block.getType() == Material.JUNGLE_DOOR + || block.getType() == Material.SPRUCE_DOOR || block.getType() == Materials.LEGACY_WOODEN_DOOR.parseMaterial() || block.getType() == Materials.OAK_DOOR.parseMaterial()) { if (!islandManager.hasPermission(player, block.getLocation(), "Door")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -310,8 +301,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Enchant")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -320,21 +310,19 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Furnace")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } - } else if (block.getType() == Material.STONE_BUTTON || block.getType() == Materials.OAK_BUTTON.parseMaterial() - || block.getType() == Materials.SPRUCE_BUTTON.parseMaterial() || block.getType() == Materials.BIRCH_BUTTON.parseMaterial() - || block.getType() == Materials.JUNGLE_BUTTON.parseMaterial() || block.getType() == Materials.ACACIA_BUTTON.parseMaterial() + } else if (block.getType() == Material.STONE_BUTTON || block.getType() == Materials.OAK_BUTTON.parseMaterial() || block.getType() == Materials.SPRUCE_BUTTON.parseMaterial() + || block.getType() == Materials.BIRCH_BUTTON.parseMaterial() || block.getType() == Materials.JUNGLE_BUTTON.parseMaterial() || block.getType() == Materials.ACACIA_BUTTON.parseMaterial() || block.getType() == Materials.DARK_OAK_BUTTON.parseMaterial() || block.getType() == Materials.LEVER.parseMaterial()) { if (!islandManager.hasPermission(player, block.getLocation(), "LeverButton")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -344,37 +332,35 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Jukebox")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } - } else if (block.getType() == Materials.OAK_TRAPDOOR.parseMaterial() || block.getType() == Materials.SPRUCE_TRAPDOOR.parseMaterial() - || block.getType() == Materials.BIRCH_TRAPDOOR.parseMaterial() || block.getType() == Materials.JUNGLE_TRAPDOOR.parseMaterial() - || block.getType() == Materials.ACACIA_TRAPDOOR.parseMaterial() || block.getType() == Materials.DARK_OAK_TRAPDOOR.parseMaterial() + } else if (block.getType() == Materials.OAK_TRAPDOOR.parseMaterial() || block.getType() == Materials.SPRUCE_TRAPDOOR.parseMaterial() || block.getType() == Materials.BIRCH_TRAPDOOR.parseMaterial() + || block.getType() == Materials.JUNGLE_TRAPDOOR.parseMaterial() || block.getType() == Materials.ACACIA_TRAPDOOR.parseMaterial() || block.getType() == Materials.DARK_OAK_TRAPDOOR.parseMaterial() || block.getType() == Material.NOTE_BLOCK || block.getType() == Material.HOPPER || block.getType() == Materials.COMPARATOR.parseMaterial() - || block.getType() == Materials.LEGACY_REDSTONE_COMPARATOR_OFF.parseMaterial() - || block.getType() == Materials.LEGACY_REDSTONE_COMPARATOR_ON.parseMaterial() || block.getType() == Materials.REPEATER.parseMaterial() - || block.getType() == Materials.LEGACY_DIODE_BLOCK_OFF.parseMaterial() || block.getType() == Materials.LEGACY_DIODE_BLOCK_ON.parseMaterial()) { + || block.getType() == Materials.LEGACY_REDSTONE_COMPARATOR_OFF.parseMaterial() || block.getType() == Materials.LEGACY_REDSTONE_COMPARATOR_ON.parseMaterial() + || block.getType() == Materials.REPEATER.parseMaterial() || block.getType() == Materials.LEGACY_DIODE_BLOCK_OFF.parseMaterial() + || block.getType() == Materials.LEGACY_DIODE_BLOCK_ON.parseMaterial()) { if (!islandManager.hasPermission(player, block.getLocation(), "Redstone")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } } else - if (block.getType() == Materials.OAK_FENCE_GATE.parseMaterial() || block.getType() == Material.ACACIA_FENCE_GATE - || block.getType() == Material.BIRCH_FENCE_GATE || block.getType() == Material.DARK_OAK_FENCE_GATE || block.getType() == Material.JUNGLE_FENCE_GATE - || block.getType() == Material.SPRUCE_FENCE_GATE) { + if (block.getType() == Materials.OAK_FENCE_GATE.parseMaterial() || block.getType() == Material.ACACIA_FENCE_GATE || block.getType() == Material.BIRCH_FENCE_GATE + || block.getType() == Material.DARK_OAK_FENCE_GATE || block.getType() == Material.JUNGLE_FENCE_GATE || block.getType() == Material.SPRUCE_FENCE_GATE) { if (!islandManager.hasPermission(player, block.getLocation(), "Gate")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -384,8 +370,8 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "DropperDispenser")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -394,8 +380,8 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Destroy")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -404,8 +390,8 @@ public class Interact implements Listener { if (player.getFoodLevel() < 20 && !islandManager.hasPermission(player, block.getLocation(), "Cake")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -414,16 +400,16 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Hopper")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; } - } else if ((player.getGameMode() == GameMode.SURVIVAL) && (block.getType() == Material.OBSIDIAN) && (event.getItem() != null) - && (event.getItem().getType() != Material.AIR) && (event.getItem().getType() == Material.BUCKET)) { - if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() - .getBoolean("Island.Block.Obsidian.Enable") && islandManager.hasPermission(player, block.getLocation(), "Bucket")) { + } else if ((player.getGameMode() == GameMode.SURVIVAL) && (block.getType() == Material.OBSIDIAN) && (event.getItem() != null) && (event.getItem().getType() != Material.AIR) + && (event.getItem().getType() == Material.BUCKET)) { + if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Block.Obsidian.Enable") + && islandManager.hasPermission(player, block.getLocation(), "Bucket")) { int NMSVersion = NMSUtil.getVersionNumber(); boolean isInventoryFull = false; @@ -460,8 +446,8 @@ public class Interact implements Listener { } } else if (block.getType() == Materials.END_PORTAL_FRAME.parseMaterial()) { - if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() - .getBoolean("Island.Block.EndFrame.Enable") && islandManager.hasPermission(player, block.getLocation(), "Destroy")) { + if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Block.EndFrame.Enable") + && islandManager.hasPermission(player, block.getLocation(), "Destroy")) { if (NMSUtil.getVersionNumber() > 8 && event.getHand() == EquipmentSlot.OFF_HAND) return; @@ -476,19 +462,24 @@ public class Interact implements Listener { boolean hasEye = ((block.getData() >> 2) & 1) == 1; if (is == null || is.getType() == Material.AIR) { + + int size = 1; + if (stackableManager != null && stackableManager.isStacked(block.getLocation())) { - Stackable stackable = stackableManager.getStack(block.getLocation(), Materials.END_PORTAL_FRAME.parseMaterial()); + Stackable stackable = stackableManager.getStack(block.getLocation(), Materials.END_PORTAL_FRAME); stackable.takeOne(); if (stackable.getSize() <= 1) { stackableManager.removeStack(stackable); } + + size = stackable.getSize(); } else { block.setType(Material.AIR); } player.getInventory().addItem(new ItemStack(Materials.END_PORTAL_FRAME.parseMaterial(), 1)); - if (hasEye) player.getInventory().addItem(new ItemStack(Materials.ENDER_EYE.parseMaterial(), 1)); + if (hasEye && size == 1) player.getInventory().addItem(new ItemStack(Materials.ENDER_EYE.parseMaterial(), 1)); player.updateInventory(); FileManager.Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); @@ -522,8 +513,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Bucket")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); player.updateInventory(); @@ -533,8 +523,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "WaterCollection")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); player.updateInventory(); @@ -544,8 +533,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "SpawnEgg")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); player.updateInventory(); @@ -554,8 +542,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "EntityPlacement")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); player.updateInventory(); @@ -568,8 +555,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Fire")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } @@ -580,13 +566,11 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Crop")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } - } else if (block.getType() == Materials.STONE_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.OAK_PRESSURE_PLATE.parseMaterial() - || block.getType() == Materials.SPRUCE_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.BIRCH_PRESSURE_PLATE.parseMaterial() - || block.getType() == Materials.JUNGLE_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.ACACIA_PRESSURE_PLATE.parseMaterial() + } else if (block.getType() == Materials.STONE_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.OAK_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.SPRUCE_PRESSURE_PLATE.parseMaterial() + || block.getType() == Materials.BIRCH_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.JUNGLE_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.ACACIA_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.DARK_OAK_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.LIGHT_WEIGHTED_PRESSURE_PLATE.parseMaterial() || block.getType() == Materials.HEAVY_WEIGHTED_PRESSURE_PLATE.parseMaterial()) { if (!islandManager.hasPermission(player, block.getLocation(), "PressurePlate")) { @@ -597,8 +581,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, block.getLocation(), "Redstone")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } @@ -617,32 +600,30 @@ public class Interact implements Listener { if (event.getAction() == Action.LEFT_CLICK_BLOCK) { ItemStack structureTool = StructureUtil.getTool(); - if ((event.getItem().getType() == structureTool.getType()) && (event.getItem().hasItemMeta()) - && (event.getItem().getItemMeta().getDisplayName().equals(structureTool.getItemMeta().getDisplayName()))) { - if (player.hasPermission("fabledskyblock.admin.structure.selection") || player.hasPermission("fabledskyblock.admin.structure.*") - || player.hasPermission("fabledskyblock.admin.*") || player.hasPermission("fabledskyblock.*")) { + if ((event.getItem().getType() == structureTool.getType()) && (event.getItem().hasItemMeta()) && (event.getItem().getItemMeta().getDisplayName().equals(structureTool.getItemMeta().getDisplayName()))) { + if (player.hasPermission("fabledskyblock.admin.structure.selection") || player.hasPermission("fabledskyblock.admin.structure.*") || player.hasPermission("fabledskyblock.admin.*") + || player.hasPermission("fabledskyblock.*")) { event.setCancelled(true); skyblock.getPlayerDataManager().getPlayerData(player).getArea().setPosition(1, event.getClickedBlock().getLocation()); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Structure.Tool.Position.Message").replace("%position", "1")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Structure.Tool.Position.Message").replace("%position", "1")); soundManager.playSound(player, Sounds.WOOD_CLICK.bukkitSound(), 1.0F, 1.0F); } } } else if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { ItemStack structureTool = StructureUtil.getTool(); - if ((event.getItem().getType() == structureTool.getType()) && (event.getItem().hasItemMeta()) - && (event.getItem().getItemMeta().getDisplayName().equals(structureTool.getItemMeta().getDisplayName()))) { - if (player.hasPermission("fabledskyblock.admin.structure.selection") || player.hasPermission("fabledskyblock.admin.structure.*") - || player.hasPermission("fabledskyblock.admin.*") || player.hasPermission("fabledskyblock.*")) { + if ((event.getItem().getType() == structureTool.getType()) && (event.getItem().hasItemMeta()) && (event.getItem().getItemMeta().getDisplayName().equals(structureTool.getItemMeta().getDisplayName()))) { + if (player.hasPermission("fabledskyblock.admin.structure.selection") || player.hasPermission("fabledskyblock.admin.structure.*") || player.hasPermission("fabledskyblock.admin.*") + || player.hasPermission("fabledskyblock.*")) { event.setCancelled(true); skyblock.getPlayerDataManager().getPlayerData(player).getArea().setPosition(2, event.getClickedBlock().getLocation()); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Structure.Tool.Position.Message").replace("%position", "2")); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Structure.Tool.Position.Message").replace("%position", "2")); soundManager.playSound(player, Sounds.WOOD_CLICK.bukkitSound(), 1.0F, 1.0F); } } @@ -670,8 +651,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, entity.getLocation(), "Leash")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -687,8 +667,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, horse.getLocation(), "HorseInventory")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -697,8 +676,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, horse.getLocation(), "MobRiding")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -708,8 +686,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, entity.getLocation(), "MobRiding")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -718,15 +695,13 @@ public class Interact implements Listener { } else if (entity.getType().equals(EntityType.SHEEP)) { if (!islandManager.hasPermission(player, entity.getLocation(), "EntityPlacement")) { event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } else if (entity.getType().equals(EntityType.ITEM_FRAME)) { if (!skyblock.getIslandManager().hasPermission(player, entity.getLocation(), "Storage")) { event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } else if (entity.getType() == EntityType.COW || entity.getType() == EntityType.MUSHROOM_COW) { @@ -734,8 +709,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, entity.getLocation(), "Milking")) { event.setCancelled(true); - messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -745,8 +719,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, entity.getLocation(), "Trading")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -755,8 +728,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, entity.getLocation(), "Storage")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -765,8 +737,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, entity.getLocation(), "MinecartBoat")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -775,8 +746,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, entity.getLocation(), "Hopper")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); return; @@ -784,8 +754,8 @@ public class Interact implements Listener { } if (entity.getType() == EntityType.HORSE) { - if (!(is.getType() == Material.GOLDEN_APPLE || is.getType() == Material.GOLDEN_CARROT || is.getType() == Material.SUGAR || is.getType() == Material.WHEAT - || is.getType() == Material.APPLE || is.getType() == Material.HAY_BLOCK)) { + if (!(is.getType() == Material.GOLDEN_APPLE || is.getType() == Material.GOLDEN_CARROT || is.getType() == Material.SUGAR || is.getType() == Material.WHEAT || is.getType() == Material.APPLE + || is.getType() == Material.HAY_BLOCK)) { return; } } else if (entity.getType() == EntityType.SHEEP || entity.getType() == EntityType.COW || entity.getType() == EntityType.MUSHROOM_COW) { @@ -807,10 +777,9 @@ public class Interact implements Listener { } } } else if (entity.getType() == EntityType.WOLF) { - if (!(is.getType() == Material.BONE || is.getType() == Materials.PORKCHOP.parseMaterial() || is.getType() == Materials.BEEF.parseMaterial() - || is.getType() == Materials.CHICKEN.parseMaterial() || is.getType() == Material.RABBIT || is.getType() == Material.MUTTON || is.getType() == Material.ROTTEN_FLESH - || is.getType() == Materials.COOKED_PORKCHOP.parseMaterial() || is.getType() == Material.COOKED_BEEF || is.getType() == Material.COOKED_CHICKEN - || is.getType() == Material.COOKED_RABBIT || is.getType() == Material.COOKED_MUTTON)) { + if (!(is.getType() == Material.BONE || is.getType() == Materials.PORKCHOP.parseMaterial() || is.getType() == Materials.BEEF.parseMaterial() || is.getType() == Materials.CHICKEN.parseMaterial() + || is.getType() == Material.RABBIT || is.getType() == Material.MUTTON || is.getType() == Material.ROTTEN_FLESH || is.getType() == Materials.COOKED_PORKCHOP.parseMaterial() + || is.getType() == Material.COOKED_BEEF || is.getType() == Material.COOKED_CHICKEN || is.getType() == Material.COOKED_RABBIT || is.getType() == Material.COOKED_MUTTON)) { return; } } else if (entity.getType() == EntityType.OCELOT) { @@ -849,8 +818,7 @@ public class Interact implements Listener { if (!islandManager.hasPermission(player, entity.getLocation(), "AnimalBreeding")) { event.setCancelled(true); - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + messageManager.sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } @@ -865,8 +833,7 @@ public class Interact implements Listener { if (!skyblock.getIslandManager().hasPermission(player, event.getVehicle().getLocation(), "MobHurting")) { event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } @@ -880,8 +847,7 @@ public class Interact implements Listener { if (!skyblock.getIslandManager().hasPermission(player, event.getVehicle().getLocation(), "MobHurting")) { event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } @@ -904,8 +870,7 @@ public class Interact implements Listener { if (!skyblock.getIslandManager().hasPermission(player, entity.getLocation(), "ArmorStandUse")) { event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration().getString("Island.Settings.Permission.Message")); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); } } diff --git a/src/main/java/com/songoda/skyblock/listeners/Join.java b/src/main/java/com/songoda/skyblock/listeners/Join.java index f20ea3b4..657b2db7 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Join.java +++ b/src/main/java/com/songoda/skyblock/listeners/Join.java @@ -82,11 +82,11 @@ public class Join implements Listener { Method getProfileMethod = entityPlayer.getClass().getMethod("getProfile"); GameProfile gameProfile = (GameProfile) getProfileMethod.invoke(entityPlayer); Property property = gameProfile.getProperties().get("textures").iterator().next(); - playerTexture = new String[]{property.getSignature(), property.getValue()}; + playerTexture = new String[] { property.getSignature(), property.getValue() }; } catch (Exception e) { - playerTexture = new String[]{ + playerTexture = new String[] { "K9P4tCIENYbNpDuEuuY0shs1x7iIvwXi4jUUVsATJfwsAIZGS+9OZ5T2HB0tWBoxRvZNi73Vr+syRdvTLUWPusVXIg+2fhXmQoaNEtnQvQVGQpjdQP0TkZtYG8PbvRxE6Z75ddq+DVx/65OSNHLWIB/D+Rg4vINh4ukXNYttn9QvauDHh1aW7/IkIb1Bc0tLcQyqxZQ3mdglxJfgIerqnlA++Lt7TxaLdag4y1NhdZyd3OhklF5B0+B9zw/qP8QCzsZU7VzJIcds1+wDWKiMUO7+60OSrIwgE9FPamxOQDFoDvz5BOULQEeNx7iFMB+eBYsapCXpZx0zf1bduppBUbbVC9wVhto/J4tc0iNyUq06/esHUUB5MHzdJ0Y6IZJAD/xIw15OLCUH2ntvs8V9/cy5/n8u3JqPUM2zhUGeQ2p9FubUGk4Q928L56l3omRpKV+5QYTrvF+AxFkuj2hcfGQG3VE2iYZO6omXe7nRPpbJlHkMKhE8Xvd1HP4PKpgivSkHBoZ92QEUAmRzZydJkp8CNomQrZJf+MtPiNsl/Q5RQM+8CQThg3+4uWptUfP5dDFWOgTnMdA0nIODyrjpp+bvIJnsohraIKJ7ZDnj4tIp4ObTNKDFC/8j8JHz4VCrtr45mbnzvB2DcK8EIB3JYT7ElJTHnc5BKMyLy5SKzuw=", - "eyJ0aW1lc3RhbXAiOjE1MjkyNTg0MTE4NDksInByb2ZpbGVJZCI6Ijg2NjdiYTcxYjg1YTQwMDRhZjU0NDU3YTk3MzRlZWQ3IiwicHJvZmlsZU5hbWUiOiJTdGV2ZSIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGMxYzc3Y2U4ZTU0OTI1YWI1ODEyNTQ0NmVjNTNiMGNkZDNkMGNhM2RiMjczZWI5MDhkNTQ4Mjc4N2VmNDAxNiJ9LCJDQVBFIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjc2N2Q0ODMyNWVhNTMyNDU2MTQwNmI4YzgyYWJiZDRlMjc1NWYxMTE1M2NkODVhYjA1NDVjYzIifX19"}; + "eyJ0aW1lc3RhbXAiOjE1MjkyNTg0MTE4NDksInByb2ZpbGVJZCI6Ijg2NjdiYTcxYjg1YTQwMDRhZjU0NDU3YTk3MzRlZWQ3IiwicHJvZmlsZU5hbWUiOiJTdGV2ZSIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGMxYzc3Y2U4ZTU0OTI1YWI1ODEyNTQ0NmVjNTNiMGNkZDNkMGNhM2RiMjczZWI5MDhkNTQ4Mjc4N2VmNDAxNiJ9LCJDQVBFIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjc2N2Q0ODMyNWVhNTMyNDU2MTQwNmI4YzgyYWJiZDRlMjc1NWYxMTE1M2NkODVhYjA1NDVjYzIifX19" }; } PlayerData playerData = playerDataManager.getPlayerData(player); @@ -99,10 +99,8 @@ public class Join implements Listener { playerDataManager.storeIsland(player); - cooldownManager.addCooldownPlayer(CooldownType.Biome, - cooldownManager.loadCooldownPlayer(CooldownType.Biome, player)); - cooldownManager.addCooldownPlayer(CooldownType.Creation, - cooldownManager.loadCooldownPlayer(CooldownType.Creation, player)); + cooldownManager.addCooldownPlayer(CooldownType.Biome, cooldownManager.loadCooldownPlayer(CooldownType.Biome, player)); + cooldownManager.addCooldownPlayer(CooldownType.Creation, cooldownManager.loadCooldownPlayer(CooldownType.Creation, player)); if (scoreboardManager != null) { Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); @@ -112,49 +110,30 @@ public class Join implements Listener { if (island != null) { OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(island.getOwnerUUID()); - cooldownManager.addCooldownPlayer(CooldownType.Levelling, - cooldownManager.loadCooldownPlayer(CooldownType.Levelling, offlinePlayer)); - cooldownManager.addCooldownPlayer(CooldownType.Ownership, - cooldownManager.loadCooldownPlayer(CooldownType.Ownership, offlinePlayer)); + cooldownManager.addCooldownPlayer(CooldownType.Levelling, cooldownManager.loadCooldownPlayer(CooldownType.Levelling, offlinePlayer)); + cooldownManager.addCooldownPlayer(CooldownType.Ownership, cooldownManager.loadCooldownPlayer(CooldownType.Ownership, offlinePlayer)); if (island.getRole(IslandRole.Member).size() == 0 && island.getRole(IslandRole.Operator).size() == 0) { - scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', - config.getFileConfiguration().getString("Scoreboard.Island.Solo.Displayname"))); + scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', config.getFileConfiguration().getString("Scoreboard.Island.Solo.Displayname"))); if (islandManager.getVisitorsAtIsland(island).size() == 0) { - scoreboard.setDisplayList(config.getFileConfiguration() - .getStringList("Scoreboard.Island.Solo.Empty.Displaylines")); + scoreboard.setDisplayList(config.getFileConfiguration().getStringList("Scoreboard.Island.Solo.Empty.Displaylines")); } else { - scoreboard.setDisplayList(config.getFileConfiguration() - .getStringList("Scoreboard.Island.Solo.Occupied.Displaylines")); + scoreboard.setDisplayList(config.getFileConfiguration().getStringList("Scoreboard.Island.Solo.Occupied.Displaylines")); } } else { - scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', - config.getFileConfiguration().getString("Scoreboard.Island.Team.Displayname"))); + scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', config.getFileConfiguration().getString("Scoreboard.Island.Team.Displayname"))); if (islandManager.getVisitorsAtIsland(island).size() == 0) { - scoreboard.setDisplayList(config.getFileConfiguration() - .getStringList("Scoreboard.Island.Team.Empty.Displaylines")); + scoreboard.setDisplayList(config.getFileConfiguration().getStringList("Scoreboard.Island.Team.Empty.Displaylines")); } else { - scoreboard.setDisplayList(config.getFileConfiguration() - .getStringList("Scoreboard.Island.Team.Occupied.Displaylines")); + scoreboard.setDisplayList(config.getFileConfiguration().getStringList("Scoreboard.Island.Team.Occupied.Displaylines")); } - Map displayVariables = new HashMap<>(); - displayVariables.put("%owner", - config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Owner")); - displayVariables.put("%operator", - config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Operator")); - displayVariables.put("%member", - config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Member")); - - scoreboard.setDisplayVariables(displayVariables); } } else { - scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', - config.getFileConfiguration().getString("Scoreboard.Tutorial.Displayname"))); - scoreboard.setDisplayList( - config.getFileConfiguration().getStringList("Scoreboard.Tutorial.Displaylines")); + scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', config.getFileConfiguration().getString("Scoreboard.Tutorial.Displayname"))); + scoreboard.setDisplayList(config.getFileConfiguration().getStringList("Scoreboard.Tutorial.Displaylines")); } scoreboard.run(); diff --git a/src/main/java/com/songoda/skyblock/localization/LocalizationManager.java b/src/main/java/com/songoda/skyblock/localization/LocalizationManager.java new file mode 100644 index 00000000..b4ef3980 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/localization/LocalizationManager.java @@ -0,0 +1,64 @@ +package com.songoda.skyblock.localization; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.configuration.Configuration; + +import com.google.common.collect.Sets; +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.island.IslandRole; +import com.songoda.skyblock.localization.type.Localization; +import com.songoda.skyblock.localization.type.impl.BlankLocalization; +import com.songoda.skyblock.localization.type.impl.EnumLocalization; +import com.songoda.skyblock.localization.type.impl.MaterialsLocalization; +import com.songoda.skyblock.utils.version.Materials; + +public final class LocalizationManager { + + private final Localization def = new BlankLocalization("", Object.class); + + private Map, Localization> map; + + public LocalizationManager() { + this.map = new HashMap<>(); + registerLocalizationFor(Materials.class, new MaterialsLocalization("Materials")); + registerLocalizationFor(IslandRole.class, new EnumLocalization<>("IslandRoles", IslandRole.class)); + } + + public void registerLocalizationFor(Class type, Localization toUse) { + + if (type == null) throw new IllegalArgumentException("type cannot be null"); + if (toUse == null) throw new IllegalArgumentException("toUse cannot be null"); + if (toUse == def) throw new IllegalArgumentException("Cannot register default localization."); + + map.put(type, toUse); + + final SkyBlock inst = SkyBlock.getInstance(); + + toUse.reload(inst.getFileManager().getConfig(new File(inst.getDataFolder(), "language.yml")).getFileConfiguration().getConfigurationSection(toUse.getKeysPath())); + } + + public void reloadAll() { + + final SkyBlock inst = SkyBlock.getInstance(); + final Configuration config = inst.getFileManager().getConfig(new File(inst.getDataFolder(), "language.yml")).getFileConfiguration(); + + for (Localization locale : Sets.newHashSet(map.values())) { + locale.reload(config.getConfigurationSection(locale.getKeysPath())); + } + + } + + @SuppressWarnings("unchecked") + public Localization getLocalizationFor(Class type) { + + Localization locale = (Localization) map.get(type); + + if (locale == null) locale = (Localization) def; + + return locale; + } + +} diff --git a/src/main/java/com/songoda/skyblock/localization/type/Localization.java b/src/main/java/com/songoda/skyblock/localization/type/Localization.java new file mode 100644 index 00000000..01f06f45 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/localization/type/Localization.java @@ -0,0 +1,54 @@ +package com.songoda.skyblock.localization.type; + +import java.util.Map; +import java.util.Objects; + +import org.bukkit.configuration.ConfigurationSection; + +public abstract class Localization { + + private final Class type; + private final String keysPath; + private final Map values; + + public Localization(String keysPath, Class type) { + this.type = Objects.requireNonNull(type, "type cannot be null"); + this.keysPath = "ClassLocalization." + Objects.requireNonNull(keysPath, "keysPath canoot be null."); + this.values = Objects.requireNonNull(newValueMapInstance(type), "type cannot be null"); + } + + public abstract void reload(ConfigurationSection section); + + protected abstract Map newValueMapInstance(Class type); + + protected final Map getValues() { + return values; + } + + public final String getKeysPath() { + return keysPath; + } + + public final Class getType() { + return type; + } + + public String getLocale(T object) { + + String value = getValues().get(object); + + if (value == null) value = getDefaultLocaleFor(object); + + return value; + } + + public String getDefaultLocaleFor(T object) { + + String name = object.toString().toLowerCase(); + + if (name.length() > 1) name = name.substring(0, 1).toUpperCase() + name.substring(1); + + return name; + } + +} diff --git a/src/main/java/com/songoda/skyblock/localization/type/impl/BlankLocalization.java b/src/main/java/com/songoda/skyblock/localization/type/impl/BlankLocalization.java new file mode 100644 index 00000000..790bcaf8 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/localization/type/impl/BlankLocalization.java @@ -0,0 +1,31 @@ +package com.songoda.skyblock.localization.type.impl; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.configuration.ConfigurationSection; + +import com.songoda.skyblock.localization.type.Localization; + +public final class BlankLocalization extends Localization { + + public BlankLocalization(String keysPath, Class type) { + super(keysPath, type); + } + + @Override + public void reload(ConfigurationSection section) { + throw new UnsupportedOperationException(); + } + + @Override + protected Map newValueMapInstance(Class type) { + return new HashMap<>(0); + } + + @Override + public String getLocale(Object obj) { + return getDefaultLocaleFor(obj); + } + +} diff --git a/src/main/java/com/songoda/skyblock/localization/type/impl/EnumLocalization.java b/src/main/java/com/songoda/skyblock/localization/type/impl/EnumLocalization.java new file mode 100644 index 00000000..577fd5ab --- /dev/null +++ b/src/main/java/com/songoda/skyblock/localization/type/impl/EnumLocalization.java @@ -0,0 +1,46 @@ +package com.songoda.skyblock.localization.type.impl; + +import java.util.EnumMap; +import java.util.Map; + +import org.bukkit.configuration.ConfigurationSection; + +import com.songoda.skyblock.localization.type.Localization; + +public class EnumLocalization> extends Localization { + + public EnumLocalization(String keysPath, Class type) { + super(keysPath, type); + } + + @Override + protected final Map newValueMapInstance(Class type) { + return new EnumMap<>(type); + } + + @Override + public void reload(ConfigurationSection section) { + + getValues().clear(); + + if (section == null) return; + + for (String key : section.getKeys(false)) { + T parse; + + try { + parse = parseEnum(key); + } catch (IllegalArgumentException | NullPointerException e) { + throw new IllegalArgumentException("Unable to parse a '" + getType().getSimpleName() + "' for given string '" + key + "' in '" + section.getCurrentPath() + "'", e); + } + + getValues().put(parse, section.getString(key)); + } + + } + + protected T parseEnum(String input) { + return Enum.valueOf(getType(), input); + } + +} diff --git a/src/main/java/com/songoda/skyblock/localization/type/impl/MaterialsLocalization.java b/src/main/java/com/songoda/skyblock/localization/type/impl/MaterialsLocalization.java new file mode 100644 index 00000000..84cc15e6 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/localization/type/impl/MaterialsLocalization.java @@ -0,0 +1,21 @@ +package com.songoda.skyblock.localization.type.impl; + +import com.songoda.skyblock.utils.version.Materials; + +public class MaterialsLocalization extends EnumLocalization { + + public MaterialsLocalization(String keysPath) { + super(keysPath, Materials.class); + } + + @Override + public Materials parseEnum(String input) { + return Materials.fromString(input); + } + + @Override + public String getDefaultLocaleFor(Materials obj) { + return super.getDefaultLocaleFor(obj).replace("_", " "); + } + +} diff --git a/src/main/java/com/songoda/skyblock/localization/type/impl/MaterialsToMaterialLocalization.java b/src/main/java/com/songoda/skyblock/localization/type/impl/MaterialsToMaterialLocalization.java new file mode 100644 index 00000000..f94191eb --- /dev/null +++ b/src/main/java/com/songoda/skyblock/localization/type/impl/MaterialsToMaterialLocalization.java @@ -0,0 +1,19 @@ +package com.songoda.skyblock.localization.type.impl; + +import org.bukkit.Material; + +import com.songoda.skyblock.utils.version.Materials; + +public class MaterialsToMaterialLocalization extends EnumLocalization { + + public MaterialsToMaterialLocalization(String keysPath) { + super(keysPath, Material.class); + } + + @Override + public Material parseEnum(String input) { + Materials material = Materials.fromString(input); + return material == null ? null : material.parseMaterial(); + } + +} diff --git a/src/main/java/com/songoda/skyblock/menus/Levelling.java b/src/main/java/com/songoda/skyblock/menus/Levelling.java index 87c18b46..3bd1764e 100644 --- a/src/main/java/com/songoda/skyblock/menus/Levelling.java +++ b/src/main/java/com/songoda/skyblock/menus/Levelling.java @@ -1,5 +1,21 @@ package com.songoda.skyblock.menus; +import java.io.File; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager; import com.songoda.skyblock.config.FileManager.Config; @@ -21,23 +37,8 @@ import com.songoda.skyblock.utils.item.MaterialUtil; import com.songoda.skyblock.utils.item.SkullUtil; import com.songoda.skyblock.utils.item.nInventoryUtil; import com.songoda.skyblock.utils.version.Materials; +import com.songoda.skyblock.utils.version.NMSUtil; import com.songoda.skyblock.utils.version.Sounds; -import org.apache.commons.lang3.text.WordUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; - -import java.io.File; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; public class Levelling { @@ -64,8 +65,7 @@ public class Levelling { if (playerDataManager.hasPlayerData(player)) { PlayerData playerData = skyblock.getPlayerDataManager().getPlayerData(player); - FileConfiguration configLoad = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration(); + FileConfiguration configLoad = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration(); nInventoryUtil nInv = new nInventoryUtil(player, event -> { if (islandManager.getIsland(player) == null) { @@ -80,110 +80,95 @@ public class Levelling { ItemStack is = event.getItem(); if ((is.getType() == Materials.BLACK_STAINED_GLASS_PANE.parseMaterial()) && (is.hasItemMeta()) - && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Menu.Levelling.Item.Barrier.Displayname"))))) { + && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Menu.Levelling.Item.Barrier.Displayname"))))) { soundManager.playSound(player, Sounds.GLASS.bukkitSound(), 1.0F, 1.0F); event.setWillClose(false); event.setWillDestroy(false); } else if ((is.getType() == Materials.OAK_FENCE_GATE.parseMaterial()) && (is.hasItemMeta()) - && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Menu.Levelling.Item.Exit.Displayname"))))) { - soundManager.playSound(player, Sounds.CHEST_CLOSE.bukkitSound(), 1.0F, 1.0F); - } else if ((is.getType() == Material.PAINTING) && (is.hasItemMeta()) - && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Menu.Levelling.Item.Statistics.Displayname"))))) { - soundManager.playSound(player, Sounds.VILLAGER_YES.bukkitSound(), 1.0F, 1.0F); + && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Menu.Levelling.Item.Exit.Displayname"))))) { + soundManager.playSound(player, Sounds.CHEST_CLOSE.bukkitSound(), 1.0F, 1.0F); + } else + if ((is.getType() == Material.PAINTING) && (is.hasItemMeta()) + && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Menu.Levelling.Item.Statistics.Displayname"))))) { + soundManager.playSound(player, Sounds.VILLAGER_YES.bukkitSound(), 1.0F, 1.0F); - event.setWillClose(false); - event.setWillDestroy(false); - } else if ((is.getType() == Material.BARRIER) && (is.hasItemMeta()) - && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Menu.Levelling.Item.Nothing.Displayname"))))) { - soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); + event.setWillClose(false); + event.setWillDestroy(false); + } else + if ((is.getType() == Material.BARRIER) && (is.hasItemMeta()) + && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Menu.Levelling.Item.Nothing.Displayname"))))) { + soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); - event.setWillClose(false); - event.setWillDestroy(false); - } else if ((is.getType() == Materials.FIREWORK_STAR.parseMaterial()) && (is.hasItemMeta()) - && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Menu.Levelling.Item.Rescan.Displayname"))))) { - Island island = islandManager.getIsland(player); - OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(island.getOwnerUUID()); + event.setWillClose(false); + event.setWillDestroy(false); + } else + if ((is.getType() == Materials.FIREWORK_STAR.parseMaterial()) && (is.hasItemMeta()) + && (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Menu.Levelling.Item.Rescan.Displayname"))))) { + Island island = islandManager.getIsland(player); + OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(island.getOwnerUUID()); - if (cooldownManager.hasPlayer(CooldownType.Levelling, offlinePlayer) && !player.hasPermission("fabledskyblock.bypass.cooldown")) { - CooldownPlayer cooldownPlayer = cooldownManager - .getCooldownPlayer(CooldownType.Levelling, offlinePlayer); - Cooldown cooldown = cooldownPlayer.getCooldown(); + if (cooldownManager.hasPlayer(CooldownType.Levelling, offlinePlayer) && !player.hasPermission("fabledskyblock.bypass.cooldown")) { + CooldownPlayer cooldownPlayer = cooldownManager.getCooldownPlayer(CooldownType.Levelling, offlinePlayer); + Cooldown cooldown = cooldownPlayer.getCooldown(); - long[] durationTime = NumberUtil.getDuration(cooldown.getTime()); + long[] durationTime = NumberUtil.getDuration(cooldown.getTime()); - if (cooldown.getTime() >= 3600) { - messageManager.sendMessage(player, configLoad - .getString("Command.Island.Level.Cooldown.Message") - .replace("%time", durationTime[1] + " " - + configLoad.getString("Command.Island.Level.Cooldown.Word.Minute") - + " " + durationTime[2] + " " - + configLoad.getString("Command.Island.Level.Cooldown.Word.Minute") - + " " + durationTime[3] + " " + configLoad - .getString("Command.Island.Level.Cooldown.Word.Second"))); - } else if (cooldown.getTime() >= 60) { - messageManager.sendMessage(player, configLoad - .getString("Command.Island.Level.Cooldown.Message") - .replace("%time", durationTime[2] + " " - + configLoad.getString("Command.Island.Level.Cooldown.Word.Minute") - + " " + durationTime[3] + " " + configLoad - .getString("Command.Island.Level.Cooldown.Word.Second"))); - } else { - messageManager.sendMessage(player, - configLoad.getString("Command.Island.Level.Cooldown.Message") - .replace("%time", cooldown.getTime() + " " + configLoad - .getString("Command.Island.Level.Cooldown.Word.Second"))); - } + if (cooldown.getTime() >= 3600) { + messageManager.sendMessage(player, + configLoad.getString("Command.Island.Level.Cooldown.Message").replace("%time", + durationTime[1] + " " + configLoad.getString("Command.Island.Level.Cooldown.Word.Minute") + " " + durationTime[2] + " " + + configLoad.getString("Command.Island.Level.Cooldown.Word.Minute") + " " + durationTime[3] + " " + + configLoad.getString("Command.Island.Level.Cooldown.Word.Second"))); + } else if (cooldown.getTime() >= 60) { + messageManager.sendMessage(player, configLoad.getString("Command.Island.Level.Cooldown.Message").replace("%time", durationTime[2] + " " + + configLoad.getString("Command.Island.Level.Cooldown.Word.Minute") + " " + durationTime[3] + " " + configLoad.getString("Command.Island.Level.Cooldown.Word.Second"))); + } else { + messageManager.sendMessage(player, configLoad.getString("Command.Island.Level.Cooldown.Message").replace("%time", + cooldown.getTime() + " " + configLoad.getString("Command.Island.Level.Cooldown.Word.Second"))); + } - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - event.setWillClose(false); - event.setWillDestroy(false); + event.setWillClose(false); + event.setWillDestroy(false); - return; - } + return; + } - Bukkit.getServer().getScheduler().runTaskAsynchronously(skyblock, () -> { - messageManager.sendMessage(player, - configLoad.getString("Command.Island.Level.Processing.Message")); - soundManager.playSound(player, Sounds.VILLAGER_YES.bukkitSound(), 1.0F, 1.0F); + Bukkit.getServer().getScheduler().runTaskAsynchronously(skyblock, () -> { + messageManager.sendMessage(player, configLoad.getString("Command.Island.Level.Processing.Message")); + soundManager.playSound(player, Sounds.VILLAGER_YES.bukkitSound(), 1.0F, 1.0F); - cooldownManager.createPlayer(CooldownType.Levelling, - Bukkit.getServer().getOfflinePlayer(island.getOwnerUUID())); - levellingManager.startScan(player, island); - }); - } else if ((is.getType() == SkullUtil.createItemStack().getType()) && (is.hasItemMeta())) { - PlayerData playerData1 = skyblock.getPlayerDataManager().getPlayerData(player); + cooldownManager.createPlayer(CooldownType.Levelling, Bukkit.getServer().getOfflinePlayer(island.getOwnerUUID())); + levellingManager.startScan(player, island); + }); + } else + if ((is.getType() == SkullUtil.createItemStack().getType()) && (is.hasItemMeta())) { + PlayerData playerData1 = skyblock.getPlayerDataManager().getPlayerData(player); - if (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Menu.Levelling.Item.Previous.Displayname")))) { - playerData1.setPage(playerData1.getPage() - 1); - soundManager.playSound(player, Sounds.ARROW_HIT.bukkitSound(), 1.0F, 1.0F); + if (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Menu.Levelling.Item.Previous.Displayname")))) { + playerData1.setPage(playerData1.getPage() - 1); + soundManager.playSound(player, Sounds.ARROW_HIT.bukkitSound(), 1.0F, 1.0F); - Bukkit.getServer().getScheduler().runTaskLater(skyblock, () -> open(player), 1L); - } else if (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes( - '&', configLoad.getString("Menu.Levelling.Item.Next.Displayname")))) { - playerData1.setPage(playerData1.getPage() + 1); - soundManager.playSound(player, Sounds.ARROW_HIT.bukkitSound(), 1.0F, 1.0F); + Bukkit.getServer().getScheduler().runTaskLater(skyblock, () -> open(player), 1L); + } else if (is.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Menu.Levelling.Item.Next.Displayname")))) { + playerData1.setPage(playerData1.getPage() + 1); + soundManager.playSound(player, Sounds.ARROW_HIT.bukkitSound(), 1.0F, 1.0F); - Bukkit.getServer().getScheduler().runTaskLater(skyblock, () -> open(player), 1L); - } else { - soundManager.playSound(player, Sounds.CHICKEN_EGG_POP.bukkitSound(), 1.0F, 1.0F); + Bukkit.getServer().getScheduler().runTaskLater(skyblock, () -> open(player), 1L); + } else { + soundManager.playSound(player, Sounds.CHICKEN_EGG_POP.bukkitSound(), 1.0F, 1.0F); - event.setWillClose(false); - event.setWillDestroy(false); - } - } else { - soundManager.playSound(player, Sounds.CHICKEN_EGG_POP.bukkitSound(), 1.0F, 1.0F); + event.setWillClose(false); + event.setWillDestroy(false); + } + } else { + soundManager.playSound(player, Sounds.CHICKEN_EGG_POP.bukkitSound(), 1.0F, 1.0F); - event.setWillClose(false); - event.setWillDestroy(false); - } + event.setWillClose(false); + event.setWillDestroy(false); + } } }); @@ -200,11 +185,8 @@ public class Levelling { // Filter out ItemStacks that can't be displayed in the inventory Inventory testInventory = Bukkit.createInventory(null, 9); for (String materialName : testIslandMaterialKeysOrdered) { - if (mainConfig.getFileConfiguration().getString("Materials." + materialName + ".Points") == null) - continue; - if (!settingsConfig.getFileConfiguration().getBoolean("Island.Levelling.IncludeEmptyPointsInList") && - mainConfig.getFileConfiguration().getInt("Materials." + materialName + ".Points") <= 0) - continue; + if (mainConfig.getFileConfiguration().getString("Materials." + materialName + ".Points") == null) continue; + if (!settingsConfig.getFileConfiguration().getBoolean("Island.Levelling.IncludeEmptyPointsInList") && mainConfig.getFileConfiguration().getInt("Materials." + materialName + ".Points") <= 0) continue; long value = testIslandMaterials.get(materialName); Materials materials = Materials.fromString(materialName); @@ -224,25 +206,14 @@ public class Levelling { int playerMenuPage = playerData.getPage(), nextEndIndex = islandMaterials.size() - playerMenuPage * 36; + nInv.addItem(nInv.createItem(Materials.OAK_FENCE_GATE.parseItem(), configLoad.getString("Menu.Levelling.Item.Exit.Displayname"), null, null, null, null), 0, 8); + nInv.addItem(nInv.createItem(Materials.FIREWORK_STAR.parseItem(), configLoad.getString("Menu.Levelling.Item.Rescan.Displayname"), configLoad.getStringList("Menu.Levelling.Item.Rescan.Lore"), null, null, + new ItemFlag[] { ItemFlag.HIDE_POTION_EFFECTS }), 3, 5); nInv.addItem( - nInv.createItem(Materials.OAK_FENCE_GATE.parseItem(), - configLoad.getString("Menu.Levelling.Item.Exit.Displayname"), null, null, null, null), - 0, 8); - nInv.addItem(nInv.createItem(Materials.FIREWORK_STAR.parseItem(), - configLoad.getString("Menu.Levelling.Item.Rescan.Displayname"), - configLoad.getStringList("Menu.Levelling.Item.Rescan.Lore"), null, null, - new ItemFlag[]{ItemFlag.HIDE_POTION_EFFECTS}), 3, 5); - nInv.addItem(nInv.createItem(new ItemStack(Material.PAINTING), - configLoad.getString("Menu.Levelling.Item.Statistics.Displayname"), - configLoad.getStringList("Menu.Levelling.Item.Statistics.Lore"), - new Placeholder[]{ - new Placeholder("%level_points", NumberUtil.formatNumberByDecimal(level.getPoints())), - new Placeholder("%level", NumberUtil.formatNumberByDecimal(level.getLevel()))}, - null, null), 4); - nInv.addItem( - nInv.createItem(Materials.BLACK_STAINED_GLASS_PANE.parseItem(), - configLoad.getString("Menu.Levelling.Item.Barrier.Displayname"), null, null, null, null), - 9, 10, 11, 12, 13, 14, 15, 16, 17); + nInv.createItem(new ItemStack(Material.PAINTING), configLoad.getString("Menu.Levelling.Item.Statistics.Displayname"), configLoad.getStringList("Menu.Levelling.Item.Statistics.Lore"), + new Placeholder[] { new Placeholder("%level_points", NumberUtil.formatNumberByDecimal(level.getPoints())), new Placeholder("%level", NumberUtil.formatNumberByDecimal(level.getLevel())) }, null, null), + 4); + nInv.addItem(nInv.createItem(Materials.BLACK_STAINED_GLASS_PANE.parseItem(), configLoad.getString("Menu.Levelling.Item.Barrier.Displayname"), null, null, null, null), 9, 10, 11, 12, 13, 14, 15, 16, 17); if (playerMenuPage != 1) { nInv.addItem(nInv.createItem(SkullUtil.create( @@ -259,12 +230,9 @@ public class Levelling { } if (islandMaterials.size() == 0) { - nInv.addItem(nInv.createItem(new ItemStack(Material.BARRIER), - configLoad.getString("Menu.Levelling.Item.Nothing.Displayname"), null, null, null, null), 31); + nInv.addItem(nInv.createItem(new ItemStack(Material.BARRIER), configLoad.getString("Menu.Levelling.Item.Nothing.Displayname"), null, null, null, null), 31); } else { - int index = playerMenuPage * 36 - 36, - endIndex = index >= islandMaterials.size() ? islandMaterials.size() - 1 : index + 36, - inventorySlot = 17; + int index = playerMenuPage * 36 - 36, endIndex = index >= islandMaterials.size() ? islandMaterials.size() - 1 : index + 36, inventorySlot = 17; for (; index < endIndex; index++) { if (islandMaterials.size() > index) { @@ -282,28 +250,19 @@ public class Levelling { long pointsEarned = materialAmount * pointsMultiplier; + String name = skyblock.getLocalizationManager().getLocalizationFor(Materials.class).getLocale(materials); + + if (materials == Materials.FARMLAND && NMSUtil.getVersionNumber() < 9) materials = Materials.DIRT; + ItemStack is = materials.parseItem(); is.setAmount(Math.min(Math.toIntExact(materialAmount), 64)); is.setType(MaterialUtil.correctMaterial(is.getType())); - String name; - if (materials.isSpawner() && materials != Materials.SPAWNER) { - name = "Spawner: " + WordUtils.capitalize(material.replace("SPAWNER_", "").toLowerCase().replace("_", " ")).trim(); - } else { - name = WordUtils.capitalize(material.toLowerCase().replace("_", " ")).trim(); - } - List lore = configLoad.getStringList("Menu.Levelling.Item.Material.Lore"); - lore.replaceAll(x -> x.replace("%points", NumberUtil.formatNumberByDecimal(pointsEarned)) - .replace("%blocks", NumberUtil.formatNumberByDecimal(materialAmount)) - .replace("%material", name)); + lore.replaceAll(x -> x.replace("%points", NumberUtil.formatNumberByDecimal(pointsEarned)).replace("%blocks", NumberUtil.formatNumberByDecimal(materialAmount)).replace("%material", name)); - nInv.addItem(nInv.createItem(is, configLoad - .getString("Menu.Levelling.Item.Material.Displayname") - .replace("%points", NumberUtil.formatNumberByDecimal(pointsEarned)) - .replace("%blocks", NumberUtil.formatNumberByDecimal(materialAmount)) - .replace("%material", name), - lore, null, null, null), inventorySlot); + nInv.addItem(nInv.createItem(is, configLoad.getString("Menu.Levelling.Item.Material.Displayname").replace("%points", NumberUtil.formatNumberByDecimal(pointsEarned)) + .replace("%blocks", NumberUtil.formatNumberByDecimal(materialAmount)).replace("%material", name), lore, null, null, null), inventorySlot); } } } diff --git a/src/main/java/com/songoda/skyblock/message/MessageManager.java b/src/main/java/com/songoda/skyblock/message/MessageManager.java index f2a90f0c..7eff3a4a 100644 --- a/src/main/java/com/songoda/skyblock/message/MessageManager.java +++ b/src/main/java/com/songoda/skyblock/message/MessageManager.java @@ -19,13 +19,7 @@ public class MessageManager { public void sendMessage(CommandSender sender, String message) { - if (message == null) { - System.out.println("Message is null."); - System.out.println("Message is null."); - System.out.println("Message is null."); - System.out.println("Message is null."); - return; - } + if (message == null) return; if (sender instanceof Player) { PlaceholderManager placeholderManager = skyblock.getPlaceholderManager(); diff --git a/src/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java b/src/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java index b944a73f..218e9d24 100644 --- a/src/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java +++ b/src/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java @@ -146,7 +146,7 @@ public class PlaceholderManager { if (island.hasRole(roleList, player.getUniqueId())) { return ChatColor.translateAlternateColorCodes('&', configLoad.getString("Placeholder.fabledskyblock_island_role.Non-empty.Message") - .replace("%placeholder", roleList.name())); + .replace("%placeholder", skyblock.getLocalizationManager().getLocalizationFor(IslandRole.class).getLocale(roleList))); } } } diff --git a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java index 62f9cde1..8e3cc588 100644 --- a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java +++ b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java @@ -205,12 +205,7 @@ public class PlayerDataManager { scoreboard.setDisplayName(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Scoreboard.Island.Team.Displayname"))); scoreboard.setDisplayList(configLoad.getStringList("Scoreboard.Island.Team.Occupied.Displaylines")); - Map displayVariables = new HashMap<>(); - displayVariables.put("%owner", configLoad.getString("Scoreboard.Island.Team.Word.Owner")); - displayVariables.put("%operator", configLoad.getString("Scoreboard.Island.Team.Word.Operator")); - displayVariables.put("%member", configLoad.getString("Scoreboard.Island.Team.Word.Member")); - scoreboard.setDisplayVariables(displayVariables); } scoreboard.run(); diff --git a/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java b/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java index 6d4cc2ce..f233a755 100644 --- a/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java +++ b/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java @@ -20,6 +20,7 @@ import com.songoda.skyblock.island.Island; import com.songoda.skyblock.island.IslandLevel; import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.island.IslandRole; +import com.songoda.skyblock.localization.type.Localization; import com.songoda.skyblock.placeholder.PlaceholderManager; import com.songoda.skyblock.utils.NumberUtil; import com.songoda.skyblock.utils.version.NMSUtil; @@ -31,14 +32,13 @@ public class Scoreboard { private String displayName; private List displayList; - private Map displayVariables; + private BukkitTask scheduler; public Scoreboard(SkyBlock plugin, Player player) { this.plugin = plugin; this.player = player; displayList = new ArrayList<>(); - displayVariables = new HashMap<>(); } public void setDisplayName(String displayName) { @@ -49,10 +49,6 @@ public class Scoreboard { this.displayList = displayList; } - public void setDisplayVariables(Map displayVariables) { - this.displayVariables = displayVariables; - } - public void run() { if (scheduler != null) scheduler.cancel(); @@ -135,8 +131,7 @@ public class Scoreboard { String lastColorCodeText = colorCodes[colorCodes.length - 1]; lastColorCodes = "&" + lastColorCodeText.substring(0, Math.min(lastColorCodeText.length(), 1)); - if ((colorCodes.length >= 2) - && (lastColorCodes.equals("&l") || lastColorCodes.equals("&m") || lastColorCodes.equals("&n") || lastColorCodes.equals("&o"))) { + if ((colorCodes.length >= 2) && (lastColorCodes.equals("&l") || lastColorCodes.equals("&m") || lastColorCodes.equals("&n") || lastColorCodes.equals("&o"))) { lastColorCodeText = colorCodes[colorCodes.length - 2]; lastColorCodes = "&" + lastColorCodeText.substring(0, Math.min(lastColorCodeText.length(), 1)) + lastColorCodes; } @@ -188,29 +183,30 @@ public class Scoreboard { IslandLevel level = island.getLevel(); if (island.getRole(IslandRole.Member).size() == 0 && island.getRole(IslandRole.Operator).size() == 0) { - displayLine = displayLine.replace("%island_level", "" + NumberUtil.formatNumberByDecimal(level.getLevel())).replace("%island_members", ChatColor.RED + "0") - .replace("%island_role", ChatColor.RED + "null").replace("%island_visitors", "" + islandManager.getVisitorsAtIsland(island).size()) - .replace("%island_size", "" + island.getSize()).replace("%island_radius", "" + island.getRadius()); + displayLine = displayLine.replace("%island_level", "" + NumberUtil.formatNumberByDecimal(level.getLevel())).replace("%island_members", ChatColor.RED + "0").replace("%island_role", ChatColor.RED + "null") + .replace("%island_visitors", "" + islandManager.getVisitorsAtIsland(island).size()).replace("%island_size", "" + island.getSize()).replace("%island_radius", "" + island.getRadius()); } else { int islandMembers = 1 + island.getRole(IslandRole.Member).size() + island.getRole(IslandRole.Operator).size(); String islandRole = ""; + + Localization locale = skyblock.getLocalizationManager().getLocalizationFor(IslandRole.class); + if (island.hasRole(IslandRole.Owner, player.getUniqueId())) { - islandRole = displayVariables.get("%owner"); + islandRole = locale.getLocale(IslandRole.Owner); } else if (island.hasRole(IslandRole.Operator, player.getUniqueId())) { - islandRole = displayVariables.get("%operator"); + islandRole = locale.getLocale(IslandRole.Operator); } else if (island.hasRole(IslandRole.Member, player.getUniqueId())) { - islandRole = displayVariables.get("%member"); + islandRole = locale.getLocale(IslandRole.Member);; } - displayLine = displayLine.replace("%island_points", "" + NumberUtil.formatNumberByDecimal(level.getPoints())) - .replace("%island_level", "" + NumberUtil.formatNumberByDecimal(level.getLevel())).replace("%island_members", "" + islandMembers).replace("%island_role", islandRole) - .replace("%island_visitors", "" + islandManager.getVisitorsAtIsland(island).size()).replace("%island_size", "" + island.getSize()) - .replace("%island_radius", "" + island.getRadius()); + displayLine = displayLine.replace("%island_points", "" + NumberUtil.formatNumberByDecimal(level.getPoints())).replace("%island_level", "" + NumberUtil.formatNumberByDecimal(level.getLevel())) + .replace("%island_members", "" + islandMembers).replace("%island_role", islandRole).replace("%island_visitors", "" + islandManager.getVisitorsAtIsland(island).size()) + .replace("%island_size", "" + island.getSize()).replace("%island_radius", "" + island.getRadius()); } } else { - displayLine = displayLine.replace("%island_points", ChatColor.RED + "0").replace("%island_level", ChatColor.RED + "0").replace("%island_members", ChatColor.RED + "0") - .replace("%island_role", ChatColor.RED + "null").replace("%island_size", ChatColor.RED + "0").replace("%island_radius", ChatColor.RED + "0"); + displayLine = displayLine.replace("%island_points", ChatColor.RED + "0").replace("%island_level", ChatColor.RED + "0").replace("%island_members", ChatColor.RED + "0").replace("%island_role", ChatColor.RED + "null") + .replace("%island_size", ChatColor.RED + "0").replace("%island_radius", ChatColor.RED + "0"); } PlaceholderManager placeholderManager = skyblock.getPlaceholderManager(); diff --git a/src/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java b/src/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java index d762020f..22aa49bc 100644 --- a/src/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java +++ b/src/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java @@ -80,12 +80,7 @@ public class ScoreboardManager extends BukkitRunnable { scoreboard.setDisplayList(config.getFileConfiguration().getStringList("Scoreboard.Island.Team.Occupied.Displaylines")); } - Map displayVariables = new HashMap<>(); - displayVariables.put("%owner", config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Owner")); - displayVariables.put("%operator", config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Operator")); - displayVariables.put("%member", config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Member")); - scoreboard.setDisplayVariables(displayVariables); } } @@ -229,12 +224,6 @@ public class ScoreboardManager extends BukkitRunnable { scoreboard.setDisplayList(config.getFileConfiguration().getStringList("Scoreboard.Island.Team.Occupied.Displaylines")); } - Map displayVariables = new HashMap<>(); - displayVariables.put("%owner", config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Owner")); - displayVariables.put("%operator", config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Operator")); - displayVariables.put("%member", config.getFileConfiguration().getString("Scoreboard.Island.Team.Word.Member")); - - scoreboard.setDisplayVariables(displayVariables); } } scoreboard.run(); diff --git a/src/main/java/com/songoda/skyblock/stackable/Stackable.java b/src/main/java/com/songoda/skyblock/stackable/Stackable.java index abd3db11..3c55c7f7 100644 --- a/src/main/java/com/songoda/skyblock/stackable/Stackable.java +++ b/src/main/java/com/songoda/skyblock/stackable/Stackable.java @@ -1,35 +1,34 @@ package com.songoda.skyblock.stackable; -import com.songoda.skyblock.SkyBlock; -import com.songoda.skyblock.config.FileManager; -import com.songoda.skyblock.utils.NumberUtil; -import com.songoda.skyblock.utils.version.NMSUtil; -import com.songoda.skyblock.utils.version.Sounds; -import org.apache.commons.lang3.text.WordUtils; +import java.io.File; +import java.util.UUID; + import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; -import java.io.File; -import java.util.UUID; +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.config.FileManager; +import com.songoda.skyblock.utils.NumberUtil; +import com.songoda.skyblock.utils.version.Materials; +import com.songoda.skyblock.utils.version.NMSUtil; +import com.songoda.skyblock.utils.version.Sounds; public class Stackable { private UUID uuid; private Location location; - private Material material; + private Materials material; private int size = 2; private ArmorStand display; - public Stackable(Location location, Material material) { + public Stackable(Location location, Materials material) { this.uuid = UUID.randomUUID(); this.location = new Location(location.getWorld(), location.getBlockX(), location.getBlockY(), location.getBlockZ()); this.material = material; @@ -38,7 +37,7 @@ public class Stackable { this.save(); } - public Stackable(UUID uuid, Location location, Material material, int size) { + public Stackable(UUID uuid, Location location, Materials material, int size) { this.uuid = uuid; this.location = new Location(location.getWorld(), location.getBlockX(), location.getBlockY(), location.getBlockZ()); this.material = material; @@ -58,11 +57,11 @@ public class Stackable { this.location = location; } - public Material getMaterial() { + public Materials getMaterial() { return this.material; } - public void setMaterial(Material material) { + public void setMaterial(Materials material) { this.material = material; this.save(); } @@ -122,7 +121,7 @@ public class Stackable { as.setMarker(true); } as.setBasePlate(true); - as.setHelmet(new ItemStack(this.material)); + as.setHelmet(material.parseItem()); as.setCustomName(this.getCustomName()); as.setCustomNameVisible(true); as.setMetadata("StackableArmorStand", new FixedMetadataValue(SkyBlock.getInstance(), "")); @@ -141,8 +140,7 @@ public class Stackable { private void save() { File configFile = new File(SkyBlock.getInstance().getDataFolder().toString() + "/island-data"); - FileManager.Config config = SkyBlock.getInstance().getFileManager() - .getConfig(new File(configFile, SkyBlock.getInstance().getIslandManager().getIslandAtLocation(this.location).getOwnerUUID() + ".yml")); + FileManager.Config config = SkyBlock.getInstance().getFileManager().getConfig(new File(configFile, SkyBlock.getInstance().getIslandManager().getIslandAtLocation(this.location).getOwnerUUID() + ".yml")); FileConfiguration configLoad = config.getFileConfiguration(); if (this.getSize() == 0) { @@ -150,16 +148,13 @@ public class Stackable { } else { ConfigurationSection section = configLoad.createSection("Stackables." + this.getUuid().toString()); section.set("Location", this.getLocation()); - section.set("Material", this.getMaterial().name()); section.set("Size", this.getSize()); } } private String getCustomName() { return ChatColor - .translateAlternateColorCodes('&', - SkyBlock.getInstance().getFileManager().getConfig(new File(SkyBlock.getInstance().getDataFolder(), "language.yml")).getFileConfiguration() - .getString("Hologram.Stackable.Message")) - .replace("%block", WordUtils.capitalize(this.material.name().toLowerCase()).replace("_", " ")).replace("%amount", NumberUtil.formatNumber(this.size)); + .translateAlternateColorCodes('&', SkyBlock.getInstance().getFileManager().getConfig(new File(SkyBlock.getInstance().getDataFolder(), "language.yml")).getFileConfiguration().getString("Hologram.Stackable.Message")) + .replace("%block", SkyBlock.getInstance().getLocalizationManager().getLocalizationFor(Materials.class).getLocale(material)).replace("%amount", NumberUtil.formatNumber(this.size)); } } diff --git a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java index a3ba3544..00023388 100644 --- a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java +++ b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java @@ -11,18 +11,20 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager; +import com.songoda.skyblock.utils.version.Materials; public class StackableManager { // ToDO: Should pobably be a GUI for this private final SkyBlock skyblock; - private Set stackableMaterials = EnumSet.noneOf(Material.class); + private Set stackableMaterials = EnumSet.noneOf(Materials.class); private Map stacks = new HashMap<>(); public StackableManager(SkyBlock skyblock) { @@ -39,45 +41,77 @@ public class StackableManager { for (String stackableStr : stackableList) { try { - this.stackableMaterials.add(Material.valueOf(stackableStr)); + this.stackableMaterials.add(Materials.fromString(stackableStr)); } catch (Exception ignored) { } } } + /* + * public void loadSavedStackables() { FileManager fileManager = + * SkyBlock.getInstance().getFileManager(); String path = + * SkyBlock.getInstance().getDataFolder().toString() + "/island-data"; File[] + * files = new File(path).listFiles(); if (files == null) return; for (File file + * : files) { File configFile = new File(path); FileManager.Config config = + * fileManager.getConfig(new File(configFile, file.getName())); + * FileConfiguration configLoad = config.getFileConfiguration(); + * ConfigurationSection cs = configLoad.getConfigurationSection("Stackables"); + * if (cs == null) continue; Set keys = cs.getKeys(false); if (keys == + * null) continue; for (String uuid : keys) { ConfigurationSection section = + * cs.getConfigurationSection(uuid); Location location = (Location) + * section.get("Location"); org.bukkit.Material material = + * org.bukkit.Material.valueOf(section.getString("Material")); int size = + * section.getInt("Size"); if (size == 0) continue; this.addStack(new + * Stackable(UUID.fromString(uuid), location, material, size)); } } } + */ + + @SuppressWarnings("deprecation") public void loadSavedStackables() { - FileManager fileManager = SkyBlock.getInstance().getFileManager(); - String path = SkyBlock.getInstance().getDataFolder().toString() + "/island-data"; - File[] files = new File(path).listFiles(); + final File path = new File(skyblock.getDataFolder(), "island-data"); + final File[] files = path.listFiles(); + if (files == null) return; + for (File file : files) { - File configFile = new File(path); - FileManager.Config config = fileManager.getConfig(new File(configFile, file.getName())); - FileConfiguration configLoad = config.getFileConfiguration(); - ConfigurationSection cs = configLoad.getConfigurationSection("Stackables"); - if (cs == null) continue; - Set keys = cs.getKeys(false); - if (keys == null) continue; - for (String uuid : keys) { - ConfigurationSection section = cs.getConfigurationSection(uuid); - Location location = (Location) section.get("Location"); - org.bukkit.Material material = org.bukkit.Material.valueOf(section.getString("Material")); - int size = section.getInt("Size"); + final FileConfiguration config = skyblock.getFileManager().getConfig(file).getFileConfiguration(); + + ConfigurationSection stackableSection = config.getConfigurationSection("Stackables"); + + if (stackableSection == null) continue; + + for (String key : stackableSection.getKeys(false)) { + + final ConfigurationSection currentSection = stackableSection.getConfigurationSection(key); + final Location loc = (Location) currentSection.get("Location"); + final Block block = loc.getWorld().getBlockAt(loc); + + if (block.getType() == Material.AIR) continue; + + final Materials type = Materials.getMaterials(block.getType(), block.getData()); + + if (type == null) continue; + + final int size = currentSection.getInt("Size"); + if (size == 0) continue; - this.addStack(new Stackable(UUID.fromString(uuid), location, material, size)); + + this.addStack(new Stackable(UUID.fromString(key), loc, type, size)); + } + } + } public void unregisterStackables() { stackableMaterials.clear(); } - public Set getStackableMaterials() { + public Set getStackableMaterials() { return Collections.unmodifiableSet(stackableMaterials); } - public boolean isStackableMaterial(Material material) { + public boolean isStackableMaterial(Materials material) { return stackableMaterials.contains(material); } @@ -89,7 +123,7 @@ public class StackableManager { return stacks.containsKey(location); } - public Stackable getStack(Location location, Material material) { + public Stackable getStack(Location location, Materials material) { Stackable stackable = stacks.get(location); return stackable != null && stackable.getMaterial() == material ? stackable : null; @@ -104,7 +138,7 @@ public class StackableManager { stacks.remove(stackable.getLocation()); } - public long getStackSizeOf(Location loc, Material type) { + public long getStackSizeOf(Location loc, Materials type) { final Stackable stack = getStack(loc, type); return stack == null ? 0 : stack.getSize(); diff --git a/src/main/java/com/songoda/skyblock/usercache/UserCacheManager.java b/src/main/java/com/songoda/skyblock/usercache/UserCacheManager.java index aebcb486..9726196c 100644 --- a/src/main/java/com/songoda/skyblock/usercache/UserCacheManager.java +++ b/src/main/java/com/songoda/skyblock/usercache/UserCacheManager.java @@ -45,8 +45,6 @@ public final class UserCacheManager { final FileConfiguration configLoad = new Config(fileManager, fileList).getFileConfiguration(); final String ownerUUIDString = fileName.substring(0, fileName.indexOf('.')); - System.out.println(ownerUUIDString); - Set islandMembers = new HashSet<>(); islandMembers.add(UUID.fromString(ownerUUIDString)); @@ -76,8 +74,7 @@ public final class UserCacheManager { save(); if (usersIgnored != 0) { - Bukkit.getServer().getLogger().log(Level.INFO, - "SkyBlock | Info: Finished fetching user information from island data. There were " + usersIgnored + " users that were skipped."); + Bukkit.getServer().getLogger().log(Level.INFO, "SkyBlock | Info: Finished fetching user information from island data. There were " + usersIgnored + " users that were skipped."); } else { Bukkit.getServer().getLogger().log(Level.INFO, "SkyBlock | Info: Finished fetching user information from island data. No users were ignored."); } diff --git a/src/main/java/com/songoda/skyblock/utils/Metrics.java b/src/main/java/com/songoda/skyblock/utils/Metrics.java index 41149127..e317c89f 100644 --- a/src/main/java/com/songoda/skyblock/utils/Metrics.java +++ b/src/main/java/com/songoda/skyblock/utils/Metrics.java @@ -33,10 +33,12 @@ import java.util.zip.GZIPOutputStream; public class Metrics { static { - // Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D + // Maven's Relocate is clever and changes strings, too. So we have to use this + // little "trick" ... :D final String defaultPackage = new String(new byte[] { 'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's' }); final String examplePackage = new String(new byte[] { 'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e' }); - // We want to make sure nobody just copy & pastes the example and use the wrong package names + // We want to make sure nobody just copy & pastes the example and use the wrong + // package names if (Metrics.class.getPackage().getName().equals(defaultPackage) || Metrics.class.getPackage().getName().equals(examplePackage)) { throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); } @@ -87,15 +89,12 @@ public class Metrics { config.addDefault("logFailedRequests", false); // Inform the server owners about bStats - config.options().header( - "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + - "To honor their work, you should not disable it.\n" + - "This has nearly no effect on the server performance!\n" + - "Check out https://bStats.org/ to learn more :)" - ).copyDefaults(true); + config.options().header("bStats collects some data for plugin authors like how many servers are using their plugins.\n" + "To honor their work, you should not disable it.\n" + + "This has nearly no effect on the server performance!\n" + "Check out https://bStats.org/ to learn more :)").copyDefaults(true); try { config.save(configFile); - } catch (IOException ignored) { } + } catch (IOException ignored) { + } } // Load the data @@ -109,7 +108,8 @@ public class Metrics { service.getField("B_STATS_VERSION"); // Our identifier :) found = true; // We aren't the first break; - } catch (NoSuchFieldException ignored) { } + } catch (NoSuchFieldException ignored) { + } } // Register our service Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal); @@ -144,8 +144,10 @@ public class Metrics { timer.cancel(); return; } - // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler - // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) + // Nevertheless we want our code to run in the Bukkit main thread, so we have to + // use the Bukkit scheduler + // Don't be afraid! The connection to the bStats server is still async, only the + // stats collection is sync ;) Bukkit.getScheduler().runTask(plugin, new Runnable() { @Override public void run() { @@ -153,15 +155,16 @@ public class Metrics { } }); } - }, 1000*60*5, 1000*60*30); - // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start - // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! + }, 1000 * 60 * 5, 1000 * 60 * 30); + // Submit the data every 30 minutes, first time after 5 minutes to give other + // plugins enough time to start + // WARNING: Changing the frequency has no effect but your plugin WILL be + // blocked/deleted! // WARNING: Just don't do it! } /** - * Gets the plugin specific data. - * This method is called using Reflection. + * Gets the plugin specific data. This method is called using Reflection. * * @return The plugin specific data. */ @@ -240,7 +243,8 @@ public class Metrics { // Found one! try { pluginData.put(service.getMethod("getPluginData").invoke(Bukkit.getServicesManager().load(service))); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { } + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { + } } data.put("plugins", pluginData); @@ -411,8 +415,8 @@ public class Metrics { /** * Gets the values of the pie. * - * @param valueMap Just an empty map. The only reason it exists is to make your life easier. - * You don't have to create a map yourself! + * @param valueMap Just an empty map. The only reason it exists is to make your + * life easier. You don't have to create a map yourself! * @return The values of the pie. */ public abstract HashMap getValues(HashMap valueMap); @@ -495,8 +499,8 @@ public class Metrics { /** * Gets the values of the chart. * - * @param valueMap Just an empty map. The only reason it exists is to make your life easier. - * You don't have to create a map yourself! + * @param valueMap Just an empty map. The only reason it exists is to make your + * life easier. You don't have to create a map yourself! * @return The values of the chart. */ public abstract HashMap getValues(HashMap valueMap); @@ -545,8 +549,8 @@ public class Metrics { /** * Gets the value of the chart. * - * @param valueMap Just an empty map. The only reason it exists is to make your life easier. - * You don't have to create a map yourself! + * @param valueMap Just an empty map. The only reason it exists is to make your + * life easier. You don't have to create a map yourself! * @return The value of the chart. */ public abstract HashMap getValues(HashMap valueMap); @@ -588,8 +592,8 @@ public class Metrics { /** * Gets the value of the chart. * - * @param valueMap Just an empty map. The only reason it exists is to make your life easier. - * You don't have to create a map yourself! + * @param valueMap Just an empty map. The only reason it exists is to make your + * life easier. You don't have to create a map yourself! * @return The value of the chart. */ public abstract HashMap getValues(HashMap valueMap); @@ -678,8 +682,8 @@ public class Metrics { /** * Gets the value of the chart. * - * @param valueMap Just an empty map. The only reason it exists is to make your life easier. - * You don't have to create a map yourself! + * @param valueMap Just an empty map. The only reason it exists is to make your + * life easier. You don't have to create a map yourself! * @return The value of the chart. */ public abstract HashMap getValues(HashMap valueMap); @@ -736,7 +740,7 @@ public class Metrics { AUSTRIA("AT", "Austria"), AUSTRALIA("AU", "Australia"), ARUBA("AW", "Aruba"), - ALAND_ISLANDS("AX", "Åland Islands"), + ALAND_ISLANDS("AX", "�land Islands"), AZERBAIJAN("AZ", "Azerbaijan"), BOSNIA_AND_HERZEGOVINA("BA", "Bosnia and Herzegovina"), BARBADOS("BB", "Barbados"), @@ -747,7 +751,7 @@ public class Metrics { BAHRAIN("BH", "Bahrain"), BURUNDI("BI", "Burundi"), BENIN("BJ", "Benin"), - SAINT_BARTHELEMY("BL", "Saint Barthélemy"), + SAINT_BARTHELEMY("BL", "Saint Barth�lemy"), BERMUDA("BM", "Bermuda"), BRUNEI("BN", "Brunei"), BOLIVIA("BO", "Bolivia"), @@ -765,7 +769,7 @@ public class Metrics { CENTRAL_AFRICAN_REPUBLIC("CF", "Central African Republic"), CONGO("CG", "Congo"), SWITZERLAND("CH", "Switzerland"), - COTE_D_IVOIRE("CI", "Côte d'Ivoire"), + COTE_D_IVOIRE("CI", "C�te d'Ivoire"), COOK_ISLANDS("CK", "Cook Islands"), CHILE("CL", "Chile"), CAMEROON("CM", "Cameroon"), @@ -774,7 +778,7 @@ public class Metrics { COSTA_RICA("CR", "Costa Rica"), CUBA("CU", "Cuba"), CAPE_VERDE("CV", "Cape Verde"), - CURACAO("CW", "Curaçao"), + CURACAO("CW", "Cura�ao"), CHRISTMAS_ISLAND("CX", "Christmas Island"), CYPRUS("CY", "Cyprus"), CZECH_REPUBLIC("CZ", "Czech Republic"), @@ -1017,8 +1021,8 @@ public class Metrics { * Gets a country by a locale. * * @param locale The locale. - * @return The country from the giben locale or null if unknown country or - * if the locale does not contain a country. + * @return The country from the giben locale or null if unknown + * country or if the locale does not contain a country. */ public static Country byLocale(Locale locale) { return byIsoTag(locale.getCountry()); diff --git a/src/main/java/com/songoda/skyblock/utils/item/MenuClickRegistry.java b/src/main/java/com/songoda/skyblock/utils/item/MenuClickRegistry.java index 05c821b2..e7d96c74 100644 --- a/src/main/java/com/songoda/skyblock/utils/item/MenuClickRegistry.java +++ b/src/main/java/com/songoda/skyblock/utils/item/MenuClickRegistry.java @@ -57,7 +57,6 @@ public final class MenuClickRegistry { @SuppressWarnings("deprecation") final MenuExecutor executor = executors.get(RegistryKey.fromName(meta.getDisplayName(), Materials.getMaterials(item.getType(), (byte) item.getDurability()))); - System.out.println(executors.size()); if (executor == null) return; diff --git a/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java index 5f0336be..a3928653 100644 --- a/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java @@ -36,15 +36,13 @@ import java.util.logging.Level; public final class StructureUtil { - public static void saveStructure(File configFile, org.bukkit.Location originLocation, - org.bukkit.Location[] positions) throws Exception { + public static void saveStructure(File configFile, org.bukkit.Location originLocation, org.bukkit.Location[] positions) throws Exception { if (!configFile.exists()) { configFile.createNewFile(); } LinkedHashMap blocks = SelectionLocation.getBlocks(originLocation, positions[0], positions[1]); - LinkedHashMap entities = SelectionLocation.getEntities(originLocation, positions[0], - positions[1]); + LinkedHashMap entities = SelectionLocation.getEntities(originLocation, positions[0], positions[1]); List blockData = new ArrayList<>(); List entityData = new ArrayList<>(); @@ -55,12 +53,10 @@ public final class StructureUtil { Location location = blocks.get(blockList); if (location.isOriginLocation()) { - originBlockLocation = location.getX() + ":" + location.getY() + ":" + location.getZ() + ":" - + positions[0].getWorld().getName(); + originBlockLocation = location.getX() + ":" + location.getY() + ":" + location.getZ() + ":" + positions[0].getWorld().getName(); if (blockList.getType() == Material.AIR) { - blockData.add(BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), - location.getZ())); + blockData.add(BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), location.getZ())); } } @@ -68,8 +64,7 @@ public final class StructureUtil { continue; } - blockData.add( - BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), location.getZ())); + blockData.add(BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), location.getZ())); } for (Entity entityList : entities.keySet()) { @@ -78,16 +73,14 @@ public final class StructureUtil { } Location location = entities.get(entityList); - entityData.add(EntityUtil.convertEntityToEntityData(entityList, location.getX(), location.getY(), - location.getZ())); + entityData.add(EntityUtil.convertEntityToEntityData(entityList, location.getX(), location.getY(), location.getZ())); } if (!originBlockLocation.isEmpty()) { originBlockLocation = originBlockLocation + ":" + originLocation.getYaw() + ":" + originLocation.getPitch(); } - String JSONString = new Gson().toJson(new Storage(new Gson().toJson(blockData), new Gson().toJson(entityData), - originBlockLocation, System.currentTimeMillis(), NMSUtil.getVersionNumber()), Storage.class); + String JSONString = new Gson().toJson(new Storage(new Gson().toJson(blockData), new Gson().toJson(entityData), originBlockLocation, System.currentTimeMillis(), NMSUtil.getVersionNumber()), Storage.class); FileOutputStream fileOutputStream = new FileOutputStream(configFile, false); fileOutputStream.write(Base64.getEncoder().encode(JSONString.getBytes(StandardCharsets.UTF_8))); @@ -113,10 +106,8 @@ public final class StructureUtil { String base64 = getBase64String(configFile); if (base64 == null) { - base64 = getBase64String( - new File(SkyBlock.getInstance().getDataFolder() + "/" + "structures", "default.structure")); - SkyBlock.getInstance().getLogger().log(Level.SEVERE, - "Unable to load structure '" + configFile.getAbsolutePath() + "' using default instead."); + base64 = getBase64String(new File(SkyBlock.getInstance().getDataFolder() + "/" + "structures", "default.structure")); + SkyBlock.getInstance().getLogger().log(Level.SEVERE, "Unable to load structure '" + configFile.getAbsolutePath() + "' using default instead."); } if (base64 == null) { @@ -126,8 +117,7 @@ public final class StructureUtil { Storage storage; try { - storage = new Gson().fromJson( - new String(Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8))), Storage.class); + storage = new Gson().fromJson(new String(Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8))), Storage.class); } catch (JsonSyntaxException e) { e.printStackTrace(); return null; @@ -159,44 +149,30 @@ public final class StructureUtil { for (BlockData blockDataList : blockData) { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { try { - org.bukkit.Location blockRotationLocation = LocationUtil - .rotateLocation(new org.bukkit.Location(location.getWorld(), blockDataList.getX(), - blockDataList.getY(), blockDataList.getZ()), type); - org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), - location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), - location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), - location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); + org.bukkit.Location blockRotationLocation = LocationUtil.rotateLocation(new org.bukkit.Location(location.getWorld(), blockDataList.getX(), blockDataList.getY(), blockDataList.getZ()), type); + org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), + location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); blockLocation.add(blockRotationLocation); BlockUtil.convertBlockDataToBlock(blockLocation.getBlock(), blockDataList); } catch (Exception e) { SkyBlock.getInstance().getLogger() - .warning("Unable to convert BlockData to Block for type {" + blockDataList.getMaterial() - + ":" + blockDataList.getData() + "} in structure {" + structure.getStructureFile() - + "}"); + .warning("Unable to convert BlockData to Block for type {" + blockDataList.getMaterial() + ":" + blockDataList.getData() + "} in structure {" + structure.getStructureFile() + "}"); } }); } Bukkit.getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { - for (EntityData entityDataList : (List) new Gson().fromJson(storage.getEntities(), - new TypeToken>() { - }.getType())) { + for (EntityData entityDataList : (List) new Gson().fromJson(storage.getEntities(), new TypeToken>() { + }.getType())) { Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { try { - org.bukkit.Location blockRotationLocation = LocationUtil - .rotateLocation(new org.bukkit.Location(location.getWorld(), entityDataList.getX(), - entityDataList.getY(), entityDataList.getZ()), type); - org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), - location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), - location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), - location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); + org.bukkit.Location blockRotationLocation = LocationUtil.rotateLocation(new org.bukkit.Location(location.getWorld(), entityDataList.getX(), entityDataList.getY(), entityDataList.getZ()), type); + org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), + location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); blockLocation.add(blockRotationLocation); EntityUtil.convertEntityDataToEntity(entityDataList, blockLocation, type); } catch (Exception e) { - SkyBlock.getInstance().getLogger() - .warning("Unable to convert EntityData to Entity for type {" - + entityDataList.getEntityType() + "} in structure {" - + structure.getStructureFile() + "}"); + SkyBlock.getInstance().getLogger().warning("Unable to convert EntityData to Entity for type {" + entityDataList.getEntityType() + "} in structure {" + structure.getStructureFile() + "}"); } }); } @@ -213,12 +189,9 @@ public final class StructureUtil { FileManager.Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); FileConfiguration configLoad = config.getFileConfiguration(); - ItemStack is = new ItemStack( - Material.valueOf(fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")) - .getFileConfiguration().getString("Island.Admin.Structure.Selector"))); + ItemStack is = new ItemStack(Material.valueOf(fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getString("Island.Admin.Structure.Selector"))); ItemMeta im = is.getItemMeta(); - im.setDisplayName(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Island.Structure.Tool.Item.Displayname"))); + im.setDisplayName(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Island.Structure.Tool.Item.Displayname"))); List itemLore = new ArrayList<>(); @@ -232,8 +205,7 @@ public final class StructureUtil { return is; } - public static org.bukkit.Location[] getFixedLocations(org.bukkit.Location location1, - org.bukkit.Location location2) { + public static org.bukkit.Location[] getFixedLocations(org.bukkit.Location location1, org.bukkit.Location location2) { org.bukkit.Location location1Fixed = location1.clone(); org.bukkit.Location location2Fixed = location2.clone(); diff --git a/src/main/java/com/songoda/skyblock/utils/version/Materials.java b/src/main/java/com/songoda/skyblock/utils/version/Materials.java index af6f889f..443bde7d 100644 --- a/src/main/java/com/songoda/skyblock/utils/version/Materials.java +++ b/src/main/java/com/songoda/skyblock/utils/version/Materials.java @@ -1,16 +1,17 @@ package com.songoda.skyblock.utils.version; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; - import java.lang.reflect.Method; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; +import java.util.Map; import java.util.Set; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + public enum Materials { ACACIA_BOAT("BOAT_ACACIA", 0), @@ -26,7 +27,7 @@ public enum Materials { ACACIA_SLAB("WOOD_STEP", 4), ACACIA_SIGN("STONE", 0, true), ACACIA_STAIRS("ACACIA_STAIRS", 4), - ACACIA_TRAPDOOR("TRAP_DOOR", 0, true), + ACACIA_TRAPDOOR("TRAP_DOOR", "OAK_TRAPDOOR", true), ACACIA_WALL_SIGN("STONE", 0, true), ACACIA_WOOD("LOG_2", 0), ACTIVATOR_RAIL("ACTIVATOR_RAIL", 0), @@ -70,7 +71,7 @@ public enum Materials { BIRCH_SIGN("STONE", 0, true), BIRCH_SLAB("WOOD_STEP", 2), BIRCH_STAIRS("BIRCH_WOOD_STAIRS", 0), - BIRCH_TRAPDOOR("TRAP_DOOR", 0, true), + BIRCH_TRAPDOOR("TRAP_DOOR", "OAK_TRAPDOOR", true), BIRCH_WALL_SIGN("STONE", 0, true), BIRCH_WOOD("LOG", 2), BLACK_BANNER("BANNER", 0), @@ -248,9 +249,9 @@ public enum Materials { DARK_OAK_PRESSURE_PLATE("WOOD_PLATE", 0, true), DARK_OAK_SAPLING("SAPLING", 5), DARK_OAK_SIGN("STONE", 0, true), - DARK_OAK_SLAB("WOOD_STEP", 0), + DARK_OAK_SLAB("WOOD_STEP", 5), DARK_OAK_STAIRS("DARK_OAK_STAIRS", 0), - DARK_OAK_TRAPDOOR("TRAP_DOOR", 0, true), + DARK_OAK_TRAPDOOR("TRAP_DOOR", "OAK_TRAPDOOR", true), DARK_OAK_WALL_SIGN("STONE", 0, true), DARK_OAK_WOOD("LOG_2", 1), DARK_PRISMARINE("PRISMARINE", 2), @@ -464,7 +465,7 @@ public enum Materials { JUNGLE_SIGN("STONE", 0, true), JUNGLE_SLAB("WOOD_STEP", 3), JUNGLE_STAIRS("JUNGLE_WOOD_STAIRS", 0), - JUNGLE_TRAPDOOR("TRAP_DOOR", 0, true), + JUNGLE_TRAPDOOR("TRAP_DOOR", "OAK_TRAPDOOR", true), JUNGLE_WALL_SIGN("STONE", 0, true), JUNGLE_WOOD("LOG", 3), KELP("STONE", 0, true), @@ -932,7 +933,7 @@ public enum Materials { SPRUCE_SIGN("STONE", 0, true), SPRUCE_SLAB("WOOD_STEP", 1), SPRUCE_STAIRS("SPRUCE_WOOD_STAIRS", 0), - SPRUCE_TRAPDOOR("TRAP_DOOR", 0, true), + SPRUCE_TRAPDOOR("TRAP_DOOR", 1, true), SPRUCE_WALL_SIGN("STONE", 0, true), SPRUCE_WOOD("LOG", 1), SQUID_SPAWN_EGG("MONSTER_EGG", 0), @@ -1056,22 +1057,30 @@ public enum Materials { ZOMBIE_PIGMAN_SPAWN_EGG("MONSTER_EGG", 0), ZOMBIE_SPAWN_EGG("MONSTER_EGG", 0), ZOMBIE_VILLAGER_SPAWN_EGG("MONSTER_EGG", 0), - ZOMBIE_WALL_HEAD("SKULL", 0); - + ZOMBIE_WALL_HEAD("SKULL", 0), + HONEYCOMB("STONE", 0, true), + HONEYCOMB_BLOCK("STONE", 0, true), + BEE_NEST("STONE", 0, true), + BEEHIVE("STONE", 0, true), + HONEY_BLOCK("stone", 0, true), + HONEY_BOTTLE("stone", 0, true), + BEE_SPAWN_EGG("stone", 0, true); + private static final Set ALL = Collections.unmodifiableSet(EnumSet.allOf(Materials.class)); - public static Set getAllMaterials(){ + public static Set getAllMaterials() { return ALL; } - + static int newV = -1; - private static HashMap cachedSearch = new HashMap<>(); + private static Map cachedSearch = new HashMap<>(); String old13Mat; String old12Mat; int data; boolean is13Plusonly; private Material cachedMaterial; private boolean isMaterialParsed = false; + private String actualMaterials; Materials(String old13Mat, String old12Mat, int data) { this(old13Mat, old12Mat, data, false); @@ -1092,6 +1101,15 @@ public enum Materials { this(null, old12Mat, data, is13Plusonly); } + Materials(String old12Mat, String actualMaterials, boolean is13Plusonly) { + this(old12Mat, 0, is13Plusonly); + this.actualMaterials = actualMaterials; + } + + public Materials getActualMaterials() { + return actualMaterials == null ? null : Materials.valueOf(actualMaterials); + } + public static boolean isNewVersion() { if (newV == 0) return false; if (newV == 1) return true; @@ -1128,22 +1146,24 @@ public enum Materials { // Try 1.13+ names for (Materials mat : ALL) { if (name.equalsIgnoreCase(mat.name())) { - if (pmat == null) - pmat = mat; + if (pmat == null) pmat = mat; - if (((byte) mat.data) == data) - return mat; + final Materials actual = mat.getActualMaterials(); + + if (actual != null && mat.is13Plusonly) return actual; + if (((byte) mat.data) == data) return mat; } } // Try 1.12- names for (Materials mat : ALL) { if (name.equalsIgnoreCase(mat.old12Mat)) { - if (pmat == null) - pmat = mat; + if (pmat == null) pmat = mat; - if (((byte) mat.data) == data) - return mat; + final Materials actual = mat.getActualMaterials(); + + if (actual != null && mat.is13Plusonly) return actual; + if (((byte) mat.data) == data) return mat; } } @@ -1197,8 +1217,7 @@ public enum Materials { if (this.isSpawner() && this != Materials.SPAWNER) { String spawnerType = this.name().replace("SPAWNER_", ""); for (EntityType entityType : EntityType.values()) - if (entityType.name().equalsIgnoreCase(spawnerType)) - return true; + if (entityType.name().equalsIgnoreCase(spawnerType)) return true; return false; } @@ -1241,29 +1260,28 @@ public enum Materials { String[] split = type.toString().split("_"); int length = split.length; switch (split[length - 1]) { - case "HELMET": - case "SHEARS": - case "HORSE_ARMOR": - case "TRIDENT": - case "TURTLE_HELMET": - case "ELYTRA": - case "HOE": - case "SHOVEL": - case "PICKAXE": - case "AXE": - case "SWORD": - case "BOOTS": - case "LEGGINGS": - case "CHESTPLATE": - return true; - default: - return false; + case "HELMET": + case "SHEARS": + case "HORSE_ARMOR": + case "TRIDENT": + case "TURTLE_HELMET": + case "ELYTRA": + case "HOE": + case "SHOVEL": + case "PICKAXE": + case "AXE": + case "SWORD": + case "BOOTS": + case "LEGGINGS": + case "CHESTPLATE": + return true; + default: + return false; } } public Material parseMaterial() { - if (this.cachedMaterial != null || this.isMaterialParsed) - return this.cachedMaterial; + if (this.cachedMaterial != null || this.isMaterialParsed) return this.cachedMaterial; if (this.isSpawner() && this != Materials.SPAWNER) { this.cachedMaterial = Materials.SPAWNER.parseMaterial(); diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index 4e9743a0..72d3742d 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -1,3 +1,12 @@ +ClassLocalization: + Materials: + LEGACY_DOUBLE_PLANT: 'Sunflower' + IslandRoles: + Coop: 'Coop' + Visitor: 'Visitor' + Member: 'Member' + Operator: 'Operator' + Owner: 'Owner' Command: Island: Bans: