diff --git a/src/main/java/world/bentobox/bentobox/hooks/MultiverseCoreHook.java b/src/main/java/world/bentobox/bentobox/hooks/MultiverseCoreHook.java index f24810e49..f25a3315e 100644 --- a/src/main/java/world/bentobox/bentobox/hooks/MultiverseCoreHook.java +++ b/src/main/java/world/bentobox/bentobox/hooks/MultiverseCoreHook.java @@ -2,6 +2,7 @@ package world.bentobox.bentobox.hooks; import org.bukkit.Bukkit; import org.bukkit.World; + import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.hooks.Hook; @@ -20,8 +21,10 @@ public class MultiverseCoreHook extends Hook { } public void registerWorld(World world) { - Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), MULTIVERSE_IMPORT + world.getName() + " normal -g " + BentoBox.getInstance().getName()); - Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), MULTIVERSE_SET_GENERATOR + BentoBox.getInstance().getName() + " " + world.getName()); + String cmd1 = MULTIVERSE_IMPORT + world.getName() + " " + world.getEnvironment().name().toLowerCase() + " -g " + BentoBox.getInstance().getName(); + String cmd2 = MULTIVERSE_SET_GENERATOR + BentoBox.getInstance().getName() + " " + world.getName(); + Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), cmd1); + Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), cmd2); } @Override diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java index a733a5607..a2b1e8d7e 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java @@ -24,7 +24,6 @@ import world.bentobox.bentobox.api.configuration.WorldSettings; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.hooks.MultiverseCoreHook; import world.bentobox.bentobox.lists.Flags; -import world.bentobox.bentobox.util.Util; /** * Handles registration and management of worlds @@ -33,9 +32,6 @@ import world.bentobox.bentobox.util.Util; */ public class IslandWorldManager { - private static final String NETHER = "_nether"; - private static final String THE_END = "_the_end"; - private BentoBox plugin; private Map<@NonNull World, @NonNull GameModeAddon> gameModes; @@ -48,7 +44,15 @@ public class IslandWorldManager { } public void registerWorldsToMultiverse() { - gameModes.forEach((world, s) -> registerToMultiverse(world)); + gameModes.values().stream().distinct().forEach(gm -> { + registerToMultiverse(gm.getOverWorld()); + if (gm.getWorldSettings().isNetherGenerate() && gm.getWorldSettings().isNetherIslands()) { + registerToMultiverse(gm.getNetherWorld()); + } + if (gm.getWorldSettings().isEndGenerate() && gm.getWorldSettings().isEndIslands()) { + registerToMultiverse(gm.getEndWorld()); + } + }); } /** @@ -58,7 +62,13 @@ public class IslandWorldManager { */ private void registerToMultiverse(World world) { if (!isUseOwnGenerator(world) && plugin.getHooks() != null) { - plugin.getHooks().getHook("Multiverse-Core").ifPresent(hook -> ((MultiverseCoreHook) hook).registerWorld(world)); + plugin.getHooks().getHook("Multiverse-Core").ifPresent(hook -> { + if (Bukkit.isPrimaryThread()) { + ((MultiverseCoreHook) hook).registerWorld(world); + } else { + Bukkit.getScheduler().runTask(plugin, () -> ((MultiverseCoreHook) hook).registerWorld(world)); + } + }); } } @@ -109,6 +119,7 @@ public class IslandWorldManager { */ public Map getOverWorldNames() { return gameModes.values().stream() + .distinct() .collect(Collectors.toMap(a -> a.getOverWorld().getName(), a -> a.getWorldSettings().getFriendlyName())); } @@ -119,18 +130,35 @@ public class IslandWorldManager { * @return true if name is a known world name */ public boolean isKnownFriendlyWorldName(String name) { - return gameModes.entrySet().stream().filter(e -> e.getKey().getEnvironment().equals(Environment.NORMAL)) - .anyMatch(w -> w.getValue().getWorldSettings().getFriendlyName().equalsIgnoreCase(name)); + return gameModes.values().stream().distinct() + .anyMatch(gm -> gm.getWorldSettings().getFriendlyName().equalsIgnoreCase(name)); } + /** + * Adds a GameMode to island world manager + * @param gameMode + */ public void addGameMode(GameModeAddon gameMode) { WorldSettings settings = gameMode.getWorldSettings(); World world = gameMode.getOverWorld(); String friendlyName = settings.getFriendlyName().isEmpty() ? world.getName() : settings.getFriendlyName(); + // Add worlds to map gameModes.put(world, gameMode); // Call Multiverse registerToMultiverse(world); + if (settings.isNetherGenerate()) { + gameModes.put(gameMode.getNetherWorld(), gameMode); + if (settings.isNetherIslands()) { + registerToMultiverse(gameMode.getNetherWorld()); + } + } + if (settings.isEndGenerate() && settings.isEndIslands()) { + gameModes.put(gameMode.getEndWorld(), gameMode); + if (settings.isEndGenerate()) { + registerToMultiverse(gameMode.getEndWorld()); + } + } // Set default island settings Flags.values().stream().filter(f -> f.getType().equals(Flag.Type.PROTECTION)) .forEach(f -> settings.getDefaultIslandFlags().putIfAbsent(f, f.getDefaultRank())); @@ -165,166 +193,162 @@ public class IslandWorldManager { * @return world settings, or null if world is unknown */ public WorldSettings getWorldSettings(World world) { - if (gameModes.containsKey(Util.getWorld(world))) { - return gameModes.get(Util.getWorld(world)).getWorldSettings(); + if (gameModes.containsKey(world)) { + return gameModes.get(world).getWorldSettings(); } else { return null; } } /** - * Get the world based on friendly name. + * Get the overworld based on friendly name. * * @param friendlyName * - friendly name of world - * @return world, or null if it does not exist + * @return overworld, or null if it does not exist + * @since 1.1 */ @Nullable - public World getWorld(@NonNull String friendlyName) { - return gameModes.entrySet().stream().filter(en -> en.getValue().getWorldSettings().getFriendlyName().equalsIgnoreCase(friendlyName)) - .map(Map.Entry::getKey).findFirst().orElse(null); + public World getOverWorld(@NonNull String friendlyName) { + return gameModes.values().stream().distinct() + .filter(gm -> gm.getWorldSettings().getFriendlyName().equalsIgnoreCase(friendlyName)) + .map(gm -> gm.getOverWorld()).findFirst().orElse(null); } /** * @return the islandDistance */ public int getIslandDistance(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getIslandDistance(); + return gameModes.get(world).getWorldSettings().getIslandDistance(); } /** * @return the islandHeight */ public int getIslandHeight(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getIslandHeight(); + return gameModes.get(world).getWorldSettings().getIslandHeight(); } /** * @return the islandProtectionRange */ public int getIslandProtectionRange(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getIslandProtectionRange(); + return gameModes.get(world).getWorldSettings().getIslandProtectionRange(); } /** * @return the islandStartX */ public int getIslandStartX(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getIslandStartX(); + return gameModes.get(world).getWorldSettings().getIslandStartX(); } /** * @return the islandStartZ */ public int getIslandStartZ(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getIslandStartZ(); + return gameModes.get(world).getWorldSettings().getIslandStartZ(); } /** * @return the islandXOffset */ public int getIslandXOffset(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getIslandXOffset(); + return gameModes.get(world).getWorldSettings().getIslandXOffset(); } /** * @return the islandZOffset */ public int getIslandZOffset(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getIslandZOffset(); + return gameModes.get(world).getWorldSettings().getIslandZOffset(); } /** * @return the maxIslands */ public int getMaxIslands(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getMaxIslands(); + return gameModes.get(world).getWorldSettings().getMaxIslands(); } /** * @return the netherSpawnRadius */ public int getNetherSpawnRadius(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getNetherSpawnRadius(); + return gameModes.get(world).getWorldSettings().getNetherSpawnRadius(); } /** * @return the seaHeight */ public int getSeaHeight(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getSeaHeight(); + return gameModes.get(world).getWorldSettings().getSeaHeight(); } /** * @return the worldName */ public String getWorldName(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getWorldName(); + return gameModes.get(world).getWorldSettings().getWorldName(); } /** * @return the endGenerate */ public boolean isEndGenerate(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isEndGenerate(); + return gameModes.get(world).getWorldSettings().isEndGenerate(); } /** * @return the endIslands */ public boolean isEndIslands(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isEndIslands(); + return gameModes.get(world).getWorldSettings().isEndIslands(); } /** * @return the netherGenerate */ public boolean isNetherGenerate(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isNetherGenerate(); + return gameModes.get(world).getWorldSettings().isNetherGenerate(); } /** * @return the netherIslands */ public boolean isNetherIslands(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isNetherIslands(); + return gameModes.get(world).getWorldSettings().isNetherIslands(); } /** * Checks if a world is a known nether world * - * @param world - * - world + * @param world - world * @return true if world is a known and valid nether world */ public boolean isNether(World world) { - World w = Util.getWorld(world); - return world.getEnvironment().equals(Environment.NETHER) && gameModes.containsKey(w) && gameModes.get(w).getWorldSettings().isNetherGenerate(); + return world.getEnvironment().equals(Environment.NETHER) && gameModes.containsKey(world) && gameModes.get(world).getWorldSettings().isNetherGenerate(); } /** * Checks if a world is a known island nether world * - * @param world - * - world + * @param world - world * @return true if world is a known and valid nether world */ public boolean isIslandNether(World world) { - World w = Util.getWorld(world); - return world.getEnvironment().equals(Environment.NETHER) && gameModes.containsKey(w) && gameModes.get(w).getWorldSettings().isNetherGenerate() - && gameModes.get(w).getWorldSettings().isNetherIslands(); + return world.getEnvironment().equals(Environment.NETHER) && gameModes.containsKey(world) && gameModes.get(world).getWorldSettings().isNetherGenerate() + && gameModes.get(world).getWorldSettings().isNetherIslands(); } /** * Checks if a world is a known end world * - * @param world - * - world + * @param world - world * @return true if world is a known and valid end world */ public boolean isEnd(World world) { - World w = Util.getWorld(world); - return world.getEnvironment().equals(Environment.THE_END) && gameModes.containsKey(w) && gameModes.get(w).getWorldSettings().isEndGenerate(); + return world.getEnvironment().equals(Environment.THE_END) && gameModes.containsKey(world) && gameModes.get(world).getWorldSettings().isEndGenerate(); } /** @@ -335,43 +359,44 @@ public class IslandWorldManager { * @return true if world is a known and valid nether world */ public boolean isIslandEnd(World world) { - World w = Util.getWorld(world); - return world.getEnvironment().equals(Environment.THE_END) && gameModes.containsKey(w) && gameModes.get(w).getWorldSettings().isEndGenerate() - && gameModes.get(w).getWorldSettings().isEndIslands(); + return world.getEnvironment().equals(Environment.THE_END) && gameModes.containsKey(world) && gameModes.get(world).getWorldSettings().isEndGenerate() + && gameModes.get(world).getWorldSettings().isEndIslands(); } /** * Get the nether world of this overWorld * - * @param overWorld - * - overworld + * @param overWorld - overworld * @return nether world, or null if it does not exist */ public World getNetherWorld(World overWorld) { - return Bukkit.getWorld(overWorld.getName() + NETHER); + if (gameModes.containsKey(overWorld)) { + return gameModes.get(overWorld).getNetherWorld(); + } + return null; } /** * Get the end world of this overWorld * - * @param overWorld - * - overworld + * @param overWorld - overworld * @return end world, or null if it does not exist */ public World getEndWorld(World overWorld) { - return Bukkit.getWorld(overWorld.getName() + THE_END); + if (gameModes.containsKey(overWorld)) { + return gameModes.get(overWorld).getEndWorld(); + } + return null; } /** * Check if nether trees should be created in the nether or not * - * @param world - * - world + * @param world - world * @return true or false */ public boolean isNetherTrees(World world) { - World w = Util.getWorld(world); - return gameModes.containsKey(w) && gameModes.get(w).getWorldSettings().isNetherTrees(); + return gameModes.containsKey(world) && gameModes.get(world).getWorldSettings().isNetherTrees(); } /** @@ -382,8 +407,7 @@ public class IslandWorldManager { * @return true (default) if it can spawn or not */ public boolean isDragonSpawn(World world) { - World w = Util.getWorld(world); - return !gameModes.containsKey(w) || gameModes.get(w).getWorldSettings().isDragonSpawn(); + return !gameModes.containsKey(world) || gameModes.get(world).getWorldSettings().isDragonSpawn(); } /** @@ -391,7 +415,7 @@ public class IslandWorldManager { */ public String getFriendlyNames() { StringBuilder r = new StringBuilder(); - gameModes.values().forEach(n -> r.append(n).append(", ")); + gameModes.values().stream().distinct().forEach(n -> r.append(n).append(", ")); if (r.length() > 0) { r.setLength(r.length() - 2); } @@ -418,7 +442,7 @@ public class IslandWorldManager { * @return max team size */ public int getMaxTeamSize(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getMaxTeamSize(); + return gameModes.get(world).getWorldSettings().getMaxTeamSize(); } /** @@ -429,7 +453,7 @@ public class IslandWorldManager { * @return max homes */ public int getMaxHomes(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getMaxHomes(); + return gameModes.get(world).getWorldSettings().getMaxHomes(); } /** @@ -440,7 +464,7 @@ public class IslandWorldManager { * @return Friendly name */ public String getFriendlyName(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getFriendlyName(); + return gameModes.get(world).getWorldSettings().getFriendlyName(); } /** @@ -451,7 +475,7 @@ public class IslandWorldManager { * @return permission prefix for this world */ public String getPermissionPrefix(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getPermissionPrefix(); + return gameModes.get(world).getWorldSettings().getPermissionPrefix(); } @@ -463,7 +487,7 @@ public class IslandWorldManager { * @return invincible visitor settings */ public List getIvSettings(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getIvSettings(); + return gameModes.get(world).getWorldSettings().getIvSettings(); } /** @@ -488,7 +512,7 @@ public class IslandWorldManager { * @return GameMode: SURVIVAL, CREATIVE, ADVENTURE, SPECTATOR */ public GameMode getDefaultGameMode(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getDefaultGameMode(); + return gameModes.get(world).getWorldSettings().getDefaultGameMode(); } /** @@ -499,49 +523,49 @@ public class IslandWorldManager { * @return - set of entity types */ public Set getRemoveMobsWhitelist(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getRemoveMobsWhitelist(); + return gameModes.get(world).getWorldSettings().getRemoveMobsWhitelist(); } /** * @return the onJoinResetMoney */ public boolean isOnJoinResetMoney(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isOnJoinResetMoney(); + return gameModes.get(world).getWorldSettings().isOnJoinResetMoney(); } /** * @return the onJoinResetInventory */ public boolean isOnJoinResetInventory(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isOnJoinResetInventory(); + return gameModes.get(world).getWorldSettings().isOnJoinResetInventory(); } /** * @return the onJoinResetEnderChest */ public boolean isOnJoinResetEnderChest(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isOnJoinResetEnderChest(); + return gameModes.get(world).getWorldSettings().isOnJoinResetEnderChest(); } /** * @return the onLeaveResetMoney */ public boolean isOnLeaveResetMoney(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isOnLeaveResetMoney(); + return gameModes.get(world).getWorldSettings().isOnLeaveResetMoney(); } /** * @return the onLeaveResetInventory */ public boolean isOnLeaveResetInventory(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isOnLeaveResetInventory(); + return gameModes.get(world).getWorldSettings().isOnLeaveResetInventory(); } /** * @return the onLeaveResetEnderChest */ public boolean isOnLeaveResetEnderChest(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isOnLeaveResetEnderChest(); + return gameModes.get(world).getWorldSettings().isOnLeaveResetEnderChest(); } /** @@ -561,7 +585,7 @@ public class IslandWorldManager { * @return GameModeAddon, or empty */ public Optional getAddon(@Nullable World world) { - return world == null ? Optional.empty() : Optional.ofNullable(gameModes.get(Util.getWorld(world))); + return world == null ? Optional.empty() : Optional.ofNullable(gameModes.get(world)); } /** @@ -572,11 +596,11 @@ public class IslandWorldManager { * @return default rank settings for new islands. */ public Map getDefaultIslandFlags(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getDefaultIslandFlags(); + return gameModes.get(world).getWorldSettings().getDefaultIslandFlags(); } public List getVisibleSettings(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getVisibleSettings(); + return gameModes.get(world).getWorldSettings().getVisibleSettings(); } /** @@ -587,11 +611,11 @@ public class IslandWorldManager { * @return default settings for new islands */ public Map getDefaultIslandSettings(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getDefaultIslandSettings(); + return gameModes.get(world).getWorldSettings().getDefaultIslandSettings(); } public boolean isUseOwnGenerator(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isUseOwnGenerator(); + return gameModes.get(world).getWorldSettings().isUseOwnGenerator(); } /** @@ -599,7 +623,7 @@ public class IslandWorldManager { * @return the visitorbannedcommands */ public List getVisitorBannedCommands(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getVisitorBannedCommands(); + return gameModes.get(world).getWorldSettings().getVisitorBannedCommands(); } /** @@ -608,7 +632,7 @@ public class IslandWorldManager { * @return true if water is not safe, e.g.for home locations */ public boolean isWaterNotSafe(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isWaterUnsafe(); + return gameModes.get(world).getWorldSettings().isWaterUnsafe(); } /** @@ -617,7 +641,7 @@ public class IslandWorldManager { * @return list */ public List getGeoLimitSettings(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getGeoLimitSettings(); + return gameModes.get(world).getWorldSettings().getGeoLimitSettings(); } /** @@ -626,7 +650,7 @@ public class IslandWorldManager { * @return number of resets allowed. -1 = unlimited */ public int getResetLimit(World world) { - return gameModes.containsKey(Util.getWorld(world)) ? gameModes.get(Util.getWorld(world)).getWorldSettings().getResetLimit() : -1; + return gameModes.containsKey(world) ? gameModes.get(world).getWorldSettings().getResetLimit() : -1; } @@ -635,7 +659,7 @@ public class IslandWorldManager { * @param world - world */ public long getResetEpoch(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getResetEpoch(); + return gameModes.get(world).getWorldSettings().getResetEpoch(); } /** @@ -643,11 +667,11 @@ public class IslandWorldManager { * @param world - world */ public void setResetEpoch(World world) { - gameModes.get(Util.getWorld(world)).getWorldSettings().setResetEpoch(System.currentTimeMillis()); + gameModes.get(world).getWorldSettings().setResetEpoch(System.currentTimeMillis()); } public boolean isTeamJoinDeathReset(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().isTeamJoinDeathReset(); + return gameModes.get(world).getWorldSettings().isTeamJoinDeathReset(); } /** @@ -656,10 +680,10 @@ public class IslandWorldManager { * @return max deaths */ public int getDeathsMax(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getDeathsMax(); + return gameModes.get(world).getWorldSettings().getDeathsMax(); } public int getBanLimit(World world) { - return gameModes.get(Util.getWorld(world)).getWorldSettings().getBanLimit(); + return gameModes.get(world).getWorldSettings().getBanLimit(); } } 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 d276b85fb..37903244b 100644 --- a/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java +++ b/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java @@ -144,8 +144,6 @@ public class NewIsland { plugin.logError("Failed to make island! Island could not be added to the grid."); return; } - // Save the player so that if the server crashes weird things won't happen - plugin.getPlayers().save(user.getUniqueId()); // Clear any old home locations (they should be clear, but just in case) plugin.getPlayers().clearHomeLocations(world, user.getUniqueId()); @@ -153,6 +151,9 @@ public class NewIsland { // Set home location plugin.getPlayers().setHomeLocation(user, next, 1); + // Save the player so that if the server crashes weird things won't happen + plugin.getPlayers().save(user.getUniqueId()); + // Fire event IslandBaseEvent event = IslandEvent.builder() .involvedPlayer(user.getUniqueId()) @@ -223,6 +224,8 @@ public class NewIsland { // Set default settings island.setFlagsDefaults(); plugin.getMetrics().ifPresent(BStats::increaseIslandsCreatedCount); + // Save island + plugin.getIslands().save(island); } /**