From 9599935527a7f4874e3087466e35512926566f72 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 20 Jan 2024 08:21:35 -0800 Subject: [PATCH] Release 1.17.0 (#509) * Translate fr.yml via GitLocalize (#501) Co-authored-by: gitlocalize-app[bot] <55277160+gitlocalize-app[bot]@users.noreply.github.com> * Update Github Action build script * Added distribution required for Github Action * Update perms list * Fix deprecation code for setting world settings * Fix duplicate permission listing * Fix typo * Updated POM version numbers * Update Jacoco * Update pom.xml * Add Modrinth publish workflow for GitHub Actions * Fix syntax * Syntax * GitHub Action test * More Action * Update to BentoBox 2.0.0 API * Updated island blueprints to 1.20.4 Grass was missing. * Fix tests --------- Co-authored-by: gitlocalize-app[bot] <55277160+gitlocalize-app[bot]@users.noreply.github.com> --- .github/.gitignore | 1 + .github/workflows/build.yml | 9 +- .github/workflows/modrinth.yml | 15 + pom.xml | 11 +- .../world/bentobox/bskyblock/BSkyBlock.java | 16 +- .../generators/ChunkGeneratorWorld.java | 2 +- src/main/resources/addon.yml | 368 ++++++++++++------ .../resources/blueprints/classic-lshape.blu | Bin 1145 -> 1225 bytes src/main/resources/blueprints/double.blu | Bin 3657 -> 3628 bytes .../bentobox/bskyblock/BSkyBlockTest.java | 357 +++++++++-------- 10 files changed, 483 insertions(+), 296 deletions(-) create mode 100644 .github/.gitignore create mode 100644 .github/workflows/modrinth.yml diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c771fd5..825b18d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,21 +11,22 @@ jobs: name: Build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Set up JDK 17 - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: 'adopt' java-version: 17 - name: Cache SonarCloud packages - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - name: Cache Maven packages - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.m2 key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/modrinth.yml b/.github/workflows/modrinth.yml new file mode 100644 index 0000000..7f3d1c7 --- /dev/null +++ b/.github/workflows/modrinth.yml @@ -0,0 +1,15 @@ +name: Modrinth-Release +on: + release: + types: [published] +jobs: + build: + name: Deploy + runs-on: ubuntu-latest + steps: + - name: mc-publish + uses: Kir-Antipov/mc-publish@v3.3 + with: + # Publish on Modrinth. + modrinth-id: bskyblock + modrinth-token: ${{ secrets.MODRINTH_TOKEN }} \ No newline at end of file diff --git a/pom.xml b/pom.xml index e6af6d3..8486125 100644 --- a/pom.xml +++ b/pom.xml @@ -58,8 +58,8 @@ 2.0.9 - 1.19.4-R0.1-SNAPSHOT - 1.23.0 + 1.20.4-R0.1-SNAPSHOT + 2.0.0-SNAPSHOT ${build.version}-SNAPSHOT @@ -227,7 +227,8 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M5 + 3.1.2 + ${argLine} @@ -312,13 +313,15 @@ org.jacoco jacoco-maven-plugin - 0.8.7 + 0.8.10 true **/*Names* + + org/bukkit/Material* diff --git a/src/main/java/world/bentobox/bskyblock/BSkyBlock.java b/src/main/java/world/bentobox/bskyblock/BSkyBlock.java index bfad495..1a485ff 100644 --- a/src/main/java/world/bentobox/bskyblock/BSkyBlock.java +++ b/src/main/java/world/bentobox/bskyblock/BSkyBlock.java @@ -2,6 +2,7 @@ package world.bentobox.bskyblock; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.entity.SpawnCategory; import org.bukkit.WorldCreator; import org.bukkit.WorldType; import org.bukkit.event.Listener; @@ -129,24 +130,25 @@ public class BSkyBlock extends GameModeAddon implements Listener { WorldCreator wc = WorldCreator.name(worldName2).type(WorldType.FLAT).environment(env); World w = settings.isUseOwnGenerator() ? wc.createWorld() : wc.generator(chunkGenerator2).createWorld(); // Set spawn rates - if (w != null) { + // Set spawn rates + if (w != null && getSettings() != null) { if (getSettings().getSpawnLimitMonsters() > 0) { - w.setMonsterSpawnLimit(getSettings().getSpawnLimitMonsters()); + w.setSpawnLimit(SpawnCategory.MONSTER, getSettings().getSpawnLimitMonsters()); } if (getSettings().getSpawnLimitAmbient() > 0) { - w.setAmbientSpawnLimit(getSettings().getSpawnLimitAmbient()); + w.setSpawnLimit(SpawnCategory.AMBIENT, getSettings().getSpawnLimitAmbient()); } if (getSettings().getSpawnLimitAnimals() > 0) { - w.setAnimalSpawnLimit(getSettings().getSpawnLimitAnimals()); + w.setSpawnLimit(SpawnCategory.ANIMAL, getSettings().getSpawnLimitAnimals()); } if (getSettings().getSpawnLimitWaterAnimals() > 0) { - w.setWaterAnimalSpawnLimit(getSettings().getSpawnLimitWaterAnimals()); + w.setSpawnLimit(SpawnCategory.WATER_ANIMAL, getSettings().getSpawnLimitWaterAnimals()); } if (getSettings().getTicksPerAnimalSpawns() > 0) { - w.setTicksPerAnimalSpawns(getSettings().getTicksPerAnimalSpawns()); + w.setTicksPerSpawns(SpawnCategory.ANIMAL, getSettings().getTicksPerAnimalSpawns()); } if (getSettings().getTicksPerMonsterSpawns() > 0) { - w.setTicksPerMonsterSpawns(getSettings().getTicksPerMonsterSpawns()); + w.setTicksPerSpawns(SpawnCategory.MONSTER, getSettings().getTicksPerMonsterSpawns()); } } return w; diff --git a/src/main/java/world/bentobox/bskyblock/generators/ChunkGeneratorWorld.java b/src/main/java/world/bentobox/bskyblock/generators/ChunkGeneratorWorld.java index 6edd388..36f5223 100644 --- a/src/main/java/world/bentobox/bskyblock/generators/ChunkGeneratorWorld.java +++ b/src/main/java/world/bentobox/bskyblock/generators/ChunkGeneratorWorld.java @@ -122,7 +122,7 @@ public class ChunkGeneratorWorld extends ChunkGenerator { } break; case 2: - // Stalatite + // Stalactite for (int i = 0; i < rand.nextInt(10); i++) { setBlock(x, - 8 - i, z, Material.GLOWSTONE); } diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index 389261e..9fc3c75 100755 --- a/src/main/resources/addon.yml +++ b/src/main/resources/addon.yml @@ -8,88 +8,14 @@ repository: "BentoBoxWorld/BSkyBlock" authors: tastybento -permissions: - bskyblock.island: - description: Allow island command usage - default: true - bskyblock.island.create: - description: Allow island creation - default: true - bskyblock.island.home: - description: Allow teleporting to player island - default: true - bskyblock.island.homes: - description: Allow use of the homes command - default: true - bskyblock.island.sethome: - description: Let the player use the sethome command - default: true - bskyblock.island.info: - description: Let the player use the island info command - default: true +permissions: +# Non-command permissions bskyblock.island.lock: - description: Allows island locking - default: true - bskyblock.island.near: - description: Players can see nearby island names - default: true - bskyblock.island.expel: - description: Allows expelling of visitors - default: true - bskyblock.island.ban: - description: Allows banning of visitors - default: true - bskyblock.island.settings: - description: Player can see server settings - default: true - bskyblock.island.language: - description: Player can select a language - default: true - bskyblock.island.name: - description: Player can set the name of their island - default: true - bskyblock.island.spawn: - description: Player can use the island spawn command if spawn exists - default: true - bskyblock.island.reset: - description: Player can use the island reset or restart command - default: true - bskyblock.island.team: - description: Let a player use team command - default: true - bskyblock.island.team.setowner: - description: Let a player change the team owner - default: true - bskyblock.island.team.invite: - description: Let a player invite others - default: true - bskyblock.island.team.reject: - description: Let a player reject invites - default: true - bskyblock.island.team.leave: - description: Let a player leave the team - default: true - bskyblock.island.team.kick: - description: Let a player kick team members - default: true - bskyblock.island.team.accept: - description: Let a player accept invitations - default: true - bskyblock.island.team.trust: - description: Let a player use team trust commands - default: true - bskyblock.island.team.coop: - description: Let a player use team coop commands - default: true - bskyblock.island.team.promote: - description: Let a player use promote commands + description: Allows island locking in settings default: true bskyblock.settings.*: description: Allow use of settings on island default: true - bskyblock.mod.info: - description: Let a moderator see info on a player - default: op bskyblock.mod.clearreset: description: Allow clearing of island reset limit default: false @@ -105,47 +31,14 @@ permissions: bskyblock.mod.bypassexpel: description: Allow moderator to bypass island expulsion default: op - bskyblock.mod.switch: - description: Allows moderator to switch bypass protection on and off - default: op bskyblock.mod.lock: - description: Locks or unlocks an island + description: Allows lock or unlock of an island default: op bskyblock.mod.bypasslock: description: Bypasses an island lock default: op bskyblock.mod.bypassban: description: Bypasses island ban - default: op - bskyblock.mod.team: - description: Enables modification of teams via kick and add commands - default: false - bskyblock.admin.tp: - description: Allows teleport to an island - default: op - bskyblock.admin.clearresetall: - description: Allow clearing of island reset limit of all players - default: op - bskyblock.admin.reload: - description: Reload the config.yml - default: op - bskyblock.admin.delete: - description: Let a player completely remove a player (including island) - default: op - bskyblock.admin.register: - description: Let a player register the nearest island to another player. - default: op - bskyblock.admin.unregister: - description: Removes a player from an island without deleting the island blocks. - default: op - bskyblock.admin.setspawn: - description: Allows use of spawn tools - default: op - bskyblock.admin.setrange: - description: Allows setting of island protection range - default: op - bskyblock.admin.settingsreset: - description: Resets all the islands to default protection settings default: op bskyblock.admin.noban: description: Player cannot be banned from an island @@ -153,13 +46,250 @@ permissions: bskyblock.admin.noexpel: description: Player cannot be expelled from an island default: op - bskyblock.admin.setlanguage: - description: Resets all player languages and sets the default language - default: op + # Command permissions + bskyblock.island: + description: Allow use of '/island' command - the main island command + default: TRUE + bskyblock.island.home: + description: Allow use of '/island go' command - teleport you to your island + default: TRUE + bskyblock.island.spawn: + description: Allow use of '/island spawn' command - teleport you to the spawn + default: TRUE + bskyblock.island.create: + description: Allow use of '/island create' command - create an island, using optional blueprint (requires permission) + default: TRUE + bskyblock.island.reset: + description: Allow use of '/island reset' command - restart your island and remove the old one + default: TRUE + bskyblock.island.info: + description: Allow use of '/island info' command - display info about your island or the player's island + default: TRUE + bskyblock.island.settings: + description: Allow use of '/island settings' command - display island settings + default: TRUE + bskyblock.island.name: + description: Allow use of '/island setname' or '/island resetname' command - your island name + default: TRUE + bskyblock.island.language: + description: Allow use of '/island language' command - select language + default: TRUE + bskyblock.island.ban: + description: Allow use of '/island ban' or '/island unban' or '/island banlist' command - banned players + default: TRUE + bskyblock.island.expel: + description: Allow use of '/island expel' command - expel a player from your island + default: TRUE + bskyblock.island.near: + description: Allow use of '/island near' command - show the name of neighboring islands around you + default: TRUE + bskyblock.island.team: + description: Allow use of '/island team' command - manage your team + default: TRUE + bskyblock.island.team.invite: + description: Allow use of '/island team invite' command - invite a player to join your island + default: TRUE + bskyblock.island.team.leave: + description: Allow use of '/island team leave' command - leave your island + default: TRUE + bskyblock.island.team.setowner: + description: Allow use of '/island team setowner' command - transfer your island ownership to a member + default: TRUE + bskyblock.island.team.kick: + description: Allow use of '/island team kick' command - remove a member from your island + default: TRUE + bskyblock.island.team.accept: + description: Allow use of '/island team accept' command - accept an invitation + default: TRUE + bskyblock.island.team.reject: + description: Allow use of '/island team reject' command - reject an invitation + default: TRUE + bskyblock.island.team.coop: + description: Allow use of '/island team coop' or '/island team uncoop' command - coop rank from player + default: TRUE + bskyblock.island.team.trust: + description: Allow use of '/island team trust' or '/island team untrust' command - trusted player rank for player + default: TRUE + bskyblock.island.team.promote: + description: Allow use of '/island team promote' or '/island team demote' command - move a player's rank on your island + default: TRUE + bskyblock.island.sethome: + description: Allow use of '/island sethome' command - set your home teleport point + default: TRUE + bskyblock.island.deletehome: + description: Allow use of '/island deletehome' command - delete a home location + default: OP + bskyblock.island.renamehome: + description: Allow use of '/island renamehome' command - rename a home location + default: OP + bskyblock.island.homes: + description: Allow use of '/island homes' command - list your homes + default: TRUE + bskyblock.admin: + description: Allow use of '/bsbadmin' command - admin command + default: OP + bskyblock.admin.version: + description: Allow use of '/bsbadmin version' command - display BentoBox and addons versions + default: OP + bskyblock.admin.tp: + description: Allow use of '/bsbadmin tp/tpnether/tpend' command - teleport to a player's island + default: OP bskyblock.admin.getrank: - description: Get a player's rank - default: op + description: Allow use of '/bsbadmin getrank' command - get a player's rank on their island or the island of the owner + default: OP bskyblock.admin.setrank: - description: Set a player's rank - default: op - \ No newline at end of file + description: Allow use of '/bsbadmin setrank' command - set a player's rank on their island or the island of the owner + default: OP + bskyblock.mod.info: + description: Allow use of '/bsbadmin info' command - get info on where you are or player's island + default: OP + bskyblock.mod.team: + description: Allow use of '/bsbadmin team' command - manage teams + default: FALSE + bskyblock.mod.team.add: + description: Allow use of '/bsbadmin team add' command - add player to owner's team + default: OP + bskyblock.mod.team.disband: + description: Allow use of '/bsbadmin team disband' command - disband owner's team + default: OP + bskyblock.mod.team.fix: + description: Allow use of '/bsbadmin team fix' command - scans and fixes cross island membership in database + default: OP + bskyblock.mod.team.kick: + description: Allow use of '/bsbadmin team kick' command - kick a player from a team + default: OP + bskyblock.mod.team.setowner: + description: Allow use of '/bsbadmin team setowner' command - transfers island ownership to the player + default: OP + bskyblock.admin.blueprint: + description: Allow use of '/bsbadmin blueprint' command - manipulate blueprints + default: OP + bskyblock.admin.blueprint.load: + description: Allow use of '/bsbadmin blueprint load' command - load blueprint into the clipboard + default: OP + bskyblock.admin.blueprint.paste: + description: Allow use of '/bsbadmin blueprint paste' command - paste the clipboard to your location + default: OP + bskyblock.admin.blueprint.origin: + description: Allow use of '/bsbadmin blueprint origin' command - set the blueprint's origin to your position + default: OP + bskyblock.admin.blueprint.copy: + description: Allow use of '/bsbadmin blueprint copy' command - copy the clipboard set by pos1 and pos2 and optionally the air blocks + default: OP + bskyblock.admin.blueprint.save: + description: Allow use of '/bsbadmin blueprint save' command - save the copied clipboard + default: OP + bskyblock.admin.blueprint.rename: + description: Allow use of '/bsbadmin blueprint rename' command - rename a blueprint + default: OP + bskyblock.admin.blueprint.delete: + description: Allow use of '/bsbadmin blueprint delete' command - delete the blueprint + default: OP + bskyblock.admin.blueprint.pos1: + description: Allow use of '/bsbadmin blueprint pos1' command - set 1st corner of cuboid clipboard + default: OP + bskyblock.admin.blueprint.pos2: + description: Allow use of '/bsbadmin blueprint pos2' command - set 2nd corner of cuboid clipboard + default: OP + bskyblock.admin.blueprint.list: + description: Allow use of '/bsbadmin blueprint list' command - list available blueprints + default: OP + bskyblock.admin.register: + description: Allow use of '/bsbadmin register' command - register player to unowned island you are on + default: OP + bskyblock.admin.unregister: + description: Allow use of '/bsbadmin unregister' command - unregister owner from island, but keep island blocks + default: OP + bskyblock.admin.range: + description: Allow use of '/bsbadmin range' command - admin island range command + default: OP + bskyblock.admin.range.display: + description: Allow use of '/bsbadmin range display' command - show/hide island range indicators + default: OP + bskyblock.admin.range.set: + description: Allow use of '/bsbadmin range set' command - sets the island protected range + default: OP + bskyblock.admin.range.reset: + description: Allow use of '/bsbadmin range reset' command - resets the island protected range to the world default + default: OP + bskyblock.admin.range.add: + description: Allow use of '/bsbadmin range add' command - increases the island protected range + default: OP + bskyblock.admin.range.remove: + description: Allow use of '/bsbadmin range remove' command - decreases the island protected range + default: OP + bskyblock.admin.resets: + description: Allow use of '/bsbadmin resets' command - edit player reset values + default: OP + bskyblock.admin.resets.set: + description: Allow use of '/bsbadmin resets set' command - sets how many times this player has reset his island + default: OP + bskyblock.admin.resets.add: + description: Allow use of '/bsbadmin resets add' command - adds this player's island reset count + default: OP + bskyblock.admin.resets.remove: + description: Allow use of '/bsbadmin resets remove' command - reduces the player's island reset count + default: OP + bskyblock.admin.delete: + description: Allow use of '/bsbadmin delete' command - deletes a player's island + default: OP + bskyblock.admin.why: + description: Allow use of '/bsbadmin why' command - toggle console protection debug reporting + default: OP + bskyblock.admin.deaths: + description: Allow use of '/bsbadmin deaths' command - edit deaths of players + default: OP + bskyblock.admin.deaths.reset: + description: Allow use of '/bsbadmin deaths reset' command - resets deaths of the player + default: OP + bskyblock.admin.deaths.set: + description: Allow use of '/bsbadmin deaths set' command - sets deaths of the player + default: OP + bskyblock.admin.deaths.add: + description: Allow use of '/bsbadmin deaths add' command - adds deaths to the player + default: OP + bskyblock.admin.deaths.remove: + description: Allow use of '/bsbadmin deaths remove' command - removes deaths to the player + default: OP + bskyblock.admin.reload: + description: Allow use of '/bsbadmin reload' command - reload + default: OP + bskyblock.admin.setspawn: + description: Allow use of '/bsbadmin setspawn' command - set an island as spawn for this gamemode + default: OP + bskyblock.admin.setspawnpoint: + description: Allow use of '/bsbadmin setspawnpoint' command - set current location as spawn point for this island + default: OP + bskyblock.admin.resetflags: + description: Allow use of '/bsbadmin resetflags' command - Reset all islands to default flag settings in config.yml + default: OP + bskyblock.mod.switch: + description: Allow use of '/bsbadmin switch' command - switch on/off protection bypass + default: OP + bskyblock.admin.purge: + description: Allow use of '/bsbadmin purge' command - purge islands abandoned for more than [days] + default: OP + bskyblock.admin.purge.status: + description: Allow use of '/bsbadmin purge status' command - displays the status of the purge + default: OP + bskyblock.admin.purge.stop: + description: Allow use of '/bsbadmin purge stop' command - stop a purge in progress + default: OP + bskyblock.admin.purge.unowned: + description: Allow use of '/bsbadmin purge unowned' command - purge unowned islands + default: OP + bskyblock.admin.purge.protect: + description: Allow use of '/bsbadmin purge protect' command - toggle island purge protection + default: OP + bskyblock.admin.settings: + description: Allow use of '/bsbadmin settings' command - open settings GUI or set settings + default: OP + bskyblock.admin.setprotectionlocation: + description: Allow use of '/bsbadmin setprotectionlocation' command - set current location or [x y z] as center of island's protection area + default: OP + bskyblock.mod.deletehomes: + description: Allow use of '/bsbadmin deletehomes' command - deletes all named homes from an island + default: OP + bskyblock.mod.resetname: + description: Allow use of '/bsbadmin resetname' command - reset player island name + default: OP diff --git a/src/main/resources/blueprints/classic-lshape.blu b/src/main/resources/blueprints/classic-lshape.blu index 00b76b67457f36bbdb5a65f0103a32e7d8bf97fe..5a8562a0c27baae3998b252a3b14a42f2c123afc 100644 GIT binary patch literal 1225 zcmWIWW@Zs#;Nak3;O^}TXFviRKz5F9aYkZ6YRcI;f%&%#1di|LI#t}oq*5l-*}m?z z^VY0Y*Yfl=o%D7jI0}nY=Vo4gZ`ba$y)2Yr^8VD7Q$3R2>HYuxvqr5WT|d42j`!Z5 z6X$GVm9O4sE>>iie)|3YSb@b#*VFa-^!@5zI4={C_We55ek^nN@$Q`=_5Y**-a}sULp*T77f9Tj}b=_j*era20XJ`-4$xid{xZd@t2UN?BkLy1%iN69?79tk!# z9_Hpn2Nq};XmIgxF*hGNu)x58gNvt$sd>Qx1t61$hlx4)>XCq$*RF+Y#gA@{Q@}LP zIZD4PYp=$tuZJ2045MgC=ZFB@OB_u@H*c=-j0}=#8Bv{zk8XFxG64uO` zQL$QP@+42onAp=PaW*>t>vS?+tP5NG?Cw>r>oayASU00F){uF1l3LhSpEX`HBSMYh zs#oj&^R-?bD=@1pY`2HW+cSI0ejcjEM2>K^5xetv){_(y!`Xy`o|Ba z&ri-@9)9alx2N*1SOYb$$@_ScDr|LMFJCrCY^l_`4Mtnz<$o~pU5ozs%jsG}?G%SA z(;U8c~35yk`q05)%uSwe$L3JH@x^K~ zSL(MEudw_2K}O>LvyVJe7M^uBoH6Pzry~D_?{`hJoE$C zXFqwqdRe4J%Kd_>3kBPjKXA5)&9K;-dUT)F*3uJF)>kA_JFI{N2axrY&t%Ttz+o7bePzoZ-PQ25Q-|)GR z>Al&gqHU7Ke!b}19M5af7I`YKb!CoEdV1mCg6C&ux%LJgD?Q+*@%S6Nn?~~0!sN3` z#~_@?RZs5**cH?#uxNanCwohNM=*BN55DEUlWFOkTvni){^E>FJ@@h6PCv7U7FW#P zOk2Zzn{Bbk1F!voTm?(-Z~Q4_8JvAmO~!nZYtPk#zV}bed?dE>@VNuu<@ApVf4}5+ z{`<7``nwz7+paxdR-6A>TmNPI{MO2!%mLo)9MkhUpSrU!F#LCCUn!fb8U)#Ny)2WZj(NjKqS}tx@;$7dZ(03+Fk1g&``z zv*N|qUl(HTSC#9}F^s;Wb+IY&`>m+Q|LYcP&9=OIH*&eB_aDR0AJ2X_G;Y~Z=Jo5y zoFga2r+il0AMrsl*64WY3IUV(8#^bbM2da0{r+f^rOAKg^0ziRt7`tu<+_z(C#rfn z`W{sD1@)z` zxmWl7pZTqxJ38Gu{x&97>lbYOQFChI>kUC7i!z+ANtc&9?GshZ+d1KxK}ca`!sJ~) z@7%nUKQsQwt|^{@-F|yE-BJFyFtUc@i7?a876&`Q3H~fkgc*Mx`CTC|A z4Z(s3)LA}pHr6O9%;z|v&h)AC`^O0@B^Z|{vCQdWz+vo7UXBI_BSsTZMxm1|7eZJ% zRD>0R4X+r^x^}kqSHhj!Q>AMsh&uwsQn)9%k z#qux*XHlE*?X^p41*V*r5WlH>w!3JS(WzGLFz;!fp1p07tyc+|a(<0S=-#49TOXTd zu=@X-vNvv)+TK<3zRCYP_q_E*eaqK;*6Lm2CiAxkp7+$}V2k^`$u{`X?!Ehd2Agg8 zchjRheE<4m_v>Q+@A!FBA@7OZUNiT>1n0% zvgu*0t7e~H+2hmG>-$ufOF)u3A4;e@0J7RA0>Vulp*J{e*U(%ldxmd(88< zj}QOt7n^+EzUa;$<^XSYj?9g7U0yRYFvx2$Fa&rrGKnxC3JPR7P(gtTP>YQKZ&o&t OJR=a=0BLm=5Dx&almEm3 diff --git a/src/main/resources/blueprints/double.blu b/src/main/resources/blueprints/double.blu index 5e4c439951db3ec47efe8e4766dabce95c3e294f..05c6823dda07b9d824fdbdb4b1028e47a4abc01e 100644 GIT binary patch literal 3628 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 J|Lg(){snFo{K)_S delta 3635 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 h; - // Player - Player p = mock(Player.class); - // Sometimes use Mockito.withSettings().verboseLogging() - when(user.isOp()).thenReturn(false); - UUID uuid = UUID.randomUUID(); - when(user.getUniqueId()).thenReturn(uuid); - when(user.getPlayer()).thenReturn(p); - when(user.getName()).thenReturn("tastybento"); - User.setPlugin(plugin); + @SuppressWarnings("unchecked") + @BeforeClass + public static void beforeClass() throws IllegalAccessException, InvocationTargetException, IntrospectionException { + // This has to be done beforeClass otherwise the tests will interfere with each + // other + h = mock(AbstractDatabaseHandler.class); + // Database + PowerMockito.mockStatic(DatabaseSetup.class); + DatabaseSetup dbSetup = mock(DatabaseSetup.class); + when(DatabaseSetup.getDatabase()).thenReturn(dbSetup); + when(dbSetup.getHandler(any())).thenReturn(h); + when(h.saveObject(any())).thenReturn(CompletableFuture.completedFuture(true)); + } - // Island World Manager - IslandWorldManager iwm = mock(IslandWorldManager.class); - when(plugin.getIWM()).thenReturn(iwm); + @After + public void tearDown() throws IOException { + User.clearUsers(); + Mockito.framework().clearInlineMocks(); + deleteAll(new File("database")); + deleteAll(new File("database_backup")); + deleteAll(new File("addon.jar")); + deleteAll(new File("config.yml")); + deleteAll(new File("addons")); + } - // Player has island to begin with - island = mock(Island.class); - when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(island); - when(plugin.getIslands()).thenReturn(im); + private void deleteAll(File file) throws IOException { + if (file.exists()) { + Files.walk(file.toPath()).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } - // Locales - // Return the reference (USE THIS IN THE FUTURE) - when(user.getTranslation(Mockito.anyString())).thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); + } - // Server - PowerMockito.mockStatic(Bukkit.class); - Server server = mock(Server.class); - when(Bukkit.getServer()).thenReturn(server); - when(Bukkit.getLogger()).thenReturn(Logger.getAnonymousLogger()); - when(Bukkit.getPluginManager()).thenReturn(mock(PluginManager.class)); + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + // Set up plugin + Whitebox.setInternalState(BentoBox.class, "instance", plugin); + when(plugin.getLogger()).thenReturn(Logger.getAnonymousLogger()); + // Command manager + CommandsManager cm = mock(CommandsManager.class); + when(plugin.getCommandsManager()).thenReturn(cm); - // Addon - addon = new BSkyBlock(); - File jFile = new File("addon.jar"); - List lines = Arrays.asList("# BSkyBlock Configuration", "uniqueId: config"); - Path path = Paths.get("config.yml"); - Files.write(path, lines, Charset.forName("UTF-8")); - try (JarOutputStream tempJarOutputStream = new JarOutputStream(new FileOutputStream(jFile))) { - //Added the new files to the jar. - try (FileInputStream fis = new FileInputStream(path.toFile())) { + // Player + Player p = mock(Player.class); + // Sometimes use Mockito.withSettings().verboseLogging() + when(user.isOp()).thenReturn(false); + UUID uuid = UUID.randomUUID(); + when(user.getUniqueId()).thenReturn(uuid); + when(user.getPlayer()).thenReturn(p); + when(user.getName()).thenReturn("tastybento"); + User.setPlugin(plugin); - byte[] buffer = new byte[1024]; - int bytesRead = 0; - JarEntry entry = new JarEntry(path.toString()); - tempJarOutputStream.putNextEntry(entry); - while((bytesRead = fis.read(buffer)) != -1) { - tempJarOutputStream.write(buffer, 0, bytesRead); - } - } - } - File dataFolder = new File("addons/BSkyBlock"); - addon.setDataFolder(dataFolder); - addon.setFile(jFile); - AddonDescription desc = new AddonDescription.Builder("bentobox", "bskyblock", "1.3").description("test").authors("tasty").build(); - addon.setDescription(desc); - // Addons manager - AddonsManager am = mock(AddonsManager.class); - when(plugin.getAddonsManager()).thenReturn(am); + // Island World Manager + IslandWorldManager iwm = mock(IslandWorldManager.class); + when(plugin.getIWM()).thenReturn(iwm); - // Flags manager - when(plugin.getFlagsManager()).thenReturn(fm); - when(fm.getFlags()).thenReturn(Collections.emptyList()); + // Player has island to begin with + island = mock(Island.class); + when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(island); + when(plugin.getIslands()).thenReturn(im); - // Settings - when(plugin.getSettings()).thenReturn(settings); + // Locales + // Return the reference (USE THIS IN THE FUTURE) + when(user.getTranslation(Mockito.anyString())) + .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); - } + // Server + PowerMockito.mockStatic(Bukkit.class); + Server server = mock(Server.class); + when(Bukkit.getServer()).thenReturn(server); + when(Bukkit.getLogger()).thenReturn(Logger.getAnonymousLogger()); + when(Bukkit.getPluginManager()).thenReturn(mock(PluginManager.class)); - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception { - new File("addon.jar").delete(); - new File("config.yml").delete(); - new File("addons/BSkyBlock","config.yml").delete(); - new File("addons/BSkyBlock").delete(); - new File("addons").delete(); - } + // Addon + addon = new BSkyBlock(); + File jFile = new File("addon.jar"); + List lines = Arrays.asList("# BSkyBlock Configuration", "uniqueId: config"); + Path path = Paths.get("config.yml"); + Files.write(path, lines, Charset.forName("UTF-8")); + try (JarOutputStream tempJarOutputStream = new JarOutputStream(new FileOutputStream(jFile))) { + // Added the new files to the jar. + try (FileInputStream fis = new FileInputStream(path.toFile())) { - /** - * Test method for {@link world.bentobox.bskyblock.BSkyBlock#onLoad()}. - */ - @Test - public void testOnLoad() { - addon.onLoad(); - // Check that config.yml file has been saved - File check = new File("addons/BSkyBlock","config.yml"); - assertTrue(check.exists()); - } + byte[] buffer = new byte[1024]; + int bytesRead = 0; + JarEntry entry = new JarEntry(path.toString()); + tempJarOutputStream.putNextEntry(entry); + while ((bytesRead = fis.read(buffer)) != -1) { + tempJarOutputStream.write(buffer, 0, bytesRead); + } + } + } + File dataFolder = new File("addons/BSkyBlock"); + addon.setDataFolder(dataFolder); + addon.setFile(jFile); + AddonDescription desc = new AddonDescription.Builder("bentobox", "bskyblock", "1.3").description("test") + .authors("tasty").build(); + addon.setDescription(desc); + // Addons manager + AddonsManager am = mock(AddonsManager.class); + when(plugin.getAddonsManager()).thenReturn(am); - /** - * Test method for {@link world.bentobox.bskyblock.BSkyBlock#onEnable()}. - */ - @Test - public void testOnEnable() { - testOnLoad(); - addon.onEnable(); - assertTrue(addon.getPlayerCommand().isPresent()); - assertTrue(addon.getAdminCommand().isPresent()); - } + // Flags manager + when(plugin.getFlagsManager()).thenReturn(fm); + when(fm.getFlags()).thenReturn(Collections.emptyList()); - /** - * Test method for {@link world.bentobox.bskyblock.BSkyBlock#onReload()}. - */ - @Test - public void testOnReload() { - addon.onReload(); - // Check that config.yml file has been saved - File check = new File("addons/BSkyBlock","config.yml"); - assertTrue(check.exists()); - } + // Settings + when(plugin.getSettings()).thenReturn(settings); - /** - * Test method for {@link world.bentobox.bskyblock.BSkyBlock#createWorlds()}. - */ - @Test - public void testCreateWorlds() { - addon.onLoad(); - addon.createWorlds(); - Mockito.verify(plugin).log("[bskyblock] Creating BSkyBlock world ..."); - Mockito.verify(plugin).log("[bskyblock] Creating BSkyBlock's Nether..."); - Mockito.verify(plugin).log("[bskyblock] Creating BSkyBlock's End World..."); - } + } - /** - * Test method for {@link world.bentobox.bskyblock.BSkyBlock#getSettings()}. - */ - @Test - public void testGetSettings() { - addon.onLoad(); - assertNotNull(addon.getSettings()); - } + /** + * Test method for {@link world.bentobox.bskyblock.BSkyBlock#onLoad()}. + */ + @Test + public void testOnLoad() { + addon.onLoad(); + // Check that config.yml file has been saved + File check = new File("addons/BSkyBlock", "config.yml"); + assertTrue(check.exists()); + } - /** - * Test method for {@link world.bentobox.bskyblock.BSkyBlock#getWorldSettings()}. - */ - @Test - public void testGetWorldSettings() { - addon.onLoad(); - assertEquals(addon.getSettings(), addon.getWorldSettings()); - } + /** + * Test method for {@link world.bentobox.bskyblock.BSkyBlock#onEnable()}. + */ + @Test + public void testOnEnable() { + testOnLoad(); + addon.onEnable(); + assertTrue(addon.getPlayerCommand().isPresent()); + assertTrue(addon.getAdminCommand().isPresent()); + } - /** - * Test method for {@link world.bentobox.bskyblock.BSkyBlock#getDefaultWorldGenerator(java.lang.String, java.lang.String)}. - */ - @Test - public void testGetDefaultWorldGeneratorStringString() { - assertNull(addon.getDefaultWorldGenerator("", "")); - addon.onLoad(); - addon.createWorlds(); - assertNotNull(addon.getDefaultWorldGenerator("", "")); - assertTrue(addon.getDefaultWorldGenerator("", "") instanceof ChunkGeneratorWorld); - } + /** + * Test method for {@link world.bentobox.bskyblock.BSkyBlock#onReload()}. + */ + @Test + public void testOnReload() { + addon.onReload(); + // Check that config.yml file has been saved + File check = new File("addons/BSkyBlock", "config.yml"); + assertTrue(check.exists()); + } + + /** + * Test method for {@link world.bentobox.bskyblock.BSkyBlock#createWorlds()}. + */ + @Test + public void testCreateWorlds() { + addon.onLoad(); + addon.createWorlds(); + Mockito.verify(plugin).log("[bskyblock] Creating BSkyBlock world ..."); + Mockito.verify(plugin).log("[bskyblock] Creating BSkyBlock's Nether..."); + Mockito.verify(plugin).log("[bskyblock] Creating BSkyBlock's End World..."); + } + + /** + * Test method for {@link world.bentobox.bskyblock.BSkyBlock#getSettings()}. + */ + @Test + public void testGetSettings() { + addon.onLoad(); + assertNotNull(addon.getSettings()); + } + + /** + * Test method for + * {@link world.bentobox.bskyblock.BSkyBlock#getWorldSettings()}. + */ + @Test + public void testGetWorldSettings() { + addon.onLoad(); + assertEquals(addon.getSettings(), addon.getWorldSettings()); + } + + /** + * Test method for + * {@link world.bentobox.bskyblock.BSkyBlock#getDefaultWorldGenerator(java.lang.String, java.lang.String)}. + */ + @Test + public void testGetDefaultWorldGeneratorStringString() { + assertNull(addon.getDefaultWorldGenerator("", "")); + addon.onLoad(); + addon.createWorlds(); + assertNotNull(addon.getDefaultWorldGenerator("", "")); + assertTrue(addon.getDefaultWorldGenerator("", "") instanceof ChunkGeneratorWorld); + } }