From 35b98f5c3be6f7582402c4be21bb8e474dddfdeb Mon Sep 17 00:00:00 2001 From: Fabrizio La Rosa Date: Sat, 4 Jul 2020 10:48:23 +0200 Subject: [PATCH] Island whitelist --- .../commands/island/TeleportCommand.java | 6 ++- .../commands/island/VisitorsCommand.java | 3 -- .../com/songoda/skyblock/island/Island.java | 43 ++++++++++++++++--- .../skyblock/island/IslandManager.java | 6 +-- .../com/songoda/skyblock/listeners/Move.java | 2 +- .../songoda/skyblock/listeners/Teleport.java | 2 +- .../com/songoda/skyblock/menus/Visit.java | 6 ++- 7 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java index cb83a120..d5f6af4c 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java @@ -62,14 +62,18 @@ public class TeleportCommand extends SubCommand { if (visitManager.hasIsland(islandOwnerUUID)) { Visit visit = visitManager.getIsland(islandOwnerUUID); boolean isCoopPlayer = false; + boolean isWhitelistedPlayer = false; if (islandManager.containsIsland(islandOwnerUUID)) { if (islandManager.getIsland(Bukkit.getServer().getOfflinePlayer(islandOwnerUUID)).isCoopPlayer(player.getUniqueId())) { isCoopPlayer = true; } + if (islandManager.getIsland(Bukkit.getServer().getOfflinePlayer(islandOwnerUUID)).isPlayerWhitelisted(player.getUniqueId())) { + isWhitelistedPlayer = true; + } } - if (isCoopPlayer || player.hasPermission("fabledskyblock.bypass") || player.hasPermission("fabledskyblock.bypass.*") || player.hasPermission("fabledskyblock.*") || visit.isOpen()) { + if (isCoopPlayer || isWhitelistedPlayer || player.hasPermission("fabledskyblock.bypass") || player.hasPermission("fabledskyblock.bypass.*") || player.hasPermission("fabledskyblock.*") || visit.isOpen()) { if (!islandManager.containsIsland(islandOwnerUUID)) { islandManager.loadIsland(Bukkit.getServer().getOfflinePlayer(islandOwnerUUID)); } diff --git a/src/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java index 69949996..ffe3b492 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java @@ -30,9 +30,6 @@ public class VisitorsCommand extends SubCommand { if (island == null) { messageManager.sendMessage(player, configLoad.getString("Command.Island.Visitors.Owner.Message")); soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); - } else if (!island.isOpen()) { - messageManager.sendMessage(player, configLoad.getString("Command.Island.Visitors.Closed.Message")); - soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); } else if (islandManager.getVisitorsAtIsland(island).size() == 0) { messageManager.sendMessage(player, configLoad.getString("Command.Island.Visitors.Visitors.Message")); soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F); diff --git a/src/main/java/com/songoda/skyblock/island/Island.java b/src/main/java/com/songoda/skyblock/island/Island.java index 2340d574..30aceaed 100644 --- a/src/main/java/com/songoda/skyblock/island/Island.java +++ b/src/main/java/com/songoda/skyblock/island/Island.java @@ -10,7 +10,6 @@ import com.songoda.skyblock.config.FileManager; import com.songoda.skyblock.config.FileManager.Config; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.permission.BasicPermission; -import com.songoda.skyblock.permission.PermissionManager; import com.songoda.skyblock.playerdata.PlayerData; import com.songoda.skyblock.sound.SoundManager; import com.songoda.skyblock.upgrade.Upgrade; @@ -26,7 +25,6 @@ import org.bukkit.WeatherType; import org.bukkit.block.Biome; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; import java.io.File; import java.io.IOException; @@ -39,9 +37,10 @@ public class Island { private final SkyBlock skyblock; private final com.songoda.skyblock.api.island.Island apiWrapper; - private Map> islandPermissions = new HashMap<>(); - private List islandLocations = new ArrayList<>(); - private Map coopPlayers = new HashMap<>(); + private final Map> islandPermissions = new HashMap<>(); + private final List islandLocations = new ArrayList<>(); + private final Map coopPlayers = new HashMap<>(); + private final Set whitelistedPlayers = new HashSet<>(); private UUID islandUUID; private UUID ownerUUID; @@ -188,6 +187,12 @@ public class Island { islandPermissions.put(roleList, permissions); } + + if (configLoad.getString("Whitelist") != null) { + for (String whitelistedUUID : configLoad.getStringList("Whitelist")) { + whitelistedPlayers.add(UUID.fromString(whitelistedUUID)); + } + } } else { FileConfiguration configLoad = config.getFileConfiguration(); @@ -841,6 +846,8 @@ public class Island { Config config = fileManager .getConfig(new File(skyblock.getDataFolder().toString() + "/island-data", ownerUUID.toString() + ".yml")); + + config.getFileConfiguration().set("Whitelist", whitelistedPlayers); try { config.getFileConfiguration().save(config.getFile()); @@ -926,5 +933,31 @@ public class Island { public com.songoda.skyblock.api.island.Island getAPIWrapper() { return apiWrapper; } + + public void addWhitelistedPlayer(UUID uuid) { + this.whitelistedPlayers.add(uuid); + Bukkit.getScheduler().runTaskAsynchronously(skyblock, this::save); + } + + public boolean isPlayerWhitelisted(UUID uuid) { + return this.whitelistedPlayers.contains(uuid); + } + + public void removeWhitelistedPlayer(UUID uuid) { + this.whitelistedPlayers.remove(uuid); + Bukkit.getScheduler().runTaskAsynchronously(skyblock, this::save); + } + + public void addWhitelistedPlayer(Player player) { + this.addWhitelistedPlayer(player.getUniqueId()); + } + + public boolean isPlayerWhitelisted(Player player) { + return this.isPlayerWhitelisted(player.getUniqueId()); + } + + public void removeWhitelistedPlayer(Player player) { + this.removeWhitelistedPlayer(player.getUniqueId()); + } } diff --git a/src/main/java/com/songoda/skyblock/island/IslandManager.java b/src/main/java/com/songoda/skyblock/island/IslandManager.java index 627c2ac4..a631ab50 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandManager.java +++ b/src/main/java/com/songoda/skyblock/island/IslandManager.java @@ -1189,9 +1189,9 @@ public class IslandManager { islandOwnerPlayerName = islandOwnerPlayer.getName(); } - for (UUID visitorList : getVisitorsAtIsland(island)) { - if (!island.isCoopPlayer(visitorList)) { - Player targetPlayer = Bukkit.getServer().getPlayer(visitorList); + for (UUID visitor : getVisitorsAtIsland(island)) { + if (!island.isCoopPlayer(visitor) && !island.isPlayerWhitelisted(visitor)) { + Player targetPlayer = Bukkit.getServer().getPlayer(visitor); LocationUtil.teleportPlayerToSpawn(targetPlayer); messageManager.sendMessage(targetPlayer, configLoad.getString("Island.Visit.Closed.Island.Message").replace("%player", islandOwnerPlayerName)); } diff --git a/src/main/java/com/songoda/skyblock/listeners/Move.java b/src/main/java/com/songoda/skyblock/listeners/Move.java index df80784c..682ae6d0 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Move.java +++ b/src/main/java/com/songoda/skyblock/listeners/Move.java @@ -179,7 +179,7 @@ public class Move implements Listener { return; } - if(loadedIsland.isOpen()){ + if(loadedIsland.isOpen() || loadedIsland.isPlayerWhitelisted(player)){ loadedIsland.getVisit().addVisitor(player.getUniqueId()); return; } diff --git a/src/main/java/com/songoda/skyblock/listeners/Teleport.java b/src/main/java/com/songoda/skyblock/listeners/Teleport.java index 5b39d75f..faac4882 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Teleport.java +++ b/src/main/java/com/songoda/skyblock/listeners/Teleport.java @@ -98,7 +98,7 @@ public class Teleport implements Listener { if (island != null) { if (!island.getOwnerUUID().equals(playerData.getOwner())) { if (!player.hasPermission("fabledskyblock.bypass") && !player.hasPermission("fabledskyblock.bypass.*") && !player.hasPermission("fabledskyblock.*")) { - if (!island.isOpen() && !island.isCoopPlayer(player.getUniqueId())) { + if (!island.isOpen() && !island.isCoopPlayer(player.getUniqueId()) && !island.isPlayerWhitelisted(player)) { event.setCancelled(true); messageManager.sendMessage(player, configLoad.getString("Island.Visit.Closed.Plugin.Message")); diff --git a/src/main/java/com/songoda/skyblock/menus/Visit.java b/src/main/java/com/songoda/skyblock/menus/Visit.java index c8b30301..9cdc4a9a 100644 --- a/src/main/java/com/songoda/skyblock/menus/Visit.java +++ b/src/main/java/com/songoda/skyblock/menus/Visit.java @@ -145,6 +145,7 @@ public class Visit { if (visitManager.hasIsland(targetPlayerUUID)) { com.songoda.skyblock.visit.Visit visit = visitManager.getIsland(targetPlayerUUID); boolean isCoopPlayer = false; + boolean isWhitelistedPlayer = false; org.bukkit.OfflinePlayer offlinePlayer = Bukkit.getServer() .getOfflinePlayer(targetPlayerUUID); @@ -152,9 +153,12 @@ public class Visit { if (islandManager.getIsland(offlinePlayer).isCoopPlayer(player.getUniqueId())) { isCoopPlayer = true; } + if (islandManager.getIsland(offlinePlayer).isPlayerWhitelisted(player.getUniqueId())) { + isWhitelistedPlayer = true; + } } - if (isCoopPlayer || player.hasPermission("fabledskyblock.bypass") + if (isCoopPlayer || isWhitelistedPlayer || player.hasPermission("fabledskyblock.bypass") || player.hasPermission("fabledskyblock.bypass.*") || player.hasPermission("fabledskyblock.*") || visit.isOpen()) { if (!islandManager.containsIsland(targetPlayerUUID)) {