diff --git a/plugin/src/main/java/com/alttd/cometskyblock/CometSkyBlockPlugin.java b/plugin/src/main/java/com/alttd/cometskyblock/CometSkyBlockPlugin.java index e874b91..0fa39d3 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/CometSkyBlockPlugin.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/CometSkyBlockPlugin.java @@ -53,6 +53,8 @@ public class CometSkyBlockPlugin extends JavaPlugin implements CometSkyBlockAPI islandManager = new IslandManager(this); playerManager = new PlayerManager(this); worldGenerator = new MasterWorldGenerator(this); + + worldGenerator.checkMasterIslandWorld(); } @Override diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/PlayerSubCommand.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/PlayerSubCommand.java index 2ba58b9..f5e4553 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/PlayerSubCommand.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/PlayerSubCommand.java @@ -17,8 +17,7 @@ public abstract class PlayerSubCommand extends SubCommand { sender.sendRichMessage(plugin.messagesConfiguration().get().commands().notAPlayer()); return false; } - // Todo - load islandplayerdata - return execute(player, new IslandPlayer(), args); + return execute(player, IslandPlayer.getIslandPlayer(player.getUniqueId()), args); } protected abstract boolean execute(Player player, IslandPlayer islandPlayer, String... args); diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/challenges/ChallengeCommand.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/challenges/ChallengeCommand.java index bad8726..6287577 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/challenges/ChallengeCommand.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/challenges/ChallengeCommand.java @@ -13,7 +13,7 @@ public class ChallengeCommand extends PlayerSubCommand { super(plugin, "challenge"); this.plugin = plugin; } - + // TODO - Challenges, ChallengesGUI and ChallengesCommand @Override public boolean execute(Player player, IslandPlayer islandPlayer, String[] args) { // open challenge inventory - not implemented yet -- TODO diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandCommand.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandCommand.java index c677deb..525658a 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandCommand.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandCommand.java @@ -21,7 +21,7 @@ public class IslandCommand extends PlayerSubCommand { registerSubCommand(new IslandLeave(plugin)); registerSubCommand(new IslandMembers(plugin)); registerSubCommand(new IslandLevel(plugin)); - registerSubCommand(new IslandTop(plugin)); +// registerSubCommand(new IslandTop(plugin)); registerSubCommand(new IslandOptions(plugin)); registerSubCommand(new IslandConfirm(plugin)); registerSubCommand(new IslandInvite(plugin)); @@ -47,7 +47,7 @@ public class IslandCommand extends PlayerSubCommand { "/island level: " + help.level() + "" + "/island members: " + help.members() + "" + "/island options: " + help.options() + "" + - "/island top: " + help.top() + "" + +// "/island top: " + help.top() + "" + "/island visit: " + help.visit() + "" + "/island confirm: " + help.confirm() + "" + "/island challenges: " + help.challenges() diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandGo.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandGo.java index 8b11828..2308085 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandGo.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandGo.java @@ -19,16 +19,42 @@ public class IslandGo extends PlayerSubCommand { @Override public boolean execute(Player player, IslandPlayer islandPlayer, String[] args) { + if (islandPlayer.islandId() != 0) { + Island island = Island.getIsland(islandPlayer.islandUUID()); + if (island == null) { + player.sendRichMessage("Could not load your island. Contact an administrator"); + return true; + } + World islandWorld = plugin.worldGenerator().loadIslandWorld(island.worldName()); + if (islandWorld == null) { + player.sendRichMessage("Could not load your islandWorld. Contact an administrator"); + return true; + } + player.teleportAsync(islandWorld.getSpawnLocation()); + return true; + } + player.sendRichMessage("Generating a new island..."); plugin.worldGenerator().createNewIslandWorld(result -> { World world = Bukkit.getWorld(result); if (world == null) { plugin.getLogger().warning("Failed to create world " + result); return; } - - Island.IslandBuilder islandBuilder = new Island.IslandBuilder(world.getUID(), world.getName()); - plugin.islandManager().addIsland(player.getWorld().getUID(), islandBuilder.build()); - + int id; + try { + id = Integer.parseInt(result.substring(result.lastIndexOf('-') + 1).trim()); + } catch (NumberFormatException exception) { + id = plugin.islandManager().getLastID(); + plugin.getLogger().warning("Caught a NumberFormatException while generating island for player " + player.getUniqueId()); + } + // TODO - builder patterns? + Island island = Island.getIsland(world.getUID()); + island.owner(player.getUniqueId()); + island.worldName(world.getName()); + island.level(0); + islandPlayer.islandOwner(true); + islandPlayer.islandUUID(island.islandUUID()); + islandPlayer.islandId(id); player.teleportAsync(world.getSpawnLocation()); }); return true; diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandSetOwner.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandSetOwner.java index b1713f0..5b2a69f 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandSetOwner.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandSetOwner.java @@ -2,7 +2,10 @@ package com.alttd.cometskyblock.commands.island; import com.alttd.cometskyblock.CometSkyBlockPlugin; import com.alttd.cometskyblock.commands.PlayerSubCommand; +import com.alttd.cometskyblock.island.Island; import com.alttd.cometskyblock.island.IslandPlayer; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; public class IslandSetOwner extends PlayerSubCommand { @@ -10,9 +13,38 @@ public class IslandSetOwner extends PlayerSubCommand { public IslandSetOwner(CometSkyBlockPlugin plugin) { super(plugin, "setowner"); } - + // TODO - complete IslandSetOwnerCommand @Override public boolean execute(Player player, IslandPlayer islandPlayer, String[] args) { + if (args.length < 1) { + // Wrong usage + return true; + } + if (!islandPlayer.islandOwner()) { + // You must be island owner to do this command. + return true; + } + Player target = Bukkit.getPlayer(args[0]); + if (target == null) { + // Target is not online + return true; + } + if (target == player) { + // You are already the island owner. + return true; + } + Island island = Island.getIsland(islandPlayer.islandUUID()); + if (island == null) { + // Could not load island, contact administrator + return true; + } +// if (!island.members().contains(target.getUniqueId())) { +// // Target must be a member of your island +// return true; +// } + island.owner(target.getUniqueId()); + islandPlayer.islandOwner(false); + IslandPlayer.getIslandPlayer(target.getUniqueId()).islandOwner(true); return true; } } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandSethome.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandSethome.java index 4b0080b..b2c035c 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandSethome.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandSethome.java @@ -11,11 +11,23 @@ public class IslandSethome extends PlayerSubCommand { public IslandSethome(CometSkyBlockPlugin plugin) { super(plugin, "sethome"); } - + // TODO -- Finish sethome command @Override public boolean execute(Player player, IslandPlayer islandPlayer, String[] args) { MessageConfiguration.Commands.Island.SetHome setHome = plugin.messagesConfiguration().get().commands().island().setHome(); - + if (!islandPlayer.islandOwner()) { + // You must be island owner to do this command. + return true; + } + if (!player.getWorld().getUID().equals(islandPlayer.islandUUID())) { + // You must be on your island to use this command. + return true; + } + if (player.getFallDistance() > 0 || player.isFlying()) { + // You can't use this command when falling + return true; + } + player.getWorld().setSpawnLocation(player.getLocation()); return true; } } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandTop.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandTop.java index 210c436..33f02ed 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandTop.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandTop.java @@ -10,7 +10,7 @@ public class IslandTop extends PlayerSubCommand { public IslandTop(CometSkyBlockPlugin plugin) { super(plugin, "top"); } - + // TODO - Finish TOP command @Override public boolean execute(Player player, IslandPlayer islandPlayer, String[] args) { return true; diff --git a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandVisit.java b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandVisit.java index d3413a3..ab843d9 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandVisit.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/commands/island/IslandVisit.java @@ -2,7 +2,11 @@ package com.alttd.cometskyblock.commands.island; import com.alttd.cometskyblock.CometSkyBlockPlugin; import com.alttd.cometskyblock.commands.PlayerSubCommand; +import com.alttd.cometskyblock.island.Island; import com.alttd.cometskyblock.island.IslandPlayer; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.World; import org.bukkit.entity.Player; public class IslandVisit extends PlayerSubCommand { @@ -11,8 +15,42 @@ public class IslandVisit extends PlayerSubCommand { super(plugin, "visit"); } + // TODO -- finish IslandVisitCommand and Request @Override public boolean execute(Player player, IslandPlayer islandPlayer, String[] args) { + if (args.length < 1) { + // send usage + return true; + } + Player target = Bukkit.getPlayer(args[0]); + if (player == target) { + // can't visit self + return true; + } + if (target == null) { + // target offline + return true; + } + IslandPlayer islandPlayer1 = IslandPlayer.getIslandPlayer(target.getUniqueId()); + if (islandPlayer1.islandId() == 0) { + // target does not have an island + return true; + } + Island island = Island.getIsland(islandPlayer1.islandUUID()); + if (island == null) { + // failed to load island + return true; + } + if (island.visitNeedsRequest()) { + // send request + return true; + } + World islandWorld = plugin.worldGenerator().loadIslandWorld(island.worldName()); + if (islandWorld == null) { + // could not load world + return true; + } + player.teleportAsync(islandWorld.getSpawnLocation()); return true; } } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/configuration/IslandConfiguration.java b/plugin/src/main/java/com/alttd/cometskyblock/configuration/IslandConfiguration.java index 1568296..f99eb86 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/configuration/IslandConfiguration.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/configuration/IslandConfiguration.java @@ -1,6 +1,7 @@ package com.alttd.cometskyblock.configuration; import com.alttd.cometskyblock.island.Island; +import com.alttd.cometskyblock.island.IslandPlayer; import lombok.Getter; import org.spongepowered.configurate.objectmapping.ConfigSerializable; @@ -12,10 +13,10 @@ import java.util.UUID; @SuppressWarnings({"CanBeFinal", "FieldMayBeFinal"}) public class IslandConfiguration implements Configuration { - private int id; - @Getter private Map islands; + @Getter int id; public int getAndIncrementId() { - return id = id + 1; + id++; + return id; } } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/island/Island.java b/plugin/src/main/java/com/alttd/cometskyblock/island/Island.java index fe675c9..89bd55f 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/island/Island.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/island/Island.java @@ -1,77 +1,153 @@ package com.alttd.cometskyblock.island; +import com.alttd.cometskyblock.CometSkyBlockPlugin; import lombok.Getter; -import lombok.Setter; -import org.spongepowered.configurate.objectmapping.ConfigSerializable; +import org.bukkit.configuration.file.YamlConfiguration; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; -@ConfigSerializable -@Getter -public class Island { +public class Island extends YamlConfiguration { - protected UUID worldId; - protected String worldName; - protected String islandName; - @Setter protected int level; - @Setter protected UUID owner; - protected final List members = new ArrayList<>(); + private static final Map configs = new HashMap<>(); + public static final UUID NILL_UUID = new UUID(0L, 0L); + + public static Island getIsland(UUID uuid) { + synchronized (configs) { + return configs.computeIfAbsent(uuid, k -> new Island(uuid)); + } + } + + public static void remove(UUID uuid) { + synchronized (configs) { + configs.remove(uuid); + } + } + + public static void removeAll() { + synchronized (configs) { + configs.clear(); + } + } + + private final File file; + private final Object saveLock = new Object(); + @Getter private final UUID islandUUID; + + private Island(UUID uuid) { + super(); + this.islandUUID = uuid; + this.file = new File(CometSkyBlockPlugin.instance().getDataFolder(), "IslandData" + File.separator + uuid + ".yml"); + reload(); + } + + private void reload() { + synchronized (saveLock) { + try { + load(file); + } catch (Exception ignore) { + } + } + } + + private void save() { + synchronized (saveLock) { + try { + save(file); + } catch (Exception ignore) { + } + } + } + + public int islandId() { + return getInt("island.id", 0); + } + + public void islandId(int id) { + set("island.id", id); + save(); + } + + public String worldName() { + return getString("island.worldname"); + } + + public void worldName(String worldName) { + set("island.worldname", worldName); + save(); + } + + public String islandName() { + return getString("island.islandname"); + } + + public void islandName(String islandName) { + set("island.islandname", islandName); + save(); + } + + public int level() { + return getInt("island.id", 0); + } + + public void level(int id) { + set("island.level", id); + save(); + } + + public UUID owner() { + String string = getString("island.owner"); + if (string == null || string.isEmpty()) + return NILL_UUID; + + return UUID.fromString(string); + } + + public void owner(UUID uuid) { + set("island.owner", uuid.toString()); + save(); + } + + public List members() { + List members = getStringList("island.members"); + return members.stream() + .map(this::stringToUUID) + .collect(Collectors.toList()); + } + + public void members(List members) { + set("island.members", members.stream() + .map(uuid -> uuid == null ? "null" : uuid.toString()) + .collect(Collectors.toList())); + } + + private String uuidToString(UUID uuid) { + return (uuid == null ? NILL_UUID : uuid).toString(); + } + + private UUID stringToUUID(String s) { + return s == null || s.isEmpty() ? NILL_UUID : UUID.fromString(s); + } public boolean canBuild(UUID uuid) { - return owner.equals(uuid) || members.contains(uuid); + return owner().equals(uuid) || members().contains(uuid); } - public boolean addMember(UUID uuid) { - return this.members.add(uuid); + public void addMember(UUID uuid) { + List list = members(); + list.add(uuid); + members(list); } - public boolean removeMember(UUID uuid) { - return this.members.remove(uuid); + public void removeMember(UUID uuid) { + List list = members(); + list.remove(uuid); + members(list); } - public static class IslandBuilder extends Island { - private final UUID worldUUID; - private final String worldName; - private String islandName; - private int level; - private UUID owner; - private final List members = new ArrayList<>(); - - public IslandBuilder(UUID worldUUID, String worldName) { - this.worldUUID = worldUUID; - this.worldName = worldName; - } - - public IslandBuilder islandName(String islandName) { - this.islandName = islandName; - return this; - } - - public IslandBuilder level(int level) { - this.level = level; - return this; - } - - public IslandBuilder owner(UUID owner) { - this.owner = owner; - return this; - } - public IslandBuilder members(List members) { - this.members.addAll(members); - return this; - } - - public Island build() { - Island island = new Island(); - island.worldId = this.worldUUID; - island.worldName = this.worldName; - island.islandName = this.islandName; - island.level = this.level; - island.owner = this.owner; - island.members.addAll(this.members); - return island; - } + // TODO - Island settings + public boolean visitNeedsRequest() { + return true; } } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/island/IslandPlayer.java b/plugin/src/main/java/com/alttd/cometskyblock/island/IslandPlayer.java index 91310c7..83da4f8 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/island/IslandPlayer.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/island/IslandPlayer.java @@ -1,21 +1,91 @@ package com.alttd.cometskyblock.island; -import lombok.Getter; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.spongepowered.configurate.objectmapping.ConfigSerializable; +import com.alttd.cometskyblock.CometSkyBlockPlugin; +import org.bukkit.configuration.file.YamlConfiguration; +import java.io.File; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; -@Getter -@ConfigSerializable -public class IslandPlayer { - private UUID playerId; - private final int islandId = 0; - private final boolean isOwner = false; +public class IslandPlayer extends YamlConfiguration { - public Player getPlayer() { - return playerId != null ? Bukkit.getPlayer(playerId) : null; + private static final Map configs = new HashMap<>(); + + public static IslandPlayer getIslandPlayer(UUID uuid) { + synchronized (configs) { + return configs.computeIfAbsent(uuid, k -> new IslandPlayer(uuid)); + } + } + + public static void remove(UUID uuid) { + synchronized (configs) { + configs.remove(uuid); + } + } + + public static void removeAll() { + synchronized (configs) { + configs.clear(); + } + } + + private final File file; + private final Object saveLock = new Object(); + + private IslandPlayer(UUID uuid) { + super(); + this.file = new File(CometSkyBlockPlugin.instance().getDataFolder(), "PlayerData" + File.separator + uuid + ".yml"); + reload(); + } + + private void reload() { + synchronized (saveLock) { + try { + load(file); + } catch (Exception ignore) { + } + } + } + + private void save() { + synchronized (saveLock) { + try { + save(file); + } catch (Exception ignore) { + } + } + } + + public UUID islandUUID() { + String string = getString("island.uuid"); + if (string == null || string.isEmpty()) + return Island.NILL_UUID; + + return UUID.fromString(string); + } + + public void islandUUID(UUID uuid) { + set("island.uuid", uuid.toString()); + save(); + } + + public int islandId() { + return getInt("island.id", 0); + } + + public void islandId(int id) { + set("island.id", id); + save(); + } + + public boolean islandOwner() { + return getBoolean("island.is-owner", false); + } + + public void islandOwner(boolean owner) { + set("island.is-owner", owner); + save(); } } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/listeners/BedListener.java b/plugin/src/main/java/com/alttd/cometskyblock/listeners/BedListener.java index 58044ad..cd3747a 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/listeners/BedListener.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/listeners/BedListener.java @@ -2,6 +2,7 @@ package com.alttd.cometskyblock.listeners; import com.alttd.cometskyblock.CometSkyBlockPlugin; import com.alttd.cometskyblock.island.Island; +import com.alttd.cometskyblock.island.IslandPlayer; import com.destroystokyo.paper.MaterialTags; import org.bukkit.GameRule; import org.bukkit.World; @@ -21,14 +22,20 @@ public class BedListener implements Listener { this.plugin = plugin; } - @EventHandler + @EventHandler(ignoreCancelled = true) public void onBedPlace(BlockPlaceEvent event) { if (!MaterialTags.BEDS.isTagged(event.getBlockPlaced())) { return; } Player player = event.getPlayer(); World world = player.getWorld(); - Island island = plugin.islandManager().getIsland(world); + IslandPlayer islandPlayer = IslandPlayer.getIslandPlayer(player.getUniqueId()); + if (!world.getUID().equals(islandPlayer.islandUUID())) { + event.setCancelled(true); + return; + } + + Island island = Island.getIsland(world.getUID()); if (island == null) { return; } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/managers/IslandManager.java b/plugin/src/main/java/com/alttd/cometskyblock/managers/IslandManager.java index 42342e7..2d221f4 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/managers/IslandManager.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/managers/IslandManager.java @@ -3,45 +3,31 @@ package com.alttd.cometskyblock.managers; import com.alttd.cometskyblock.CometSkyBlockPlugin; import com.alttd.cometskyblock.configuration.ConfigurationContainer; import com.alttd.cometskyblock.configuration.IslandConfiguration; -import com.alttd.cometskyblock.island.Island; -import org.bukkit.World; -import org.slf4j.Logger; import java.io.File; import java.nio.file.Path; -import java.util.HashMap; -import java.util.UUID; public class IslandManager { private final CometSkyBlockPlugin plugin; - ConfigurationContainer islands; + // TODO - move all storage data to another system - SQL / flatfile + // This loader is not made for constant saves and loads + ConfigurationContainer islandData; public IslandManager(CometSkyBlockPlugin plugin) { this.plugin = plugin; - - Path path = new File(plugin.getDataFolder(), "IslandData").toPath(); - islands = ConfigurationContainer.load(plugin.getSLF4JLogger(), path, IslandConfiguration.class, "islands"); - } - - public Island getIsland(World world) { - return getIsland(world.getUID()); - } - - public Island getIsland(UUID uuid) { - return islands.get().islands().get(uuid); - } - - public void addIsland(UUID uuid, Island island) { - islands.get().islands().put(uuid, island); - islands.save(); + islandData = ConfigurationContainer.load(plugin.getSLF4JLogger(), plugin.getDataFolder().toPath(), IslandConfiguration.class, "islands"); } public int getNextId() { - int id = islands.get().getAndIncrementId(); - islands.save(); + int id = islandData.get().getAndIncrementId(); + islandData.save(); return id; } + public int getLastID() { + return islandData.get().id(); + } + } diff --git a/plugin/src/main/java/com/alttd/cometskyblock/worldgenerator/IslandGenerator.java b/plugin/src/main/java/com/alttd/cometskyblock/worldgenerator/IslandGenerator.java index 7a6a17f..af1f738 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/worldgenerator/IslandGenerator.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/worldgenerator/IslandGenerator.java @@ -60,7 +60,7 @@ public class IslandGenerator extends BlockPopulator { // try to add a tree if (limitedRegion.isInRegion(startX + treeX, startY + 1, startX + treeZ)) { - Location location = new Location(null, startX + treeX, startY + 1, startX + treeZ); + Location location = new Location(null, startX + treeX, limitedRegion.getHighestBlockYAt(startX + treeX, startX + treeZ), startX + treeZ); // Force air above to clear any flora preventing tree from growing limitedRegion.setType(location.clone().add(0, +1, 0), Material.AIR); // always set a dirt block under the tree location diff --git a/plugin/src/main/java/com/alttd/cometskyblock/worldgenerator/MasterWorldGenerator.java b/plugin/src/main/java/com/alttd/cometskyblock/worldgenerator/MasterWorldGenerator.java index b132788..c69e771 100644 --- a/plugin/src/main/java/com/alttd/cometskyblock/worldgenerator/MasterWorldGenerator.java +++ b/plugin/src/main/java/com/alttd/cometskyblock/worldgenerator/MasterWorldGenerator.java @@ -5,6 +5,11 @@ import com.alttd.cometskyblock.configuration.PluginConfiguration; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.WorldCreator; +import org.bukkit.WorldType; +import org.codehaus.plexus.util.FileUtils; + +import java.io.File; +import java.io.IOException; /** * This is the main island that will be used to create all the following islands for players. @@ -13,32 +18,30 @@ public class MasterWorldGenerator { CometSkyBlockPlugin plugin; public static final String WORLD_NAME = "CometSkyBlockWorld-"; + public static final String MASTER_WORLD_NAME = "CometSkyBlockMasterWorld"; public MasterWorldGenerator(CometSkyBlockPlugin plugin) { this.plugin = plugin; } - public void checkIslandWorld() { - if (plugin.getServer().getWorld(WORLD_NAME) == null) { - createNewIslandWorld(result -> { - plugin.getLogger().info(WORLD_NAME + " has been created"); - }); + public void checkMasterIslandWorld() { + if (plugin.getServer().getWorld(MASTER_WORLD_NAME) == null) { + createMasterIslandWorld(result -> + plugin.getLogger().info(MASTER_WORLD_NAME + " has been created") + ); } } - public void createNewIslandWorld(Callback callback) { - final int id = plugin.islandManager().getNextId(); + public void createMasterIslandWorld(Callback callback) { plugin.getServer().getScheduler().runTask(plugin, () -> { - WorldCreator worldCreator = new WorldCreator(WORLD_NAME.replace("", - id + "" - )); - worldCreator.generator(new CometIslandGenerator()); + WorldCreator worldCreator = new WorldCreator(MASTER_WORLD_NAME); + worldCreator.generator(new CometVoidGenerator()); worldCreator.environment(World.Environment.NORMAL); worldCreator.generateStructures(true); World world = worldCreator.createWorld(); if (world == null) { - plugin.getLogger().warning("Could not create CometSkyBlock MasterIslandWorld! Does the world(" + WORLD_NAME + ") already exist?"); + plugin.getLogger().warning("Could not create CometSkyBlock MasterIslandWorld! Does the world(" + MASTER_WORLD_NAME + ") already exist?"); return; } PluginConfiguration pluginConfiguration = plugin.pluginConfiguration().get(); @@ -47,12 +50,76 @@ public class MasterWorldGenerator { world.setAutoSave(true); world.setSpawnLocation(pluginConfiguration.worldGenerator().spawnX(), pluginConfiguration.worldGenerator().spawnY(), pluginConfiguration.worldGenerator().spawnz()); // TODO - // TODO Load a schematic into this world? + Bukkit.getScheduler().runTask(plugin, () -> callback.onQueryDone(MASTER_WORLD_NAME)); + }); + } + + public void createNewIslandWorld(Callback callback) { + final int id = plugin.islandManager().getNextId(); + plugin.getServer().getScheduler().runTask(plugin, () -> { + String worldName = WORLD_NAME.replace("", id + ""); + File dir = new File(plugin.getServer().getWorldContainer().getAbsolutePath(), worldName); + if (!dir.exists()) { + dir.mkdirs(); + + File source = new File(plugin.getServer().getWorldContainer().getAbsolutePath(), MASTER_WORLD_NAME); + + try { + FileUtils.copyDirectory(source, dir); + } catch (IOException e) { + e.printStackTrace(); + } + + + File[] files = dir.listFiles(); + for (File file : files) { + if (file.getName().equalsIgnoreCase("uid.dat") || file.getName().equalsIgnoreCase("session.lock")) { + file.delete(); + } + } + + WorldCreator worldCreator = new WorldCreator(worldName); + worldCreator.generator(new CometIslandGenerator()); + worldCreator.environment(World.Environment.NORMAL); + worldCreator.generateStructures(true); + World newIsland = worldCreator.createWorld(); + if (newIsland == null) { + return; + } + // TODO Load a schematic into this world? + // Currently random islands are generated by CometIslandGenerator() + plugin.getServer().getWorlds().add(newIsland); + PluginConfiguration pluginConfiguration = plugin.pluginConfiguration().get(); + newIsland.getWorldBorder().setCenter(pluginConfiguration.worldGenerator().centerX(), pluginConfiguration.worldGenerator().centerZ()); + newIsland.getWorldBorder().setSize(pluginConfiguration.worldGenerator().size()); + newIsland.setAutoSave(true); + newIsland.setSpawnLocation(pluginConfiguration.worldGenerator().spawnX(), pluginConfiguration.worldGenerator().spawnY(), pluginConfiguration.worldGenerator().spawnz()); // TODO + } else { + plugin.getLogger().severe("Folder already exists!"); + } Bukkit.getScheduler().runTask(plugin, () -> callback.onQueryDone(WORLD_NAME.replace("", id + ""))); }); } + public World loadIslandWorld(String islandName) { + World islandWorld = Bukkit.getWorld(islandName); + if (islandWorld != null) + return islandWorld; + + WorldCreator worldCreator = new WorldCreator(islandName); + worldCreator.generator(new CometIslandGenerator()); + worldCreator.environment(World.Environment.NORMAL); + worldCreator.generateStructures(true); + World newIsland = worldCreator.createWorld(); + if (newIsland == null) { + plugin.getLogger().warning("Failed to load world " + islandName); + return null; + } + + return newIsland; + } + public interface Callback { void onQueryDone(String result); }