From df2b445002a256697fd06c3d3fb2df79d045ce79 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 8 Nov 2021 21:28:12 -0800 Subject: [PATCH] Release 1.18.0 (#1876) ## Change Log * Island range perms could be 2x island distance This could allow protection ranges to be much greater than the island range and therefore overflow into adjacent islands. https://github.com/BentoBoxWorld/BentoBox/issues/1851 * Ensure maxEverProtectionRange is less than range. https://github.com/BentoBoxWorld/BentoBox/issues/1851 * Added test class for Island. * Added access to private fields for JUnit tests * Added Sonar Properties to POM * Changes to analyze using sonar. * Remove zip reference * Avoid zipSlip vulnerability. * Removed the unused WorldEdit hook. (#1853) If someone wants to add it back later they can, but this code does nothing right now. * Requires nonNull parameters for User.instanceOf (#1852) * Requires nonNull parameters for User.instanceOf The only reason why User.instanceOf was returning a potential null was if the parameter was null. Further absolutely no null checking was being done, so the assumption was that User.instanceOf should never return a null. This corrects the annotations and requires non-Null parameters. * Remove null player test * Fix JavaDoc for GameModeAddon inWorld method * Fix max-range bug * Remove illegal tag as it's not needed * Code smell reduction * Add missing packages so tests can pass. * Non null user methods (#1856) * This makes some User methods non-null. Instead of returning null, some methods will throw an error if they are called on non-Players. This means code does not have to do null checks. * Perform null check in method. * Null check * Fix test * Fix test. * Npe squashing (#1857) * Fix hanging [uuid] in info. * NPE checking * Make getProtectionCenter nonNull * More NPE fixes. * Fix test * Make getPlayer() and getOfflinePlayer() nonNull returns This requires addons to not use null checks and instead us the isPlayer or isOfflinePlayer methods. * NPE blockers * Deprecate CompositeCommand isPlayer method. * Fix test * Use isPlayer instead of null check. Refactor code to be easier to understand. * Fix * Fix some code smells. * Prevent NPE possibility. * Fix "ugly" enchant name. (#1858) Enchant names did not have a touch of Util#prettifyText code. * Remove deprecated events. * Fix IslandSethomeCommand test * Fix tests - just counts of events. * Added API to get a translation without color conversion It may be necessary to read the translation without converting colors to Bukkit colors. * Fix tests. * Fix test. * Version NPE protections. * 1.18.0 (#1860) * Mark all home-related methods in PlayersManager as deprecated. * Fix bug where maxHomes was shown as null * Version 1.18.0 API changes may break compatibility with Addons. * Remove usage of deprecated methods except for migration code. * Prevent NPE. Check isPlayer instead of getWorld() == null * Fix nullability issue and added to @Deprecated annotations * Added deprecation notices to home methods in Players * Fix missing color conversion for translations. * Fix mis-statement of island protection coordinates in info command. * Fix tests * Fix missing edge deletion of island. The bounding box was erroneously being made smaller when it was not required because the inBounds check does that already. https://github.com/BentoBoxWorld/BentoBox/issues/1863 * Prevent rare NPE * Ensure oldIsland is never null. * Refactored setowner command and added test class * API: Require getWorldSettings to be a game mode world * Fix tests and refactor code * Fix test IWM inWworld needs to return true * Fix test IWM inWorld must return true * Put default getHandlers back in for backwards compatibility Without them, too many older addons break. They need updating to have their own handlers. Once that is done, the default ones can be removed maybe. * Refactor code for clarity. * NPE protections * Prevent NPE @Poslovich - you were right! * Throw an error if player is null * Prevent NPE * Prevent NPE * Do a null check * World should never be null. * Require non-null world * Require owner to be non-null. It should never be null * Prevent NPEs * Clear the going home flag for edge cases There were a few potential times when the flag may not have been cleared. These were mostly teleport failure scenarios. Hopefully, this is all of them. https://github.com/BentoBoxWorld/BentoBox/issues/1864 * Shift priority of EntityPortalEnterEvent to HIGH https://github.com/BentoBoxWorld/BentoBox/issues/1866 This will allow other plugins running at NORMAL to cancel the event before BentoBox does something. * Increase priority of EntityPortalEvent listener https://github.com/BentoBoxWorld/BentoBox/issues/1866 * Fixes https://github.com/BentoBoxWorld/BentoBox/issues/1868 * Code refactoring around User.getInstance(player) Co-authored-by: BONNe Co-authored-by: Fredthedoggy <45927799+Fredthedoggy@users.noreply.github.com> Co-authored-by: Justin Co-authored-by: gecko10000 <60494179+levtey@users.noreply.github.com> --- .github/workflows/build.yml | 17 +- pom.xml | 36 +- .../world/bentobox/bentobox/BentoBox.java | 10 +- .../bentobox/api/addons/AddonClassLoader.java | 6 +- .../bentobox/api/addons/AddonDescription.java | 39 +- .../bentobox/api/addons/GameModeAddon.java | 8 +- .../api/commands/CompositeCommand.java | 17 +- .../commands/admin/AdminDeleteCommand.java | 71 +- .../commands/admin/AdminSetrankCommand.java | 4 + .../commands/admin/AdminSetspawnCommand.java | 6 +- .../commands/admin/AdminSwitchCommand.java | 6 +- .../commands/admin/AdminTeleportCommand.java | 13 +- .../admin/AdminUnregisterCommand.java | 5 +- .../blueprints/AdminBlueprintCommand.java | 9 +- .../AdminBlueprintOriginCommand.java | 3 +- .../blueprints/AdminBlueprintPos1Command.java | 2 +- .../blueprints/AdminBlueprintPos2Command.java | 2 +- .../blueprints/AdminBlueprintSaveCommand.java | 2 +- .../admin/conversations/NamePrompt.java | 6 +- .../admin/range/AdminRangeAddCommand.java | 3 +- .../admin/range/AdminRangeRemoveCommand.java | 3 +- .../admin/range/AdminRangeResetCommand.java | 3 +- .../admin/range/AdminRangeSetCommand.java | 3 +- .../admin/team/AdminTeamKickCommand.java | 1 - .../admin/team/AdminTeamSetownerCommand.java | 23 +- .../api/commands/island/IslandBanCommand.java | 8 +- .../commands/island/IslandResetCommand.java | 49 +- .../commands/island/IslandSethomeCommand.java | 12 +- .../commands/island/IslandUnbanCommand.java | 10 +- .../team/IslandTeamInviteAcceptCommand.java | 7 +- .../island/team/IslandTeamKickCommand.java | 2 +- .../island/team/IslandTeamPromoteCommand.java | 2 +- .../team/IslandTeamSetownerCommand.java | 29 +- .../bentobox/api/events/BentoBoxEvent.java | 46 +- .../api/events/BentoBoxReadyEvent.java | 3 +- .../api/events/OfflineMessageEvent.java | 3 +- .../api/events/addon/AddonDisableEvent.java | 3 +- .../api/events/addon/AddonEnableEvent.java | 3 +- .../bentobox/api/events/addon/AddonEvent.java | 72 +- .../api/events/addon/AddonGeneralEvent.java | 3 +- .../api/events/addon/AddonLoadEvent.java | 3 +- .../api/events/command/CommandEvent.java | 3 +- .../flags/FlagProtectionChangeEvent.java | 3 +- .../events/flags/FlagSettingChangeEvent.java | 3 +- .../flags/FlagWorldSettingChangeEvent.java | 3 +- .../api/events/island/IslandBanEvent.java | 3 +- .../api/events/island/IslandCreateEvent.java | 2 +- .../api/events/island/IslandCreatedEvent.java | 3 +- .../island/IslandDeleteChunksEvent.java | 3 +- .../api/events/island/IslandDeleteEvent.java | 3 +- .../api/events/island/IslandDeletedEvent.java | 3 +- .../api/events/island/IslandEnterEvent.java | 5 +- .../api/events/island/IslandEvent.java | 576 +------- .../api/events/island/IslandExitEvent.java | 5 +- .../api/events/island/IslandExpelEvent.java | 3 +- .../api/events/island/IslandGeneralEvent.java | 3 +- .../api/events/island/IslandLockEvent.java | 3 +- .../events/island/IslandNewIslandEvent.java | 3 +- .../events/island/IslandPreCreateEvent.java | 3 +- .../events/island/IslandPreclearEvent.java | 2 +- .../IslandProtectionRangeChangeEvent.java | 3 +- .../events/island/IslandRankChangeEvent.java | 3 +- .../events/island/IslandRegisteredEvent.java | 3 +- .../events/island/IslandReservedEvent.java | 3 +- .../api/events/island/IslandResetEvent.java | 2 +- .../events/island/IslandResettedEvent.java | 2 +- .../api/events/island/IslandUnbanEvent.java | 3 +- .../api/events/island/IslandUnlockEvent.java | 3 +- .../island/IslandUnregisteredEvent.java | 3 +- .../api/events/team/TeamDeleteEvent.java | 3 +- .../bentobox/api/events/team/TeamEvent.java | 199 +-- .../api/events/team/TeamGeneralEvent.java | 3 +- .../api/events/team/TeamInfoEvent.java | 3 +- .../api/events/team/TeamInviteEvent.java | 3 +- .../api/events/team/TeamJoinEvent.java | 3 +- .../api/events/team/TeamJoinedEvent.java | 3 +- .../api/events/team/TeamKickEvent.java | 3 +- .../api/events/team/TeamLeaveEvent.java | 3 +- .../api/events/team/TeamRejectEvent.java | 3 +- .../api/events/team/TeamSetownerEvent.java | 3 +- .../api/events/team/TeamUninviteEvent.java | 3 +- .../bentobox/bentobox/api/flags/Flag.java | 9 +- .../bentobox/api/flags/FlagListener.java | 4 +- .../api/flags/clicklisteners/CycleClick.java | 2 +- .../api/localization/TextVariables.java | 4 + .../api/panels/builders/PanelItemBuilder.java | 2 +- .../api/panels/reader/TemplateReader.java | 89 +- .../AddonPlaceholderExpansion.java | 7 +- .../BasicPlaceholderExpansion.java | 10 +- .../BentoBoxPlaceholderExpansion.java | 7 +- .../bentobox/bentobox/api/user/Notifier.java | 3 +- .../bentobox/bentobox/api/user/User.java | 111 +- .../bentobox/blueprints/Blueprint.java | 2 +- .../blueprints/BlueprintClipboard.java | 8 +- .../bentobox/blueprints/BlueprintPaster.java | 10 +- .../conversation/DescriptionPrompt.java | 3 +- .../DescriptionSuccessPrompt.java | 5 +- .../conversation/NameConversationPrefix.java | 3 +- .../blueprints/conversation/NamePrompt.java | 2 +- .../conversation/NameSuccessPrompt.java | 4 +- .../json/BentoboxTypeAdapterFactory.java | 2 +- .../mongodb/MongoDBDatabaseHandler.java | 3 +- .../bentobox/database/objects/Island.java | 109 +- .../bentobox/database/objects/Players.java | 24 +- .../transition/TransitionDatabaseHandler.java | 3 +- .../database/yaml/YamlDatabaseConnector.java | 2 +- .../database/yaml/YamlDatabaseHandler.java | 2 +- .../bentobox/hooks/LangUtilsHook.java | 6 +- .../bentobox/hooks/WorldEditHook.java | 41 - .../placeholders/PlaceholderAPIHook.java | 2 +- .../hooks/placeholders/PlaceholderHook.java | 4 +- .../bentobox/listeners/BlockEndDragon.java | 10 +- .../bentobox/listeners/JoinLeaveListener.java | 4 +- .../listeners/PlayerEntityPortalEvent.java | 5 +- .../PortalTeleportationListener.java | 9 +- .../clicklisteners/CommandCycleClick.java | 2 +- .../CommandRankClickListener.java | 4 +- .../clicklisteners/GeoLimitClickListener.java | 5 +- .../clicklisteners/MobLimitClickListener.java | 5 +- .../protection/BlockInteractionListener.java | 2 +- .../flags/protection/BreakBlocksListener.java | 50 +- .../flags/protection/BucketListener.java | 20 +- .../protection/EntityInteractListener.java | 19 +- .../protection/ExperiencePickupListener.java | 6 +- .../flags/protection/LockAndBanListener.java | 5 +- .../flags/settings/MobSpawnListener.java | 2 +- .../listeners/flags/settings/PVPListener.java | 37 +- .../flags/worldsettings/CreeperListener.java | 2 +- .../worldsettings/EnterExitListener.java | 16 +- .../InvincibleVisitorsListener.java | 4 +- .../worldsettings/IslandRespawnListener.java | 2 +- .../bentobox/managers/AddonsManager.java | 20 +- .../managers/BlueprintClipboardManager.java | 16 +- .../bentobox/managers/IslandWorldManager.java | 11 +- .../bentobox/managers/IslandsManager.java | 63 +- .../bentobox/managers/PlayersManager.java | 16 + .../DefaultNewIslandLocationStrategy.java | 2 +- .../bentobox/managers/island/NewIsland.java | 6 +- .../settings/WorldDefaultSettingsTab.java | 3 +- .../bentobox/bentobox/util/IslandInfo.java | 12 +- .../bentobox/bentobox/util/MyBiomeGrid.java | 9 +- .../util/teleport/SafeSpotTeleport.java | 26 + .../admin/AdminDeleteCommandTest.java | 61 +- .../commands/admin/AdminInfoCommandTest.java | 4 +- .../admin/AdminTeleportCommandTest.java | 5 + .../admin/AdminUnregisterCommandTest.java | 3 - .../team/AdminTeamDisbandCommandTest.java | 4 +- .../admin/team/AdminTeamKickCommandTest.java | 6 +- .../island/IslandInfoCommandTest.java | 8 +- .../island/IslandResetCommandTest.java | 8 +- .../island/IslandSethomeCommandTest.java | 6 +- .../island/IslandUnbanCommandTest.java | 30 +- .../IslandTeamInviteAcceptCommandTest.java | 5 +- .../team/IslandTeamInviteCommandTest.java | 7 +- .../team/IslandTeamSetownerCommandTest.java | 279 ++++ .../api/events/island/IslandEventTest.java | 2 +- .../bentobox/bentobox/api/flags/FlagTest.java | 4 +- .../bentobox/bentobox/api/user/UserTest.java | 27 +- .../bentobox/database/objects/IslandTest.java | 1253 +++++++++++++++++ .../listeners/JoinLeaveListenerTest.java | 4 +- .../flags/settings/MobSpawnListenerTest.java | 4 + .../worldsettings/EnterExitListenerTest.java | 1 + .../worldsettings/PistonPushListenerTest.java | 27 +- .../worldsettings/RemoveMobsListenerTest.java | 1 + .../managers/IslandWorldManagerTest.java | 8 - .../bentobox/managers/IslandsManagerTest.java | 2 - .../bentobox/managers/PlayersManagerTest.java | 38 - .../managers/island/NewIslandTest.java | 21 +- 168 files changed, 2503 insertions(+), 1633 deletions(-) delete mode 100644 src/main/java/world/bentobox/bentobox/hooks/WorldEditHook.java create mode 100644 src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommandTest.java create mode 100644 src/test/java/world/bentobox/bentobox/database/objects/IslandTest.java diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f2e3dc802..4c3b6a629 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,15 +24,18 @@ jobs: path: ~/.sonar/cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - - name: Cache local Maven repository + - name: Cache Maven packages uses: actions/cache@v2 with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- - - name: Build - run: mvn --batch-mode clean org.jacoco:jacoco-maven-plugin:prepare-agent install + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Build and analyze + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=BentoBoxWorld_BentoBox + - run: mvn --batch-mode clean org.jacoco:jacoco-maven-plugin:prepare-agent install - run: mkdir staging && cp target/*.jar staging - name: Save artifacts uses: actions/upload-artifact@v2 diff --git a/pom.xml b/pom.xml index cccabe1e3..7cd32f209 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,9 @@ -LOCAL - 1.17.3 + 1.18.0 + bentobox-world + https://sonarcloud.io @@ -339,7 +341,33 @@ 3.0.0-M5 - --illegal-access=permit + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.math=ALL-UNNAMED + --add-opens java.base/java.io=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens + java.base/java.util.stream=ALL-UNNAMED + --add-opens java.base/java.text=ALL-UNNAMED + --add-opens + java.base/java.util.regex=ALL-UNNAMED + --add-opens + java.base/java.nio.channels.spi=ALL-UNNAMED + --add-opens java.base/sun.nio.ch=ALL-UNNAMED + --add-opens java.base/java.net=ALL-UNNAMED + --add-opens + java.base/java.util.concurrent=ALL-UNNAMED + --add-opens java.base/sun.nio.fs=ALL-UNNAMED + --add-opens java.base/sun.nio.cs=ALL-UNNAMED + --add-opens java.base/java.nio.file=ALL-UNNAMED + --add-opens + java.base/java.nio.charset=ALL-UNNAMED + --add-opens + java.base/java.lang.reflect=ALL-UNNAMED + --add-opens + java.logging/java.util.logging=ALL-UNNAMED + --add-opens java.base/java.lang.ref=ALL-UNNAMED + --add-opens java.base/java.util.jar=ALL-UNNAMED + --add-opens java.base/java.util.zip=ALL-UNNAMED @@ -358,12 +386,12 @@ false -Xdoclint:none - + ${java.home}/bin/javadoc attach-javadocs - install + package jar diff --git a/src/main/java/world/bentobox/bentobox/BentoBox.java b/src/main/java/world/bentobox/bentobox/BentoBox.java index abb2d79e4..e510c6bb3 100644 --- a/src/main/java/world/bentobox/bentobox/BentoBox.java +++ b/src/main/java/world/bentobox/bentobox/BentoBox.java @@ -2,7 +2,6 @@ package world.bentobox.bentobox; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import org.apache.commons.lang.exception.ExceptionUtils; import org.bukkit.Bukkit; @@ -23,7 +22,6 @@ import world.bentobox.bentobox.database.DatabaseSetup; import world.bentobox.bentobox.hooks.DynmapHook; import world.bentobox.bentobox.hooks.MultiverseCoreHook; import world.bentobox.bentobox.hooks.VaultHook; -import world.bentobox.bentobox.hooks.WorldEditHook; import world.bentobox.bentobox.hooks.placeholders.PlaceholderAPIHook; import world.bentobox.bentobox.listeners.BannedCommands; import world.bentobox.bentobox.listeners.BlockEndDragon; @@ -103,7 +101,7 @@ public class BentoBox extends JavaPlugin { logWarning("BentoBox is tested only on the following Spigot versions:"); List versions = ServerCompatibility.ServerVersion.getVersions(ServerCompatibility.Compatibility.COMPATIBLE, ServerCompatibility.Compatibility.SUPPORTED) - .stream().map(ServerCompatibility.ServerVersion::toString).collect(Collectors.toList()); + .stream().map(ServerCompatibility.ServerVersion::toString).toList(); logWarning(String.join(", ", versions)); logWarning("**************************************"); @@ -172,6 +170,7 @@ public class BentoBox extends JavaPlugin { completeSetup(loadTime); } catch (Exception e) { fireCriticalError(e.getMessage(), ""); + e.printStackTrace(); } }); } @@ -227,7 +226,6 @@ public class BentoBox extends JavaPlugin { // Register additional hooks hooksManager.registerHook(new DynmapHook()); - hooksManager.registerHook(new WorldEditHook()); // TODO: re-enable after rework //hooksManager.registerHook(new LangUtilsHook()); @@ -333,7 +331,7 @@ public class BentoBox extends JavaPlugin { * @since 1.16.0 */ public PlayersManager getPlayersManager() { - return playersManager; + return getPlayers(); } /** @@ -352,7 +350,7 @@ public class BentoBox extends JavaPlugin { * @since 1.16.0 */ public IslandsManager getIslandsManager() { - return islandsManager; + return getIslands(); } private static void setInstance(BentoBox plugin) { diff --git a/src/main/java/world/bentobox/bentobox/api/addons/AddonClassLoader.java b/src/main/java/world/bentobox/bentobox/api/addons/AddonClassLoader.java index 6f5b6a512..85ba85c88 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/AddonClassLoader.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/AddonClassLoader.java @@ -79,8 +79,8 @@ public class AddonClassLoader extends URLClassLoader { */ @NonNull public static AddonDescription asDescription(YamlConfiguration data) throws InvalidAddonDescriptionException { - AddonDescription.Builder builder = new AddonDescription.Builder(data.getString("main"), data.getString("name"), data.getString("version")) - .authors(data.getString("authors")) + AddonDescription.Builder builder = new AddonDescription.Builder(Objects.requireNonNull(data.getString("main")), Objects.requireNonNull(data.getString("name")), Objects.requireNonNull(data.getString("version"))) + .authors(Objects.requireNonNull(data.getString("authors"))) .metrics(data.getBoolean("metrics", true)) .repository(data.getString("repository", "")); @@ -92,7 +92,7 @@ public class AddonClassLoader extends URLClassLoader { if (softDepend != null) { builder.softDependencies(Arrays.asList(softDepend.split("\\s*,\\s*"))); } - builder.icon(Material.getMaterial(data.getString("icon", "PAPER"))); + builder.icon(Objects.requireNonNull(Material.getMaterial(data.getString("icon", "PAPER")))); String apiVersion = data.getString("api-version"); if (apiVersion != null) { diff --git a/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java b/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java index 388aac2bc..b7e35b142 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java @@ -158,26 +158,35 @@ public final class AddonDescription { * @return the permissions * @since 1.13.0 */ + @Nullable public ConfigurationSection getPermissions() { return permissions; } public static class Builder { - private @NonNull - final String main; - private @NonNull - final String name; - private @NonNull - final String version; - private @NonNull String description = ""; - private @NonNull List authors = new ArrayList<>(); - private @NonNull List dependencies = new ArrayList<>(); - private @NonNull List softDependencies = new ArrayList<>(); + @NonNull + private final String main; + @NonNull + private final String name; + @NonNull + private final String version; + @NonNull + private String description = ""; + @NonNull + private List authors = new ArrayList<>(); + @NonNull + private List dependencies = new ArrayList<>(); + @NonNull + private List softDependencies = new ArrayList<>(); private boolean metrics = true; - private @NonNull String repository = ""; - private @NonNull Material icon = Material.PAPER; - private @NonNull String apiVersion = "1"; - private @Nullable ConfigurationSection permissions; + @NonNull + private String repository = ""; + @NonNull + private Material icon = Material.PAPER; + @NonNull + private String apiVersion = "1"; + @Nullable + private ConfigurationSection permissions; /** * @since 1.1 @@ -279,6 +288,6 @@ public final class AddonDescription { @Override public String toString() { return "AddonDescription [" + (name != null ? "name=" + name + ", " : "") - + (version != null ? "version=" + version : "") + "]"; + + "version=" + version + "]"; } } diff --git a/src/main/java/world/bentobox/bentobox/api/addons/GameModeAddon.java b/src/main/java/world/bentobox/bentobox/api/addons/GameModeAddon.java index 0474cb021..54cd8f6a1 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/GameModeAddon.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/GameModeAddon.java @@ -52,9 +52,9 @@ public abstract class GameModeAddon extends Addon { public abstract WorldSettings getWorldSettings(); /** - * Checks if a player is in any of the island worlds - * @param loc - player to check - * @return true if in a world or false if not + * Checks if location is governed by this game mode + * @param loc - location to check + * @return true if location in covered by this addon or false if not */ public boolean inWorld(Location loc) { return Util.sameWorld(loc.getWorld(), islandWorld); @@ -63,7 +63,7 @@ public abstract class GameModeAddon extends Addon { /** * Checks if world is governed by this game mode * @param world - world to check - * @return true if in a world or false if not + * @return true if world in covered by this addon or false if not * @since 1.2.0 */ public boolean inWorld(World world) { diff --git a/src/main/java/world/bentobox/bentobox/api/commands/CompositeCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/CompositeCommand.java index 931dd5ebe..d2a8d6f73 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/CompositeCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/CompositeCommand.java @@ -218,7 +218,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi * subcommands until it finds the right object and then runs execute on it. */ @Override - public boolean execute(CommandSender sender, String label, String[] args) { + public boolean execute(@NonNull CommandSender sender, @NonNull String label, String[] args) { // Get the User instance for this sender User user = User.getInstance(sender); // Fire an event to see if this command should be cancelled @@ -352,7 +352,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi } @Override - public BentoBox getPlugin() { + public @NonNull BentoBox getPlugin() { return plugin; } @@ -422,7 +422,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi } @Override - public String getUsage() { + public @NonNull String getUsage() { return "/" + usage; } @@ -476,9 +476,12 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi * Convenience method to check if a user is a player * @param user - the User * @return true if sender is a player + * @deprecated use {@link User#isPlayer()} + * @forRemove 1.18.0 */ + @Deprecated protected boolean isPlayer(User user) { - return user.getPlayer() != null; + return user.isPlayer(); } /** @@ -521,7 +524,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi * @return The instance of this {@link Command}. */ @Override - public Command setDescription(String description) { + public @NonNull Command setDescription(@NonNull String description) { super.setDescription(description); return this; } @@ -575,7 +578,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi * This creates the full linking chain of commands */ @Override - public Command setUsage(String usage) { + public @NonNull Command setUsage(@NonNull String usage) { // Go up the chain CompositeCommand parentCommand = getParent(); StringBuilder u = new StringBuilder().append(getLabel()).append(" ").append(usage); @@ -590,7 +593,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi @Override @NonNull - public List tabComplete(final CommandSender sender, final String alias, final String[] args) { + public List tabComplete(final @NonNull CommandSender sender, final @NonNull String alias, final String[] args) { List options = new ArrayList<>(); // Get command object based on args entered so far CompositeCommand command = getCommandFromArgs(args); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommand.java index c7791be91..256c65d9d 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommand.java @@ -41,12 +41,14 @@ public class AdminDeleteCommand extends ConfirmableCommand { user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); return false; } - if (!getIslands().hasIsland(getWorld(), targetUUID)) { + UUID owner = getIslands().getOwner(getWorld(), targetUUID); + if (owner == null) { user.sendMessage("general.errors.player-has-no-island"); return false; } + // Team members should be kicked before deleting otherwise the whole team will become weird - if (getIslands().inTeam(getWorld(), targetUUID) && getIslands().getOwner(getWorld(), targetUUID).equals(targetUUID)) { + if (getIslands().inTeam(getWorld(), targetUUID) && owner.equals(targetUUID)) { user.sendMessage("commands.admin.delete.cannot-delete-owner"); return false; } @@ -55,11 +57,6 @@ public class AdminDeleteCommand extends ConfirmableCommand { @Override public boolean execute(User user, String label, List args) { - // If args are not right, show help - if (args.size() != 1) { - showHelp(this, user); - return false; - } // Get target UUID targetUUID = getPlayers().getUUID(args.get(0)); // Confirm @@ -85,38 +82,12 @@ public class AdminDeleteCommand extends ConfirmableCommand { User target = User.getInstance(targetUUID); // Remove them from this island (it still exists and will be deleted later) getIslands().removePlayer(getWorld(), targetUUID); - if (target.isOnline()) { - // Execute commands when leaving - Util.runCommands(user, getIWM().getOnLeaveCommands(getWorld()), "leave"); - // Remove money inventory etc. - if (getIWM().isOnLeaveResetEnderChest(getWorld())) { - target.getPlayer().getEnderChest().clear(); - } - if (getIWM().isOnLeaveResetInventory(getWorld())) { - target.getPlayer().getInventory().clear(); - } - if (getSettings().isUseEconomy() && getIWM().isOnLeaveResetMoney(getWorld())) { - getPlugin().getVault().ifPresent(vault -> vault.withdraw(target, vault.getBalance(target))); - } - // Reset the health - if (getIWM().isOnLeaveResetHealth(getWorld())) { - Util.resetHealth(target.getPlayer()); - } - - // Reset the hunger - if (getIWM().isOnLeaveResetHunger(getWorld())) { - target.getPlayer().setFoodLevel(20); - } - - // Reset the XP - if (getIWM().isOnLeaveResetXP(getWorld())) { - target.getPlayer().setTotalExperience(0); - } + if (target.isPlayer() && target.isOnline()) { + cleanUp(user, target); } vector = oldIsland.getCenter().toVector(); getIslands().deleteIsland(oldIsland, true, targetUUID); } - getPlayers().clearHomeLocations(getWorld(), targetUUID); if (vector == null) { user.sendMessage("general.success"); } else { @@ -124,6 +95,36 @@ public class AdminDeleteCommand extends ConfirmableCommand { } } + private void cleanUp(User user, User target) { + // Execute commands when leaving + Util.runCommands(user, getIWM().getOnLeaveCommands(getWorld()), "leave"); + // Remove money inventory etc. + if (getIWM().isOnLeaveResetEnderChest(getWorld())) { + target.getPlayer().getEnderChest().clear(); + } + if (getIWM().isOnLeaveResetInventory(getWorld())) { + target.getPlayer().getInventory().clear(); + } + if (getSettings().isUseEconomy() && getIWM().isOnLeaveResetMoney(getWorld())) { + getPlugin().getVault().ifPresent(vault -> vault.withdraw(target, vault.getBalance(target))); + } + // Reset the health + if (getIWM().isOnLeaveResetHealth(getWorld())) { + Util.resetHealth(target.getPlayer()); + } + + // Reset the hunger + if (getIWM().isOnLeaveResetHunger(getWorld())) { + target.getPlayer().setFoodLevel(20); + } + + // Reset the XP + if (getIWM().isOnLeaveResetXP(getWorld())) { + target.getPlayer().setTotalExperience(0); + } + + } + @Override public Optional> tabComplete(User user, String alias, List args) { String lastArg = !args.isEmpty() ? args.get(args.size()-1) : ""; diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommand.java index 43b9297a7..7a835c70a 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommand.java @@ -101,6 +101,10 @@ public class AdminSetrankCommand extends CompositeCommand { } else { island = getIslands().getIsland(getWorld(), targetUUID); } + if (island == null) { + user.sendMessage("general.errors.player-has-no-island"); + return false; + } int currentRank = island.getRank(target); island.setRank(target, rankValue); IslandEvent.builder() diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetspawnCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetspawnCommand.java index be634c117..ef7476e4f 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetspawnCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetspawnCommand.java @@ -65,10 +65,8 @@ public class AdminSetspawnCommand extends ConfirmableCommand { .build(); } // If island is owned, then unregister the owner and any members - new ImmutableSet.Builder().addAll(i.getMembers().keySet()).build().forEach(m -> { - getIslands().removePlayer(getWorld(), m); - getPlayers().clearHomeLocations(getWorld(), m); - }); + new ImmutableSet.Builder().addAll(i.getMembers().keySet()).build().forEach(m -> + getIslands().removePlayer(getWorld(), m)); } getIslands().setSpawn(i); i.setSpawnPoint(World.Environment.NORMAL, user.getLocation()); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSwitchCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSwitchCommand.java index c1b5cd39d..7e0b822f6 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSwitchCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSwitchCommand.java @@ -44,15 +44,15 @@ public class AdminSwitchCommand extends ConfirmableCommand { @Override public boolean execute(User user, String label, List args) { - boolean switchState = user.getMetaData("AdminCommandSwitch").map(MetaDataValue::asBoolean).orElse(false); + boolean switchState = user.getMetaData(META_TAG).map(MetaDataValue::asBoolean).orElse(false); if (switchState) { // Turn off - user.putMetaData("AdminCommandSwitch", new MetaDataValue(false)); + user.putMetaData(META_TAG, new MetaDataValue(false)); user.sendMessage("commands.admin.switch.adding"); // Adding protection bypass user.sendMessage("general.success"); } else { // Turn on - user.putMetaData("AdminCommandSwitch", new MetaDataValue(true)); + user.putMetaData(META_TAG, new MetaDataValue(true)); user.sendMessage("commands.admin.switch.removing"); // Removing protection bypass user.sendMessage("general.success"); } diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommand.java index 279531f66..abdeffe81 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommand.java @@ -19,6 +19,7 @@ import world.bentobox.bentobox.util.teleport.SafeSpotTeleport; public class AdminTeleportCommand extends CompositeCommand { + private static final String NOT_SAFE = "general.errors.no-safe-location-found"; private @Nullable UUID targetUUID; private @Nullable User userToTeleport; @@ -86,9 +87,13 @@ public class AdminTeleportCommand extends CompositeCommand { } else if (getLabel().equals("tpend")) { world = getPlugin().getIWM().getEndWorld(getWorld()); } + if (world == null) { + user.sendMessage(NOT_SAFE); + return false; + } Location warpSpot = getSpot(world); - if (world == null || warpSpot == null) { - user.sendMessage("general.errors.no-safe-location-found"); + if (warpSpot == null) { + user.sendMessage(NOT_SAFE); return false; } @@ -99,7 +104,7 @@ public class AdminTeleportCommand extends CompositeCommand { Player player = user.getPlayer(); if (args.size() == 2) { player = userToTeleport.getPlayer(); - failureMessage = userToTeleport.getTranslation("general.errors.no-safe-location-found"); + failureMessage = userToTeleport.getTranslation(NOT_SAFE); } // Teleport @@ -118,7 +123,7 @@ public class AdminTeleportCommand extends CompositeCommand { return island.getSpawnPoint(world.getEnvironment()); } // Return the default island protection center - return getIslands().getIslandLocation(getWorld(), targetUUID).toVector().toLocation(world); + return island.getProtectionCenter().toVector().toLocation(world); } @Override diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommand.java index bdc933463..3d64b3f1f 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommand.java @@ -75,10 +75,7 @@ public class AdminUnregisterCommand extends ConfirmableCommand { .rankChange(RanksManager.OWNER_RANK, RanksManager.VISITOR_RANK) .build(); // Remove all island members - oldIsland.getMemberSet().forEach(m -> { - getIslands().removePlayer(getWorld(), m); - getPlayers().clearHomeLocations(getWorld(), m); - }); + oldIsland.getMemberSet().forEach(m -> getIslands().removePlayer(getWorld(), m)); // Remove all island players that reference this island oldIsland.getMembers().clear(); getIslands().save(oldIsland); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintCommand.java index 2d7514c90..a869ed72a 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintCommand.java @@ -64,21 +64,22 @@ public class AdminBlueprintCommand extends ConfirmableCommand { protected void showClipboard(User user) { displayClipboards.putIfAbsent(user, Bukkit.getScheduler().scheduleSyncRepeatingTask(getPlugin(), () -> { - if (!user.getPlayer().isOnline()) { + if (!user.isPlayer() || !user.getPlayer().isOnline()) { hideClipboard(user); } if (clipboards.containsKey(user.getUniqueId())) { BlueprintClipboard clipboard = clipboards.get(user.getUniqueId()); - if (clipboard.getPos1() != null && clipboard.getPos2() != null) { - paintAxis(user, clipboard); - } + paintAxis(user, clipboard); } }, 20, 20)); } private void paintAxis(User user, BlueprintClipboard clipboard) { + if (clipboard.getPos1() == null || clipboard.getPos2() == null) { + return; + } int minX = Math.min(clipboard.getPos1().getBlockX(), clipboard.getPos2().getBlockX()); int minY = Math.min(clipboard.getPos1().getBlockY(), clipboard.getPos2().getBlockY()); int minZ = Math.min(clipboard.getPos1().getBlockZ(), clipboard.getPos2().getBlockZ()); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintOriginCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintOriginCommand.java index 0a4def22e..df254b3bb 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintOriginCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintOriginCommand.java @@ -1,6 +1,7 @@ package world.bentobox.bentobox.api.commands.admin.blueprints; import java.util.List; +import java.util.Objects; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -34,7 +35,7 @@ public class AdminBlueprintOriginCommand extends CompositeCommand { } // Get the block player is looking at - Block b = user.getPlayer().getLineOfSight(null, 20).stream().filter(x -> !x.getType().equals(Material.AIR)).findFirst().orElse(null); + Block b = Objects.requireNonNull(user.getPlayer()).getLineOfSight(null, 20).stream().filter(x -> !x.getType().equals(Material.AIR)).findFirst().orElse(null); if (b != null) { clipboard.setOrigin(b.getLocation().toVector()); user.getPlayer().sendBlockChange(b.getLocation(), Material.REDSTONE_BLOCK.createBlockData()); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintPos1Command.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintPos1Command.java index 1fa6d9e44..534124ce6 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintPos1Command.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintPos1Command.java @@ -30,7 +30,7 @@ public class AdminBlueprintPos1Command extends CompositeCommand { return false; } clipboard.setPos1(user.getLocation()); - user.sendMessage("commands.admin.blueprint.set-pos1", "[vector]", Util.xyz(clipboard.getPos1().toVector())); + user.sendMessage("commands.admin.blueprint.set-pos1", "[vector]", Util.xyz(user.getLocation().toVector())); parent.getClipboards().put(user.getUniqueId(), clipboard); parent.showClipboard(user); return true; diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintPos2Command.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintPos2Command.java index 481ece58c..9c1bcae44 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintPos2Command.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintPos2Command.java @@ -30,7 +30,7 @@ public class AdminBlueprintPos2Command extends CompositeCommand { return false; } clipboard.setPos2(user.getLocation()); - user.sendMessage("commands.admin.blueprint.set-pos2", "[vector]", Util.xyz((clipboard.getPos2()).toVector())); + user.sendMessage("commands.admin.blueprint.set-pos2", "[vector]", Util.xyz(user.getLocation().toVector())); parent.getClipboards().put(user.getUniqueId(), clipboard); parent.showClipboard(user); return true; diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintSaveCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintSaveCommand.java index 7c7cece13..7ec6af2ba 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintSaveCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/blueprints/AdminBlueprintSaveCommand.java @@ -55,7 +55,7 @@ public class AdminBlueprintSaveCommand extends ConfirmableCommand { private boolean hideAndSave(User user, AdminBlueprintCommand parent, BlueprintClipboard clipboard, String name) { parent.hideClipboard(user); boolean result = new BlueprintClipboardManager(getPlugin(), parent.getBlueprintsFolder(), clipboard).save(user, name); - if (result) { + if (result && clipboard.getBlueprint() != null) { getPlugin().getBlueprintsManager().addBlueprint(getAddon(), clipboard.getBlueprint()); } return result; diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/conversations/NamePrompt.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/conversations/NamePrompt.java index 62d2055d1..4569489e8 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/conversations/NamePrompt.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/conversations/NamePrompt.java @@ -22,7 +22,7 @@ public class NamePrompt extends StringPrompt { private final String oldName; private final BentoBox plugin; - public NamePrompt(BentoBox plugin, @NonNull Island island, User user, String oldName) { + public NamePrompt(BentoBox plugin, @NonNull Island island, @NonNull User user, String oldName) { this.plugin = plugin; this.island = island; this.user = user; @@ -30,12 +30,12 @@ public class NamePrompt extends StringPrompt { } @Override - public String getPromptText(ConversationContext context) { + public @NonNull String getPromptText(@NonNull ConversationContext context) { return user.getTranslation("commands.island.renamehome.enter-new-name"); } @Override - public Prompt acceptInput(ConversationContext context, String input) { + public Prompt acceptInput(@NonNull ConversationContext context, String input) { if (island.renameHome(oldName, input)) { plugin.getIslands().save(island); Bukkit.getScheduler().runTask(plugin, () -> user.sendMessage("general.success")); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeAddCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeAddCommand.java index 67a9981c4..ff64a6796 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeAddCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeAddCommand.java @@ -1,6 +1,7 @@ package world.bentobox.bentobox.api.commands.admin.range; import java.util.List; +import java.util.Objects; import java.util.UUID; import org.eclipse.jdt.annotation.NonNull; @@ -52,7 +53,7 @@ public class AdminRangeAddCommand extends CompositeCommand { return false; } - Island island = getIslands().getIsland(getWorld(), targetUUID); + Island island = Objects.requireNonNull(getIslands().getIsland(getWorld(), targetUUID)); int newRange = island.getProtectionRange() + Integer.parseInt(args.get(1)); if (newRange > island.getRange() * 2) { diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeRemoveCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeRemoveCommand.java index ee7692a11..5615ec5e7 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeRemoveCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeRemoveCommand.java @@ -1,6 +1,7 @@ package world.bentobox.bentobox.api.commands.admin.range; import java.util.List; +import java.util.Objects; import java.util.UUID; import org.eclipse.jdt.annotation.NonNull; @@ -52,7 +53,7 @@ public class AdminRangeRemoveCommand extends CompositeCommand { return false; } - Island island = getIslands().getIsland(getWorld(), targetUUID); + Island island = Objects.requireNonNull(getIslands().getIsland(getWorld(), targetUUID)); int newRange = island.getProtectionRange() - Integer.parseInt(args.get(1)); if (newRange <= 1) { diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeResetCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeResetCommand.java index dce72db0d..4a76593d9 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeResetCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeResetCommand.java @@ -2,6 +2,7 @@ package world.bentobox.bentobox.api.commands.admin.range; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.UUID; @@ -45,7 +46,7 @@ public class AdminRangeResetCommand extends CompositeCommand { } // Get island - Island island = getIslands().getIsland(getWorld(), targetUUID); + Island island = Objects.requireNonNull(getIslands().getIsland(getWorld(), targetUUID)); // Get old range for event int oldRange = island.getProtectionRange(); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeSetCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeSetCommand.java index aff757749..c63912004 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeSetCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/range/AdminRangeSetCommand.java @@ -2,6 +2,7 @@ package world.bentobox.bentobox.api.commands.admin.range; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.UUID; @@ -52,7 +53,7 @@ public class AdminRangeSetCommand extends CompositeCommand { int range = Integer.parseInt(args.get(1)); // Get island - Island island = getIslands().getIsland(getWorld(), targetUUID); + Island island = Objects.requireNonNull(getIslands().getIsland(getWorld(), targetUUID)); // Do some sanity checks to make sure the new protection range won't cause problems if (range < 1) { diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamKickCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamKickCommand.java index 5f44195ed..77c5174a3 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamKickCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamKickCommand.java @@ -72,7 +72,6 @@ public class AdminTeamKickCommand extends CompositeCommand { target.sendMessage("commands.admin.team.kick.admin-kicked"); getIslands().removePlayer(getWorld(), targetUUID); - getPlayers().clearHomeLocations(getWorld(), targetUUID); user.sendMessage("commands.admin.team.kick.success", TextVariables.NAME, target.getName(), "[owner]", getPlayers().getName(island.getOwner())); // Fire event so add-ons know diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamSetownerCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamSetownerCommand.java index 77945a9ba..2001367cc 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamSetownerCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamSetownerCommand.java @@ -1,6 +1,7 @@ package world.bentobox.bentobox.api.commands.admin.team; import java.util.List; +import java.util.Objects; import java.util.UUID; import world.bentobox.bentobox.api.commands.CompositeCommand; @@ -54,11 +55,10 @@ public class AdminTeamSetownerCommand extends CompositeCommand { } // Get the User corresponding to the current owner - User previousOwner = User.getInstance(previousOwnerUUID); User target = User.getInstance(targetUUID); // Fire event so add-ons know - Island island = getIslands().getIsland(getWorld(), targetUUID); + Island island = Objects.requireNonNull(getIslands().getIsland(getWorld(), targetUUID)); // Call the setowner event TeamEvent.builder() .island(island) @@ -82,15 +82,16 @@ public class AdminTeamSetownerCommand extends CompositeCommand { user.sendMessage("commands.admin.team.setowner.success", TextVariables.NAME, args.get(0)); // Call the rank change event for the old island owner - // We need to call it AFTER the actual change. - IslandEvent.builder() - .island(island) - .involvedPlayer(previousOwnerUUID) - .admin(true) - .reason(IslandEvent.Reason.RANK_CHANGE) - .rankChange(RanksManager.OWNER_RANK, island.getRank(previousOwner)) - .build(); - + if (previousOwnerUUID != null) { + // We need to call it AFTER the actual change. + IslandEvent.builder() + .island(island) + .involvedPlayer(previousOwnerUUID) + .admin(true) + .reason(IslandEvent.Reason.RANK_CHANGE) + .rankChange(RanksManager.OWNER_RANK, island.getRank(previousOwnerUUID)) + .build(); + } return true; } } diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanCommand.java index ce9788d3a..7d65bf42f 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanCommand.java @@ -51,8 +51,8 @@ public class IslandBanCommand extends CompositeCommand { return false; } // Check rank to use command - Island island = getIslands().getIsland(getWorld(), user); - int rank = Objects.requireNonNull(island).getRank(user); + Island island = Objects.requireNonNull(getIslands().getIsland(getWorld(), user)); + int rank = island.getRank(user); if (rank < island.getRankCommand(getUsage())) { user.sendMessage("general.errors.insufficient-rank", TextVariables.RANK, user.getTranslation(getPlugin().getRanksManager().getRank(rank))); return false; @@ -72,7 +72,7 @@ public class IslandBanCommand extends CompositeCommand { user.sendMessage("commands.island.ban.cannot-ban-member"); return false; } - if (getIslands().getIsland(getWorld(), playerUUID).isBanned(targetUUID)) { + if (island.isBanned(targetUUID)) { user.sendMessage("commands.island.ban.player-already-banned"); return false; } @@ -95,7 +95,7 @@ public class IslandBanCommand extends CompositeCommand { } private boolean ban(@NonNull User issuer, User target) { - Island island = getIslands().getIsland(getWorld(), issuer.getUniqueId()); + Island island = Objects.requireNonNull(getIslands().getIsland(getWorld(), issuer.getUniqueId())); // Check if player can ban any more players int banLimit = issuer.getPermissionValue(getPermissionPrefix() + "ban.maxlimit", getIWM().getBanLimit(getWorld())); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandResetCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandResetCommand.java index 0d12369c9..6e059af6b 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandResetCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandResetCommand.java @@ -113,31 +113,19 @@ public class IslandResetCommand extends ConfirmableCommand { } } + /** + * Reset island + * @param user user + * @param name name of Blueprint Bundle + * @return true if successful + */ private boolean resetIsland(User user, String name) { // Get the player's old island Island oldIsland = getIslands().getIsland(getWorld(), user); - - // Fire island preclear event - IslandEvent.builder() - .involvedPlayer(user.getUniqueId()) - .reason(Reason.PRECLEAR) - .island(oldIsland) - .oldIsland(oldIsland) - .location(oldIsland.getCenter()) - .build(); - - // Reset the island + if (oldIsland != null) { + deleteOldIsland(user, oldIsland); + } user.sendMessage("commands.island.create.creating-island"); - - // Kick all island members (including the owner) - kickMembers(oldIsland); - - // Add a reset - getPlayers().addReset(getWorld(), user.getUniqueId()); - - // Reset the homes of the player - getPlayers().clearHomeLocations(getWorld(), user.getUniqueId()); - // Create new island and then delete the old one try { Builder builder = NewIsland.builder() @@ -157,6 +145,25 @@ public class IslandResetCommand extends ConfirmableCommand { return true; } + private void deleteOldIsland(User user, Island oldIsland) { + // Fire island preclear event + IslandEvent.builder() + .involvedPlayer(user.getUniqueId()) + .reason(Reason.PRECLEAR) + .island(oldIsland) + .oldIsland(oldIsland) + .location(oldIsland.getCenter()) + .build(); + + // Reset the island + + // Kick all island members (including the owner) + kickMembers(oldIsland); + + // Add a reset + getPlayers().addReset(getWorld(), user.getUniqueId()); + } + /** * Kicks the members (incl. owner) of the island. * @since 1.7.0 diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandSethomeCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandSethomeCommand.java index 2a7a84168..5b8b5e139 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandSethomeCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandSethomeCommand.java @@ -6,6 +6,7 @@ import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.commands.ConfirmableCommand; +import world.bentobox.bentobox.api.configuration.WorldSettings; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; @@ -40,7 +41,7 @@ public class IslandSethomeCommand extends ConfirmableCommand { // Check number of homes int maxHomes = getIslands().getMaxHomes(island); if (getIslands().getNumberOfHomesIfAdded(island, String.join(" ", args)) > maxHomes) { - user.sendMessage("commands.island.sethome.too-many-homes", TextVariables.NUMBER, String.valueOf(island.getMaxHomes())); + user.sendMessage("commands.island.sethome.too-many-homes", TextVariables.NUMBER, String.valueOf(maxHomes)); user.sendMessage("commands.island.sethome.homes-are"); island.getHomes().keySet().stream().filter(s -> !s.isEmpty()).forEach(s -> user.sendMessage("commands.island.sethome.home-list-syntax", TextVariables.NAME, s)); return false; @@ -51,29 +52,30 @@ public class IslandSethomeCommand extends ConfirmableCommand { @Override public boolean execute(User user, String label, List args) { String number = String.join(" ", args); + WorldSettings ws = getIWM().getWorldSettings(user.getWorld()); // Check if the player is in the Nether if (getIWM().isNether(user.getWorld())) { // Check if he is (not) allowed to set his home here - if (!getIWM().getWorldSettings(user.getWorld()).isAllowSetHomeInNether()) { + if (!ws.isAllowSetHomeInNether()) { user.sendMessage("commands.island.sethome.nether.not-allowed"); return false; } // Check if a confirmation is required - if (getIWM().getWorldSettings(user.getWorld()).isRequireConfirmationToSetHomeInNether()) { + if (ws.isRequireConfirmationToSetHomeInNether()) { askConfirmation(user, user.getTranslation("commands.island.sethome.nether.confirmation"), () -> doSetHome(user, number)); } else { doSetHome(user, number); } } else if (getIWM().isEnd(user.getWorld())) { // Check if the player is in the End // Check if he is (not) allowed to set his home here - if (!getIWM().getWorldSettings(user.getWorld()).isAllowSetHomeInTheEnd()) { + if (!ws.isAllowSetHomeInTheEnd()) { user.sendMessage("commands.island.sethome.the-end.not-allowed"); return false; } // Check if a confirmation is required - if (getIWM().getWorldSettings(user.getWorld()).isRequireConfirmationToSetHomeInTheEnd()) { + if (ws.isRequireConfirmationToSetHomeInTheEnd()) { askConfirmation(user, user.getTranslation("commands.island.sethome.the-end.confirmation"), () -> doSetHome(user, number)); } else { doSetHome(user, number); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommand.java index ae8d0f78e..595e6ae68 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommand.java @@ -6,6 +6,8 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; +import org.eclipse.jdt.annotation.Nullable; + import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.api.events.island.IslandEvent; @@ -21,6 +23,8 @@ import world.bentobox.bentobox.util.Util; */ public class IslandUnbanCommand extends CompositeCommand { + private @Nullable UUID targetUUID; + public IslandUnbanCommand(CompositeCommand islandCommand) { super(islandCommand, "unban", "pardon"); } @@ -55,7 +59,7 @@ public class IslandUnbanCommand extends CompositeCommand { return false; } // Get target player - UUID targetUUID = getPlayers().getUUID(args.get(0)); + targetUUID = getPlayers().getUUID(args.get(0)); if (targetUUID == null) { user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); return false; @@ -65,7 +69,7 @@ public class IslandUnbanCommand extends CompositeCommand { user.sendMessage("commands.island.unban.cannot-unban-yourself"); return false; } - if (!getIslands().getIsland(getWorld(), playerUUID).isBanned(targetUUID)) { + if (!island.isBanned(targetUUID)) { user.sendMessage("commands.island.unban.player-not-banned"); return false; } @@ -75,7 +79,7 @@ public class IslandUnbanCommand extends CompositeCommand { @Override public boolean execute(User user, String label, List args) { - User target = User.getInstance(getPlayers().getUUID(args.get(0))); + User target = User.getInstance(targetUUID); Island island = getIslands().getIsland(getWorld(), user.getUniqueId()); // Run the event diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommand.java index ae8d6d9f4..f24ed207c 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommand.java @@ -148,6 +148,10 @@ public class IslandTeamInviteAcceptCommand extends ConfirmableCommand { Island island = getIslands().getIsland(getWorld(), playerUUID); // Get the team's island Island teamIsland = getIslands().getIsland(getWorld(), prospectiveOwnerUUID); + if (teamIsland == null) { + user.sendMessage("commands.island.team.invite.errors.invalid-invite"); + return; + } if (teamIsland.getMemberSet(RanksManager.MEMBER_RANK, true).size() > getIslands().getMaxMembers(teamIsland, RanksManager.MEMBER_RANK)) { user.sendMessage("commands.island.team.invite.errors.island-is-full"); return; @@ -158,8 +162,7 @@ public class IslandTeamInviteAcceptCommand extends ConfirmableCommand { cleanPlayer(user); // Add the player as a team member of the new island getIslands().setJoinTeam(teamIsland, playerUUID); - //Move player to team's island - getPlayers().clearHomeLocations(getWorld(), playerUUID); + // Move player to team's island getIslands().homeTeleportAsync(getWorld(), user.getPlayer()).thenRun(() -> { // Delete the old island if (island != null) { diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamKickCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamKickCommand.java index 550c557a4..2aab070fa 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamKickCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamKickCommand.java @@ -83,7 +83,7 @@ public class IslandTeamKickCommand extends ConfirmableCommand { private void kick(User user, UUID targetUUID) { User target = User.getInstance(targetUUID); - Island oldIsland = getIslands().getIsland(getWorld(), targetUUID); + Island oldIsland = Objects.requireNonNull(getIslands().getIsland(getWorld(), targetUUID)); // Should never be null because of checks above // Fire event IslandBaseEvent event = TeamEvent.builder() .island(oldIsland) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamPromoteCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamPromoteCommand.java index 6d3ee539c..49ff21566 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamPromoteCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamPromoteCommand.java @@ -66,7 +66,7 @@ public class IslandTeamPromoteCommand extends CompositeCommand { user.sendMessage("commands.island.team.demote.errors.cant-demote-yourself"); return true; } - if (!inTeam(getWorld(), target) || !getOwner(getWorld(), user).equals(getOwner(getWorld(), target))) { + if (!inTeam(getWorld(), target) || !Objects.requireNonNull(getOwner(getWorld(), user), "Island has no owner!").equals(getOwner(getWorld(), target))) { user.sendMessage("general.errors.not-in-team"); return true; } diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommand.java index e9b565271..f4f8b6aa3 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommand.java @@ -1,12 +1,9 @@ package world.bentobox.bentobox.api.commands.island.team; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; -import org.bukkit.Bukkit; - import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.api.events.island.IslandEvent; @@ -35,9 +32,13 @@ public class IslandTeamSetownerCommand extends CompositeCommand { public boolean execute(User user, String label, List args) { UUID playerUUID = user.getUniqueId(); // Can use if in a team - boolean inTeam = getPlugin().getIslands().inTeam(getWorld(), playerUUID); + boolean inTeam = getIslands().inTeam(getWorld(), playerUUID); + if (!inTeam) { + user.sendMessage("general.errors.no-team"); + return false; + } UUID ownerUUID = getOwner(getWorld(), user); - if (!(inTeam && ownerUUID.equals(playerUUID))) { + if (ownerUUID == null || !ownerUUID.equals(playerUUID)) { user.sendMessage("general.errors.not-owner"); return false; } @@ -51,27 +52,23 @@ public class IslandTeamSetownerCommand extends CompositeCommand { user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); return false; } - if (!getIslands().inTeam(getWorld(), playerUUID)) { - user.sendMessage("general.errors.no-team"); - return false; - } if (targetUUID.equals(playerUUID)) { user.sendMessage("commands.island.team.setowner.errors.cant-transfer-to-yourself"); return false; } - if (!getPlugin().getIslands().getMembers(getWorld(), playerUUID).contains(targetUUID)) { + if (!getIslands().getMembers(getWorld(), playerUUID).contains(targetUUID)) { user.sendMessage("commands.island.team.setowner.errors.target-is-not-member"); return false; } // Fire event so add-ons can run commands, etc. - Island island = getIslands().getIsland(getWorld(), playerUUID); + Island island = getIslands().getIsland(getWorld(), user); // Fire event so add-ons can run commands, etc. IslandBaseEvent e = TeamEvent.builder() - .island(getIslands().getIsland(getWorld(), user.getUniqueId())) + .island(island) .reason(TeamEvent.Reason.SETOWNER) .involvedPlayer(targetUUID) .build(); - if (e.getNewEvent().map(IslandBaseEvent::isCancelled).orElse(e.isCancelled())) { + if (e.isCancelled()) { return false; } getIslands().setOwner(getWorld(), user, targetUUID); @@ -97,12 +94,8 @@ public class IslandTeamSetownerCommand extends CompositeCommand { @Override public Optional> tabComplete(User user, String alias, List args) { - List options = new ArrayList<>(); String lastArg = !args.isEmpty() ? args.get(args.size()-1) : ""; - for (UUID member : getPlugin().getIslands().getMembers(getWorld(), user.getUniqueId())) { - options.add(Bukkit.getServer().getOfflinePlayer(member).getName()); - } - return Optional.of(Util.tabLimit(options, lastArg)); + return Optional.of(Util.tabLimit(getIslands().getMembers(getWorld(), user.getUniqueId()).stream().map(getPlayers()::getName).toList(), lastArg)); } } \ No newline at end of file diff --git a/src/main/java/world/bentobox/bentobox/api/events/BentoBoxEvent.java b/src/main/java/world/bentobox/bentobox/api/events/BentoBoxEvent.java index b4e45d432..efa217869 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/BentoBoxEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/BentoBoxEvent.java @@ -11,6 +11,7 @@ import java.util.Objects; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.BentoBox; @@ -22,14 +23,24 @@ import world.bentobox.bentobox.BentoBox; */ public abstract class BentoBoxEvent extends Event { - /** - * Event handler list - * @deprecated This field will be removed from BentoBoxEvent. - * Events must provide their own handlers. - */ - @Deprecated private static final HandlerList handlers = new HandlerList(); + /** + * This is here just for backwards compatibility. Users of BentoBoxEvent should implement their own getHandlers + */ + @Override + public @NonNull HandlerList getHandlers() { + return getHandlerList(); + } + + /** + * This is here just for backwards compatibility. Users of BentoBoxEvent should implement their own getHandlers + * @return HandlerList + */ + public static HandlerList getHandlerList() { + return handlers; + } + /** * The default constructor is defined for cleaner code. * This constructor assumes the BentoBoxEvent is synchronous. @@ -47,29 +58,6 @@ public abstract class BentoBoxEvent extends Event { super(async); } - /** - * @return HandlerList - * @deprecated this method will no longer be in future versions of the BentoBoxEvent. - * Each event must declare its own static handler and handler methods. - * Will be removed by https://github.com/BentoBoxWorld/BentoBox/pull/1615 - */ - @Override - @Deprecated - public HandlerList getHandlers() { - return getHandlerList(); - } - - /** - * @return HandlerList - * @deprecated this method will no longer be in future versions of the BentoBoxEvent. - * Each event must declare its own static handler and handler methods. - * Will be removed by https://github.com/BentoBoxWorld/BentoBox/pull/1615 - */ - @Deprecated - public static HandlerList getHandlerList() { - return handlers; - } - /** * Get a map of key value pairs derived from the fields of this class by reflection. * @return map diff --git a/src/main/java/world/bentobox/bentobox/api/events/BentoBoxReadyEvent.java b/src/main/java/world/bentobox/bentobox/api/events/BentoBoxReadyEvent.java index 0cb851a1d..d2b360f1b 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/BentoBoxReadyEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/BentoBoxReadyEvent.java @@ -1,6 +1,7 @@ package world.bentobox.bentobox.api.events; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; /** * Fired when plugin is ready to play and all files are loaded @@ -12,7 +13,7 @@ public class BentoBoxReadyEvent extends BentoBoxEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/OfflineMessageEvent.java b/src/main/java/world/bentobox/bentobox/api/events/OfflineMessageEvent.java index 5f906b8fc..f841e3337 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/OfflineMessageEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/OfflineMessageEvent.java @@ -3,6 +3,7 @@ package world.bentobox.bentobox.api.events; import java.util.UUID; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; /** * Fired when a message is going to an offline player @@ -16,7 +17,7 @@ public class OfflineMessageEvent extends BentoBoxEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonDisableEvent.java b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonDisableEvent.java index 8b23f342d..24e384702 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonDisableEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonDisableEvent.java @@ -4,6 +4,7 @@ import java.util.Map; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.addons.Addon; /** @@ -16,7 +17,7 @@ public class AddonDisableEvent extends AddonBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEnableEvent.java b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEnableEvent.java index b0ed6b4c4..0b15d1ff2 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEnableEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEnableEvent.java @@ -4,6 +4,7 @@ import java.util.Map; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.addons.Addon; /** @@ -16,7 +17,7 @@ public class AddonEnableEvent extends AddonBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEvent.java b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEvent.java index 78d1cd277..46b7cb5f5 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonEvent.java @@ -25,54 +25,6 @@ public class AddonEvent { return new AddonEventBuilder(); } - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.addon.AddonEnableEvent} - */ - @Deprecated - public class AddonEnableEvent extends AddonBaseEvent { - private AddonEnableEvent(Addon addon, Map keyValues) { - // Final variables have to be declared in the constructor - super(addon, keyValues); - } - } - - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.addon.AddonDisableEvent} - */ - @Deprecated - public class AddonDisableEvent extends AddonBaseEvent { - private AddonDisableEvent(Addon addon, Map keyValues) { - // Final variables have to be declared in the constructor - super(addon, keyValues); - } - } - - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.addon.AddonLoadEvent} - */ - @Deprecated - public class AddonLoadEvent extends AddonBaseEvent { - private AddonLoadEvent(Addon addon, Map keyValues) { - // Final variables have to be declared in the constructor - super(addon, keyValues); - } - } - - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.addon.AddonGeneralEvent} - */ - @Deprecated - public class AddonGeneralEvent extends AddonBaseEvent { - private AddonGeneralEvent(Addon addon, Map keyValues) { - // Final variables have to be declared in the constructor - super(addon, keyValues); - } - } - public class AddonEventBuilder { // Here field are NOT final. They are just used for the building. private Addon addon; @@ -99,21 +51,12 @@ public class AddonEvent { return this; } - private AddonBaseEvent getDeprecatedEvent() { - return switch (reason) { - case ENABLE -> new AddonEnableEvent(addon, keyValues); - case DISABLE -> new AddonDisableEvent(addon, keyValues); - case LOAD -> new AddonLoadEvent(addon, keyValues); - default -> new AddonGeneralEvent(addon, keyValues); - }; - } - private AddonBaseEvent getEvent() { return switch (reason) { - case ENABLE -> new world.bentobox.bentobox.api.events.addon.AddonEnableEvent(addon, keyValues); - case DISABLE -> new world.bentobox.bentobox.api.events.addon.AddonDisableEvent(addon, keyValues); - case LOAD -> new world.bentobox.bentobox.api.events.addon.AddonLoadEvent(addon, keyValues); - default -> new world.bentobox.bentobox.api.events.addon.AddonGeneralEvent(addon, keyValues); + case ENABLE -> new AddonEnableEvent(addon, keyValues); + case DISABLE -> new AddonDisableEvent(addon, keyValues); + case LOAD -> new AddonLoadEvent(addon, keyValues); + default -> new AddonGeneralEvent(addon, keyValues); }; } @@ -125,12 +68,7 @@ public class AddonEvent { // Call new event AddonBaseEvent newEvent = getEvent(); Bukkit.getPluginManager().callEvent(newEvent); - // Get the old event - AddonBaseEvent e = getDeprecatedEvent(); - e.setNewEvent(newEvent); - // Call deprecated event - Bukkit.getPluginManager().callEvent(e); - return e; + return newEvent; } } } diff --git a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonGeneralEvent.java b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonGeneralEvent.java index 18fce6493..8d6a70931 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonGeneralEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonGeneralEvent.java @@ -4,6 +4,7 @@ import java.util.Map; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.addons.Addon; /** @@ -16,7 +17,7 @@ public class AddonGeneralEvent extends AddonBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonLoadEvent.java b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonLoadEvent.java index 9f4ff3508..4228ff623 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/addon/AddonLoadEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/addon/AddonLoadEvent.java @@ -4,6 +4,7 @@ import java.util.Map; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.addons.Addon; /** @@ -16,7 +17,7 @@ public class AddonLoadEvent extends AddonBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/command/CommandEvent.java b/src/main/java/world/bentobox/bentobox/api/events/command/CommandEvent.java index ba1c7c59a..2686d6a84 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/command/CommandEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/command/CommandEvent.java @@ -6,6 +6,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.BentoBoxEvent; /** @@ -24,7 +25,7 @@ public class CommandEvent extends BentoBoxEvent implements Cancellable { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagProtectionChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagProtectionChangeEvent.java index 44b692e11..1b6f3c018 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagProtectionChangeEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagProtectionChangeEvent.java @@ -4,6 +4,7 @@ import java.util.UUID; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.database.objects.Island; @@ -18,7 +19,7 @@ public class FlagProtectionChangeEvent extends FlagChangeEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagSettingChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagSettingChangeEvent.java index 6608755fe..bbe6d8d0c 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagSettingChangeEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagSettingChangeEvent.java @@ -4,6 +4,7 @@ import java.util.UUID; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.database.objects.Island; @@ -18,7 +19,7 @@ public class FlagSettingChangeEvent extends FlagChangeEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagWorldSettingChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagWorldSettingChangeEvent.java index c7a62b873..307542a82 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/flags/FlagWorldSettingChangeEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/flags/FlagWorldSettingChangeEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.World; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.flags.Flag; /** @@ -18,7 +19,7 @@ public class FlagWorldSettingChangeEvent extends FlagChangeEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandBanEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandBanEvent.java index b610008f3..fb078e00e 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandBanEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandBanEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -19,7 +20,7 @@ public class IslandBanEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandCreateEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandCreateEvent.java index d855d3ace..75d56792f 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandCreateEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandCreateEvent.java @@ -20,7 +20,7 @@ public class IslandCreateEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandCreatedEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandCreatedEvent.java index e31de98af..dcfb602cf 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandCreatedEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandCreatedEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -16,7 +17,7 @@ public class IslandCreatedEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeleteChunksEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeleteChunksEvent.java index a1647b2e8..380da8974 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeleteChunksEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeleteChunksEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.database.objects.IslandDeletion; @@ -19,7 +20,7 @@ public class IslandDeleteChunksEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeleteEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeleteEvent.java index bfa21a47c..4a46eba36 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeleteEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeleteEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandDeleteEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeletedEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeletedEvent.java index a6af36f75..b566f9b32 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeletedEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandDeletedEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.database.objects.IslandDeletion; @@ -21,7 +22,7 @@ public class IslandDeletedEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandEnterEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandEnterEvent.java index b1125f652..eaf732e4b 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandEnterEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandEnterEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.api.events.IslandBaseEvent; @@ -20,7 +21,7 @@ public class IslandEnterEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } @@ -28,7 +29,7 @@ public class IslandEnterEvent extends IslandBaseEvent { return handlers; } - IslandEnterEvent(Island island, UUID player, boolean admin, Location location, Island fromIsland, Event rawEvent) { + IslandEnterEvent(Island island, UUID player, boolean admin, Location location, @Nullable Island fromIsland, Event rawEvent) { // Final variables have to be declared in the constructor super(island, player, admin, location, rawEvent); this.fromIsland = fromIsland; diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandEvent.java index 14aad63ff..701d553d3 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandEvent.java @@ -7,7 +7,6 @@ import org.bukkit.Location; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.blueprints.dataobjects.BlueprintBundle; @@ -26,7 +25,7 @@ public class IslandEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } @@ -177,496 +176,6 @@ public class IslandEvent extends IslandBaseEvent { return new IslandEventBuilder(); } - /** - * Fired when a player's rank has changed on an island. - * Cancellation has no effect. - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandRankChangeEvent} - * @since 1.13.0 - */ - @Deprecated - public static class IslandRankChangeEvent extends IslandBaseEvent { - - private final int oldRank; - private final int newRank; - - public IslandRankChangeEvent(Island island, UUID playerUUID, boolean admin, Location location, int oldRank, int newRank) { - super(island, playerUUID, admin, location); - this.oldRank = oldRank; - this.newRank = newRank; - } - - public int getOldRank() { - return oldRank; - } - - public int getNewRank(){ - return newRank; - } - } - - /** - * Fired when a player will be expelled from an island. - * May be cancelled. - * Cancellation will result in the expel being aborted. - * - * @since 1.4.0 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandExpelEvent} - */ - @Deprecated - public static class IslandExpelEvent extends IslandBaseEvent { - private IslandExpelEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - /** - * Fired when a player will be banned from an island. - * May be cancelled. - * Cancellation will result in the ban being aborted. - * - * @since 1.1 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandBanEvent} - */ - @Deprecated - public static class IslandBanEvent extends IslandBaseEvent { - private IslandBanEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - /** - * Fired when a player will be banned from an island. - * May be cancelled. - * Cancellation will result in the unban being aborted. - * - * @since 1.1 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandUnbanEvent} - */ - @Deprecated - public static class IslandUnbanEvent extends IslandBaseEvent { - public IslandUnbanEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - /** - * Fired when attempting to make a new island. - * May be cancelled. No island object exists at this point. - * @since 1.15.1 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandPreCreateEvent} - */ - @Deprecated - public static class IslandPreCreateEvent extends IslandBaseEvent { - private IslandPreCreateEvent(UUID player) { - // Final variables have to be declared in the constructor - super(null, player, false, null); - } - } - - /** - * Fired when an island is going to be created. - * May be cancelled. - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandCreateEvent} - */ - @Deprecated - public static class IslandCreateEvent extends IslandBaseEvent { - private @NonNull BlueprintBundle blueprintBundle; - - private IslandCreateEvent(Island island, UUID player, boolean admin, Location location, @NonNull BlueprintBundle blueprintBundle) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - this.blueprintBundle = blueprintBundle; - } - - /** - * @since 1.6.0 - */ - @NonNull - public BlueprintBundle getBlueprintBundle() { - return blueprintBundle; - } - - /** - * @since 1.6.0 - */ - public void setBlueprintBundle(@NonNull BlueprintBundle blueprintBundle) { - this.blueprintBundle = blueprintBundle; - } - } - /** - * Fired when an island is created. - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandCreatedEvent} - */ - @Deprecated - public static class IslandCreatedEvent extends IslandBaseEvent { - private IslandCreatedEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - /** - * Fired when an island is going to be deleted. - * May be cancelled. - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandDeleteEvent} - */ - @Deprecated - public static class IslandDeleteEvent extends IslandBaseEvent { - private IslandDeleteEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - /** - * Fired when an island chunks are going to be deleted. - * May be cancelled. - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandDeleteChunksEvent} - */ - @Deprecated - public static class IslandDeleteChunksEvent extends IslandBaseEvent { - private final IslandDeletion deletedIslandInfo; - - private IslandDeleteChunksEvent(Island island, UUID player, boolean admin, Location location, IslandDeletion deletedIsland) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - this.deletedIslandInfo = deletedIsland; - } - - public IslandDeletion getDeletedIslandInfo() { - return deletedIslandInfo; - } - } - /** - * Fired when island blocks are going to be deleted. - * If canceled, the island blocks will not be deleted. Note that by the time this is called - * the ownership of the island may have been removed. This event is just for detecting - * that the island blocks are going to be removed. - * - * @deprecated This event is moving to its own class. - * - */ - @Deprecated - public static class IslandDeletedEvent extends IslandBaseEvent { - private final IslandDeletion deletedIslandInfo; - - private IslandDeletedEvent(Island island, UUID player, boolean admin, Location location, IslandDeletion deletedIsland) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - this.deletedIslandInfo = deletedIsland; - } - - public IslandDeletion getDeletedIslandInfo() { - return deletedIslandInfo; - } - } - - /** - * Fired when a player is unregistered from an island. - * @since 1.3.0 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandUnregisteredEvent} - */ - @Deprecated - public static class IslandUnregisteredEvent extends IslandBaseEvent { - private IslandUnregisteredEvent(Island island, UUID player, boolean admin, Location location) { - super(island, player, admin, location); - } - } - - /** - * Fired when a player is registered from an island. - * @since 1.3.0 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandRegisteredEvent} - */ - @Deprecated - public static class IslandRegisteredEvent extends IslandBaseEvent { - private IslandRegisteredEvent(Island island, UUID player, boolean admin, Location location) { - super(island, player, admin, location); - } - } - - /** - * Fired when an island is reserved for a player - * @since 1.12.0 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandReservedEvent} - */ - @Deprecated - public static class IslandReservedEvent extends IslandBaseEvent { - private IslandReservedEvent(Island island, UUID player, boolean admin, Location location) { - super(island, player, admin, location); - } - } - - /** - * Fired when an a player enters an island. - * Cancellation has no effect. - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandEnterEvent} - */ - @Deprecated - public static class IslandEnterEvent extends IslandBaseEvent { - - private final @Nullable Island fromIsland; - - private IslandEnterEvent(Island island, UUID player, boolean admin, Location location, Island fromIsland, Event rawEvent) { - // Final variables have to be declared in the constructor - super(island, player, admin, location, rawEvent); - this.fromIsland = fromIsland; - } - - @Nullable - public Island getFromIsland() { - return fromIsland; - } - } - /** - * Fired when a player exits an island. - * Cancellation has no effect. - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandExitEvent} - */ - @Deprecated - public static class IslandExitEvent extends IslandBaseEvent { - - private final @Nullable Island toIsland; - - - private IslandExitEvent(Island island, UUID player, boolean admin, Location location, Island toIsland, Event rawEvent) { - // Final variables have to be declared in the constructor - super(island, player, admin, location, rawEvent); - this.toIsland = toIsland; - } - - @Nullable - public Island getToIsland() { - return toIsland; - } - - - } - /** - * Fired when an island is locked - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandLockEvent} - */ - @Deprecated - public static class IslandLockEvent extends IslandBaseEvent { - private IslandLockEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - /** - * Fired when an island is unlocked - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandUnlockEvent} - */ - @Deprecated - public static class IslandUnlockEvent extends IslandBaseEvent { - private IslandUnlockEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - /** - * Fired before an island has its player data cleared, e.g., just before a reset - * @since 1.12.0 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandPreclearEvent} - */ - @Deprecated - public static class IslandPreclearEvent extends IslandBaseEvent { - private final @NonNull Island oldIsland; - - private IslandPreclearEvent(Island island, UUID player, boolean admin, Location location, @NonNull Island oldIsland) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - // Create a copy of the old island - this.oldIsland = new Island(oldIsland); - } - - /** - * @since 1.12.0 - */ - @NonNull - public Island getOldIsland() { - return oldIsland; - } - } - - /** - * Fired when an island is going to be reset. - * May be cancelled. - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandResetEvent} - */ - @Deprecated - public static class IslandResetEvent extends IslandBaseEvent { - private final @NonNull Island oldIsland; - private @NonNull BlueprintBundle blueprintBundle; - - private IslandResetEvent(Island island, UUID player, boolean admin, Location location, @NonNull BlueprintBundle blueprintBundle, @NonNull Island oldIsland) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - this.blueprintBundle = blueprintBundle; - // Create a copy of the old island - this.oldIsland = new Island(oldIsland); - } - - /** - * @since 1.12.0 - */ - @NonNull - public Island getOldIsland() { - return oldIsland; - } - - /** - * @since 1.6.0 - */ - @NonNull - public BlueprintBundle getBlueprintBundle() { - return blueprintBundle; - } - - /** - * @since 1.6.0 - */ - public void setBlueprintBundle(@NonNull BlueprintBundle blueprintBundle) { - this.blueprintBundle = blueprintBundle; - } - } - /** - * Fired after an island is reset - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandResettedEvent} - */ - @Deprecated - public static class IslandResettedEvent extends IslandBaseEvent { - private final @NonNull Island oldIsland; - - private IslandResettedEvent(Island island, UUID player, boolean admin, Location location, Island oldIsland) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - // Create a copy of the old island - this.oldIsland = new Island(oldIsland); - } - - /** - * @since 1.12.0 - */ - @NonNull - public Island getOldIsland() { - return oldIsland; - } - } - /** - * Fired when something happens to the island not covered by other events - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandGeneralEvent} - */ - @Deprecated - public static class IslandGeneralEvent extends IslandBaseEvent { - private IslandGeneralEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - - /** - * Fired when island protection range is changed. - * @since 1.11.0 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.island.IslandProtectionRangeChangeEvent} - */ - @Deprecated - public static class IslandProtectionRangeChangeEvent extends IslandBaseEvent { - /** - * New protection range value. - */ - private int newRange; - - /** - * Old protection range value. - */ - private int oldRange; - - /** - * Constructor IslandProtectionRangeChange creates a new IslandProtectionRangeChange instance. - * - * @param island of type Island - * @param player of type UUID - * @param admin of type boolean - * @param location of type Location - * @param newRange of type int - * @param oldRange of type int - */ - private IslandProtectionRangeChangeEvent(Island island, UUID player, boolean admin, Location location, int newRange, int oldRange) { - super(island, player, admin, location); - this.newRange = newRange; - this.oldRange = oldRange; - } - - - /** - * This method returns the newRange value. - * @return the value of newRange. - */ - public int getNewRange() { - return newRange; - } - - - /** - * This method returns the oldRange value. - * @return the value of oldRange. - */ - public int getOldRange() { - return oldRange; - } - - - /** - * This method sets the newRange value. - * @param newRange the newRange new value. - */ - public void setNewRange(int newRange) { - this.newRange = newRange; - } - - - /** - * This method sets the oldRange value. - * @param oldRange the oldRange new value. - */ - public void setOldRange(int oldRange) { - this.oldRange = oldRange; - } - } - public static class IslandEventBuilder { // Here field are NOT final. They are just used for the building. @@ -796,62 +305,31 @@ public class IslandEvent extends IslandBaseEvent { return this; } - /** - * Get the deprecated IslandEvent - * @return deprecated event - */ - private IslandBaseEvent getDeprecatedEvent() { - return switch (reason) { - case EXPEL -> new IslandExpelEvent(island, player, admin, location); - case BAN -> new IslandBanEvent(island, player, admin, location); - case PRECREATE -> new IslandPreCreateEvent(player); - case CREATE -> new IslandCreateEvent(island, player, admin, location, blueprintBundle); - case CREATED -> new IslandCreatedEvent(island, player, admin, location); - case DELETE -> new IslandDeleteEvent(island, player, admin, location); - case DELETE_CHUNKS -> new IslandDeleteChunksEvent(island, player, admin, location, deletedIslandInfo); - case DELETED -> new IslandDeletedEvent(island, player, admin, location, deletedIslandInfo); - case ENTER -> new IslandEnterEvent(island, player, admin, location, oldIsland, rawEvent); - case EXIT -> new IslandExitEvent(island, player, admin, location, oldIsland, rawEvent); - case LOCK -> new IslandLockEvent(island, player, admin, location); - case RESET -> new IslandResetEvent(island, player, admin, location, blueprintBundle, oldIsland); - case RESETTED -> new IslandResettedEvent(island, player, admin, location, oldIsland); - case UNBAN -> new IslandUnbanEvent(island, player, admin, location); - case UNLOCK -> new IslandUnlockEvent(island, player, admin, location); - case REGISTERED -> new IslandRegisteredEvent(island, player, admin, location); - case UNREGISTERED -> new IslandUnregisteredEvent(island, player, admin, location); - case RANGE_CHANGE -> new IslandProtectionRangeChangeEvent(island, player, admin, location, newRange, oldRange); - case PRECLEAR -> new IslandPreclearEvent(island, player, admin, location, oldIsland); - case RESERVED -> new IslandReservedEvent(island, player, admin, location); - case RANK_CHANGE -> new IslandRankChangeEvent(island, player, admin, location, oldRank, newRank); - default -> new IslandGeneralEvent(island, player, admin, location); - }; - } - private IslandBaseEvent getEvent() { return switch (reason) { - case EXPEL -> new world.bentobox.bentobox.api.events.island.IslandExpelEvent(island, player, admin, location); - case BAN -> new world.bentobox.bentobox.api.events.island.IslandBanEvent(island, player, admin, location); - case PRECREATE -> new world.bentobox.bentobox.api.events.island.IslandPreCreateEvent(player); - case CREATE -> new world.bentobox.bentobox.api.events.island.IslandCreateEvent(island, player, admin, location, blueprintBundle); - case CREATED -> new world.bentobox.bentobox.api.events.island.IslandCreatedEvent(island, player, admin, location); - case DELETE -> new world.bentobox.bentobox.api.events.island.IslandDeleteEvent(island, player, admin, location); - case DELETE_CHUNKS -> new world.bentobox.bentobox.api.events.island.IslandDeleteChunksEvent(island, player, admin, location, deletedIslandInfo); - case DELETED -> new world.bentobox.bentobox.api.events.island.IslandDeletedEvent(island, player, admin, location, deletedIslandInfo); - case ENTER -> new world.bentobox.bentobox.api.events.island.IslandEnterEvent(island, player, admin, location, oldIsland, rawEvent); - case EXIT -> new world.bentobox.bentobox.api.events.island.IslandExitEvent(island, player, admin, location, oldIsland, rawEvent); - case LOCK -> new world.bentobox.bentobox.api.events.island.IslandLockEvent(island, player, admin, location); - case RESET -> new world.bentobox.bentobox.api.events.island.IslandResetEvent(island, player, admin, location, blueprintBundle, oldIsland); - case RESETTED -> new world.bentobox.bentobox.api.events.island.IslandResettedEvent(island, player, admin, location, oldIsland); - case UNBAN -> new world.bentobox.bentobox.api.events.island.IslandUnbanEvent(island, player, admin, location); - case UNLOCK -> new world.bentobox.bentobox.api.events.island.IslandUnlockEvent(island, player, admin, location); - case REGISTERED -> new world.bentobox.bentobox.api.events.island.IslandRegisteredEvent(island, player, admin, location); - case UNREGISTERED -> new world.bentobox.bentobox.api.events.island.IslandUnregisteredEvent(island, player, admin, location); - case RANGE_CHANGE -> new world.bentobox.bentobox.api.events.island.IslandProtectionRangeChangeEvent(island, player, admin, location, newRange, oldRange); - case PRECLEAR -> new world.bentobox.bentobox.api.events.island.IslandPreclearEvent(island, player, admin, location, oldIsland); - case RESERVED -> new world.bentobox.bentobox.api.events.island.IslandReservedEvent(island, player, admin, location); - case RANK_CHANGE -> new world.bentobox.bentobox.api.events.island.IslandRankChangeEvent(island, player, admin, location, oldRank, newRank); - case NEW_ISLAND -> new IslandNewIslandEvent(island, player, admin, location); - default -> new world.bentobox.bentobox.api.events.island.IslandGeneralEvent(island, player, admin, location); + case EXPEL -> new IslandExpelEvent(island, player, admin, location); + case BAN -> new IslandBanEvent(island, player, admin, location); + case PRECREATE -> new IslandPreCreateEvent(player); + case CREATE -> new IslandCreateEvent(island, player, admin, location, blueprintBundle); + case CREATED -> new IslandCreatedEvent(island, player, admin, location); + case DELETE -> new IslandDeleteEvent(island, player, admin, location); + case DELETE_CHUNKS -> new IslandDeleteChunksEvent(island, player, admin, location, deletedIslandInfo); + case DELETED -> new IslandDeletedEvent(island, player, admin, location, deletedIslandInfo); + case ENTER -> new IslandEnterEvent(island, player, admin, location, oldIsland, rawEvent); + case EXIT -> new IslandExitEvent(island, player, admin, location, oldIsland, rawEvent); + case LOCK -> new IslandLockEvent(island, player, admin, location); + case RESET -> new IslandResetEvent(island, player, admin, location, blueprintBundle, oldIsland); + case RESETTED -> new IslandResettedEvent(island, player, admin, location, oldIsland); + case UNBAN -> new IslandUnbanEvent(island, player, admin, location); + case UNLOCK -> new IslandUnlockEvent(island, player, admin, location); + case REGISTERED -> new IslandRegisteredEvent(island, player, admin, location); + case UNREGISTERED -> new IslandUnregisteredEvent(island, player, admin, location); + case RANGE_CHANGE -> new IslandProtectionRangeChangeEvent(island, player, admin, location, newRange, oldRange); + case PRECLEAR -> new IslandPreclearEvent(island, player, admin, location, oldIsland); + case RESERVED -> new IslandReservedEvent(island, player, admin, location); + case RANK_CHANGE -> new IslandRankChangeEvent(island, player, admin, location, oldRank, newRank); + case NEW_ISLAND -> new IslandNewIslandEvent(island, player, admin, location); + default -> new IslandGeneralEvent(island, player, admin, location); }; } @@ -865,11 +343,7 @@ public class IslandEvent extends IslandBaseEvent { // Generate new event IslandBaseEvent newEvent = getEvent(); Bukkit.getPluginManager().callEvent(newEvent); - // Generate deprecated events - IslandBaseEvent e = getDeprecatedEvent(); - e.setNewEvent(newEvent); - Bukkit.getPluginManager().callEvent(e); - return e; + return newEvent; } } } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandExitEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandExitEvent.java index 62302be7d..c378a473f 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandExitEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandExitEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.api.events.IslandBaseEvent; @@ -20,7 +21,7 @@ public class IslandExitEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } @@ -28,7 +29,7 @@ public class IslandExitEvent extends IslandBaseEvent { return handlers; } - IslandExitEvent(Island island, UUID player, boolean admin, Location location, Island toIsland, Event rawEvent) { + IslandExitEvent(Island island, UUID player, boolean admin, Location location, @Nullable Island toIsland, Event rawEvent) { // Final variables have to be declared in the constructor super(island, player, admin, location, rawEvent); this.toIsland = toIsland; diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandExpelEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandExpelEvent.java index a263c7f30..f60d1a770 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandExpelEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandExpelEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -20,7 +21,7 @@ public class IslandExpelEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandGeneralEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandGeneralEvent.java index ef02c2ea5..c8f9cc3ae 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandGeneralEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandGeneralEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandGeneralEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandLockEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandLockEvent.java index 023d13b49..9783c9e1c 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandLockEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandLockEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandLockEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandNewIslandEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandNewIslandEvent.java index bdc2a38af..583cbea40 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandNewIslandEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandNewIslandEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandNewIslandEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandPreCreateEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandPreCreateEvent.java index 95d405eb4..99fa17e2f 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandPreCreateEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandPreCreateEvent.java @@ -4,6 +4,7 @@ import java.util.UUID; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; /** @@ -16,7 +17,7 @@ public class IslandPreCreateEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandPreclearEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandPreclearEvent.java index acc482a08..5b9d54381 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandPreclearEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandPreclearEvent.java @@ -19,7 +19,7 @@ public class IslandPreclearEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandProtectionRangeChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandProtectionRangeChangeEvent.java index b23dc7503..d033f5fa5 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandProtectionRangeChangeEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandProtectionRangeChangeEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandProtectionRangeChangeEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandRankChangeEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandRankChangeEvent.java index 96aef05da..e27f1b0ca 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandRankChangeEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandRankChangeEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -20,7 +21,7 @@ public class IslandRankChangeEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandRegisteredEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandRegisteredEvent.java index 7e39e5509..c8b77c2a8 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandRegisteredEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandRegisteredEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandRegisteredEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandReservedEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandReservedEvent.java index e18f9d976..e8dc7738b 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandReservedEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandReservedEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandReservedEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandResetEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandResetEvent.java index 980438689..1b7a4043c 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandResetEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandResetEvent.java @@ -21,7 +21,7 @@ public class IslandResetEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandResettedEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandResettedEvent.java index 448a96758..5b8200a7c 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandResettedEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandResettedEvent.java @@ -19,7 +19,7 @@ public class IslandResettedEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnbanEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnbanEvent.java index b4c497d59..94ab59e1e 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnbanEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnbanEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -20,7 +21,7 @@ public class IslandUnbanEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnlockEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnlockEvent.java index f2eefc8e1..c44437497 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnlockEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnlockEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandUnlockEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnregisteredEvent.java b/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnregisteredEvent.java index 36a2f0e91..c3304cf9e 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnregisteredEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/island/IslandUnregisteredEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class IslandUnregisteredEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamDeleteEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamDeleteEvent.java index 73351cefc..863a6591c 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamDeleteEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamDeleteEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -13,7 +14,7 @@ public class TeamDeleteEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamEvent.java index 94791ef72..d587e6af7 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamEvent.java @@ -36,161 +36,6 @@ public class TeamEvent { return new TeamEventBuilder(); } - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamJoinEvent} - */ - @Deprecated - public static class TeamJoinEvent extends IslandBaseEvent { - private TeamJoinEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - /** - * Called after a player has joined an island - * @since 1.3.0 - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamJoinedEvent} - */ - @Deprecated - public static class TeamJoinedEvent extends IslandBaseEvent { - /** - * Called after a player has joined an island - * @param island - island - * @param player - player - * @param admin - whether this was due to an admin action - * @param location - location - * @since 1.3.0 - */ - private TeamJoinedEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamInviteEvent} - */ - @Deprecated - public static class TeamInviteEvent extends IslandBaseEvent { - private TeamInviteEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamLeaveEvent} - */ - @Deprecated - public static class TeamLeaveEvent extends IslandBaseEvent { - private TeamLeaveEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamRejectEvent} - */ - @Deprecated - public static class TeamRejectEvent extends IslandBaseEvent { - private TeamRejectEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamKickEvent} - */ - @Deprecated - public static class TeamKickEvent extends IslandBaseEvent { - private TeamKickEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - /** - * Event fires before a setowner is performed on an island. - * To get the old owner, get from the island object. The new owner is the player's UUID. - * @author tastybento - * - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamSetownerEvent} - */ - @Deprecated - public static class TeamSetownerEvent extends IslandBaseEvent { - private TeamSetownerEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - /** - * Convenience method to get the old owner of the island - * @return UUID of old owner - */ - public UUID getOldOwner() { - return island.getOwner(); - } - /** - * Convenience method to get the new owner of the island - * @return UUID of new owner - */ - public UUID getNewOwner() { - return playerUUID; - } - } - - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamInfoEvent} - */ - @Deprecated - public static class TeamInfoEvent extends IslandBaseEvent { - private TeamInfoEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamDeleteEvent} - */ - @Deprecated - public static class TeamDeleteEvent extends IslandBaseEvent { - private TeamDeleteEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamUninviteEvent} - */ - @Deprecated - public static class TeamUninviteEvent extends IslandBaseEvent { - private TeamUninviteEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - - /** - * @deprecated This event is moving to its own class. - * Use {@link world.bentobox.bentobox.api.events.team.TeamGeneralEvent} - */ - @Deprecated - public static class TeamGeneralEvent extends IslandBaseEvent { - private TeamGeneralEvent(Island island, UUID player, boolean admin, Location location) { - // Final variables have to be declared in the constructor - super(island, player, admin, location); - } - } - public static class TeamEventBuilder { private Island island; private UUID player; @@ -236,35 +81,19 @@ public class TeamEvent { return this; } - private IslandBaseEvent getDeprecatedEvent() { - return switch (reason) { - case JOIN -> new TeamJoinEvent(island, player, admin, location); - case JOINED -> new TeamJoinedEvent(island, player, admin, location); - case INVITE -> new TeamInviteEvent(island, player, admin, location); - case LEAVE -> new TeamLeaveEvent(island, player, admin, location); - case REJECT -> new TeamRejectEvent(island, player, admin, location); - case KICK -> new TeamKickEvent(island, player, admin, location); - case SETOWNER -> new TeamSetownerEvent(island, player, admin, location); - case INFO -> new TeamInfoEvent(island, player, admin, location); - case DELETE -> new TeamDeleteEvent(island, player, admin, location); - case UNINVITE -> new TeamUninviteEvent(island, player, admin, location); - default -> new TeamGeneralEvent(island, player, admin, location); - }; - } - private IslandBaseEvent getEvent() { return switch (reason) { - case JOIN -> new world.bentobox.bentobox.api.events.team.TeamJoinEvent(island, player, admin, location); - case JOINED -> new world.bentobox.bentobox.api.events.team.TeamJoinedEvent(island, player, admin, location); - case INVITE -> new world.bentobox.bentobox.api.events.team.TeamInviteEvent(island, player, admin, location); - case LEAVE -> new world.bentobox.bentobox.api.events.team.TeamLeaveEvent(island, player, admin, location); - case REJECT -> new world.bentobox.bentobox.api.events.team.TeamRejectEvent(island, player, admin, location); - case KICK -> new world.bentobox.bentobox.api.events.team.TeamKickEvent(island, player, admin, location); - case SETOWNER -> new world.bentobox.bentobox.api.events.team.TeamSetownerEvent(island, player, admin, location); - case INFO -> new world.bentobox.bentobox.api.events.team.TeamInfoEvent(island, player, admin, location); - case DELETE -> new world.bentobox.bentobox.api.events.team.TeamDeleteEvent(island, player, admin, location); - case UNINVITE -> new world.bentobox.bentobox.api.events.team.TeamUninviteEvent(island, player, admin, location); - default -> new world.bentobox.bentobox.api.events.team.TeamGeneralEvent(island, player, admin, location); + case JOIN -> new TeamJoinEvent(island, player, admin, location); + case JOINED -> new TeamJoinedEvent(island, player, admin, location); + case INVITE -> new TeamInviteEvent(island, player, admin, location); + case LEAVE -> new TeamLeaveEvent(island, player, admin, location); + case REJECT -> new TeamRejectEvent(island, player, admin, location); + case KICK -> new TeamKickEvent(island, player, admin, location); + case SETOWNER -> new TeamSetownerEvent(island, player, admin, location); + case INFO -> new TeamInfoEvent(island, player, admin, location); + case DELETE -> new TeamDeleteEvent(island, player, admin, location); + case UNINVITE -> new TeamUninviteEvent(island, player, admin, location); + default -> new TeamGeneralEvent(island, player, admin, location); }; } @@ -276,11 +105,7 @@ public class TeamEvent { // Generate new event IslandBaseEvent newEvent = getEvent(); Bukkit.getPluginManager().callEvent(newEvent); - // Generate deprecated events - IslandBaseEvent e = getDeprecatedEvent(); - e.setNewEvent(newEvent); - Bukkit.getPluginManager().callEvent(e); - return e; + return newEvent; } } } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamGeneralEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamGeneralEvent.java index ccfa53cbf..1e71493eb 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamGeneralEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamGeneralEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -13,7 +14,7 @@ public class TeamGeneralEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamInfoEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamInfoEvent.java index bb945a6aa..14dbc8214 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamInfoEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamInfoEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -13,7 +14,7 @@ public class TeamInfoEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamInviteEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamInviteEvent.java index 6322d6e9e..1a1fca2f2 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamInviteEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamInviteEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -13,7 +14,7 @@ public class TeamInviteEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamJoinEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamJoinEvent.java index 72eb10e0c..73940e019 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamJoinEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamJoinEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -13,7 +14,7 @@ public class TeamJoinEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamJoinedEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamJoinedEvent.java index 051b8bf44..e750154a0 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamJoinedEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamJoinedEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -17,7 +18,7 @@ public class TeamJoinedEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamKickEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamKickEvent.java index 9b9a253af..00a8a11ff 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamKickEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamKickEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -13,7 +14,7 @@ public class TeamKickEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamLeaveEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamLeaveEvent.java index 95f5b732b..28ca431a0 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamLeaveEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamLeaveEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -18,7 +19,7 @@ public class TeamLeaveEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamRejectEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamRejectEvent.java index 6352a742f..adcd4359c 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamRejectEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamRejectEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -13,7 +14,7 @@ public class TeamRejectEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamSetownerEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamSetownerEvent.java index f0abd6647..2d0b81892 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamSetownerEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamSetownerEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -19,7 +20,7 @@ public class TeamSetownerEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/events/team/TeamUninviteEvent.java b/src/main/java/world/bentobox/bentobox/api/events/team/TeamUninviteEvent.java index 8c7371529..60953cd8e 100644 --- a/src/main/java/world/bentobox/bentobox/api/events/team/TeamUninviteEvent.java +++ b/src/main/java/world/bentobox/bentobox/api/events/team/TeamUninviteEvent.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.HandlerList; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.database.objects.Island; @@ -13,7 +14,7 @@ public class TeamUninviteEvent extends IslandBaseEvent { private static final HandlerList handlers = new HandlerList(); @Override - public HandlerList getHandlers() { + public @NonNull HandlerList getHandlers() { return getHandlerList(); } diff --git a/src/main/java/world/bentobox/bentobox/api/flags/Flag.java b/src/main/java/world/bentobox/bentobox/api/flags/Flag.java index ed60c42ff..2acd4f604 100644 --- a/src/main/java/world/bentobox/bentobox/api/flags/Flag.java +++ b/src/main/java/world/bentobox/bentobox/api/flags/Flag.java @@ -175,8 +175,10 @@ public class Flag implements Comparable { * If world is not a game world, then the result will always be false! */ public boolean isSetForWorld(World world) { + if (!BentoBox.getInstance().getIWM().inWorld(world)) { + return false; + } WorldSettings ws = BentoBox.getInstance().getIWM().getWorldSettings(world); - if (ws == null) return false; if (type.equals(Type.WORLD_SETTING) || type.equals(Type.PROTECTION)) { if (!ws.getWorldFlags().containsKey(getID())) { ws.getWorldFlags().put(getID(), setting); @@ -234,12 +236,11 @@ public class Flag implements Comparable { * @param defaultSetting - true means it is allowed. false means it is not allowed */ public void setDefaultSetting(World world, boolean defaultSetting) { - WorldSettings ws = BentoBox.getInstance().getIWM().getWorldSettings(world); - if (ws == null ) { + if (!BentoBox.getInstance().getIWM().inWorld(world)) { BentoBox.getInstance().logError("Attempt to set default world setting for unregistered world. Register flags in onEnable."); return; } - ws.getWorldFlags().put(getID(), defaultSetting); + BentoBox.getInstance().getIWM().getWorldSettings(world).getWorldFlags().put(getID(), defaultSetting); // Save config file BentoBox.getInstance().getIWM().getAddon(world).ifPresent(GameModeAddon::saveWorldSettings); } diff --git a/src/main/java/world/bentobox/bentobox/api/flags/FlagListener.java b/src/main/java/world/bentobox/bentobox/api/flags/FlagListener.java index dc62e87b4..fcd2ddde5 100644 --- a/src/main/java/world/bentobox/bentobox/api/flags/FlagListener.java +++ b/src/main/java/world/bentobox/bentobox/api/flags/FlagListener.java @@ -126,9 +126,9 @@ public abstract class FlagListener implements Listener { */ public boolean checkIsland(@NonNull Event e, @Nullable Player player, @Nullable Location loc, @NonNull Flag flag, boolean silent) { // Set user - user = User.getInstance(player); + user = player == null ? null : User.getInstance(player); if (loc == null) { - if (user.getLocation() != null && user.getLocation().getWorld() != null) { + if (user != null && user.getLocation() != null && user.getLocation().getWorld() != null) { report(user, e, user.getLocation(), flag, Why.NULL_LOCATION); } return true; diff --git a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClick.java b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClick.java index 922337133..d8c0f2e0c 100644 --- a/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClick.java +++ b/src/main/java/world/bentobox/bentobox/api/flags/clicklisteners/CycleClick.java @@ -24,7 +24,7 @@ import world.bentobox.bentobox.util.Util; */ public class CycleClick implements PanelItem.ClickHandler { - protected BentoBox plugin = BentoBox.getInstance(); + protected final BentoBox plugin = BentoBox.getInstance(); protected Island island; protected User user; protected boolean changeOccurred; diff --git a/src/main/java/world/bentobox/bentobox/api/localization/TextVariables.java b/src/main/java/world/bentobox/bentobox/api/localization/TextVariables.java index 85c778d7c..61bce6fb5 100644 --- a/src/main/java/world/bentobox/bentobox/api/localization/TextVariables.java +++ b/src/main/java/world/bentobox/bentobox/api/localization/TextVariables.java @@ -34,4 +34,8 @@ public class TextVariables { * @since 1.16.0 */ public static final String XYZ = "[xyz]"; + /** + * @since 1.17.2 + */ + public static final String UUID = "[uuid]"; } diff --git a/src/main/java/world/bentobox/bentobox/api/panels/builders/PanelItemBuilder.java b/src/main/java/world/bentobox/bentobox/api/panels/builders/PanelItemBuilder.java index c3c10317b..ebe17e3c4 100644 --- a/src/main/java/world/bentobox/bentobox/api/panels/builders/PanelItemBuilder.java +++ b/src/main/java/world/bentobox/bentobox/api/panels/builders/PanelItemBuilder.java @@ -137,7 +137,7 @@ public class PanelItemBuilder { /** * @return the name */ - public String getName() { + public @Nullable String getName() { return name; } diff --git a/src/main/java/world/bentobox/bentobox/api/panels/reader/TemplateReader.java b/src/main/java/world/bentobox/bentobox/api/panels/reader/TemplateReader.java index 2213cad90..7721746b0 100644 --- a/src/main/java/world/bentobox/bentobox/api/panels/reader/TemplateReader.java +++ b/src/main/java/world/bentobox/bentobox/api/panels/reader/TemplateReader.java @@ -32,6 +32,14 @@ import world.bentobox.bentobox.util.ItemParser; */ public class TemplateReader { + private static final String TITLE = "title"; + private static final String ICON = "icon"; + private static final String DESCRIPTION = "description"; + private static final String BACKGROUND = "background"; + private static final String BORDER = "border"; + private static final String FORCE_SHOWN = "force-shown"; + private static final String FALLBACK = "fallback"; + /** * Read template panel panel template record. * @@ -95,57 +103,57 @@ public class TemplateReader return null; } - String title = configurationSection.getString("title"); + String title = configurationSection.getString(TITLE); Panel.Type type = - Enums.getIfPresent(Panel.Type.class, configurationSection.getString("type", "INVENTORY")). + Enums.getIfPresent(Panel.Type.class, configurationSection.getString("type", "INVENTORY")). or(Panel.Type.INVENTORY); PanelTemplateRecord.TemplateItem borderItem = null; // Read Border Icon. - if (configurationSection.isConfigurationSection("border")) + if (configurationSection.isConfigurationSection(BORDER)) { // Process border icon if it contains more options. - ConfigurationSection borderSection = configurationSection.getConfigurationSection("border"); + ConfigurationSection borderSection = configurationSection.getConfigurationSection(BORDER); if (borderSection != null) { borderItem = new PanelTemplateRecord.TemplateItem( - ItemParser.parse((borderSection.getString("icon", Material.AIR.name()))), - borderSection.getString("title", null), - borderSection.getString("description", null)); + ItemParser.parse((borderSection.getString(ICON, Material.AIR.name()))), + borderSection.getString(TITLE, null), + borderSection.getString(DESCRIPTION, null)); } } - else if (configurationSection.isString("border")) + else if (configurationSection.isString(BORDER)) { // Process border icon if it contains only icon. borderItem = new PanelTemplateRecord.TemplateItem( - ItemParser.parse((configurationSection.getString("border", Material.AIR.name())))); + ItemParser.parse((configurationSection.getString(BORDER, Material.AIR.name())))); } PanelTemplateRecord.TemplateItem backgroundItem = null; // Read Background block - if (configurationSection.isConfigurationSection("background")) + if (configurationSection.isConfigurationSection(BACKGROUND)) { // Process border icon if it contains more options. - ConfigurationSection backgroundSection = configurationSection.getConfigurationSection("background"); + ConfigurationSection backgroundSection = configurationSection.getConfigurationSection(BACKGROUND); if (backgroundSection != null) { backgroundItem = new PanelTemplateRecord.TemplateItem( - ItemParser.parse((backgroundSection.getString("icon", Material.AIR.name()))), - backgroundSection.getString("title", null), - backgroundSection.getString("description", null)); + ItemParser.parse((backgroundSection.getString(ICON, Material.AIR.name()))), + backgroundSection.getString(TITLE, null), + backgroundSection.getString(DESCRIPTION, null)); } } - else if (configurationSection.isString("background")) + else if (configurationSection.isString(BACKGROUND)) { // Process background icon if it contains only icon. backgroundItem = new PanelTemplateRecord.TemplateItem( - ItemParser.parse((configurationSection.getString("background", Material.AIR.name())))); + ItemParser.parse((configurationSection.getString(BACKGROUND, Material.AIR.name())))); } // Read reusable @@ -156,7 +164,7 @@ public class TemplateReader { // Add all reusables to the local storage. reusable.getKeys(false).forEach(key -> - readPanelItemTemplate(reusable.getConfigurationSection(key), key, panelItemDataMap)); + readPanelItemTemplate(reusable.getConfigurationSection(key), key, panelItemDataMap)); } // Read content @@ -190,15 +198,15 @@ public class TemplateReader { // If it contains a section, then build a new button template from it. template.addButtonTemplate(rowIndex, - columnIndex, - readPanelItemTemplate(line.getConfigurationSection(String.valueOf(columnIndex + 1)))); + columnIndex, + readPanelItemTemplate(line.getConfigurationSection(String.valueOf(columnIndex + 1)))); } else if (line.isString(String.valueOf(columnIndex + 1))) { // If it contains just a single word, assume it is a reusable. template.addButtonTemplate(rowIndex, - columnIndex, - panelItemDataMap.get(line.getString(String.valueOf(columnIndex + 1)))); + columnIndex, + panelItemDataMap.get(line.getString(String.valueOf(columnIndex + 1)))); } } } @@ -221,20 +229,20 @@ public class TemplateReader { boolean[] forceShow = new boolean[6]; - if (section != null && section.contains("force-shown")) + if (section != null && section.contains(FORCE_SHOWN)) { - if (section.isInt("force-shown")) + if (section.isInt(FORCE_SHOWN)) { - int value = section.getInt("force-shown"); + int value = section.getInt(FORCE_SHOWN); if (value > 0 && value < 7) { forceShow[value-1] = true; } } - else if (section.isList("force-shown")) + else if (section.isList(FORCE_SHOWN)) { - section.getIntegerList("force-shown").forEach(number -> { + section.getIntegerList(FORCE_SHOWN).forEach(number -> { if (number > 0 && number < 7) { forceShow[number-1] = true; @@ -267,8 +275,8 @@ public class TemplateReader */ @Nullable private static ItemTemplateRecord readPanelItemTemplate(@Nullable ConfigurationSection section, - String itemKey, - Map reusableItemMap) + String itemKey, + Map reusableItemMap) { if (section == null) { @@ -278,13 +286,13 @@ public class TemplateReader ItemTemplateRecord fallback; - if (section.isConfigurationSection("fallback")) + if (section.isConfigurationSection(FALLBACK)) { - fallback = readPanelItemTemplate(section.getConfigurationSection("fallback")); + fallback = readPanelItemTemplate(section.getConfigurationSection(FALLBACK)); } - else if (section.isString("fallback") && reusableItemMap != null) + else if (section.isString(FALLBACK) && reusableItemMap != null) { - fallback = reusableItemMap.get(section.getString("fallback")); + fallback = reusableItemMap.get(section.getString(FALLBACK)); } else { @@ -292,10 +300,10 @@ public class TemplateReader } // Create Item Record - ItemTemplateRecord itemRecord = new ItemTemplateRecord(ItemParser.parse(section.getString("icon")), - section.getString("title", null), - section.getString("description", null), - fallback); + ItemTemplateRecord itemRecord = new ItemTemplateRecord(ItemParser.parse(section.getString(ICON)), + section.getString(TITLE, null), + section.getString(DESCRIPTION, null), + fallback); // Read data if (section.isConfigurationSection("data")) @@ -325,11 +333,10 @@ public class TemplateReader if (actionDataSection != null) { ItemTemplateRecord.ActionRecords actionData = - new ItemTemplateRecord.ActionRecords(clickType, - actionDataSection.getString("type"), - actionDataSection.getString("content"), - actionDataSection.getString("tooltip")); - + new ItemTemplateRecord.ActionRecords(clickType, + actionDataSection.getString("type"), + actionDataSection.getString("content"), + actionDataSection.getString("tooltip")); itemRecord.addAction(actionData); } } diff --git a/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/AddonPlaceholderExpansion.java b/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/AddonPlaceholderExpansion.java index d428b5708..83115c750 100644 --- a/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/AddonPlaceholderExpansion.java +++ b/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/AddonPlaceholderExpansion.java @@ -1,5 +1,6 @@ package world.bentobox.bentobox.api.placeholders.placeholderapi; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.addons.Addon; public class AddonPlaceholderExpansion extends BasicPlaceholderExpansion { @@ -10,17 +11,17 @@ public class AddonPlaceholderExpansion extends BasicPlaceholderExpansion { } @Override - public String getName() { + public @NonNull String getName() { return addon.getDescription().getName(); } @Override - public String getAuthor() { + public @NonNull String getAuthor() { return addon.getDescription().getAuthors().get(0); } @Override - public String getVersion() { + public @NonNull String getVersion() { return addon.getDescription().getVersion(); } } diff --git a/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/BasicPlaceholderExpansion.java b/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/BasicPlaceholderExpansion.java index e8a8a91f3..0a506073b 100644 --- a/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/BasicPlaceholderExpansion.java +++ b/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/BasicPlaceholderExpansion.java @@ -24,7 +24,7 @@ abstract class BasicPlaceholderExpansion extends PlaceholderExpansion { } @Override - public String getIdentifier() { + public @NonNull String getIdentifier() { return getName().toLowerCase(Locale.ENGLISH); } @@ -42,13 +42,13 @@ abstract class BasicPlaceholderExpansion extends PlaceholderExpansion { } @Override - public String onPlaceholderRequest(Player p, String placeholder) { - if (placeholders.containsKey(placeholder)) { + public String onPlaceholderRequest(Player p, @NonNull String placeholder) { + if (placeholders.containsKey(placeholder) && p != null) { return placeholders.get(placeholder).onReplace(User.getInstance(p)); } return null; } - + /** * Checks if a placeholder with this name is already registered * @param placeholder - name of placeholder @@ -56,7 +56,7 @@ abstract class BasicPlaceholderExpansion extends PlaceholderExpansion { * @since 1.4.0 */ public boolean isPlaceholder(@NonNull String placeholder) { - return placeholders.containsKey(placeholder); + return placeholders.containsKey(placeholder); } @Override diff --git a/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/BentoBoxPlaceholderExpansion.java b/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/BentoBoxPlaceholderExpansion.java index da290c84e..c00e98384 100644 --- a/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/BentoBoxPlaceholderExpansion.java +++ b/src/main/java/world/bentobox/bentobox/api/placeholders/placeholderapi/BentoBoxPlaceholderExpansion.java @@ -1,5 +1,6 @@ package world.bentobox.bentobox.api.placeholders.placeholderapi; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.BentoBox; public class BentoBoxPlaceholderExpansion extends BasicPlaceholderExpansion { @@ -11,17 +12,17 @@ public class BentoBoxPlaceholderExpansion extends BasicPlaceholderExpansion { } @Override - public String getName() { + public @NonNull String getName() { return plugin.getName(); } @Override - public String getAuthor() { + public @NonNull String getAuthor() { return "Tastybento and Poslovitch"; } @Override - public String getVersion() { + public @NonNull String getVersion() { return plugin.getDescription().getVersion(); } } \ No newline at end of file diff --git a/src/main/java/world/bentobox/bentobox/api/user/Notifier.java b/src/main/java/world/bentobox/bentobox/api/user/Notifier.java index e75adff03..b78888cd8 100644 --- a/src/main/java/world/bentobox/bentobox/api/user/Notifier.java +++ b/src/main/java/world/bentobox/bentobox/api/user/Notifier.java @@ -6,6 +6,7 @@ import java.util.concurrent.TimeUnit; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; +import org.eclipse.jdt.annotation.NonNull; /** * Utilities class that helps to avoid spamming the User with potential repeated messages @@ -26,7 +27,7 @@ public class Notifier { .build( new CacheLoader<>() { @Override - public Notification load(User user) { + public Notification load(@NonNull User user) { return new Notification(null, 0); } } diff --git a/src/main/java/world/bentobox/bentobox/api/user/User.java b/src/main/java/world/bentobox/bentobox/api/user/User.java index b032a2988..2c241e453 100644 --- a/src/main/java/world/bentobox/bentobox/api/user/User.java +++ b/src/main/java/world/bentobox/bentobox/api/user/User.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -32,6 +33,7 @@ import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.events.OfflineMessageEvent; import world.bentobox.bentobox.api.metadata.MetaDataAble; import world.bentobox.bentobox.api.metadata.MetaDataValue; +import world.bentobox.bentobox.database.objects.Players; import world.bentobox.bentobox.util.Util; /** @@ -61,25 +63,22 @@ public class User implements MetaDataAble { * @param sender - command sender, e.g. console * @return user - user */ - @Nullable - public static User getInstance(CommandSender sender) { - if (sender instanceof Player) { - return getInstance((Player)sender); + @NonNull + public static User getInstance(@NonNull CommandSender sender) { + if (sender instanceof Player p) { + return getInstance(p); } // Console return new User(sender); } /** - * Gets an instance of User from a Player object + * Gets an instance of User from a Player object. * @param player - the player * @return user - user */ - @Nullable - public static User getInstance(Player player) { - if (player == null) { - return null; - } + @NonNull + public static User getInstance(@NonNull Player player) { if (users.containsKey(player.getUniqueId())) { return users.get(player.getUniqueId()); } @@ -87,15 +86,12 @@ public class User implements MetaDataAble { } /** - * Gets an instance of User from a UUID + * Gets an instance of User from a UUID. * @param uuid - UUID * @return user - user */ - @Nullable - public static User getInstance(@Nullable UUID uuid) { - if (uuid == null) { - return null; - } + @NonNull + public static User getInstance(@NonNull UUID uuid) { if (users.containsKey(uuid)) { return users.get(uuid); } @@ -109,11 +105,8 @@ public class User implements MetaDataAble { * @return user * @since 1.3.0 */ - @Nullable - public static User getInstance(OfflinePlayer offlinePlayer) { - if (offlinePlayer == null) { - return null; - } + @NonNull + public static User getInstance(@NonNull OfflinePlayer offlinePlayer) { if (users.containsKey(offlinePlayer.getUniqueId())) { return users.get(offlinePlayer.getUniqueId()); } @@ -144,7 +137,7 @@ public class User implements MetaDataAble { private Addon addon; - private User(CommandSender sender) { + private User(@Nullable CommandSender sender) { player = null; playerUUID = null; this.sender = sender; @@ -184,25 +177,42 @@ public class User implements MetaDataAble { return sender.getEffectivePermissions(); } - @Nullable + /** + * Get the user's inventory + * @return player's inventory + * @throws {@link NullPointerException} - if user is not a player + */ + @NonNull public PlayerInventory getInventory() { - return player != null ? player.getInventory() : null; + return Objects.requireNonNull(player, "getInventory can only be called for online players!").getInventory(); } - @Nullable + /** + * Get the user's location + * @return location + * @throws {@link NullPointerException} - if user is not a player + */ + @NonNull public Location getLocation() { - return player != null ? player.getLocation() : null; + return Objects.requireNonNull(player, "getLocation can only be called for online players!").getLocation(); } + /** + * Get the user's name + * @return player's name + */ + @NonNull public String getName() { return player != null ? player.getName() : plugin.getPlayers().getName(playerUUID); } /** + * Check if the User is a player before calling this method. {@link #isPlayer()} * @return the player */ + @NonNull public Player getPlayer() { - return player; + return Objects.requireNonNull(player, "User is not a player!"); } /** @@ -213,11 +223,14 @@ public class User implements MetaDataAble { } /** + * Use {@link #isOfflinePlayer()} before calling this method * @return the offline player * @since 1.3.0 + * @throws {@link NullPointerException} - if user is not an offline player */ + @NonNull public OfflinePlayer getOfflinePlayer() { - return offlinePlayer; + return Objects.requireNonNull(offlinePlayer, "User is not an OfflinePlayer!"); } /** @@ -354,11 +367,11 @@ public class User implements MetaDataAble { // Get translation. String addonPrefix = plugin.getIWM() .getAddon(world).map(a -> a.getDescription().getName().toLowerCase(Locale.ENGLISH) + ".").orElse(""); - return translate(addonPrefix, reference, variables); + return Util.translateColorCodes(translate(addonPrefix, reference, variables)); } /** - * Gets a translation of this reference for this user. Translations may be overridden by Addons + * Gets a translation of this reference for this user with colors converted. Translations may be overridden by Addons * by using the same reference prefixed by the addon name (from the Addon Description) in lower case. * @param reference - reference found in a locale file * @param variables - variables to insert into translated string. Variables go in pairs, for example @@ -366,6 +379,21 @@ public class User implements MetaDataAble { * @return Translated string with colors converted, or the reference if nothing has been found */ public String getTranslation(String reference, String... variables) { + // Get addonPrefix + String addonPrefix = addon == null ? "" : addon.getDescription().getName().toLowerCase(Locale.ENGLISH) + "."; + return Util.translateColorCodes(translate(addonPrefix, reference, variables)); + } + + /** + * Gets a translation of this reference for this user without colors translated. Translations may be overridden by Addons + * by using the same reference prefixed by the addon name (from the Addon Description) in lower case. + * @param reference - reference found in a locale file + * @param variables - variables to insert into translated string. Variables go in pairs, for example + * "[name]", "tastybento" + * @return Translated string or the reference if nothing has been found + * @since 1.17.4 + */ + public String getTranslationNoColor(String reference, String... variables) { // Get addonPrefix String addonPrefix = addon == null ? "" : addon.getDescription().getName().toLowerCase(Locale.ENGLISH) + "."; return translate(addonPrefix, reference, variables); @@ -392,7 +420,7 @@ public class User implements MetaDataAble { // Replace the [gamemode] text variable prefixTranslation = prefixTranslation.replace("[gamemode]", addon != null ? addon.getDescription().getName() : "[gamemode]"); // Replace the [friendly_name] text variable - prefixTranslation = prefixTranslation.replace("[friendly_name]", getWorld() != null ? plugin.getIWM().getFriendlyName(getWorld()) : "[friendly_name]"); + prefixTranslation = prefixTranslation.replace("[friendly_name]", isPlayer() ? plugin.getIWM().getFriendlyName(getWorld()) : "[friendly_name]"); // Replace the prefix in the actual message translation = translation.replace("[prefix_" + prefix + "]", prefixTranslation); @@ -410,7 +438,7 @@ public class User implements MetaDataAble { translation = plugin.getPlaceholdersManager().replacePlaceholders(player, translation); } - return Util.translateColorCodes(translation); + return translation; } } @@ -499,10 +527,13 @@ public class User implements MetaDataAble { /** * Gets the current world this entity resides in - * @return World - world or null + * @return World - world + * @throws {@link NullPointerException} - if user is not a player */ + @NonNull public World getWorld() { - return player == null ? null : player.getWorld(); + Objects.requireNonNull(player, "Cannot be called on a non-player User!"); + return Objects.requireNonNull(player.getWorld(), "Player's world cannot be null!"); } /** @@ -641,10 +672,10 @@ public class User implements MetaDataAble { */ @Override public Optional> getMetaData() { - return plugin + Players p = plugin .getPlayers() - .getPlayer(playerUUID) - .getMetaData(); + .getPlayer(playerUUID); + return Objects.requireNonNull(p, "Unknown player for " + playerUUID).getMetaData(); } /** @@ -653,7 +684,11 @@ public class User implements MetaDataAble { */ @Override public void setMetaData(Map metaData) { - plugin.getPlayers().getPlayer(playerUUID).setMetaData(metaData); + Players p = plugin + .getPlayers() + .getPlayer(playerUUID); + + Objects.requireNonNull(p, "Unknown player for " + playerUUID).setMetaData(metaData); } } diff --git a/src/main/java/world/bentobox/bentobox/blueprints/Blueprint.java b/src/main/java/world/bentobox/bentobox/blueprints/Blueprint.java index fe47de567..38d73eec8 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/Blueprint.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/Blueprint.java @@ -79,7 +79,7 @@ public class Blueprint { /** * @return the icon */ - public Material getIcon() { + public @NonNull Material getIcon() { return icon; } /** diff --git a/src/main/java/world/bentobox/bentobox/blueprints/BlueprintClipboard.java b/src/main/java/world/bentobox/bentobox/blueprints/BlueprintClipboard.java index 034cdf919..7d0c01b82 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/BlueprintClipboard.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/BlueprintClipboard.java @@ -139,7 +139,7 @@ public class BlueprintClipboard { Math.rint(e.getLocation().getY()), Math.rint(e.getLocation().getZ())).equals(v)) .collect(Collectors.toList()); - if (copyBlock(v.toLocation(world), origin, copyAir, ents)) { + if (copyBlock(v.toLocation(world), copyAir, ents)) { count++; } }); @@ -151,6 +151,7 @@ public class BlueprintClipboard { } if (index > vectorsToCopy.size()) { copyTask.cancel(); + assert blueprint != null; blueprint.setAttached(bpAttachable); blueprint.setBlocks(bpBlocks); blueprint.setEntities(bpEntities); @@ -178,12 +179,13 @@ public class BlueprintClipboard { return r; } - private boolean copyBlock(Location l, @Nullable Vector origin2, boolean copyAir, Collection entities) { + private boolean copyBlock(Location l, boolean copyAir, Collection entities) { Block block = l.getBlock(); if (!copyAir && block.getType().equals(Material.AIR) && entities.isEmpty()) { return false; } // Create position + Vector origin2 = origin == null ? new Vector(0,0,0) : origin; int x = l.getBlockX() - origin2.getBlockX(); int y = l.getBlockY() - origin2.getBlockY(); int z = l.getBlockZ() - origin2.getBlockZ(); @@ -398,7 +400,7 @@ public class BlueprintClipboard { /** * @return the blueprint */ - public Blueprint getBlueprint() { + public @Nullable Blueprint getBlueprint() { return blueprint; } diff --git a/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java b/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java index cde794edd..6528f58bd 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java @@ -109,7 +109,7 @@ public class BlueprintPaster { this.plugin = plugin; this.clipboard = clipboard; // Calculate location for pasting - this.blueprint = clipboard.getBlueprint(); + this.blueprint = Objects.requireNonNull(clipboard.getBlueprint(), "Clipboard cannot have a null Blueprint"); this.location = location; this.island = null; @@ -416,9 +416,11 @@ public class BlueprintPaster { if (island != null && !lines.isEmpty() && lines.get(0).equalsIgnoreCase(TextVariables.START_TEXT)) { // Get the addon that is operating in this world String addonName = plugin.getIWM().getAddon(island.getWorld()).map(addon -> addon.getDescription().getName().toLowerCase(Locale.ENGLISH)).orElse(""); - for (int i = 0; i < 4; i++) { - s.setLine(i, Util.translateColorCodes(plugin.getLocalesManager().getOrDefault(User.getInstance(island.getOwner()), - addonName + ".sign.line" + i,"").replace(TextVariables.NAME, name))); + if (island.getOwner() != null) { + for (int i = 0; i < 4; i++) { + s.setLine(i, Util.translateColorCodes(plugin.getLocalesManager().getOrDefault(User.getInstance(island.getOwner()), + addonName + ".sign.line" + i,"").replace(TextVariables.NAME, name))); + } } } else { // Just paste diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionPrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionPrompt.java index 4493d9c47..661b6000d 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionPrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionPrompt.java @@ -8,6 +8,7 @@ import org.bukkit.conversations.Prompt; import org.bukkit.conversations.StringPrompt; import org.bukkit.entity.Player; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; @@ -33,7 +34,7 @@ public class DescriptionPrompt extends StringPrompt { @SuppressWarnings("unchecked") @Override - public String getPromptText(ConversationContext context) { + public @NonNull String getPromptText(ConversationContext context) { User user = User.getInstance((Player)context.getForWhom()); if (context.getSessionData(DESCRIPTION) != null) { StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionSuccessPrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionSuccessPrompt.java index b28546a9c..e5e78341e 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionSuccessPrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/DescriptionSuccessPrompt.java @@ -7,6 +7,7 @@ import org.bukkit.conversations.MessagePrompt; import org.bukkit.conversations.Prompt; import org.bukkit.entity.Player; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.user.User; @@ -28,7 +29,7 @@ public class DescriptionSuccessPrompt extends MessagePrompt { } @Override - public String getPromptText(ConversationContext context) { + public @NonNull String getPromptText(ConversationContext context) { User user = User.getInstance((Player)context.getForWhom()); @SuppressWarnings("unchecked") List description = (List)context.getSessionData("description"); @@ -46,7 +47,7 @@ public class DescriptionSuccessPrompt extends MessagePrompt { } @Override - protected Prompt getNextPrompt(ConversationContext context) { + protected Prompt getNextPrompt(@NonNull ConversationContext context) { return Prompt.END_OF_CONVERSATION; } diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameConversationPrefix.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameConversationPrefix.java index 719342de5..0da78ac24 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameConversationPrefix.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameConversationPrefix.java @@ -4,12 +4,13 @@ import org.bukkit.conversations.ConversationContext; import org.bukkit.conversations.ConversationPrefix; import org.bukkit.entity.Player; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.user.User; public class NameConversationPrefix implements ConversationPrefix { @Override - public String getPrefix(ConversationContext context) { + public @NonNull String getPrefix(ConversationContext context) { User user = User.getInstance((Player)context.getForWhom()); return user.getTranslation("commands.admin.blueprint.management.name.conversation-prefix"); } diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NamePrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NamePrompt.java index 5dd8a6294..2677cda44 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NamePrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NamePrompt.java @@ -38,7 +38,7 @@ public class NamePrompt extends StringPrompt { } @Override - public String getPromptText(ConversationContext context) { + public @NonNull String getPromptText(ConversationContext context) { User user = User.getInstance((Player)context.getForWhom()); return user.getTranslation("commands.admin.blueprint.management.name.prompt"); } diff --git a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameSuccessPrompt.java b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameSuccessPrompt.java index 8fe5d8c51..9e990fefe 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameSuccessPrompt.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/conversation/NameSuccessPrompt.java @@ -34,7 +34,7 @@ public class NameSuccessPrompt extends MessagePrompt { } @Override - public String getPromptText(ConversationContext context) { + public @NonNull String getPromptText(ConversationContext context) { String name = (String) context.getSessionData("name"); String uniqueId = (String) context.getSessionData("uniqueId"); User user = User.getInstance((Player)context.getForWhom()); @@ -65,7 +65,7 @@ public class NameSuccessPrompt extends MessagePrompt { } @Override - protected Prompt getNextPrompt(ConversationContext context) { + protected Prompt getNextPrompt(@NonNull ConversationContext context) { return Prompt.END_OF_CONVERSATION; } diff --git a/src/main/java/world/bentobox/bentobox/database/json/BentoboxTypeAdapterFactory.java b/src/main/java/world/bentobox/bentobox/database/json/BentoboxTypeAdapterFactory.java index d6693a073..09d738c34 100644 --- a/src/main/java/world/bentobox/bentobox/database/json/BentoboxTypeAdapterFactory.java +++ b/src/main/java/world/bentobox/bentobox/database/json/BentoboxTypeAdapterFactory.java @@ -33,7 +33,7 @@ import world.bentobox.bentobox.database.json.adapters.WorldTypeAdapter; */ public class BentoboxTypeAdapterFactory implements TypeAdapterFactory { - BentoBox plugin; + final BentoBox plugin; /** * @param plugin plugin diff --git a/src/main/java/world/bentobox/bentobox/database/mongodb/MongoDBDatabaseHandler.java b/src/main/java/world/bentobox/bentobox/database/mongodb/MongoDBDatabaseHandler.java index 02c0744a9..f9efcb15c 100644 --- a/src/main/java/world/bentobox/bentobox/database/mongodb/MongoDBDatabaseHandler.java +++ b/src/main/java/world/bentobox/bentobox/database/mongodb/MongoDBDatabaseHandler.java @@ -19,6 +19,7 @@ import com.mongodb.client.model.IndexOptions; import com.mongodb.client.model.Indexes; import com.mongodb.util.JSON; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.database.DatabaseConnector; import world.bentobox.bentobox.database.json.AbstractJSONDatabaseHandler; @@ -125,7 +126,7 @@ public class MongoDBDatabaseHandler extends AbstractJSONDatabaseHandler { } @Override - public T loadObject(String uniqueId) { + public T loadObject(@NonNull String uniqueId) { Document doc = collection.find(new Document(MONGO_ID, uniqueId)).limit(1).first(); Gson gson = getGson(); String json = JSON.serialize(doc).replaceFirst(MONGO_ID, UNIQUEID); diff --git a/src/main/java/world/bentobox/bentobox/database/objects/Island.java b/src/main/java/world/bentobox/bentobox/database/objects/Island.java index 8d7a2cd14..57f0a0306 100644 --- a/src/main/java/world/bentobox/bentobox/database/objects/Island.java +++ b/src/main/java/world/bentobox/bentobox/database/objects/Island.java @@ -16,7 +16,6 @@ import java.util.stream.Collectors; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.entity.Player; @@ -43,9 +42,7 @@ import world.bentobox.bentobox.database.objects.adapters.FlagSerializer; import world.bentobox.bentobox.database.objects.adapters.FlagSerializer3; import world.bentobox.bentobox.database.objects.adapters.LogEntryListAdapter; import world.bentobox.bentobox.lists.Flags; -import world.bentobox.bentobox.managers.IslandWorldManager; import world.bentobox.bentobox.managers.RanksManager; -import world.bentobox.bentobox.util.IslandInfo; import world.bentobox.bentobox.util.Pair; import world.bentobox.bentobox.util.Util; @@ -76,7 +73,6 @@ public class Island implements DataObject, MetaDataAble { //// Island //// // The center of the island space @Expose - @Nullable private Location center; /** @@ -164,8 +160,6 @@ public class Island implements DataObject, MetaDataAble { @Expose private List history = new LinkedList<>(); - @Expose - private int levelHandicap; @Expose private Map spawnPoint = new EnumMap<>(Environment.class); @@ -197,7 +191,7 @@ public class Island implements DataObject, MetaDataAble { private Boolean reserved = null; /** - * A place to store meta data for this island. + * A place to store metadata for this island. * @since 1.15.4 */ @Expose @@ -258,7 +252,6 @@ public class Island implements DataObject, MetaDataAble { this.gameMode = island.getGameMode(); this.homes = new HashMap<>(island.getHomes()); this.history.addAll(island.getHistory()); - this.levelHandicap = island.getLevelHandicap(); this.location = island.getProtectionCenter(); this.maxEverProtectionRange = island.getMaxEverProtectionRange(); this.maxHomes = island.getMaxHomes(); @@ -346,9 +339,9 @@ public class Island implements DataObject, MetaDataAble { * Returns a clone of the location of the center of this island. * @return clone of the center Location */ - @Nullable + @NonNull public Location getCenter(){ - return center == null ? null : center.clone(); + return Objects.requireNonNull(center, "Island getCenter requires a non-null center").clone(); } /** @@ -359,7 +352,7 @@ public class Island implements DataObject, MetaDataAble { } /** - * Gets the Island Guard flag's setting. If this is a protection flag, the this will be the + * Gets the Island Guard flag's setting. If this is a protection flag, then this will be the * rank needed to bypass this flag. If it is a Settings flag, any non-zero value means the * setting is allowed. * @param flag - flag @@ -376,13 +369,6 @@ public class Island implements DataObject, MetaDataAble { return flags; } - /** - * @return the levelHandicap - */ - public int getLevelHandicap() { - return levelHandicap; - } - /** * Returns the members of this island. * It contains all players that have any rank on this island, including {@link RanksManager#BANNED_RANK BANNED}, @@ -439,41 +425,41 @@ public class Island implements DataObject, MetaDataAble { } /** - * Get the minimum protected X block coord based on the island location. + * Get the minimum protected X block coordinate based on the island location. * It will never be less than {@link #getMinX()} * @return the minProtectedX */ public int getMinProtectedX() { - return getProtectionCenter() == null ? 0 : Math.max(getMinX(), getProtectionCenter().getBlockX() - protectionRange); + return Math.max(getMinX(), getProtectionCenter().getBlockX() - protectionRange); } /** - * Get the maximum protected X block coord based on the island location. + * Get the maximum protected X block coordinate based on the island location. * It will never be more than {@link #getMaxX()} * @return the maxProtectedX * @since 1.5.2 */ public int getMaxProtectedX() { - return getProtectionCenter() == null ? 0 : Math.min(getMaxX(), getProtectionCenter().getBlockX() + protectionRange); + return Math.min(getMaxX(), getProtectionCenter().getBlockX() + protectionRange); } /** - * Get the minimum protected Z block coord based on the island location. + * Get the minimum protected Z block coordinate based on the island location. * It will never be less than {@link #getMinZ()} * @return the minProtectedZ */ public int getMinProtectedZ() { - return getProtectionCenter() == null ? 0 : Math.max(getMinZ(), getProtectionCenter().getBlockZ() - protectionRange); + return Math.max(getMinZ(), getProtectionCenter().getBlockZ() - protectionRange); } /** - * Get the maximum protected Z block coord based on the island location. + * Get the maximum protected Z block coordinate based on the island location. * It will never be more than {@link #getMinZ()} * @return the maxProtectedZ * @since 1.5.2 */ public int getMaxProtectedZ() { - return getProtectionCenter() == null ? 0 : Math.min(getMaxZ(), getProtectionCenter().getBlockZ() + protectionRange); + return Math.min(getMaxZ(), getProtectionCenter().getBlockZ() + protectionRange); } /** @@ -561,6 +547,9 @@ public class Island implements DataObject, MetaDataAble { * @return the maxEverProtectionRange or the protection range, whichever is larger */ public int getMaxEverProtectionRange() { + if (maxEverProtectionRange > this.range) { + maxEverProtectionRange = this.range; + } return Math.max(protectionRange, maxEverProtectionRange); } @@ -569,6 +558,9 @@ public class Island implements DataObject, MetaDataAble { */ public void setMaxEverProtectionRange(int maxEverProtectionRange) { this.maxEverProtectionRange = maxEverProtectionRange; + if (maxEverProtectionRange > this.range) { + this.maxEverProtectionRange = this.range; + } setChanged(); } @@ -609,7 +601,7 @@ public class Island implements DataObject, MetaDataAble { } @Override - public String getUniqueId() { + public @NonNull String getUniqueId() { return uniqueId; } @@ -682,7 +674,7 @@ public class Island implements DataObject, MetaDataAble { * @since 1.5.2 */ public BoundingBox getBoundingBox() { - return new BoundingBox(getMinX(), 0.0D, getMinZ(), getMaxX()-1.0D, world.getMaxHeight(), getMaxZ()-1.0D); + return new BoundingBox(getMinX(), 0.0D, getMinZ(), getMaxX(), world.getMaxHeight(), getMaxZ()); } /** @@ -803,10 +795,8 @@ public class Island implements DataObject, MetaDataAble { /** * @param center the center to set */ - public void setCenter(@Nullable Location center) { - if (center != null) { - this.world = center.getWorld(); - } + public void setCenter(@NonNull Location center) { + this.world = center.getWorld(); this.center = center; setChanged(); } @@ -869,14 +859,6 @@ public class Island implements DataObject, MetaDataAble { setChanged(); } - /** - * @param levelHandicap the levelHandicap to set - */ - public void setLevelHandicap(int levelHandicap) { - this.levelHandicap = levelHandicap; - setChanged(); - } - /** * @param members the members to set */ @@ -1014,7 +996,7 @@ public class Island implements DataObject, MetaDataAble { * Sets whether this island is a spawn or not. *
* If {@code true}, the members and the owner will be removed from this island. - * The flags will also be resetted to default values. + * The flags will also be reset to default values. * @param isSpawn {@code true} if the island is a spawn, {@code false} otherwise. */ public void setSpawn(boolean isSpawn){ @@ -1073,27 +1055,6 @@ public class Island implements DataObject, MetaDataAble { setChanged(); } - /** - * Shows info of this island to this user. - * @param user the User who is requesting it - * @return always true - * @deprecated Use {@link IslandInfo#showInfo(User) instead} - */ - @Deprecated - public boolean showInfo(User user) { - return new IslandInfo(this).showInfo(user); - } - - /** - * Shows the members of this island to this user. - * @param user the User who is requesting it - * @deprecated Use {@link IslandInfo#showMembers(User) instead} - */ - @Deprecated - public void showMembers(User user) { - new IslandInfo(this).showMembers(user); - } - /** * Toggles a settings flag * This method affects subflags (if the given flag is a parent flag) @@ -1253,11 +1214,9 @@ public class Island implements DataObject, MetaDataAble { * @return {@code true} if this island has its nether island generated, {@code false} otherwise. * @since 1.5.0 */ - public boolean hasNetherIsland(){ - IslandWorldManager iwm = BentoBox.getInstance().getIWM(); - return iwm.isNetherGenerate(getWorld()) && iwm.isNetherIslands(getWorld()) && - iwm.getNetherWorld(getWorld()) != null && - !getCenter().toVector().toLocation(iwm.getNetherWorld(getWorld())).getBlock().getType().equals(Material.AIR); + public boolean hasNetherIsland() { + World nether = BentoBox.getInstance().getIWM().getNetherWorld(getWorld()); + return nether != null && !getCenter().toVector().toLocation(nether).getBlock().getType().isAir(); } /** @@ -1265,11 +1224,9 @@ public class Island implements DataObject, MetaDataAble { * @return {@code true} if this island has its end island generated, {@code false} otherwise. * @since 1.5.0 */ - public boolean hasEndIsland(){ - IslandWorldManager iwm = BentoBox.getInstance().getIWM(); - return iwm.isEndGenerate(getWorld()) && iwm.isEndIslands(getWorld()) && - iwm.getEndWorld(getWorld()) != null && - !getCenter().toVector().toLocation(iwm.getEndWorld(getWorld())).getBlock().getType().equals(Material.AIR); + public boolean hasEndIsland() { + World end = BentoBox.getInstance().getIWM().getEndWorld(getWorld()); + return end != null && !getCenter().toVector().toLocation(end).getBlock().getType().isAir(); } @@ -1417,7 +1374,7 @@ public class Island implements DataObject, MetaDataAble { * @return a clone of the protection center location * @since 1.16.0 */ - @Nullable + @NonNull public Location getProtectionCenter() { return location == null ? getCenter() : location.clone(); } @@ -1504,6 +1461,8 @@ public class Island implements DataObject, MetaDataAble { } /** + * Get the max homes. You shouldn't access this directly. + * Use {@link world.bentobox.bentobox.managers.IslandsManager#getMaxHomes(Island)} * @return the maxHomes. If null, then the world default should be used. * @since 1.16.0 */ @@ -1514,6 +1473,8 @@ public class Island implements DataObject, MetaDataAble { /** * @param maxHomes the maxHomes to set. If null then the world default will be used. + * You shouldn't access this directly. + * Use {@link world.bentobox.bentobox.managers.IslandsManager#setMaxHomes(Island, Integer)} * @since 1.16.0 */ public void setMaxHomes(@Nullable Integer maxHomes) { @@ -1574,7 +1535,7 @@ public class Island implements DataObject, MetaDataAble { + ", name=" + name + ", createdDate=" + createdDate + ", updatedDate=" + updatedDate + ", owner=" + owner + ", members=" + members + ", maxMembers=" + maxMembers + ", spawn=" + spawn + ", purgeProtected=" + purgeProtected + ", flags=" + flags + ", history=" + history - + ", levelHandicap=" + levelHandicap + ", spawnPoint=" + spawnPoint + ", doNotLoad=" + doNotLoad + + ", spawnPoint=" + spawnPoint + ", doNotLoad=" + doNotLoad + ", cooldowns=" + cooldowns + ", commandRanks=" + commandRanks + ", reserved=" + reserved + ", metaData=" + metaData + ", homes=" + homes + ", maxHomes=" + maxHomes + "]"; } diff --git a/src/main/java/world/bentobox/bentobox/database/objects/Players.java b/src/main/java/world/bentobox/bentobox/database/objects/Players.java index bf9164386..2a3e6dbb7 100644 --- a/src/main/java/world/bentobox/bentobox/database/objects/Players.java +++ b/src/main/java/world/bentobox/bentobox/database/objects/Players.java @@ -90,7 +90,9 @@ public class Players implements DataObject, MetaDataAble { * Gets the default home location. * @param world - world to check * @return Location - home location in world + * @deprecated Homes are stored in the Island object now */ + @Deprecated(since="1.18.0", forRemoval=true) @Nullable public Location getHomeLocation(World world) { return getHomeLocation(world, 1); // Default @@ -101,7 +103,9 @@ public class Players implements DataObject, MetaDataAble { * @param world - includes world and any related nether or end worlds * @param number - a number * @return Location of this home or null if not available + * @deprecated Homes are stored in the island object now */ + @Deprecated(since="1.18.0", forRemoval=true) @Nullable public Location getHomeLocation(World world, int number) { // Remove any lost worlds/locations @@ -116,7 +120,9 @@ public class Players implements DataObject, MetaDataAble { /** * @param world - world * @return List of home locations + * @deprecated Homes are stored in the island object now */ + @Deprecated(since="1.18.0", forRemoval=true) public Map getHomeLocations(World world) { // Remove any lost worlds/locations homeLocations.keySet().removeIf(l -> l == null || l.getWorld() == null); @@ -126,7 +132,9 @@ public class Players implements DataObject, MetaDataAble { /** * @return the homeLocations + * @deprecated Homes are stored in the Island object now */ + @Deprecated(since="1.18.0", forRemoval=true) public Map getHomeLocations() { // Remove any lost worlds/locations homeLocations.keySet().removeIf(l -> l == null || l.getWorld() == null); @@ -135,7 +143,9 @@ public class Players implements DataObject, MetaDataAble { /** * @param homeLocations the homeLocations to set + * @deprecated Homes are stored in the Island object now */ + @Deprecated(since="1.18.0", forRemoval=true) public void setHomeLocations(Map homeLocations) { this.homeLocations = homeLocations; // Remove any lost worlds/locations @@ -195,9 +205,10 @@ public class Players implements DataObject, MetaDataAble { /** * Stores the home location of the player in a String format * - * @param l - * a Bukkit location + * @param l a Bukkit location + * @deprecated Home locations are stored in islands */ + @Deprecated(since="1.18.0", forRemoval=true) public void setHomeLocation(final Location l) { setHomeLocation(l, 1); } @@ -206,7 +217,9 @@ public class Players implements DataObject, MetaDataAble { * Stores the numbered home location of the player. Numbering starts at 1. * @param location - the location * @param number - a number + * @deprecated Home locations are no longer stored for players. They are stored in islands. */ + @Deprecated(since="1.18.0", forRemoval=true) public void setHomeLocation(Location location, int number) { // Remove any home locations in the same world with the same number homeLocations.entrySet().removeIf(e -> e.getKey() == null || (Util.sameWorld(location.getWorld(), e.getKey().getWorld()) && e.getValue().equals(number))); @@ -224,7 +237,9 @@ public class Players implements DataObject, MetaDataAble { /** * Clears all home Locations in world * @param world - world + * @deprecated Home locations are no longer stored for players. Use {@link IslandManager} */ + @Deprecated(since="1.18.0", forRemoval=true) public void clearHomeLocations(World world) { homeLocations.keySet().removeIf(l -> l == null || l.getWorld() == null || Util.sameWorld(l.getWorld(), world)); } @@ -329,7 +344,10 @@ public class Players implements DataObject, MetaDataAble { */ public void addToPendingKick(World world) { - this.pendingKicks.add(Util.getWorld(world).getName()); + World w = Util.getWorld(world); + if (w != null) { + this.pendingKicks.add(w.getName()); + } } /** diff --git a/src/main/java/world/bentobox/bentobox/database/transition/TransitionDatabaseHandler.java b/src/main/java/world/bentobox/bentobox/database/transition/TransitionDatabaseHandler.java index a3bb314bd..c1402be8a 100644 --- a/src/main/java/world/bentobox/bentobox/database/transition/TransitionDatabaseHandler.java +++ b/src/main/java/world/bentobox/bentobox/database/transition/TransitionDatabaseHandler.java @@ -5,6 +5,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.concurrent.CompletableFuture; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.database.AbstractDatabaseHandler; @@ -55,7 +56,7 @@ public class TransitionDatabaseHandler extends AbstractDatabaseHandler { * @see world.bentobox.bentobox.database.AbstractDatabaseHandler#loadObject(java.lang.String) */ @Override - public T loadObject(String uniqueId) throws InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, IntrospectionException, NoSuchMethodException { + public T loadObject(@NonNull String uniqueId) throws InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, IntrospectionException, NoSuchMethodException { // Try destination database @Nullable T object = toHandler.loadObject(uniqueId); diff --git a/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseConnector.java b/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseConnector.java index aacc05b97..62e9b3094 100644 --- a/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseConnector.java +++ b/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseConnector.java @@ -144,7 +144,7 @@ public class YamlDatabaseConnector implements DatabaseConnector { // Run through the file and add in the comments File commentedFile = new File(file.getPath() + ".tmp"); List newFile = new ArrayList<>(); - try (Scanner scanner = new Scanner(file, "UTF-8")) { + try (Scanner scanner = new Scanner(file, StandardCharsets.UTF_8)) { while (scanner.hasNextLine()) { String nextLine = scanner.nextLine(); // See if there are any comments in this line diff --git a/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseHandler.java b/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseHandler.java index 6c9d56dd5..05b42d537 100644 --- a/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseHandler.java +++ b/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseHandler.java @@ -80,7 +80,7 @@ public class YamlDatabaseHandler extends AbstractDatabaseHandler { * @see world.bentobox.bentobox.database.AbstractDatabaseHandler#loadObject(java.lang.String) */ @Override - public T loadObject(String key) throws InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, IntrospectionException, NoSuchMethodException { + public T loadObject(@NonNull String key) throws InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, IntrospectionException, NoSuchMethodException { // Objects are loaded from a folder named after the simple name of the class being stored String path = DATABASE_FOLDER_NAME + File.separator + dataObject.getSimpleName(); // This path and key can be overridden by the StoreAt annotation in the code diff --git a/src/main/java/world/bentobox/bentobox/hooks/LangUtilsHook.java b/src/main/java/world/bentobox/bentobox/hooks/LangUtilsHook.java index d7e630f16..01c584594 100644 --- a/src/main/java/world/bentobox/bentobox/hooks/LangUtilsHook.java +++ b/src/main/java/world/bentobox/bentobox/hooks/LangUtilsHook.java @@ -207,7 +207,7 @@ public class LangUtilsHook extends Hook { public static String getEnchantDisplayName(Enchantment ench, int level, User user) { return hooked ? LanguageHelper.getEnchantmentDisplayName(ench, level, getUserLocale(user)) - : ench.getKey().getKey() + " " + level; + : Util.prettifyText(ench.getKey().getKey()) + " " + level; } /** @@ -221,7 +221,7 @@ public class LangUtilsHook extends Hook { public static String getEnchantDisplayName(Entry entry, User user) { return hooked ? LanguageHelper.getEnchantmentDisplayName(entry, getUserLocale(user)) - : entry.getKey().getKey().getKey() + " " + entry.getValue(); + : Util.prettifyText(entry.getKey().getKey().getKey()) + " " + entry.getValue(); } /** @@ -234,7 +234,7 @@ public class LangUtilsHook extends Hook { public static String getEnchantName(Enchantment enchant, User user) { return hooked ? LanguageHelper.getEnchantmentName(enchant, getUserLocale(user)) - : enchant.getKey().getKey(); + : Util.prettifyText(enchant.getKey().getKey()); } /** diff --git a/src/main/java/world/bentobox/bentobox/hooks/WorldEditHook.java b/src/main/java/world/bentobox/bentobox/hooks/WorldEditHook.java deleted file mode 100644 index a77579dbc..000000000 --- a/src/main/java/world/bentobox/bentobox/hooks/WorldEditHook.java +++ /dev/null @@ -1,41 +0,0 @@ -package world.bentobox.bentobox.hooks; - -import org.bukkit.Material; -import org.eclipse.jdt.annotation.Nullable; - -import com.sk89q.worldedit.WorldEdit; - -import world.bentobox.bentobox.api.hooks.Hook; -import world.bentobox.bentobox.blueprints.worldedit.BlueprintClipboardFormat; - -/** - * @since 1.6.0 - * @author Poslovitch - */ -public class WorldEditHook extends Hook { - - public WorldEditHook() { - super("WorldEdit", Material.WOODEN_AXE); - } - - @Override - public boolean hook() { - - WorldEdit instance; - try { - instance = WorldEdit.getInstance(); - new BlueprintClipboardFormat(); - } catch (Exception e) { - return false; - } - - return instance != null; - - } - - @Override - @Nullable - public String getFailureCause() { - return null; // The process shouldn't fail - } -} diff --git a/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderAPIHook.java b/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderAPIHook.java index 7b3b174fd..bf0583c16 100644 --- a/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderAPIHook.java +++ b/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderAPIHook.java @@ -32,7 +32,7 @@ public class PlaceholderAPIHook extends PlaceholderHook { public PlaceholderAPIHook() { - super("PlaceholderAPI"); + super(); this.addonsExpansions = new HashMap<>(); this.bentoBoxPlaceholders = new HashSet<>(); this.addonPlaceholders = new HashMap<>(); diff --git a/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderHook.java b/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderHook.java index f8218d8d7..78653f78b 100644 --- a/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderHook.java +++ b/src/main/java/world/bentobox/bentobox/hooks/placeholders/PlaceholderHook.java @@ -14,8 +14,8 @@ import world.bentobox.bentobox.api.placeholders.PlaceholderReplacer; */ public abstract class PlaceholderHook extends Hook { - protected PlaceholderHook(@NonNull String pluginName) { - super(pluginName, Material.NAME_TAG); + protected PlaceholderHook() { + super("PlaceholderAPI", Material.NAME_TAG); } /** diff --git a/src/main/java/world/bentobox/bentobox/listeners/BlockEndDragon.java b/src/main/java/world/bentobox/bentobox/listeners/BlockEndDragon.java index 8c219a353..47819492c 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/BlockEndDragon.java +++ b/src/main/java/world/bentobox/bentobox/listeners/BlockEndDragon.java @@ -2,6 +2,7 @@ package world.bentobox.bentobox.listeners; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; @@ -35,14 +36,15 @@ public class BlockEndDragon implements Listener { } private void testLocation(Location location) { - if (!plugin.getIWM().isIslandEnd(location.getWorld()) - || !Flags.REMOVE_END_EXIT_ISLAND.isSetForWorld(location.getWorld()) - || location.getWorld().getBlockAt(0, 255, 0).getType().equals(Material.END_PORTAL)) { + World w = location.getWorld(); + if (w == null || !plugin.getIWM().isIslandEnd(w) + || !Flags.REMOVE_END_EXIT_ISLAND.isSetForWorld(w) + || w.getBlockAt(0, 255, 0).getType().equals(Material.END_PORTAL)) { return; } // Setting a End Portal at the top will trick dragon legacy check. - location.getWorld().getBlockAt(0, 255, 0).setType(Material.END_PORTAL, false); + w.getBlockAt(0, 255, 0).setType(Material.END_PORTAL, false); } /** diff --git a/src/main/java/world/bentobox/bentobox/listeners/JoinLeaveListener.java b/src/main/java/world/bentobox/bentobox/listeners/JoinLeaveListener.java index e1f28b671..a716ef566 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/JoinLeaveListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/JoinLeaveListener.java @@ -220,8 +220,8 @@ public class JoinLeaveListener implements Listener { if (island != null) { // Check if new owner has a different range permission than the island size int range = user.getPermissionValue(plugin.getIWM().getAddon(island.getWorld()).map(GameModeAddon::getPermissionPrefix).orElse("") + "island.range", island.getProtectionRange()); - // Range cannot be greater than the island distance * 2 - range = Math.min(range, 2 * plugin.getIWM().getIslandDistance(island.getWorld())); + // Range cannot be greater than the island distance + range = Math.min(range, plugin.getIWM().getIslandDistance(island.getWorld())); // Range can go up or down if (range != island.getProtectionRange()) { user.sendMessage("commands.admin.setrange.range-updated", TextVariables.NUMBER, String.valueOf(range)); diff --git a/src/main/java/world/bentobox/bentobox/listeners/PlayerEntityPortalEvent.java b/src/main/java/world/bentobox/bentobox/listeners/PlayerEntityPortalEvent.java index 3a8c04cd4..f1c29abc3 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/PlayerEntityPortalEvent.java +++ b/src/main/java/world/bentobox/bentobox/listeners/PlayerEntityPortalEvent.java @@ -1,5 +1,6 @@ package world.bentobox.bentobox.listeners; +import java.util.Objects; import java.util.Optional; import org.bukkit.Location; @@ -153,8 +154,8 @@ public class PlayerEntityPortalEvent { * Get the from world * @return from world */ - @Nullable + @NonNull public World getWorld() { - return getFrom().getWorld(); + return Objects.requireNonNull(getFrom().getWorld(), "From world is null!"); } } diff --git a/src/main/java/world/bentobox/bentobox/listeners/PortalTeleportationListener.java b/src/main/java/world/bentobox/bentobox/listeners/PortalTeleportationListener.java index d0e55998d..f16766a37 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/PortalTeleportationListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/PortalTeleportationListener.java @@ -2,6 +2,7 @@ package world.bentobox.bentobox.listeners; import java.util.Arrays; import java.util.HashSet; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -56,7 +57,7 @@ public class PortalTeleportationListener implements Listener { * Fires the event if nether or end is disabled at the system level * @param e - EntityPortalEnterEvent */ - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onPlayerPortal(EntityPortalEnterEvent e) { if (!(e.getEntity() instanceof Player)) { return; @@ -96,7 +97,7 @@ public class PortalTeleportationListener implements Listener { * * @param e - event */ - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public boolean onEntityPortal(EntityPortalEvent e) { if (plugin.getIWM().inWorld(e.getFrom())) { Optional mat = Arrays.stream(BlockFace.values()) @@ -155,7 +156,7 @@ public class PortalTeleportationListener implements Listener { private boolean processPortal(final PlayerEntityPortalEvent e, final Environment env) { World fromWorld = e.getFrom().getWorld(); World overWorld = Util.getWorld(fromWorld); - if (fromWorld == null || !plugin.getIWM().inWorld(overWorld)) { + if (overWorld == null || fromWorld == null || !plugin.getIWM().inWorld(overWorld)) { // Do nothing special return false; } @@ -392,7 +393,7 @@ public class PortalTeleportationListener implements Listener { */ private void handleStandardNetherOrEnd(PlayerEntityPortalEvent e, World fromWorld, World overWorld, Environment env) { if (fromWorld.getEnvironment() != env) { - World toWorld = getNetherEndWorld(overWorld, env); + World toWorld = Objects.requireNonNull(getNetherEndWorld(overWorld, env)); Location spawnPoint = toWorld.getSpawnLocation(); // If spawn is set as 0,63,0 in the End then move it to 100, 50 ,0. if (env.equals(Environment.THE_END) && spawnPoint.getBlockX() == 0 && spawnPoint.getBlockZ() == 0) { diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/CommandCycleClick.java b/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/CommandCycleClick.java index 8db7760e7..c86c0008f 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/CommandCycleClick.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/CommandCycleClick.java @@ -36,7 +36,7 @@ public class CommandCycleClick implements ClickHandler { // Get the user's island for the game world World world = panel.getWorld().orElse(user.getWorld()); Island island = plugin.getIslands().getIsland(world, user.getUniqueId()); - if (island != null && island.getOwner().equals(user.getUniqueId())) { + if (island != null && island.getOwner() != null && island.getOwner().equals(user.getUniqueId())) { RanksManager rm = plugin.getRanksManager(); int currentRank = island.getRankCommand(command); if (click.equals(ClickType.LEFT)) { diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/CommandRankClickListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/CommandRankClickListener.java index d5ce0fecc..201b3ced3 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/CommandRankClickListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/CommandRankClickListener.java @@ -2,6 +2,7 @@ package world.bentobox.bentobox.listeners.flags.clicklisteners; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -43,7 +44,8 @@ public class CommandRankClickListener implements ClickHandler { } // Check if has permission - String prefix = plugin.getIWM().getPermissionPrefix(Util.getWorld(panel.getWorld().orElse(user.getWorld()))); + World w = Objects.requireNonNull(Util.getWorld(panel.getWorld().orElse(user.getWorld()))); + String prefix = plugin.getIWM().getPermissionPrefix(w); String reqPerm = prefix + "settings." + Flags.COMMAND_RANKS.getID(); String allPerms = prefix + "settings.*"; if (!user.hasPermission(reqPerm) && !user.hasPermission(allPerms) diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/GeoLimitClickListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/GeoLimitClickListener.java index 98e1495a7..c01177afb 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/GeoLimitClickListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/GeoLimitClickListener.java @@ -1,5 +1,7 @@ package world.bentobox.bentobox.listeners.flags.clicklisteners; +import java.util.Objects; + import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.event.inventory.ClickType; @@ -29,7 +31,8 @@ public class GeoLimitClickListener implements ClickHandler { } World world = panel.getWorld().orElse(user.getWorld()); IslandWorldManager iwm = BentoBox.getInstance().getIWM(); - String reqPerm = iwm.getPermissionPrefix(Util.getWorld(world)) + "admin.settings.GEO_LIMIT_MOBS"; + World w = Objects.requireNonNull(Util.getWorld(world)); + String reqPerm = iwm.getPermissionPrefix(w) + "admin.settings.GEO_LIMIT_MOBS"; if (!user.hasPermission(reqPerm)) { user.sendMessage("general.errors.no-permission", "[permission]", reqPerm); user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_METAL_HIT, 1F, 1F); diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/MobLimitClickListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/MobLimitClickListener.java index 07b7c7ec9..deb629812 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/MobLimitClickListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/clicklisteners/MobLimitClickListener.java @@ -1,5 +1,7 @@ package world.bentobox.bentobox.listeners.flags.clicklisteners; +import java.util.Objects; + import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.event.inventory.ClickType; @@ -29,7 +31,8 @@ public class MobLimitClickListener implements ClickHandler { } World world = panel.getWorld().orElse(user.getWorld()); IslandWorldManager iwm = BentoBox.getInstance().getIWM(); - String reqPerm = iwm.getPermissionPrefix(Util.getWorld(world)) + "admin.settings.LIMIT_MOBS"; + World w = Objects.requireNonNull(Util.getWorld(world)); + String reqPerm = iwm.getPermissionPrefix(w) + "admin.settings.LIMIT_MOBS"; if (!user.hasPermission(reqPerm)) { user.sendMessage("general.errors.no-permission", "[permission]", reqPerm); user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_METAL_HIT, 1F, 1F); diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BlockInteractionListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BlockInteractionListener.java index 98a382cec..55deac57e 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BlockInteractionListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BlockInteractionListener.java @@ -44,7 +44,7 @@ public class BlockInteractionListener extends FlagListener { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerInteract(final PlayerInteractEvent e) { // We only care about the RIGHT_CLICK_BLOCK action. - if (!e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + if (!e.getAction().equals(Action.RIGHT_CLICK_BLOCK) || e.getClickedBlock() == null) { return; } diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BreakBlocksListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BreakBlocksListener.java index 391f2605d..6defb0ef6 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BreakBlocksListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BreakBlocksListener.java @@ -42,15 +42,13 @@ public class BreakBlocksListener extends FlagListener { */ @EventHandler(priority = EventPriority.LOW) public void onBreakHanging(final HangingBreakByEntityEvent e) { - if (e.getRemover() instanceof Player) { - checkIsland(e, (Player)e.getRemover(), e.getEntity().getLocation(), Flags.BREAK_BLOCKS); + if (e.getRemover() instanceof Player r) { + checkIsland(e, r, e.getEntity().getLocation(), Flags.BREAK_BLOCKS); } // Check for projectiles - if (e.getRemover() instanceof Projectile p) { - // Find out who fired it - if (p.getShooter() instanceof Player) { - checkIsland(e, (Player)p.getShooter(), e.getEntity().getLocation(), Flags.BREAK_BLOCKS); - } + // Find out who fired it + if (e.getRemover() instanceof Projectile p && p.getShooter() instanceof Player s) { + checkIsland(e, s, e.getEntity().getLocation(), Flags.BREAK_BLOCKS); } } @@ -65,21 +63,14 @@ public class BreakBlocksListener extends FlagListener { if (!e.getAction().equals(Action.LEFT_CLICK_BLOCK)) { return; } + Player p = e.getPlayer(); + Location l = e.getClickedBlock().getLocation(); switch (e.getClickedBlock().getType()) { - case CAKE: - checkIsland(e, e.getPlayer(), e.getClickedBlock().getLocation(), Flags.BREAK_BLOCKS); - break; - case SPAWNER: - checkIsland(e, e.getPlayer(), e.getClickedBlock().getLocation(), Flags.BREAK_SPAWNERS); - break; - case DRAGON_EGG: - checkIsland(e, e.getPlayer(), e.getClickedBlock().getLocation(), Flags.DRAGON_EGG); - break; - case HOPPER: - checkIsland(e, e.getPlayer(), e.getClickedBlock().getLocation(), Flags.BREAK_HOPPERS); - break; - default: - break; + case CAKE -> checkIsland(e, p, l, Flags.BREAK_BLOCKS); + case SPAWNER -> checkIsland(e, p, l, Flags.BREAK_SPAWNERS); + case DRAGON_EGG -> checkIsland(e, p, l, Flags.DRAGON_EGG); + case HOPPER -> checkIsland(e, p, l, Flags.BREAK_HOPPERS); + default -> {} } } @@ -89,14 +80,15 @@ public class BreakBlocksListener extends FlagListener { */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onVehicleDamageEvent(VehicleDamageEvent e) { - if (getIWM().inWorld(e.getVehicle().getLocation()) && e.getAttacker() instanceof Player) { + Location l = e.getVehicle().getLocation(); + if (getIWM().inWorld(l) && e.getAttacker() instanceof Player p) { String vehicleType = e.getVehicle().getType().toString(); if (e.getVehicle().getType().equals(EntityType.BOAT)) { - checkIsland(e, (Player) e.getAttacker(), e.getVehicle().getLocation(), Flags.BOAT); + checkIsland(e, p, l, Flags.BOAT); } else if (vehicleType.contains("MINECART")) { - checkIsland(e, (Player) e.getAttacker(), e.getVehicle().getLocation(), Flags.MINECART); + checkIsland(e, p, l, Flags.MINECART); } else { - checkIsland(e, (Player) e.getAttacker(), e.getVehicle().getLocation(), Flags.BREAK_BLOCKS); + checkIsland(e, p, l, Flags.BREAK_BLOCKS); } } } @@ -114,9 +106,9 @@ public class BreakBlocksListener extends FlagListener { return; } // Get the attacker - if (e.getDamager() instanceof Player) { + if (e.getDamager() instanceof Player p) { // Check the break blocks flag - notAllowed(e, (Player)e.getDamager(), e.getEntity().getLocation()); + notAllowed(e, p, e.getEntity().getLocation()); } else if (e.getDamager() instanceof Projectile p) { // Find out who fired the arrow if (p.getShooter() instanceof Player && notAllowed(e, (Player)p.getShooter(), e.getEntity().getLocation())) { @@ -153,8 +145,8 @@ public class BreakBlocksListener extends FlagListener { } // Find out who fired the arrow - if (e.getEntity().getShooter() instanceof Player && - !checkIsland(e, (Player) e.getEntity().getShooter(), e.getHitBlock().getLocation(), Flags.BREAK_BLOCKS)) { + if (e.getEntity().getShooter() instanceof Player s && + !checkIsland(e, s, e.getHitBlock().getLocation(), Flags.BREAK_BLOCKS)) { final BlockData data = e.getHitBlock().getBlockData(); // We seemingly can't prevent the block from being destroyed // So we need to put it back with a slight delay (yup, this is hacky - it makes the block flicker sometimes) diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BucketListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BucketListener.java index 02426ea85..3f411267f 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BucketListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BucketListener.java @@ -1,8 +1,10 @@ package world.bentobox.bentobox.listeners.flags.protection; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.MushroomCow; +import org.bukkit.entity.Player; import org.bukkit.entity.TropicalFish; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -38,20 +40,14 @@ public class BucketListener extends FlagListener { */ @EventHandler(priority = EventPriority.LOW) public void onBucketFill(final PlayerBucketFillEvent e) { + Player p = e.getPlayer(); + Location l = e.getBlockClicked().getLocation(); // Check filling of various liquids switch (e.getItemStack().getType()) { - case LAVA_BUCKET -> { - checkIsland(e, e.getPlayer(), e.getBlockClicked().getLocation(), Flags.COLLECT_LAVA); - } - case WATER_BUCKET -> { - checkIsland(e, e.getPlayer(), e.getBlockClicked().getLocation(), Flags.COLLECT_WATER); - } - case MILK_BUCKET -> { - checkIsland(e, e.getPlayer(), e.getBlockClicked().getLocation(), Flags.MILKING); - } - default -> - // Check general bucket use - checkIsland(e, e.getPlayer(), e.getBlockClicked().getLocation(), Flags.BUCKET); + case LAVA_BUCKET -> checkIsland(e, p, l, Flags.COLLECT_LAVA); + case WATER_BUCKET -> checkIsland(e, p, l, Flags.COLLECT_WATER); + case MILK_BUCKET -> checkIsland(e, p, l, Flags.MILKING); + default -> checkIsland(e, p, l, Flags.BUCKET); } } diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/EntityInteractListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/EntityInteractListener.java index 403fa9871..3f273b5c3 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/EntityInteractListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/EntityInteractListener.java @@ -1,11 +1,14 @@ package world.bentobox.bentobox.listeners.flags.protection; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Animals; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Boat; +import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; import org.bukkit.entity.Villager; +import org.bukkit.entity.WanderingTrader; import org.bukkit.entity.minecart.RideableMinecart; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -32,31 +35,33 @@ public class EntityInteractListener extends FlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onPlayerInteractEntity(PlayerInteractEntityEvent e) { + Player p = e.getPlayer(); + Location l = e.getRightClicked().getLocation(); if (e.getRightClicked() instanceof Vehicle) { // Animal riding if (e.getRightClicked() instanceof Animals) { - checkIsland(e, e.getPlayer(), e.getRightClicked().getLocation(), Flags.RIDING); + checkIsland(e, p, l, Flags.RIDING); } // Minecart riding else if (e.getRightClicked() instanceof RideableMinecart) { - checkIsland(e, e.getPlayer(), e.getRightClicked().getLocation(), Flags.MINECART); + checkIsland(e, p, l, Flags.MINECART); } // Boat riding else if (e.getRightClicked() instanceof Boat) { - checkIsland(e, e.getPlayer(), e.getRightClicked().getLocation(), Flags.BOAT); + checkIsland(e, p, l, Flags.BOAT); } } // Villager trading - else if (e.getRightClicked() instanceof Villager || e.getRightClicked().getType().name().equals("WANDERING_TRADER")) { // TODO: Simplify when 1.13.2 support is dropped + else if (e.getRightClicked() instanceof Villager || e.getRightClicked() instanceof WanderingTrader) { // Check naming and check trading - checkIsland(e, e.getPlayer(), e.getRightClicked().getLocation(), Flags.TRADING); + checkIsland(e, p, l, Flags.TRADING); if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.NAME_TAG)) { - checkIsland(e, e.getPlayer(), e.getRightClicked().getLocation(), Flags.NAME_TAG); + checkIsland(e, p, l, Flags.NAME_TAG); } } // Name tags else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.NAME_TAG)) { - checkIsland(e, e.getPlayer(), e.getRightClicked().getLocation(), Flags.NAME_TAG); + checkIsland(e, p, l, Flags.NAME_TAG); } } } diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/ExperiencePickupListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/ExperiencePickupListener.java index b2233740f..71f8d6cf9 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/ExperiencePickupListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/ExperiencePickupListener.java @@ -19,9 +19,9 @@ public class ExperiencePickupListener extends FlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onExperienceOrbTargetPlayer(EntityTargetLivingEntityEvent e) { // Make sure the target is a Player and the entity is an experience orb - if (e.getTarget() instanceof Player && e.getEntity() instanceof ExperienceOrb - && !checkIsland(e, (Player) e.getTarget(), e.getEntity().getLocation(), Flags.EXPERIENCE_PICKUP)) { - // Cancelling the event won't work, we need to explicitly set the target to null + if (e.getTarget() instanceof Player p && e.getEntity() instanceof ExperienceOrb o + && !checkIsland(e, p, o.getLocation(), Flags.EXPERIENCE_PICKUP)) { + // Canceling the event won't work, we need to explicitly set the target to null e.setTarget(null); } } diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/LockAndBanListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/LockAndBanListener.java index 072032bd0..37ec8be1e 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/LockAndBanListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/LockAndBanListener.java @@ -11,6 +11,7 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.vehicle.VehicleMoveEvent; import org.bukkit.util.Vector; +import org.eclipse.jdt.annotation.NonNull; import io.papermc.lib.PaperLib; import world.bentobox.bentobox.BentoBox; @@ -103,7 +104,7 @@ public class LockAndBanListener extends FlagListener { * @param loc - location to check * @return CheckResult LOCKED, BANNED or OPEN. If an island is locked, that will take priority over banned */ - private CheckResult check(Player player, Location loc) { + private CheckResult check(@NonNull Player player, Location loc) { // Ops or NPC's are allowed everywhere if (player.isOp() || player.hasMetadata("NPC")) { return CheckResult.OPEN; @@ -127,7 +128,7 @@ public class LockAndBanListener extends FlagListener { * @param loc - location to check * @return true if banned */ - private CheckResult checkAndNotify(Player player, Location loc) { + private CheckResult checkAndNotify(@NonNull Player player, Location loc) { CheckResult r = check(player,loc); switch (r) { case BANNED: diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListener.java index 34caba40b..8ae046632 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListener.java @@ -47,7 +47,7 @@ public class MobSpawnListener extends FlagListener { case RAID: case REINFORCEMENTS: case SILVERFISH_BLOCK: - //case SLIME_SPLIT: messes with slimes from spawners, slime must have previously existed to create another + //case SLIME_SPLIT: messes with slimes from spawners, slime must have previously existed to create another case TRAP: case VILLAGE_DEFENSE: case VILLAGE_INVASION: diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/settings/PVPListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/settings/PVPListener.java index 2cc2fee54..23ea9cf5d 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/settings/PVPListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/settings/PVPListener.java @@ -2,7 +2,6 @@ package world.bentobox.bentobox.listeners.flags.settings; import java.util.HashMap; import java.util.Map; -import java.util.Objects; import java.util.UUID; import java.util.WeakHashMap; @@ -25,6 +24,7 @@ import org.bukkit.event.entity.LingeringPotionSplashEvent; import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.event.player.PlayerTeleportEvent; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.events.flags.FlagSettingChangeEvent; import world.bentobox.bentobox.api.flags.Flag; @@ -62,10 +62,10 @@ public class PVPListener extends FlagListener { } // Protect visitors if (e.getCause().equals(DamageCause.ENTITY_ATTACK) && protectedVisitor((Player)e.getEntity())) { - if (e.getDamager() instanceof Player) { - User.getInstance(e.getDamager()).notify(Flags.INVINCIBLE_VISITORS.getHintReference()); - } else if (e.getDamager() instanceof Projectile && ((Projectile)e.getDamager()).getShooter() instanceof Player) { - User.getInstance((Player)((Projectile)e.getDamager()).getShooter()).notify(Flags.INVINCIBLE_VISITORS.getHintReference()); + if (e.getDamager() instanceof Player p && p != null) { + User.getInstance(p).notify(Flags.INVINCIBLE_VISITORS.getHintReference()); + } else if (e.getDamager() instanceof Projectile pr && pr.getShooter() instanceof Player sh && sh != null) { + User.getInstance(sh).notify(Flags.INVINCIBLE_VISITORS.getHintReference()); } e.setCancelled(true); } else { @@ -89,9 +89,8 @@ public class PVPListener extends FlagListener { user.notify(getFlag(damager.getWorld()).getHintReference()); e.setCancelled(true); } - } else if (damager instanceof Projectile p && ((Projectile)damager).getShooter() instanceof Player) { + } else if (damager instanceof Projectile p && ((Projectile)damager).getShooter() instanceof Player shooter) { // Find out who fired the arrow - Player shooter =(Player)p.getShooter(); processDamage(e, damager, shooter, hurtEntity, flag); } else if (damager instanceof Firework && firedFireworks.containsKey(damager)) { Player shooter = firedFireworks.get(damager); @@ -101,7 +100,7 @@ public class PVPListener extends FlagListener { private void processDamage(Cancellable e, Entity damager, Player shooter, Entity hurtEntity, Flag flag) { // Allow self damage - if (hurtEntity.equals(shooter)) { + if (hurtEntity.equals(shooter) || shooter == null) { return; } User user = User.getInstance(shooter); @@ -116,9 +115,13 @@ public class PVPListener extends FlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onFishing(PlayerFishEvent e) { - if (e.getCaught() instanceof Player && getPlugin().getIWM().inWorld(e.getCaught().getLocation())) { + if (e.getCaught() instanceof Player c && getPlugin().getIWM().inWorld(c.getLocation())) { // Allow self-inflicted damage or NPC damage - if (e.getCaught().equals(e.getPlayer()) || e.getCaught().hasMetadata("NPC")) { + if (c.equals(e.getPlayer()) || c.hasMetadata("NPC")) { + return; + } + // Is PVP allowed here? + if (this.PVPAllowed(c.getLocation())) { return; } // Is PVP allowed here? @@ -126,12 +129,12 @@ public class PVPListener extends FlagListener { return; } // Protect visitors - if (protectedVisitor((Player)e.getCaught())) { + if (protectedVisitor(c)) { User.getInstance(e.getPlayer()).notify(Flags.INVINCIBLE_VISITORS.getHintReference()); e.setCancelled(true); - } else if (!checkIsland(e, e.getPlayer(), e.getCaught().getLocation(), getFlag(e.getCaught().getWorld()))) { + } else if (!checkIsland(e, e.getPlayer(), c.getLocation(), getFlag(c.getWorld()))) { e.getHook().remove(); - User.getInstance(e.getPlayer()).notify(getFlag(e.getCaught().getWorld()).getHintReference()); + User.getInstance(e.getPlayer()).notify(getFlag(c.getWorld()).getHintReference()); e.setCancelled(true); } } @@ -143,8 +146,8 @@ public class PVPListener extends FlagListener { */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onSplashPotionSplash(final PotionSplashEvent e) { - if (e.getEntity().getShooter() instanceof Player && getPlugin().getIWM().inWorld(e.getEntity().getWorld())) { - User user = User.getInstance((Player)e.getEntity().getShooter()); + if (e.getEntity().getShooter() instanceof Player p && p != null && getPlugin().getIWM().inWorld(e.getEntity().getWorld())) { + User user = User.getInstance(p); // Is PVP allowed here? if (this.PVPAllowed(e.getEntity().getLocation())) { return; @@ -256,9 +259,9 @@ public class PVPListener extends FlagListener { }); } - private void alertUser(Player player, Flag flag) { + private void alertUser(@NonNull Player player, Flag flag) { String message = "protection.flags." + flag.getID() + ".enabled"; - Objects.requireNonNull(User.getInstance(player)).sendMessage(message); + User.getInstance(player).sendMessage(message); player.playSound(player.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER,2F, 1F); } } diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/CreeperListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/CreeperListener.java index 814c982ed..cb03897de 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/CreeperListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/CreeperListener.java @@ -41,7 +41,7 @@ public class CreeperListener extends FlagListener { } // Check for griefing Creeper creeper = (Creeper)e.getEntity(); - if (!Flags.CREEPER_GRIEFING.isSetForWorld(e.getLocation().getWorld()) && creeper.getTarget() instanceof Player target) { + if (!Flags.CREEPER_GRIEFING.isSetForWorld(e.getLocation().getWorld()) && creeper.getTarget() instanceof Player target && target != null) { if (!getIslands().locationIsOnIsland(target, e.getLocation())) { User user = User.getInstance(target); user.notify("protection.protected", TextVariables.DESCRIPTION, user.getTranslation(Flags.CREEPER_GRIEFING.getHintReference())); diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/EnterExitListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/EnterExitListener.java index 4740b551f..02404a7bc 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/EnterExitListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/EnterExitListener.java @@ -105,14 +105,12 @@ public class EnterExitListener extends FlagListener { // Send message if island is owned by someone if (island.isOwned()) { // Leave messages are always specific to this world - + String islandMessage = user.getTranslation(island.getWorld(), ISLAND_MESSAGE, TextVariables.NAME, getPlugin().getPlayers().getName(island.getOwner())); // Send specific message if the player is member of this island if (island.getMemberSet().contains(user.getUniqueId())) { - user.notify(island.getWorld(), "protection.flags.ENTER_EXIT_MESSAGES.now-leaving-your-island", TextVariables.NAME, (island.getName() != null) ? island.getName() : - user.getTranslation(island.getWorld(), ISLAND_MESSAGE, TextVariables.NAME, getPlugin().getPlayers().getName(island.getOwner()))); + user.notify(island.getWorld(), "protection.flags.ENTER_EXIT_MESSAGES.now-leaving-your-island", TextVariables.NAME, (island.getName() != null) ? island.getName() : islandMessage); } else { - user.notify(island.getWorld(), "protection.flags.ENTER_EXIT_MESSAGES.now-leaving", TextVariables.NAME, (island.getName() != null) ? island.getName() : - user.getTranslation(island.getWorld(), ISLAND_MESSAGE, TextVariables.NAME, getPlugin().getPlayers().getName(island.getOwner()))); + user.notify(island.getWorld(), "protection.flags.ENTER_EXIT_MESSAGES.now-leaving", TextVariables.NAME, (island.getName() != null) ? island.getName() : islandMessage); } } // Send message if island is unowned, but has a name @@ -132,17 +130,15 @@ public class EnterExitListener extends FlagListener { if (!Flags.ENTER_EXIT_MESSAGES.isSetForWorld(island.getWorld())) { return; } - // Send message if island is owned by someone if (island.isOwned()) { // Enter messages are always specific to this world + String islandMessage = user.getTranslation(island.getWorld(), ISLAND_MESSAGE, TextVariables.NAME, getPlugin().getPlayers().getName(island.getOwner())); // Send specific message if the player is member of this island if (island.getMemberSet().contains(user.getUniqueId())) { - user.notify(island.getWorld(), "protection.flags.ENTER_EXIT_MESSAGES.now-entering-your-island", TextVariables.NAME, (island.getName() != null) ? island.getName() : - user.getTranslation(island.getWorld(), ISLAND_MESSAGE, TextVariables.NAME, getPlugin().getPlayers().getName(island.getOwner()))); + user.notify(island.getWorld(), "protection.flags.ENTER_EXIT_MESSAGES.now-entering-your-island", TextVariables.NAME, (island.getName() != null) ? island.getName() : islandMessage); } else { - user.notify(island.getWorld(), "protection.flags.ENTER_EXIT_MESSAGES.now-entering", TextVariables.NAME, (island.getName() != null) ? island.getName() : - user.getTranslation(island.getWorld(), ISLAND_MESSAGE, TextVariables.NAME, getPlugin().getPlayers().getName(island.getOwner()))); + user.notify(island.getWorld(), "protection.flags.ENTER_EXIT_MESSAGES.now-entering", TextVariables.NAME, (island.getName() != null) ? island.getName() : islandMessage); } } // Send message if island is unowned, but has a name diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/InvincibleVisitorsListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/InvincibleVisitorsListener.java index d8890723a..140eceecd 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/InvincibleVisitorsListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/InvincibleVisitorsListener.java @@ -2,6 +2,7 @@ package world.bentobox.bentobox.listeners.flags.worldsettings; import java.util.Arrays; import java.util.Comparator; +import java.util.Objects; import org.bukkit.Material; import org.bukkit.Sound; @@ -39,7 +40,8 @@ public class InvincibleVisitorsListener extends FlagListener implements ClickHan user.sendMessage("general.errors.wrong-world"); return true; } - String reqPerm = getIWM().getPermissionPrefix(Util.getWorld(user.getWorld())) + "admin.settings.INVINCIBLE_VISITORS"; + World w = Objects.requireNonNull(Util.getWorld(user.getWorld())); + String reqPerm = getIWM().getPermissionPrefix(w) + "admin.settings.INVINCIBLE_VISITORS"; if (!user.hasPermission(reqPerm)) { user.sendMessage("general.errors.no-permission", "[permission]", reqPerm); user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_METAL_HIT, 1F, 1F); diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/IslandRespawnListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/IslandRespawnListener.java index 0a8d411d7..8a0c32618 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/IslandRespawnListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/IslandRespawnListener.java @@ -32,7 +32,7 @@ public class IslandRespawnListener extends FlagListener { @EventHandler(priority = EventPriority.LOW) public void onPlayerDeath(PlayerDeathEvent e) { World world = Util.getWorld(e.getEntity().getWorld()); - if (!getIWM().inWorld(world)) { + if (world == null || !getIWM().inWorld(world)) { return; // not in the island world } if (!Flags.ISLAND_RESPAWN.isSetForWorld(world)) { diff --git a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java index b7853161d..707a9051e 100644 --- a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java @@ -1,9 +1,6 @@ package world.bentobox.bentobox.managers; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; @@ -97,8 +94,13 @@ public class AddonsManager { plugin.log("Registering " + parent.getDescription().getName()); // Get description in the addon.yml file + InputStream resource = parent.getResource("addon.yml"); + if (resource == null) { + plugin.logError("Failed to register addon: no addon.yml found"); + return; + } // Open a reader to the jar - try (BufferedReader reader = new BufferedReader(new InputStreamReader(parent.getResource("addon.yml")))) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) { setAddonFile(parent, addon); // Grab the description in the addon.yml file YamlConfiguration data = new YamlConfiguration(); @@ -266,7 +268,11 @@ public class AddonsManager { } void registerPermission(ConfigurationSection perms, String perm) throws InvalidAddonDescriptionException { - PermissionDefault pd = PermissionDefault.getByName(perms.getString(perm + DEFAULT)); + String name = perms.getString(perm + DEFAULT); + if (name == null) { + throw new InvalidAddonDescriptionException("Permission default is invalid in addon.yml: " + perm + DEFAULT); + } + PermissionDefault pd = PermissionDefault.getByName(name); if (pd == null) { throw new InvalidAddonDescriptionException("Permission default is invalid in addon.yml: " + perm + DEFAULT); } @@ -503,7 +509,7 @@ public class AddonsManager { @Nullable public Class getClassByName(@NonNull final String name) { try { - return classes.getOrDefault(name, loaders.values().stream().map(l -> l.findClass(name, false)).filter(Objects::nonNull).findFirst().orElse(null)); + return classes.getOrDefault(name, loaders.values().stream().filter(Objects::nonNull).map(l -> l.findClass(name, false)).filter(Objects::nonNull).findFirst().orElse(null)); } catch (Exception ignored) { // Ignored. } diff --git a/src/main/java/world/bentobox/bentobox/managers/BlueprintClipboardManager.java b/src/main/java/world/bentobox/bentobox/managers/BlueprintClipboardManager.java index 2c852c593..cc7ea3c16 100644 --- a/src/main/java/world/bentobox/bentobox/managers/BlueprintClipboardManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/BlueprintClipboardManager.java @@ -144,10 +144,12 @@ public class BlueprintClipboardManager { * @return - true if successful, false if error */ public boolean save(User user, String newName) { - clipboard.getBlueprint().setName(newName); - if (saveBlueprint(clipboard.getBlueprint())) { - user.sendMessage("general.success"); - return true; + if (clipboard.getBlueprint() != null) { + clipboard.getBlueprint().setName(newName); + if (saveBlueprint(clipboard.getBlueprint())) { + user.sendMessage("general.success"); + return true; + } } user.sendMessage("commands.admin.blueprint.could-not-save", "[message]", "Could not save temp blueprint file."); return false; @@ -192,6 +194,9 @@ public class BlueprintClipboardManager { if (!entry.isDirectory()) { unzipFiles(zipInputStream, filePath); } else { + if (!filePath.startsWith(blueprintFolder.getAbsolutePath())) { + throw new IOException("Entry is outside of the target directory"); + } Files.createDirectories(filePath); } @@ -202,6 +207,9 @@ public class BlueprintClipboardManager { } private void unzipFiles(final ZipInputStream zipInputStream, final Path unzipFilePath) throws IOException { + if (!unzipFilePath.toAbsolutePath().toString().startsWith(blueprintFolder.getAbsolutePath())) { + throw new IOException("Entry is outside of the target directory"); + } try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(unzipFilePath.toAbsolutePath().toString()))) { byte[] bytesIn = new byte[1024]; int read; diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java index 10a2f363a..72405a848 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -199,11 +200,11 @@ public class IslandWorldManager { * Get the settings for this world or sub-worlds (nether, end) * * @param world world - * @return world settings, or null if world is unknown + * @return world settings */ - @Nullable + @NonNull public WorldSettings getWorldSettings(@NonNull World world) { - return gameModes.containsKey(world) ? gameModes.get(world).getWorldSettings() : null; + return Objects.requireNonNull(gameModes.get(world), "Attempt to get WorldSettings for non-game world " + world.getName()).getWorldSettings(); } /** @@ -678,7 +679,7 @@ public class IslandWorldManager { * @return data folder file object or the plugin's data folder if none found */ public File getDataFolder(@NonNull World world) { - return getAddon(world).map(GameModeAddon::getDataFolder).orElseGet(() -> plugin.getDataFolder()); + return getAddon(world).map(GameModeAddon::getDataFolder).orElseGet(plugin::getDataFolder); } /** @@ -725,7 +726,7 @@ public class IslandWorldManager { public boolean isUseOwnGenerator(@NonNull World world) { return gameModes.containsKey(world) && gameModes.get(world).getWorldSettings().isUseOwnGenerator(); } - + /** * Check for blocks when searching for a new island. This is a safety net check that does a look * around the new island location (3x3x3 block check). If any non-air or non-water blocks are found diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java index b7c433759..7a0931f04 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java @@ -129,7 +129,7 @@ public class IslandsManager { * Used only for testing. Sets the database to a mock database. * @param handler - handler */ - public void setHandler(Database handler) { + public void setHandler(@NonNull Database handler) { this.handler = handler; } @@ -549,6 +549,7 @@ public class IslandsManager { islandMax = owner.getPermissionValue(plugin.getIWM().getPermissionPrefix(island.getWorld()) + "island.maxhomes", islandMax); } + // If the island maxHomes is just the same as the world default, then set to null island.setMaxHomes(islandMax == plugin.getIWM().getMaxHomes(island.getWorld()) ? null : islandMax); this.save(island); return islandMax; @@ -668,6 +669,7 @@ public class IslandsManager { * @param name - named home location. Blank means default. * @return Location of a safe teleport spot or {@code null} if one cannot be found or if the world is not an island world. */ + @Nullable public Location getSafeHomeLocation(@NonNull World world, @NonNull User user, String name) { // Check if the world is a gamemode world if (!plugin.getIWM().inWorld(world)) { @@ -745,6 +747,17 @@ public class IslandsManager { return null; } + /** + * Sets a default home location on user's island. Replaces previous default location. + * @param user - user + * @param location - location on island + * @return true if home location was set. False if this location is not on the island. + * @since 1.18.0 + */ + public boolean setHomeLocation(@NonNull User user, Location location) { + return setHomeLocation(user.getUniqueId(), location, ""); + } + /** * Sets a home location on user's island. Replaces previous location if the same name is used * @param user - user @@ -801,10 +814,10 @@ public class IslandsManager { * Get the home location for user in world * @param world - world * @param user - user - * @return home location + * @return home location or null if there is no home * @since 1.16.0 */ - @NonNull + @Nullable public Location getHomeLocation(@NonNull World world, @NonNull User user) { return getHomeLocation(world, user, ""); } @@ -813,10 +826,10 @@ public class IslandsManager { * Get the home location for player's UUID in world * @param world - world * @param uuid - uuid of player - * @return home location + * @return home location or null if there is no home * @since 1.16.0 */ - @NonNull + @Nullable public Location getHomeLocation(@NonNull World world, @NonNull UUID uuid) { return getHomeLocation(world, uuid, ""); } @@ -826,10 +839,10 @@ public class IslandsManager { * @param world - world * @param user - user * @param name - name of home, or blank for default - * @return home location + * @return home location or null if there is no home * @since 1.16.0 */ - @NonNull + @Nullable public Location getHomeLocation(@NonNull World world, @NonNull User user, String name) { return getHomeLocation(world, user.getUniqueId(), name); } @@ -839,13 +852,16 @@ public class IslandsManager { * @param world - world * @param uuid - uuid of player * @param name - name of home, or blank for default - * @return home location + * @return home location or null if there is no home * @since 1.16.0 */ - @NonNull + @Nullable public Location getHomeLocation(@NonNull World world, @NonNull UUID uuid, String name) { // Migrate from player homes to island homes Island island = this.getIsland(world, uuid); + if (island == null) { + return null; + } migrateHomes(world, uuid, name, island); return getHomeLocation(island, name); } @@ -880,7 +896,7 @@ public class IslandsManager { * @since 1.16.0 */ @NonNull - public Location getHomeLocation(@Nullable Island island) { + public Location getHomeLocation(@NonNull Island island) { return getHomeLocation(island, ""); } @@ -888,12 +904,12 @@ public class IslandsManager { * Get the named home location for this island * @param island - island * @param name - name of home, or blank for default - * @return home location + * @return home location or if there is none, then the island's center * @since 1.16.0 */ @NonNull - public Location getHomeLocation(@Nullable Island island, String name) { - return island == null ? null : island.getHome(name); + public Location getHomeLocation(@NonNull Island island, @NonNull String name) { + return Objects.requireNonNullElse(island.getHome(name), island.getCenter()); } /** @@ -903,8 +919,8 @@ public class IslandsManager { * @return true if successful, false if not * @since 1.16.0 */ - public boolean removeHomeLocation(@Nullable Island island, String name) { - return island != null && island.removeHome(name); + public boolean removeHomeLocation(@NonNull Island island, @NonNull String name) { + return island.removeHome(name); } /** @@ -914,8 +930,8 @@ public class IslandsManager { * @param newName - new name * @return true if successful, false if not */ - public boolean renameHomeLocation(@Nullable Island island, String oldName, String newName) { - return island != null && island.renameHome(oldName, newName); + public boolean renameHomeLocation(@NonNull Island island, @NonNull String oldName, @NonNull String newName) { + return island.renameHome(oldName, newName); } /** @@ -935,7 +951,7 @@ public class IslandsManager { * @param name - name being checked * @return true if it exists or not */ - public boolean isHomeLocation(@NonNull Island island, String name) { + public boolean isHomeLocation(@NonNull Island island, @NonNull String name) { return island.getHomes().containsKey(name.toLowerCase()); } @@ -945,7 +961,7 @@ public class IslandsManager { * @param name - name * @return number of homes after adding this one */ - public int getNumberOfHomesIfAdded(@NonNull Island island, String name) { + public int getNumberOfHomesIfAdded(@NonNull Island island, @NonNull String name) { return isHomeLocation(island, name) ? getHomeLocations(island).size() : getHomeLocations(island).size() + 1; } @@ -964,6 +980,7 @@ public class IslandsManager { * @param world - world * @return the spawnPoint or null if spawn does not exist */ + @Nullable public Location getSpawnPoint(@NonNull World world) { return spawn.containsKey(world) ? spawn.get(world).getSpawnPoint(world.getEnvironment()) : null; } @@ -1084,6 +1101,7 @@ public class IslandsManager { .island(island) .homeName(name) .thenRun(() -> teleported(world, user, name, newIsland, island)) + .ifFail(() -> goingHome.remove(user.getUniqueId())) .buildFuture() .thenAccept(result::complete); return; @@ -1098,9 +1116,10 @@ public class IslandsManager { teleported(world, user, name, newIsland, island); result.complete(true); } else { + // Remove from mid-teleport set + goingHome.remove(user.getUniqueId()); result.complete(false); } - }); }); return result; @@ -1118,6 +1137,8 @@ public class IslandsManager { if (!name.isEmpty()) { user.sendMessage("commands.island.go.teleported", TextVariables.NUMBER, name); } + // Remove from mid-teleport set + goingHome.remove(user.getUniqueId()); // If this is a new island, then run commands and do resets if (newIsland) { // Fire event @@ -1161,7 +1182,6 @@ public class IslandsManager { // Set the game mode user.setGameMode(plugin.getIWM().getDefaultGameMode(world)); - } // Remove from mid-teleport set goingHome.remove(user.getUniqueId()); @@ -1530,7 +1550,6 @@ public class IslandsManager { * @param uuid - the player's UUID */ public void setLeaveTeam(World world, UUID uuid) { - plugin.getPlayers().clearHomeLocations(world, uuid); removePlayer(world, uuid); } diff --git a/src/main/java/world/bentobox/bentobox/managers/PlayersManager.java b/src/main/java/world/bentobox/bentobox/managers/PlayersManager.java index 03609dd48..c43702250 100644 --- a/src/main/java/world/bentobox/bentobox/managers/PlayersManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/PlayersManager.java @@ -195,7 +195,9 @@ public class PlayersManager { * @param user - the player * @param location - the location * @param number - a number - 1 is default. Can be any number. + * @deprecated Use {@link IslandsManager#setHomeLocation(User, Location, String)} */ + @Deprecated(since="1.18.0", forRemoval=true) public void setHomeLocation(User user, Location location, int number) { setHomeLocation(user.getUniqueId(), location,number); } @@ -205,7 +207,9 @@ public class PlayersManager { * @param playerUUID - the player's UUID * @param location - the location * @param number - a number - 1 is default. Can be any number. + * @deprecated Use {@link IslandsManager#setHomeLocation(UUID, Location, String)} */ + @Deprecated(since="1.18.0", forRemoval=true) public void setHomeLocation(UUID playerUUID, Location location, int number) { addPlayer(playerUUID); playerCache.get(playerUUID).setHomeLocation(location,number); @@ -215,7 +219,9 @@ public class PlayersManager { * Set the default home location for player * @param playerUUID - the player's UUID * @param location - the location + * @deprecated Use {@link IslandsManager#setHomeLocation(UUID, Location)} */ + @Deprecated(since="1.18.0", forRemoval=true) public void setHomeLocation(UUID playerUUID, Location location) { setHomeLocation(playerUUID, location,1); } @@ -224,7 +230,9 @@ public class PlayersManager { * Clears any home locations for player * @param world - world * @param playerUUID - the player's UUID + * @deprecated Not used anymore. Home locations are stored on islands. */ + @Deprecated(since="1.18.0", forRemoval=true) public void clearHomeLocations(World world, UUID playerUUID) { addPlayer(playerUUID); playerCache.get(playerUUID).clearHomeLocations(world); @@ -237,7 +245,9 @@ public class PlayersManager { * @param user - the player * @param number - a number * @return Home location or null if none + * @deprecated Use {@link IslandsManager#getHomeLocation(World, User, String)} */ + @Deprecated(since="1.18.0", forRemoval=true) public Location getHomeLocation(World world, User user, int number) { addPlayer(user.getUniqueId()); return playerCache.get(user.getUniqueId()).getHomeLocation(world, number); @@ -250,7 +260,9 @@ public class PlayersManager { * @param playerUUID - the player's UUID * @param number - a number * @return Home location or null if none + * @deprecated Use {@link IslandsManager#getHomeLocation(World, UUID, String)} */ + @Deprecated(since="1.18.0", forRemoval=true) public Location getHomeLocation(World world, UUID playerUUID, int number) { addPlayer(playerUUID); return playerCache.get(playerUUID).getHomeLocation(world, number); @@ -260,7 +272,9 @@ public class PlayersManager { * Gets the default home location for player * @param playerUUID - the player's UUID * @return Home location or null if none + * @deprecated Use {@link IslandsManager#getHomeLocation(World, UUID)} */ + @Deprecated(since="1.18.0", forRemoval=true) public Location getHomeLocation(World world, UUID playerUUID) { addPlayer(playerUUID); return playerCache.get(playerUUID).getHomeLocation(world, 1); @@ -270,7 +284,9 @@ public class PlayersManager { * Provides all home locations for player * @param playerUUID - the player's UUID * @return List of home locations + * @deprecated Use {@link IslandsManager#getHomeLocations(world.bentobox.bentobox.database.objects.Island)} */ + @Deprecated(since="1.18.0", forRemoval=true) public Map getHomeLocations(World world, UUID playerUUID) { addPlayer(playerUUID); return playerCache.get(playerUUID).getHomeLocations(world); diff --git a/src/main/java/world/bentobox/bentobox/managers/island/DefaultNewIslandLocationStrategy.java b/src/main/java/world/bentobox/bentobox/managers/island/DefaultNewIslandLocationStrategy.java index 532699419..26593d042 100644 --- a/src/main/java/world/bentobox/bentobox/managers/island/DefaultNewIslandLocationStrategy.java +++ b/src/main/java/world/bentobox/bentobox/managers/island/DefaultNewIslandLocationStrategy.java @@ -32,7 +32,7 @@ public class DefaultNewIslandLocationStrategy implements NewIslandLocationStrate ISLAND_FOUND, BLOCKS_IN_AREA, FREE } - protected BentoBox plugin = BentoBox.getInstance(); + protected final BentoBox plugin = BentoBox.getInstance(); @Override public Location getNextLocation(World world) { diff --git a/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java b/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java index 80c2cd9bf..06da94064 100644 --- a/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java +++ b/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java @@ -224,7 +224,7 @@ public class NewIsland { private void postCreationTask(Island oldIsland) { // Set initial spawn point if one exists if (island.getSpawnPoint(Environment.NORMAL) != null) { - plugin.getPlayers().setHomeLocation(user, island.getSpawnPoint(Environment.NORMAL), 1); + plugin.getIslands().setHomeLocation(user, island.getSpawnPoint(Environment.NORMAL)); } // Stop the player from falling or moving if they are if (user.isOnline()) { @@ -252,10 +252,8 @@ public class NewIsland { * @param loc - the new island location */ private void cleanUpUser(Location loc) { - // Clear any old home locations (they should be clear, but just in case) - plugin.getPlayers().clearHomeLocations(world, user.getUniqueId()); // Set home location - plugin.getPlayers().setHomeLocation(user, new Location(loc.getWorld(), loc.getX() + 0.5D, loc.getY(), loc.getZ() + 0.5D), 1); + plugin.getIslands().setHomeLocation(user, new Location(loc.getWorld(), loc.getX() + 0.5D, loc.getY(), loc.getZ() + 0.5D)); // Reset deaths if (plugin.getIWM().isDeathsResetOnNewIsland(world)) { plugin.getPlayers().setDeaths(world, user.getUniqueId(), 0); diff --git a/src/main/java/world/bentobox/bentobox/panels/settings/WorldDefaultSettingsTab.java b/src/main/java/world/bentobox/bentobox/panels/settings/WorldDefaultSettingsTab.java index 68b3ed5d1..b41f651b6 100644 --- a/src/main/java/world/bentobox/bentobox/panels/settings/WorldDefaultSettingsTab.java +++ b/src/main/java/world/bentobox/bentobox/panels/settings/WorldDefaultSettingsTab.java @@ -7,6 +7,7 @@ import java.util.stream.Collectors; import org.bukkit.Material; import org.bukkit.World; +import org.eclipse.jdt.annotation.NonNull; import world.bentobox.bentobox.api.flags.Flag.Type; import world.bentobox.bentobox.api.flags.clicklisteners.WorldToggleClick; import world.bentobox.bentobox.api.localization.TextVariables; @@ -68,7 +69,7 @@ public class WorldDefaultSettingsTab extends SettingsTab implements Tab { * @return list of all the panel items for this flag type */ @Override - public List getPanelItems() { + public @NonNull List getPanelItems() { // Different description and click handlers return getFlags().stream().map(f -> { PanelItem i = f.toPanelItem(plugin, user, null, false); diff --git a/src/main/java/world/bentobox/bentobox/util/IslandInfo.java b/src/main/java/world/bentobox/bentobox/util/IslandInfo.java index 99886efd0..e1b809bc0 100644 --- a/src/main/java/world/bentobox/bentobox/util/IslandInfo.java +++ b/src/main/java/world/bentobox/bentobox/util/IslandInfo.java @@ -28,7 +28,7 @@ public class IslandInfo { /** - * @param plugin + * Get island Info * @param island Island to show info */ public IslandInfo(Island island) { @@ -44,11 +44,11 @@ public class IslandInfo { */ public void showAdminInfo(User user) { user.sendMessage("commands.admin.info.title"); - user.sendMessage("commands.admin.info.island-uuid", "[uuid]", island.getUniqueId()); + user.sendMessage("commands.admin.info.island-uuid", TextVariables.UUID, island.getUniqueId()); if (owner == null) { user.sendMessage("commands.admin.info.unowned"); } else { - user.sendMessage("commands.admin.info.owner", "[owner]", plugin.getPlayers().getName(owner), "[uuid]", owner.toString()); + user.sendMessage("commands.admin.info.owner", "[owner]", plugin.getPlayers().getName(owner), TextVariables.UUID, owner.toString()); // Fixes #getLastPlayed() returning 0 when it is the owner's first connection. long lastPlayed = (Bukkit.getOfflinePlayer(owner).getLastPlayed() != 0) ? @@ -75,7 +75,7 @@ public class IslandInfo { user.sendMessage("commands.admin.info.island-coords", "[xz1]", Util.xyz(new Vector(island.getMinX(), 0, island.getMinZ())), "[xz2]", Util.xyz(new Vector(island.getMaxX(), 0, island.getMaxZ()))); user.sendMessage("commands.admin.info.protection-range", "[range]", String.valueOf(island.getProtectionRange())); user.sendMessage("commands.admin.info.max-protection-range", "[range]", String.valueOf(island.getMaxEverProtectionRange())); - user.sendMessage("commands.admin.info.protection-coords", "[xz1]", Util.xyz(new Vector(island.getMinProtectedX(), 0, island.getMinProtectedZ())), "[xz2]", Util.xyz(new Vector(island.getMaxProtectedX(), 0, island.getMaxProtectedZ()))); + user.sendMessage("commands.admin.info.protection-coords", "[xz1]", Util.xyz(new Vector(island.getMinProtectedX(), 0, island.getMinProtectedZ())), "[xz2]", Util.xyz(new Vector(island.getMaxProtectedX() - 1, 0, island.getMaxProtectedZ() - 1))); if (island.isSpawn()) { user.sendMessage("commands.admin.info.is-spawn"); } @@ -99,7 +99,7 @@ public class IslandInfo { if (owner == null) { user.sendMessage("commands.admin.info.unowned"); } else { - user.sendMessage("commands.admin.info.owner", "[owner]", plugin.getPlayers().getName(owner)); + user.sendMessage("commands.admin.info.owner", "[owner]", plugin.getPlayers().getName(owner), TextVariables.UUID, owner.toString()); user.sendMessage("commands.admin.info.deaths", "[number]", String.valueOf(plugin.getPlayers().getDeaths(world, owner))); String resets = String.valueOf(plugin.getPlayers().getResets(world, owner)); String total = plugin.getIWM().getResetLimit(world) < 0 ? "Unlimited" : String.valueOf(plugin.getIWM().getResetLimit(world)); @@ -110,7 +110,7 @@ public class IslandInfo { Vector location = island.getProtectionCenter().toVector(); user.sendMessage("commands.admin.info.island-center", TextVariables.XYZ, Util.xyz(location)); user.sendMessage("commands.admin.info.protection-range", "[range]", String.valueOf(island.getProtectionRange())); - user.sendMessage("commands.admin.info.protection-coords", "[xz1]", Util.xyz(new Vector(island.getMinProtectedX(), 0, island.getMinProtectedZ())), "[xz2]", Util.xyz(new Vector(island.getMaxProtectedX(), 0, island.getMaxProtectedZ()))); + user.sendMessage("commands.admin.info.protection-coords", "[xz1]", Util.xyz(new Vector(island.getMinProtectedX(), 0, island.getMinProtectedZ())), "[xz2]", Util.xyz(new Vector(island.getMaxProtectedX() - 1, 0, island.getMaxProtectedZ() - 1))); if (island.isSpawn()) { user.sendMessage("commands.admin.info.is-spawn"); } diff --git a/src/main/java/world/bentobox/bentobox/util/MyBiomeGrid.java b/src/main/java/world/bentobox/bentobox/util/MyBiomeGrid.java index 848b4088d..56d17a8ce 100644 --- a/src/main/java/world/bentobox/bentobox/util/MyBiomeGrid.java +++ b/src/main/java/world/bentobox/bentobox/util/MyBiomeGrid.java @@ -7,6 +7,7 @@ import org.bukkit.World.Environment; import org.bukkit.block.Biome; import org.bukkit.generator.ChunkGenerator.BiomeGrid; import org.bukkit.util.Vector; +import org.eclipse.jdt.annotation.NonNull; /** * A biome grid for generators @@ -37,19 +38,19 @@ public class MyBiomeGrid implements BiomeGrid { } @Override - public Biome getBiome(int x, int z) { + public @NonNull Biome getBiome(int x, int z) { return map.getOrDefault(new Vector(x,0,z), defaultBiome); } @Override - public void setBiome(int x, int z, Biome bio) { + public void setBiome(int x, int z, @NonNull Biome bio) { map.put(new Vector(x,0,z), bio); } @Override - public Biome getBiome(int x, int y, int z) { + public @NonNull Biome getBiome(int x, int y, int z) { return map.getOrDefault(new Vector(x,y,z), defaultBiome); } @Override - public void setBiome(int x, int y, int z, Biome bio) { + public void setBiome(int x, int y, int z, @NonNull Biome bio) { map.put(new Vector(x, y, z), bio); } diff --git a/src/main/java/world/bentobox/bentobox/util/teleport/SafeSpotTeleport.java b/src/main/java/world/bentobox/bentobox/util/teleport/SafeSpotTeleport.java index 9879cb469..fedad9a52 100644 --- a/src/main/java/world/bentobox/bentobox/util/teleport/SafeSpotTeleport.java +++ b/src/main/java/world/bentobox/bentobox/util/teleport/SafeSpotTeleport.java @@ -49,6 +49,7 @@ public class SafeSpotTeleport { private final BentoBox plugin; private List> chunksToScan; private final Runnable runnable; + private final Runnable failRunnable; private final CompletableFuture result; private final String homeName; private final int maxHeight; @@ -65,6 +66,7 @@ public class SafeSpotTeleport { this.homeNumber = builder.getHomeNumber(); this.homeName = builder.getHomeName(); this.runnable = builder.getRunnable(); + this.failRunnable = builder.getFailRunnable(); this.result = builder.getResult(); this.maxHeight = location.getWorld().getMaxHeight() - 20; // Try to go @@ -151,9 +153,15 @@ public class SafeSpotTeleport { makeAndTelport(Material.COBBLESTONE); } } + if (failRunnable != null) { + Bukkit.getScheduler().runTask(plugin, failRunnable); + } result.complete(false); }); } else { + if (failRunnable != null) { + Bukkit.getScheduler().runTask(plugin, failRunnable); + } result.complete(false); } } @@ -300,6 +308,7 @@ public class SafeSpotTeleport { private String failureMessage = ""; private Location location; private Runnable runnable; + private Runnable failRunnable; private final CompletableFuture result = new CompletableFuture<>(); public Builder(BentoBox plugin) { @@ -423,6 +432,16 @@ public class SafeSpotTeleport { return this; } + /** + * The task to run if the player is not safely teleported + * @param runnable - task + * @return Builder + * @since 1.18.0 + */ + public Builder ifFail(Runnable rannable) { + this.failRunnable = runnable; + return this; + } /** * @return the plugin */ @@ -487,6 +506,13 @@ public class SafeSpotTeleport { return result; } + /** + * @return the failRunnable + */ + public Runnable getFailRunnable() { + return failRunnable; + } + } } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommandTest.java index c2bbb65db..eafab8ab5 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommandTest.java @@ -2,7 +2,10 @@ package world.bentobox.bentobox.api.commands.admin; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Arrays; @@ -101,15 +104,15 @@ public class AdminDeleteCommandTest { // Player has island to begin with im = mock(IslandsManager.class); - when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(true); - when(im.hasIsland(Mockito.any(), Mockito.any(User.class))).thenReturn(true); - when(im.isOwner(Mockito.any(),Mockito.any())).thenReturn(true); - when(im.getOwner(Mockito.any(),Mockito.any())).thenReturn(uuid); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(true); + when(im.hasIsland(any(), any(User.class))).thenReturn(true); + when(im.isOwner(any(),any())).thenReturn(true); + when(im.getOwner(any(),any())).thenReturn(uuid); when(plugin.getIslands()).thenReturn(im); // Has team pm = mock(PlayersManager.class); - when(im.inTeam(Mockito.any(), Mockito.eq(uuid))).thenReturn(true); + when(im.inTeam(any(), eq(uuid))).thenReturn(true); when(plugin.getPlayers()).thenReturn(pm); @@ -118,11 +121,11 @@ public class AdminDeleteCommandTest { PowerMockito.mockStatic(Bukkit.class); when(Bukkit.getScheduler()).thenReturn(sch); BukkitTask task = mock(BukkitTask.class); - when(sch.runTaskLater(Mockito.any(), Mockito.any(Runnable.class), Mockito.any(Long.class))).thenReturn(task); + when(sch.runTaskLater(any(), any(Runnable.class), any(Long.class))).thenReturn(task); // Locales LocalesManager lm = mock(LocalesManager.class); - when(lm.get(Mockito.any(), Mockito.any())).thenReturn("mock translation"); + when(lm.get(any(), any())).thenReturn("mock translation"); when(plugin.getLocalesManager()).thenReturn(lm); } @@ -149,9 +152,9 @@ public class AdminDeleteCommandTest { public void testExecuteUnknownPlayer() { AdminDeleteCommand itl = new AdminDeleteCommand(ac); String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(null); + when(pm.getUUID(any())).thenReturn(null); assertFalse(itl.canExecute(user, itl.getLabel(), Arrays.asList(name))); - Mockito.verify(user).sendMessage("general.errors.unknown-player", "[name]", name[0]); + verify(user).sendMessage("general.errors.unknown-player", "[name]", name[0]); } /** @@ -161,10 +164,10 @@ public class AdminDeleteCommandTest { public void testExecutePlayerNoIsland() { AdminDeleteCommand itl = new AdminDeleteCommand(ac); String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(notUUID); - when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(false); + when(pm.getUUID(any())).thenReturn(notUUID); + when(im.getOwner(any(), any())).thenReturn(null); assertFalse(itl.canExecute(user, itl.getLabel(), Arrays.asList(name))); - Mockito.verify(user).sendMessage(Mockito.eq("general.errors.player-has-no-island")); + verify(user).sendMessage(eq("general.errors.player-has-no-island")); } /** @@ -172,13 +175,13 @@ public class AdminDeleteCommandTest { */ @Test public void testExecuteOwner() { - when(im.inTeam(Mockito.any(),Mockito.any())).thenReturn(true); - when(im.getOwner(Mockito.any(), Mockito.any())).thenReturn(notUUID); + when(im.inTeam(any(),any())).thenReturn(true); + when(im.getOwner(any(), any())).thenReturn(notUUID); String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(notUUID); + when(pm.getUUID(any())).thenReturn(notUUID); AdminDeleteCommand itl = new AdminDeleteCommand(ac); assertFalse(itl.canExecute(user, itl.getLabel(), Arrays.asList(name))); - Mockito.verify(user).sendMessage("commands.admin.delete.cannot-delete-owner"); + verify(user).sendMessage("commands.admin.delete.cannot-delete-owner"); } /** @@ -186,15 +189,15 @@ public class AdminDeleteCommandTest { */ @Test public void testcanExecuteSuccessUUID() { - when(im.inTeam(Mockito.any(), Mockito.any())).thenReturn(false); - when(im.getOwner(Mockito.any(), Mockito.any())).thenReturn(uuid); + when(im.inTeam(any(), any())).thenReturn(false); + when(im.getOwner(any(), any())).thenReturn(uuid); Island is = mock(Island.class); Location loc = mock(Location.class); when(loc.toVector()).thenReturn(new Vector(123,123,432)); when(is.getCenter()).thenReturn(loc); - when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(is); + when(im.getIsland(any(), any(UUID.class))).thenReturn(is); // No such name - when(pm.getUUID(Mockito.any())).thenReturn(null); + when(pm.getUUID(any())).thenReturn(null); AdminDeleteCommand itl = new AdminDeleteCommand(ac); // Success because it's a valid UUID @@ -205,15 +208,15 @@ public class AdminDeleteCommandTest { */ @Test public void testExecuteFailUUID() { - when(im.inTeam(Mockito.any(), Mockito.any())).thenReturn(false); - when(im.getOwner(Mockito.any(), Mockito.any())).thenReturn(uuid); + when(im.inTeam(any(), any())).thenReturn(false); + when(im.getOwner(any(), any())).thenReturn(uuid); Island is = mock(Island.class); Location loc = mock(Location.class); when(loc.toVector()).thenReturn(new Vector(123,123,432)); when(is.getCenter()).thenReturn(loc); - when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(is); + when(im.getIsland(any(), any(UUID.class))).thenReturn(is); // No such name - when(pm.getUUID(Mockito.any())).thenReturn(null); + when(pm.getUUID(any())).thenReturn(null); AdminDeleteCommand itl = new AdminDeleteCommand(ac); // Fail because it's not a UUID @@ -225,21 +228,21 @@ public class AdminDeleteCommandTest { */ @Test public void testCanExecuteSuccess() { - when(im.inTeam(Mockito.any(), Mockito.any())).thenReturn(false); - when(im.getOwner(Mockito.any(), Mockito.any())).thenReturn(uuid); + when(im.inTeam(any(), any())).thenReturn(false); + when(im.getOwner(any(), any())).thenReturn(uuid); Island is = mock(Island.class); Location loc = mock(Location.class); when(loc.toVector()).thenReturn(new Vector(123,123,432)); when(is.getCenter()).thenReturn(loc); - when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(is); + when(im.getIsland(any(), any(UUID.class))).thenReturn(is); String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(notUUID); + when(pm.getUUID(any())).thenReturn(notUUID); AdminDeleteCommand itl = new AdminDeleteCommand(ac); assertTrue(itl.canExecute(user, itl.getLabel(), Arrays.asList(name))); // Confirm itl.execute(user, itl.getLabel(), Arrays.asList(name)); - Mockito.verify(user).sendMessage("commands.confirmation.confirm", "[seconds]", "0"); + verify(user).sendMessage("commands.confirmation.confirm", "[seconds]", "0"); } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminInfoCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminInfoCommandTest.java index 4cf7dad10..6aeb4f8c1 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminInfoCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminInfoCommandTest.java @@ -208,7 +208,7 @@ public class AdminInfoCommandTest { verify(user).sendMessage("commands.admin.info.island-coords", "[xz1]", "0,0,0", "[xz2]", "0,0,0"); verify(user).sendMessage("commands.admin.info.protection-range", "[range]", "100"); verify(user).sendMessage("commands.admin.info.max-protection-range", "[range]", "100"); - verify(user).sendMessage("commands.admin.info.protection-coords", "[xz1]", "0,0,0", "[xz2]", "0,0,0"); + verify(user).sendMessage("commands.admin.info.protection-coords", "[xz1]", "0,0,0", "[xz2]", "-1,0,-1"); } /** @@ -230,7 +230,7 @@ public class AdminInfoCommandTest { verify(user).sendMessage("commands.admin.info.island-coords", "[xz1]", "0,0,0", "[xz2]", "0,0,0"); verify(user).sendMessage("commands.admin.info.protection-range", "[range]", "100"); verify(user).sendMessage("commands.admin.info.max-protection-range", "[range]", "100"); - verify(user).sendMessage("commands.admin.info.protection-coords", "[xz1]", "0,0,0", "[xz2]", "0,0,0"); + verify(user).sendMessage("commands.admin.info.protection-coords", "[xz1]", "0,0,0", "[xz2]", "-1,0,-1"); } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommandTest.java index 1457140d2..71960c644 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommandTest.java @@ -164,6 +164,11 @@ public class AdminTeleportCommandTest { // Return an island for spawn checking when(im.getIsland(any(), any(UUID.class))).thenReturn(island); + + when(island.getCenter()).thenReturn(location); + when(location.clone()).thenReturn(location); + when(location.toVector()).thenReturn(new Vector(0,0,0)); + when(island.getProtectionCenter()).thenReturn(location); // Util PowerMockito.mockStatic(Util.class, Mockito.RETURNS_MOCKS); when(Util.getUUID(anyString())).thenCallRealMethod(); diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommandTest.java index 15d1ff897..66fe237f3 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommandTest.java @@ -231,9 +231,6 @@ public class AdminUnregisterCommandTest { verify(im).removePlayer(any(), eq(uuid1)); verify(im).removePlayer(any(), eq(uuid2)); verify(im).removePlayer(any(), eq(uuid3)); - verify(pm).clearHomeLocations(any(), eq(uuid1)); - verify(pm).clearHomeLocations(any(), eq(uuid2)); - verify(pm).clearHomeLocations(any(), eq(uuid3)); verify(im, never()).removePlayer(any(), eq(uuid4)); } } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamDisbandCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamDisbandCommandTest.java index 8efaa603a..d0da960d7 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamDisbandCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamDisbandCommandTest.java @@ -235,7 +235,7 @@ public class AdminTeamDisbandCommandTest { verify(user).sendMessage("commands.admin.team.disband.success", TextVariables.NAME, name[0]); verify(p).sendMessage("commands.admin.team.disband.disbanded"); verify(p2).sendMessage("commands.admin.team.disband.disbanded"); - // 2 * 2 + 1 - verify(pim, times(5)).callEvent(any()); + // 2 + 1 + verify(pim, times(3)).callEvent(any()); } } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamKickCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamKickCommandTest.java index aed70d1c0..b49839e55 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamKickCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamKickCommandTest.java @@ -192,7 +192,6 @@ public class AdminTeamKickCommandTest { verify(user).sendMessage(eq("commands.admin.team.kick.cannot-kick-owner")); verify(user).sendMessage("commands.admin.info.team-members-title"); verify(im, never()).removePlayer(eq(world), eq(notUUID)); - verify(pm, never()).clearHomeLocations(eq(world), eq(notUUID)); verify(user, never()).sendMessage(eq("commands.admin.team.kick.success"), anyString(), anyString(), anyString(), anyString()); verify(pim, never()).callEvent(any()); } @@ -215,10 +214,9 @@ public class AdminTeamKickCommandTest { assertTrue(itl.canExecute(user, itl.getLabel(), Collections.singletonList(name))); assertTrue(itl.execute(user, itl.getLabel(), Collections.singletonList(name))); verify(im).removePlayer(eq(world), eq(notUUID)); - verify(pm).clearHomeLocations(eq(world), eq(notUUID)); verify(user).sendMessage(eq("commands.admin.team.kick.success"), eq(TextVariables.NAME), eq(name), eq("[owner]"), anyString()); - // Offline so event will be called six time - verify(pim, times(6)).callEvent(any()); + // Offline so event will be called 4 times + verify(pim, times(4)).callEvent(any()); } } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandInfoCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandInfoCommandTest.java index db650ebb5..893df02bc 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandInfoCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandInfoCommandTest.java @@ -196,14 +196,14 @@ public class IslandInfoCommandTest { public void testExecuteUserStringListOfStringNoArgsSuccess() { assertTrue(iic.execute(user, "", Collections.emptyList())); verify(user).sendMessage("commands.admin.info.title"); - verify(user).sendMessage(eq("commands.admin.info.owner"), eq("[owner]"), eq(null)); + verify(user).sendMessage(eq("commands.admin.info.owner"), eq("[owner]"), eq(null), eq("[uuid]"), anyString()); verify(user).sendMessage("commands.admin.info.deaths", "[number]", "0"); verify(user).sendMessage("commands.admin.info.resets-left", "[number]", "0", "[total]", "0"); verify(user).sendMessage("commands.admin.info.team-members-title"); verify(user).sendMessage("commands.admin.info.team-owner-format", "[name]", null, "[rank]", "ranks.owner"); verify(user).sendMessage("commands.admin.info.island-center", "[xyz]", "0,0,0"); verify(user).sendMessage("commands.admin.info.protection-range", "[range]", "100"); - verify(user).sendMessage("commands.admin.info.protection-coords", "[xz1]", "0,0,0", "[xz2]", "0,0,0"); + verify(user).sendMessage("commands.admin.info.protection-coords", "[xz1]", "0,0,0", "[xz2]", "-1,0,-1"); } /** @@ -213,14 +213,14 @@ public class IslandInfoCommandTest { public void testExecuteUserStringListOfStringArgsSuccess() { assertTrue(iic.execute(user, "", Collections.singletonList("tastybento"))); verify(user).sendMessage("commands.admin.info.title"); - verify(user).sendMessage(eq("commands.admin.info.owner"), eq("[owner]"), eq(null)); + verify(user).sendMessage(eq("commands.admin.info.owner"), eq("[owner]"), eq(null), eq("[uuid]"), anyString()); verify(user).sendMessage("commands.admin.info.deaths", "[number]", "0"); verify(user).sendMessage("commands.admin.info.resets-left", "[number]", "0", "[total]", "0"); verify(user).sendMessage("commands.admin.info.team-members-title"); verify(user).sendMessage("commands.admin.info.team-owner-format", "[name]", null, "[rank]", "ranks.owner"); verify(user).sendMessage("commands.admin.info.island-center", "[xyz]", "0,0,0"); verify(user).sendMessage("commands.admin.info.protection-range", "[range]", "100"); - verify(user).sendMessage("commands.admin.info.protection-coords", "[xz1]", "0,0,0", "[xz2]", "0,0,0"); + verify(user).sendMessage("commands.admin.info.protection-coords", "[xz1]", "0,0,0", "[xz2]", "-1,0,-1"); } /** diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandResetCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandResetCommandTest.java index 5a7da91cc..29dd09124 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandResetCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandResetCommandTest.java @@ -257,8 +257,8 @@ public class IslandResetCommandTest { assertTrue(irc.execute(user, irc.getLabel(), Collections.emptyList())); // TODO Verify that panel was shown // verify(bpm).showPanel(any(), eq(user), eq(irc.getLabel())); - // Verify event (13 * 2 + 1) - verify(pim, times(27)).callEvent(any(IslandBaseEvent.class)); + // Verify event (13 * 2) + verify(pim, times(14)).callEvent(any(IslandBaseEvent.class)); // Verify messaging verify(user).sendMessage("commands.island.create.creating-island"); verify(user, never()).sendMessage(eq("commands.island.reset.kicked-from-island"), eq(TextVariables.GAMEMODE), anyString()); @@ -446,8 +446,8 @@ public class IslandResetCommandTest { // Reset command, no confirmation required assertTrue(irc.execute(user, irc.getLabel(), Collections.singletonList("custom"))); verify(user).sendMessage("commands.island.create.creating-island"); - // Verify event (13 * 2 + 1) - verify(pim, times(27)).callEvent(any(IslandBaseEvent.class)); + // Verify event (13 * 2) + verify(pim, times(14)).callEvent(any(IslandBaseEvent.class)); } } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandSethomeCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandSethomeCommandTest.java index ad9062fbe..41cdc0e3b 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandSethomeCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandSethomeCommandTest.java @@ -62,6 +62,8 @@ public class IslandSethomeCommandTest { private Island island; @Mock private IslandWorldManager iwm; + @Mock + private WorldSettings ws; /** * @throws java.lang.Exception @@ -128,6 +130,8 @@ public class IslandSethomeCommandTest { // Number of homes default when(iwm.getMaxHomes(any())).thenReturn(3); when(plugin.getIWM()).thenReturn(iwm); + // World settings + when(iwm.getWorldSettings(any(World.class))).thenReturn(ws); // Number of homes PowerMockito.mockStatic(Util.class); @@ -223,7 +227,7 @@ public class IslandSethomeCommandTest { */ @Test public void testExecuteUserStringListOfStringMultiHomeTooMany() { - when(island.getMaxHomes()).thenReturn(3); + when(im.getMaxHomes(island)).thenReturn(3); when(im.getNumberOfHomesIfAdded(eq(island), anyString())).thenReturn(4); IslandSethomeCommand isc = new IslandSethomeCommand(ic); assertFalse(isc.canExecute(user, "island", Collections.singletonList("13"))); diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommandTest.java index 0d24ad434..bc439fe80 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandUnbanCommandTest.java @@ -6,7 +6,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -248,39 +247,12 @@ public class IslandUnbanCommandTest { // Allow removing from ban list when(island.unban(any(), any())).thenReturn(true); - + assertTrue(iubc.canExecute(user, iubc.getLabel(), Collections.singletonList("bill"))); assertTrue(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill"))); verify(user).sendMessage("commands.island.unban.player-unbanned", TextVariables.NAME, targetUser.getName()); verify(targetUser).sendMessage("commands.island.unban.you-are-unbanned", TextVariables.NAME, user.getName()); } - /** - * Test method for {@link IslandUnbanCommand#execute(User, String, List)} - */ - @Test - public void testCancelledUnban() { - IslandUnbanCommand iubc = new IslandUnbanCommand(ic); - when(im.hasIsland(any(), eq(uuid))).thenReturn(true); - when(im.isOwner(any(), eq(uuid))).thenReturn(true); - UUID targetUUID = UUID.randomUUID(); - when(pm.getUUID(Mockito.anyString())).thenReturn(targetUUID); - PowerMockito.mockStatic(User.class); - User targetUser = mock(User.class); - when(targetUser.isOp()).thenReturn(false); - when(targetUser.isPlayer()).thenReturn(true); - when(targetUser.isOnline()).thenReturn(false); - when(User.getInstance(any(UUID.class))).thenReturn(targetUser); - // Mark as banned - when(island.isBanned(eq(targetUUID))).thenReturn(true); - - // Allow removing from ban list - when(island.unban(any(), any())).thenReturn(false); - - assertFalse(iubc.execute(user, iubc.getLabel(), Collections.singletonList("bill"))); - verify(user, never()).sendMessage("commands.island.unban.player-unbanned", TextVariables.NAME, targetUser.getName()); - verify(targetUser, never()).sendMessage("commands.island.unban.you-are-unbanned", "[owner]", user.getName()); - } - /** * Test method for {@link IslandUnbanCommand#tabComplete(User, String, List)} */ diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommandTest.java index f32814177..acd8c421c 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommandTest.java @@ -10,7 +10,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.times; import java.util.Collections; import java.util.HashMap; @@ -223,7 +222,7 @@ public class IslandTeamInviteAcceptCommandTest { assertTrue(c.canExecute(user, "accept", Collections.emptyList())); verify(user, never()).sendMessage("commands.island.team.invite.errors.you-already-are-in-team"); verify(user, never()).sendMessage("commands.island.team.invite.errors.invalid-invite"); - verify(pim, times(2)).callEvent(any()); + verify(pim).callEvent(any()); } /** @@ -250,7 +249,7 @@ public class IslandTeamInviteAcceptCommandTest { assertTrue(c.canExecute(user, "accept", Collections.emptyList())); verify(user, never()).sendMessage("commands.island.team.invite.errors.you-already-are-in-team"); verify(user, never()).sendMessage("commands.island.team.invite.errors.invalid-invite"); - verify(pim, times(2)).callEvent(any()); + verify(pim).callEvent(any()); } /** diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteCommandTest.java index 5e389fd4d..e935341a7 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteCommandTest.java @@ -10,7 +10,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.times; import java.util.Collections; import java.util.HashMap; @@ -296,7 +295,7 @@ public class IslandTeamInviteCommandTest { when(im.hasIsland(any(), eq(notUUID))).thenReturn(true); testCanExecuteSuccess(); assertTrue(itl.execute(user, itl.getLabel(), Collections.singletonList("target"))); - verify(pim, times(2)).callEvent(any(IslandBaseEvent.class)); + verify(pim).callEvent(any(IslandBaseEvent.class)); verify(user, never()).sendMessage(eq("commands.island.team.invite.removing-invite")); verify(ic).addInvite(eq(Invite.Type.TEAM), eq(uuid), eq(notUUID)); verify(user).sendMessage(eq("commands.island.team.invite.invitation-sent"), eq(TextVariables.NAME), eq("target")); @@ -313,7 +312,7 @@ public class IslandTeamInviteCommandTest { public void testExecuteSuccessTargetHasNoIsland() { testCanExecuteSuccess(); assertTrue(itl.execute(user, itl.getLabel(), Collections.singletonList("target"))); - verify(pim, times(2)).callEvent(any(IslandBaseEvent.class)); + verify(pim).callEvent(any(IslandBaseEvent.class)); verify(user, never()).sendMessage(eq("commands.island.team.invite.removing-invite")); verify(ic).addInvite(eq(Invite.Type.TEAM), eq(uuid), eq(notUUID)); verify(user).sendMessage(eq("commands.island.team.invite.invitation-sent"), eq(TextVariables.NAME), eq("target")); @@ -337,7 +336,7 @@ public class IslandTeamInviteCommandTest { when(invite.getType()).thenReturn(Type.TEAM); when(ic.getInvite(eq(notUUID))).thenReturn(invite); assertTrue(itl.execute(user, itl.getLabel(), Collections.singletonList("target"))); - verify(pim, times(2)).callEvent(any(IslandBaseEvent.class)); + verify(pim).callEvent(any(IslandBaseEvent.class)); verify(ic).removeInvite(eq(notUUID)); verify(user).sendMessage(eq("commands.island.team.invite.removing-invite")); } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommandTest.java new file mode 100644 index 000000000..c0b16321b --- /dev/null +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommandTest.java @@ -0,0 +1,279 @@ +package world.bentobox.bentobox.api.commands.island.team; + +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.plugin.PluginManager; +import org.bukkit.scheduler.BukkitScheduler; +import org.eclipse.jdt.annotation.Nullable; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.Settings; +import world.bentobox.bentobox.api.commands.CompositeCommand; +import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.managers.CommandsManager; +import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.bentobox.managers.IslandsManager; +import world.bentobox.bentobox.managers.PlayersManager; + +/** + * @author tastybento + * + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({Bukkit.class, BentoBox.class, User.class }) +public class IslandTeamSetownerCommandTest { + + @Mock + private CompositeCommand ic; + private UUID uuid; + @Mock + private User user; + @Mock + private Settings s; + @Mock + private IslandsManager im; + @Mock + private IslandWorldManager iwm; + @Mock + private Player player; + @Mock + private CompositeCommand subCommand; + @Mock + private PlayersManager pm; + @Mock + private World world; + private IslandTeamSetownerCommand its; + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + // Set up plugin + BentoBox plugin = mock(BentoBox.class); + Whitebox.setInternalState(BentoBox.class, "instance", plugin); + + // Command manager + CommandsManager cm = mock(CommandsManager.class); + when(plugin.getCommandsManager()).thenReturn(cm); + + // Settings + when(s.getResetCooldown()).thenReturn(0); + when(plugin.getSettings()).thenReturn(s); + + // Player + // Sometimes use Mockito.withSettings().verboseLogging() + when(user.isOp()).thenReturn(false); + uuid = UUID.randomUUID(); + when(user.getUniqueId()).thenReturn(uuid); + when(user.getPlayer()).thenReturn(player); + when(user.getName()).thenReturn("tastybento"); + + // Parent command has no aliases + ic = mock(CompositeCommand.class); + when(ic.getSubCommandAliases()).thenReturn(new HashMap<>()); + Optional optionalCommand = Optional.of(subCommand); + when(ic.getSubCommand(Mockito.anyString())).thenReturn(optionalCommand); + when(ic.getWorld()).thenReturn(world); + + // Player has island to begin with + when(im.hasIsland(any(), Mockito.any(UUID.class))).thenReturn(true); + when(im.isOwner(any(), any())).thenReturn(true); + when(plugin.getIslands()).thenReturn(im); + + // Has team + when(im.inTeam(any(), eq(uuid))).thenReturn(true); + when(plugin.getPlayers()).thenReturn(pm); + + // Server & Scheduler + BukkitScheduler sch = mock(BukkitScheduler.class); + PowerMockito.mockStatic(Bukkit.class); + when(Bukkit.getScheduler()).thenReturn(sch); + + // Island World Manager + when(plugin.getIWM()).thenReturn(iwm); + + // Plugin Manager + PluginManager pim = mock(PluginManager.class); + when(Bukkit.getPluginManager()).thenReturn(pim); + + // Island + Island island = mock(Island.class); + when(island.getUniqueId()).thenReturn("uniqueid"); + when(im.getIsland(any(), Mockito.any(User.class))).thenReturn(island); + + // Class under test + its = new IslandTeamSetownerCommand(ic); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#setup()}. + */ + @Test + public void testSetup() { + assertEquals("island.team.setowner", its.getPermission()); + assertTrue(its.isOnlyPlayer()); + assertEquals("commands.island.team.setowner.parameters", its.getParameters()); + assertEquals("commands.island.team.setowner.description", its.getDescription()); + + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfStringNullOwner() { + when(im.getOwner(any(), any())).thenReturn(null); + assertFalse(its.execute(user, "", Collections.emptyList())); + verify(user).sendMessage("general.errors.not-owner"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfStringNotInTeam() { + when(im.inTeam(any(), any())).thenReturn(false); + assertFalse(its.execute(user, "", Collections.emptyList())); + verify(user).sendMessage("general.errors.no-team"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfStringNotOwner() { + when(im.inTeam(any(), any())).thenReturn(true); + when(im.getOwner(any(), any())).thenReturn(UUID.randomUUID()); + assertFalse(its.execute(user, "", Collections.emptyList())); + verify(user).sendMessage("general.errors.not-owner"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfStringShowHelp() { + when(im.inTeam(any(), any())).thenReturn(true); + when(im.getOwner(any(), any())).thenReturn(uuid); + assertFalse(its.execute(user, "", Collections.emptyList())); + verify(user).sendMessage("commands.help.header","[label]", null); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfStringUnknownPlayer() { + when(im.inTeam(any(), any())).thenReturn(true); + when(im.getOwner(any(), any())).thenReturn(uuid); + when(pm.getUUID(anyString())).thenReturn(null); + assertFalse(its.execute(user, "", Collections.singletonList("tastybento"))); + verify(user).sendMessage("general.errors.unknown-player", TextVariables.NAME, "tastybento"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfStringSamePlayer() { + when(im.inTeam(any(), any())).thenReturn(true); + when(im.getOwner(any(), any())).thenReturn(uuid); + when(pm.getUUID(anyString())).thenReturn(uuid); + assertFalse(its.execute(user, "", Collections.singletonList("tastybento"))); + verify(user).sendMessage("commands.island.team.setowner.errors.cant-transfer-to-yourself"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfStringTargetNotInTeam() { + when(im.inTeam(any(), any())).thenReturn(true); + when(im.getOwner(any(), any())).thenReturn(uuid); + when(pm.getUUID(anyString())).thenReturn(UUID.randomUUID()); + when(im.getMembers(any(), any())).thenReturn(Collections.singleton(uuid)); + assertFalse(its.execute(user, "", Collections.singletonList("tastybento"))); + verify(user).sendMessage("commands.island.team.setowner.errors.target-is-not-member"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfStringSuccess() { + when(im.inTeam(any(), any())).thenReturn(true); + when(im.getOwner(any(), any())).thenReturn(uuid); + UUID target = UUID.randomUUID(); + when(pm.getUUID(anyString())).thenReturn(target); + when(im.getMembers(any(), any())).thenReturn(Collections.singleton(target)); + @Nullable + Island island = mock(Island.class); + when(im.getIsland(any(), any(User.class))).thenReturn(island); + + assertTrue(its.execute(user, "", Collections.singletonList("tastybento"))); + verify(im).setOwner(any(), eq(user), eq(target)); + verify(im).save(island); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testTabCompleteUserStringListOfString() { + assertTrue(its.tabComplete(user, "", Collections.emptyList()).get().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testTabCompleteUserStringListOfStringUnknown() { + assertTrue(its.tabComplete(user, "ta", Collections.emptyList()).get().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.island.team.IslandTeamSetownerCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testTabCompleteUserStringListOfStringMember() { + UUID target = UUID.randomUUID(); + when(pm.getName(any())).thenReturn("tastybento"); + when(im.getMembers(any(), any())).thenReturn(Collections.singleton(target)); + assertEquals("tastybento", its.tabComplete(user, "", Collections.emptyList()).get().get(0)); + } + +} diff --git a/src/test/java/world/bentobox/bentobox/api/events/island/IslandEventTest.java b/src/test/java/world/bentobox/bentobox/api/events/island/IslandEventTest.java index 13ae82e9c..d5add7b9e 100644 --- a/src/test/java/world/bentobox/bentobox/api/events/island/IslandEventTest.java +++ b/src/test/java/world/bentobox/bentobox/api/events/island/IslandEventTest.java @@ -168,7 +168,7 @@ public class IslandEventTest { } } - verify(pim, Mockito.times(Reason.values().length * 3)).callEvent(any()); + verify(pim, Mockito.times(Reason.values().length * 2)).callEvent(any()); } } diff --git a/src/test/java/world/bentobox/bentobox/api/flags/FlagTest.java b/src/test/java/world/bentobox/bentobox/api/flags/FlagTest.java index ef8db233c..a25c7d88c 100644 --- a/src/test/java/world/bentobox/bentobox/api/flags/FlagTest.java +++ b/src/test/java/world/bentobox/bentobox/api/flags/FlagTest.java @@ -86,7 +86,7 @@ public class FlagTest { GameModeAddon gma = mock(GameModeAddon.class); Optional opGma = Optional.of(gma ); when(iwm.getAddon(any())).thenReturn(opGma); - + when(iwm.inWorld(any(World.class))).thenReturn(true); worldFlags = new HashMap<>(); when(ws.getWorldFlags()).thenReturn(worldFlags); @@ -223,7 +223,7 @@ public class FlagTest { */ @Test public void testSetDefaultSettingWorldBooleanNullWorldSettings() { - when(iwm.getWorldSettings(any())).thenReturn(null); + when(iwm.inWorld(any(World.class))).thenReturn(false); f.setDefaultSetting(world, true); verify(plugin).logError("Attempt to set default world setting for unregistered world. Register flags in onEnable."); } diff --git a/src/test/java/world/bentobox/bentobox/api/user/UserTest.java b/src/test/java/world/bentobox/bentobox/api/user/UserTest.java index 16436000d..d8427d24e 100644 --- a/src/test/java/world/bentobox/bentobox/api/user/UserTest.java +++ b/src/test/java/world/bentobox/bentobox/api/user/UserTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -64,7 +63,8 @@ import world.bentobox.bentobox.managers.PlayersManager; @PrepareForTest({ BentoBox.class, Bukkit.class }) public class UserTest { - private static final String TEST_TRANSLATION = "mock translation [test]"; + private static final String TEST_TRANSLATION = "mock &a translation &b [test]"; + private static final String TEST_TRANSLATION_WITH_COLOR = "mock §atranslation §b[test]"; @Mock private Player player; @Mock @@ -164,7 +164,6 @@ public class UserTest { // If the player has been removed from the cache, then code will ask server for player // Return null and check if instance is null will show that the player is not in the cache when(Bukkit.getPlayer(any(UUID.class))).thenReturn(null); - assertNull(User.getInstance(uuid).getPlayer()); verify(pm).removePlayer(player); } @@ -245,7 +244,7 @@ public class UserTest { @Test public void testHasPermission() { - // default behaviours + // default behaviors assertTrue(user.hasPermission("")); assertTrue(user.hasPermission(null)); @@ -278,12 +277,20 @@ public class UserTest { @Test public void testGetTranslation() { - assertEquals("mock translation [test]", user.getTranslation("a.reference")); + assertEquals(TEST_TRANSLATION_WITH_COLOR, user.getTranslation("a.reference")); + } + + /** + * Test for {@link User#getTranslationNoColor(String, String...)} + */ + @Test + public void testGetTranslationNoColor() { + assertEquals(TEST_TRANSLATION, user.getTranslationNoColor("a.reference")); } @Test public void testGetTranslationWithVariable() { - assertEquals("mock translation variable", user.getTranslation("a.reference", "[test]", "variable")); + assertEquals("mock §atranslation §bvariable", user.getTranslation("a.reference", "[test]", "variable")); } @Test @@ -308,7 +315,7 @@ public class UserTest { @Test public void testSendMessage() { user.sendMessage("a.reference"); - verify(player).sendMessage(eq(TEST_TRANSLATION)); + verify(player).sendMessage(TEST_TRANSLATION_WITH_COLOR); } @Test @@ -476,12 +483,6 @@ public class UserTest { assertTrue(user1.hashCode() == user2.hashCode()); } - @Test - public void testNullPlayer() { - User user = User.getInstance((Player)null); - assertNull(user); - } - /** * Test for {@link User#getPermissionValue(String, int)} */ diff --git a/src/test/java/world/bentobox/bentobox/database/objects/IslandTest.java b/src/test/java/world/bentobox/bentobox/database/objects/IslandTest.java new file mode 100644 index 000000000..edb9830e2 --- /dev/null +++ b/src/test/java/world/bentobox/bentobox/database/objects/IslandTest.java @@ -0,0 +1,1253 @@ +/** + * + */ +package world.bentobox.bentobox.database.objects; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.World.Environment; +import org.bukkit.block.Block; +import org.eclipse.jdt.annotation.NonNull; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.flags.Flag; +import world.bentobox.bentobox.api.flags.Flag.Type; +import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.metadata.MetaDataValue; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.lists.Flags; +import world.bentobox.bentobox.managers.FlagsManager; +import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.bentobox.managers.RanksManager; +import world.bentobox.bentobox.util.Pair; + +/** + * @author tastybento + * + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({Bukkit.class}) +public class IslandTest { + + private final UUID uuid = UUID.randomUUID(); + private final UUID m = UUID.randomUUID(); + private Island i; + @Mock + private @NonNull Location location; + @Mock + private BentoBox plugin; + @Mock + private IslandWorldManager iwm; + @Mock + private World world; + @Mock + private User user; + + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + // Set up plugin + Whitebox.setInternalState(BentoBox.class, "instance", plugin); + + // Max range + when(plugin.getIWM()).thenReturn(iwm); + when(iwm.getIslandDistance(any())).thenReturn(400); + + // Location + //when(location.getWorld()).thenReturn(world); + when(location.clone()).thenReturn(location); + when(world.getName()).thenReturn("bskyblock_world"); + + // User + when(user.getUniqueId()).thenReturn(uuid); + + // Bukkit + PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); + when(Bukkit.getOnlinePlayers()).thenReturn(Collections.emptyList()); + + FlagsManager fm = new FlagsManager(plugin); + // Flags + when(plugin.getFlagsManager()).thenReturn(fm); + + i = new Island(new Island(location, uuid , 100)); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#Island(org.bukkit.Location, java.util.UUID, int)}. + */ + @Test + public void testIslandLocationUUIDInt() { + assertEquals("Location{world=null,x=0.0,y=0.0,z=0.0,pitch=0.0,yaw=0.0}", i.getCenter().toString()); + assertEquals(uuid, i.getOwner()); + assertEquals(400, i.getRange()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#Island(world.bentobox.bentobox.database.objects.Island)}. + */ + @Test + public void testIslandIsland() { + assertEquals("Location{world=null,x=0.0,y=0.0,z=0.0,pitch=0.0,yaw=0.0}", i.getCenter().toString()); + assertEquals(uuid, i.getOwner()); + assertEquals(400, i.getRange()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#addMember(java.util.UUID)}. + */ + @Test + public void testAddMember() { + i.addMember(m); + assertTrue(i.getMemberSet().contains(m)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#ban(java.util.UUID, java.util.UUID)}. + */ + @Test + public void testBan() { + i.ban(uuid, m); + assertTrue(i.isBanned(m)); + assertFalse(i.isBanned(uuid)); + assertFalse(i.isBanned(UUID.randomUUID())); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getBanned()}. + */ + @Test + public void testGetBanned() { + assertTrue(i.getBanned().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#unban(java.util.UUID, java.util.UUID)}. + */ + @Test + public void testUnban() { + i.ban(uuid, m); + assertTrue(i.isBanned(m)); + i.unban(uuid, m); + assertFalse(i.isBanned(m)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getCenter()}. + */ + @Test + public void testGetCenter() { + assertEquals("Location{world=null,x=0.0,y=0.0,z=0.0,pitch=0.0,yaw=0.0}", i.getCenter().toString()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getCreatedDate()}. + */ + @Test + public void testGetCreatedDate() { + assertTrue(i.getCreatedDate() > 0); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getFlag(world.bentobox.bentobox.api.flags.Flag)}. + */ + @Test + public void testGetFlag() { + assertEquals(500, i.getFlag(Flags.BREAK_BLOCKS)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getFlags()}. + */ + @Test + public void testGetFlags() { + assertTrue(i.getFlags().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMembers()}. + */ + @Test + public void testGetMembers() { + assertEquals(1, i.getMembers().size()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMemberSet()}. + */ + @Test + public void testGetMemberSet() { + assertEquals(1, i.getMembers().size()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMemberSet(int)}. + */ + @Test + public void testGetMemberSetInt() { + assertFalse(i.getMemberSet(500).isEmpty()); + assertEquals(1, i.getMemberSet(500).size()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMemberSet(int, boolean)}. + */ + @Test + public void testGetMemberSetIntBoolean() { + assertFalse(i.getMemberSet(500, true).isEmpty()); + assertTrue(i.getMemberSet(500, false).isEmpty()); + assertFalse(i.getMemberSet(1000, true).isEmpty()); + assertFalse(i.getMemberSet(1000, false).isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMinProtectedX()}. + */ + @Test + public void testGetMinProtectedX() { + assertEquals(-100, i.getMinProtectedX()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMaxProtectedX()}. + */ + @Test + public void testGetMaxProtectedX() { + assertEquals(100, i.getMaxProtectedX()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMinProtectedZ()}. + */ + @Test + public void testGetMinProtectedZ() { + assertEquals(-100, i.getMinProtectedZ()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMaxProtectedZ()}. + */ + @Test + public void testGetMaxProtectedZ() { + assertEquals(100, i.getMaxProtectedZ()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMinX()}. + */ + @Test + public void testGetMinX() { + assertEquals(-400, i.getMinX()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMaxX()}. + */ + @Test + public void testGetMaxX() { + assertEquals(400, i.getMaxX()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMinZ()}. + */ + @Test + public void testGetMinZ() { + assertEquals(-400, i.getMinZ()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMaxZ()}. + */ + @Test + public void testGetMaxZ() { + assertEquals(400, i.getMaxZ()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getName()}. + */ + @Test + public void testGetName() { + assertNull(i.getName()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getOwner()}. + */ + @Test + public void testGetOwner() { + assertEquals(uuid, i.getOwner()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isOwned()}. + */ + @Test + public void testIsOwned() { + assertTrue(i.isOwned()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isUnowned()}. + */ + @Test + public void testIsUnowned() { + assertFalse(i.isUnowned()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getProtectionRange()}. + */ + @Test + public void testGetProtectionRange() { + assertEquals(100, i.getProtectionRange()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMaxEverProtectionRange()}. + */ + @Test + public void testGetMaxEverProtectionRange() { + assertEquals(100, i.getMaxEverProtectionRange()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setMaxEverProtectionRange(int)}. + */ + @Test + public void testSetMaxEverProtectionRange() { + i.setMaxEverProtectionRange(50); + assertEquals(100, i.getMaxEverProtectionRange()); + i.setMaxEverProtectionRange(150); + assertEquals(150, i.getMaxEverProtectionRange()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getPurgeProtected()}. + */ + @Test + public void testGetPurgeProtected() { + assertFalse(i.getPurgeProtected()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getRange()}. + */ + @Test + public void testGetRange() { + assertEquals(400, i.getRange()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getRank(world.bentobox.bentobox.api.user.User)}. + */ + @Test + public void testGetRankUser() { + assertEquals(RanksManager.OWNER_RANK, i.getRank(user)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getRank(java.util.UUID)}. + */ + @Test + public void testGetRankUUID() { + assertEquals(RanksManager.OWNER_RANK, i.getRank(uuid)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getUniqueId()}. + */ + @Test + public void testGetUniqueId() { + assertFalse(i.getUniqueId().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getUpdatedDate()}. + */ + @Test + public void testGetUpdatedDate() { + assertTrue(i.getUpdatedDate() > 0); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getWorld()}. + */ + @Test + public void testGetWorld() { + assertNull(i.getWorld()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getX()}. + */ + @Test + public void testGetX() { + assertEquals(0, i.getX()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getY()}. + */ + @Test + public void testGetY() { + assertEquals(0, i.getY()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getZ()}. + */ + @Test + public void testGetZ() { + assertEquals(0, i.getZ()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#inIslandSpace(int, int)}. + */ + @Test + public void testInIslandSpaceIntInt() { + assertTrue(i.inIslandSpace(0,0)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#inIslandSpace(org.bukkit.Location)}. + */ + @Test + public void testInIslandSpaceLocation() { + i.setWorld(world); + when(location.getWorld()).thenReturn(world); + assertTrue(i.inIslandSpace(location)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#inIslandSpace(world.bentobox.bentobox.util.Pair)}. + */ + @Test + public void testInIslandSpacePairOfIntegerInteger() { + assertTrue(i.inIslandSpace(new Pair(0,0))); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getBoundingBox()}. + */ + @Test + public void testGetBoundingBox() { + i.setWorld(world); + when(location.getWorld()).thenReturn(world); + assertNotNull(i.getBoundingBox()); + assertEquals("BoundingBox [minX=-400.0, minY=0.0, minZ=-400.0, maxX=400.0, maxY=0.0, maxZ=400.0]", i.getBoundingBox().toString()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getVisitors()}. + */ + @Test + public void testGetVisitors() { + assertTrue(i.getVisitors().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#hasVisitors()}. + */ + @Test + public void testHasVisitors() { + assertFalse(i.hasVisitors()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getPlayersOnIsland()}. + */ + @Test + public void testGetPlayersOnIsland() { + assertTrue(i.getPlayersOnIsland().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#hasPlayersOnIsland()}. + */ + @Test + public void testHasPlayersOnIsland() { + assertFalse(i.hasPlayersOnIsland()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isAllowed(world.bentobox.bentobox.api.flags.Flag)}. + */ + @Test + public void testIsAllowedFlag() { + assertFalse(i.isAllowed(Flags.PVP_OVERWORLD)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isAllowed(world.bentobox.bentobox.api.user.User, world.bentobox.bentobox.api.flags.Flag)}. + */ + @Test + public void testIsAllowedUserFlag() { + assertTrue(i.isAllowed(user, Flags.BREAK_BLOCKS)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isBanned(java.util.UUID)}. + */ + @Test + public void testIsBanned() { + assertFalse(i.isBanned(uuid)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isSpawn()}. + */ + @Test + public void testIsSpawn() { + assertFalse(i.isSpawn()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#onIsland(org.bukkit.Location)}. + */ + @Test + public void testOnIsland() { + i.setWorld(world); + when(location.getWorld()).thenReturn(world); + assertTrue(i.onIsland(location)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getProtectionBoundingBox()}. + */ + @Test + public void testGetProtectionBoundingBox() { + i.setWorld(world); + assertNotNull(i.getProtectionBoundingBox()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#removeMember(java.util.UUID)}. + */ + @Test + public void testRemoveMember() { + i.removeMember(uuid); + assertTrue(i.getMemberSet().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setCenter(org.bukkit.Location)}. + */ + @Test + public void testSetCenter() { + when(location.getWorld()).thenReturn(world); + i.setCenter(location); + assertEquals(location, i.getCenter()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setCreatedDate(long)}. + */ + @Test + public void testSetCreatedDate() { + i.setCreatedDate(123456L); + assertEquals(123456L, i.getCreatedDate()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setFlag(world.bentobox.bentobox.api.flags.Flag, int)}. + */ + @Test + public void testSetFlagFlagInt() { + i.setFlag(Flags.BREAK_BLOCKS, 100); + assertTrue(i.isChanged()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setFlag(world.bentobox.bentobox.api.flags.Flag, int, boolean)}. + */ + @Test + public void testSetFlagFlagIntBoolean() { + Flag f = Flags.values().stream().filter(fl -> fl.hasSubflags()).findFirst().orElse(null); + if (f != null) { + i.setFlag(f, 100, true); + assertTrue(i.isChanged()); + } + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setFlags(java.util.Map)}. + */ + @Test + public void testSetFlags() { + i.setFlags(Collections.emptyMap()); + assertTrue(i.getFlags().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setFlagsDefaults()}. + */ + @Test + public void testSetFlagsDefaults() { + i.setFlagsDefaults(); + assertFalse(i.getFlags().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setMembers(java.util.Map)}. + */ + @Test + public void testSetMembers() { + i.setMembers(Collections.emptyMap()); + assertTrue(i.getMembers().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setName(java.lang.String)}. + */ + @Test + public void testSetName() { + i.setName("hello"); + assertEquals("hello", i.getName()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setOwner(java.util.UUID)}. + */ + @Test + public void testSetOwner() { + UUID owner = UUID.randomUUID(); + i.setOwner(owner); + assertEquals(owner, i.getOwner()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setProtectionRange(int)}. + */ + @Test + public void testSetProtectionRange() { + i.setProtectionRange(0); + assertEquals(0, i.getProtectionRange()); + i.setProtectionRange(50); + assertEquals(50, i.getProtectionRange()); + i.setProtectionRange(100); + assertEquals(100, i.getProtectionRange()); + i.setProtectionRange(1000); + assertEquals(1000, i.getProtectionRange()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#updateMaxEverProtectionRange()}. + */ + @Test + public void testUpdateMaxEverProtectionRange() { + i.setProtectionRange(1000); + assertEquals(1000, i.getMaxEverProtectionRange()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setPurgeProtected(boolean)}. + */ + @Test + public void testSetPurgeProtected() { + i.setPurgeProtected(true); + assertTrue(i.getPurgeProtected()); + i.setPurgeProtected(false); + assertFalse(i.getPurgeProtected()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setRange(int)}. + */ + @Test + public void testSetRange() { + i.setRange(123); + assertEquals(123, i.getRange()); + + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setRank(world.bentobox.bentobox.api.user.User, int)}. + */ + @Test + public void testSetRankUserInt() { + i.setRank(user, 600); + assertEquals(600, i.getRank(user)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setRank(java.util.UUID, int)}. + */ + @Test + public void testSetRankUUIDInt() { + i.setRank(uuid, 603); + assertEquals(603, i.getRank(uuid)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setRanks(java.util.Map)}. + */ + @Test + public void testSetRanks() { + UUID u = UUID.randomUUID(); + i.setRanks(Collections.singletonMap(u, 123)); + assertEquals(123, i.getRank(u)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setSpawn(boolean)}. + */ + @Test + public void testSetSpawn() { + assertFalse(i.isSpawn()); + i.setSpawn(true); + assertTrue(i.isSpawn()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getSpawnPoint()}. + */ + @Test + public void testGetSpawnPoint() { + assertTrue(i.getSpawnPoint().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setSpawnPoint(java.util.Map)}. + */ + @Test + public void testSetSpawnPointMapOfEnvironmentLocation() { + Map m = new EnumMap<>(Environment.class); + m.put(Environment.THE_END, location); + i.setSpawnPoint(m); + assertEquals(location, i.getSpawnPoint(Environment.THE_END)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setUniqueId(java.lang.String)}. + */ + @Test + public void testSetUniqueId() { + String u = UUID.randomUUID().toString(); + i.setUniqueId(u); + assertEquals(u, i.getUniqueId()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setUpdatedDate(long)}. + */ + @Test + public void testSetUpdatedDate() { + i.setUpdatedDate(566789L); + assertEquals(566789L, i.getUpdatedDate()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setWorld(org.bukkit.World)}. + */ + @Test + public void testSetWorld() { + World w = Mockito.mock(World.class); + i.setWorld(w); + assertEquals(w, i.getWorld()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#toggleFlag(world.bentobox.bentobox.api.flags.Flag)}. + */ + @Test + public void testToggleFlagFlag() { + assertFalse(i.isAllowed(Flags.PVP_END)); + i.toggleFlag(Flags.PVP_END); + assertTrue(i.isAllowed(Flags.PVP_END)); + i.toggleFlag(Flags.PVP_END); + assertFalse(i.isAllowed(Flags.PVP_END)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#toggleFlag(world.bentobox.bentobox.api.flags.Flag, boolean)}. + */ + @Test + public void testToggleFlagFlagBoolean() { + Flag f = Flags.values().stream().filter(fl -> fl.hasSubflags()) + .filter(fl -> fl.getType().equals(Type.SETTING)) + .findFirst().orElse(null); + if (f != null) { + i.toggleFlag(f, true); + assertTrue(i.isAllowed(f)); + i.toggleFlag(f, true); + assertFalse(i.isAllowed(f)); + } else { + System.out.println("No settings flag with subflags yet"); + } + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setSettingsFlag(world.bentobox.bentobox.api.flags.Flag, boolean)}. + */ + @Test + public void testSetSettingsFlagFlagBoolean() { + i.setSettingsFlag(Flags.PVP_NETHER, true); + assertTrue(i.isAllowed(Flags.PVP_NETHER)); + i.setSettingsFlag(Flags.PVP_NETHER, false); + assertFalse(i.isAllowed(Flags.PVP_NETHER)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setSettingsFlag(world.bentobox.bentobox.api.flags.Flag, boolean, boolean)}. + */ + @Test + public void testSetSettingsFlagFlagBooleanBoolean() { + i.setSettingsFlag(Flags.PVP_NETHER, true, true); + assertTrue(i.isAllowed(Flags.PVP_NETHER)); + i.setSettingsFlag(Flags.PVP_NETHER, false, true); + assertFalse(i.isAllowed(Flags.PVP_NETHER)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setSpawnPoint(org.bukkit.World.Environment, org.bukkit.Location)}. + */ + @Test + public void testSetSpawnPointEnvironmentLocation() { + i.setSpawnPoint(Environment.THE_END, location); + assertEquals(location, i.getSpawnPoint(Environment.THE_END)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getSpawnPoint(org.bukkit.World.Environment)}. + */ + @Test + public void testGetSpawnPointEnvironment() { + i.setSpawnPoint(Environment.THE_END, location); + assertEquals(location, i.getSpawnPoint(Environment.THE_END)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#removeRank(java.lang.Integer)}. + */ + @Test + public void testRemoveRank() { + assertFalse(i.getMembers().isEmpty()); + i.removeRank(RanksManager.OWNER_RANK); + assertTrue(i.getMembers().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getHistory()}. + */ + @Test + public void testGetHistory() { + assertTrue(i.getHistory().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#log(world.bentobox.bentobox.api.logs.LogEntry)}. + */ + @Test + public void testLog() { + LogEntry le = Mockito.mock(LogEntry.class); + i.log(le); + assertEquals(le, i.getHistory().get(0)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setHistory(java.util.List)}. + */ + @Test + public void testSetHistory() { + LogEntry le = Mockito.mock(LogEntry.class); + i.setHistory(List.of(le)); + assertEquals(le, i.getHistory().get(0)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isDoNotLoad()}. + */ + @Test + public void testIsDoNotLoad() { + assertFalse(i.isDoNotLoad()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setDoNotLoad(boolean)}. + */ + @Test + public void testSetDoNotLoad() { + i.setDoNotLoad(true); + assertTrue(i.isDoNotLoad()); + i.setDoNotLoad(false); + assertFalse(i.isDoNotLoad()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isDeleted()}. + */ + @Test + public void testIsDeleted() { + assertFalse(i.isDeleted()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setDeleted(boolean)}. + */ + @Test + public void testSetDeleted() { + i.setDeleted(true); + assertTrue(i.isDeleted()); + i.setDeleted(false); + assertFalse(i.isDeleted()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getGameMode()}. + */ + @Test + public void testGetGameMode() { + assertNull(i.getGameMode()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setGameMode(java.lang.String)}. + */ + @Test + public void testSetGameMode() { + i.setGameMode("BSkyBlock"); + assertEquals("BSkyBlock", i.getGameMode()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#hasNetherIsland()}. + */ + @Test + public void testHasNetherIsland() { + i.setWorld(world); + when(iwm.isNetherGenerate(any())).thenReturn(true); + when(iwm.isNetherIslands(any())).thenReturn(true); + when(iwm.getNetherWorld(world)).thenReturn(world); + Block block = Mockito.mock(Block.class); + when(block.getType()).thenReturn(Material.BEDROCK); + when(world.getBlockAt(any())).thenReturn(block); + assertTrue(i.hasNetherIsland()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#hasEndIsland()}. + */ + @Test + public void testHasEndIsland() { + i.setWorld(world); + when(iwm.isEndGenerate(any())).thenReturn(true); + when(iwm.isEndIslands(any())).thenReturn(true); + when(iwm.getEndWorld(world)).thenReturn(world); + Block block = Mockito.mock(Block.class); + when(block.getType()).thenReturn(Material.BEDROCK); + when(world.getBlockAt(any())).thenReturn(block); + assertTrue(i.hasEndIsland()); + + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isCooldown(world.bentobox.bentobox.api.flags.Flag)}. + */ + @Test + public void testIsCooldown() { + assertFalse(i.isCooldown(Flags.BREAK_BLOCKS)); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setCooldown(world.bentobox.bentobox.api.flags.Flag)}. + */ + @Test + public void testSetCooldown() { + assertTrue(i.getCooldowns().isEmpty()); + i.setCooldown(Flags.BREAK_BLOCKS); + assertFalse(i.getCooldowns().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getCooldowns()}. + */ + @Test + public void testGetCooldowns() { + assertTrue(i.getCooldowns().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setCooldowns(java.util.Map)}. + */ + @Test + public void testSetCooldowns() { + i.setCooldowns(Collections.singletonMap(Flags.BREAK_BLOCKS, 123L)); + assertFalse(i.getCooldowns().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getCommandRanks()}. + */ + @Test + public void testGetCommandRanks() { + assertNull(i.getCommandRanks()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setCommandRanks(java.util.Map)}. + */ + @Test + public void testSetCommandRanks() { + i.setCommandRanks(Collections.singletonMap("hello", 123)); + assertFalse(i.getCommandRanks().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getRankCommand(java.lang.String)}. + */ + @Test + public void testGetRankCommand() { + assertEquals(RanksManager.OWNER_RANK, i.getRankCommand("test")); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setRankCommand(java.lang.String, int)}. + */ + @Test + public void testSetRankCommand() { + i.setRankCommand("test", RanksManager.COOP_RANK); + assertEquals(RanksManager.COOP_RANK, i.getRankCommand("test")); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isReserved()}. + */ + @Test + public void testIsReserved() { + assertFalse(i.isReserved()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setReserved(boolean)}. + */ + @Test + public void testSetReserved() { + i.setReserved(true); + assertTrue(i.isReserved()); + i.setReserved(false); + assertFalse(i.isReserved()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMetaData()}. + */ + @Test + public void testGetMetaData() { + assertTrue(i.getMetaData().get().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setMetaData(java.util.Map)}. + */ + @Test + public void testSetMetaData() { + MetaDataValue meta = new MetaDataValue("hello"); + i.setMetaData(Collections.singletonMap("test", meta)); + assertFalse(i.getMetaData().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#isChanged()}. + */ + @Test + public void testIsChanged() { + assertTrue(i.isChanged()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setChanged()}. + */ + @Test + public void testSetChanged() { + Island ii = new Island(); + ii.setChanged(); + assertTrue(ii.isChanged()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setChanged(boolean)}. + */ + @Test + public void testSetChangedBoolean() { + i.setChanged(false); + assertFalse(i.isChanged()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getProtectionCenter()}. + */ + @Test + public void testGetProtectionCenter() { + assertEquals("Location{world=null,x=0.0,y=0.0,z=0.0,pitch=0.0,yaw=0.0}", i.getProtectionCenter().toString()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setProtectionCenter(org.bukkit.Location)}. + * @throws IOException if the location is not in island space + */ + @Test + public void testSetProtectionCenter() throws IOException { + i.setWorld(world); + when(world.getName()).thenReturn("bskyblock_wworld"); + when(location.getWorld()).thenReturn(world); + i.setProtectionCenter(location); + assertEquals(location, i.getProtectionCenter()); + + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getHomes()}. + */ + @Test + public void testGetHomes() { + assertTrue(i.getHomes().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getHome(java.lang.String)}. + */ + @Test + public void testGetHome() { + assertNull(i.getHome("default")); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setHomes(java.util.Map)}. + */ + @Test + public void testSetHomes() { + i.setHomes(Collections.singletonMap("hello", location)); + assertFalse(i.getHomes().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#addHome(java.lang.String, org.bukkit.Location)}. + */ + @Test + public void testAddHome() { + i.addHome("backyard", location); + assertEquals(location, i.getHome("backyard")); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#removeHome(java.lang.String)}. + */ + @Test + public void testRemoveHome() { + testAddHome(); + i.removeHome("backyard"); + assertTrue(i.getHomes().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#renameHome(java.lang.String, java.lang.String)}. + */ + @Test + public void testRenameHome() { + testAddHome(); + assertTrue(i.renameHome("backyard", "new")); + assertFalse(i.renameHome("new", "new")); + assertFalse(i.renameHome("nhelloew", "hfhhf")); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMaxHomes()}. + */ + @Test + public void testGetMaxHomes() { + assertNull(i.getMaxHomes()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setMaxHomes(java.lang.Integer)}. + */ + @Test + public void testSetMaxHomes() { + i.setMaxHomes(23); + assertEquals(23, i.getMaxHomes().intValue()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMaxMembers()}. + */ + @Test + public void testGetMaxMembers() { + assertTrue(i.getMaxMembers().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setMaxMembers(java.util.Map)}. + */ + @Test + public void testSetMaxMembersMapOfIntegerInteger() { + i.setMaxMembers(Collections.singletonMap(2345, 400)); + assertFalse(i.getMaxMembers().isEmpty()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#getMaxMembers(int)}. + */ + @Test + public void testGetMaxMembersInt() { + assertNull(i.getMaxMembers(1000)); + i.setMaxMembers(Collections.singletonMap(1000, 400)); + assertEquals(400, i.getMaxMembers(1000).intValue()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#setMaxMembers(int, java.lang.Integer)}. + */ + @Test + public void testSetMaxMembersIntInteger() { + i.setMaxMembers(1000, 400); + assertEquals(400, i.getMaxMembers(1000).intValue()); + } + + /** + * Test method for {@link world.bentobox.bentobox.database.objects.Island#toString()}. + */ + @Test + public void testToString() { + assertFalse(i.toString().isBlank()); + } + +} diff --git a/src/test/java/world/bentobox/bentobox/listeners/JoinLeaveListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/JoinLeaveListenerTest.java index 6a1bc21d7..3edd9bfdb 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/JoinLeaveListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/JoinLeaveListenerTest.java @@ -246,9 +246,9 @@ public class JoinLeaveListenerTest { // Verify verify(player).sendMessage(eq("commands.admin.setrange.range-updated")); // Verify island setting - verify(island).setProtectionRange(eq(200)); + verify(island).setProtectionRange(eq(100)); // Verify log - verify(plugin).log("Island protection range changed from 50 to 200 for tastybento due to permission."); + verify(plugin).log("Island protection range changed from 50 to 100 for tastybento due to permission."); } /** diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListenerTest.java index 4a2d74871..d3021e0be 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/flags/settings/MobSpawnListenerTest.java @@ -104,10 +104,14 @@ public class MobSpawnListenerTest { when(zombie.getLocation()).thenReturn(location); when(slime.getLocation()).thenReturn(location); when(cow.getLocation()).thenReturn(location); + when(zombie.getWorld()).thenReturn(world); + when(slime.getWorld()).thenReturn(world); + when(cow.getWorld()).thenReturn(world); // Worlds when(plugin.getIWM()).thenReturn(iwm); when(iwm.inWorld(any(Location.class))).thenReturn(true); + when(iwm.inWorld(any(World.class))).thenReturn(true); when(plugin.getIWM()).thenReturn(iwm); // Util class diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/EnterExitListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/EnterExitListenerTest.java index 4a3df7dd2..be3620e11 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/EnterExitListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/EnterExitListenerTest.java @@ -140,6 +140,7 @@ public class EnterExitListenerTest { when(island.getOwner()).thenReturn(uuid); when(island.getMemberSet()).thenReturn(ImmutableSet.of(uuid)); when(island.isOwned()).thenReturn(true); + when(island.getWorld()).thenReturn(world); when(im.getIsland(any(), any(UUID.class))).thenReturn(island); diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/PistonPushListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/PistonPushListenerTest.java index be02e9d8e..1fe59ca16 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/PistonPushListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/PistonPushListenerTest.java @@ -3,6 +3,7 @@ package world.bentobox.bentobox.listeners.flags.worldsettings; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -22,6 +23,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; @@ -42,8 +44,11 @@ import world.bentobox.bentobox.util.Util; @PrepareForTest({BentoBox.class, Util.class }) public class PistonPushListenerTest { + @Mock private Island island; + @Mock private World world; + @Mock private Block block; private List blocks; @@ -53,36 +58,33 @@ public class PistonPushListenerTest { BentoBox plugin = mock(BentoBox.class); Whitebox.setInternalState(BentoBox.class, "instance", plugin); - // World - world = mock(World.class); - // Owner UUID uuid = UUID.randomUUID(); // Island initialization - island = mock(Island.class); when(island.getOwner()).thenReturn(uuid); IslandsManager im = mock(IslandsManager.class); when(plugin.getIslands()).thenReturn(im); - when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(island); + when(im.getIsland(any(), any(UUID.class))).thenReturn(island); Location inside = mock(Location.class); + when(inside.getWorld()).thenReturn(world); Optional opIsland = Optional.ofNullable(island); - when(im.getProtectedIslandAt(Mockito.eq(inside))).thenReturn(opIsland); + when(im.getProtectedIslandAt(eq(inside))).thenReturn(opIsland); // Blocks - block = mock(Block.class); when(block.getWorld()).thenReturn(world); when(block.getLocation()).thenReturn(inside); Block blockPushed = mock(Block.class); - when(block.getRelative(Mockito.any(BlockFace.class))).thenReturn(blockPushed); + when(block.getRelative(any(BlockFace.class))).thenReturn(blockPushed); // The blocks in the pushed list are all inside the island when(blockPushed.getLocation()).thenReturn(inside); + when(blockPushed.getWorld()).thenReturn(world); // Make a list of ten blocks blocks = new ArrayList<>(); @@ -91,18 +93,19 @@ public class PistonPushListenerTest { } PowerMockito.mockStatic(Util.class); - when(Util.getWorld(Mockito.any())).thenReturn(world); + when(Util.getWorld(any())).thenReturn(world); // World Settings IslandWorldManager iwm = mock(IslandWorldManager.class); when(plugin.getIWM()).thenReturn(iwm); WorldSettings ws = mock(WorldSettings.class); - when(iwm.getWorldSettings(Mockito.any())).thenReturn(ws); + when(iwm.getWorldSettings(any())).thenReturn(ws); Map worldFlags = new HashMap<>(); when(ws.getWorldFlags()).thenReturn(worldFlags); GameModeAddon gma = mock(GameModeAddon.class); Optional opGma = Optional.of(gma ); when(iwm.getAddon(any())).thenReturn(opGma); + when(iwm.inWorld(world)).thenReturn(true); // Set default on Flags.PISTON_PUSH.setSetting(world, true); @@ -129,7 +132,7 @@ public class PistonPushListenerTest { public void testOnPistonExtendFlagSetOnIsland() { // The blocks in the pushed list are all inside the island - when(island.onIsland(Mockito.any())).thenReturn(true); + when(island.onIsland(any())).thenReturn(true); BlockPistonExtendEvent e = new BlockPistonExtendEvent(block, blocks, BlockFace.EAST); new PistonPushListener().onPistonExtend(e); @@ -141,7 +144,7 @@ public class PistonPushListenerTest { @Test public void testOnPistonExtendFlagSetOffIsland() { // The blocks in the pushed list are all outside the island - when(island.onIsland(Mockito.any())).thenReturn(false); + when(island.onIsland(any())).thenReturn(false); BlockPistonExtendEvent e = new BlockPistonExtendEvent(block, blocks, BlockFace.EAST); new PistonPushListener().onPistonExtend(e); diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/RemoveMobsListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/RemoveMobsListenerTest.java index ac828f0d4..463d883df 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/RemoveMobsListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/RemoveMobsListenerTest.java @@ -106,6 +106,7 @@ public class RemoveMobsListenerTest { Map worldFlags = new HashMap<>(); when(ws.getWorldFlags()).thenReturn(worldFlags); Flags.REMOVE_MOBS.setSetting(world, true); + when(iwm.inWorld(world)).thenReturn(true); // Sometimes use Mockito.withSettings().verboseLogging() UUID uuid = UUID.randomUUID(); diff --git a/src/test/java/world/bentobox/bentobox/managers/IslandWorldManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/IslandWorldManagerTest.java index 9bd967213..8613406ed 100644 --- a/src/test/java/world/bentobox/bentobox/managers/IslandWorldManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/IslandWorldManagerTest.java @@ -211,14 +211,6 @@ public class IslandWorldManagerTest { assertEquals(ws, iwm.getWorldSettings(world)); } - /** - * Test method for {@link world.bentobox.bentobox.managers.IslandWorldManager#getWorldSettings(org.bukkit.World)}. - */ - @Test - public void testGetWorldSettingsNull() { - assertNull(iwm.getWorldSettings(null)); - } - /** * Test method for {@link world.bentobox.bentobox.managers.IslandWorldManager#getOverWorld(java.lang.String)}. */ diff --git a/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java index b52339032..abd630ab5 100644 --- a/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java @@ -191,7 +191,6 @@ public class IslandsManagerTest { // Player's manager when(plugin.getPlayers()).thenReturn(pm); - when(pm.getHomeLocations(any(), any())).thenReturn(Collections.emptyMap()); // Scheduler BukkitScheduler sch = mock(BukkitScheduler.class); @@ -726,7 +725,6 @@ public class IslandsManagerTest { */ @Test public void testGetSafeHomeLocationNoIsland() { - when(pm.getHomeLocation(eq(world), eq(user), eq(0))).thenReturn(null); assertNull(im.getSafeHomeLocation(world, user, "")); verify(plugin).logWarning(eq("null player has no island in world world!")); } diff --git a/src/test/java/world/bentobox/bentobox/managers/PlayersManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/PlayersManagerTest.java index d7a34500d..44cd67b08 100644 --- a/src/test/java/world/bentobox/bentobox/managers/PlayersManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/PlayersManagerTest.java @@ -2,7 +2,6 @@ package world.bentobox.bentobox.managers; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -316,43 +315,6 @@ public class PlayersManagerTest { assertTrue(pm.isKnown(notUUID)); } - /** - * Test method for {@link world.bentobox.bentobox.managers.PlayersManager#setHomeLocation(User, org.bukkit.Location, int)}. - */ - @Test - public void testSetAndGetHomeLocationUserLocationInt() { - Location l = mock(Location.class); - when(l.getWorld()).thenReturn(world); - Location l2 = mock(Location.class); - when(l2.getWorld()).thenReturn(nether); - Location l3 = mock(Location.class); - when(l3.getWorld()).thenReturn(end); - - pm.setHomeLocation(uuid, l, 1); - pm.setHomeLocation(uuid, l2, 0); - pm.setHomeLocation(uuid, l3, 10); - assertEquals(l, pm.getHomeLocation(world, uuid)); - assertEquals(l2, pm.getHomeLocation(world, uuid, 0)); - assertEquals(l3, pm.getHomeLocation(world, uuid, 10)); - assertNotEquals(l, pm.getHomeLocation(world, uuid, 20)); - } - - @Test - public void testClearHomeLocations() { - Location l = mock(Location.class); - when(l.getWorld()).thenReturn(world); - Location l2 = mock(Location.class); - when(l2.getWorld()).thenReturn(nether); - Location l3 = mock(Location.class); - when(l3.getWorld()).thenReturn(end); - pm.setHomeLocation(uuid, l, 1); - pm.setHomeLocation(uuid, l2, 0); - pm.setHomeLocation(uuid, l3, 10); - assertFalse(pm.getHomeLocations(world, uuid).isEmpty()); - pm.clearHomeLocations(world, uuid); - assertTrue(pm.getHomeLocations(world, uuid).isEmpty()); - } - /** * Test method for {@link world.bentobox.bentobox.managers.PlayersManager#getUUID(java.lang.String)}. */ diff --git a/src/test/java/world/bentobox/bentobox/managers/island/NewIslandTest.java b/src/test/java/world/bentobox/bentobox/managers/island/NewIslandTest.java index 87c690e32..74b36a812 100644 --- a/src/test/java/world/bentobox/bentobox/managers/island/NewIslandTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/island/NewIslandTest.java @@ -202,8 +202,7 @@ public class NewIslandTest { verify(bpb).getUniqueId(); verify(ice).getBlueprintBundle(); verify(pm).setDeaths(eq(world), eq(uuid), eq(0)); - verify(pm).setHomeLocation(eq(user), any(), eq(1)); - verify(pm).clearHomeLocations(eq(world), any(UUID.class)); + verify(im).setHomeLocation(eq(user), any()); verify(island).setProtectionRange(eq(20)); } @@ -224,8 +223,7 @@ public class NewIslandTest { verify(ice, never()).getBlueprintBundle(); verify(ire).getBlueprintBundle(); verify(pm).setDeaths(eq(world), eq(uuid), eq(0)); - verify(pm).setHomeLocation(eq(user), any(), eq(1)); - verify(pm).clearHomeLocations(eq(world), any(UUID.class)); + verify(im).setHomeLocation(eq(user), any()); } /** @@ -243,8 +241,7 @@ public class NewIslandTest { verify(bpb).getUniqueId(); verify(ice).getBlueprintBundle(); verify(pm).setDeaths(eq(world), eq(uuid), eq(0)); - verify(pm).setHomeLocation(eq(user), any(), eq(1)); - verify(pm).clearHomeLocations(eq(world), any(UUID.class)); + verify(im).setHomeLocation(eq(user), any()); } /** @@ -262,8 +259,7 @@ public class NewIslandTest { verify(bpb).getUniqueId(); verify(ice).getBlueprintBundle(); verify(pm).setDeaths(eq(world), eq(uuid), eq(0)); - verify(pm).setHomeLocation(eq(user), any(), eq(1)); - verify(pm).clearHomeLocations(eq(world), any(UUID.class)); + verify(im).setHomeLocation(eq(user), any()); } /** @@ -282,8 +278,7 @@ public class NewIslandTest { verify(bpb).getUniqueId(); verify(ice).getBlueprintBundle(); verify(pm).setDeaths(eq(world), eq(uuid), eq(0)); - verify(pm).setHomeLocation(eq(user), any(), eq(1)); - verify(pm).clearHomeLocations(eq(world), any(UUID.class)); + verify(im).setHomeLocation(eq(user), any()); verify(island).setProtectionRange(eq(20)); verify(island).setReserved(eq(false)); } @@ -305,8 +300,7 @@ public class NewIslandTest { verify(bpb).getUniqueId(); verify(ice).getBlueprintBundle(); verify(pm).setDeaths(eq(world), eq(uuid), eq(0)); - verify(pm).setHomeLocation(eq(user), any(), eq(1)); - verify(pm).clearHomeLocations(eq(world), any(UUID.class)); + verify(im).setHomeLocation(eq(user), any()); verify(island).setProtectionRange(eq(20)); verify(plugin).logError("New island for user tastybento was not reserved!"); } @@ -328,8 +322,7 @@ public class NewIslandTest { verify(bpb).getUniqueId(); verify(ice).getBlueprintBundle(); verify(pm).setDeaths(eq(world), eq(uuid), eq(0)); - verify(pm).setHomeLocation(eq(user), any(), eq(1)); - verify(pm).clearHomeLocations(eq(world), any(UUID.class)); + verify(im).setHomeLocation(eq(user), any()); verify(island).setProtectionRange(eq(20)); verify(plugin).logError("New island for user tastybento was not reserved!"); }