From 99de1ccf5bffe8cfd5deb67768352f9653fcc976 Mon Sep 17 00:00:00 2001 From: Brianna Date: Sat, 31 Aug 2019 11:45:06 -0400 Subject: [PATCH 01/45] Fix error on move event when not in an island world. --- .../src/main/java/com/songoda/skyblock/listeners/Move.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java index 2f1b11e0..9e877783 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java @@ -202,8 +202,7 @@ public class Move implements Listener { } // Load the island they are now on if one exists - if (player.hasPermission("fabledskyblock.bypass") - || islandManager.getIslandAtLocation(player.getLocation()).isAlwaysLoaded()) { + if (player.hasPermission("fabledskyblock.bypass")) { Island loadedIsland = islandManager.loadIslandAtLocation(player.getLocation()); if (loadedIsland != null) { playerData.setIsland(loadedIsland.getOwnerUUID()); @@ -211,6 +210,7 @@ public class Move implements Listener { } } + LocationUtil.teleportPlayerToSpawn(player); messageManager.sendMessage(player, From 18d52f1e33c320cb979c3dc69c2109fc243258a0 Mon Sep 17 00:00:00 2001 From: Brianna Date: Sun, 1 Sep 2019 12:46:51 -0400 Subject: [PATCH 02/45] Fix for proxy command while player is offline. --- .../command/commands/admin/ProxyCommand.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java index eb4201cc..e6056e90 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java @@ -41,31 +41,24 @@ public class ProxyCommand extends SubCommand { FileConfiguration configLoad = config.getFileConfiguration(); if (args.length == 1) { - Player targetPlayer = Bukkit.getServer().getPlayer(args[0]); - UUID islandOwnerUUID; - - if (targetPlayer == null) { - OfflinePlayer targetPlayerOffline = new OfflinePlayer(args[0]); - islandOwnerUUID = targetPlayerOffline.getOwner(); - } else { - islandOwnerUUID = playerDataManager.getPlayerData(targetPlayer).getOwner(); - } + OfflinePlayer targetPlayerOffline = new OfflinePlayer(args[0]); + UUID islandOwnerUUID = targetPlayerOffline.getOwner(); if (islandManager.containsIsland(islandOwnerUUID)) { if (islandManager.isPlayerProxyingAnotherPlayer(((Player)sender).getUniqueId())) { messageManager.sendMessage(sender, configLoad.getString("Command.Island.Admin.Proxy.IsOffPlayer.Message") - .replace("%player", targetPlayer.getName())); + .replace("%player", targetPlayerOffline.getName())); soundManager.playSound(sender, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); islandManager.removeProxyingPlayer(((Player)sender).getUniqueId()); } else { messageManager.sendMessage(sender, configLoad.getString("Command.Island.Admin.Proxy.IsOn.Message") - .replace("%player", targetPlayer.getName())); + .replace("%player", targetPlayerOffline.getName())); soundManager.playSound(sender, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); - islandManager.addProxiedPlayer(((Player)sender).getUniqueId(), targetPlayer.getUniqueId()); + islandManager.addProxiedPlayer(((Player)sender).getUniqueId(), targetPlayerOffline.getUniqueId()); } } } else if (args.length == 0){ From 0ef80b465fe281e6d5cc1d75817598005ca3db67 Mon Sep 17 00:00:00 2001 From: Brianna Date: Sun, 1 Sep 2019 12:51:16 -0400 Subject: [PATCH 03/45] Better island deletion. --- .../command/commands/admin/ProxyCommand.java | 1 - .../com/songoda/skyblock/island/IslandManager.java | 12 +++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java index e6056e90..df402076 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java @@ -31,7 +31,6 @@ public class ProxyCommand extends SubCommand { } public void onCommand(CommandSender sender, String[] args) { - PlayerDataManager playerDataManager = skyblock.getPlayerDataManager(); MessageManager messageManager = skyblock.getMessageManager(); IslandManager islandManager = skyblock.getIslandManager(); SoundManager soundManager = skyblock.getSoundManager(); diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java index 92b3a94a..419784b2 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java @@ -391,11 +391,12 @@ public class IslandManager { WorldManager worldManager = skyblock.getWorldManager(); // Delete island from world. - Bukkit.getScheduler().runTask(skyblock, () -> { - for (IslandWorld worldList : IslandWorld.getIslandWorlds()) { + long i = 0; + for (IslandWorld worldList : IslandWorld.getIslandWorlds()) { + Bukkit.getScheduler().runTaskLater(skyblock, () -> { org.bukkit.World world = worldManager.getWorld(worldList); Location location = island.getLocation(worldList, IslandEnvironment.Island); - if (location == null) continue; + if (location == null) return; int size = island.getSize(); int xx = location.getBlockX() - size / 2; int zz = location.getBlockZ() - size / 2; @@ -406,8 +407,9 @@ public class IslandManager { } } } - } - }); + }, i); + i += 20L; + } skyblock.getVisitManager().deleteIsland(island.getOwnerUUID()); skyblock.getBanManager().deleteIsland(island.getOwnerUUID()); From e5a7d412126ac487938fe4566a5cc02eca0fe559 Mon Sep 17 00:00:00 2001 From: jascotty2 Date: Wed, 4 Sep 2019 14:16:57 -0500 Subject: [PATCH 04/45] fix event registration issue for PlayerIslandLeaveEvent --- .../skyblock/api/event/player/PlayerIslandLeaveEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java index d76aede0..f0dc0ca3 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java @@ -20,7 +20,7 @@ public class PlayerIslandLeaveEvent extends PlayerEvent implements Cancellable { return HANDLERS; } - public HandlerList getHandlerList() { + public static HandlerList getHandlerList() { return HANDLERS; } From f16b63792ec2956f04bf6abab7fdf9569a0262b4 Mon Sep 17 00:00:00 2001 From: Lilac Date: Mon, 9 Sep 2019 22:07:44 +0100 Subject: [PATCH 05/45] Fixed portals & end portal frames --- .gitlab-ci.yml | 2 +- .../src/main/java/com/songoda/skyblock/listeners/Block.java | 3 +++ .../src/main/java/com/songoda/skyblock/listeners/Interact.java | 3 ++- .../src/main/java/com/songoda/skyblock/listeners/Portal.java | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 27371dec..7c264dd8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "Build-79" + version: "Build-79.1" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Block.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Block.java index be37fedc..74ef049b 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -250,6 +250,9 @@ public class Block implements Listener { if (!configLoad.getBoolean("Island.Block.Level.Enable")) return; + if (event.getBlock().getType() == Materials.END_PORTAL_FRAME.parseMaterial() + && event.getPlayer().getItemInHand().getType() == Materials.ENDER_EYE.parseMaterial()) return; + // Fix a bug in Paper 1.8.8 when using ViaVersion on a 1.12.2 client. // BUG: Player can infinitely increase their level by placing a block at their feet. // It doesn't take the block away but still increments the level. diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Interact.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Interact.java index 3bf65e92..fd4381c0 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Interact.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Interact.java @@ -44,7 +44,6 @@ import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import java.io.File; -import java.util.Set; public class Interact implements Listener { @@ -514,6 +513,7 @@ public class Interact implements Listener { } ItemStack is = event.getPlayer().getItemInHand(); + boolean hasEye = ((block.getData() >> 2) & 1) == 1; if (is == null || is.getType() == Material.AIR) { if (stackableManager != null && stackableManager.isStacked(block.getLocation())) { @@ -528,6 +528,7 @@ public class Interact implements Listener { } player.getInventory().addItem(new ItemStack(Materials.END_PORTAL_FRAME.parseMaterial(), 1)); + if (hasEye) player.getInventory().addItem(new ItemStack(Materials.ENDER_EYE.parseMaterial(), 1)); player.updateInventory(); FileManager.Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Portal.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Portal.java index ce76b623..1c0df2d7 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Portal.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Portal.java @@ -122,7 +122,7 @@ public class Portal implements Listener { } else if (System.currentTimeMillis() - tick.getLast() >= 1000) { tick.setLast(System.currentTimeMillis()); } - if (tick.getTick() >= 300) { + if (tick.getTick() >= 100) { messageManager.sendMessage(player, fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() .getString("Island.Portal.Stuck.Message")); From 9e7618d5e6b02861de67987e76d4f8e050a6f72a Mon Sep 17 00:00:00 2001 From: Lilac Date: Sun, 15 Sep 2019 19:04:15 +0100 Subject: [PATCH 06/45] Fixed disabling fly & losing items in void --- .gitlab-ci.yml | 2 +- .../main/java/com/songoda/skyblock/island/IslandManager.java | 4 +++- .../src/main/java/com/songoda/skyblock/listeners/Move.java | 2 +- FabledSkyBlock/Core/src/main/resources/config.yml | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7c264dd8..31277799 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "Build-79.1" + version: "Build-79.2" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java index 419784b2..36d6c187 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java @@ -1223,7 +1223,9 @@ public class IslandManager { } public void updateFlight(Player player) { - if (player.getGameMode() == GameMode.CREATIVE) + // The player can fly in other worlds if they are in creative or have another plugin's fly permission. + if (player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR + || player.hasPermission("essentials.fly") || player.hasPermission("cmi.command.fly")) return; Island island = getIslandAtLocation(player.getLocation()); diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java index 9e877783..23e4b02d 100644 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java +++ b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java @@ -142,7 +142,7 @@ public class Move implements Listener { if (configLoad.getBoolean("Island.Void.Teleport.Enable")) { if (to.getY() <= configLoad.getInt("Island.Void.Teleport.Offset")) { - if (!keepItemsOnDeath) { + if (configLoad.getBoolean("Island.Void.Teleport.ClearInventory")) { player.getInventory().clear(); player.setLevel(0); player.setExp(0.0F); diff --git a/FabledSkyBlock/Core/src/main/resources/config.yml b/FabledSkyBlock/Core/src/main/resources/config.yml index abce839a..740ccf21 100644 --- a/FabledSkyBlock/Core/src/main/resources/config.yml +++ b/FabledSkyBlock/Core/src/main/resources/config.yml @@ -210,6 +210,8 @@ Island: Island: true # The Y position that the player is teleported when reached. Offset: 30 + # When enabled, the players inventory and XP will be cleared when they fall off of the Island. + ClearInventory: false Block: Obsidian: # When enabled, players can right-click an obsidian block to retrieve lava at an Island. From 43d31880ec0e33c41f477f9021980cbc8759425f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 21 Sep 2019 23:29:52 -0600 Subject: [PATCH 07/45] Restructured the Gradle --- .classpath | 150 +++ .project | 22 + FabledSkyBlock/Core/build.gradle | 65 -- .../com/songoda/skyblock/utils/Metrics.java | 692 ----------- FabledSkyBlock/Legacy/build.gradle | 3 - .../levelling/LegacyChunkSnapshotFetcher.java | 13 - build.gradle | 131 ++- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 6 +- gradlew.bat | 2 +- settings.gradle | 8 +- .../java/com/songoda/skyblock/SkyBlock.java | 0 .../com/songoda/skyblock/api/SkyBlockAPI.java | 0 .../com/songoda/skyblock/api/ban/Ban.java | 0 .../skyblock/api/biome/BiomeManager.java | 0 .../api/event/island/IslandBanEvent.java | 0 .../event/island/IslandBiomeChangeEvent.java | 0 .../api/event/island/IslandCreateEvent.java | 0 .../api/event/island/IslandDeleteEvent.java | 0 .../api/event/island/IslandEvent.java | 0 .../api/event/island/IslandInviteEvent.java | 0 .../api/event/island/IslandKickEvent.java | 0 .../event/island/IslandLevelChangeEvent.java | 0 .../api/event/island/IslandLoadEvent.java | 0 .../island/IslandLocationChangeEvent.java | 0 .../island/IslandMessageChangeEvent.java | 0 .../api/event/island/IslandOpenEvent.java | 0 .../island/IslandOwnershipTransferEvent.java | 0 .../island/IslandPasswordChangeEvent.java | 0 .../event/island/IslandRoleChangeEvent.java | 0 .../api/event/island/IslandUnbanEvent.java | 0 .../api/event/island/IslandUnloadEvent.java | 0 .../api/event/island/IslandUpgradeEvent.java | 0 .../island/IslandWeatherChangeEvent.java | 0 .../api/event/player/PlayerEvent.java | 0 .../event/player/PlayerIslandChatEvent.java | 0 .../player/PlayerIslandChatSwitchEvent.java | 0 .../event/player/PlayerIslandEnterEvent.java | 0 .../event/player/PlayerIslandExitEvent.java | 0 .../event/player/PlayerIslandJoinEvent.java | 0 .../event/player/PlayerIslandLeaveEvent.java | 0 .../event/player/PlayerIslandSwitchEvent.java | 0 .../player/PlayerWithdrawMoneyEvent.java | 0 .../skyblock/api/invite/IslandInvitation.java | 0 .../songoda/skyblock/api/island/Island.java | 0 .../api/island/IslandBorderColor.java | 0 .../api/island/IslandEnvironment.java | 0 .../skyblock/api/island/IslandLevel.java | 0 .../skyblock/api/island/IslandLocation.java | 0 .../skyblock/api/island/IslandManager.java | 0 .../skyblock/api/island/IslandMessage.java | 0 .../skyblock/api/island/IslandRole.java | 0 .../skyblock/api/island/IslandSetting.java | 0 .../skyblock/api/island/IslandUpgrade.java | 0 .../skyblock/api/island/IslandWorld.java | 0 .../api/levelling/LevellingManager.java | 0 .../skyblock/api/structure/Structure.java | 0 .../api/structure/StructureManager.java | 0 .../songoda/skyblock/api/utils/APIUtil.java | 0 .../com/songoda/skyblock/api/visit/Visit.java | 0 .../java/com/songoda/skyblock/ban/Ban.java | 0 .../com/songoda/skyblock/ban/BanManager.java | 0 .../songoda/skyblock/biome/BiomeManager.java | 0 .../skyblock/command/CommandManager.java | 0 .../songoda/skyblock/command/SubCommand.java | 0 .../command/commands/SkyBlockCommand.java | 0 .../commands/admin/AddUpgradeCommand.java | 0 .../command/commands/admin/CreateCommand.java | 0 .../command/commands/admin/DeleteCommand.java | 0 .../commands/admin/GeneratorCommand.java | 0 .../command/commands/admin/LevelCommand.java | 0 .../commands/admin/LevelScanCommand.java | 0 .../command/commands/admin/OwnerCommand.java | 0 .../command/commands/admin/ProxyCommand.java | 0 .../admin/RefreshHologramsCommand.java | 0 .../command/commands/admin/ReloadCommand.java | 0 .../commands/admin/RemoveHologramCommand.java | 0 .../commands/admin/RemoveUpgradeCommand.java | 0 .../admin/SetAlwaysLoadedCommand.java | 0 .../commands/admin/SetBiomeCommand.java | 0 .../commands/admin/SetHologramCommand.java | 0 .../commands/admin/SetSizeCommand.java | 0 .../commands/admin/SetSpawnCommand.java | 0 .../commands/admin/SettingsCommand.java | 0 .../commands/admin/StructureCommand.java | 0 .../commands/admin/UpgradeCommand.java | 0 .../commands/island/AcceptCommand.java | 0 .../command/commands/island/BanCommand.java | 0 .../command/commands/island/BankCommand.java | 0 .../command/commands/island/BansCommand.java | 0 .../command/commands/island/BiomeCommand.java | 0 .../commands/island/BorderCommand.java | 0 .../commands/island/CancelCommand.java | 0 .../command/commands/island/ChatCommand.java | 0 .../command/commands/island/CloseCommand.java | 0 .../commands/island/ConfirmCommand.java | 0 .../commands/island/ControlPanelCommand.java | 0 .../command/commands/island/CoopCommand.java | 0 .../commands/island/CreateCommand.java | 0 .../commands/island/CurrentCommand.java | 0 .../commands/island/DeleteCommand.java | 0 .../commands/island/DemoteCommand.java | 0 .../command/commands/island/DenyCommand.java | 0 .../commands/island/InformationCommand.java | 0 .../commands/island/InviteCommand.java | 0 .../commands/island/KickAllCommand.java | 0 .../command/commands/island/KickCommand.java | 0 .../commands/island/LeaderboardCommand.java | 0 .../command/commands/island/LeaveCommand.java | 0 .../command/commands/island/LevelCommand.java | 0 .../commands/island/MembersCommand.java | 0 .../command/commands/island/OpenCommand.java | 0 .../command/commands/island/OwnerCommand.java | 0 .../commands/island/PromoteCommand.java | 0 .../commands/island/PublicCommand.java | 0 .../commands/island/SetSpawnCommand.java | 0 .../commands/island/SettingsCommand.java | 0 .../commands/island/TeleportCommand.java | 0 .../command/commands/island/UnbanCommand.java | 0 .../commands/island/UnlockCommand.java | 0 .../commands/island/UpgradeCommand.java | 0 .../command/commands/island/ValueCommand.java | 0 .../command/commands/island/VisitCommand.java | 0 .../commands/island/VisitorsCommand.java | 0 .../command/commands/island/VoteCommand.java | 0 .../commands/island/WeatherCommand.java | 0 .../island/disabled/ResetCommand.java | 0 .../island/disabled/RollbackCommand.java | 0 .../songoda/skyblock/config/FileChecker.java | 0 .../songoda/skyblock/config/FileManager.java | 0 .../skyblock/confirmation/Confirmation.java | 0 .../confirmation/ConfirmationTask.java | 0 .../songoda/skyblock/cooldown/Cooldown.java | 0 .../skyblock/cooldown/CooldownManager.java | 0 .../skyblock/cooldown/CooldownPlayer.java | 0 .../skyblock/cooldown/CooldownTask.java | 0 .../skyblock/cooldown/CooldownType.java | 0 .../skyblock/economy/EconomyManager.java | 0 .../songoda/skyblock/generator/Generator.java | 0 .../skyblock/generator/GeneratorManager.java | 0 .../skyblock/generator/GeneratorMaterial.java | 0 .../songoda/skyblock/hologram/Hologram.java | 0 .../skyblock/hologram/HologramManager.java | 0 .../skyblock/hologram/HologramType.java | 0 .../com/songoda/skyblock/invite/Invite.java | 0 .../skyblock/invite/InviteManager.java | 0 .../songoda/skyblock/invite/InviteTask.java | 0 .../com/songoda/skyblock/island/Island.java | 0 .../songoda/skyblock/island/IslandCoop.java | 0 .../skyblock/island/IslandEnvironment.java | 0 .../songoda/skyblock/island/IslandLevel.java | 0 .../skyblock/island/IslandLocation.java | 0 .../skyblock/island/IslandManager.java | 0 .../skyblock/island/IslandMessage.java | 0 .../skyblock/island/IslandPosition.java | 0 .../songoda/skyblock/island/IslandRole.java | 0 .../skyblock/island/IslandSetting.java | 0 .../songoda/skyblock/island/IslandWorld.java | 0 .../skyblock/leaderboard/Leaderboard.java | 0 .../leaderboard/LeaderboardManager.java | 0 .../leaderboard/LeaderboardPlayer.java | 0 .../skyblock/leaderboard/LeaderboardTask.java | 0 .../leaderboard/leaderheads/TopBank.java | 0 .../leaderboard/leaderheads/TopLevel.java | 0 .../leaderboard/leaderheads/TopVotes.java | 0 .../com/songoda/skyblock/levelling/Chunk.java | 0 .../skyblock/levelling/ChunkPosition.java | 0 .../levelling/ChunkSnapshotWrapper.java | 0 .../levelling/LegacyChunkSnapshotData.java | 0 .../levelling/LegacyChunkSnapshotFetcher.java | 13 + .../levelling/LevelChunkSnapshotWrapper.java | 0 .../skyblock/levelling/LevellingManager.java | 0 .../skyblock/levelling/LevellingMaterial.java | 0 .../WildStackerChunkSnapshotWrapper.java | 0 .../songoda/skyblock/limit/LimitManager.java | 0 .../com/songoda/skyblock/listeners/Block.java | 0 .../songoda/skyblock/listeners/Bucket.java | 0 .../com/songoda/skyblock/listeners/Chat.java | 0 .../com/songoda/skyblock/listeners/Death.java | 0 .../songoda/skyblock/listeners/Entity.java | 0 .../skyblock/listeners/EpicSpawners.java | 0 .../com/songoda/skyblock/listeners/Food.java | 0 .../songoda/skyblock/listeners/Interact.java | 0 .../songoda/skyblock/listeners/Inventory.java | 0 .../com/songoda/skyblock/listeners/Item.java | 0 .../com/songoda/skyblock/listeners/Join.java | 0 .../com/songoda/skyblock/listeners/Move.java | 0 .../songoda/skyblock/listeners/Portal.java | 0 .../skyblock/listeners/Projectile.java | 0 .../com/songoda/skyblock/listeners/Quit.java | 0 .../songoda/skyblock/listeners/Respawn.java | 0 .../songoda/skyblock/listeners/Spawner.java | 0 .../songoda/skyblock/listeners/Teleport.java | 0 .../skyblock/listeners/UltimateStacker.java | 0 .../skyblock/listeners/WildStacker.java | 0 .../java/com/songoda/skyblock/menus/Bans.java | 0 .../com/songoda/skyblock/menus/Biome.java | 0 .../com/songoda/skyblock/menus/Border.java | 0 .../songoda/skyblock/menus/ControlPanel.java | 0 .../java/com/songoda/skyblock/menus/Coop.java | 0 .../com/songoda/skyblock/menus/Creator.java | 0 .../songoda/skyblock/menus/Information.java | 0 .../songoda/skyblock/menus/Leaderboard.java | 0 .../com/songoda/skyblock/menus/Levelling.java | 0 .../com/songoda/skyblock/menus/Members.java | 0 .../com/songoda/skyblock/menus/Ownership.java | 0 .../com/songoda/skyblock/menus/Rollback.java | 0 .../com/songoda/skyblock/menus/Settings.java | 0 .../com/songoda/skyblock/menus/Upgrade.java | 0 .../com/songoda/skyblock/menus/Visit.java | 0 .../com/songoda/skyblock/menus/Visitors.java | 0 .../com/songoda/skyblock/menus/Weather.java | 0 .../songoda/skyblock/menus/admin/Creator.java | 0 .../skyblock/menus/admin/Generator.java | 0 .../skyblock/menus/admin/Levelling.java | 0 .../skyblock/menus/admin/Settings.java | 0 .../songoda/skyblock/menus/admin/Upgrade.java | 0 .../skyblock/message/MessageManager.java | 0 .../skyblock/placeholder/EZPlaceholder.java | 0 .../skyblock/placeholder/MVdWPlaceholder.java | 0 .../skyblock/placeholder/Placeholder.java | 0 .../placeholder/PlaceholderManager.java | 0 .../skyblock/playerdata/PlayerData.java | 0 .../playerdata/PlayerDataManager.java | 0 .../skyblock/playtime/PlaytimeTask.java | 0 .../skyblock/scoreboard/Scoreboard.java | 0 .../scoreboard/ScoreboardManager.java | 0 .../songoda/skyblock/sound/SoundManager.java | 0 .../songoda/skyblock/stackable/Stackable.java | 0 .../skyblock/stackable/StackableManager.java | 0 .../songoda/skyblock/structure/Structure.java | 0 .../skyblock/structure/StructureManager.java | 0 .../com/songoda/skyblock/upgrade/Upgrade.java | 0 .../skyblock/upgrade/UpgradeManager.java | 0 .../skyblock/usercache/UserCacheManager.java | 0 .../skyblock/utils/AbstractAnvilGUI.java | 0 .../songoda/skyblock/utils/ChatComponent.java | 0 .../com/songoda/skyblock/utils/GZipUtil.java | 0 .../com/songoda/skyblock/utils/Metrics.java | 1029 +++++++++++++++++ .../songoda/skyblock/utils/NumberUtil.java | 0 .../songoda/skyblock/utils/StringUtil.java | 0 .../skyblock/utils/item/InventoryUtil.java | 0 .../skyblock/utils/item/ItemStackUtil.java | 0 .../skyblock/utils/item/MaterialUtil.java | 0 .../skyblock/utils/item/SkullUtil.java | 0 .../skyblock/utils/item/nInventoryUtil.java | 0 .../skyblock/utils/math/VectorUtil.java | 0 .../skyblock/utils/player/NameFetcher.java | 0 .../skyblock/utils/player/OfflinePlayer.java | 0 .../skyblock/utils/structure/Area.java | 0 .../skyblock/utils/structure/Location.java | 0 .../utils/structure/SchematicUtil.java | 0 .../utils/structure/SelectionLocation.java | 0 .../skyblock/utils/structure/Storage.java | 0 .../skyblock/utils/structure/Structure.java | 0 .../utils/structure/StructureUtil.java | 0 .../skyblock/utils/version/Materials.java | 0 .../skyblock/utils/version/NMSUtil.java | 0 .../skyblock/utils/version/SBiome.java | 0 .../skyblock/utils/version/Sounds.java | 0 .../skyblock/utils/world/LocationUtil.java | 0 .../skyblock/utils/world/WorldBorder.java | 0 .../skyblock/utils/world/block/BlockData.java | 0 .../utils/world/block/BlockDataType.java | 0 .../utils/world/block/BlockDegreesType.java | 0 .../utils/world/block/BlockStateType.java | 0 .../skyblock/utils/world/block/BlockUtil.java | 0 .../utils/world/entity/EntityData.java | 0 .../utils/world/entity/EntityUtil.java | 0 .../com/songoda/skyblock/visit/Visit.java | 0 .../songoda/skyblock/visit/VisitManager.java | 0 .../com/songoda/skyblock/visit/VisitTask.java | 0 .../songoda/skyblock/world/WorldManager.java | 0 .../world/generator/VoidGenerator.java | 0 .../src => src}/main/resources/config.yml | 0 .../src => src}/main/resources/generators.yml | 0 .../src => src}/main/resources/language.yml | 0 .../src => src}/main/resources/levelling.yml | 0 .../src => src}/main/resources/limits.yml | 0 .../src => src}/main/resources/plugin.yml | 0 .../src => src}/main/resources/settings.yml | 0 .../src => src}/main/resources/stackables.yml | 0 .../src => src}/main/resources/structures.yml | 0 .../resources/structures/default.structure | Bin .../src => src}/main/resources/upgrades.yml | 0 .../src => src}/main/resources/worlds.yml | 0 286 files changed, 1316 insertions(+), 820 deletions(-) create mode 100644 .classpath create mode 100644 .project delete mode 100644 FabledSkyBlock/Core/build.gradle delete mode 100644 FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/Metrics.java delete mode 100644 FabledSkyBlock/Legacy/build.gradle delete mode 100644 FabledSkyBlock/Legacy/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/SkyBlock.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/SkyBlockAPI.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/ban/Ban.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/biome/BiomeManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandBanEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandBiomeChangeEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandCreateEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandDeleteEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandInviteEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandKickEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandLevelChangeEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandLoadEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandLocationChangeEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandMessageChangeEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandOpenEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandOwnershipTransferEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandPasswordChangeEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandRoleChangeEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandUnbanEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandUnloadEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandUpgradeEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/island/IslandWeatherChangeEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatSwitchEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerIslandEnterEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerIslandExitEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerIslandJoinEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerIslandSwitchEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/event/player/PlayerWithdrawMoneyEvent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/invite/IslandInvitation.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/Island.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandBorderColor.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandEnvironment.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandLevel.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandLocation.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandMessage.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandRole.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandSetting.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandUpgrade.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/island/IslandWorld.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/levelling/LevellingManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/structure/Structure.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/structure/StructureManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/utils/APIUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/api/visit/Visit.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/ban/Ban.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/ban/BanManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/biome/BiomeManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/CommandManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/SubCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/SkyBlockCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/AddUpgradeCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/CreateCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/DeleteCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/GeneratorCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/LevelCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/LevelScanCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/OwnerCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/RefreshHologramsCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/RemoveUpgradeCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/SetSizeCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/SetSpawnCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/SettingsCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/StructureCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/BankCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/BansCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/BorderCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/CancelCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/ChatCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/CloseCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/ConfirmCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/ControlPanelCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/CoopCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/CreateCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/CurrentCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/DeleteCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/DemoteCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/DenyCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/InformationCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/InviteCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/KickAllCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/KickCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/LeaderboardCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/LeaveCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/LevelCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/MembersCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/OpenCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/OwnerCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/PromoteCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/PublicCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/SetSpawnCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/SettingsCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/UnlockCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/VisitCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/VoteCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/WeatherCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/disabled/ResetCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/command/commands/island/disabled/RollbackCommand.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/config/FileChecker.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/config/FileManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/confirmation/Confirmation.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/cooldown/Cooldown.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/cooldown/CooldownManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/cooldown/CooldownPlayer.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/cooldown/CooldownTask.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/cooldown/CooldownType.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/economy/EconomyManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/generator/Generator.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/generator/GeneratorManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/generator/GeneratorMaterial.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/hologram/Hologram.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/hologram/HologramManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/hologram/HologramType.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/invite/Invite.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/invite/InviteManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/invite/InviteTask.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/Island.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandCoop.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandEnvironment.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandLevel.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandLocation.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandMessage.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandPosition.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandRole.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandSetting.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/island/IslandWorld.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/leaderboard/Leaderboard.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/leaderboard/LeaderboardManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/leaderboard/LeaderboardPlayer.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/leaderboard/LeaderboardTask.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/levelling/Chunk.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/levelling/ChunkPosition.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/levelling/ChunkSnapshotWrapper.java (100%) rename {FabledSkyBlock/Legacy/src => src}/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java (100%) create mode 100644 src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/levelling/LevelChunkSnapshotWrapper.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/levelling/LevellingManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/levelling/LevellingMaterial.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/levelling/WildStackerChunkSnapshotWrapper.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/limit/LimitManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Block.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Bucket.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Chat.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Death.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Entity.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/EpicSpawners.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Food.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Interact.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Inventory.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Item.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Join.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Move.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Portal.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Projectile.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Quit.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Respawn.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Spawner.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/Teleport.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/UltimateStacker.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/listeners/WildStacker.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Bans.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Biome.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Border.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/ControlPanel.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Coop.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Creator.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Information.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Leaderboard.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Levelling.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Members.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Ownership.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Rollback.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Settings.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Upgrade.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Visit.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Visitors.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/Weather.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/admin/Creator.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/admin/Generator.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/admin/Levelling.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/admin/Settings.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/menus/admin/Upgrade.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/message/MessageManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/placeholder/EZPlaceholder.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/placeholder/MVdWPlaceholder.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/placeholder/Placeholder.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/playerdata/PlayerData.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/playtime/PlaytimeTask.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/sound/SoundManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/stackable/Stackable.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/stackable/StackableManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/structure/Structure.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/structure/StructureManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/upgrade/Upgrade.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/upgrade/UpgradeManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/usercache/UserCacheManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/AbstractAnvilGUI.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/ChatComponent.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/GZipUtil.java (100%) create mode 100644 src/main/java/com/songoda/skyblock/utils/Metrics.java rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/NumberUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/StringUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/item/InventoryUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/item/ItemStackUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/item/MaterialUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/item/SkullUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/item/nInventoryUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/math/VectorUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/player/NameFetcher.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/structure/Area.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/structure/Location.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/structure/SelectionLocation.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/structure/Storage.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/structure/Structure.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/version/Materials.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/version/NMSUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/version/SBiome.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/version/Sounds.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/LocationUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/WorldBorder.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/block/BlockData.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/block/BlockDataType.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/block/BlockDegreesType.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/entity/EntityData.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/visit/Visit.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/visit/VisitManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/visit/VisitTask.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/world/WorldManager.java (100%) rename {FabledSkyBlock/Core/src => src}/main/java/com/songoda/skyblock/world/generator/VoidGenerator.java (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/config.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/generators.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/language.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/levelling.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/limits.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/plugin.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/settings.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/stackables.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/structures.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/structures/default.structure (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/upgrades.yml (100%) rename {FabledSkyBlock/Core/src => src}/main/resources/worlds.yml (100%) diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..9410146b --- /dev/null +++ b/.classpath @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 00000000..a7a77cf9 --- /dev/null +++ b/.project @@ -0,0 +1,22 @@ + + + FabledSkyblock + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + + + org.eclipse.jdt.core.javabuilder + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + diff --git a/FabledSkyBlock/Core/build.gradle b/FabledSkyBlock/Core/build.gradle deleted file mode 100644 index f2cd67c5..00000000 --- a/FabledSkyBlock/Core/build.gradle +++ /dev/null @@ -1,65 +0,0 @@ -import org.apache.tools.ant.filters.ReplaceTokens - -configurations { - extraLibs -} - -dependencies { - // Project Dependencies - compile project(':FabledSkyBlock-Legacy') - - // PlaceholderAPI - compileOnly (group: 'be.maximvdw', name: 'placeholderapi', version: '2.5.1') - compileOnly (group: 'me.clip', name: 'placeholderapi', version: '2.10.2') - - // Vault - compileOnly (group: 'net.milkbowl', name: 'vault', version: '1.7.1') - - // Reserve - compileOnly (group: 'net.tnemc', name: 'Reserve', version: '0.1.3.0') - - // Leaderheads - compileOnly (group: 'me.robin', name: 'leaderheads', version: '1.0') - - // EpicSpawners - compileOnly (group: 'com.songoda', name: 'epicspawners', version: '6-pre4') - - // EpicAnchors - compileOnly (group: 'com.songoda', name: 'epicanchors', version: '1.2.5') - - // UltimateStacker - compileOnly (group: 'com.songoda', name: 'ultimatestacker', version: '1.3.1') - - // WildStacker - compileOnly (group: 'com.github.OmerBenGera', name: 'WildStackerAPI', version: 'b15') - - // WorldEdit - compileOnly (group: 'com.sk89q', name: 'worldedit', version: '7.0.0') - - // Apache Commons - extraLibs (group: 'org.apache.commons', name: 'commons-lang3', version: '3.0') - extraLibs (group: 'commons-io', name: 'commons-io', version: '2.5') - - // Spigot - compileOnly (group: 'org.spigotmc', name: 'spigot', version: '1.14.1') - - // Songoda Updater - extraLibs (group: 'com.songoda', name: 'songodaupdater', version: '1') - - configurations.compileOnly.extendsFrom(configurations.extraLibs) -} - -processResources { - from (sourceSets.main.resources.srcDirs) { - include '**/*.yml' - filter ReplaceTokens, tokens: ["version": project.property("version")] - } -} - -jar { - from { - configurations.extraLibs.collect { - it.isDirectory() ? it : zipTree(it) - } - } -} diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/Metrics.java b/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/Metrics.java deleted file mode 100644 index 4ccc036e..00000000 --- a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/Metrics.java +++ /dev/null @@ -1,692 +0,0 @@ -package com.songoda.skyblock.utils; - -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.ServicePriority; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import javax.net.ssl.HttpsURLConnection; -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.concurrent.Callable; -import java.util.logging.Level; -import java.util.zip.GZIPOutputStream; - -/** - * bStats collects some data for plugin authors. - *

- * Check out https://bStats.org/ to learn more about bStats! - */ -@SuppressWarnings({"WeakerAccess", "unused"}) -public class Metrics { - - // The version of this bStats class - public static final int B_STATS_VERSION = 1; - // The url to which the data is sent - private static final String URL = "https://bStats.org/submitData/bukkit"; - // Should failed requests be logged? - private static boolean logFailedRequests; - // Should the sent data be logged? - private static boolean logSentData; - // Should the response text be logged? - private static boolean logResponseStatusText; - // The uuid of the server - private static String serverUUID; - - static { - // You can use the property to disable the check in your test environment - if (System.getProperty("bstats.relocatecheck") == null || !System.getProperty("bstats.relocatecheck").equals("false")) { - // Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D - final String defaultPackage = new String( - new byte[]{'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u', 'k', 'k', 'i', 't'}); - final String examplePackage = new String(new byte[]{'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); - // We want to make sure nobody just copy & pastes the example and use the wrong package names - if (Metrics.class.getPackage().getName().equals(defaultPackage) || Metrics.class.getPackage().getName().equals(examplePackage)) { - throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); - } - } - } - - // The plugin - private final Plugin plugin; - // A list with all custom charts - private final List charts = new ArrayList<>(); - // Is bStats enabled on this server? - private boolean enabled; - - /** - * Class constructor. - * - * @param plugin The plugin which stats should be submitted. - */ - public Metrics(Plugin plugin) { - if (plugin == null) { - throw new IllegalArgumentException("Plugin cannot be null!"); - } - this.plugin = plugin; - - // Get the config file - File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); - File configFile = new File(bStatsFolder, "config.yml"); - YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); - - // Check if the config file exists - if (!config.isSet("serverUuid")) { - - // Add default values - config.addDefault("enabled", true); - // Every server gets it's unique random id. - config.addDefault("serverUuid", UUID.randomUUID().toString()); - // Should failed request be logged? - config.addDefault("logFailedRequests", false); - // Should the sent data be logged? - config.addDefault("logSentData", false); - // Should the response text be logged? - config.addDefault("logResponseStatusText", false); - - // Inform the server owners about bStats - config.options().header( - "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + - "To honor their work, you should not disable it.\n" + - "This has nearly no effect on the server performance!\n" + - "Check out https://bStats.org/ to learn more :)" - ).copyDefaults(true); - try { - config.save(configFile); - } catch (IOException ignored) { - } - } - - // Load the data - enabled = config.getBoolean("enabled", true); - serverUUID = config.getString("serverUuid"); - logFailedRequests = config.getBoolean("logFailedRequests", false); - logSentData = config.getBoolean("logSentData", false); - logResponseStatusText = config.getBoolean("logResponseStatusText", false); - - if (enabled) { - boolean found = false; - // Search for all other bStats Metrics classes to see if we are the first one - for (Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - found = true; // We aren't the first - break; - } catch (NoSuchFieldException ignored) { - } - } - // Register our service - Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal); - if (!found) { - // We are the first! - startSubmitting(); - } - } - } - - /** - * Sends the data to the bStats server. - * - * @param plugin Any plugin. It's just used to get a logger instance. - * @param data The data to send. - * @throws Exception If the request failed. - */ - private static void sendData(Plugin plugin, JSONObject data) throws Exception { - if (data == null) { - throw new IllegalArgumentException("Data cannot be null!"); - } - if (Bukkit.isPrimaryThread()) { - throw new IllegalAccessException("This method must not be called from the main thread!"); - } - if (logSentData) { - plugin.getLogger().info("Sending data to bStats: " + data.toString()); - } - HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); - - // Compress the data to save bandwidth - byte[] compressedData = compress(data.toString()); - - // Add headers - connection.setRequestMethod("POST"); - connection.addRequestProperty("Accept", "application/json"); - connection.addRequestProperty("Connection", "close"); - connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request - connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); - connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format - connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); - - // Send data - connection.setDoOutput(true); - DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); - outputStream.write(compressedData); - outputStream.flush(); - outputStream.close(); - - InputStream inputStream = connection.getInputStream(); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - - StringBuilder builder = new StringBuilder(); - String line; - while ((line = bufferedReader.readLine()) != null) { - builder.append(line); - } - bufferedReader.close(); - if (logResponseStatusText) { - plugin.getLogger().info("Sent data to bStats and received response: " + builder.toString()); - } - } - - /** - * Gzips the given String. - * - * @param str The string to gzip. - * @return The gzipped String. - * @throws IOException If the compression failed. - */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { - return null; - } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - GZIPOutputStream gzip = new GZIPOutputStream(outputStream); - gzip.write(str.getBytes(StandardCharsets.UTF_8)); - gzip.close(); - return outputStream.toByteArray(); - } - - /** - * Checks if bStats is enabled. - * - * @return Whether bStats is enabled or not. - */ - public boolean isEnabled() { - return enabled; - } - - /** - * Adds a custom chart. - * - * @param chart The chart to add. - */ - public void addCustomChart(CustomChart chart) { - if (chart == null) { - throw new IllegalArgumentException("Chart cannot be null!"); - } - charts.add(chart); - } - - /** - * Starts the Scheduler which submits our data every 30 minutes. - */ - private void startSubmitting() { - final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if (!plugin.isEnabled()) { // Plugin was disabled - timer.cancel(); - return; - } - // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler - // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) - Bukkit.getScheduler().runTask(plugin, () -> submitData()); - } - }, 1000 * 60 * 5, 1000 * 60 * 30); - // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start - // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! - // WARNING: Just don't do it! - } - - /** - * Gets the plugin specific data. - * This method is called using Reflection. - * - * @return The plugin specific data. - */ - public JSONObject getPluginData() { - JSONObject data = new JSONObject(); - - String pluginName = plugin.getDescription().getName(); - String pluginVersion = plugin.getDescription().getVersion(); - - data.put("pluginName", pluginName); // Append the name of the plugin - data.put("pluginVersion", pluginVersion); // Append the version of the plugin - JSONArray customCharts = new JSONArray(); - for (CustomChart customChart : charts) { - // Add the data of the custom charts - JSONObject chart = customChart.getRequestJsonObject(); - if (chart == null) { // If the chart is null, we skip it - continue; - } - customCharts.add(chart); - } - data.put("customCharts", customCharts); - - return data; - } - - /** - * Gets the server specific data. - * - * @return The server specific data. - */ - private JSONObject getServerData() { - // Minecraft specific data - int playerAmount; - try { - // Around MC 1.8 the return type was changed to a collection from an array, - // This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; - Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); - playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class) - ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() - : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; - } catch (Exception e) { - playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed - } - int onlineMode = Bukkit.getOnlineMode() ? 1 : 0; - String bukkitVersion = Bukkit.getVersion(); - - // OS/Java specific data - String javaVersion = System.getProperty("java.version"); - String osName = System.getProperty("os.name"); - String osArch = System.getProperty("os.arch"); - String osVersion = System.getProperty("os.version"); - int coreCount = Runtime.getRuntime().availableProcessors(); - - JSONObject data = new JSONObject(); - - data.put("serverUUID", serverUUID); - - data.put("playerAmount", playerAmount); - data.put("onlineMode", onlineMode); - data.put("bukkitVersion", bukkitVersion); - - data.put("javaVersion", javaVersion); - data.put("osName", osName); - data.put("osArch", osArch); - data.put("osVersion", osVersion); - data.put("coreCount", coreCount); - - return data; - } - - /** - * Collects the data and sends it afterwards. - */ - private void submitData() { - final JSONObject data = getServerData(); - - JSONArray pluginData = new JSONArray(); - // Search for all other bStats Metrics classes to get their plugin data - for (Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - - for (RegisteredServiceProvider provider : Bukkit.getServicesManager().getRegistrations(service)) { - try { - pluginData.add(provider.getService().getMethod("getPluginData").invoke(provider.getProvider())); - } catch (NullPointerException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { - } - } - } catch (NoSuchFieldException ignored) { - } - } - - data.put("plugins", pluginData); - - // Create a new thread for the connection to the bStats server - new Thread(new Runnable() { - @Override - public void run() { - try { - // Send the data - sendData(plugin, data); - } catch (Exception e) { - // Something went wrong! :( - if (logFailedRequests) { - plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); - } - } - } - }).start(); - } - - /** - * Represents a custom chart. - */ - public static abstract class CustomChart { - - // The id of the chart - final String chartId; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - */ - CustomChart(String chartId) { - if (chartId == null || chartId.isEmpty()) { - throw new IllegalArgumentException("ChartId cannot be null or empty!"); - } - this.chartId = chartId; - } - - private JSONObject getRequestJsonObject() { - JSONObject chart = new JSONObject(); - chart.put("chartId", chartId); - try { - JSONObject data = getChartData(); - if (data == null) { - // If the data is null we don't send the chart. - return null; - } - chart.put("data", data); - } catch (Throwable t) { - if (logFailedRequests) { - Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t); - } - return null; - } - return chart; - } - - protected abstract JSONObject getChartData() throws Exception; - - } - - /** - * Represents a custom simple pie. - */ - public static class SimplePie extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimplePie(String chartId, Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - String value = callable.call(); - if (value == null || value.isEmpty()) { - // Null = skip the chart - return null; - } - data.put("value", value); - return data; - } - } - - /** - * Represents a custom advanced pie. - */ - public static class AdvancedPie extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedPie(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.put(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.put("values", values); - return data; - } - } - - /** - * Represents a custom drilldown pie. - */ - public static class DrilldownPie extends CustomChart { - - private final Callable>> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public DrilldownPie(String chartId, Callable>> callable) { - super(chartId); - this.callable = callable; - } - - @Override - public JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map> map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean reallyAllSkipped = true; - for (Map.Entry> entryValues : map.entrySet()) { - JSONObject value = new JSONObject(); - boolean allSkipped = true; - for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { - value.put(valueEntry.getKey(), valueEntry.getValue()); - allSkipped = false; - } - if (!allSkipped) { - reallyAllSkipped = false; - values.put(entryValues.getKey(), value); - } - } - if (reallyAllSkipped) { - // Null = skip the chart - return null; - } - data.put("values", values); - return data; - } - } - - /** - * Represents a custom single line chart. - */ - public static class SingleLineChart extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SingleLineChart(String chartId, Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - int value = callable.call(); - if (value == 0) { - // Null = skip the chart - return null; - } - data.put("value", value); - return data; - } - - } - - /** - * Represents a custom multi line chart. - */ - public static class MultiLineChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public MultiLineChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.put(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.put("values", values); - return data; - } - - } - - /** - * Represents a custom simple bar chart. - */ - public static class SimpleBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimpleBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - for (Map.Entry entry : map.entrySet()) { - JSONArray categoryValues = new JSONArray(); - categoryValues.add(entry.getValue()); - values.put(entry.getKey(), categoryValues); - } - data.put("values", values); - return data; - } - - } - - /** - * Represents a custom advanced bar chart. - */ - public static class AdvancedBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JSONObject getChartData() throws Exception { - JSONObject data = new JSONObject(); - JSONObject values = new JSONObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().length == 0) { - continue; // Skip this invalid - } - allSkipped = false; - JSONArray categoryValues = new JSONArray(); - for (int categoryValue : entry.getValue()) { - categoryValues.add(categoryValue); - } - values.put(entry.getKey(), categoryValues); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.put("values", values); - return data; - } - } - -} \ No newline at end of file diff --git a/FabledSkyBlock/Legacy/build.gradle b/FabledSkyBlock/Legacy/build.gradle deleted file mode 100644 index 2a772951..00000000 --- a/FabledSkyBlock/Legacy/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compileOnly 'org.spigotmc:spigot:1.12.2' -} \ No newline at end of file diff --git a/FabledSkyBlock/Legacy/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java b/FabledSkyBlock/Legacy/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java deleted file mode 100644 index 80c1eb24..00000000 --- a/FabledSkyBlock/Legacy/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.songoda.skyblock.levelling; - -import org.bukkit.ChunkSnapshot; -import org.bukkit.Material; - -public class LegacyChunkSnapshotFetcher { - - // Uses a 1.12.2 jar in a separate project to avoid needing to use reflection during level scanning, much faster. - public static LegacyChunkSnapshotData fetch(ChunkSnapshot snapshot, int x, int y, int z) { - return new LegacyChunkSnapshotData(Material.getMaterial(snapshot.getBlockTypeId(x, y, z)), snapshot.getBlockData(x, y, z)); - } - -} \ No newline at end of file diff --git a/build.gradle b/build.gradle index ccabebfa..6f25076c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,46 +1,107 @@ +import org.apache.tools.ant.filters.ReplaceTokens allprojects { - apply plugin: 'java' - group = 'com.goodandevil.skyblock' - version = 'maven-version-number' -} - -subprojects { - sourceCompatibility = 1.8 - - repositories { - mavenCentral() - jcenter() - - maven { - url = 'http://repo.songoda.com/artifactory/private' - } - - maven { - url = 'https://jitpack.io' - } - } -} - -dependencies { - compile project(':FabledSkyBlock-Legacy') - compile project(':FabledSkyBlock-Core') + apply plugin: 'java' + apply plugin: 'eclipse' + group = 'com.songoda.skyblock' + version = 'maven-version-number' } configurations { - childJars + shade + compile.extendsFrom shade +} + +repositories { + mavenCentral() + jcenter() + + //Spigot + maven { + url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' + } + + // Bungeecord + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } + + // Songoda + maven { + url 'http://repo.songoda.com/artifactory/private' + } + + // Mojang + maven { + url 'https://libraries.minecraft.net/' + } + + //Jitpack + maven { + url 'https://jitpack.io' + } + } dependencies { - subprojects.each { - childJars project(it.path) - } + + // Spigot + implementation (group: 'org.spigotmc', name: 'spigot-api', version: '1.14.4-R0.1-SNAPSHOT') + + // GameProfile's Mojang + implementation (group: 'com.mojang', name: 'authlib', version: '1.5.3') + + // PlaceholderAPI + implementation (group: 'be.maximvdw', name: 'placeholderapi', version: '2.5.1') + implementation (group: 'me.clip', name: 'placeholderapi', version: '2.10.2') + + // Vault + implementation (group: 'net.milkbowl', name: 'vault', version: '1.7.1') + + // Reserve + implementation (group: 'net.tnemc', name: 'Reserve', version: '0.1.3.0') + + // Leaderheads + implementation (group: 'me.robin', name: 'leaderheads', version: '1.0') + + // EpicSpawners + implementation (group: 'com.songoda', name: 'epicspawners', version: '6-pre4') + + // EpicAnchors + implementation (group: 'com.songoda', name: 'epicanchors', version: '1.2.5') + + // UltimateStacker + implementation (group: 'com.songoda', name: 'ultimatestacker', version: '1.3.1') + + // WildStacker + implementation (group: 'com.github.OmerBenGera', name: 'WildStackerAPI', version: 'b15') + + // WorldEdit + implementation (group: 'com.sk89q', name: 'worldedit', version: '7.0.0') + + // Apache Commons + shade (group: 'org.apache.commons', name: 'commons-lang3', version: '3.0') + shade (group: 'commons-io', name: 'commons-io', version: '2.5') + + // JSON.org + shade (group: 'org.json', name: 'json', version: '20190722') + + // Songoda Updater + shade (group: 'com.songoda', name: 'songodaupdater', version: '1') + +} + +processResources { + filter ReplaceTokens, tokens: ["version": project.property("version")] + from (sourceSets.main.resources.srcDirs) { + include '**/*.yml' + } } jar { - dependsOn configurations.childJars - from { - configurations.childJars.collect { - zipTree(it) - } - } + configurations.shade.each { dep -> + from(project.zipTree(dep)){ + exclude 'META-INF', 'META-INF/**' + exclude '**/*.yml' + } + } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ef9a9e05..5f1b1201 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 83f2acfd..b0d6d0ab 100644 --- a/gradlew +++ b/gradlew @@ -7,7 +7,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -125,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` diff --git a/gradlew.bat b/gradlew.bat index 9618d8d9..9991c503 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -5,7 +5,7 @@ @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem -@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem http://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, diff --git a/settings.gradle b/settings.gradle index d254dfb3..0296c83a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1 @@ -rootProject.name = 'FabledSkyBlock' - -include(':FabledSkyBlock-Core') -project(':FabledSkyBlock-Core').projectDir = file('FabledSkyBlock/Core') - -include(':FabledSkyBlock-Legacy') -project(':FabledSkyBlock-Legacy').projectDir = file('FabledSkyBlock/Legacy') +rootProject.name = 'FabledSkyblock' \ No newline at end of file diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/SkyBlock.java b/src/main/java/com/songoda/skyblock/SkyBlock.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/SkyBlock.java rename to src/main/java/com/songoda/skyblock/SkyBlock.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/SkyBlockAPI.java b/src/main/java/com/songoda/skyblock/api/SkyBlockAPI.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/SkyBlockAPI.java rename to src/main/java/com/songoda/skyblock/api/SkyBlockAPI.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/ban/Ban.java b/src/main/java/com/songoda/skyblock/api/ban/Ban.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/ban/Ban.java rename to src/main/java/com/songoda/skyblock/api/ban/Ban.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/biome/BiomeManager.java b/src/main/java/com/songoda/skyblock/api/biome/BiomeManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/biome/BiomeManager.java rename to src/main/java/com/songoda/skyblock/api/biome/BiomeManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandBanEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandBanEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandBanEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandBanEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandBiomeChangeEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandBiomeChangeEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandBiomeChangeEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandBiomeChangeEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandCreateEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandCreateEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandCreateEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandCreateEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandDeleteEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandDeleteEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandDeleteEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandDeleteEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandInviteEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandInviteEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandInviteEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandInviteEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandKickEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandKickEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandKickEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandKickEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandLevelChangeEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandLevelChangeEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandLevelChangeEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandLevelChangeEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandLoadEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandLoadEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandLoadEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandLoadEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandLocationChangeEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandLocationChangeEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandLocationChangeEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandLocationChangeEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandMessageChangeEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandMessageChangeEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandMessageChangeEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandMessageChangeEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandOpenEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandOpenEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandOpenEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandOpenEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandOwnershipTransferEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandOwnershipTransferEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandOwnershipTransferEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandOwnershipTransferEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandPasswordChangeEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandPasswordChangeEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandPasswordChangeEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandPasswordChangeEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandRoleChangeEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandRoleChangeEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandRoleChangeEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandRoleChangeEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandUnbanEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandUnbanEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandUnbanEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandUnbanEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandUnloadEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandUnloadEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandUnloadEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandUnloadEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandUpgradeEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandUpgradeEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandUpgradeEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandUpgradeEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandWeatherChangeEvent.java b/src/main/java/com/songoda/skyblock/api/event/island/IslandWeatherChangeEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/island/IslandWeatherChangeEvent.java rename to src/main/java/com/songoda/skyblock/api/event/island/IslandWeatherChangeEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatSwitchEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatSwitchEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatSwitchEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandChatSwitchEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandEnterEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandEnterEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandEnterEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandEnterEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandExitEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandExitEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandExitEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandExitEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandJoinEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandJoinEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandJoinEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandJoinEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandLeaveEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandSwitchEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandSwitchEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandSwitchEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerIslandSwitchEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerWithdrawMoneyEvent.java b/src/main/java/com/songoda/skyblock/api/event/player/PlayerWithdrawMoneyEvent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/event/player/PlayerWithdrawMoneyEvent.java rename to src/main/java/com/songoda/skyblock/api/event/player/PlayerWithdrawMoneyEvent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/invite/IslandInvitation.java b/src/main/java/com/songoda/skyblock/api/invite/IslandInvitation.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/invite/IslandInvitation.java rename to src/main/java/com/songoda/skyblock/api/invite/IslandInvitation.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/Island.java b/src/main/java/com/songoda/skyblock/api/island/Island.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/Island.java rename to src/main/java/com/songoda/skyblock/api/island/Island.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandBorderColor.java b/src/main/java/com/songoda/skyblock/api/island/IslandBorderColor.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandBorderColor.java rename to src/main/java/com/songoda/skyblock/api/island/IslandBorderColor.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandEnvironment.java b/src/main/java/com/songoda/skyblock/api/island/IslandEnvironment.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandEnvironment.java rename to src/main/java/com/songoda/skyblock/api/island/IslandEnvironment.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandLevel.java b/src/main/java/com/songoda/skyblock/api/island/IslandLevel.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandLevel.java rename to src/main/java/com/songoda/skyblock/api/island/IslandLevel.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandLocation.java b/src/main/java/com/songoda/skyblock/api/island/IslandLocation.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandLocation.java rename to src/main/java/com/songoda/skyblock/api/island/IslandLocation.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandManager.java b/src/main/java/com/songoda/skyblock/api/island/IslandManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandManager.java rename to src/main/java/com/songoda/skyblock/api/island/IslandManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandMessage.java b/src/main/java/com/songoda/skyblock/api/island/IslandMessage.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandMessage.java rename to src/main/java/com/songoda/skyblock/api/island/IslandMessage.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandRole.java b/src/main/java/com/songoda/skyblock/api/island/IslandRole.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandRole.java rename to src/main/java/com/songoda/skyblock/api/island/IslandRole.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandSetting.java b/src/main/java/com/songoda/skyblock/api/island/IslandSetting.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandSetting.java rename to src/main/java/com/songoda/skyblock/api/island/IslandSetting.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandUpgrade.java b/src/main/java/com/songoda/skyblock/api/island/IslandUpgrade.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandUpgrade.java rename to src/main/java/com/songoda/skyblock/api/island/IslandUpgrade.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandWorld.java b/src/main/java/com/songoda/skyblock/api/island/IslandWorld.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/island/IslandWorld.java rename to src/main/java/com/songoda/skyblock/api/island/IslandWorld.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/levelling/LevellingManager.java b/src/main/java/com/songoda/skyblock/api/levelling/LevellingManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/levelling/LevellingManager.java rename to src/main/java/com/songoda/skyblock/api/levelling/LevellingManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/structure/Structure.java b/src/main/java/com/songoda/skyblock/api/structure/Structure.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/structure/Structure.java rename to src/main/java/com/songoda/skyblock/api/structure/Structure.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/structure/StructureManager.java b/src/main/java/com/songoda/skyblock/api/structure/StructureManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/structure/StructureManager.java rename to src/main/java/com/songoda/skyblock/api/structure/StructureManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/utils/APIUtil.java b/src/main/java/com/songoda/skyblock/api/utils/APIUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/utils/APIUtil.java rename to src/main/java/com/songoda/skyblock/api/utils/APIUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/visit/Visit.java b/src/main/java/com/songoda/skyblock/api/visit/Visit.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/api/visit/Visit.java rename to src/main/java/com/songoda/skyblock/api/visit/Visit.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/ban/Ban.java b/src/main/java/com/songoda/skyblock/ban/Ban.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/ban/Ban.java rename to src/main/java/com/songoda/skyblock/ban/Ban.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/ban/BanManager.java b/src/main/java/com/songoda/skyblock/ban/BanManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/ban/BanManager.java rename to src/main/java/com/songoda/skyblock/ban/BanManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/biome/BiomeManager.java b/src/main/java/com/songoda/skyblock/biome/BiomeManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/biome/BiomeManager.java rename to src/main/java/com/songoda/skyblock/biome/BiomeManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/CommandManager.java b/src/main/java/com/songoda/skyblock/command/CommandManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/CommandManager.java rename to src/main/java/com/songoda/skyblock/command/CommandManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/SubCommand.java b/src/main/java/com/songoda/skyblock/command/SubCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/SubCommand.java rename to src/main/java/com/songoda/skyblock/command/SubCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/SkyBlockCommand.java b/src/main/java/com/songoda/skyblock/command/commands/SkyBlockCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/SkyBlockCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/SkyBlockCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/AddUpgradeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/AddUpgradeCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/AddUpgradeCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/AddUpgradeCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/CreateCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/CreateCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/CreateCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/CreateCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/DeleteCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/DeleteCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/DeleteCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/DeleteCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/GeneratorCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/GeneratorCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/GeneratorCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/GeneratorCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/LevelCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/LevelCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/LevelCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/LevelCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/LevelScanCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/LevelScanCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/LevelScanCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/LevelScanCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/OwnerCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/OwnerCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/OwnerCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/OwnerCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/ProxyCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/RefreshHologramsCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/RefreshHologramsCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/RefreshHologramsCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/RefreshHologramsCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/RemoveHologramCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveUpgradeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveUpgradeCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/RemoveUpgradeCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/RemoveUpgradeCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/SetBiomeCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/SetHologramCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetSizeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SetSizeCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetSizeCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/SetSizeCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetSpawnCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SetSpawnCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SetSpawnCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/SetSpawnCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SettingsCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SettingsCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/SettingsCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/SettingsCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/StructureCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/StructureCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/StructureCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/StructureCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/AcceptCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/BanCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BankCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/BankCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BankCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/BankCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BansCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/BansCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BansCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/BansCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BorderCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/BorderCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/BorderCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/BorderCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CancelCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/CancelCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CancelCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/CancelCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/ChatCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/ChatCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/ChatCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/ChatCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CloseCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/CloseCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CloseCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/CloseCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/ConfirmCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/ConfirmCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/ConfirmCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/ConfirmCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/ControlPanelCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/ControlPanelCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/ControlPanelCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/ControlPanelCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CoopCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/CoopCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CoopCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/CoopCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CreateCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/CreateCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CreateCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/CreateCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CurrentCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/CurrentCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/CurrentCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/CurrentCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/DeleteCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/DeleteCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/DeleteCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/DeleteCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/DemoteCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/DemoteCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/DemoteCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/DemoteCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/DenyCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/DenyCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/DenyCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/DenyCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/InformationCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/InformationCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/InformationCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/InformationCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/InviteCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/InviteCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/InviteCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/InviteCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/KickAllCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/KickAllCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/KickAllCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/KickAllCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/KickCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/KickCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/KickCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/KickCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/LeaderboardCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/LeaderboardCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/LeaderboardCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/LeaderboardCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/LeaveCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/LeaveCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/LeaveCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/LeaveCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/LevelCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/LevelCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/LevelCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/LevelCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/MembersCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/MembersCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/MembersCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/MembersCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/OpenCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/OpenCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/OpenCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/OpenCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/OwnerCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/OwnerCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/OwnerCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/OwnerCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/PromoteCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/PromoteCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/PromoteCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/PromoteCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/PublicCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/PublicCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/PublicCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/PublicCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/SetSpawnCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/SetSpawnCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/SetSpawnCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/SetSpawnCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/SettingsCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/SettingsCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/SettingsCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/SettingsCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/TeleportCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/UnbanCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/UnlockCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/UnlockCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/UnlockCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/UnlockCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/UpgradeCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/ValueCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/VisitCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/VisitCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/VisitCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/VisitCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/VisitorsCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/VoteCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/VoteCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/VoteCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/VoteCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/WeatherCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/WeatherCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/WeatherCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/WeatherCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/disabled/ResetCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/disabled/ResetCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/disabled/ResetCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/disabled/ResetCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/disabled/RollbackCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/disabled/RollbackCommand.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/command/commands/island/disabled/RollbackCommand.java rename to src/main/java/com/songoda/skyblock/command/commands/island/disabled/RollbackCommand.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/config/FileChecker.java b/src/main/java/com/songoda/skyblock/config/FileChecker.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/config/FileChecker.java rename to src/main/java/com/songoda/skyblock/config/FileChecker.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/config/FileManager.java b/src/main/java/com/songoda/skyblock/config/FileManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/config/FileManager.java rename to src/main/java/com/songoda/skyblock/config/FileManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/confirmation/Confirmation.java b/src/main/java/com/songoda/skyblock/confirmation/Confirmation.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/confirmation/Confirmation.java rename to src/main/java/com/songoda/skyblock/confirmation/Confirmation.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java b/src/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java rename to src/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/Cooldown.java b/src/main/java/com/songoda/skyblock/cooldown/Cooldown.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/Cooldown.java rename to src/main/java/com/songoda/skyblock/cooldown/Cooldown.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/CooldownManager.java b/src/main/java/com/songoda/skyblock/cooldown/CooldownManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/CooldownManager.java rename to src/main/java/com/songoda/skyblock/cooldown/CooldownManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/CooldownPlayer.java b/src/main/java/com/songoda/skyblock/cooldown/CooldownPlayer.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/CooldownPlayer.java rename to src/main/java/com/songoda/skyblock/cooldown/CooldownPlayer.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/CooldownTask.java b/src/main/java/com/songoda/skyblock/cooldown/CooldownTask.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/CooldownTask.java rename to src/main/java/com/songoda/skyblock/cooldown/CooldownTask.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/CooldownType.java b/src/main/java/com/songoda/skyblock/cooldown/CooldownType.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/cooldown/CooldownType.java rename to src/main/java/com/songoda/skyblock/cooldown/CooldownType.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/economy/EconomyManager.java b/src/main/java/com/songoda/skyblock/economy/EconomyManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/economy/EconomyManager.java rename to src/main/java/com/songoda/skyblock/economy/EconomyManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/generator/Generator.java b/src/main/java/com/songoda/skyblock/generator/Generator.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/generator/Generator.java rename to src/main/java/com/songoda/skyblock/generator/Generator.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/generator/GeneratorManager.java b/src/main/java/com/songoda/skyblock/generator/GeneratorManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/generator/GeneratorManager.java rename to src/main/java/com/songoda/skyblock/generator/GeneratorManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/generator/GeneratorMaterial.java b/src/main/java/com/songoda/skyblock/generator/GeneratorMaterial.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/generator/GeneratorMaterial.java rename to src/main/java/com/songoda/skyblock/generator/GeneratorMaterial.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/hologram/Hologram.java b/src/main/java/com/songoda/skyblock/hologram/Hologram.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/hologram/Hologram.java rename to src/main/java/com/songoda/skyblock/hologram/Hologram.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/hologram/HologramManager.java b/src/main/java/com/songoda/skyblock/hologram/HologramManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/hologram/HologramManager.java rename to src/main/java/com/songoda/skyblock/hologram/HologramManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/hologram/HologramType.java b/src/main/java/com/songoda/skyblock/hologram/HologramType.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/hologram/HologramType.java rename to src/main/java/com/songoda/skyblock/hologram/HologramType.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/invite/Invite.java b/src/main/java/com/songoda/skyblock/invite/Invite.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/invite/Invite.java rename to src/main/java/com/songoda/skyblock/invite/Invite.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/invite/InviteManager.java b/src/main/java/com/songoda/skyblock/invite/InviteManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/invite/InviteManager.java rename to src/main/java/com/songoda/skyblock/invite/InviteManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/invite/InviteTask.java b/src/main/java/com/songoda/skyblock/invite/InviteTask.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/invite/InviteTask.java rename to src/main/java/com/songoda/skyblock/invite/InviteTask.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/Island.java b/src/main/java/com/songoda/skyblock/island/Island.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/Island.java rename to src/main/java/com/songoda/skyblock/island/Island.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandCoop.java b/src/main/java/com/songoda/skyblock/island/IslandCoop.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandCoop.java rename to src/main/java/com/songoda/skyblock/island/IslandCoop.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandEnvironment.java b/src/main/java/com/songoda/skyblock/island/IslandEnvironment.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandEnvironment.java rename to src/main/java/com/songoda/skyblock/island/IslandEnvironment.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandLevel.java b/src/main/java/com/songoda/skyblock/island/IslandLevel.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandLevel.java rename to src/main/java/com/songoda/skyblock/island/IslandLevel.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandLocation.java b/src/main/java/com/songoda/skyblock/island/IslandLocation.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandLocation.java rename to src/main/java/com/songoda/skyblock/island/IslandLocation.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java b/src/main/java/com/songoda/skyblock/island/IslandManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandManager.java rename to src/main/java/com/songoda/skyblock/island/IslandManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandMessage.java b/src/main/java/com/songoda/skyblock/island/IslandMessage.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandMessage.java rename to src/main/java/com/songoda/skyblock/island/IslandMessage.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandPosition.java b/src/main/java/com/songoda/skyblock/island/IslandPosition.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandPosition.java rename to src/main/java/com/songoda/skyblock/island/IslandPosition.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandRole.java b/src/main/java/com/songoda/skyblock/island/IslandRole.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandRole.java rename to src/main/java/com/songoda/skyblock/island/IslandRole.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandSetting.java b/src/main/java/com/songoda/skyblock/island/IslandSetting.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandSetting.java rename to src/main/java/com/songoda/skyblock/island/IslandSetting.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandWorld.java b/src/main/java/com/songoda/skyblock/island/IslandWorld.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/island/IslandWorld.java rename to src/main/java/com/songoda/skyblock/island/IslandWorld.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/Leaderboard.java b/src/main/java/com/songoda/skyblock/leaderboard/Leaderboard.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/Leaderboard.java rename to src/main/java/com/songoda/skyblock/leaderboard/Leaderboard.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardManager.java b/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardManager.java rename to src/main/java/com/songoda/skyblock/leaderboard/LeaderboardManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardPlayer.java b/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardPlayer.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardPlayer.java rename to src/main/java/com/songoda/skyblock/leaderboard/LeaderboardPlayer.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardTask.java b/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardTask.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/LeaderboardTask.java rename to src/main/java/com/songoda/skyblock/leaderboard/LeaderboardTask.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java rename to src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java rename to src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java rename to src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/Chunk.java b/src/main/java/com/songoda/skyblock/levelling/Chunk.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/Chunk.java rename to src/main/java/com/songoda/skyblock/levelling/Chunk.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/ChunkPosition.java b/src/main/java/com/songoda/skyblock/levelling/ChunkPosition.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/ChunkPosition.java rename to src/main/java/com/songoda/skyblock/levelling/ChunkPosition.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/ChunkSnapshotWrapper.java b/src/main/java/com/songoda/skyblock/levelling/ChunkSnapshotWrapper.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/ChunkSnapshotWrapper.java rename to src/main/java/com/songoda/skyblock/levelling/ChunkSnapshotWrapper.java diff --git a/FabledSkyBlock/Legacy/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java b/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java similarity index 100% rename from FabledSkyBlock/Legacy/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java rename to src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java diff --git a/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java b/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java new file mode 100644 index 00000000..ae93c1d5 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java @@ -0,0 +1,13 @@ +package com.songoda.skyblock.levelling; + +import org.bukkit.ChunkSnapshot; + +public class LegacyChunkSnapshotFetcher { + + // Uses a 1.12.2 jar in a separate project to avoid needing to use reflection during level scanning, much faster. + @SuppressWarnings("deprecation") + public static LegacyChunkSnapshotData fetch(ChunkSnapshot snapshot, int x, int y, int z) { + return new LegacyChunkSnapshotData(snapshot.getBlockType(x, y, z), snapshot.getData(x, y, z)); + } + +} \ No newline at end of file diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/LevelChunkSnapshotWrapper.java b/src/main/java/com/songoda/skyblock/levelling/LevelChunkSnapshotWrapper.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/LevelChunkSnapshotWrapper.java rename to src/main/java/com/songoda/skyblock/levelling/LevelChunkSnapshotWrapper.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/LevellingManager.java b/src/main/java/com/songoda/skyblock/levelling/LevellingManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/LevellingManager.java rename to src/main/java/com/songoda/skyblock/levelling/LevellingManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/LevellingMaterial.java b/src/main/java/com/songoda/skyblock/levelling/LevellingMaterial.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/LevellingMaterial.java rename to src/main/java/com/songoda/skyblock/levelling/LevellingMaterial.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/WildStackerChunkSnapshotWrapper.java b/src/main/java/com/songoda/skyblock/levelling/WildStackerChunkSnapshotWrapper.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/levelling/WildStackerChunkSnapshotWrapper.java rename to src/main/java/com/songoda/skyblock/levelling/WildStackerChunkSnapshotWrapper.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/limit/LimitManager.java b/src/main/java/com/songoda/skyblock/limit/LimitManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/limit/LimitManager.java rename to src/main/java/com/songoda/skyblock/limit/LimitManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Block.java rename to src/main/java/com/songoda/skyblock/listeners/Block.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Bucket.java b/src/main/java/com/songoda/skyblock/listeners/Bucket.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Bucket.java rename to src/main/java/com/songoda/skyblock/listeners/Bucket.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Chat.java b/src/main/java/com/songoda/skyblock/listeners/Chat.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Chat.java rename to src/main/java/com/songoda/skyblock/listeners/Chat.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Death.java b/src/main/java/com/songoda/skyblock/listeners/Death.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Death.java rename to src/main/java/com/songoda/skyblock/listeners/Death.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Entity.java rename to src/main/java/com/songoda/skyblock/listeners/Entity.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/EpicSpawners.java b/src/main/java/com/songoda/skyblock/listeners/EpicSpawners.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/EpicSpawners.java rename to src/main/java/com/songoda/skyblock/listeners/EpicSpawners.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Food.java b/src/main/java/com/songoda/skyblock/listeners/Food.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Food.java rename to src/main/java/com/songoda/skyblock/listeners/Food.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Interact.java b/src/main/java/com/songoda/skyblock/listeners/Interact.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Interact.java rename to src/main/java/com/songoda/skyblock/listeners/Interact.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Inventory.java b/src/main/java/com/songoda/skyblock/listeners/Inventory.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Inventory.java rename to src/main/java/com/songoda/skyblock/listeners/Inventory.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Item.java b/src/main/java/com/songoda/skyblock/listeners/Item.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Item.java rename to src/main/java/com/songoda/skyblock/listeners/Item.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Join.java b/src/main/java/com/songoda/skyblock/listeners/Join.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Join.java rename to src/main/java/com/songoda/skyblock/listeners/Join.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java b/src/main/java/com/songoda/skyblock/listeners/Move.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Move.java rename to src/main/java/com/songoda/skyblock/listeners/Move.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Portal.java b/src/main/java/com/songoda/skyblock/listeners/Portal.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Portal.java rename to src/main/java/com/songoda/skyblock/listeners/Portal.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Projectile.java b/src/main/java/com/songoda/skyblock/listeners/Projectile.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Projectile.java rename to src/main/java/com/songoda/skyblock/listeners/Projectile.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Quit.java b/src/main/java/com/songoda/skyblock/listeners/Quit.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Quit.java rename to src/main/java/com/songoda/skyblock/listeners/Quit.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Respawn.java b/src/main/java/com/songoda/skyblock/listeners/Respawn.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Respawn.java rename to src/main/java/com/songoda/skyblock/listeners/Respawn.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Spawner.java b/src/main/java/com/songoda/skyblock/listeners/Spawner.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Spawner.java rename to src/main/java/com/songoda/skyblock/listeners/Spawner.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Teleport.java b/src/main/java/com/songoda/skyblock/listeners/Teleport.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/Teleport.java rename to src/main/java/com/songoda/skyblock/listeners/Teleport.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/UltimateStacker.java b/src/main/java/com/songoda/skyblock/listeners/UltimateStacker.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/UltimateStacker.java rename to src/main/java/com/songoda/skyblock/listeners/UltimateStacker.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/WildStacker.java b/src/main/java/com/songoda/skyblock/listeners/WildStacker.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/listeners/WildStacker.java rename to src/main/java/com/songoda/skyblock/listeners/WildStacker.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Bans.java b/src/main/java/com/songoda/skyblock/menus/Bans.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Bans.java rename to src/main/java/com/songoda/skyblock/menus/Bans.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Biome.java b/src/main/java/com/songoda/skyblock/menus/Biome.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Biome.java rename to src/main/java/com/songoda/skyblock/menus/Biome.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Border.java b/src/main/java/com/songoda/skyblock/menus/Border.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Border.java rename to src/main/java/com/songoda/skyblock/menus/Border.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/ControlPanel.java b/src/main/java/com/songoda/skyblock/menus/ControlPanel.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/ControlPanel.java rename to src/main/java/com/songoda/skyblock/menus/ControlPanel.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Coop.java b/src/main/java/com/songoda/skyblock/menus/Coop.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Coop.java rename to src/main/java/com/songoda/skyblock/menus/Coop.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Creator.java b/src/main/java/com/songoda/skyblock/menus/Creator.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Creator.java rename to src/main/java/com/songoda/skyblock/menus/Creator.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Information.java b/src/main/java/com/songoda/skyblock/menus/Information.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Information.java rename to src/main/java/com/songoda/skyblock/menus/Information.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Leaderboard.java b/src/main/java/com/songoda/skyblock/menus/Leaderboard.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Leaderboard.java rename to src/main/java/com/songoda/skyblock/menus/Leaderboard.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Levelling.java b/src/main/java/com/songoda/skyblock/menus/Levelling.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Levelling.java rename to src/main/java/com/songoda/skyblock/menus/Levelling.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Members.java b/src/main/java/com/songoda/skyblock/menus/Members.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Members.java rename to src/main/java/com/songoda/skyblock/menus/Members.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Ownership.java b/src/main/java/com/songoda/skyblock/menus/Ownership.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Ownership.java rename to src/main/java/com/songoda/skyblock/menus/Ownership.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Rollback.java b/src/main/java/com/songoda/skyblock/menus/Rollback.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Rollback.java rename to src/main/java/com/songoda/skyblock/menus/Rollback.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Settings.java b/src/main/java/com/songoda/skyblock/menus/Settings.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Settings.java rename to src/main/java/com/songoda/skyblock/menus/Settings.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Upgrade.java b/src/main/java/com/songoda/skyblock/menus/Upgrade.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Upgrade.java rename to src/main/java/com/songoda/skyblock/menus/Upgrade.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Visit.java b/src/main/java/com/songoda/skyblock/menus/Visit.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Visit.java rename to src/main/java/com/songoda/skyblock/menus/Visit.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Visitors.java b/src/main/java/com/songoda/skyblock/menus/Visitors.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Visitors.java rename to src/main/java/com/songoda/skyblock/menus/Visitors.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Weather.java b/src/main/java/com/songoda/skyblock/menus/Weather.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/Weather.java rename to src/main/java/com/songoda/skyblock/menus/Weather.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Creator.java b/src/main/java/com/songoda/skyblock/menus/admin/Creator.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Creator.java rename to src/main/java/com/songoda/skyblock/menus/admin/Creator.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Generator.java b/src/main/java/com/songoda/skyblock/menus/admin/Generator.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Generator.java rename to src/main/java/com/songoda/skyblock/menus/admin/Generator.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Levelling.java b/src/main/java/com/songoda/skyblock/menus/admin/Levelling.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Levelling.java rename to src/main/java/com/songoda/skyblock/menus/admin/Levelling.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Settings.java b/src/main/java/com/songoda/skyblock/menus/admin/Settings.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Settings.java rename to src/main/java/com/songoda/skyblock/menus/admin/Settings.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Upgrade.java b/src/main/java/com/songoda/skyblock/menus/admin/Upgrade.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/menus/admin/Upgrade.java rename to src/main/java/com/songoda/skyblock/menus/admin/Upgrade.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/message/MessageManager.java b/src/main/java/com/songoda/skyblock/message/MessageManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/message/MessageManager.java rename to src/main/java/com/songoda/skyblock/message/MessageManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/placeholder/EZPlaceholder.java b/src/main/java/com/songoda/skyblock/placeholder/EZPlaceholder.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/placeholder/EZPlaceholder.java rename to src/main/java/com/songoda/skyblock/placeholder/EZPlaceholder.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/placeholder/MVdWPlaceholder.java b/src/main/java/com/songoda/skyblock/placeholder/MVdWPlaceholder.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/placeholder/MVdWPlaceholder.java rename to src/main/java/com/songoda/skyblock/placeholder/MVdWPlaceholder.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/placeholder/Placeholder.java b/src/main/java/com/songoda/skyblock/placeholder/Placeholder.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/placeholder/Placeholder.java rename to src/main/java/com/songoda/skyblock/placeholder/Placeholder.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java b/src/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java rename to src/main/java/com/songoda/skyblock/placeholder/PlaceholderManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/playerdata/PlayerData.java b/src/main/java/com/songoda/skyblock/playerdata/PlayerData.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/playerdata/PlayerData.java rename to src/main/java/com/songoda/skyblock/playerdata/PlayerData.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java rename to src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/playtime/PlaytimeTask.java b/src/main/java/com/songoda/skyblock/playtime/PlaytimeTask.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/playtime/PlaytimeTask.java rename to src/main/java/com/songoda/skyblock/playtime/PlaytimeTask.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java b/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java rename to src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java b/src/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java rename to src/main/java/com/songoda/skyblock/scoreboard/ScoreboardManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/sound/SoundManager.java b/src/main/java/com/songoda/skyblock/sound/SoundManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/sound/SoundManager.java rename to src/main/java/com/songoda/skyblock/sound/SoundManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/stackable/Stackable.java b/src/main/java/com/songoda/skyblock/stackable/Stackable.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/stackable/Stackable.java rename to src/main/java/com/songoda/skyblock/stackable/Stackable.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/stackable/StackableManager.java b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/stackable/StackableManager.java rename to src/main/java/com/songoda/skyblock/stackable/StackableManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/structure/Structure.java b/src/main/java/com/songoda/skyblock/structure/Structure.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/structure/Structure.java rename to src/main/java/com/songoda/skyblock/structure/Structure.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/structure/StructureManager.java b/src/main/java/com/songoda/skyblock/structure/StructureManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/structure/StructureManager.java rename to src/main/java/com/songoda/skyblock/structure/StructureManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/upgrade/Upgrade.java b/src/main/java/com/songoda/skyblock/upgrade/Upgrade.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/upgrade/Upgrade.java rename to src/main/java/com/songoda/skyblock/upgrade/Upgrade.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/upgrade/UpgradeManager.java b/src/main/java/com/songoda/skyblock/upgrade/UpgradeManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/upgrade/UpgradeManager.java rename to src/main/java/com/songoda/skyblock/upgrade/UpgradeManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/usercache/UserCacheManager.java b/src/main/java/com/songoda/skyblock/usercache/UserCacheManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/usercache/UserCacheManager.java rename to src/main/java/com/songoda/skyblock/usercache/UserCacheManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/AbstractAnvilGUI.java b/src/main/java/com/songoda/skyblock/utils/AbstractAnvilGUI.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/AbstractAnvilGUI.java rename to src/main/java/com/songoda/skyblock/utils/AbstractAnvilGUI.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/ChatComponent.java b/src/main/java/com/songoda/skyblock/utils/ChatComponent.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/ChatComponent.java rename to src/main/java/com/songoda/skyblock/utils/ChatComponent.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/GZipUtil.java b/src/main/java/com/songoda/skyblock/utils/GZipUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/GZipUtil.java rename to src/main/java/com/songoda/skyblock/utils/GZipUtil.java diff --git a/src/main/java/com/songoda/skyblock/utils/Metrics.java b/src/main/java/com/songoda/skyblock/utils/Metrics.java new file mode 100644 index 00000000..41149127 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/utils/Metrics.java @@ -0,0 +1,1029 @@ +package com.songoda.skyblock.utils; + +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.ServicePriority; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.JSONArray; +import org.json.JSONObject; + +import javax.net.ssl.HttpsURLConnection; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.UUID; +import java.util.logging.Level; +import java.util.zip.GZIPOutputStream; + +/** + * bStats collects some data for plugin authors. + * + * Check out https://bStats.org/ to learn more about bStats! + */ +public class Metrics { + + static { + // Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D + final String defaultPackage = new String(new byte[] { 'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's' }); + final String examplePackage = new String(new byte[] { 'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e' }); + // We want to make sure nobody just copy & pastes the example and use the wrong package names + if (Metrics.class.getPackage().getName().equals(defaultPackage) || Metrics.class.getPackage().getName().equals(examplePackage)) { + throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); + } + } + + // The version of this bStats class + public static final int B_STATS_VERSION = 1; + + // The url to which the data is sent + private static final String URL = "https://bStats.org/submitData/bukkit"; + + // Should failed requests be logged? + private static boolean logFailedRequests; + + // The uuid of the server + private static String serverUUID; + + // The plugin + private final JavaPlugin plugin; + + // A list with all custom charts + private final List charts = new ArrayList<>(); + + /** + * Class constructor. + * + * @param plugin The plugin which stats should be submitted. + */ + public Metrics(JavaPlugin plugin) { + if (plugin == null) { + throw new IllegalArgumentException("Plugin cannot be null!"); + } + this.plugin = plugin; + + // Get the config file + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + File configFile = new File(bStatsFolder, "config.yml"); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + + // Check if the config file exists + if (!config.isSet("serverUuid")) { + + // Add default values + config.addDefault("enabled", true); + // Every server gets it's unique random id. + config.addDefault("serverUuid", UUID.randomUUID().toString()); + // Should failed request be logged? + config.addDefault("logFailedRequests", false); + + // Inform the server owners about bStats + config.options().header( + "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + + "To honor their work, you should not disable it.\n" + + "This has nearly no effect on the server performance!\n" + + "Check out https://bStats.org/ to learn more :)" + ).copyDefaults(true); + try { + config.save(configFile); + } catch (IOException ignored) { } + } + + // Load the data + serverUUID = config.getString("serverUuid"); + logFailedRequests = config.getBoolean("logFailedRequests", false); + if (config.getBoolean("enabled", true)) { + boolean found = false; + // Search for all other bStats Metrics classes to see if we are the first one + for (Class service : Bukkit.getServicesManager().getKnownServices()) { + try { + service.getField("B_STATS_VERSION"); // Our identifier :) + found = true; // We aren't the first + break; + } catch (NoSuchFieldException ignored) { } + } + // Register our service + Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal); + if (!found) { + // We are the first! + startSubmitting(); + } + } + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + if (chart == null) { + throw new IllegalArgumentException("Chart cannot be null!"); + } + charts.add(chart); + } + + /** + * Starts the Scheduler which submits our data every 30 minutes. + */ + private void startSubmitting() { + final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + if (!plugin.isEnabled()) { // Plugin was disabled + timer.cancel(); + return; + } + // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler + // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + submitData(); + } + }); + } + }, 1000*60*5, 1000*60*30); + // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start + // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! + // WARNING: Just don't do it! + } + + /** + * Gets the plugin specific data. + * This method is called using Reflection. + * + * @return The plugin specific data. + */ + public JSONObject getPluginData() { + JSONObject data = new JSONObject(); + + String pluginName = plugin.getDescription().getName(); + String pluginVersion = plugin.getDescription().getVersion(); + + data.put("pluginName", pluginName); // Append the name of the plugin + data.put("pluginVersion", pluginVersion); // Append the version of the plugin + JSONArray customCharts = new JSONArray(); + for (CustomChart customChart : charts) { + // Add the data of the custom charts + JSONObject chart = customChart.getRequestJsonObject(); + if (chart == null) { // If the chart is null, we skip it + continue; + } + customCharts.put(chart); + } + data.put("customCharts", customCharts); + + return data; + } + + /** + * Gets the server specific data. + * + * @return The server specific data. + */ + private JSONObject getServerData() { + // Minecraft specific data + int playerAmount = Bukkit.getOnlinePlayers().size(); + int onlineMode = Bukkit.getOnlineMode() ? 1 : 0; + String bukkitVersion = org.bukkit.Bukkit.getVersion(); + bukkitVersion = bukkitVersion.substring(bukkitVersion.indexOf("MC: ") + 4, bukkitVersion.length() - 1); + + // OS/Java specific data + String javaVersion = System.getProperty("java.version"); + String osName = System.getProperty("os.name"); + String osArch = System.getProperty("os.arch"); + String osVersion = System.getProperty("os.version"); + int coreCount = Runtime.getRuntime().availableProcessors(); + + JSONObject data = new JSONObject(); + + data.put("serverUUID", serverUUID); + + data.put("playerAmount", playerAmount); + data.put("onlineMode", onlineMode); + data.put("bukkitVersion", bukkitVersion); + + data.put("javaVersion", javaVersion); + data.put("osName", osName); + data.put("osArch", osArch); + data.put("osVersion", osVersion); + data.put("coreCount", coreCount); + + return data; + } + + /** + * Collects the data and sends it afterwards. + */ + private void submitData() { + final JSONObject data = getServerData(); + + JSONArray pluginData = new JSONArray(); + // Search for all other bStats Metrics classes to get their plugin data + for (Class service : Bukkit.getServicesManager().getKnownServices()) { + try { + service.getField("B_STATS_VERSION"); // Our identifier :) + } catch (NoSuchFieldException ignored) { + continue; // Continue "searching" + } + // Found one! + try { + pluginData.put(service.getMethod("getPluginData").invoke(Bukkit.getServicesManager().load(service))); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { } + } + + data.put("plugins", pluginData); + + // Create a new thread for the connection to the bStats server + new Thread(new Runnable() { + @Override + public void run() { + try { + // Send the data + sendData(data); + } catch (Exception e) { + // Something went wrong! :( + if (logFailedRequests) { + plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); + } + } + } + }).start(); + } + + /** + * Sends the data to the bStats server. + * + * @param data The data to send. + * @throws Exception If the request failed. + */ + private static void sendData(JSONObject data) throws Exception { + if (data == null) { + throw new IllegalArgumentException("Data cannot be null!"); + } + if (Bukkit.isPrimaryThread()) { + throw new IllegalAccessException("This method must not be called from the main thread!"); + } + HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); + + // Compress the data to save bandwidth + byte[] compressedData = compress(data.toString()); + + // Add headers + connection.setRequestMethod("POST"); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request + connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); + connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format + connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); + + // Send data + connection.setDoOutput(true); + DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); + outputStream.write(compressedData); + outputStream.flush(); + outputStream.close(); + + connection.getInputStream().close(); // We don't care about the response - Just send our data :) + } + + /** + * Gzips the given String. + * + * @param str The string to gzip. + * @return The gzipped String. + * @throws IOException If the compression failed. + */ + private static byte[] compress(final String str) throws IOException { + if (str == null) { + return null; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + GZIPOutputStream gzip = new GZIPOutputStream(outputStream); + gzip.write(str.getBytes("UTF-8")); + gzip.close(); + return outputStream.toByteArray(); + } + + /** + * Represents a custom chart. + */ + public static abstract class CustomChart { + + // The id of the chart + protected final String chartId; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public CustomChart(String chartId) { + if (chartId == null || chartId.isEmpty()) { + throw new IllegalArgumentException("ChartId cannot be null or empty!"); + } + this.chartId = chartId; + } + + protected JSONObject getRequestJsonObject() { + JSONObject chart = new JSONObject(); + chart.put("chartId", chartId); + try { + JSONObject data = getChartData(); + if (data == null) { + // If the data is null we don't send the chart. + return null; + } + chart.put("data", data); + } catch (Throwable t) { + if (logFailedRequests) { + Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t); + } + return null; + } + return chart; + } + + protected abstract JSONObject getChartData(); + + } + + /** + * Represents a custom simple pie. + */ + public static abstract class SimplePie extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public SimplePie(String chartId) { + super(chartId); + } + + /** + * Gets the value of the pie. + * + * @return The value of the pie. + */ + public abstract String getValue(); + + @Override + protected JSONObject getChartData() { + JSONObject data = new JSONObject(); + String value = getValue(); + if (value == null || value.isEmpty()) { + // Null = skip the chart + return null; + } + data.put("value", value); + return data; + } + } + + /** + * Represents a custom advanced pie. + */ + public static abstract class AdvancedPie extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public AdvancedPie(String chartId) { + super(chartId); + } + + /** + * Gets the values of the pie. + * + * @param valueMap Just an empty map. The only reason it exists is to make your life easier. + * You don't have to create a map yourself! + * @return The values of the pie. + */ + public abstract HashMap getValues(HashMap valueMap); + + @Override + protected JSONObject getChartData() { + JSONObject data = new JSONObject(); + JSONObject values = new JSONObject(); + HashMap map = getValues(new HashMap()); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + continue; // Skip this invalid + } + allSkipped = false; + values.put(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.put("values", values); + return data; + } + } + + /** + * Represents a custom single line chart. + */ + public static abstract class SingleLineChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public SingleLineChart(String chartId) { + super(chartId); + } + + /** + * Gets the value of the chart. + * + * @return The value of the chart. + */ + public abstract int getValue(); + + @Override + protected JSONObject getChartData() { + JSONObject data = new JSONObject(); + int value = getValue(); + if (value == 0) { + // Null = skip the chart + return null; + } + data.put("value", value); + return data; + } + + } + + /** + * Represents a custom multi line chart. + */ + public static abstract class MultiLineChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public MultiLineChart(String chartId) { + super(chartId); + } + + /** + * Gets the values of the chart. + * + * @param valueMap Just an empty map. The only reason it exists is to make your life easier. + * You don't have to create a map yourself! + * @return The values of the chart. + */ + public abstract HashMap getValues(HashMap valueMap); + + @Override + protected JSONObject getChartData() { + JSONObject data = new JSONObject(); + JSONObject values = new JSONObject(); + HashMap map = getValues(new HashMap()); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + continue; // Skip this invalid + } + allSkipped = false; + values.put(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.put("values", values); + return data; + } + + } + + /** + * Represents a custom simple bar chart. + */ + public static abstract class SimpleBarChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public SimpleBarChart(String chartId) { + super(chartId); + } + + /** + * Gets the value of the chart. + * + * @param valueMap Just an empty map. The only reason it exists is to make your life easier. + * You don't have to create a map yourself! + * @return The value of the chart. + */ + public abstract HashMap getValues(HashMap valueMap); + + @Override + protected JSONObject getChartData() { + JSONObject data = new JSONObject(); + JSONObject values = new JSONObject(); + HashMap map = getValues(new HashMap()); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + for (Map.Entry entry : map.entrySet()) { + JSONArray categoryValues = new JSONArray(); + categoryValues.put(entry.getValue()); + values.put(entry.getKey(), categoryValues); + } + data.put("values", values); + return data; + } + + } + + /** + * Represents a custom advanced bar chart. + */ + public static abstract class AdvancedBarChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public AdvancedBarChart(String chartId) { + super(chartId); + } + + /** + * Gets the value of the chart. + * + * @param valueMap Just an empty map. The only reason it exists is to make your life easier. + * You don't have to create a map yourself! + * @return The value of the chart. + */ + public abstract HashMap getValues(HashMap valueMap); + + @Override + protected JSONObject getChartData() { + JSONObject data = new JSONObject(); + JSONObject values = new JSONObject(); + HashMap map = getValues(new HashMap()); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().length == 0) { + continue; // Skip this invalid + } + allSkipped = false; + JSONArray categoryValues = new JSONArray(); + for (int categoryValue : entry.getValue()) { + categoryValues.put(categoryValue); + } + values.put(entry.getKey(), categoryValues); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.put("values", values); + return data; + } + + } + + /** + * Represents a custom simple map chart. + */ + public static abstract class SimpleMapChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public SimpleMapChart(String chartId) { + super(chartId); + } + + /** + * Gets the value of the chart. + * + * @return The value of the chart. + */ + public abstract Country getValue(); + + @Override + protected JSONObject getChartData() { + JSONObject data = new JSONObject(); + Country value = getValue(); + + if (value == null) { + // Null = skip the chart + return null; + } + data.put("value", value.getCountryIsoTag()); + return data; + } + + } + + /** + * Represents a custom advanced map chart. + */ + public static abstract class AdvancedMapChart extends CustomChart { + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + public AdvancedMapChart(String chartId) { + super(chartId); + } + + /** + * Gets the value of the chart. + * + * @param valueMap Just an empty map. The only reason it exists is to make your life easier. + * You don't have to create a map yourself! + * @return The value of the chart. + */ + public abstract HashMap getValues(HashMap valueMap); + + @Override + protected JSONObject getChartData() { + JSONObject data = new JSONObject(); + JSONObject values = new JSONObject(); + HashMap map = getValues(new HashMap()); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + continue; // Skip this invalid + } + allSkipped = false; + values.put(entry.getKey().getCountryIsoTag(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.put("values", values); + return data; + } + + } + + /** + * A enum which is used for custom maps. + */ + public enum Country { + + /** + * bStats will use the country of the server. + */ + AUTO_DETECT("AUTO", "Auto Detected"), + + ANDORRA("AD", "Andorra"), + UNITED_ARAB_EMIRATES("AE", "United Arab Emirates"), + AFGHANISTAN("AF", "Afghanistan"), + ANTIGUA_AND_BARBUDA("AG", "Antigua and Barbuda"), + ANGUILLA("AI", "Anguilla"), + ALBANIA("AL", "Albania"), + ARMENIA("AM", "Armenia"), + NETHERLANDS_ANTILLES("AN", "Netherlands Antilles"), + ANGOLA("AO", "Angola"), + ANTARCTICA("AQ", "Antarctica"), + ARGENTINA("AR", "Argentina"), + AMERICAN_SAMOA("AS", "American Samoa"), + AUSTRIA("AT", "Austria"), + AUSTRALIA("AU", "Australia"), + ARUBA("AW", "Aruba"), + ALAND_ISLANDS("AX", "Åland Islands"), + AZERBAIJAN("AZ", "Azerbaijan"), + BOSNIA_AND_HERZEGOVINA("BA", "Bosnia and Herzegovina"), + BARBADOS("BB", "Barbados"), + BANGLADESH("BD", "Bangladesh"), + BELGIUM("BE", "Belgium"), + BURKINA_FASO("BF", "Burkina Faso"), + BULGARIA("BG", "Bulgaria"), + BAHRAIN("BH", "Bahrain"), + BURUNDI("BI", "Burundi"), + BENIN("BJ", "Benin"), + SAINT_BARTHELEMY("BL", "Saint Barthélemy"), + BERMUDA("BM", "Bermuda"), + BRUNEI("BN", "Brunei"), + BOLIVIA("BO", "Bolivia"), + BONAIRE_SINT_EUSTATIUS_AND_SABA("BQ", "Bonaire, Sint Eustatius and Saba"), + BRAZIL("BR", "Brazil"), + BAHAMAS("BS", "Bahamas"), + BHUTAN("BT", "Bhutan"), + BOUVET_ISLAND("BV", "Bouvet Island"), + BOTSWANA("BW", "Botswana"), + BELARUS("BY", "Belarus"), + BELIZE("BZ", "Belize"), + CANADA("CA", "Canada"), + COCOS_ISLANDS("CC", "Cocos Islands"), + THE_DEMOCRATIC_REPUBLIC_OF_CONGO("CD", "The Democratic Republic Of Congo"), + CENTRAL_AFRICAN_REPUBLIC("CF", "Central African Republic"), + CONGO("CG", "Congo"), + SWITZERLAND("CH", "Switzerland"), + COTE_D_IVOIRE("CI", "Côte d'Ivoire"), + COOK_ISLANDS("CK", "Cook Islands"), + CHILE("CL", "Chile"), + CAMEROON("CM", "Cameroon"), + CHINA("CN", "China"), + COLOMBIA("CO", "Colombia"), + COSTA_RICA("CR", "Costa Rica"), + CUBA("CU", "Cuba"), + CAPE_VERDE("CV", "Cape Verde"), + CURACAO("CW", "Curaçao"), + CHRISTMAS_ISLAND("CX", "Christmas Island"), + CYPRUS("CY", "Cyprus"), + CZECH_REPUBLIC("CZ", "Czech Republic"), + GERMANY("DE", "Germany"), + DJIBOUTI("DJ", "Djibouti"), + DENMARK("DK", "Denmark"), + DOMINICA("DM", "Dominica"), + DOMINICAN_REPUBLIC("DO", "Dominican Republic"), + ALGERIA("DZ", "Algeria"), + ECUADOR("EC", "Ecuador"), + ESTONIA("EE", "Estonia"), + EGYPT("EG", "Egypt"), + WESTERN_SAHARA("EH", "Western Sahara"), + ERITREA("ER", "Eritrea"), + SPAIN("ES", "Spain"), + ETHIOPIA("ET", "Ethiopia"), + FINLAND("FI", "Finland"), + FIJI("FJ", "Fiji"), + FALKLAND_ISLANDS("FK", "Falkland Islands"), + MICRONESIA("FM", "Micronesia"), + FAROE_ISLANDS("FO", "Faroe Islands"), + FRANCE("FR", "France"), + GABON("GA", "Gabon"), + UNITED_KINGDOM("GB", "United Kingdom"), + GRENADA("GD", "Grenada"), + GEORGIA("GE", "Georgia"), + FRENCH_GUIANA("GF", "French Guiana"), + GUERNSEY("GG", "Guernsey"), + GHANA("GH", "Ghana"), + GIBRALTAR("GI", "Gibraltar"), + GREENLAND("GL", "Greenland"), + GAMBIA("GM", "Gambia"), + GUINEA("GN", "Guinea"), + GUADELOUPE("GP", "Guadeloupe"), + EQUATORIAL_GUINEA("GQ", "Equatorial Guinea"), + GREECE("GR", "Greece"), + SOUTH_GEORGIA_AND_THE_SOUTH_SANDWICH_ISLANDS("GS", "South Georgia And The South Sandwich Islands"), + GUATEMALA("GT", "Guatemala"), + GUAM("GU", "Guam"), + GUINEA_BISSAU("GW", "Guinea-Bissau"), + GUYANA("GY", "Guyana"), + HONG_KONG("HK", "Hong Kong"), + HEARD_ISLAND_AND_MCDONALD_ISLANDS("HM", "Heard Island And McDonald Islands"), + HONDURAS("HN", "Honduras"), + CROATIA("HR", "Croatia"), + HAITI("HT", "Haiti"), + HUNGARY("HU", "Hungary"), + INDONESIA("ID", "Indonesia"), + IRELAND("IE", "Ireland"), + ISRAEL("IL", "Israel"), + ISLE_OF_MAN("IM", "Isle Of Man"), + INDIA("IN", "India"), + BRITISH_INDIAN_OCEAN_TERRITORY("IO", "British Indian Ocean Territory"), + IRAQ("IQ", "Iraq"), + IRAN("IR", "Iran"), + ICELAND("IS", "Iceland"), + ITALY("IT", "Italy"), + JERSEY("JE", "Jersey"), + JAMAICA("JM", "Jamaica"), + JORDAN("JO", "Jordan"), + JAPAN("JP", "Japan"), + KENYA("KE", "Kenya"), + KYRGYZSTAN("KG", "Kyrgyzstan"), + CAMBODIA("KH", "Cambodia"), + KIRIBATI("KI", "Kiribati"), + COMOROS("KM", "Comoros"), + SAINT_KITTS_AND_NEVIS("KN", "Saint Kitts And Nevis"), + NORTH_KOREA("KP", "North Korea"), + SOUTH_KOREA("KR", "South Korea"), + KUWAIT("KW", "Kuwait"), + CAYMAN_ISLANDS("KY", "Cayman Islands"), + KAZAKHSTAN("KZ", "Kazakhstan"), + LAOS("LA", "Laos"), + LEBANON("LB", "Lebanon"), + SAINT_LUCIA("LC", "Saint Lucia"), + LIECHTENSTEIN("LI", "Liechtenstein"), + SRI_LANKA("LK", "Sri Lanka"), + LIBERIA("LR", "Liberia"), + LESOTHO("LS", "Lesotho"), + LITHUANIA("LT", "Lithuania"), + LUXEMBOURG("LU", "Luxembourg"), + LATVIA("LV", "Latvia"), + LIBYA("LY", "Libya"), + MOROCCO("MA", "Morocco"), + MONACO("MC", "Monaco"), + MOLDOVA("MD", "Moldova"), + MONTENEGRO("ME", "Montenegro"), + SAINT_MARTIN("MF", "Saint Martin"), + MADAGASCAR("MG", "Madagascar"), + MARSHALL_ISLANDS("MH", "Marshall Islands"), + MACEDONIA("MK", "Macedonia"), + MALI("ML", "Mali"), + MYANMAR("MM", "Myanmar"), + MONGOLIA("MN", "Mongolia"), + MACAO("MO", "Macao"), + NORTHERN_MARIANA_ISLANDS("MP", "Northern Mariana Islands"), + MARTINIQUE("MQ", "Martinique"), + MAURITANIA("MR", "Mauritania"), + MONTSERRAT("MS", "Montserrat"), + MALTA("MT", "Malta"), + MAURITIUS("MU", "Mauritius"), + MALDIVES("MV", "Maldives"), + MALAWI("MW", "Malawi"), + MEXICO("MX", "Mexico"), + MALAYSIA("MY", "Malaysia"), + MOZAMBIQUE("MZ", "Mozambique"), + NAMIBIA("NA", "Namibia"), + NEW_CALEDONIA("NC", "New Caledonia"), + NIGER("NE", "Niger"), + NORFOLK_ISLAND("NF", "Norfolk Island"), + NIGERIA("NG", "Nigeria"), + NICARAGUA("NI", "Nicaragua"), + NETHERLANDS("NL", "Netherlands"), + NORWAY("NO", "Norway"), + NEPAL("NP", "Nepal"), + NAURU("NR", "Nauru"), + NIUE("NU", "Niue"), + NEW_ZEALAND("NZ", "New Zealand"), + OMAN("OM", "Oman"), + PANAMA("PA", "Panama"), + PERU("PE", "Peru"), + FRENCH_POLYNESIA("PF", "French Polynesia"), + PAPUA_NEW_GUINEA("PG", "Papua New Guinea"), + PHILIPPINES("PH", "Philippines"), + PAKISTAN("PK", "Pakistan"), + POLAND("PL", "Poland"), + SAINT_PIERRE_AND_MIQUELON("PM", "Saint Pierre And Miquelon"), + PITCAIRN("PN", "Pitcairn"), + PUERTO_RICO("PR", "Puerto Rico"), + PALESTINE("PS", "Palestine"), + PORTUGAL("PT", "Portugal"), + PALAU("PW", "Palau"), + PARAGUAY("PY", "Paraguay"), + QATAR("QA", "Qatar"), + REUNION("RE", "Reunion"), + ROMANIA("RO", "Romania"), + SERBIA("RS", "Serbia"), + RUSSIA("RU", "Russia"), + RWANDA("RW", "Rwanda"), + SAUDI_ARABIA("SA", "Saudi Arabia"), + SOLOMON_ISLANDS("SB", "Solomon Islands"), + SEYCHELLES("SC", "Seychelles"), + SUDAN("SD", "Sudan"), + SWEDEN("SE", "Sweden"), + SINGAPORE("SG", "Singapore"), + SAINT_HELENA("SH", "Saint Helena"), + SLOVENIA("SI", "Slovenia"), + SVALBARD_AND_JAN_MAYEN("SJ", "Svalbard And Jan Mayen"), + SLOVAKIA("SK", "Slovakia"), + SIERRA_LEONE("SL", "Sierra Leone"), + SAN_MARINO("SM", "San Marino"), + SENEGAL("SN", "Senegal"), + SOMALIA("SO", "Somalia"), + SURINAME("SR", "Suriname"), + SOUTH_SUDAN("SS", "South Sudan"), + SAO_TOME_AND_PRINCIPE("ST", "Sao Tome And Principe"), + EL_SALVADOR("SV", "El Salvador"), + SINT_MAARTEN_DUTCH_PART("SX", "Sint Maarten (Dutch part)"), + SYRIA("SY", "Syria"), + SWAZILAND("SZ", "Swaziland"), + TURKS_AND_CAICOS_ISLANDS("TC", "Turks And Caicos Islands"), + CHAD("TD", "Chad"), + FRENCH_SOUTHERN_TERRITORIES("TF", "French Southern Territories"), + TOGO("TG", "Togo"), + THAILAND("TH", "Thailand"), + TAJIKISTAN("TJ", "Tajikistan"), + TOKELAU("TK", "Tokelau"), + TIMOR_LESTE("TL", "Timor-Leste"), + TURKMENISTAN("TM", "Turkmenistan"), + TUNISIA("TN", "Tunisia"), + TONGA("TO", "Tonga"), + TURKEY("TR", "Turkey"), + TRINIDAD_AND_TOBAGO("TT", "Trinidad and Tobago"), + TUVALU("TV", "Tuvalu"), + TAIWAN("TW", "Taiwan"), + TANZANIA("TZ", "Tanzania"), + UKRAINE("UA", "Ukraine"), + UGANDA("UG", "Uganda"), + UNITED_STATES_MINOR_OUTLYING_ISLANDS("UM", "United States Minor Outlying Islands"), + UNITED_STATES("US", "United States"), + URUGUAY("UY", "Uruguay"), + UZBEKISTAN("UZ", "Uzbekistan"), + VATICAN("VA", "Vatican"), + SAINT_VINCENT_AND_THE_GRENADINES("VC", "Saint Vincent And The Grenadines"), + VENEZUELA("VE", "Venezuela"), + BRITISH_VIRGIN_ISLANDS("VG", "British Virgin Islands"), + U_S__VIRGIN_ISLANDS("VI", "U.S. Virgin Islands"), + VIETNAM("VN", "Vietnam"), + VANUATU("VU", "Vanuatu"), + WALLIS_AND_FUTUNA("WF", "Wallis And Futuna"), + SAMOA("WS", "Samoa"), + YEMEN("YE", "Yemen"), + MAYOTTE("YT", "Mayotte"), + SOUTH_AFRICA("ZA", "South Africa"), + ZAMBIA("ZM", "Zambia"), + ZIMBABWE("ZW", "Zimbabwe"); + + private String isoTag; + private String name; + + Country(String isoTag, String name) { + this.isoTag = isoTag; + this.name = name; + } + + /** + * Gets the name of the country. + * + * @return The name of the country. + */ + public String getCountryName() { + return name; + } + + /** + * Gets the iso tag of the country. + * + * @return The iso tag of the country. + */ + public String getCountryIsoTag() { + return isoTag; + } + + /** + * Gets a country by it's iso tag. + * + * @param isoTag The iso tag of the county. + * @return The country with the given iso tag or null if unknown. + */ + public static Country byIsoTag(String isoTag) { + for (Country country : Country.values()) { + if (country.getCountryIsoTag().equals(isoTag)) { + return country; + } + } + return null; + } + + /** + * Gets a country by a locale. + * + * @param locale The locale. + * @return The country from the giben locale or null if unknown country or + * if the locale does not contain a country. + */ + public static Country byLocale(Locale locale) { + return byIsoTag(locale.getCountry()); + } + + } + +} diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/NumberUtil.java b/src/main/java/com/songoda/skyblock/utils/NumberUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/NumberUtil.java rename to src/main/java/com/songoda/skyblock/utils/NumberUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/StringUtil.java b/src/main/java/com/songoda/skyblock/utils/StringUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/StringUtil.java rename to src/main/java/com/songoda/skyblock/utils/StringUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/InventoryUtil.java b/src/main/java/com/songoda/skyblock/utils/item/InventoryUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/InventoryUtil.java rename to src/main/java/com/songoda/skyblock/utils/item/InventoryUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/ItemStackUtil.java b/src/main/java/com/songoda/skyblock/utils/item/ItemStackUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/ItemStackUtil.java rename to src/main/java/com/songoda/skyblock/utils/item/ItemStackUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/MaterialUtil.java b/src/main/java/com/songoda/skyblock/utils/item/MaterialUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/MaterialUtil.java rename to src/main/java/com/songoda/skyblock/utils/item/MaterialUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/SkullUtil.java b/src/main/java/com/songoda/skyblock/utils/item/SkullUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/SkullUtil.java rename to src/main/java/com/songoda/skyblock/utils/item/SkullUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/nInventoryUtil.java b/src/main/java/com/songoda/skyblock/utils/item/nInventoryUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/item/nInventoryUtil.java rename to src/main/java/com/songoda/skyblock/utils/item/nInventoryUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/math/VectorUtil.java b/src/main/java/com/songoda/skyblock/utils/math/VectorUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/math/VectorUtil.java rename to src/main/java/com/songoda/skyblock/utils/math/VectorUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/player/NameFetcher.java b/src/main/java/com/songoda/skyblock/utils/player/NameFetcher.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/player/NameFetcher.java rename to src/main/java/com/songoda/skyblock/utils/player/NameFetcher.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java b/src/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java rename to src/main/java/com/songoda/skyblock/utils/player/OfflinePlayer.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/Area.java b/src/main/java/com/songoda/skyblock/utils/structure/Area.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/Area.java rename to src/main/java/com/songoda/skyblock/utils/structure/Area.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/Location.java b/src/main/java/com/songoda/skyblock/utils/structure/Location.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/Location.java rename to src/main/java/com/songoda/skyblock/utils/structure/Location.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java b/src/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java rename to src/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/SelectionLocation.java b/src/main/java/com/songoda/skyblock/utils/structure/SelectionLocation.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/SelectionLocation.java rename to src/main/java/com/songoda/skyblock/utils/structure/SelectionLocation.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/Storage.java b/src/main/java/com/songoda/skyblock/utils/structure/Storage.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/Storage.java rename to src/main/java/com/songoda/skyblock/utils/structure/Storage.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/Structure.java b/src/main/java/com/songoda/skyblock/utils/structure/Structure.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/Structure.java rename to src/main/java/com/songoda/skyblock/utils/structure/Structure.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java rename to src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/version/Materials.java b/src/main/java/com/songoda/skyblock/utils/version/Materials.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/version/Materials.java rename to src/main/java/com/songoda/skyblock/utils/version/Materials.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/version/NMSUtil.java b/src/main/java/com/songoda/skyblock/utils/version/NMSUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/version/NMSUtil.java rename to src/main/java/com/songoda/skyblock/utils/version/NMSUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/version/SBiome.java b/src/main/java/com/songoda/skyblock/utils/version/SBiome.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/version/SBiome.java rename to src/main/java/com/songoda/skyblock/utils/version/SBiome.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/version/Sounds.java b/src/main/java/com/songoda/skyblock/utils/version/Sounds.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/version/Sounds.java rename to src/main/java/com/songoda/skyblock/utils/version/Sounds.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/LocationUtil.java b/src/main/java/com/songoda/skyblock/utils/world/LocationUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/LocationUtil.java rename to src/main/java/com/songoda/skyblock/utils/world/LocationUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java b/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java rename to src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockData.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockData.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockData.java rename to src/main/java/com/songoda/skyblock/utils/world/block/BlockData.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockDataType.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockDataType.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockDataType.java rename to src/main/java/com/songoda/skyblock/utils/world/block/BlockDataType.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockDegreesType.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockDegreesType.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockDegreesType.java rename to src/main/java/com/songoda/skyblock/utils/world/block/BlockDegreesType.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java rename to src/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java rename to src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/entity/EntityData.java b/src/main/java/com/songoda/skyblock/utils/world/entity/EntityData.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/entity/EntityData.java rename to src/main/java/com/songoda/skyblock/utils/world/entity/EntityData.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java b/src/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java rename to src/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/visit/Visit.java b/src/main/java/com/songoda/skyblock/visit/Visit.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/visit/Visit.java rename to src/main/java/com/songoda/skyblock/visit/Visit.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/visit/VisitManager.java b/src/main/java/com/songoda/skyblock/visit/VisitManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/visit/VisitManager.java rename to src/main/java/com/songoda/skyblock/visit/VisitManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/visit/VisitTask.java b/src/main/java/com/songoda/skyblock/visit/VisitTask.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/visit/VisitTask.java rename to src/main/java/com/songoda/skyblock/visit/VisitTask.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/world/WorldManager.java b/src/main/java/com/songoda/skyblock/world/WorldManager.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/world/WorldManager.java rename to src/main/java/com/songoda/skyblock/world/WorldManager.java diff --git a/FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/world/generator/VoidGenerator.java b/src/main/java/com/songoda/skyblock/world/generator/VoidGenerator.java similarity index 100% rename from FabledSkyBlock/Core/src/main/java/com/songoda/skyblock/world/generator/VoidGenerator.java rename to src/main/java/com/songoda/skyblock/world/generator/VoidGenerator.java diff --git a/FabledSkyBlock/Core/src/main/resources/config.yml b/src/main/resources/config.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/config.yml rename to src/main/resources/config.yml diff --git a/FabledSkyBlock/Core/src/main/resources/generators.yml b/src/main/resources/generators.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/generators.yml rename to src/main/resources/generators.yml diff --git a/FabledSkyBlock/Core/src/main/resources/language.yml b/src/main/resources/language.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/language.yml rename to src/main/resources/language.yml diff --git a/FabledSkyBlock/Core/src/main/resources/levelling.yml b/src/main/resources/levelling.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/levelling.yml rename to src/main/resources/levelling.yml diff --git a/FabledSkyBlock/Core/src/main/resources/limits.yml b/src/main/resources/limits.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/limits.yml rename to src/main/resources/limits.yml diff --git a/FabledSkyBlock/Core/src/main/resources/plugin.yml b/src/main/resources/plugin.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/plugin.yml rename to src/main/resources/plugin.yml diff --git a/FabledSkyBlock/Core/src/main/resources/settings.yml b/src/main/resources/settings.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/settings.yml rename to src/main/resources/settings.yml diff --git a/FabledSkyBlock/Core/src/main/resources/stackables.yml b/src/main/resources/stackables.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/stackables.yml rename to src/main/resources/stackables.yml diff --git a/FabledSkyBlock/Core/src/main/resources/structures.yml b/src/main/resources/structures.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/structures.yml rename to src/main/resources/structures.yml diff --git a/FabledSkyBlock/Core/src/main/resources/structures/default.structure b/src/main/resources/structures/default.structure similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/structures/default.structure rename to src/main/resources/structures/default.structure diff --git a/FabledSkyBlock/Core/src/main/resources/upgrades.yml b/src/main/resources/upgrades.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/upgrades.yml rename to src/main/resources/upgrades.yml diff --git a/FabledSkyBlock/Core/src/main/resources/worlds.yml b/src/main/resources/worlds.yml similarity index 100% rename from FabledSkyBlock/Core/src/main/resources/worlds.yml rename to src/main/resources/worlds.yml From 1e1da915fe98bfff5d4e61115c5414114c280761 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 00:00:59 -0600 Subject: [PATCH 08/45] Fixed entities being placed outside of the border --- .../songoda/skyblock/listeners/Entity.java | 1288 ++++++++--------- .../songoda/skyblock/listeners/Interact.java | 15 +- .../skyblock/listeners/Projectile.java | 68 +- 3 files changed, 692 insertions(+), 679 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index be11546e..3be2370f 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -46,648 +46,648 @@ import java.util.UUID; public class Entity implements Listener { - private final SkyBlock skyblock; - - private Set preventFireTicks = new HashSet<>(); - - public Entity(SkyBlock skyblock) { - this.skyblock = skyblock; - } - - @EventHandler - public void onEntityDamage(EntityDamageEvent event) { - if (!(event.getEntity() instanceof Player)) { - return; - } - - Player player = (Player) event.getEntity(); - - FileManager fileManager = skyblock.getFileManager(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (event.getCause() != null) { - if (event.getCause() == DamageCause.VOID) { - return; - } else if (event.getCause() == DamageCause.ENTITY_ATTACK) { - EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event; - - if (entityDamageByEntityEvent.getDamager() != null - && entityDamageByEntityEvent.getDamager() instanceof Player) { - return; - } - } else { - if (NMSUtil.getVersionNumber() > 11) { - if (event.getCause() == DamageCause.valueOf("ENTITY_SWEEP_ATTACK")) { - EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event; - - if (entityDamageByEntityEvent.getDamager() != null - && entityDamageByEntityEvent.getDamager() instanceof Player) { - return; - } - } - } - } - } - - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (configLoad.getBoolean("Island.Settings.Damage.Enable")) { - if (!skyblock.getIslandManager().hasSetting(player.getLocation(), IslandRole.Owner, "Damage")) { - event.setCancelled(true); - } - } else if (!configLoad.getBoolean("Island.Damage.Enable")) { - event.setCancelled(true); - } - } - - // Fix a bug in minecraft where arrows with flame still apply fire ticks even if the shot entity isn't damaged - if (preventFireTicks.contains(player.getUniqueId()) && event.getCause() == DamageCause.FIRE_TICK) { - player.setFireTicks(0); - event.setCancelled(true); - } - } - - @EventHandler - public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { - MessageManager messageManager = skyblock.getMessageManager(); - IslandManager islandManager = skyblock.getIslandManager(); - SoundManager soundManager = skyblock.getSoundManager(); - FileManager fileManager = skyblock.getFileManager(); - - if (event.getDamager() instanceof Player) { - Player player = (Player) event.getDamager(); - org.bukkit.entity.Entity entity = event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { - if (entity instanceof Player) { - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { - event.setCancelled(true); - } - } else if (!configLoad.getBoolean("Island.PvP.Enable")) { - event.setCancelled(true); - } - } else if (entity instanceof ArmorStand) { - if (!islandManager.hasPermission(player, entity.getLocation(), "Destroy")) { - event.setCancelled(true); - - messageManager.sendMessage(player, - fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } else { - if (!islandManager.hasPermission(player, entity.getLocation(), "MobHurting")) { - event.setCancelled(true); - - messageManager.sendMessage(player, - fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - - return; - } - } - } - - return; - } - - if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof Player) { - Player player = (Player) ((Projectile) event.getDamager()).getShooter(); - org.bukkit.entity.Entity entity = event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { - if (event.getEntity() instanceof Player) { - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (entity.getType() == EntityType.ITEM_FRAME && !islandManager.hasPermission(player, entity.getLocation(), "HangingDestroy")) { - event.setCancelled(true); - return; - } - - if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { - event.setCancelled(true); - } - } else if (!configLoad.getBoolean("Island.PvP.Enable")) { - event.setCancelled(true); - } - } else { - if (!islandManager.hasPermission(player, entity.getLocation(), "MobHurting")) { - event.setCancelled(true); - - messageManager.sendMessage(player, - fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - - return; - } - } - } - } else if (event.getEntity() instanceof Player) { - Player player = (Player) event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (configLoad.getBoolean("Island.Settings.Damage.Enable")) { - if (!islandManager.hasSetting(player.getLocation(), IslandRole.Owner, "Damage") - || (event.getDamager() instanceof TNTPrimed && !islandManager - .hasSetting(player.getLocation(), IslandRole.Owner, "Explosions"))) { - event.setCancelled(true); - } - } else if (!configLoad.getBoolean("Island.Damage.Enable")) { - event.setCancelled(true); - } - } - } else if (event.getDamager() instanceof TNTPrimed) { - org.bukkit.entity.Entity entity = event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "Explosions")) { - event.setCancelled(true); - } - } - } - - // Fix a bug in minecraft where arrows with flame still apply fire ticks even if the shot entity isn't damaged - if (event.isCancelled() && event.getEntity() != null && event.getDamager() instanceof Arrow && ((Arrow) event.getDamager()).getShooter() instanceof Player) { - Arrow arrow = (Arrow) event.getDamager(); - if (arrow.getFireTicks() != 0) { - preventFireTicks.add(event.getEntity().getUniqueId()); - new BukkitRunnable() { - public void run() { - preventFireTicks.remove(event.getEntity().getUniqueId()); - } - }.runTaskLater(SkyBlock.getInstance(), 5L); - } - } - } - - @EventHandler - public void onPlayerShearEntity(PlayerShearEntityEvent event) { - Player player = event.getPlayer(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "Shearing")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onStackableInteract(PlayerArmorStandManipulateEvent event) { - Player player = event.getPlayer(); - if (!skyblock.getIslandManager().hasPermission(player, event.getRightClicked().getLocation(), "ArmorStandUse")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - - if (NMSUtil.getVersionNumber() != 8) - return; - - StackableManager stackableManager = SkyBlock.getInstance().getStackableManager(); - if (stackableManager == null) - return; - - ArmorStand armorStand = event.getRightClicked(); - for (Location stackLocation : stackableManager.getStacks().keySet()) { - if (stackLocation.getWorld().equals(armorStand.getWorld()) && armorStand.getLocation().distanceSquared(stackLocation) <= 1.5) { - event.setCancelled(true); - return; - } - } - } - - @EventHandler - public void onHangingPlace(HangingPlaceEvent event) { - Player player = event.getPlayer(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), - "EntityPlacement")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onHangingBreak(HangingBreakEvent event) { - Hanging hanging = event.getEntity(); - - if (event.getCause() != RemoveCause.EXPLOSION) { - return; - } - - if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { - if (!skyblock.getIslandManager().hasSetting(hanging.getLocation(), IslandRole.Owner, "Explosions")) { - event.setCancelled(true); - } - } - } - - @EventHandler - public void onHangingBreak(HangingBreakByEntityEvent event) { - Hanging hanging = event.getEntity(); - - if (!(event.getRemover() instanceof Player)) { - return; - } - - Player player = (Player) event.getRemover(); - - if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onHangingInteract(PlayerInteractEntityEvent event) { - if (!(event.getRightClicked() instanceof Hanging)) { - return; - } - - Player player = event.getPlayer(); - Hanging hanging = (Hanging) event.getRightClicked(); - - if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onHangingRemoveItem(EntityDamageByEntityEvent event) { - if (!(event.getDamager() instanceof Player && event.getEntity() instanceof Hanging)) { - return; - } - - Player player = (Player) event.getDamager(); - Hanging hanging = (Hanging) event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onEntityTaming(EntityTameEvent event) { - if (!(event.getOwner() instanceof Player)) { - return; - } - - Player player = (Player) event.getOwner(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "MobTaming")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - @SuppressWarnings("deprecation") - public void onEntityChangeBlock(EntityChangeBlockEvent event) { - org.bukkit.entity.Entity entity = event.getEntity(); - - if (entity instanceof Player) { - return; - } - - IslandManager islandManager = skyblock.getIslandManager(); - WorldManager worldManager = skyblock.getWorldManager(); - - Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); - - if (island == null || !skyblock.getWorldManager().isIslandWorld(entity.getWorld())) return; - - if (event.isCancelled()) return; - - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); - - org.bukkit.block.Block block = event.getBlock(); - - // Check spawn block falling, this can be a bit glitchy, but it's better than nothing - if ((LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone().subtract(0, 1, 0)) - || LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Visitor).clone().subtract(0, 1, 0))) && - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - return; - } - - if ((event.getEntityType() == EntityType.FALLING_BLOCK) && LocationUtil.isLocationLocation(event.getBlock().getLocation(), - island.getLocation(world, IslandEnvironment.Main) - .clone()) - && configLoad.getBoolean("Island.Spawn.Protection")) { - FallingBlock fallingBlock = (FallingBlock) event.getEntity(); - if (fallingBlock.getDropItem()) { - if (NMSUtil.getVersionNumber() > 12) { - fallingBlock.getWorld().dropItemNaturally(fallingBlock.getLocation(), new ItemStack(fallingBlock.getBlockData().getMaterial(), 1)); - } else { - try { - Method getBlockDataMethod = FallingBlock.class.getMethod("getBlockData"); - byte data = (byte) getBlockDataMethod.invoke(fallingBlock); - if (fallingBlock.getMaterial().name().endsWith("ANVIL")) { - data = (byte) Math.ceil(data / 4.0); - } - fallingBlock.getWorld().dropItemNaturally(fallingBlock.getLocation(), new ItemStack(fallingBlock.getMaterial(), 1, data)); - } catch (Exception ignored) { - } - } - } - event.setCancelled(true); - } - - if (entity instanceof FallingBlock) - return; - - // Check entities interacting with spawn - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world) && - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - return; - } - - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "MobGriefing")) { - event.setCancelled(true); - } - - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")) - .getFileConfiguration().getBoolean("Island.Block.Level.Enable")) return; - - Materials materials = Materials.getMaterials(block.getType(), block.getData()); - - if (materials != null) { - IslandLevel level = island.getLevel(); - - if (level.hasMaterial(materials.name())) { - long materialAmount = level.getMaterialAmount(materials.name()); - - if (materialAmount - 1 <= 0) { - level.removeMaterial(materials.name()); - } else { - level.setMaterialAmount(materials.name(), materialAmount - 1); - } - } - } - - if (event.getTo() != null && event.getTo() != Material.AIR) { - materials = null; - - if (NMSUtil.getVersionNumber() > 12) { - materials = Materials.fromString(event.getTo().name()); - } else { - try { - materials = Materials.requestMaterials(event.getTo().name(), - (byte) event.getClass().getMethod("getData").invoke(event)); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException - | NoSuchMethodException | SecurityException e) { - e.printStackTrace(); - } - } - - if (materials != null) { - long materialAmount = 0; - IslandLevel level = island.getLevel(); - - if (level.hasMaterial(materials.name())) { - materialAmount = level.getMaterialAmount(materials.name()); - } - - level.setMaterialAmount(materials.name(), materialAmount + 1); - } - } - - } - - @EventHandler - public void onEntityExplode(EntityExplodeEvent event) { - org.bukkit.entity.Entity entity = event.getEntity(); - - WorldManager worldManager = skyblock.getWorldManager(); - IslandManager islandManager = skyblock.getIslandManager(); - - if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "Explosions")) { - event.setCancelled(true); - } - - if (!event.isCancelled()) { - Island island = islandManager.getIslandAtLocation(entity.getLocation()); - - if (island != null) { - if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")) - .getFileConfiguration().getBoolean("Island.Block.Level.Enable")) { - for (org.bukkit.block.Block blockList : event.blockList()) { - @SuppressWarnings("deprecation") - Materials materials = Materials.getMaterials(blockList.getType(), blockList.getData()); - - if (materials != null) { - IslandLevel level = island.getLevel(); - - if (level.hasMaterial(materials.name())) { - long materialAmount = level.getMaterialAmount(materials.name()); - - if (materialAmount - 1 <= 0) { - level.removeMaterial(materials.name()); - } else { - level.setMaterialAmount(materials.name(), materialAmount - 1); - } - } - } - } - } - - if (SkyBlock.getInstance().getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { - IslandWorld world = worldManager.getIslandWorld(event.getEntity().getWorld()); - for (org.bukkit.block.Block block : event.blockList()) { - if (LocationUtil.isLocationLocation(block.getLocation(), - island.getLocation(world, IslandEnvironment.Main) - .clone() - .subtract(0.0D, 1.0D, 0.0D))) { - event.blockList().remove(block); - break; - } - } - } - } - } - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onEntityDeath(EntityDeathEvent event) { - LivingEntity livingEntity = event.getEntity(); - - // Certain entities shouldn't drop twice the amount - if (livingEntity instanceof Player - || livingEntity instanceof ArmorStand - || livingEntity instanceof Horse) { - return; - } - - if (NMSUtil.getVersionNumber() > 9) { - if (livingEntity instanceof Donkey || livingEntity instanceof Mule || livingEntity instanceof ElderGuardian) - return; - } - - if (NMSUtil.getVersionNumber() > 10) { - if (livingEntity instanceof Evoker) - return; - } - - if (NMSUtil.getVersionNumber() > 13) { - if (livingEntity instanceof Ravager || livingEntity instanceof Illager) - return; - } - - if (livingEntity.hasMetadata("SkyBlock")) - return; - - IslandManager islandManager = skyblock.getIslandManager(); - - if (skyblock.getWorldManager().isIslandWorld(livingEntity.getWorld())) { - Island island = islandManager.getIslandAtLocation(livingEntity.getLocation()); - - if (island != null) { - List upgrades = skyblock.getUpgradeManager().getUpgrades(Upgrade.Type.Drops); - - if (upgrades != null && upgrades.size() > 0 && upgrades.get(0).isEnabled() && island.isUpgrade(Upgrade.Type.Drops)) { - Set dontMultiply = new HashSet<>(); - - if (NMSUtil.getVersionNumber() > 8) { - EntityEquipment equipment = livingEntity.getEquipment(); - if (equipment != null) { - for (ItemStack item : event.getDrops()) { - if (item.equals(equipment.getHelmet()) - || item.equals(equipment.getChestplate()) - || item.equals(equipment.getLeggings()) - || item.equals(equipment.getBoots()) - || item.equals(equipment.getItemInMainHand()) - || item.equals(equipment.getItemInOffHand())) { - dontMultiply.add(item); - } - } - } - - if (livingEntity instanceof Pig) { - Pig pig = (Pig) livingEntity; - if (pig.hasSaddle()) - dontMultiply.add(new ItemStack(Material.SADDLE, 1)); - } - } - - for (ItemStack is : event.getDrops()) - if (!dontMultiply.contains(is)) - livingEntity.getWorld().dropItemNaturally(livingEntity.getLocation(), is); - } - } - } - } - - @EventHandler - public void onEntityTargetLivingEntity(EntityTargetLivingEntityEvent event) { - if (!(event.getTarget() instanceof Player)) { - return; - } - - if (!(event.getEntity() instanceof ExperienceOrb)) { - return; - } - - Player player = (Player) event.getTarget(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, "ExperienceOrbPickup")) { - event.setTarget(null); - event.setCancelled(true); - } - } - } - - @EventHandler - public void onCreatureSpawn(CreatureSpawnEvent event) { - if (event.getEntity() instanceof ArmorStand - || event.getEntity() instanceof FallingBlock - || event.getEntity() instanceof org.bukkit.entity.Item) { - return; - } - - if (!(event.getSpawnReason() == SpawnReason.NATURAL || event.getSpawnReason() == SpawnReason.JOCKEY || event.getSpawnReason() == SpawnReason.MOUNT)) - return; - - LivingEntity livingEntity = event.getEntity(); - - if (livingEntity.hasMetadata("SkyBlock")) - return; - - if (skyblock.getWorldManager().isIslandWorld(livingEntity.getWorld())) { - if (!skyblock.getIslandManager().hasSetting(livingEntity.getLocation(), IslandRole.Owner, "NaturalMobSpawning")) { - if (event.getSpawnReason() == SpawnReason.JOCKEY || event.getSpawnReason() == SpawnReason.MOUNT) { - Bukkit.getScheduler().scheduleSyncDelayedTask(skyblock, () -> { - if (NMSUtil.getVersionNumber() > 10) { // getPassengers() was added in 1.11 - for (org.bukkit.entity.Entity passenger : livingEntity.getPassengers()) - passenger.remove(); - } else { - if (livingEntity.getPassenger() != null) - livingEntity.getPassenger().remove(); - } - livingEntity.remove(); - }); - } else { - livingEntity.remove(); - } - } - } - } + private final SkyBlock skyblock; + + private Set preventFireTicks = new HashSet<>(); + + public Entity(SkyBlock skyblock) { + this.skyblock = skyblock; + } + + @EventHandler + public void onEntityDamage(EntityDamageEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + + Player player = (Player) event.getEntity(); + + FileManager fileManager = skyblock.getFileManager(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (event.getCause() != null) { + if (event.getCause() == DamageCause.VOID) { + return; + } else if (event.getCause() == DamageCause.ENTITY_ATTACK) { + EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event; + + if (entityDamageByEntityEvent.getDamager() != null + && entityDamageByEntityEvent.getDamager() instanceof Player) { + return; + } + } else { + if (NMSUtil.getVersionNumber() > 11) { + if (event.getCause() == DamageCause.valueOf("ENTITY_SWEEP_ATTACK")) { + EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event; + + if (entityDamageByEntityEvent.getDamager() != null + && entityDamageByEntityEvent.getDamager() instanceof Player) { + return; + } + } + } + } + } + + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (configLoad.getBoolean("Island.Settings.Damage.Enable")) { + if (!skyblock.getIslandManager().hasSetting(player.getLocation(), IslandRole.Owner, "Damage")) { + event.setCancelled(true); + } + } else if (!configLoad.getBoolean("Island.Damage.Enable")) { + event.setCancelled(true); + } + } + + // Fix a bug in minecraft where arrows with flame still apply fire ticks even if the shot entity isn't damaged + if (preventFireTicks.contains(player.getUniqueId()) && event.getCause() == DamageCause.FIRE_TICK) { + player.setFireTicks(0); + event.setCancelled(true); + } + } + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + MessageManager messageManager = skyblock.getMessageManager(); + IslandManager islandManager = skyblock.getIslandManager(); + SoundManager soundManager = skyblock.getSoundManager(); + FileManager fileManager = skyblock.getFileManager(); + + if (event.getDamager() instanceof Player) { + Player player = (Player) event.getDamager(); + org.bukkit.entity.Entity entity = event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { + if (entity instanceof Player) { + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { + event.setCancelled(true); + } + } else if (!configLoad.getBoolean("Island.PvP.Enable")) { + event.setCancelled(true); + } + } else if (entity instanceof ArmorStand) { + if (!islandManager.hasPermission(player, entity.getLocation(), "Destroy")) { + event.setCancelled(true); + + messageManager.sendMessage(player, + fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } else { + if (!islandManager.hasPermission(player, entity.getLocation(), "MobHurting")) { + event.setCancelled(true); + + messageManager.sendMessage(player, + fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + + return; + } + } + } + + return; + } + + if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof Player) { + Player player = (Player) ((Projectile) event.getDamager()).getShooter(); + org.bukkit.entity.Entity entity = event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { + if (event.getEntity() instanceof Player) { + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (entity.getType() == EntityType.ITEM_FRAME && !islandManager.hasPermission(player, entity.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + return; + } + + if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { + event.setCancelled(true); + } + } else if (!configLoad.getBoolean("Island.PvP.Enable")) { + event.setCancelled(true); + } + } else { + if (!islandManager.hasPermission(player, entity.getLocation(), "MobHurting")) { + event.setCancelled(true); + + messageManager.sendMessage(player, + fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + + return; + } + } + } + } else if (event.getEntity() instanceof Player) { + Player player = (Player) event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (configLoad.getBoolean("Island.Settings.Damage.Enable")) { + if (!islandManager.hasSetting(player.getLocation(), IslandRole.Owner, "Damage") + || (event.getDamager() instanceof TNTPrimed && !islandManager + .hasSetting(player.getLocation(), IslandRole.Owner, "Explosions"))) { + event.setCancelled(true); + } + } else if (!configLoad.getBoolean("Island.Damage.Enable")) { + event.setCancelled(true); + } + } + } else if (event.getDamager() instanceof TNTPrimed) { + org.bukkit.entity.Entity entity = event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "Explosions")) { + event.setCancelled(true); + } + } + } + + // Fix a bug in minecraft where arrows with flame still apply fire ticks even if the shot entity isn't damaged + if (event.isCancelled() && event.getEntity() != null && event.getDamager() instanceof Arrow && ((Arrow) event.getDamager()).getShooter() instanceof Player) { + Arrow arrow = (Arrow) event.getDamager(); + if (arrow.getFireTicks() != 0) { + preventFireTicks.add(event.getEntity().getUniqueId()); + new BukkitRunnable() { + public void run() { + preventFireTicks.remove(event.getEntity().getUniqueId()); + } + }.runTaskLater(SkyBlock.getInstance(), 5L); + } + } + } + + @EventHandler + public void onPlayerShearEntity(PlayerShearEntityEvent event) { + Player player = event.getPlayer(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "Shearing")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onStackableInteract(PlayerArmorStandManipulateEvent event) { + Player player = event.getPlayer(); + if (!skyblock.getIslandManager().hasPermission(player, event.getRightClicked().getLocation(), "ArmorStandUse")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + + if (NMSUtil.getVersionNumber() != 8) + return; + + StackableManager stackableManager = SkyBlock.getInstance().getStackableManager(); + if (stackableManager == null) + return; + + ArmorStand armorStand = event.getRightClicked(); + for (Location stackLocation : stackableManager.getStacks().keySet()) { + if (stackLocation.getWorld().equals(armorStand.getWorld()) && armorStand.getLocation().distanceSquared(stackLocation) <= 1.5) { + event.setCancelled(true); + return; + } + } + } + + @EventHandler + public void onHangingPlace(HangingPlaceEvent event) { + Player player = event.getPlayer(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), + "EntityPlacement")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onHangingBreak(HangingBreakEvent event) { + Hanging hanging = event.getEntity(); + + if (event.getCause() != RemoveCause.EXPLOSION) { + return; + } + + if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { + if (!skyblock.getIslandManager().hasSetting(hanging.getLocation(), IslandRole.Owner, "Explosions")) { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onHangingBreak(HangingBreakByEntityEvent event) { + Hanging hanging = event.getEntity(); + + if (!(event.getRemover() instanceof Player)) { + return; + } + + Player player = (Player) event.getRemover(); + + if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onHangingInteract(PlayerInteractEntityEvent event) { + if (!(event.getRightClicked() instanceof Hanging)) { + return; + } + + Player player = event.getPlayer(); + Hanging hanging = (Hanging) event.getRightClicked(); + + if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onHangingRemoveItem(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player && event.getEntity() instanceof Hanging)) { + return; + } + + Player player = (Player) event.getDamager(); + Hanging hanging = (Hanging) event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onEntityTaming(EntityTameEvent event) { + if (!(event.getOwner() instanceof Player)) { + return; + } + + Player player = (Player) event.getOwner(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "MobTaming")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + @SuppressWarnings("deprecation") + public void onEntityChangeBlock(EntityChangeBlockEvent event) { + org.bukkit.entity.Entity entity = event.getEntity(); + + if (entity instanceof Player) { + return; + } + + IslandManager islandManager = skyblock.getIslandManager(); + WorldManager worldManager = skyblock.getWorldManager(); + + Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); + + if (island == null || !skyblock.getWorldManager().isIslandWorld(entity.getWorld())) return; + + if (event.isCancelled()) return; + + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); + + org.bukkit.block.Block block = event.getBlock(); + + // Check spawn block falling, this can be a bit glitchy, but it's better than nothing + if ((LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone().subtract(0, 1, 0)) + || LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Visitor).clone().subtract(0, 1, 0))) && + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + return; + } + + if ((event.getEntityType() == EntityType.FALLING_BLOCK) && LocationUtil.isLocationLocation(event.getBlock().getLocation(), + island.getLocation(world, IslandEnvironment.Main) + .clone()) + && configLoad.getBoolean("Island.Spawn.Protection")) { + FallingBlock fallingBlock = (FallingBlock) event.getEntity(); + if (fallingBlock.getDropItem()) { + if (NMSUtil.getVersionNumber() > 12) { + fallingBlock.getWorld().dropItemNaturally(fallingBlock.getLocation(), new ItemStack(fallingBlock.getBlockData().getMaterial(), 1)); + } else { + try { + Method getBlockDataMethod = FallingBlock.class.getMethod("getBlockData"); + byte data = (byte) getBlockDataMethod.invoke(fallingBlock); + if (fallingBlock.getMaterial().name().endsWith("ANVIL")) { + data = (byte) Math.ceil(data / 4.0); + } + fallingBlock.getWorld().dropItemNaturally(fallingBlock.getLocation(), new ItemStack(fallingBlock.getMaterial(), 1, data)); + } catch (Exception ignored) { + } + } + } + event.setCancelled(true); + } + + if (entity instanceof FallingBlock) + return; + + // Check entities interacting with spawn + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world) && + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + return; + } + + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "MobGriefing")) { + event.setCancelled(true); + } + + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")) + .getFileConfiguration().getBoolean("Island.Block.Level.Enable")) return; + + Materials materials = Materials.getMaterials(block.getType(), block.getData()); + + if (materials != null) { + IslandLevel level = island.getLevel(); + + if (level.hasMaterial(materials.name())) { + long materialAmount = level.getMaterialAmount(materials.name()); + + if (materialAmount - 1 <= 0) { + level.removeMaterial(materials.name()); + } else { + level.setMaterialAmount(materials.name(), materialAmount - 1); + } + } + } + + if (event.getTo() != null && event.getTo() != Material.AIR) { + materials = null; + + if (NMSUtil.getVersionNumber() > 12) { + materials = Materials.fromString(event.getTo().name()); + } else { + try { + materials = Materials.requestMaterials(event.getTo().name(), + (byte) event.getClass().getMethod("getData").invoke(event)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } + } + + if (materials != null) { + long materialAmount = 0; + IslandLevel level = island.getLevel(); + + if (level.hasMaterial(materials.name())) { + materialAmount = level.getMaterialAmount(materials.name()); + } + + level.setMaterialAmount(materials.name(), materialAmount + 1); + } + } + + } + + @EventHandler + public void onEntityExplode(EntityExplodeEvent event) { + org.bukkit.entity.Entity entity = event.getEntity(); + + WorldManager worldManager = skyblock.getWorldManager(); + IslandManager islandManager = skyblock.getIslandManager(); + + if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "Explosions")) { + event.setCancelled(true); + } + + if (!event.isCancelled()) { + Island island = islandManager.getIslandAtLocation(entity.getLocation()); + + if (island != null) { + if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")) + .getFileConfiguration().getBoolean("Island.Block.Level.Enable")) { + for (org.bukkit.block.Block blockList : event.blockList()) { + @SuppressWarnings("deprecation") + Materials materials = Materials.getMaterials(blockList.getType(), blockList.getData()); + + if (materials != null) { + IslandLevel level = island.getLevel(); + + if (level.hasMaterial(materials.name())) { + long materialAmount = level.getMaterialAmount(materials.name()); + + if (materialAmount - 1 <= 0) { + level.removeMaterial(materials.name()); + } else { + level.setMaterialAmount(materials.name(), materialAmount - 1); + } + } + } + } + } + + if (SkyBlock.getInstance().getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { + IslandWorld world = worldManager.getIslandWorld(event.getEntity().getWorld()); + for (org.bukkit.block.Block block : event.blockList()) { + if (LocationUtil.isLocationLocation(block.getLocation(), + island.getLocation(world, IslandEnvironment.Main) + .clone() + .subtract(0.0D, 1.0D, 0.0D))) { + event.blockList().remove(block); + break; + } + } + } + } + } + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEntityDeath(EntityDeathEvent event) { + LivingEntity livingEntity = event.getEntity(); + + // Certain entities shouldn't drop twice the amount + if (livingEntity instanceof Player + || livingEntity instanceof ArmorStand + || livingEntity instanceof Horse) { + return; + } + + if (NMSUtil.getVersionNumber() > 9) { + if (livingEntity instanceof Donkey || livingEntity instanceof Mule || livingEntity instanceof ElderGuardian) + return; + } + + if (NMSUtil.getVersionNumber() > 10) { + if (livingEntity instanceof Evoker) + return; + } + + if (NMSUtil.getVersionNumber() > 13) { + if (livingEntity instanceof Ravager || livingEntity instanceof Illager) + return; + } + + if (livingEntity.hasMetadata("SkyBlock")) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + + if (skyblock.getWorldManager().isIslandWorld(livingEntity.getWorld())) { + Island island = islandManager.getIslandAtLocation(livingEntity.getLocation()); + + if (island != null) { + List upgrades = skyblock.getUpgradeManager().getUpgrades(Upgrade.Type.Drops); + + if (upgrades != null && upgrades.size() > 0 && upgrades.get(0).isEnabled() && island.isUpgrade(Upgrade.Type.Drops)) { + Set dontMultiply = new HashSet<>(); + + if (NMSUtil.getVersionNumber() > 8) { + EntityEquipment equipment = livingEntity.getEquipment(); + if (equipment != null) { + for (ItemStack item : event.getDrops()) { + if (item.equals(equipment.getHelmet()) + || item.equals(equipment.getChestplate()) + || item.equals(equipment.getLeggings()) + || item.equals(equipment.getBoots()) + || item.equals(equipment.getItemInMainHand()) + || item.equals(equipment.getItemInOffHand())) { + dontMultiply.add(item); + } + } + } + + if (livingEntity instanceof Pig) { + Pig pig = (Pig) livingEntity; + if (pig.hasSaddle()) + dontMultiply.add(new ItemStack(Material.SADDLE, 1)); + } + } + + for (ItemStack is : event.getDrops()) + if (!dontMultiply.contains(is)) + livingEntity.getWorld().dropItemNaturally(livingEntity.getLocation(), is); + } + } + } + } + + @EventHandler + public void onEntityTargetLivingEntity(EntityTargetLivingEntityEvent event) { + if (!(event.getTarget() instanceof Player)) { + return; + } + + if (!(event.getEntity() instanceof ExperienceOrb)) { + return; + } + + Player player = (Player) event.getTarget(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, "ExperienceOrbPickup")) { + event.setTarget(null); + event.setCancelled(true); + } + } + } + + @EventHandler + public void onCreatureSpawn(CreatureSpawnEvent event) { + if (event.getEntity() instanceof ArmorStand + || event.getEntity() instanceof FallingBlock + || event.getEntity() instanceof org.bukkit.entity.Item) { + return; + } + + if (!(event.getSpawnReason() == SpawnReason.NATURAL || event.getSpawnReason() == SpawnReason.JOCKEY || event.getSpawnReason() == SpawnReason.MOUNT)) + return; + + LivingEntity livingEntity = event.getEntity(); + + if (livingEntity.hasMetadata("SkyBlock")) + return; + + if (skyblock.getWorldManager().isIslandWorld(livingEntity.getWorld())) { + if (!skyblock.getIslandManager().hasSetting(livingEntity.getLocation(), IslandRole.Owner, "NaturalMobSpawning")) { + if (event.getSpawnReason() == SpawnReason.JOCKEY || event.getSpawnReason() == SpawnReason.MOUNT) { + Bukkit.getScheduler().scheduleSyncDelayedTask(skyblock, () -> { + if (NMSUtil.getVersionNumber() > 10) { // getPassengers() was added in 1.11 + for (org.bukkit.entity.Entity passenger : livingEntity.getPassengers()) + passenger.remove(); + } else { + if (livingEntity.getPassenger() != null) + livingEntity.getPassenger().remove(); + } + livingEntity.remove(); + }); + } else { + livingEntity.remove(); + } + } + } + } } diff --git a/src/main/java/com/songoda/skyblock/listeners/Interact.java b/src/main/java/com/songoda/skyblock/listeners/Interact.java index fd4381c0..2aa4395c 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Interact.java +++ b/src/main/java/com/songoda/skyblock/listeners/Interact.java @@ -5,6 +5,7 @@ import com.songoda.skyblock.config.FileManager; import com.songoda.skyblock.island.Island; import com.songoda.skyblock.island.IslandLevel; import com.songoda.skyblock.island.IslandManager; +import com.songoda.skyblock.island.IslandWorld; import com.songoda.skyblock.levelling.LevellingManager; import com.songoda.skyblock.limit.LimitManager; import com.songoda.skyblock.message.MessageManager; @@ -17,6 +18,8 @@ import com.songoda.skyblock.utils.structure.StructureUtil; import com.songoda.skyblock.utils.version.Materials; import com.songoda.skyblock.utils.version.NMSUtil; import com.songoda.skyblock.utils.version.Sounds; +import com.songoda.skyblock.world.WorldManager; + import org.apache.commons.lang3.text.WordUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -197,6 +200,15 @@ public class Interact implements Listener { level.setMaterialAmount(materials.name(), materialAmount + 1); return; } + + // Check if the clicked block is outside of the border. + WorldManager worldManager = skyblock.getWorldManager(); + org.bukkit.block.Block clickedBlock = event.getClickedBlock(); + IslandWorld world = worldManager.getIslandWorld(clickedBlock.getWorld()); + if (!islandManager.isLocationAtIsland(island, clickedBlock.getLocation(), world)) { + event.setCancelled(true); + return; + } if (event.getItem() != null && event.getItem().getType() == Materials.BONE_MEAL.parseMaterial() && !islandManager.hasPermission(player, block.getLocation(), "Place")) { soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); @@ -597,7 +609,8 @@ public class Interact implements Listener { player.updateInventory(); } - } else if (event.getItem().getType() == Material.ARMOR_STAND) { + } else if (event.getItem().getType() == Material.ARMOR_STAND || event.getItem().getType().name().contains("BOAT") + || event.getItem().getType().name().contains("MINECART")) { if (!islandManager.hasPermission(player, block.getLocation(), "EntityPlacement")) { event.setCancelled(true); diff --git a/src/main/java/com/songoda/skyblock/listeners/Projectile.java b/src/main/java/com/songoda/skyblock/listeners/Projectile.java index 2dcb24ab..8142977c 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Projectile.java +++ b/src/main/java/com/songoda/skyblock/listeners/Projectile.java @@ -9,50 +9,50 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.projectiles.ProjectileSource; import java.io.File; public class Projectile implements Listener { - private final SkyBlock skyblock; + private final SkyBlock skyblock; - public Projectile(SkyBlock skyblock) { - this.skyblock = skyblock; - } + public Projectile(SkyBlock skyblock) { + this.skyblock = skyblock; + } - @EventHandler - public void onProjectileLaunch(ProjectileLaunchEvent event) { - if (!(event.getEntity().getShooter() instanceof Player)) { - return; - } + @EventHandler + public void onProjectileLaunch(ProjectileLaunchEvent event) { + org.bukkit.entity.Projectile projectile = event.getEntity(); + ProjectileSource shooter = projectile.getShooter(); + if (!(shooter instanceof Player)) + return; - Player player = (Player) event.getEntity().getShooter(); + MessageManager messageManager = skyblock.getMessageManager(); + SoundManager soundManager = skyblock.getSoundManager(); + Player player = (Player) shooter; - MessageManager messageManager = skyblock.getMessageManager(); - SoundManager soundManager = skyblock.getSoundManager(); + if (!skyblock.getWorldManager().isIslandWorld(player.getWorld())) + return; - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (event.getEntity() instanceof FishHook) { - if (!skyblock.getIslandManager().hasPermission(player, "Fishing")) { - event.setCancelled(true); + if (projectile instanceof FishHook) { + if (!skyblock.getIslandManager().hasPermission(player, "Fishing")) { + event.setCancelled(true); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + return; + } - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } + if (!skyblock.getIslandManager().hasPermission(player, "Projectile")) { + event.setCancelled(true); + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } - return; - } - - if (!skyblock.getIslandManager().hasPermission(player, "Projectile")) { - event.setCancelled(true); - - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } } From 989778d114d5e1052047511f307c3d1cab4ea777 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 00:18:19 -0600 Subject: [PATCH 09/45] Fixed entities targetting other entities outside the border --- .../songoda/skyblock/listeners/Entity.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index 3be2370f..54963724 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -248,6 +248,37 @@ public class Entity implements Listener { } } + /** + * Checks that an entity is not targeting another entity on different islands. + * @author LimeGlass + */ + @EventHandler + public void onEntityTarget(EntityTargetEvent event) { + org.bukkit.entity.Entity entity = event.getEntity(); + WorldManager worldManager = skyblock.getWorldManager(); + if (!worldManager.isIslandWorld(entity.getWorld())) + return; + + org.bukkit.entity.Entity target = event.getTarget(); + + IslandManager islandManager = skyblock.getIslandManager(); + Island entityIsland = islandManager.getIslandAtLocation(entity.getLocation()); + Island targetIsland = islandManager.getIslandAtLocation(target.getLocation()); + // Event not related to Skyblock islands. + if (entityIsland == null && targetIsland == null) + return; + // One entity is on an island, and the other isn't. + if (entityIsland == null || targetIsland == null) { + event.setCancelled(true); + return; + } + // Both entities are on different islands. + if (!entityIsland.getIslandUUID().equals(targetIsland.getIslandUUID())) { + event.setCancelled(true); + return; + } + } + @EventHandler public void onStackableInteract(PlayerArmorStandManipulateEvent event) { Player player = event.getPlayer(); From 847e23bf0f8f7e40d0c2056f9162e0fde63be46c Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 00:41:06 -0600 Subject: [PATCH 10/45] Added wheat to the crop upgrade --- .../java/com/songoda/skyblock/listeners/Block.java | 13 +++++++------ .../java/com/songoda/skyblock/listeners/Entity.java | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java index 74ef049b..25890931 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -587,8 +587,7 @@ public class Block implements Listener { List upgrades = skyblock.getUpgradeManager().getUpgrades(Upgrade.Type.Crop); - if (upgrades != null && upgrades.size() > 0 && upgrades.get(0).isEnabled() - && island.isUpgrade(Upgrade.Type.Crop)) { + if (upgrades != null && upgrades.size() > 0 && upgrades.get(0).isEnabled() && island.isUpgrade(Upgrade.Type.Crop)) { if (NMSUtil.getVersionNumber() > 12) { try { Object blockData = block.getClass().getMethod("getBlockData").invoke(block); @@ -605,11 +604,13 @@ public class Block implements Listener { e.printStackTrace(); } } else { + Material type = block.getType(); if (block.getState().getData() instanceof Crops - || block.getType().name().equals("BEETROOT_BLOCK") - || block.getType().name().equals("CARROT") - || block.getType().name().equals("POTATO") - || block.getType().name().equals("CROPS")) { + || type.name().equals("BEETROOT_BLOCK") + || type.name().equals("CARROT") + || type.name().equals("POTATO") + || type.name().equals("WHEAT") + || type.name().equals("CROPS")) { try { block.getClass().getMethod("setData", byte.class).invoke(block, (byte) (block.getData() + 1)); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index 54963724..535cd2c3 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -686,6 +686,7 @@ public class Entity implements Listener { } } + @SuppressWarnings("deprecation") @EventHandler public void onCreatureSpawn(CreatureSpawnEvent event) { if (event.getEntity() instanceof ArmorStand From cf1567a1dbdc2c0209048024f4e90088a3d844b4 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 01:48:39 -0600 Subject: [PATCH 11/45] Temporary fix on the ChunkSnapshot for 1.12 and lower until I recode it --- .classpath | 5 ++++ build.gradle | 2 ++ .../levelling/LegacyChunkSnapshotData.java | 23 ------------------- .../levelling/LegacyChunkSnapshotFetcher.java | 13 ----------- 4 files changed, 7 insertions(+), 36 deletions(-) delete mode 100644 src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java delete mode 100644 src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java diff --git a/.classpath b/.classpath index 9410146b..ac8dc245 100644 --- a/.classpath +++ b/.classpath @@ -147,4 +147,9 @@ + + + + + diff --git a/build.gradle b/build.gradle index 6f25076c..71737dc2 100644 --- a/build.gradle +++ b/build.gradle @@ -88,6 +88,8 @@ dependencies { // Songoda Updater shade (group: 'com.songoda', name: 'songodaupdater', version: '1') + shade fileTree(dir: 'libraries', include: '*.jar') + } processResources { diff --git a/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java b/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java deleted file mode 100644 index 60014d74..00000000 --- a/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotData.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.songoda.skyblock.levelling; - -import org.bukkit.Material; - -public class LegacyChunkSnapshotData { - - private Material material; - private int data; - - public LegacyChunkSnapshotData(Material material, int data) { - this.material = material; - this.data = data; - } - - public Material getMaterial() { - return this.material; - } - - public int getData() { - return this.data; - } - -} diff --git a/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java b/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java deleted file mode 100644 index ae93c1d5..00000000 --- a/src/main/java/com/songoda/skyblock/levelling/LegacyChunkSnapshotFetcher.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.songoda.skyblock.levelling; - -import org.bukkit.ChunkSnapshot; - -public class LegacyChunkSnapshotFetcher { - - // Uses a 1.12.2 jar in a separate project to avoid needing to use reflection during level scanning, much faster. - @SuppressWarnings("deprecation") - public static LegacyChunkSnapshotData fetch(ChunkSnapshot snapshot, int x, int y, int z) { - return new LegacyChunkSnapshotData(snapshot.getBlockType(x, y, z), snapshot.getData(x, y, z)); - } - -} \ No newline at end of file From 79d3145a28a0711095ccb3d554b74036f1380cfb Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 01:52:43 -0600 Subject: [PATCH 12/45] Gitlab gitignore test? --- .gitignore | 1 - gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55616 bytes libraries/Skyblock-LegacyChunkSnapshot.jar | Bin 0 -> 1929 bytes 3 files changed, 1 deletion(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 libraries/Skyblock-LegacyChunkSnapshot.jar diff --git a/.gitignore b/.gitignore index 810172fc..b659edc0 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ .mtj.tmp/ # Package Files # -*.jar *.war *.nar *.settings diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5c2d1cf016b3885f6930543d57b744ea8c220a1a GIT binary patch literal 55616 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 literal 0 HcmV?d00001 From 56c1bf509d53384c785887fb650c989ba1b30068 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 02:27:04 -0600 Subject: [PATCH 13/45] Fix level scanning on 1.8 --- libraries/Skyblock-LegacyChunkSnapshot.jar | Bin 1929 -> 1938 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/libraries/Skyblock-LegacyChunkSnapshot.jar b/libraries/Skyblock-LegacyChunkSnapshot.jar index 8b7ede90d4d9dd1dd620cd8a8fc4958f0449753a..6cb28256c6c39b3c1f497f545706ccfb36187c55 100644 GIT binary patch delta 543 zcmV+)0^t3L50VcIP)h>@3IG5I2mtL8kqr3)?Gm#G0U81g?GiRm6U-g-ya50JYLhMl zNPk^V(_j>S&epBaRX{);9~BYQZWs2(n3x$agpf3;dI1^n@@@Cpm6n#Y9bx_|y~2;g zAK;HNp0_M2hTW{m`FziL&PUJBU*CQJc!rJv9cwz)TiC#+0SosH)Uc)FfsSoL^JSDq z@f=qBL|o8H!-MHyow$VJgmwVOAcY?KG`AX2k#O&{Xvi8vP~=6^6x zcs^T~Iv$$X!LE)+CLZI7LbC}kW?n2|Np7RUd!+BW~68{&AWYxa!~Zl{lJH2FByR|Bc_F*n$9SQ5)d z_Y(BEdTudqR?a3&=H^uZZefAtJWCd_G)a~Wsj;-aqxQbLv1xrpUBee>fAmWip4~Y*1P)h>@li>vxks9lh=LHb66#)za4Pp&8Pb4eD;;<*JATPB<(Y-2~OT?;krnP{1KNNB!}v$%Xi zsJAK)6LR z4pJ2+ZYr;2n#Nh=`Z5yX_;5JNl9Nna7DH7Y$ub Date: Sun, 22 Sep 2019 02:28:42 -0600 Subject: [PATCH 14/45] Fixed improper d field reflection in WorldBorder SD-3861 --- .../java/com/songoda/skyblock/utils/world/WorldBorder.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java b/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java index 0bc33b2d..dca93efa 100644 --- a/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java +++ b/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java @@ -44,11 +44,7 @@ public final class WorldBorder { Object worldBorder = worldBorderClass.getConstructor().newInstance(); - if (NMSUtil.getVersionNumber() < 9) { - Field borderSize = worldBorder.getClass().getDeclaredField("d"); - borderSize.setAccessible(true); - borderSize.set(worldBorder, size); - } else { + if (NMSUtil.getVersionNumber() >= 9) { Object craftWorld = craftWorldClass.cast(centerLocation.getWorld()); Method getHandleMethod = craftWorld.getClass().getMethod("getHandle"); Object worldServer = getHandleMethod.invoke(craftWorld); From b7958e3af2a0ade6b5388f343452c7eeb0fb0702 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 02:28:55 -0600 Subject: [PATCH 15/45] Fixed improper d field reflection in WorldBorder SD-3861 --- .../com/songoda/skyblock/utils/world/WorldBorder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java b/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java index dca93efa..60ec614b 100644 --- a/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java +++ b/src/main/java/com/songoda/skyblock/utils/world/WorldBorder.java @@ -1,12 +1,12 @@ package com.songoda.skyblock.utils.world; -import com.songoda.skyblock.utils.version.NMSUtil; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + import org.bukkit.Location; import org.bukkit.entity.Player; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; +import com.songoda.skyblock.utils.version.NMSUtil; public final class WorldBorder { From 3acef806e94e2439677a6c7bd7830d04b3894e77 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 19:15:22 -0600 Subject: [PATCH 16/45] Fixed structures like trees being able to grow outside border --- .../songoda/skyblock/api/island/Island.java | 981 +++++++++--------- .../com/songoda/skyblock/listeners/Grow.java | 51 + 2 files changed, 547 insertions(+), 485 deletions(-) create mode 100644 src/main/java/com/songoda/skyblock/listeners/Grow.java diff --git a/src/main/java/com/songoda/skyblock/api/island/Island.java b/src/main/java/com/songoda/skyblock/api/island/Island.java index fc378cc6..7e327476 100644 --- a/src/main/java/com/songoda/skyblock/api/island/Island.java +++ b/src/main/java/com/songoda/skyblock/api/island/Island.java @@ -17,489 +17,500 @@ import java.util.*; public class Island { - private com.songoda.skyblock.island.Island handle; - private OfflinePlayer player; - - public Island(com.songoda.skyblock.island.Island handle, OfflinePlayer player) { - this.handle = handle; - this.player = player; - } - - /** - * @return The Island UUID - */ - public UUID getIslandUUID() { - return this.handle.getIslandUUID(); - } - - /** - * @return The Island owner UUID - */ - public UUID getOwnerUUID() { - return this.handle.getOwnerUUID(); - } - - /** - * @return The original Island owner UUID - */ - public UUID getOriginalOwnerUUID() { - return this.handle.getOriginalOwnerUUID(); - } - - /** - * @return The Island size - */ - public int getSize() { - return this.handle.getSize(); - } - - /** - * Set the size of the Island - */ - public void setSize(int size) { - Preconditions.checkArgument(size <= 1000, "Cannot set size to greater than 1000"); - Preconditions.checkArgument(size >= 50, "Cannot set size to less than 50"); - this.handle.setSize(size); - } - - /** - * @return The Island radius - */ - public double getRadius() { - return this.handle.getRadius(); - } - - /** - * @return true if not null, false otherwise - */ - public boolean hasPassword() { - return this.handle.hasPassword(); - } - - /** - * Set the password for ownership - */ - public void setPassword(String password) { - Preconditions.checkArgument(password != null, "Cannot set password to null password"); - this.handle.setPassword(password); - } - - /** - * Get the Location from the World in island world from World in environment. - * - * @return Location of Island - */ - public Location getLocation(IslandWorld world, IslandEnvironment environment) { - Preconditions.checkArgument(world != null, "World in island world null does not exist"); - Preconditions.checkArgument(environment != null, "World in environment null does not exist"); - - return handle.getLocation(APIUtil.toImplementation(world), APIUtil.toImplementation(environment)); - } - - /** - * Set the Location from the World in island world from world in environment - * followed by position - */ - public void setLocation(IslandWorld world, IslandEnvironment environment, int x, int y, int z) { - Preconditions.checkArgument(world != null, "World in island world null does not exist"); - Preconditions.checkArgument(environment != null, "World in environment null does not exist"); - - World bukkitWorld = getLocation(world, environment).getWorld(); - this.handle.setLocation(APIUtil.toImplementation(world), APIUtil.toImplementation(environment), - new Location(bukkitWorld, x, y, z)); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean isBorder() { - return this.handle.isBorder(); - } - - /** - * Set the border visible to players for the Island - */ - public void setBorder(boolean border) { - this.handle.setBorder(border); - } - - /** - * @return The color of the Island border - */ - public IslandBorderColor getBorderColor() { - return APIUtil.fromImplementation(this.handle.getBorderColor()); - } - - /** - * Set the border color for the Island - */ - public void setBorderColor(IslandBorderColor color) { - Preconditions.checkArgument(color != null, "IslandBorderColor null does not exist"); - this.handle.setBorderColor(APIUtil.toImplementation(color)); - } - - /** - * @return The biome set for the Island - */ - public Biome getBiome() { - return this.handle.getBiome(); - } - - /** - * Set the biome for the Island - */ - public void setBiome(Biome biome) { - Preconditions.checkArgument(biome != null, "Cannot set biome to null biome"); - this.handle.setBiome(biome); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean isDayCycleSynchronizedSynchronized() { - return this.handle.isWeatherSynchronized(); - } - - /** - * Set the Day Cycle of the Island to be Synchronized with the World cycle - */ - public void setDayCycleSynchronzied(boolean sync) { - this.handle.setWeatherSynchronized(sync); - } - - /** - * @return The WeatherType set for the Island - */ - public WeatherType getWeather() { - return this.handle.getWeather(); - } - - /** - * Set the weather for the Island - */ - public void setWeather(WeatherType weatherType) { - Preconditions.checkArgument(weatherType != null, "Cannot set weather to null weather"); - this.handle.setWeather(weatherType); - } - - /** - * @return The time set for the Island - */ - public int getTime() { - return this.handle.getTime(); - } - - /** - * Set the time for the Island - */ - public void setTime(int time) { - this.handle.setTime(time); - } - - /** - * @return A Set of cooped players - */ - public Map getCoopPlayers() { - return this.handle.getCoopPlayers(); - } - - /** - * Add a player to the coop players for the Island - */ - public void addCoopPlayer(UUID uuid, IslandCoop islandCoop) { - Preconditions.checkArgument(uuid != null, "Cannot add coop player to null uuid"); - this.handle.addCoopPlayer(uuid, islandCoop); - } - - /** - * Add a player to the coop players for the Island - */ - public void addCoopPlayer(OfflinePlayer player, IslandCoop islandCoop) { - Preconditions.checkArgument(player != null, "Cannot add coop player to null player"); - this.handle.addCoopPlayer(player.getUniqueId(), islandCoop); - } - - /** - * Remove a player from the coop players for the Island - */ - public void removeCoopPlayer(UUID uuid) { - Preconditions.checkArgument(uuid != null, "Cannot remove coop player to null uuid"); - this.handle.removeCoopPlayer(uuid); - } - - /** - * Remove a player from the coop players for the Island - */ - public void removeCoopPlayer(OfflinePlayer player) { - Preconditions.checkArgument(player != null, "Cannot remove coop player to null player"); - this.handle.removeCoopPlayer(player.getUniqueId()); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean isCoopPlayer(UUID uuid) { - Preconditions.checkArgument(uuid != null, "Cannot return condition to null uuid"); - return this.handle.isCoopPlayer(uuid); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean isCoopPlayer(OfflinePlayer player) { - Preconditions.checkArgument(player != null, "Cannot return condition to null player"); - return this.handle.isCoopPlayer(player.getUniqueId()); - } - - /** - * @return The IslandRole of a player - */ - public IslandRole getRole(OfflinePlayer player) { - Preconditions.checkArgument(player != null, "Cannot get role for null player"); - - for (com.songoda.skyblock.island.IslandRole role : com.songoda.skyblock.island.IslandRole.values()) { - if (this.handle.hasRole(role, player.getUniqueId())) { - return APIUtil.fromImplementation(role); - } - } - - return null; - } - - /** - * @return A Set of players with IslandRole - */ - public Set getPlayersWithRole(IslandRole role) { - Preconditions.checkArgument(role != null, "Cannot get players will null role"); - return this.handle.getRole(APIUtil.toImplementation(role)); - } - - /** - * Set the IslandRole of a player for the Island - * - * @return true of conditions met, false otherwise - */ - public boolean setRole(OfflinePlayer player, IslandRole role) { - Preconditions.checkArgument(player != null, "Cannot set role of null player"); - return setRole(player.getUniqueId(), role); - } - - /** - * Set the IslandRole of a player for the Island - * - * @return true of conditions met, false otherwise - */ - public boolean setRole(UUID uuid, IslandRole role) { - Preconditions.checkArgument(uuid != null, "Cannot set role of null player"); - Preconditions.checkArgument(role != null, "Cannot set role to null role"); - - return this.handle.setRole(APIUtil.toImplementation(role), uuid); - } - - /** - * Remove the IslandRole of a player for the Island - * - * @return true of conditions met, false otherwise - */ - public boolean removeRole(OfflinePlayer player, IslandRole role) { - Preconditions.checkArgument(player != null, "Cannot remove role of null player"); - return removeRole(player.getUniqueId(), role); - } - - /** - * Remove the IslandRole of a player for the Island - * - * @return true of conditions met, false otherwise - */ - public boolean removeRole(UUID uuid, IslandRole role) { - Preconditions.checkArgument(uuid != null, "Cannot remove role of null player"); - Preconditions.checkArgument(role != null, "Cannot remove role to null role"); - - return this.handle.removeRole(APIUtil.toImplementation(role), uuid); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean hasRole(OfflinePlayer player, IslandRole role) { - Preconditions.checkArgument(player != null, "Cannot check role of null player"); - return handle.hasRole(APIUtil.toImplementation(role), player.getUniqueId()); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean hasRole(UUID uuid, IslandRole role) { - Preconditions.checkArgument(uuid != null, "Cannot check role of null player"); - Preconditions.checkArgument(role != null, "Cannot check role to null role"); - - return handle.hasRole(APIUtil.toImplementation(role), uuid); - } - - /** - * Set the condition of an IslandUpgrade for the Island - */ - public void setUpgrade(Player player, IslandUpgrade upgrade, boolean status) { - Preconditions.checkArgument(upgrade != null, "Cannot set upgrade to null upgrade"); - this.handle.setUpgrade(player, APIUtil.toImplementation(upgrade), status); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean hasUpgrade(IslandUpgrade upgrade) { - Preconditions.checkArgument(upgrade != null, "Cannot check upgrade to null upgrade"); - return this.handle.hasUpgrade(APIUtil.toImplementation(upgrade)); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean isUpgrade(IslandUpgrade upgrade) { - Preconditions.checkArgument(upgrade != null, "Cannot check upgrade to null upgrade"); - return this.handle.isUpgrade(APIUtil.toImplementation(upgrade)); - } - - /** - * @return Setting of an IslandRole for the Island - */ - public IslandSetting getSetting(IslandRole role, String setting) { - Preconditions.checkArgument(role != null, "Cannot get setting to null role"); - Preconditions.checkArgument(setting != null, "Cannot get setting for null setting"); - - return new IslandSetting(this.handle.getSetting(APIUtil.toImplementation(role), setting)); - } - - /** - * @return A List of Settings of an IslandRole for the Island - */ - public List getSettings(IslandRole role) { - Preconditions.checkArgument(role != null, "Cannot get settings to null role"); - List settings = new ArrayList<>(); - - for (com.songoda.skyblock.island.IslandSetting settingList : this.handle - .getSettings(APIUtil.toImplementation(role))) { - settings.add(new IslandSetting(settingList)); - } - - return settings; - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean isOpen() { - return handle.isOpen(); - } - - public void setOpen(boolean open) { - this.handle.setOpen(open); - } - - /** - * @return A List from IslandMessage for the Island - */ - public List getMessage(IslandMessage message) { - Preconditions.checkArgument(message != null, "Cannot get message for null message"); - return this.handle.getMessage(APIUtil.toImplementation(message)); - } - - /** - * @return The author of an IslandMessage for the Island - */ - public String getMessageAuthor(IslandMessage message) { - Preconditions.checkArgument(message != null, "Cannot get message author for null message"); - return this.handle.getMessageAuthor(APIUtil.toImplementation(message)); - } - - /** - * Set the IslandMessage for the Island - */ - public void setMessage(IslandMessage message, String author, List messageLines) { - Preconditions.checkArgument(message != null, "Cannot set message for null message"); - this.handle.setMessage(APIUtil.toImplementation(message), author, messageLines); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean hasStructure() { - return this.handle.hasStructure(); - } - - /** - * @return The Structure name for the Island - */ - public String getStructure() { - return this.handle.getStructure(); - } - - /** - * Set the Structure for the Island - */ - public void setStructure(String structure) { - Preconditions.checkArgument(structure != null, "Cannot set structure to null structure"); - this.handle.setStructure(structure); - } - - /** - * @return The Visit implementation for the Island - */ - public Visit getVisit() { - return new Visit(this); - } - - /** - * @return The Ban implementation for the Island - */ - public Ban getBan() { - return new Ban(this); - } - - /** - * @return The Level implementation for the Island - */ - public IslandLevel getLevel() { - return new IslandLevel(this); - } - - /** - * @return true of conditions met, false otherwise - */ - public boolean isLoaded() { - return this.handle != null; - } - - /** - * Loads the Island if unloaded - */ - public void load() { - if (this.handle == null) { - this.handle = SkyBlockAPI.getImplementation().getIslandManager().loadIsland(player); - } - } - - /** - * Unloads the Island if loaded - */ - public void unload() { - if (this.handle != null) { - SkyBlockAPI.getImplementation().getIslandManager().unloadIsland(getIsland(), null); - this.handle = null; - } - } - - /** - * Sets the player of the Island - */ - public void setPlayer(OfflinePlayer player) { - this.player = player; - } - - /** - * @return Implementation for the Island - */ - public com.songoda.skyblock.island.Island getIsland() { - return handle; - } + private com.songoda.skyblock.island.Island handle; + private OfflinePlayer player; + + public Island(com.songoda.skyblock.island.Island handle, OfflinePlayer player) { + this.handle = handle; + this.player = player; + } + + /** + * @return The Island UUID + */ + public UUID getIslandUUID() { + return this.handle.getIslandUUID(); + } + + /** + * @return The Island owner UUID + */ + public UUID getOwnerUUID() { + return this.handle.getOwnerUUID(); + } + + /** + * @return The original Island owner UUID + */ + public UUID getOriginalOwnerUUID() { + return this.handle.getOriginalOwnerUUID(); + } + + /** + * @return The Island size + */ + public int getSize() { + return this.handle.getSize(); + } + + /** + * Set the size of the Island + */ + public void setSize(int size) { + Preconditions.checkArgument(size <= 1000, "Cannot set size to greater than 1000"); + Preconditions.checkArgument(size >= 50, "Cannot set size to less than 50"); + this.handle.setSize(size); + } + + /** + * @return The Island radius + */ + public double getRadius() { + return this.handle.getRadius(); + } + + /** + * @return true if not null, false otherwise + */ + public boolean hasPassword() { + return this.handle.hasPassword(); + } + + /** + * Set the password for ownership + */ + public void setPassword(String password) { + Preconditions.checkArgument(password != null, "Cannot set password to null password"); + this.handle.setPassword(password); + } + + /** + * Get the Location from the World in island world from World in environment. + * + * @return Location of Island + */ + public Location getLocation(IslandWorld world, IslandEnvironment environment) { + Preconditions.checkArgument(world != null, "World in island world null does not exist"); + Preconditions.checkArgument(environment != null, "World in environment null does not exist"); + + return handle.getLocation(APIUtil.toImplementation(world), APIUtil.toImplementation(environment)); + } + + /** + * Set the Location from the World in island world from world in environment + * followed by position + */ + public void setLocation(IslandWorld world, IslandEnvironment environment, int x, int y, int z) { + Preconditions.checkArgument(world != null, "World in island world null does not exist"); + Preconditions.checkArgument(environment != null, "World in environment null does not exist"); + + World bukkitWorld = getLocation(world, environment).getWorld(); + this.handle.setLocation(APIUtil.toImplementation(world), APIUtil.toImplementation(environment), + new Location(bukkitWorld, x, y, z)); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean isBorder() { + return this.handle.isBorder(); + } + + /** + * Set the border visible to players for the Island + */ + public void setBorder(boolean border) { + this.handle.setBorder(border); + } + + /** + * @return The color of the Island border + */ + public IslandBorderColor getBorderColor() { + return APIUtil.fromImplementation(this.handle.getBorderColor()); + } + + /** + * Set the border color for the Island + */ + public void setBorderColor(IslandBorderColor color) { + Preconditions.checkArgument(color != null, "IslandBorderColor null does not exist"); + this.handle.setBorderColor(APIUtil.toImplementation(color)); + } + + /** + * @return The biome set for the Island + */ + public Biome getBiome() { + return this.handle.getBiome(); + } + + /** + * Set the biome for the Island + */ + public void setBiome(Biome biome) { + Preconditions.checkArgument(biome != null, "Cannot set biome to null biome"); + this.handle.setBiome(biome); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean isDayCycleSynchronizedSynchronized() { + return this.handle.isWeatherSynchronized(); + } + + /** + * Set the Day Cycle of the Island to be Synchronized with the World cycle + */ + public void setDayCycleSynchronzied(boolean sync) { + this.handle.setWeatherSynchronized(sync); + } + + /** + * @return The WeatherType set for the Island + */ + public WeatherType getWeather() { + return this.handle.getWeather(); + } + + /** + * Set the weather for the Island + */ + public void setWeather(WeatherType weatherType) { + Preconditions.checkArgument(weatherType != null, "Cannot set weather to null weather"); + this.handle.setWeather(weatherType); + } + + /** + * @return The time set for the Island + */ + public int getTime() { + return this.handle.getTime(); + } + + /** + * Set the time for the Island + */ + public void setTime(int time) { + this.handle.setTime(time); + } + + /** + * @return A Set of cooped players + */ + public Map getCoopPlayers() { + return this.handle.getCoopPlayers(); + } + + /** + * Add a player to the coop players for the Island + */ + public void addCoopPlayer(UUID uuid, IslandCoop islandCoop) { + Preconditions.checkArgument(uuid != null, "Cannot add coop player to null uuid"); + this.handle.addCoopPlayer(uuid, islandCoop); + } + + /** + * Add a player to the coop players for the Island + */ + public void addCoopPlayer(OfflinePlayer player, IslandCoop islandCoop) { + Preconditions.checkArgument(player != null, "Cannot add coop player to null player"); + this.handle.addCoopPlayer(player.getUniqueId(), islandCoop); + } + + /** + * Remove a player from the coop players for the Island + */ + public void removeCoopPlayer(UUID uuid) { + Preconditions.checkArgument(uuid != null, "Cannot remove coop player to null uuid"); + this.handle.removeCoopPlayer(uuid); + } + + /** + * Remove a player from the coop players for the Island + */ + public void removeCoopPlayer(OfflinePlayer player) { + Preconditions.checkArgument(player != null, "Cannot remove coop player to null player"); + this.handle.removeCoopPlayer(player.getUniqueId()); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean isCoopPlayer(UUID uuid) { + Preconditions.checkArgument(uuid != null, "Cannot return condition to null uuid"); + return this.handle.isCoopPlayer(uuid); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean isCoopPlayer(OfflinePlayer player) { + Preconditions.checkArgument(player != null, "Cannot return condition to null player"); + return this.handle.isCoopPlayer(player.getUniqueId()); + } + + /** + * @return The IslandRole of a player + */ + public IslandRole getRole(OfflinePlayer player) { + Preconditions.checkArgument(player != null, "Cannot get role for null player"); + + for (com.songoda.skyblock.island.IslandRole role : com.songoda.skyblock.island.IslandRole.values()) { + if (this.handle.hasRole(role, player.getUniqueId())) { + return APIUtil.fromImplementation(role); + } + } + + return null; + } + + /** + * @return A Set of players with IslandRole + */ + public Set getPlayersWithRole(IslandRole role) { + Preconditions.checkArgument(role != null, "Cannot get players will null role"); + return this.handle.getRole(APIUtil.toImplementation(role)); + } + + /** + * Set the IslandRole of a player for the Island + * + * @return true of conditions met, false otherwise + */ + public boolean setRole(OfflinePlayer player, IslandRole role) { + Preconditions.checkArgument(player != null, "Cannot set role of null player"); + return setRole(player.getUniqueId(), role); + } + + /** + * Set the IslandRole of a player for the Island + * + * @return true of conditions met, false otherwise + */ + public boolean setRole(UUID uuid, IslandRole role) { + Preconditions.checkArgument(uuid != null, "Cannot set role of null player"); + Preconditions.checkArgument(role != null, "Cannot set role to null role"); + + return this.handle.setRole(APIUtil.toImplementation(role), uuid); + } + + /** + * Remove the IslandRole of a player for the Island + * + * @return true of conditions met, false otherwise + */ + public boolean removeRole(OfflinePlayer player, IslandRole role) { + Preconditions.checkArgument(player != null, "Cannot remove role of null player"); + return removeRole(player.getUniqueId(), role); + } + + /** + * Remove the IslandRole of a player for the Island + * + * @return true of conditions met, false otherwise + */ + public boolean removeRole(UUID uuid, IslandRole role) { + Preconditions.checkArgument(uuid != null, "Cannot remove role of null player"); + Preconditions.checkArgument(role != null, "Cannot remove role to null role"); + + return this.handle.removeRole(APIUtil.toImplementation(role), uuid); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean hasRole(OfflinePlayer player, IslandRole role) { + Preconditions.checkArgument(player != null, "Cannot check role of null player"); + return handle.hasRole(APIUtil.toImplementation(role), player.getUniqueId()); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean hasRole(UUID uuid, IslandRole role) { + Preconditions.checkArgument(uuid != null, "Cannot check role of null player"); + Preconditions.checkArgument(role != null, "Cannot check role to null role"); + + return handle.hasRole(APIUtil.toImplementation(role), uuid); + } + + /** + * Set the condition of an IslandUpgrade for the Island + */ + public void setUpgrade(Player player, IslandUpgrade upgrade, boolean status) { + Preconditions.checkArgument(upgrade != null, "Cannot set upgrade to null upgrade"); + this.handle.setUpgrade(player, APIUtil.toImplementation(upgrade), status); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean hasUpgrade(IslandUpgrade upgrade) { + Preconditions.checkArgument(upgrade != null, "Cannot check upgrade to null upgrade"); + return this.handle.hasUpgrade(APIUtil.toImplementation(upgrade)); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean isUpgrade(IslandUpgrade upgrade) { + Preconditions.checkArgument(upgrade != null, "Cannot check upgrade to null upgrade"); + return this.handle.isUpgrade(APIUtil.toImplementation(upgrade)); + } + + /** + * @return Setting of an IslandRole for the Island + */ + public IslandSetting getSetting(IslandRole role, String setting) { + Preconditions.checkArgument(role != null, "Cannot get setting to null role"); + Preconditions.checkArgument(setting != null, "Cannot get setting for null setting"); + + return new IslandSetting(this.handle.getSetting(APIUtil.toImplementation(role), setting)); + } + + /** + * @return A List of Settings of an IslandRole for the Island + */ + public List getSettings(IslandRole role) { + Preconditions.checkArgument(role != null, "Cannot get settings to null role"); + List settings = new ArrayList<>(); + + for (com.songoda.skyblock.island.IslandSetting settingList : this.handle + .getSettings(APIUtil.toImplementation(role))) { + settings.add(new IslandSetting(settingList)); + } + + return settings; + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean isOpen() { + return handle.isOpen(); + } + + public void setOpen(boolean open) { + this.handle.setOpen(open); + } + + /** + * @return A List from IslandMessage for the Island + */ + public List getMessage(IslandMessage message) { + Preconditions.checkArgument(message != null, "Cannot get message for null message"); + return this.handle.getMessage(APIUtil.toImplementation(message)); + } + + /** + * @return The author of an IslandMessage for the Island + */ + public String getMessageAuthor(IslandMessage message) { + Preconditions.checkArgument(message != null, "Cannot get message author for null message"); + return this.handle.getMessageAuthor(APIUtil.toImplementation(message)); + } + + /** + * Set the IslandMessage for the Island + */ + public void setMessage(IslandMessage message, String author, List messageLines) { + Preconditions.checkArgument(message != null, "Cannot set message for null message"); + this.handle.setMessage(APIUtil.toImplementation(message), author, messageLines); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean hasStructure() { + return this.handle.hasStructure(); + } + + /** + * @return The Structure name for the Island + */ + public String getStructure() { + return this.handle.getStructure(); + } + + /** + * Set the Structure for the Island + */ + public void setStructure(String structure) { + Preconditions.checkArgument(structure != null, "Cannot set structure to null structure"); + this.handle.setStructure(structure); + } + + /** + * @return The Visit implementation for the Island + */ + public Visit getVisit() { + return new Visit(this); + } + + /** + * @return The Ban implementation for the Island + */ + public Ban getBan() { + return new Ban(this); + } + + /** + * @return The Level implementation for the Island + */ + public IslandLevel getLevel() { + return new IslandLevel(this); + } + + /** + * @return true of conditions met, false otherwise + */ + public boolean isLoaded() { + return this.handle != null; + } + + /** + * Loads the Island if unloaded + */ + public void load() { + if (this.handle == null) { + this.handle = SkyBlockAPI.getImplementation().getIslandManager().loadIsland(player); + } + } + + /** + * Unloads the Island if loaded + */ + public void unload() { + if (this.handle != null) { + SkyBlockAPI.getImplementation().getIslandManager().unloadIsland(getIsland(), null); + this.handle = null; + } + } + + /** + * Sets the player of the Island + */ + public void setPlayer(OfflinePlayer player) { + this.player = player; + } + + /** + * @return Implementation for the Island + */ + public com.songoda.skyblock.island.Island getIsland() { + return handle; + } + + @Override + public boolean equals(Object object) { + if (!(object instanceof Island)) + return false; + Island other = (Island) object; + if (!other.getIslandUUID().equals(getIslandUUID())) + return false; + return true; + } + } diff --git a/src/main/java/com/songoda/skyblock/listeners/Grow.java b/src/main/java/com/songoda/skyblock/listeners/Grow.java new file mode 100644 index 00000000..57380b8a --- /dev/null +++ b/src/main/java/com/songoda/skyblock/listeners/Grow.java @@ -0,0 +1,51 @@ +package com.songoda.skyblock.listeners; + +import org.bukkit.block.BlockState; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.StructureGrowEvent; + +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.island.Island; +import com.songoda.skyblock.island.IslandManager; +import com.songoda.skyblock.world.WorldManager; + +public class Grow implements Listener { + + private final SkyBlock skyblock; + + public Grow(SkyBlock skyblock) { + this.skyblock = skyblock; + } + + /** + * Checks that a structure like a tree is not growing outside or into another island. + * @author LimeGlass + */ + @EventHandler + public void onStructureGrow(StructureGrowEvent event) { + WorldManager worldManager = skyblock.getWorldManager(); + if (!worldManager.isIslandWorld(event.getWorld())) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + Island origin = islandManager.getIslandAtLocation(event.getLocation()); + for (BlockState state : event.getBlocks()) { + Island growingTo = islandManager.getIslandAtLocation(state.getLocation()); + // This block is ok to continue as it's not related to Skyblock islands. + if (origin == null && growingTo == null) + continue; + // A block from the structure is outside/inside that it's not suppose to. + if (origin == null || growingTo == null) { + event.getBlocks().remove(state); + continue; + } + // The structure is growing from one island to another. + if (!origin.getIslandUUID().equals(growingTo.getIslandUUID())) { + event.getBlocks().remove(state); + continue; + } + } + } + +} From 5e4517aeb13d7fa660a42dbb183bbe3667c58bae Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 19:16:44 -0600 Subject: [PATCH 17/45] Add the new grow listener to Bukkit --- src/main/java/com/songoda/skyblock/SkyBlock.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/songoda/skyblock/SkyBlock.java b/src/main/java/com/songoda/skyblock/SkyBlock.java index 86598be8..af0ff5eb 100644 --- a/src/main/java/com/songoda/skyblock/SkyBlock.java +++ b/src/main/java/com/songoda/skyblock/SkyBlock.java @@ -156,6 +156,7 @@ public class SkyBlock extends JavaPlugin { pluginManager.registerEvents(new Chat(this), this); pluginManager.registerEvents(new Spawner(this), this); pluginManager.registerEvents(new Food(this), this); + pluginManager.registerEvents(new Grow(this), this); if (pluginManager.isPluginEnabled("EpicSpawners")) pluginManager.registerEvents(new EpicSpawners(this), this); From 05466c4f77ee71055c437d083ed8910d13add8c1 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 20:15:29 -0600 Subject: [PATCH 18/45] Make some more room in this clustered class --- .../com/songoda/skyblock/listeners/Block.java | 1326 ++++++++--------- .../com/songoda/skyblock/listeners/Grow.java | 154 +- 2 files changed, 763 insertions(+), 717 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java index 25890931..9919e0ed 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -1,21 +1,12 @@ package com.songoda.skyblock.listeners; -import com.songoda.skyblock.SkyBlock; -import com.songoda.skyblock.config.FileManager.Config; -import com.songoda.skyblock.generator.Generator; -import com.songoda.skyblock.generator.GeneratorManager; -import com.songoda.skyblock.island.*; -import com.songoda.skyblock.levelling.LevellingManager; -import com.songoda.skyblock.limit.LimitManager; -import com.songoda.skyblock.stackable.Stackable; -import com.songoda.skyblock.stackable.StackableManager; -import com.songoda.skyblock.upgrade.Upgrade; -import com.songoda.skyblock.utils.NumberUtil; -import com.songoda.skyblock.utils.version.Materials; -import com.songoda.skyblock.utils.version.NMSUtil; -import com.songoda.skyblock.utils.version.Sounds; -import com.songoda.skyblock.utils.world.LocationUtil; -import com.songoda.skyblock.world.WorldManager; +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import org.apache.commons.lang3.text.WordUtils; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -29,710 +20,613 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.*; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockFormEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.world.PortalCreateEvent; -import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.material.Crops; -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.util.*; +import com.google.common.collect.Lists; +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.config.FileManager.Config; +import com.songoda.skyblock.generator.Generator; +import com.songoda.skyblock.generator.GeneratorManager; +import com.songoda.skyblock.island.Island; +import com.songoda.skyblock.island.IslandEnvironment; +import com.songoda.skyblock.island.IslandLevel; +import com.songoda.skyblock.island.IslandManager; +import com.songoda.skyblock.island.IslandRole; +import com.songoda.skyblock.island.IslandWorld; +import com.songoda.skyblock.levelling.LevellingManager; +import com.songoda.skyblock.limit.LimitManager; +import com.songoda.skyblock.stackable.Stackable; +import com.songoda.skyblock.stackable.StackableManager; +import com.songoda.skyblock.utils.NumberUtil; +import com.songoda.skyblock.utils.version.Materials; +import com.songoda.skyblock.utils.version.NMSUtil; +import com.songoda.skyblock.utils.version.Sounds; +import com.songoda.skyblock.utils.world.LocationUtil; +import com.songoda.skyblock.world.WorldManager; public class Block implements Listener { - private final SkyBlock skyblock; - - public Block(SkyBlock skyblock) { - this.skyblock = skyblock; - } - - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.LOW) - public void onBlockBreak(BlockBreakEvent event) { - Player player = event.getPlayer(); - org.bukkit.block.Block block = event.getBlock(); - - IslandManager islandManager = skyblock.getIslandManager(); - StackableManager stackableManager = skyblock.getStackableManager(); - WorldManager worldManager = skyblock.getWorldManager(); - - if (!worldManager.isIslandWorld(block.getWorld())) return; - - IslandWorld world = worldManager.getIslandWorld(block.getWorld()); - Island island = islandManager.getIslandAtLocation(block.getLocation()); - - if (island == null) { - event.setCancelled(true); - return; - } - - if (!islandManager.hasPermission(player, block.getLocation(), "Destroy")) { - event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - return; - } - - if (stackableManager != null - && stackableManager.isStacked(block.getLocation())) { - Stackable stackable = stackableManager.getStack(block.getLocation(), block.getType()); - if (stackable != null) { - Material material = block.getType(); - byte data = block.getData(); - - int droppedAmount = 0; - if (event.getPlayer().isSneaking()) { - Location dropLoc = event.getBlock().getLocation().clone().add(0.5, 0.5, 0.5); - int count = stackable.getSize(); - droppedAmount = count; - while (count > 64) { - dropLoc.getWorld().dropItemNaturally(dropLoc, new ItemStack(material, 64, data)); - count -= 64; - } - dropLoc.getWorld().dropItemNaturally(dropLoc, new ItemStack(material, count, block.getData())); - block.setType(Material.AIR); - stackable.setSize(0); - } else { - block.getWorld().dropItemNaturally(block.getLocation().clone().add(.5, 1, .5), new ItemStack(material, 1, data)); - stackable.takeOne(); - droppedAmount = 1; - } - - if (stackable.getSize() <= 1) { - stackableManager.removeStack(stackable); - } - - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (configLoad.getBoolean("Island.Block.Level.Enable")) { - Materials materials = Materials.getMaterials(material, data); - if (materials != null) { - IslandLevel level = island.getLevel(); - - if (level.hasMaterial(materials.name())) { - long materialAmount = level.getMaterialAmount(materials.name()); - - if (materialAmount - droppedAmount <= 0) { - level.removeMaterial(materials.name()); - } else { - level.setMaterialAmount(materials.name(), materialAmount - droppedAmount); - } - } - } - } - - event.setCancelled(true); - } - } - - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone().subtract(0.0D, 1.0D, 0.0D)) - || LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone())) { - if (configLoad.getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.SpawnProtection.Break.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - - if (event.isCancelled() || !configLoad.getBoolean("Island.Block.Level.Enable")) return; - - Materials materials = Materials.getMaterials(block.getType(), block.getData()); - - if (materials == null) return; - - IslandLevel level = island.getLevel(); - - if (!level.hasMaterial(materials.name())) return; - - long materialAmount = level.getMaterialAmount(materials.name()); - - if (materialAmount - 1 <= 0) { - level.removeMaterial(materials.name()); - } else { - level.setMaterialAmount(materials.name(), materialAmount - 1); - } - } - - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) { - Player player = event.getPlayer(); - org.bukkit.block.Block block = event.getBlock(); - - IslandManager islandManager = skyblock.getIslandManager(); - WorldManager worldManager = skyblock.getWorldManager(); - LevellingManager levellingManager = skyblock.getLevellingManager(); - if (!worldManager.isIslandWorld(block.getWorld())) return; - - IslandWorld world = worldManager.getIslandWorld(block.getWorld()); - Island island = islandManager.getIslandAtLocation(block.getLocation()); - - if (island == null) { - event.setCancelled(true); - return; - } - - if (levellingManager.isIslandLevelBeingScanned(island)) { - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Command.Island.Level.Scanning.BlockPlacing.Message")); - event.setCancelled(true); - return; - } - - if (!islandManager.hasPermission(player, block.getLocation(), "Place")) { - event.setCancelled(true); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - return; - } - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (configLoad.getBoolean("Island.WorldBorder.Block") && block.getType() == Material.DISPENSER) { - if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { - event.setCancelled(true); - } - } - - // Check spawn protection - if (configLoad.getBoolean("Island.Spawn.Protection")) { - boolean isObstructing = false; - // Directly on the block - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { - isObstructing = true; - } - - // Specific check for beds - if (!isObstructing && event.getBlock().getState().getData() instanceof org.bukkit.material.Bed) { - BlockFace bedDirection = ((org.bukkit.material.Bed) event.getBlock().getState().getData()).getFacing(); - org.bukkit.block.Block bedBlock = block.getRelative(bedDirection); - if (LocationUtil.isLocationAffectingIslandSpawn(bedBlock.getLocation(), island, world)) - isObstructing = true; - } - - if (isObstructing) { - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.SpawnProtection.Place.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - - event.setCancelled(true); - return; - } - } - - LimitManager limitManager = skyblock.getLimitManager(); - if (limitManager.isBlockLimitExceeded(player, block)) { - Materials material = Materials.getMaterials(block.getType(), block.getData()); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") - .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))) - .replace("%limit", NumberUtil.formatNumber(limitManager.getBlockLimit(player, block)))); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - - event.setCancelled(true); - return; - } - - if (!configLoad.getBoolean("Island.Block.Level.Enable")) - return; - - if (event.getBlock().getType() == Materials.END_PORTAL_FRAME.parseMaterial() - && event.getPlayer().getItemInHand().getType() == Materials.ENDER_EYE.parseMaterial()) return; - - // Fix a bug in Paper 1.8.8 when using ViaVersion on a 1.12.2 client. - // BUG: Player can infinitely increase their level by placing a block at their feet. - // It doesn't take the block away but still increments the level. - // This doesn't happen in Spigot, but does happen in PaperSpigot due to a BlockPlaceEvent being incorrectly fired. - // The solution is to wait a tick to make sure that the block was actually placed. - // This shouldn't cause any issues besides the task number being increased insanely fast. - Bukkit.getScheduler().runTask(skyblock, () -> { - @SuppressWarnings("deprecation") - Materials materials = Materials.getMaterials(block.getType(), block.getData()); - if (materials == null || materials == Materials.AIR) - return; - - if (materials.equals(Materials.SPAWNER)) { - if (Bukkit.getPluginManager().isPluginEnabled("EpicSpawners") || Bukkit.getPluginManager().isPluginEnabled("WildStacker")) - return; - - CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState(); - EntityType spawnerType = creatureSpawner.getSpawnedType(); - materials = Materials.getSpawner(spawnerType); - } - - long materialAmount = 0; - IslandLevel level = island.getLevel(); - - if (level.hasMaterial(materials.name())) { - materialAmount = level.getMaterialAmount(materials.name()); - } - - level.setMaterialAmount(materials.name(), materialAmount + 1); - }); - } - - - @EventHandler - public void onBlockFromTo(BlockFromToEvent event) { - if (!skyblock.getWorldManager().isIslandWorld(event.getBlock().getWorld())) return; - - GeneratorManager generatorManager = skyblock.getGeneratorManager(); - IslandManager islandManager = skyblock.getIslandManager(); - WorldManager worldManager = skyblock.getWorldManager(); - - Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); - IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); - - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (island == null) return; - - org.bukkit.block.Block block = event.getToBlock(); - - // Protect outside of border - if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { - event.setCancelled(true); - return; - } - - // Protect spawn - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world) && configLoad.getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - return; - } - - if (NMSUtil.getVersionNumber() < 12) { - if (generatorManager != null && generatorManager.getGenerators().size() > 0 && generatorManager.isGenerator(block)) { - List generators = new ArrayList<>(generatorManager.getGenerators()); - Collections.reverse(generators); // Use the highest generator available - - // Filter valid players on the island - Set possiblePlayers = new HashSet<>(); - for (Player p : Bukkit.getOnlinePlayers()) { - boolean isMember = island.hasRole(IslandRole.Owner, p.getUniqueId()) || - island.hasRole(IslandRole.Member, p.getUniqueId()) || - island.hasRole(IslandRole.Coop, p.getUniqueId()) || - island.hasRole(IslandRole.Operator, p.getUniqueId()); - if (isMember && islandManager.isLocationAtIsland(island, p.getLocation(), world)) { - possiblePlayers.add(p); - } - } - - // Find highest generator available - for (Generator generator : generators) { - for (Player p : possiblePlayers) { - if (generator.isPermission()) { - if (!p.hasPermission(generator.getPermission()) - && !p.hasPermission("fabledskyblock.generator.*") - && !p.hasPermission("fabledskyblock.*")) { - continue; - } - } - - org.bukkit.block.BlockState genState = generatorManager.generateBlock(generator, block); - event.getToBlock().getState().setType(genState.getType()); - event.getToBlock().getState().setData(genState.getData()); - - return; - } - } - } - } - } - - @EventHandler - public void onBlockPistonExtend(BlockPistonExtendEvent event) { - if (!skyblock.getWorldManager().isIslandWorld(event.getBlock().getWorld())) return; - - IslandManager islandManager = skyblock.getIslandManager(); - WorldManager worldManager = skyblock.getWorldManager(); - - Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); - if (island == null) return; - - IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); - - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - for (org.bukkit.block.Block block : event.getBlocks()) { - if (!islandManager.isLocationAtIsland(island, block.getLocation(), world) || !islandManager.isLocationAtIsland(island, block.getRelative(event.getDirection()).getLocation(), world)) { - event.setCancelled(true); - return; - } - - if (skyblock.getStackableManager() != null && skyblock.getStackableManager().isStacked(block.getLocation())) { - event.setCancelled(true); - return; - } - - if (configLoad.getBoolean("Island.Spawn.Protection")) { - // Check exact block - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { - event.setCancelled(true); - return; - } - - // Check block in direction - if (LocationUtil.isLocationAffectingIslandSpawn(block.getRelative(event.getDirection()).getLocation(), island, world)) { - event.setCancelled(true); - return; - } - } - - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Block.Piston.Connected.Extend")) { - if (block.getType() == Materials.PISTON.parseMaterial() || block.getType() == Materials.STICKY_PISTON.parseMaterial()) { - event.setCancelled(true); - return; - } - } - } - - // Check piston head - if (configLoad.getBoolean("Island.Spawn.Protection")) { - if (LocationUtil.isLocationAffectingIslandSpawn(event.getBlock().getRelative(event.getDirection()).getLocation(), island, world)) { - event.setCancelled(true); - } - } - } - - @EventHandler - public void onBlockPistonRetract(BlockPistonRetractEvent event) { - if (!skyblock.getWorldManager().isIslandWorld(event.getBlock().getWorld())) return; - - IslandManager islandManager = skyblock.getIslandManager(); - WorldManager worldManager = skyblock.getWorldManager(); - - Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); - if (island == null) return; - - IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); - - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - for (org.bukkit.block.Block block : event.getBlocks()) { - if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { - event.setCancelled(true); - return; - } - - if (skyblock.getStackableManager() != null && skyblock.getStackableManager().isStacked(block.getLocation())) { - event.setCancelled(true); - return; - } - - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world) && configLoad.getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - return; - } - - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Block.Piston.Connected.Retract")) { - if (block.getType() == Materials.PISTON.parseMaterial() || block.getType() == Materials.STICKY_PISTON.parseMaterial()) { - event.setCancelled(true); - return; - } - } - } - } - - @EventHandler - public void onBlockForm(BlockFormEvent event) { - org.bukkit.block.Block block = event.getBlock(); - - IslandManager islandManager = skyblock.getIslandManager(); - GeneratorManager generatorManager = skyblock.getGeneratorManager(); - WorldManager worldManager = skyblock.getWorldManager(); - - if (!worldManager.isIslandWorld(block.getWorld())) return; - - Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); - if (island == null) return; - - // Check ice/snow forming - if (block.getType() == Material.ICE || block.getType() == Material.SNOW) { - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Weather.IceAndSnow")) { - event.setCancelled(true); - } - return; - } - - // Check spawn block protection - IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { - if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - return; - } - } - - Material material = event.getBlock().getType(); - if (material != Materials.WATER.parseMaterial() && - material != Materials.LEGACY_STATIONARY_WATER.parseMaterial() && - material != Materials.LAVA.parseMaterial() && - material != Materials.LEGACY_STATIONARY_LAVA.parseMaterial()) - return; - - Material type = event.getNewState().getType(); - if (type != Material.COBBLESTONE && type != Material.STONE) - return; - - if (generatorManager != null && generatorManager.getGenerators().size() > 0) { - List generators = new ArrayList<>(generatorManager.getGenerators()); - Collections.reverse(generators); // Use the highest generator available - - // Filter valid players on the island - Set possiblePlayers = new HashSet<>(); - for (Player player : Bukkit.getOnlinePlayers()) { - boolean isMember = island.hasRole(IslandRole.Owner, player.getUniqueId()) || - island.hasRole(IslandRole.Member, player.getUniqueId()) || - island.hasRole(IslandRole.Coop, player.getUniqueId()) || - island.hasRole(IslandRole.Operator, player.getUniqueId()); - if (isMember && islandManager.isLocationAtIsland(island, player.getLocation(), world)) { - possiblePlayers.add(player); - } - } - - // Find highest generator available - for (Generator generator : generators) { - for (Player player : possiblePlayers) { - if (generator.isPermission()) { - if (!player.hasPermission(generator.getPermission()) - && !player.hasPermission("fabledskyblock.generator.*") - && !player.hasPermission("fabledskyblock.*")) { - continue; - } - } - - org.bukkit.block.BlockState genState = generatorManager.generateBlock(generator, block); - event.getNewState().setType(genState.getType()); - - if (NMSUtil.getVersionNumber() < 13) { - event.getNewState().setData(genState.getData()); - } - - return; - } - } - } - } - - @EventHandler - public void onBlockBurn(BlockBurnEvent event) { - org.bukkit.block.Block block = event.getBlock(); - - WorldManager worldManager = skyblock.getWorldManager(); - - if (worldManager.isIslandWorld(block.getWorld())) { - if (!skyblock.getIslandManager().hasSetting(block.getLocation(), IslandRole.Owner, "FireSpread")) { - event.setCancelled(true); - } - } - } - - @EventHandler - public void onBlockSpread(BlockSpreadEvent event) { - org.bukkit.block.Block block = event.getBlock(); - - WorldManager worldManager = skyblock.getWorldManager(); - - if (event.getSource().getType() != Material.FIRE) { - return; - } - - if (worldManager.isIslandWorld(block.getWorld())) { - if (!skyblock.getIslandManager().hasSetting(block.getLocation(), IslandRole.Owner, "FireSpread")) { - event.setCancelled(true); - } - } - } - - @SuppressWarnings("deprecation") - @EventHandler - public void onBlockGrow(BlockGrowEvent event) { - org.bukkit.block.Block block = event.getBlock(); - - WorldManager worldManager = skyblock.getWorldManager(); - IslandManager islandManager = skyblock.getIslandManager(); - - if (!skyblock.getWorldManager().isIslandWorld(block.getWorld())) return; - - Island island = islandManager.getIslandAtLocation(block.getLocation()); - - if (island == null) return; - - // Check spawn block protection - IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { - if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - return; - } - } - - List upgrades = skyblock.getUpgradeManager().getUpgrades(Upgrade.Type.Crop); - - if (upgrades != null && upgrades.size() > 0 && upgrades.get(0).isEnabled() && island.isUpgrade(Upgrade.Type.Crop)) { - if (NMSUtil.getVersionNumber() > 12) { - try { - Object blockData = block.getClass().getMethod("getBlockData").invoke(block); - - if (blockData instanceof org.bukkit.block.data.Ageable) { - org.bukkit.block.data.Ageable ageable = (org.bukkit.block.data.Ageable) blockData; - ageable.setAge(ageable.getAge() + 1); - block.getClass() - .getMethod("setBlockData", Class.forName("org.bukkit.block.data.BlockData")) - .invoke(block, ageable); - } - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException - | NoSuchMethodException | SecurityException | ClassNotFoundException e) { - e.printStackTrace(); - } - } else { - Material type = block.getType(); - if (block.getState().getData() instanceof Crops - || type.name().equals("BEETROOT_BLOCK") - || type.name().equals("CARROT") - || type.name().equals("POTATO") - || type.name().equals("WHEAT") - || type.name().equals("CROPS")) { - try { - block.getClass().getMethod("setData", byte.class).invoke(block, (byte) (block.getData() + 1)); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException - | NoSuchMethodException | SecurityException e) { - e.printStackTrace(); - } - } - } - } - } - - @EventHandler - public void onLeavesDecay(LeavesDecayEvent event) { - org.bukkit.block.Block block = event.getBlock(); - - if (skyblock.getWorldManager().isIslandWorld(block.getWorld())) { - if (!skyblock.getIslandManager().hasSetting(block.getLocation(), IslandRole.Owner, "LeafDecay")) { - event.setCancelled(true); - } - } - } - - @EventHandler - public void onStructureCreate(StructureGrowEvent event) { - WorldManager worldManager = skyblock.getWorldManager(); - IslandManager islandManager = skyblock.getIslandManager(); - - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) - return; - - if (event.getBlocks().isEmpty()) - return; - - Island island = islandManager.getIslandAtLocation(event.getLocation()); - if (island == null) - return; - - // Check spawn block protection - IslandWorld world = worldManager.getIslandWorld(event.getBlocks().get(0).getWorld()); - Location islandLocation = island.getLocation(world, IslandEnvironment.Main); - - for (org.bukkit.block.BlockState block : event.getBlocks()) { - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { - event.setCancelled(true); - return; - } - } - } - - @EventHandler - public void onPortalCreate(PortalCreateEvent event) { - WorldManager worldManager = skyblock.getWorldManager(); - IslandManager islandManager = skyblock.getIslandManager(); - - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) - return; - - // PortalCreateEvent.getBlocks() changed from ArrayList to ArrayList in 1.14.1... why... - if (NMSUtil.getVersionNumber() > 13) { - List blocks = event.getBlocks(); - if (event.getBlocks().isEmpty()) - return; - - Island island = islandManager.getIslandAtLocation(event.getBlocks().get(0).getLocation()); - if (island == null) - return; - - // Check spawn block protection - IslandWorld world = worldManager.getIslandWorld(event.getBlocks().get(0).getWorld()); - - for (BlockState block : blocks) { - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { - event.setCancelled(true); - return; - } - } - } else { - try { - @SuppressWarnings("unchecked") - List blocks = (List) event.getClass().getMethod("getBlocks").invoke(event); - if (blocks.isEmpty()) - return; - - Island island = islandManager.getIslandAtLocation(blocks.get(0).getLocation()); - if (island == null) - return; - - // Check spawn block protection - IslandWorld world = worldManager.getIslandWorld(blocks.get(0).getWorld()); - - for (org.bukkit.block.Block block : blocks) { - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { - event.setCancelled(true); - return; - } - } - } catch (ReflectiveOperationException ex) { - ex.printStackTrace(); - } - } - } - - @EventHandler - public void onDispenserDispenseBlock(BlockDispenseEvent event) { - WorldManager worldManager = skyblock.getWorldManager(); - IslandManager islandManager = skyblock.getIslandManager(); - - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) - return; - - BlockFace dispenserDirection = ((org.bukkit.material.Dispenser) event.getBlock().getState().getData()).getFacing(); - org.bukkit.block.Block placeLocation = event.getBlock().getRelative(dispenserDirection); - - Island island = islandManager.getIslandAtLocation(placeLocation.getLocation()); - if (island == null) - return; - - // Check spawn block protection - IslandWorld world = worldManager.getIslandWorld(placeLocation.getWorld()); - - if (LocationUtil.isLocationAffectingIslandSpawn(placeLocation.getLocation(), island, world)) { - event.setCancelled(true); - } - } + private final SkyBlock skyblock; + + public Block(SkyBlock skyblock) { + this.skyblock = skyblock; + } + + @SuppressWarnings("deprecation") + @EventHandler(priority = EventPriority.LOW) + public void onBlockBreak(BlockBreakEvent event) { + Player player = event.getPlayer(); + org.bukkit.block.Block block = event.getBlock(); + + IslandManager islandManager = skyblock.getIslandManager(); + StackableManager stackableManager = skyblock.getStackableManager(); + WorldManager worldManager = skyblock.getWorldManager(); + + if (!worldManager.isIslandWorld(block.getWorld())) return; + + IslandWorld world = worldManager.getIslandWorld(block.getWorld()); + Island island = islandManager.getIslandAtLocation(block.getLocation()); + + if (island == null) { + event.setCancelled(true); + return; + } + + if (!islandManager.hasPermission(player, block.getLocation(), "Destroy")) { + event.setCancelled(true); + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + return; + } + + if (stackableManager != null + && stackableManager.isStacked(block.getLocation())) { + Stackable stackable = stackableManager.getStack(block.getLocation(), block.getType()); + if (stackable != null) { + Material material = block.getType(); + byte data = block.getData(); + + int droppedAmount = 0; + if (event.getPlayer().isSneaking()) { + Location dropLoc = event.getBlock().getLocation().clone().add(0.5, 0.5, 0.5); + int count = stackable.getSize(); + droppedAmount = count; + while (count > 64) { + dropLoc.getWorld().dropItemNaturally(dropLoc, new ItemStack(material, 64, data)); + count -= 64; + } + dropLoc.getWorld().dropItemNaturally(dropLoc, new ItemStack(material, count, block.getData())); + block.setType(Material.AIR); + stackable.setSize(0); + } else { + block.getWorld().dropItemNaturally(block.getLocation().clone().add(.5, 1, .5), new ItemStack(material, 1, data)); + stackable.takeOne(); + droppedAmount = 1; + } + + if (stackable.getSize() <= 1) { + stackableManager.removeStack(stackable); + } + + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (configLoad.getBoolean("Island.Block.Level.Enable")) { + Materials materials = Materials.getMaterials(material, data); + if (materials != null) { + IslandLevel level = island.getLevel(); + + if (level.hasMaterial(materials.name())) { + long materialAmount = level.getMaterialAmount(materials.name()); + + if (materialAmount - droppedAmount <= 0) { + level.removeMaterial(materials.name()); + } else { + level.setMaterialAmount(materials.name(), materialAmount - droppedAmount); + } + } + } + } + + event.setCancelled(true); + } + } + + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone().subtract(0.0D, 1.0D, 0.0D)) + || LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone())) { + if (configLoad.getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.SpawnProtection.Break.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + + if (event.isCancelled() || !configLoad.getBoolean("Island.Block.Level.Enable")) return; + + Materials materials = Materials.getMaterials(block.getType(), block.getData()); + + if (materials == null) return; + + IslandLevel level = island.getLevel(); + + if (!level.hasMaterial(materials.name())) return; + + long materialAmount = level.getMaterialAmount(materials.name()); + + if (materialAmount - 1 <= 0) { + level.removeMaterial(materials.name()); + } else { + level.setMaterialAmount(materials.name(), materialAmount - 1); + } + } + + @SuppressWarnings("deprecation") + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + Player player = event.getPlayer(); + org.bukkit.block.Block block = event.getBlock(); + + IslandManager islandManager = skyblock.getIslandManager(); + WorldManager worldManager = skyblock.getWorldManager(); + LevellingManager levellingManager = skyblock.getLevellingManager(); + if (!worldManager.isIslandWorld(block.getWorld())) return; + + IslandWorld world = worldManager.getIslandWorld(block.getWorld()); + Island island = islandManager.getIslandAtLocation(block.getLocation()); + + if (island == null) { + event.setCancelled(true); + return; + } + + if (levellingManager.isIslandLevelBeingScanned(island)) { + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Command.Island.Level.Scanning.BlockPlacing.Message")); + event.setCancelled(true); + return; + } + + if (!islandManager.hasPermission(player, block.getLocation(), "Place")) { + event.setCancelled(true); + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + return; + } + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (configLoad.getBoolean("Island.WorldBorder.Block") && block.getType() == Material.DISPENSER) { + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { + event.setCancelled(true); + } + } + + // Check spawn protection + if (configLoad.getBoolean("Island.Spawn.Protection")) { + boolean isObstructing = false; + // Directly on the block + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { + isObstructing = true; + } + + // Specific check for beds + if (!isObstructing && event.getBlock().getState().getData() instanceof org.bukkit.material.Bed) { + BlockFace bedDirection = ((org.bukkit.material.Bed) event.getBlock().getState().getData()).getFacing(); + org.bukkit.block.Block bedBlock = block.getRelative(bedDirection); + if (LocationUtil.isLocationAffectingIslandSpawn(bedBlock.getLocation(), island, world)) + isObstructing = true; + } + + if (isObstructing) { + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.SpawnProtection.Place.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + + event.setCancelled(true); + return; + } + } + + LimitManager limitManager = skyblock.getLimitManager(); + if (limitManager.isBlockLimitExceeded(player, block)) { + Materials material = Materials.getMaterials(block.getType(), block.getData()); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") + .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))) + .replace("%limit", NumberUtil.formatNumber(limitManager.getBlockLimit(player, block)))); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + + event.setCancelled(true); + return; + } + + if (!configLoad.getBoolean("Island.Block.Level.Enable")) + return; + + if (event.getBlock().getType() == Materials.END_PORTAL_FRAME.parseMaterial() + && event.getPlayer().getItemInHand().getType() == Materials.ENDER_EYE.parseMaterial()) return; + + // Fix a bug in Paper 1.8.8 when using ViaVersion on a 1.12.2 client. + // BUG: Player can infinitely increase their level by placing a block at their feet. + // It doesn't take the block away but still increments the level. + // This doesn't happen in Spigot, but does happen in PaperSpigot due to a BlockPlaceEvent being incorrectly fired. + // The solution is to wait a tick to make sure that the block was actually placed. + // This shouldn't cause any issues besides the task number being increased insanely fast. + Bukkit.getScheduler().runTask(skyblock, () -> { + Materials materials = Materials.getMaterials(block.getType(), block.getData()); + if (materials == null || materials == Materials.AIR) + return; + + if (materials.equals(Materials.SPAWNER)) { + if (Bukkit.getPluginManager().isPluginEnabled("EpicSpawners") || Bukkit.getPluginManager().isPluginEnabled("WildStacker")) + return; + + CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState(); + EntityType spawnerType = creatureSpawner.getSpawnedType(); + materials = Materials.getSpawner(spawnerType); + } + + long materialAmount = 0; + IslandLevel level = island.getLevel(); + + if (level.hasMaterial(materials.name())) { + materialAmount = level.getMaterialAmount(materials.name()); + } + + level.setMaterialAmount(materials.name(), materialAmount + 1); + }); + } + + + @EventHandler + public void onBlockFromTo(BlockFromToEvent event) { + if (!skyblock.getWorldManager().isIslandWorld(event.getBlock().getWorld())) return; + + GeneratorManager generatorManager = skyblock.getGeneratorManager(); + IslandManager islandManager = skyblock.getIslandManager(); + WorldManager worldManager = skyblock.getWorldManager(); + + Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); + IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); + + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (island == null) return; + + org.bukkit.block.Block block = event.getToBlock(); + + // Protect outside of border + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { + event.setCancelled(true); + return; + } + + // Protect spawn + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world) && configLoad.getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + return; + } + + if (NMSUtil.getVersionNumber() < 12) { + if (generatorManager != null && generatorManager.getGenerators().size() > 0 && generatorManager.isGenerator(block)) { + List generators = new ArrayList<>(generatorManager.getGenerators()); + Collections.reverse(generators); // Use the highest generator available + + // Filter valid players on the island + Set possiblePlayers = new HashSet<>(); + for (Player p : Bukkit.getOnlinePlayers()) { + boolean isMember = island.hasRole(IslandRole.Owner, p.getUniqueId()) || + island.hasRole(IslandRole.Member, p.getUniqueId()) || + island.hasRole(IslandRole.Coop, p.getUniqueId()) || + island.hasRole(IslandRole.Operator, p.getUniqueId()); + if (isMember && islandManager.isLocationAtIsland(island, p.getLocation(), world)) { + possiblePlayers.add(p); + } + } + + // Find highest generator available + for (Generator generator : generators) { + for (Player p : possiblePlayers) { + if (generator.isPermission()) { + if (!p.hasPermission(generator.getPermission()) + && !p.hasPermission("fabledskyblock.generator.*") + && !p.hasPermission("fabledskyblock.*")) { + continue; + } + } + + org.bukkit.block.BlockState genState = generatorManager.generateBlock(generator, block); + event.getToBlock().getState().setType(genState.getType()); + event.getToBlock().getState().setData(genState.getData()); + + return; + } + } + } + } + } + + @EventHandler + public void onBlockPistonExtend(BlockPistonExtendEvent event) { + WorldManager worldManager = skyblock.getWorldManager(); + if (!worldManager.isIslandWorld(event.getBlock().getWorld())) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); + if (island == null) + return; + + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); + for (org.bukkit.block.Block block : event.getBlocks()) { + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world) || !islandManager.isLocationAtIsland(island, block.getRelative(event.getDirection()).getLocation(), world)) { + event.setCancelled(true); + return; + } + + if (skyblock.getStackableManager() != null && skyblock.getStackableManager().isStacked(block.getLocation())) { + event.setCancelled(true); + return; + } + + if (configLoad.getBoolean("Island.Spawn.Protection")) { + // Check exact block + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { + event.setCancelled(true); + return; + } + + // Check block in direction + if (LocationUtil.isLocationAffectingIslandSpawn(block.getRelative(event.getDirection()).getLocation(), island, world)) { + event.setCancelled(true); + return; + } + } + + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Block.Piston.Connected.Extend")) { + if (block.getType() == Materials.PISTON.parseMaterial() || block.getType() == Materials.STICKY_PISTON.parseMaterial()) { + event.setCancelled(true); + return; + } + } + } + + // Check piston head + if (configLoad.getBoolean("Island.Spawn.Protection")) { + if (LocationUtil.isLocationAffectingIslandSpawn(event.getBlock().getRelative(event.getDirection()).getLocation(), island, world)) { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onBlockPistonRetract(BlockPistonRetractEvent event) { + WorldManager worldManager = skyblock.getWorldManager(); + if (!skyblock.getWorldManager().isIslandWorld(event.getBlock().getWorld())) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); + if (island == null) + return; + + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); + for (org.bukkit.block.Block block : event.getBlocks()) { + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { + event.setCancelled(true); + return; + } + + if (skyblock.getStackableManager() != null && skyblock.getStackableManager().isStacked(block.getLocation())) { + event.setCancelled(true); + return; + } + + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world) && configLoad.getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + return; + } + + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Block.Piston.Connected.Retract")) { + if (block.getType() == Materials.PISTON.parseMaterial() || block.getType() == Materials.STICKY_PISTON.parseMaterial()) { + event.setCancelled(true); + return; + } + } + } + } + + @EventHandler + public void onBlockForm(BlockFormEvent event) { + org.bukkit.block.Block block = event.getBlock(); + WorldManager worldManager = skyblock.getWorldManager(); + if (!worldManager.isIslandWorld(block.getWorld())) + return; + + // Check ice/snow forming + if (block.getType() == Material.ICE || block.getType() == Material.SNOW) { + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Weather.IceAndSnow")) + event.setCancelled(true); + return; + } + + IslandManager islandManager = skyblock.getIslandManager(); + Island island = islandManager.getIslandAtLocation(block.getLocation()); + if (island == null) + return; + + // Check spawn block protection + IslandWorld world = worldManager.getIslandWorld(block.getWorld()); + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { + if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + return; + } + } + + Material material = block.getType(); + if (material != Materials.WATER.parseMaterial() && + material != Materials.LEGACY_STATIONARY_WATER.parseMaterial() && + material != Materials.LAVA.parseMaterial() && + material != Materials.LEGACY_STATIONARY_LAVA.parseMaterial()) + return; + + BlockState state = event.getNewState(); + Material type = state.getType(); + if (type != Material.COBBLESTONE && type != Material.STONE) + return; + + GeneratorManager generatorManager = skyblock.getGeneratorManager(); + List generators = Lists.newArrayList(generatorManager.getGenerators()); + if (generatorManager == null || generators.size() == 0) + return; + Collections.reverse(generators); // Use the highest generator available + + // Filter valid players on the island. + Set possiblePlayers = new HashSet<>(); + for (Player player : Bukkit.getOnlinePlayers()) { + boolean isMember = island.hasRole(IslandRole.Owner, player.getUniqueId()) || + island.hasRole(IslandRole.Member, player.getUniqueId()) || + island.hasRole(IslandRole.Coop, player.getUniqueId()) || + island.hasRole(IslandRole.Operator, player.getUniqueId()); + if (isMember && islandManager.isLocationAtIsland(island, player.getLocation(), world)) { + possiblePlayers.add(player); + } + } + + // Find highest generator available + for (Generator generator : generators) { + for (Player player : possiblePlayers) { + if (generator.isPermission()) { + if (!player.hasPermission(generator.getPermission()) + && !player.hasPermission("fabledskyblock.generator.*") + && !player.hasPermission("fabledskyblock.*")) { + continue; + } + } + + org.bukkit.block.BlockState genState = generatorManager.generateBlock(generator, block); + state.setType(genState.getType()); + + if (NMSUtil.getVersionNumber() < 13) + state.setData(genState.getData()); + return; + } + } + } + + @EventHandler + public void onBlockBurn(BlockBurnEvent event) { + org.bukkit.block.Block block = event.getBlock(); + WorldManager worldManager = skyblock.getWorldManager(); + if (!worldManager.isIslandWorld(block.getWorld())) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + if (!islandManager.hasSetting(block.getLocation(), IslandRole.Owner, "FireSpread")) + event.setCancelled(true); + } + + @EventHandler + public void onPortalCreate(PortalCreateEvent event) { + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) + return; + + WorldManager worldManager = skyblock.getWorldManager(); + IslandManager islandManager = skyblock.getIslandManager(); + // PortalCreateEvent.getBlocks() changed from ArrayList to ArrayList in 1.14.1 + if (NMSUtil.getVersionNumber() > 13) { + List blocks = event.getBlocks(); + if (event.getBlocks().isEmpty()) + return; + + Island island = islandManager.getIslandAtLocation(event.getBlocks().get(0).getLocation()); + if (island == null) + return; + + // Check spawn block protection + IslandWorld world = worldManager.getIslandWorld(event.getBlocks().get(0).getWorld()); + + for (BlockState block : blocks) { + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { + event.setCancelled(true); + return; + } + } + } else { + try { + @SuppressWarnings("unchecked") + List blocks = (List) event.getClass().getMethod("getBlocks").invoke(event); + if (blocks.isEmpty()) + return; + + Island island = islandManager.getIslandAtLocation(blocks.get(0).getLocation()); + if (island == null) + return; + + // Check spawn block protection + IslandWorld world = worldManager.getIslandWorld(blocks.get(0).getWorld()); + for (org.bukkit.block.Block block : blocks) { + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { + event.setCancelled(true); + return; + } + } + } catch (ReflectiveOperationException ex) { + ex.printStackTrace(); + } + } + } + + @EventHandler + public void onDispenserDispenseBlock(BlockDispenseEvent event) { + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) + return; + + WorldManager worldManager = skyblock.getWorldManager(); + IslandManager islandManager = skyblock.getIslandManager(); + @SuppressWarnings("deprecation") + BlockFace dispenserDirection = ((org.bukkit.material.Dispenser) event.getBlock().getState().getData()).getFacing(); + org.bukkit.block.Block placeLocation = event.getBlock().getRelative(dispenserDirection); + + Island island = islandManager.getIslandAtLocation(placeLocation.getLocation()); + if (island == null) + return; + + // Check spawn block protection + IslandWorld world = worldManager.getIslandWorld(placeLocation.getWorld()); + + if (LocationUtil.isLocationAffectingIslandSpawn(placeLocation.getLocation(), island, world)) + event.setCancelled(true); + } + } diff --git a/src/main/java/com/songoda/skyblock/listeners/Grow.java b/src/main/java/com/songoda/skyblock/listeners/Grow.java index 57380b8a..c76e4628 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Grow.java +++ b/src/main/java/com/songoda/skyblock/listeners/Grow.java @@ -1,15 +1,33 @@ package com.songoda.skyblock.listeners; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +import org.bukkit.Material; import org.bukkit.block.BlockState; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockGrowEvent; +import org.bukkit.event.block.BlockSpreadEvent; +import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.world.StructureGrowEvent; +import org.bukkit.material.Crops; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.island.Island; import com.songoda.skyblock.island.IslandManager; +import com.songoda.skyblock.island.IslandRole; +import com.songoda.skyblock.island.IslandWorld; +import com.songoda.skyblock.upgrade.Upgrade; +import com.songoda.skyblock.utils.version.Materials; +import com.songoda.skyblock.utils.version.NMSUtil; +import com.songoda.skyblock.utils.world.LocationUtil; import com.songoda.skyblock.world.WorldManager; +@SuppressWarnings("deprecation") public class Grow implements Listener { private final SkyBlock skyblock; @@ -22,7 +40,7 @@ public class Grow implements Listener { * Checks that a structure like a tree is not growing outside or into another island. * @author LimeGlass */ - @EventHandler + @EventHandler(ignoreCancelled = true) public void onStructureGrow(StructureGrowEvent event) { WorldManager worldManager = skyblock.getWorldManager(); if (!worldManager.isIslandWorld(event.getWorld())) @@ -48,4 +66,138 @@ public class Grow implements Listener { } } + @EventHandler(ignoreCancelled = true) + public void onCropUpgrade(BlockGrowEvent event) { + org.bukkit.block.Block block = event.getBlock(); + WorldManager worldManager = skyblock.getWorldManager(); + if (!skyblock.getWorldManager().isIslandWorld(block.getWorld())) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + Island island = islandManager.getIslandAtLocation(block.getLocation()); + if (island == null) + return; + + // Check spawn block protection + IslandWorld world = worldManager.getIslandWorld(block.getWorld()); + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { + if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + return; + } + } + + List upgrades = skyblock.getUpgradeManager().getUpgrades(Upgrade.Type.Crop); + if (upgrades == null || upgrades.size() == 0 || !upgrades.get(0).isEnabled() || !island.isUpgrade(Upgrade.Type.Crop)) + return; + + if (NMSUtil.getVersionNumber() > 12) { + BlockData data = block.getBlockData(); + if (data instanceof Ageable) { + Ageable ageable = (Ageable) data; + ageable.setAge(ageable.getAge() + 1); + block.setBlockData(ageable); + } + } else { + Material type = block.getType(); + if (block.getState().getData() instanceof Crops + || type.name().equals("BEETROOT_BLOCK") + || type.name().equals("CARROT") + || type.name().equals("POTATO") + || type.name().equals("WHEAT") + || type.name().equals("CROPS")) { + try { + block.getClass().getMethod("setData", byte.class).invoke(block, (byte) (block.getData() + 1)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } + } + } + } + + /** + * Checks that a block like a pumpkins and melons are not growing outside or into another island. + * @author LimeGlass + */ + @EventHandler(ignoreCancelled = true) + public void onBlockGrow(BlockGrowEvent event) { + WorldManager worldManager = skyblock.getWorldManager(); + BlockState state = event.getNewState(); + if (!worldManager.isIslandWorld(state.getWorld())) + return; + if (state.getType() != Materials.PUMPKIN.parseMaterial() && state.getType() != Materials.MELON.parseMaterial()) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + Island origin = islandManager.getIslandAtLocation(event.getBlock().getLocation()); + Island growingTo = islandManager.getIslandAtLocation(state.getLocation()); + // This block is ok to continue as it's not related to Skyblock islands. + if (origin == null && growingTo == null) + return; + // The growing block is outside/inside that it's not suppose to. + if (origin == null || growingTo == null) { + event.setCancelled(true); + return; + } + // The block is growing from one island to another. + if (!origin.getIslandUUID().equals(growingTo.getIslandUUID())) { + event.setCancelled(true); + return; + } + } + + /** + * Checks that a structure growing like a tree, does not impact spawn location of the island. + */ + @EventHandler(ignoreCancelled = true) + public void onStructureCreate(StructureGrowEvent event) { + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) + return; + + List blocks = event.getBlocks(); + if (blocks.isEmpty()) + return; + + WorldManager worldManager = skyblock.getWorldManager(); + IslandManager islandManager = skyblock.getIslandManager(); + Island island = islandManager.getIslandAtLocation(event.getLocation()); + if (island == null) + return; + + // Check spawn block protection + IslandWorld world = worldManager.getIslandWorld(blocks.get(0).getWorld()); + for (BlockState block : event.getBlocks()) { + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world)) { + event.setCancelled(true); + return; + } + } + } + + @EventHandler + public void onFireSpread(BlockSpreadEvent event) { + if (event.getSource().getType() != Material.FIRE) + return; + + org.bukkit.block.Block block = event.getBlock(); + if (!skyblock.getWorldManager().isIslandWorld(block.getWorld())) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + if (!islandManager.hasSetting(block.getLocation(), IslandRole.Owner, "FireSpread")) + event.setCancelled(true); + } + + @EventHandler + public void onLeavesDecay(LeavesDecayEvent event) { + org.bukkit.block.Block block = event.getBlock(); + if (!skyblock.getWorldManager().isIslandWorld(block.getWorld())) + return; + + IslandManager islandManager = skyblock.getIslandManager(); + if (!islandManager.hasSetting(block.getLocation(), IslandRole.Owner, "LeafDecay")) + event.setCancelled(true); + } + } From 75b23c09563d0cccd7eec7de6a7f52afb2cedf62 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 20:50:41 -0600 Subject: [PATCH 19/45] Fix raids and patrols not respecting natual spawning --- .../songoda/skyblock/listeners/Entity.java | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index 535cd2c3..d58b19e3 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -1,5 +1,6 @@ package com.songoda.skyblock.listeners; +import com.google.common.collect.Sets; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager; import com.songoda.skyblock.config.FileManager.Config; @@ -689,37 +690,37 @@ public class Entity implements Listener { @SuppressWarnings("deprecation") @EventHandler public void onCreatureSpawn(CreatureSpawnEvent event) { - if (event.getEntity() instanceof ArmorStand - || event.getEntity() instanceof FallingBlock - || event.getEntity() instanceof org.bukkit.entity.Item) { + LivingEntity entity = event.getEntity(); + if (entity instanceof ArmorStand) + return; + if (entity.hasMetadata("SkyBlock")) + return; + + SpawnReason reason = event.getSpawnReason(); + Set reasons = Sets.newHashSet(SpawnReason.NATURAL, SpawnReason.JOCKEY, SpawnReason.MOUNT, SpawnReason.valueOf("RAID"), SpawnReason.valueOf("PATROL")); + // Check that the reason of this event is not any of these above. + if (!reasons.stream().filter(r -> r != null).anyMatch(r -> r == reason)) + return; + + if (!skyblock.getWorldManager().isIslandWorld(entity.getWorld())) + return; + if (skyblock.getIslandManager().hasSetting(entity.getLocation(), IslandRole.Owner, "NaturalMobSpawning")) + return; + if (event.getSpawnReason() != SpawnReason.JOCKEY && event.getSpawnReason() != SpawnReason.MOUNT) { + entity.remove(); // Older versions ignore the event being cancelled, so this fixes that issue. return; } - - if (!(event.getSpawnReason() == SpawnReason.NATURAL || event.getSpawnReason() == SpawnReason.JOCKEY || event.getSpawnReason() == SpawnReason.MOUNT)) - return; - - LivingEntity livingEntity = event.getEntity(); - - if (livingEntity.hasMetadata("SkyBlock")) - return; - - if (skyblock.getWorldManager().isIslandWorld(livingEntity.getWorld())) { - if (!skyblock.getIslandManager().hasSetting(livingEntity.getLocation(), IslandRole.Owner, "NaturalMobSpawning")) { - if (event.getSpawnReason() == SpawnReason.JOCKEY || event.getSpawnReason() == SpawnReason.MOUNT) { - Bukkit.getScheduler().scheduleSyncDelayedTask(skyblock, () -> { - if (NMSUtil.getVersionNumber() > 10) { // getPassengers() was added in 1.11 - for (org.bukkit.entity.Entity passenger : livingEntity.getPassengers()) - passenger.remove(); - } else { - if (livingEntity.getPassenger() != null) - livingEntity.getPassenger().remove(); - } - livingEntity.remove(); - }); - } else { - livingEntity.remove(); - } + Bukkit.getScheduler().scheduleSyncDelayedTask(skyblock, () -> { + if (NMSUtil.getVersionNumber() > 10) { // getPassengers() was added in 1.11 + for (org.bukkit.entity.Entity passenger : entity.getPassengers()) + passenger.remove(); + } else { + if (entity.getPassenger() != null) + entity.getPassenger().remove(); } - } + entity.remove(); + }); + event.setCancelled(true); // For other plugin API reasons. } + } From fdb0669176120263362b204f0d6950422e3c017a Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 22 Sep 2019 20:56:14 -0600 Subject: [PATCH 20/45] Fix raids and patrols not respecting natual spawning --- .../java/com/songoda/skyblock/listeners/Entity.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index d58b19e3..7f5736c9 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -42,6 +42,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -697,7 +698,7 @@ public class Entity implements Listener { return; SpawnReason reason = event.getSpawnReason(); - Set reasons = Sets.newHashSet(SpawnReason.NATURAL, SpawnReason.JOCKEY, SpawnReason.MOUNT, SpawnReason.valueOf("RAID"), SpawnReason.valueOf("PATROL")); + Set reasons = Sets.newHashSet(SpawnReason.NATURAL, SpawnReason.JOCKEY, SpawnReason.MOUNT, getSpawnReason("RAID"), getSpawnReason("PATROL")); // Check that the reason of this event is not any of these above. if (!reasons.stream().filter(r -> r != null).anyMatch(r -> r == reason)) return; @@ -723,4 +724,12 @@ public class Entity implements Listener { event.setCancelled(true); // For other plugin API reasons. } + private SpawnReason getSpawnReason(String reason) { + try { + return SpawnReason.valueOf(reason); + } catch (Exception e) { + return null; + } + } + } From cc6b36660a0fd0f10150e11bb0be2f10dd3c39ba Mon Sep 17 00:00:00 2001 From: BuildTools Date: Fri, 27 Sep 2019 05:42:35 -0600 Subject: [PATCH 21/45] 2.0.0 New Versioning --- .gitlab-ci.yml | 2 +- .../songoda/skyblock/listeners/Entity.java | 77 +++++++++++++------ 2 files changed, 54 insertions(+), 25 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 31277799..7d4da5cd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "Build-79.2" + version: "2.0.0" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index 7f5736c9..0754f9ae 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -1,31 +1,49 @@ package com.songoda.skyblock.listeners; -import com.google.common.collect.Sets; -import com.songoda.skyblock.SkyBlock; -import com.songoda.skyblock.config.FileManager; -import com.songoda.skyblock.config.FileManager.Config; -import com.songoda.skyblock.island.*; -import com.songoda.skyblock.message.MessageManager; -import com.songoda.skyblock.sound.SoundManager; -import com.songoda.skyblock.stackable.StackableManager; -import com.songoda.skyblock.upgrade.Upgrade; -import com.songoda.skyblock.utils.version.Materials; -import com.songoda.skyblock.utils.version.NMSUtil; -import com.songoda.skyblock.utils.version.Sounds; -import com.songoda.skyblock.utils.world.LocationUtil; -import com.songoda.skyblock.world.WorldManager; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Donkey; +import org.bukkit.entity.ElderGuardian; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Evoker; +import org.bukkit.entity.ExperienceOrb; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Hanging; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Illager; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Mule; +import org.bukkit.entity.Pig; +import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; -import org.bukkit.entity.*; +import org.bukkit.entity.Ravager; +import org.bukkit.entity.TNTPrimed; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.entity.*; +import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.entity.EntityTameEvent; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.entity.EntityTargetLivingEntityEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingBreakEvent.RemoveCause; @@ -37,14 +55,25 @@ import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; +import com.google.common.collect.Sets; +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.config.FileManager; +import com.songoda.skyblock.config.FileManager.Config; +import com.songoda.skyblock.island.Island; +import com.songoda.skyblock.island.IslandEnvironment; +import com.songoda.skyblock.island.IslandLevel; +import com.songoda.skyblock.island.IslandManager; +import com.songoda.skyblock.island.IslandRole; +import com.songoda.skyblock.island.IslandWorld; +import com.songoda.skyblock.message.MessageManager; +import com.songoda.skyblock.sound.SoundManager; +import com.songoda.skyblock.stackable.StackableManager; +import com.songoda.skyblock.upgrade.Upgrade; +import com.songoda.skyblock.utils.version.Materials; +import com.songoda.skyblock.utils.version.NMSUtil; +import com.songoda.skyblock.utils.version.Sounds; +import com.songoda.skyblock.utils.world.LocationUtil; +import com.songoda.skyblock.world.WorldManager; public class Entity implements Listener { From 0a9018c093ed8d2764a37c8f3454dbe94b854b7a Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 29 Sep 2019 11:57:55 -0600 Subject: [PATCH 22/45] Fix 1.8.8 BlockData --- .../com/songoda/skyblock/listeners/Grow.java | 19 ++- src/main/resources/challenges.yml | 140 ++++++++++++++++++ 2 files changed, 152 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/challenges.yml diff --git a/src/main/java/com/songoda/skyblock/listeners/Grow.java b/src/main/java/com/songoda/skyblock/listeners/Grow.java index c76e4628..c531e39f 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Grow.java +++ b/src/main/java/com/songoda/skyblock/listeners/Grow.java @@ -6,8 +6,6 @@ import java.util.List; import org.bukkit.Material; import org.bukkit.block.BlockState; -import org.bukkit.block.data.Ageable; -import org.bukkit.block.data.BlockData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockGrowEvent; @@ -92,11 +90,18 @@ public class Grow implements Listener { return; if (NMSUtil.getVersionNumber() > 12) { - BlockData data = block.getBlockData(); - if (data instanceof Ageable) { - Ageable ageable = (Ageable) data; - ageable.setAge(ageable.getAge() + 1); - block.setBlockData(ageable); + try { + Object blockData = block.getClass().getMethod("getBlockData").invoke(block); + if (blockData instanceof org.bukkit.block.data.Ageable) { + org.bukkit.block.data.Ageable ageable = (org.bukkit.block.data.Ageable) blockData; + ageable.setAge(ageable.getAge() + 1); + block.getClass() + .getMethod("setBlockData", Class.forName("org.bukkit.block.data.BlockData")) + .invoke(block, ageable); + } + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException | ClassNotFoundException e) { + e.printStackTrace(); } } else { Material type = block.getType(); diff --git a/src/main/resources/challenges.yml b/src/main/resources/challenges.yml new file mode 100644 index 00000000..cea03c95 --- /dev/null +++ b/src/main/resources/challenges.yml @@ -0,0 +1,140 @@ +# +# _______ __ _______ ___ _______ ________ ________ __ ___ ___ ___ _______ ___ ______ ______ __ ___ +# /" "| /""\ | _ "\ |" | /" "||" "\ /" )|/"| / ")|" \/" || _ "\ |" | / " \ /" _ "\ |/"| / ") +# (: ______)/ \ (. |_) :)|| | (: ______)(. ___ :) (: \___/ (: |/ / \ \ / (. |_) :)|| | // ____ \(: ( \___)(: |/ / +# \/ | /' /\ \ |: \/ |: | \/ | |: \ ) || \___ \ | __/ \\ \/ |: \/ |: | / / ) :)\/ \ | __/ +# // ___)// __' \ (| _ \\ \ |___ // ___)_ (| (___\ || __/ \\ (// _ \ / / (| _ \\ \ |___(: (____/ // // \ _ (// _ \ +# (: ( / / \\ \ |: |_) :)( \_|: \(: "||: :) /" \ :) |: | \ \ / / |: |_) :)( \_|: \\ / (: _) \ |: | \ \ +# \__/ (___/ \___)(_______/ \_______)\_______)(________/ (_______/ (__| \__)|___/ (_______/ \_______)\"_____/ \_______)(__| \__) +# +# Challenges reward players and keep their play retention. +challenges: + # Categories allow you to be able to sort challenges. + # Users can sort in the challenges menu to pick challlenge categories they may be interested in. + # You can add more categories if you want. + categories: + - "FARMING" + - "CRAFTING" + - "MINING" + - "LEVELING" + # Difficulties define how hard a challenge is. + # Users can sort through challenges via difficulty. + # And it's displayed on each item if the challenge defines a difficulty. + difficulty: + 1: "NOVICE" + 2: "HARD" + 3: "ADVANCED" + # Used globally to tell the player if they have started the challenge. + started-lore-addition: "&6You have started progress on this challenge." + # If the items in the challenge menu should glow when they have been started. + # Glow is the enchanted effect that hides the enchantment. + glowing-when-started: true + # The name of this challenge. + tree-grower: + # The display on items etc. + title: "&2&lTree Grower" + # The material representing the challenge in the challenge menu. + material: "OAK_SAPLING" + # Material meta is Bukkit's ItemMeta, The string will be used as a ItemMeta object, anything that the Material has as in ItemMeta will be accepted. + # Example: A skull for material and a player's name in the meta string, will set the skull to the player's skull. + #material-meta: "MHF_ArrowLeft" + # When this require is complete this is what the item will be displayed: + complete: + title: "&2&lTree Grower" + material: "OAK_SAPLING" + glowing: false + #material-meta: "MHF_ArrowLeft" + lore: + - "&aYou have completed this challenge" + # Define how many levels their are. + # Each level will be required before the other one. + levels: + # The number spot of this level. lower numbers become lower levels and will be required first. + 1: + difficulty: "NOVICE" + category: "FARMING" + # The description of the challenge at this level. + # Placeholders: + # %number% - the amount required. + # %progress% - how many they have done. + # %left% - how much is left. + description: + - "&7Grow %number% trees to unlock." + - "&e&l%left%&e more trees required." + - "" + - "&6Rewards: All sapplings." + # Conditions are what tell Skyblock when to award/count the challenge. + conditions: + # Require an action to be completed X amount of times. X being the required number. + action: + # ACTIONS ARE PREDEFINED, COMING SOON A LIST OF THEM, TODO LIMEGLASS, UPDATE AND REMOVE THIS COMMENT WHEN FINISHED. + type: "grow-tree" + # How many values are required. + # AKA how many times do they have to grow a tree. + required: 5 + # You can have multiple conditions; + # An example of an item requirement. + #item: + # material: "ACACIA_SAPLING" + # required: 5 + # Example of a permission requirement. + #permission: "skyblock.treegrower.challenge.1" + # Blocks condition will scan the nearby blocks in a 10 block radius. + #blocks: + # material: "STONE" + # required: 5 + # Entities condition will scan the nearby entities in a 10 block radius. + #entities: + # entity: "PIG" + # required: 5 + # Level means the island level must meet this requirement to comeplete the challenge. + #level: + # required: 10 + # Statistics is something I might add, it would be used with the actions since I have to add actions anyways, This area is not 100% confirmed. - Lime + # statistics: + # statistic: "something" + # required: 69 + + # How the player should be rewarded when completing this level. + # Reward types include + rewards: + # Add X amount of economy to one of the supported economy hook plugins. + #economy: + # amount: 500 + # Example of command execution. + #command: + # command: "/example %player%" + # #If this should be ran as a console command or player command. + # console-command: true + # as-op: false + # Reward experience. + #experience: + # amount: 10 + # Give them an item for completing. + give-item: + # If you want to set a title for the reward item. + #title: "" + # How many of this item to give. + amount: 1 + # The name of the material, for 1.13+ you can find a Material list here https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html + material: "OAK_SAPLING" + #material-meta: "LimeGlass" + # If you want to add lores to the item. + #lore: + # - "&7line1" + # - "&a&lline2" + give-item: + amount: 1 + material: "ACACIA_SAPLING" + give-item: + amount: 1 + material: "BAMBOO_SAPLING" + give-item: + amount: 1 + material: "BIRCH_SAPLING" + give-item: + amount: 1 + material: "DARK_OAK_SAPLING" + give-item: + amount: 1 + material: "DARK_OAK_SAPLING" From ec0b18fdbb6a0bab0205de216a9ba9df742d63f4 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 29 Sep 2019 12:13:40 -0600 Subject: [PATCH 23/45] Fixed Skyblock reading a configuration node that doesn't exist --- .../com/songoda/skyblock/playerdata/PlayerDataManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java index 614bd914..5f28dbcd 100644 --- a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java +++ b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java @@ -158,7 +158,7 @@ public class PlayerDataManager { && fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")) .getFileConfiguration().getBoolean("Island.Visitor.Banning") && banManager.getIsland(island.getOwnerUUID()).isBanned(player.getUniqueId())) { - messageManager.sendMessage(player, configLoad.getString("Island.Visit.Teleport.Island.Message") + messageManager.sendMessage(player, configLoad.getString("Island.Visit.Banned.Island.Message") .replace("%player", targetPlayerName)); } else { if (island.hasRole(IslandRole.Member, player.getUniqueId()) @@ -273,7 +273,7 @@ public class PlayerDataManager { .getFileConfiguration().getBoolean("Island.Visitor.Banning") && banManager.getIsland(visitIslandList).isBanned(player.getUniqueId())) { messageManager.sendMessage(player, - configLoad.getString("Island.Visit.Teleport.Island.Message").replace("%player", + configLoad.getString("Island.Visit.Banned.Island.Message").replace("%player", targetPlayerName)); } else { org.bukkit.OfflinePlayer offlinePlayer = Bukkit.getServer() From 586abfab8dd59c5e12f563aaa5f160ea2241a94e Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 29 Sep 2019 13:25:47 -0600 Subject: [PATCH 24/45] 2.0.1 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7d4da5cd..e6bad4ca 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "2.0.0" + version: "2.0.1" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle From e27b4f86eadc6f4335e8ce1f808e44391f2c8bc6 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 29 Sep 2019 15:19:32 -0600 Subject: [PATCH 25/45] Fix scoreboards and liquid check --- .../com/songoda/skyblock/listeners/Move.java | 343 +++++++++--------- .../skyblock/scoreboard/Scoreboard.java | 8 +- 2 files changed, 175 insertions(+), 176 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/listeners/Move.java b/src/main/java/com/songoda/skyblock/listeners/Move.java index 23e4b02d..6931a6ec 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Move.java +++ b/src/main/java/com/songoda/skyblock/listeners/Move.java @@ -26,197 +26,194 @@ import java.io.File; public class Move implements Listener { - private final SkyBlock skyblock; + private final SkyBlock skyblock; - public Move(SkyBlock skyblock) { - this.skyblock = skyblock; - } + public Move(SkyBlock skyblock) { + this.skyblock = skyblock; + } - @SuppressWarnings("deprecation") - @EventHandler - public void onPlayerMove(PlayerMoveEvent event) { - Player player = event.getPlayer(); + @SuppressWarnings("deprecation") + @EventHandler + public void onPlayerMove(PlayerMoveEvent event) { + Player player = event.getPlayer(); - Location from = event.getFrom(); - Location to = event.getTo(); + Location from = event.getFrom(); + Location to = event.getTo(); - if (to == null || (from.getBlockX() == to.getBlockX() && from.getBlockY() == to.getBlockY() && from.getBlockZ() == to.getBlockZ())) { - return; - } + if (to == null || (from.getBlockX() == to.getBlockX() && from.getBlockY() == to.getBlockY() && from.getBlockZ() == to.getBlockZ())) { + return; + } - PlayerDataManager playerDataManager = skyblock.getPlayerDataManager(); - MessageManager messageManager = skyblock.getMessageManager(); - IslandManager islandManager = skyblock.getIslandManager(); - SoundManager soundManager = skyblock.getSoundManager(); - WorldManager worldManager = skyblock.getWorldManager(); - FileManager fileManager = skyblock.getFileManager(); + PlayerDataManager playerDataManager = skyblock.getPlayerDataManager(); + MessageManager messageManager = skyblock.getMessageManager(); + IslandManager islandManager = skyblock.getIslandManager(); + SoundManager soundManager = skyblock.getSoundManager(); + WorldManager worldManager = skyblock.getWorldManager(); + FileManager fileManager = skyblock.getFileManager(); - if (!worldManager.isIslandWorld(player.getWorld())) - return; + if (!worldManager.isIslandWorld(player.getWorld())) + return; - IslandWorld world = worldManager.getIslandWorld(player.getWorld()); + IslandWorld world = worldManager.getIslandWorld(player.getWorld()); - if (world == IslandWorld.Nether || world == IslandWorld.End) { - if (!fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() - .getBoolean("Island.World." + world.name() + ".Enable")) { - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); + if (world == IslandWorld.Nether || world == IslandWorld.End) { + if (!fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() + .getBoolean("Island.World." + world.name() + ".Enable")) { + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); - messageManager.sendMessage(player, configLoad.getString("Island.World.Message") - .replace(configLoad.getString("Island.World.Word." + world.name()), world.name())); + messageManager.sendMessage(player, configLoad.getString("Island.World.Message") + .replace(configLoad.getString("Island.World.Word." + world.name()), world.name())); - if (playerDataManager.hasPlayerData(player)) { - PlayerData playerData = playerDataManager.getPlayerData(player); + if (playerDataManager.hasPlayerData(player)) { + PlayerData playerData = playerDataManager.getPlayerData(player); - if (playerData.getIsland() != null) { - Island island = islandManager - .getIsland(Bukkit.getServer().getOfflinePlayer(playerData.getIsland())); + if (playerData.getIsland() != null) { + Island island = islandManager + .getIsland(Bukkit.getServer().getOfflinePlayer(playerData.getIsland())); - if (island != null) { - if (island.hasRole(IslandRole.Member, player.getUniqueId()) - || island.hasRole(IslandRole.Operator, player.getUniqueId()) - || island.hasRole(IslandRole.Owner, player.getUniqueId())) { - player.teleport(island.getLocation(IslandWorld.Normal, IslandEnvironment.Main)); - } else { - player.teleport(island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor)); - } + if (island != null) { + if (island.hasRole(IslandRole.Member, player.getUniqueId()) + || island.hasRole(IslandRole.Operator, player.getUniqueId()) + || island.hasRole(IslandRole.Owner, player.getUniqueId())) { + player.teleport(island.getLocation(IslandWorld.Normal, IslandEnvironment.Main)); + } else { + player.teleport(island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor)); + } - player.setFallDistance(0.0F); - soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); + player.setFallDistance(0.0F); + soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); - return; - } - } - } + return; + } + } + } - LocationUtil.teleportPlayerToSpawn(player); - soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); - } - } + LocationUtil.teleportPlayerToSpawn(player); + soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); + } + } - if (playerDataManager.hasPlayerData(player)) { - PlayerData playerData = playerDataManager.getPlayerData(player); + if (playerDataManager.hasPlayerData(player)) { + PlayerData playerData = playerDataManager.getPlayerData(player); - if (playerData.getIsland() != null) { - Island island = islandManager - .getIsland(Bukkit.getServer().getOfflinePlayer(playerData.getIsland())); + if (playerData.getIsland() != null) { + Island island = islandManager + .getIsland(Bukkit.getServer().getOfflinePlayer(playerData.getIsland())); + + if (island != null) { + if (islandManager.isLocationAtIsland(island, to)) { + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + boolean keepItemsOnDeath; + + if (configLoad.getBoolean("Island.Settings.KeepItemsOnDeath.Enable")) { + keepItemsOnDeath = island.getSetting(IslandRole.Owner, "KeepItemsOnDeath").getStatus(); + } else { + keepItemsOnDeath = configLoad.getBoolean("Island.KeepItemsOnDeath.Enable"); + } + + if (configLoad.getBoolean("Island.World." + world.name() + ".Liquid.Enable")) { + if (to.getY() <= configLoad.getInt("Island.World." + world.name() + ".Liquid.Height")) { + if (keepItemsOnDeath && configLoad.getBoolean("Island.Liquid.Teleport.Enable")) { + player.setFallDistance(0.0F); + + if (island.hasRole(IslandRole.Member, player.getUniqueId()) + || island.hasRole(IslandRole.Operator, player.getUniqueId()) + || island.hasRole(IslandRole.Owner, player.getUniqueId())) { + player.teleport( + island.getLocation(IslandWorld.Normal, IslandEnvironment.Main)); + } else { + player.teleport( + island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor)); + } + + player.setFallDistance(0.0F); + soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, + 1.0F); + } + return; + } + } + + if (configLoad.getBoolean("Island.Void.Teleport.Enable")) { + if (to.getY() <= configLoad.getInt("Island.Void.Teleport.Offset")) { + if (configLoad.getBoolean("Island.Void.Teleport.ClearInventory")) { + player.getInventory().clear(); + player.setLevel(0); + player.setExp(0.0F); + + if (NMSUtil.getVersionNumber() > 8) { + player.setHealth( + player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); + } else { + player.setHealth(player.getMaxHealth()); + } + + player.setFoodLevel(20); + + for (PotionEffect potionEffect : player.getActivePotionEffects()) { + player.removePotionEffect(potionEffect.getType()); + } + } + + player.setFallDistance(0.0F); + + if (configLoad.getBoolean("Island.Void.Teleport.Island")) { + if (island.hasRole(IslandRole.Member, player.getUniqueId()) + || island.hasRole(IslandRole.Operator, player.getUniqueId()) + || island.hasRole(IslandRole.Owner, player.getUniqueId())) { + player.teleport( + island.getLocation(IslandWorld.Normal, IslandEnvironment.Main)); + } else { + player.teleport( + island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor)); + } + } else { + LocationUtil.teleportPlayerToSpawn(player); + } + + player.setFallDistance(0.0F); + soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); + } + } + } else { + if (!LocationUtil.isLocationAtLocationRadius(island.getLocation(world, IslandEnvironment.Island), to, island.getRadius() + 0.5)) { + if (island.getVisit().isVisitor(player.getUniqueId())) { + player.teleport(island.getLocation(world, IslandEnvironment.Visitor)); + } else { + player.teleport(island.getLocation(world, IslandEnvironment.Main)); + } + + player.setFallDistance(0.0F); + messageManager.sendMessage(player, skyblock.getFileManager() + .getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.WorldBorder.Outside.Message")); + soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); + } + } + + return; + } + } + + // Load the island they are now on if one exists + if (player.hasPermission("fabledskyblock.bypass")) { + Island loadedIsland = islandManager.loadIslandAtLocation(player.getLocation()); + if (loadedIsland != null) { + playerData.setIsland(loadedIsland.getOwnerUUID()); + return; + } + } - if (island != null) { - if (islandManager.isLocationAtIsland(island, to)) { - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); + LocationUtil.teleportPlayerToSpawn(player); - boolean keepItemsOnDeath; - - if (configLoad.getBoolean("Island.Settings.KeepItemsOnDeath.Enable")) { - keepItemsOnDeath = island.getSetting(IslandRole.Owner, "KeepItemsOnDeath").getStatus(); - } else { - keepItemsOnDeath = configLoad.getBoolean("Island.KeepItemsOnDeath.Enable"); - } - - if (configLoad.getBoolean("Island.World." + world.name() + ".Liquid.Enable")) { - if (to.getY() <= configLoad.getInt("Island.World." + world.name() + ".Liquid.Height")) { - if (!configLoad.getBoolean("Island.Liquid.Teleport.Enable")) return; - if (keepItemsOnDeath) { - player.setFallDistance(0.0F); - - if (island.hasRole(IslandRole.Member, player.getUniqueId()) - || island.hasRole(IslandRole.Operator, player.getUniqueId()) - || island.hasRole(IslandRole.Owner, player.getUniqueId())) { - player.teleport( - island.getLocation(IslandWorld.Normal, IslandEnvironment.Main)); - } else { - player.teleport( - island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor)); - } - - player.setFallDistance(0.0F); - soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, - 1.0F); - } - - return; - } - } - - if (configLoad.getBoolean("Island.Void.Teleport.Enable")) { - if (to.getY() <= configLoad.getInt("Island.Void.Teleport.Offset")) { - if (configLoad.getBoolean("Island.Void.Teleport.ClearInventory")) { - player.getInventory().clear(); - player.setLevel(0); - player.setExp(0.0F); - - if (NMSUtil.getVersionNumber() > 8) { - player.setHealth( - player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); - } else { - player.setHealth(player.getMaxHealth()); - } - - player.setFoodLevel(20); - - for (PotionEffect potionEffect : player.getActivePotionEffects()) { - player.removePotionEffect(potionEffect.getType()); - } - } - - player.setFallDistance(0.0F); - - if (configLoad.getBoolean("Island.Void.Teleport.Island")) { - if (island.hasRole(IslandRole.Member, player.getUniqueId()) - || island.hasRole(IslandRole.Operator, player.getUniqueId()) - || island.hasRole(IslandRole.Owner, player.getUniqueId())) { - player.teleport( - island.getLocation(IslandWorld.Normal, IslandEnvironment.Main)); - } else { - player.teleport( - island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor)); - } - } else { - LocationUtil.teleportPlayerToSpawn(player); - } - - player.setFallDistance(0.0F); - soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); - } - } - } else { - if (!LocationUtil.isLocationAtLocationRadius(island.getLocation(world, IslandEnvironment.Island), to, island.getRadius() + 0.5)) { - if (island.getVisit().isVisitor(player.getUniqueId())) { - player.teleport(island.getLocation(world, IslandEnvironment.Visitor)); - } else { - player.teleport(island.getLocation(world, IslandEnvironment.Main)); - } - - player.setFallDistance(0.0F); - messageManager.sendMessage(player, skyblock.getFileManager() - .getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.WorldBorder.Outside.Message")); - soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); - } - } - - return; - } - } - - // Load the island they are now on if one exists - if (player.hasPermission("fabledskyblock.bypass")) { - Island loadedIsland = islandManager.loadIslandAtLocation(player.getLocation()); - if (loadedIsland != null) { - playerData.setIsland(loadedIsland.getOwnerUUID()); - return; - } - } - - - LocationUtil.teleportPlayerToSpawn(player); - - messageManager.sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.WorldBorder.Disappeared.Message")); - soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); - } - } + messageManager.sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.WorldBorder.Disappeared.Message")); + soundManager.playSound(player, Sounds.ENDERMAN_TELEPORT.bukkitSound(), 1.0F, 1.0F); + } + } } diff --git a/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java b/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java index fc2f9067..0138f2cc 100644 --- a/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java +++ b/src/main/java/com/songoda/skyblock/scoreboard/Scoreboard.java @@ -7,6 +7,8 @@ import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.island.IslandRole; import com.songoda.skyblock.placeholder.PlaceholderManager; import com.songoda.skyblock.utils.NumberUtil; +import com.songoda.skyblock.utils.version.NMSUtil; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -72,8 +74,8 @@ public class Scoreboard { String formattedDisplayName = ChatColor.translateAlternateColorCodes('&', replaceDisplayName(displayName)); - - if (formattedDisplayName.length() > 32) { + int max = NMSUtil.getVersionNumber() > 8 ? 32 : 16; + if (formattedDisplayName.length() > max) { obj.setDisplayName(ChatColor.RED + "Too long..."); } else { obj.setDisplayName(formattedDisplayName); @@ -101,7 +103,7 @@ public class Scoreboard { String formattedDisplayName = ChatColor.translateAlternateColorCodes('&', replaceDisplayName(displayName)); - if (formattedDisplayName.length() > 32) { + if (formattedDisplayName.length() > max) { obj.setDisplayName(ChatColor.RED + "Too long..."); } else { obj.setDisplayName(formattedDisplayName); From 1ae8197ea835931d7bebe227583ad55027f6d195 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 30 Sep 2019 12:05:25 -0600 Subject: [PATCH 26/45] Compression is scuffed --- .../songoda/skyblock/utils/Compression.java | 42 +++ .../com/songoda/skyblock/utils/GZipUtil.java | 36 -- .../utils/structure/StructureUtil.java | 310 +++++++++--------- 3 files changed, 202 insertions(+), 186 deletions(-) create mode 100644 src/main/java/com/songoda/skyblock/utils/Compression.java delete mode 100644 src/main/java/com/songoda/skyblock/utils/GZipUtil.java diff --git a/src/main/java/com/songoda/skyblock/utils/Compression.java b/src/main/java/com/songoda/skyblock/utils/Compression.java new file mode 100644 index 00000000..53c1027a --- /dev/null +++ b/src/main/java/com/songoda/skyblock/utils/Compression.java @@ -0,0 +1,42 @@ +package com.songoda.skyblock.utils; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public class Compression { + + public static byte[] compress(String data) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length()); + GZIPOutputStream gzip = new GZIPOutputStream(bos); + gzip.write(data.getBytes()); + gzip.close(); + byte[] compressed = bos.toByteArray(); + bos.close(); + return compressed; + } + + public static String decompress(byte[] compressed) throws IOException { + ByteArrayInputStream bis = new ByteArrayInputStream(compressed); + GZIPInputStream gis = new GZIPInputStream(bis); + BufferedReader br = new BufferedReader(new InputStreamReader(gis, "UTF-8")); + StringBuilder sb = new StringBuilder(); + String line; + while((line = br.readLine()) != null) { + sb.append(line); + } + br.close(); + gis.close(); + bis.close(); + return sb.toString(); + } + + public static boolean isOldCompression(byte[] compressed) { + return compressed[0] == (byte) GZIPInputStream.GZIP_MAGIC && compressed[1] == (byte) GZIPInputStream.GZIP_MAGIC >> 8; + } + +} diff --git a/src/main/java/com/songoda/skyblock/utils/GZipUtil.java b/src/main/java/com/songoda/skyblock/utils/GZipUtil.java deleted file mode 100644 index bccbfcfb..00000000 --- a/src/main/java/com/songoda/skyblock/utils/GZipUtil.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.songoda.skyblock.utils; - -import org.apache.commons.io.IOUtils; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -public final class GZipUtil { - - public static byte[] compress(byte[] data) throws IOException { - ByteArrayOutputStream obj = new ByteArrayOutputStream(); - GZIPOutputStream gzip = new GZIPOutputStream(obj); - gzip.write(data); - gzip.flush(); - gzip.close(); - - return obj.toByteArray(); - } - - public static byte[] decompress(final byte[] compressedData) throws IOException { - if (isCompressed(compressedData)) { - GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(compressedData)); - return IOUtils.toByteArray(gis); - } - - return new byte[512]; - } - - public static boolean isCompressed(final byte[] compressedData) { - return (compressedData[0] == (byte) (GZIPInputStream.GZIP_MAGIC)) - && (compressedData[1] == (byte) (GZIPInputStream.GZIP_MAGIC >> 8)); - } -} diff --git a/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java index 0f920bf2..d1daaf8a 100644 --- a/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java @@ -4,7 +4,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager; -import com.songoda.skyblock.utils.GZipUtil; +import com.songoda.skyblock.utils.Compression; import com.songoda.skyblock.utils.version.NMSUtil; import com.songoda.skyblock.utils.world.LocationUtil; import com.songoda.skyblock.utils.world.block.BlockData; @@ -12,6 +12,7 @@ import com.songoda.skyblock.utils.world.block.BlockDegreesType; import com.songoda.skyblock.utils.world.block.BlockUtil; import com.songoda.skyblock.utils.world.entity.EntityData; import com.songoda.skyblock.utils.world.entity.EntityUtil; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -28,197 +29,206 @@ import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Base64; import java.util.LinkedHashMap; import java.util.List; public final class StructureUtil { - public static void saveStructure(File configFile, org.bukkit.Location originLocation, - org.bukkit.Location[] positions) throws Exception { - if (!configFile.exists()) { - configFile.createNewFile(); - } + public static void saveStructure(File configFile, org.bukkit.Location originLocation, + org.bukkit.Location[] positions) throws Exception { + if (!configFile.exists()) { + configFile.createNewFile(); + } - LinkedHashMap blocks = SelectionLocation.getBlocks(originLocation, positions[0], positions[1]); - LinkedHashMap entities = SelectionLocation.getEntities(originLocation, positions[0], - positions[1]); + LinkedHashMap blocks = SelectionLocation.getBlocks(originLocation, positions[0], positions[1]); + LinkedHashMap entities = SelectionLocation.getEntities(originLocation, positions[0], + positions[1]); - List blockData = new ArrayList<>(); - List entityData = new ArrayList<>(); + List blockData = new ArrayList<>(); + List entityData = new ArrayList<>(); - String originBlockLocation = ""; + String originBlockLocation = ""; - for (Block blockList : blocks.keySet()) { - Location location = blocks.get(blockList); + for (Block blockList : blocks.keySet()) { + Location location = blocks.get(blockList); - if (location.isOriginLocation()) { - originBlockLocation = location.getX() + ":" + location.getY() + ":" + location.getZ() + ":" - + positions[0].getWorld().getName(); + if (location.isOriginLocation()) { + originBlockLocation = location.getX() + ":" + location.getY() + ":" + location.getZ() + ":" + + positions[0].getWorld().getName(); - if (blockList.getType() == Material.AIR) { - blockData.add(BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), - location.getZ())); - } - } + if (blockList.getType() == Material.AIR) { + blockData.add(BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), + location.getZ())); + } + } - if (blockList.getType() == Material.AIR) { - continue; - } + if (blockList.getType() == Material.AIR) { + continue; + } - blockData.add( - BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), location.getZ())); - } + blockData.add( + BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), location.getZ())); + } - for (Entity entityList : entities.keySet()) { - if (entityList.getType() == EntityType.PLAYER) { - continue; - } + for (Entity entityList : entities.keySet()) { + if (entityList.getType() == EntityType.PLAYER) { + continue; + } - Location location = entities.get(entityList); - entityData.add(EntityUtil.convertEntityToEntityData(entityList, location.getX(), location.getY(), - location.getZ())); - } + Location location = entities.get(entityList); + entityData.add(EntityUtil.convertEntityToEntityData(entityList, location.getX(), location.getY(), + location.getZ())); + } - if (!originBlockLocation.isEmpty()) { - originBlockLocation = originBlockLocation + ":" + originLocation.getYaw() + ":" + originLocation.getPitch(); - } + if (!originBlockLocation.isEmpty()) { + originBlockLocation = originBlockLocation + ":" + originLocation.getYaw() + ":" + originLocation.getPitch(); + } - String JSONString = new Gson().toJson(new Storage(new Gson().toJson(blockData), new Gson().toJson(entityData), - originBlockLocation, System.currentTimeMillis(), NMSUtil.getVersionNumber()), new TypeToken() { - }.getType()); + String JSONString = new Gson().toJson(new Storage(new Gson().toJson(blockData), new Gson().toJson(entityData), + originBlockLocation, System.currentTimeMillis(), NMSUtil.getVersionNumber()), Storage.class); - FileOutputStream fileOutputStream = new FileOutputStream(configFile, false); - fileOutputStream.write(GZipUtil.compress(JSONString.getBytes(StandardCharsets.UTF_8))); - fileOutputStream.flush(); - fileOutputStream.close(); - } + FileOutputStream fileOutputStream = new FileOutputStream(configFile, false); + fileOutputStream.write(Base64.getEncoder().encode(JSONString.getBytes(StandardCharsets.UTF_8))); + fileOutputStream.flush(); + fileOutputStream.close(); + } - public static Structure loadStructure(File configFile) throws IOException { - if (!configFile.exists()) { - return null; - } + public static Structure loadStructure(File configFile) throws IOException { + if (!configFile.exists()) + return null; - byte[] content = new byte[(int) configFile.length()]; + byte[] content = new byte[(int) configFile.length()]; - FileInputStream fileInputStream = new FileInputStream(configFile); - fileInputStream.read(content); - fileInputStream.close(); + FileInputStream fileInputStream = new FileInputStream(configFile); + fileInputStream.read(content); + fileInputStream.close(); - String JSONString = new String(GZipUtil.decompress(content)); - Storage storage = new Gson().fromJson(JSONString, new TypeToken() { - }.getType()); + String json; + try { + json = Compression.decompress(content); + } catch (Exception e) { + Bukkit.getConsoleSender().sendMessage("Could not load structure '" + configFile.getName() + "' Try using the '/is admin structure tool' command to make a new schematic of it."); + File defaultStructure = new File(SkyBlock.getInstance().getDataFolder() + "/" + "structures", "default.structure"); + content = new byte[(int) defaultStructure.length()]; + fileInputStream = new FileInputStream(defaultStructure); + fileInputStream.read(content); + fileInputStream.close(); + json = Compression.decompress(content); + } - return new Structure(storage, configFile.getName()); - } + Storage storage = new Gson().fromJson(json, Storage.class); + return new Structure(storage, configFile.getName()); + } - @SuppressWarnings("unchecked") - public static Float[] pasteStructure(Structure structure, org.bukkit.Location location, BlockDegreesType type) { - Storage storage = structure.getStructureStorage(); + @SuppressWarnings("unchecked") + public static Float[] pasteStructure(Structure structure, org.bukkit.Location location, BlockDegreesType type) { + Storage storage = structure.getStructureStorage(); - String[] originLocationPositions = null; + String[] originLocationPositions = null; - if (!storage.getOriginLocation().isEmpty()) { - originLocationPositions = storage.getOriginLocation().split(":"); - } + if (!storage.getOriginLocation().isEmpty()) { + originLocationPositions = storage.getOriginLocation().split(":"); + } - float yaw = 0.0F, pitch = 0.0F; + float yaw = 0.0F, pitch = 0.0F; - if (originLocationPositions.length == 6) { - yaw = Float.valueOf(originLocationPositions[4]); - pitch = Float.valueOf(originLocationPositions[5]); - } + if (originLocationPositions.length == 6) { + yaw = Float.valueOf(originLocationPositions[4]); + pitch = Float.valueOf(originLocationPositions[5]); + } - List blockData = new Gson().fromJson(storage.getBlocks(), - new TypeToken>() { - }.getType()); + List blockData = new Gson().fromJson(storage.getBlocks(), + new TypeToken>() { + }.getType()); - for (BlockData blockDataList : blockData) { - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { - try { - org.bukkit.Location blockRotationLocation = LocationUtil - .rotateLocation(new org.bukkit.Location(location.getWorld(), blockDataList.getX(), - blockDataList.getY(), blockDataList.getZ()), type); - org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), - location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), - location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), - location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); - blockLocation.add(blockRotationLocation); - BlockUtil.convertBlockDataToBlock(blockLocation.getBlock(), blockDataList); - } catch (Exception e) { - SkyBlock.getInstance().getLogger().warning("Unable to convert BlockData to Block for type {" + blockDataList.getMaterial() + - ":" + blockDataList.getData() + "} in structure {" + structure.getStructureFile() + "}"); - } - }); - } + for (BlockData blockDataList : blockData) { + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { + try { + org.bukkit.Location blockRotationLocation = LocationUtil + .rotateLocation(new org.bukkit.Location(location.getWorld(), blockDataList.getX(), + blockDataList.getY(), blockDataList.getZ()), type); + org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), + location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), + location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), + location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); + blockLocation.add(blockRotationLocation); + BlockUtil.convertBlockDataToBlock(blockLocation.getBlock(), blockDataList); + } catch (Exception e) { + SkyBlock.getInstance().getLogger().warning("Unable to convert BlockData to Block for type {" + blockDataList.getMaterial() + + ":" + blockDataList.getData() + "} in structure {" + structure.getStructureFile() + "}"); + } + }); + } - Bukkit.getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { - for (EntityData entityDataList : (List) new Gson().fromJson(storage.getEntities(), - new TypeToken>() { - }.getType())) { - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { - try { - org.bukkit.Location blockRotationLocation = LocationUtil - .rotateLocation(new org.bukkit.Location(location.getWorld(), entityDataList.getX(), - entityDataList.getY(), entityDataList.getZ()), type); - org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), - location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), - location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), - location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); - blockLocation.add(blockRotationLocation); - EntityUtil.convertEntityDataToEntity(entityDataList, blockLocation, type); - } catch (Exception e) { - SkyBlock.getInstance().getLogger().warning("Unable to convert EntityData to Entity for type {" + entityDataList.getEntityType() + - "} in structure {" + structure.getStructureFile() + "}"); - } - }); - } - }, 60L); + Bukkit.getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { + for (EntityData entityDataList : (List) new Gson().fromJson(storage.getEntities(), + new TypeToken>() { + }.getType())) { + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { + try { + org.bukkit.Location blockRotationLocation = LocationUtil + .rotateLocation(new org.bukkit.Location(location.getWorld(), entityDataList.getX(), + entityDataList.getY(), entityDataList.getZ()), type); + org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), + location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), + location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), + location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); + blockLocation.add(blockRotationLocation); + EntityUtil.convertEntityDataToEntity(entityDataList, blockLocation, type); + } catch (Exception e) { + SkyBlock.getInstance().getLogger().warning("Unable to convert EntityData to Entity for type {" + entityDataList.getEntityType() + + "} in structure {" + structure.getStructureFile() + "}"); + } + }); + } + }, 60L); - return new Float[]{yaw, pitch}; - } + return new Float[]{yaw, pitch}; + } - public static ItemStack getTool() throws Exception { - SkyBlock skyblock = SkyBlock.getInstance(); + public static ItemStack getTool() throws Exception { + SkyBlock skyblock = SkyBlock.getInstance(); - FileManager fileManager = skyblock.getFileManager(); + FileManager fileManager = skyblock.getFileManager(); - FileManager.Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); + FileManager.Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); - ItemStack is = new ItemStack( - Material.valueOf(fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")) - .getFileConfiguration().getString("Island.Admin.Structure.Selector"))); - ItemMeta im = is.getItemMeta(); - im.setDisplayName(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Island.Structure.Tool.Item.Displayname"))); + ItemStack is = new ItemStack( + Material.valueOf(fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")) + .getFileConfiguration().getString("Island.Admin.Structure.Selector"))); + ItemMeta im = is.getItemMeta(); + im.setDisplayName(ChatColor.translateAlternateColorCodes('&', + configLoad.getString("Island.Structure.Tool.Item.Displayname"))); - List itemLore = new ArrayList<>(); + List itemLore = new ArrayList<>(); - for (String itemLoreList : configLoad.getStringList("Island.Structure.Tool.Item.Lore")) { - itemLore.add(ChatColor.translateAlternateColorCodes('&', itemLoreList)); - } + for (String itemLoreList : configLoad.getStringList("Island.Structure.Tool.Item.Lore")) { + itemLore.add(ChatColor.translateAlternateColorCodes('&', itemLoreList)); + } - im.setLore(itemLore); - is.setItemMeta(im); + im.setLore(itemLore); + is.setItemMeta(im); - return is; - } + return is; + } - public static org.bukkit.Location[] getFixedLocations(org.bukkit.Location location1, - org.bukkit.Location location2) { - org.bukkit.Location location1Fixed = location1.clone(); - org.bukkit.Location location2Fixed = location2.clone(); + public static org.bukkit.Location[] getFixedLocations(org.bukkit.Location location1, + org.bukkit.Location location2) { + org.bukkit.Location location1Fixed = location1.clone(); + org.bukkit.Location location2Fixed = location2.clone(); - if (location1.getX() > location2.getX()) { - location1Fixed.setX(location2.getX()); - location2Fixed.setX(location1.getX()); - } + if (location1.getX() > location2.getX()) { + location1Fixed.setX(location2.getX()); + location2Fixed.setX(location1.getX()); + } - if (location1.getZ() < location2.getZ()) { - location1Fixed.setZ(location2.getZ()); - location2Fixed.setZ(location1.getZ()); - } + if (location1.getZ() < location2.getZ()) { + location1Fixed.setZ(location2.getZ()); + location2Fixed.setZ(location1.getZ()); + } - return new org.bukkit.Location[]{location1Fixed, location2Fixed}; - } + return new org.bukkit.Location[]{location1Fixed, location2Fixed}; + } } From f13a54e901a72fc1834ebb6758d0ad2c82e7c00d Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 30 Sep 2019 12:05:43 -0600 Subject: [PATCH 27/45] 2.0.2 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e6bad4ca..0ff6eda3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "2.0.1" + version: "2.0.2" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle From 1c0af0765e40007dce3d33f3adf3ce0cdd72b044 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 30 Sep 2019 12:34:51 -0600 Subject: [PATCH 28/45] Fix entity NPE because Spigot is great --- src/main/java/com/songoda/skyblock/listeners/Entity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index 0754f9ae..4967ae3c 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -291,6 +291,9 @@ public class Entity implements Listener { return; org.bukkit.entity.Entity target = event.getTarget(); + // Somehow the target can be null, thanks Spigot. + if (target == null) + return; IslandManager islandManager = skyblock.getIslandManager(); Island entityIsland = islandManager.getIslandAtLocation(entity.getLocation()); From 164c7ae9113aa34051193aeb8e1ea29469cef1b6 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 30 Sep 2019 12:47:21 -0600 Subject: [PATCH 29/45] Fix fast block placing not existing on older versions --- .../skyblock/utils/world/block/BlockUtil.java | 1085 +++++++++-------- 1 file changed, 544 insertions(+), 541 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java index 51e13cea..64b01165 100644 --- a/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java @@ -21,545 +21,548 @@ import java.util.List; @SuppressWarnings("deprecation") public final class BlockUtil { - public static BlockData convertBlockToBlockData(Block block, int x, int y, int z) { - BlockData blockData = new BlockData(block.getType().toString(), block.getData(), x, y, z, - block.getBiome().toString()); - - int NMSVersion = NMSUtil.getVersionNumber(); - blockData.setVersion(NMSVersion); - - if (NMSVersion > 12) { - blockData.setBlockData(block.getBlockData().getAsString()); - } - - BlockState blockState = block.getState(); - MaterialData materialData = blockState.getData(); - - if (blockState instanceof Banner) { - Banner banner = (Banner) blockState; - blockData.setBaseColor(banner.getBaseColor().toString()); - - List patterns = new ArrayList<>(); - - for (Pattern patternList : banner.getPatterns()) { - patterns.add(patternList.getPattern().toString() + ":" + patternList.getColor().toString()); - } - - blockData.setPatterns(patterns); - blockData.setStateType(BlockStateType.BANNER.toString()); - } else if (blockState instanceof Beacon) { - Beacon beacon = (Beacon) blockState; - String primaryEffectName = beacon.getPrimaryEffect() != null ? beacon.getPrimaryEffect().toString() : "null"; - String secondaryEffectName = beacon.getSecondaryEffect() != null ? beacon.getSecondaryEffect().toString() : "null"; - - blockData.setPotionEffect(primaryEffectName + ":" + secondaryEffectName); - blockData.setStateType(BlockStateType.BEACON.toString()); - } else if (blockState instanceof BrewingStand) { - BrewingStand brewingStand = (BrewingStand) blockState; - blockData.setBrewingTime(brewingStand.getBrewingTime()); - blockData.setFuelLevel(brewingStand.getFuelLevel()); - blockData.setStateType(BlockStateType.BREWINGSTAND.toString()); - } else if (blockState instanceof Furnace) { - Furnace furnace = (Furnace) blockState; - blockData.setBurnTime(furnace.getBurnTime()); - blockData.setCookTime(furnace.getCookTime()); - - for (int i = 0; i < furnace.getInventory().getSize(); i++) { - ItemStack is = furnace.getInventory().getItem(i); - - if (is != null && is.getType() != Material.AIR) { - blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); - } - } - - blockData.setStateType(BlockStateType.FURNACE.toString()); - } else if (blockState instanceof Chest) { - Chest chest = (Chest) blockState; - - for (int i = 0; i < chest.getInventory().getSize(); i++) { - ItemStack is = chest.getInventory().getItem(i); - - if (is != null && is.getType() != Material.AIR) { - blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); - } - } - - blockData.setStateType(BlockStateType.CHEST.toString()); - } else if (blockState instanceof Dispenser) { - Dispenser dispenser = (Dispenser) blockState; - - for (int i = 0; i < dispenser.getInventory().getSize(); i++) { - ItemStack is = dispenser.getInventory().getItem(i); - - if (is != null && is.getType() != Material.AIR) { - blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); - } - } - - blockData.setStateType(BlockStateType.DISPENSER.toString()); - } else if (blockState instanceof Dropper) { - Dropper dropper = (Dropper) blockState; - - for (int i = 0; i < dropper.getInventory().getSize(); i++) { - ItemStack is = dropper.getInventory().getItem(i); - - if (is != null && is.getType() != Material.AIR) { - blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); - } - } - - blockData.setStateType(BlockStateType.DROPPER.toString()); - } else if (blockState instanceof Hopper) { - Hopper hopper = (Hopper) blockState; - - for (int i = 0; i < hopper.getInventory().getSize(); i++) { - ItemStack is = hopper.getInventory().getItem(i); - - if (is != null && is.getType() != Material.AIR) { - blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); - } - } - - blockData.setStateType(BlockStateType.HOPPER.toString()); - } else if (blockState instanceof CommandBlock) { - CommandBlock commandBlock = (CommandBlock) blockState; - blockData.setCommand(commandBlock.getCommand()); - blockData.setCommandBlockName(commandBlock.getName()); - blockData.setStateType(BlockStateType.COMMANDBLOCK.toString()); - } else if (blockState instanceof CreatureSpawner) { - CreatureSpawner creatureSpawner = (CreatureSpawner) blockState; - - if (creatureSpawner.getSpawnedType() != null) { - blockData.setEntity(creatureSpawner.getSpawnedType().toString()); - } - - blockData.setDelay(creatureSpawner.getDelay()); - blockData.setStateType(BlockStateType.CREATURESPAWNER.toString()); - } else if (blockState instanceof Jukebox) { - Jukebox jukebox = (Jukebox) blockState; - - if (jukebox.getPlaying() != null) { - blockData.setPlaying(jukebox.getPlaying().toString()); - } - - blockData.setStateType(BlockStateType.JUKEBOX.toString()); - } else if (blockState instanceof Sign) { - Sign sign = (Sign) blockState; - - String[] signLines = sign.getLines(); - - if (signLines != null) { - List correctedSignLines = new ArrayList<>(); - - for (String signLineList : signLines) { - for (ChatColor chatColorList : ChatColor.values()) { - signLineList = signLineList.replace(chatColorList + "", - "&" + chatColorList.toString().substring(chatColorList.toString().length() - 1)); - } - - correctedSignLines.add(signLineList); - } - - signLines = correctedSignLines.toArray(new String[correctedSignLines.size()]); - } - - blockData.setSignLines(signLines); - blockData.setStateType(BlockStateType.SIGN.toString()); - } else if (blockState instanceof Skull) { - Skull skull = (Skull) blockState; - blockData.setSkullOwner(skull.getOwner()); - blockData.setSkullType(skull.getSkullType().toString()); - blockData.setRotateFace(skull.getRotation().toString()); - blockData.setStateType(BlockStateType.SKULL.toString()); - } else { - if (NMSVersion > 8) { - if (blockState instanceof EndGateway) { - EndGateway endGateway = (EndGateway) blockState; - blockData.setExactTeleport(endGateway.isExactTeleport()); - - Location location = endGateway.getExitLocation(); - blockData.setExitLocation(location.getX() + ":" + location.getY() + ":" + location.getZ() + ":" - + location.getWorld().getName()); - blockData.setStateType(BlockStateType.ENDGATEWAY.toString()); - } - - if (NMSVersion > 10) { - if (blockState instanceof ShulkerBox) { - ShulkerBox shulkerBox = (ShulkerBox) blockState; - - for (int i = 0; i < shulkerBox.getInventory().getSize(); i++) { - ItemStack is = shulkerBox.getInventory().getItem(i); - - if (is != null && is.getType() != Material.AIR) { - blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); - } - } - - blockData.setStateType(BlockStateType.SHULKERBOX.toString()); - } - } - } - } - - if (materialData instanceof Stairs) { - blockData.setFacing(((Stairs) materialData).getFacing().toString()); - blockData.setDataType(BlockDataType.STAIRS.toString()); - } else if (materialData instanceof org.bukkit.material.FlowerPot) { - if (NMSVersion >= 8 && NMSVersion <= 12) { - try { - World world = block.getWorld(); - - Class blockPositionClass = NMSUtil.getNMSClass("BlockPosition"); - - Object worldHandle = world.getClass().getMethod("getHandle").invoke(world); - Object blockPosition = blockPositionClass.getConstructor(int.class, int.class, int.class) - .newInstance(block.getX(), block.getY(), block.getZ()); - Object tileEntity = worldHandle.getClass().getMethod("getTileEntity", blockPositionClass) - .invoke(worldHandle, blockPosition); - - Field aField = tileEntity.getClass().getDeclaredField("a"); - aField.setAccessible(true); - - Object item = aField.get(tileEntity); - - if (item != null) { - Object itemStackNMS = NMSUtil.getNMSClass("ItemStack") - .getConstructor(NMSUtil.getNMSClass("Item")).newInstance(item); - - ItemStack itemStack = (ItemStack) NMSUtil.getCraftClass("inventory.CraftItemStack") - .getMethod("asBukkitCopy", itemStackNMS.getClass()).invoke(null, itemStackNMS); - - Field fField = tileEntity.getClass().getDeclaredField("f"); - fField.setAccessible(true); - - int data = (int) fField.get(tileEntity); - - blockData.setFlower(itemStack.getType().name() + ":" + data); - } - } catch (Exception e) { - e.printStackTrace(); - } - } else { - org.bukkit.material.FlowerPot flowerPot = (org.bukkit.material.FlowerPot) materialData; - - if (flowerPot.getContents() != null && flowerPot.getContents().getItemType() != Material.AIR) { - blockData.setFlower( - flowerPot.getContents().getItemType().toString() + ":" + flowerPot.getContents().getData()); - } - } - - blockData.setDataType(BlockDataType.FLOWERPOT.toString()); - } - - return blockData; - } - - public static void convertBlockDataToBlock(Block block, BlockData blockData) { - int NMSVersion = NMSUtil.getVersionNumber(); - - Material material = null; - - if (NMSVersion > 12 && blockData.getVersion() > 12 && blockData.getBlockData() != null) { - block.setBlockData(Bukkit.getServer().createBlockData(blockData.getBlockData())); - } else { - material = MaterialUtil.getMaterial(NMSVersion, blockData.getVersion(), - blockData.getMaterial(), block.getData()); - setBlockFast(block.getWorld(), block.getX(), block.getY(), block.getZ(), material, blockData.getData()); - } - - // TODO Create a class to support biome changes - // block.setBiome(Biome.valueOf(blockData.getBiome().toUpperCase())); - - BlockStateType blockTypeState = BlockStateType.valueOf(blockData.getStateType()); - - if (blockTypeState == BlockStateType.BANNER) { - Banner banner = (Banner) block.getState(); - banner.setBaseColor(DyeColor.valueOf(blockData.getBaseColor().toUpperCase())); - - for (String patternList : blockData.getPatterns()) { - String[] pattern = patternList.split(":"); - banner.addPattern(new Pattern(DyeColor.valueOf(pattern[1].toUpperCase()), - PatternType.valueOf(pattern[0].toUpperCase()))); - } - } else if (blockTypeState == BlockStateType.BEACON) { - Beacon beacon = (Beacon) block.getState(); - String[] potionEffect = blockData.getPotionEffect().split(":"); - if (!potionEffect[0].equals("null")) { - beacon.setPrimaryEffect(PotionEffectType.getByName(potionEffect[0].toUpperCase())); - } - - if (!potionEffect[1].equals("null")) { - beacon.setSecondaryEffect(PotionEffectType.getByName(potionEffect[1].toUpperCase())); - } - } else if (blockTypeState == BlockStateType.BREWINGSTAND) { - BrewingStand brewingStand = (BrewingStand) block.getState(); - brewingStand.setBrewingTime(blockData.getBrewingTime()); - brewingStand.setFuelLevel(blockData.getFuelLevel()); - } else if (blockTypeState == BlockStateType.COMMANDBLOCK) { - CommandBlock commandBlock = (CommandBlock) block.getState(); - commandBlock.setCommand(blockData.getCommand()); - commandBlock.setName(blockData.getCommandBlockName()); - } else if (blockTypeState == BlockStateType.CHEST) { - Chest chest = (Chest) block.getState(); - - for (Integer slotList : blockData.getInventory().keySet()) { - if (slotList < chest.getInventory().getSize()) { - ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); - chest.getInventory().setItem(slotList, is); - } - } - } else if (blockTypeState == BlockStateType.DISPENSER) { - Dispenser dispenser = (Dispenser) block.getState(); - - for (Integer slotList : blockData.getInventory().keySet()) { - if (slotList < dispenser.getInventory().getSize()) { - ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); - dispenser.getInventory().setItem(slotList, is); - } - } - } else if (blockTypeState == BlockStateType.DROPPER) { - Dropper dropper = (Dropper) block.getState(); - - for (Integer slotList : blockData.getInventory().keySet()) { - if (slotList < dropper.getInventory().getSize()) { - ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); - dropper.getInventory().setItem(slotList, is); - } - } - } else if (blockTypeState == BlockStateType.HOPPER) { - Hopper hopper = (Hopper) block.getState(); - - for (Integer slotList : blockData.getInventory().keySet()) { - if (slotList < hopper.getInventory().getSize()) { - ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); - hopper.getInventory().setItem(slotList, is); - } - } - } else if (blockTypeState == BlockStateType.CREATURESPAWNER) { - CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState(); - - if (blockData.getEntity() != null) { - creatureSpawner.setSpawnedType(EntityType.valueOf(blockData.getEntity().toUpperCase())); - } - - creatureSpawner.setDelay(blockData.getDelay()); - } else if (blockTypeState == BlockStateType.FURNACE) { - Furnace furnace = (Furnace) block.getState(); - furnace.setBurnTime(blockData.getBurnTime()); - furnace.setCookTime(blockData.getCookTime()); - - for (Integer slotList : blockData.getInventory().keySet()) { - if (slotList < furnace.getInventory().getSize()) { - ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); - furnace.getInventory().setItem(slotList, is); - } - } - } else if (blockTypeState == BlockStateType.JUKEBOX) { - Jukebox jukebox = (Jukebox) block.getState(); - - if (blockData.getPlaying() != null) { - jukebox.setPlaying(Material.valueOf(blockData.getPlaying().toUpperCase())); - } - } else if (blockTypeState == BlockStateType.SIGN) { - Sign sign = (Sign) block.getState(); - - for (int i = 0; i < blockData.getSignLines().length; i++) { - sign.setLine(i, ChatColor.translateAlternateColorCodes('&', blockData.getSignLines()[i])); - } - } else if (blockTypeState == BlockStateType.SKULL) { - Skull skull = (Skull) block.getState(); - - skull.setRotation(BlockFace.valueOf(blockData.getRotateFace().toUpperCase())); - skull.setSkullType(SkullType.valueOf(blockData.getSkullType().toUpperCase())); - - if (NMSVersion > 9) { - skull.setOwningPlayer(Bukkit.getServer().getOfflinePlayer(blockData.getSkullOwner())); - } else { - skull.setOwner(blockData.getSkullOwner()); - } - } else { - if (NMSVersion > 8) { - if (blockTypeState == BlockStateType.ENDGATEWAY) { - EndGateway endGateway = (EndGateway) block.getState(); - endGateway.setExactTeleport(blockData.isExactTeleport()); - - String[] exitLocation = blockData.getExitLocation().split(":"); - World exitLocationWorld = Bukkit.getServer().getWorld(exitLocation[3]); - - double exitLocationX = Double.parseDouble(exitLocation[0]); - double exitLocationY = Double.parseDouble(exitLocation[1]); - double exitLocationZ = Double.parseDouble(exitLocation[2]); - - endGateway.setExitLocation( - new Location(exitLocationWorld, exitLocationX, exitLocationY, exitLocationZ)); - } - - if (NMSVersion > 9) { - if (NMSVersion > 10) { - if (blockTypeState == BlockStateType.SHULKERBOX) { - ShulkerBox shulkerBox = (ShulkerBox) block.getState(); - - for (Integer slotList : blockData.getInventory().keySet()) { - if (slotList < shulkerBox.getInventory().getSize()) { - ItemStack is = ItemStackUtil - .deserializeItemStack(blockData.getInventory().get(slotList)); - shulkerBox.getInventory().setItem(slotList, is); - } - } - } - } - } - } - } - - BlockDataType blockDataType = BlockDataType.valueOf(blockData.getDataType()); - - if (blockDataType == BlockDataType.STAIRS) { - Stairs stairs = (Stairs) block.getState().getData(); - stairs.setFacingDirection(BlockFace.valueOf(blockData.getFacing())); - block.getState().setData(stairs); - } else if (blockDataType == BlockDataType.FLOWERPOT) { - if (NMSVersion >= 8 && NMSVersion <= 12) { - if (block.getLocation().clone().subtract(0.0D, 1.0D, 0.0D).getBlock().getType() == Material.AIR) { - setBlockFast(block.getWorld(), block.getX(), block.getY() - 1, block.getZ(), Material.STONE, - (byte) 0); - } - - if (blockData.getFlower() != null && !blockData.getFlower().isEmpty()) { - try { - String[] flower = blockData.getFlower().split(":"); - int materialData = Integer.parseInt(flower[1]); - - material = MaterialUtil.getMaterial(NMSVersion, - blockData.getVersion(), flower[0].toUpperCase(), materialData); - - if (material != null) { - ItemStack is = new ItemStack(material, 1, (byte) materialData); - - World world = block.getWorld(); - - Class blockPositionClass = NMSUtil.getNMSClass("BlockPosition"); - - Object worldHandle = world.getClass().getMethod("getHandle").invoke(world); - Object blockPosition = blockPositionClass.getConstructor(int.class, int.class, int.class) - .newInstance(block.getX(), block.getY(), block.getZ()); - Object tileEntity = worldHandle.getClass().getMethod("getTileEntity", blockPositionClass) - .invoke(worldHandle, blockPosition); - Object itemStack = NMSUtil.getCraftClass("inventory.CraftItemStack") - .getMethod("asNMSCopy", is.getClass()).invoke(null, is); - Object item = itemStack.getClass().getMethod("getItem").invoke(itemStack); - Object data = itemStack.getClass().getMethod("getData").invoke(itemStack); - - Field aField = tileEntity.getClass().getDeclaredField("a"); - aField.setAccessible(true); - aField.set(tileEntity, item); - - Field fField = tileEntity.getClass().getDeclaredField("f"); - fField.setAccessible(true); - fField.set(tileEntity, data); - - tileEntity.getClass().getMethod("update").invoke(tileEntity); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } else { - if (blockData.getFlower() != null && !blockData.getFlower().isEmpty()) { - org.bukkit.material.FlowerPot flowerPot = (org.bukkit.material.FlowerPot) block.getState() - .getData(); - String[] flower = blockData.getFlower().split(":"); - material = null; - - if (blockData.getVersion() > 12) { - if (NMSVersion > 12) { - material = Material.valueOf(flower[0].toUpperCase()); - } - } else { - if (NMSVersion < 13) { - material = Material.valueOf(flower[0].toUpperCase()); - } - } - - if (material != null) { - flowerPot.setContents(new MaterialData(material, (byte) Integer.parseInt(flower[1]))); - } - - block.getState().setData(flowerPot); - } - } - } - - if (NMSVersion < 13) { - block.getState().update(); - } - - if (blockData.getMaterial().equals("DOUBLE_PLANT")) { - Block topBlock = block.getLocation().clone().add(0.0D, 1.0D, 0.0D).getBlock(); - Block bottomBlock = block.getLocation().clone().subtract(0.0D, 1.0D, 0.0D).getBlock(); - - if (bottomBlock.getType() == Material.AIR && !topBlock.getType().name().equals("DOUBLE_PLANT")) { - bottomBlock.setType(Materials.LEGACY_DOUBLE_PLANT.getPostMaterial()); - - if (NMSVersion < 13) { - try { - bottomBlock.getClass().getMethod("setData", byte.class).invoke(bottomBlock, (byte) 2); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - } - - public static List getNearbyBlocks(Location loc, int rx, int ry, int rz) { - List nearbyBlocks = new ArrayList<>(); - - for (int x = -(rx); x <= rx; x++) { - for (int y = -(ry); y <= ry; y++) { - for (int z = -(rz); z <= rz; z++) { - nearbyBlocks.add( - new Location(loc.getWorld(), loc.getX() + x, loc.getY() + y, loc.getZ() + z).getBlock()); - } - } - } - - return nearbyBlocks; - } - - private static void setBlockFast(World world, int x, int y, int z, Material material, byte data) { - try { - Class IBlockDataClass = NMSUtil.getNMSClass("IBlockData"); - - Object worldHandle = world.getClass().getMethod("getHandle").invoke(world); - Object chunk = worldHandle.getClass().getMethod("getChunkAt", int.class, int.class).invoke(worldHandle, - x >> 4, z >> 4); - Object blockPosition = NMSUtil.getNMSClass("BlockPosition").getConstructor(int.class, int.class, int.class) - .newInstance(x & 0xF, y, z & 0xF); - - if (NMSUtil.getVersionNumber() > 12) { - Object block = NMSUtil.getNMSClass("Blocks").getField(material.name()).get(null); - Object IBlockData = block.getClass().getMethod("getBlockData").invoke(block); - worldHandle.getClass().getMethod("setTypeAndData", blockPosition.getClass(), IBlockDataClass, int.class) - .invoke(worldHandle, blockPosition, IBlockData, 2); - - try { - chunk.getClass().getMethod("a", blockPosition.getClass(), IBlockDataClass, boolean.class) - .invoke(chunk, blockPosition, IBlockData, true); - } catch (Exception e) { - chunk.getClass().getMethod("setType", blockPosition.getClass(), IBlockDataClass, boolean.class) - .invoke(chunk, blockPosition, IBlockData, true); - } - } else { - Object IBlockData = NMSUtil.getNMSClass("Block").getMethod("getByCombinedId", int.class).invoke(null, - material.getId() + (data << 12)); - worldHandle.getClass().getMethod("setTypeAndData", blockPosition.getClass(), IBlockDataClass, int.class) - .invoke(worldHandle, blockPosition, IBlockData, 3); - chunk.getClass().getMethod("a", blockPosition.getClass(), IBlockDataClass).invoke(chunk, blockPosition, - IBlockData); - } - } catch (Exception e) { - e.printStackTrace(); - } - } + public static BlockData convertBlockToBlockData(Block block, int x, int y, int z) { + BlockData blockData = new BlockData(block.getType().toString(), block.getData(), x, y, z, + block.getBiome().toString()); + + int NMSVersion = NMSUtil.getVersionNumber(); + blockData.setVersion(NMSVersion); + + if (NMSVersion > 12) { + blockData.setBlockData(block.getBlockData().getAsString()); + } + + BlockState blockState = block.getState(); + MaterialData materialData = blockState.getData(); + + if (blockState instanceof Banner) { + Banner banner = (Banner) blockState; + blockData.setBaseColor(banner.getBaseColor().toString()); + + List patterns = new ArrayList<>(); + + for (Pattern patternList : banner.getPatterns()) { + patterns.add(patternList.getPattern().toString() + ":" + patternList.getColor().toString()); + } + + blockData.setPatterns(patterns); + blockData.setStateType(BlockStateType.BANNER.toString()); + } else if (blockState instanceof Beacon) { + Beacon beacon = (Beacon) blockState; + String primaryEffectName = beacon.getPrimaryEffect() != null ? beacon.getPrimaryEffect().toString() : "null"; + String secondaryEffectName = beacon.getSecondaryEffect() != null ? beacon.getSecondaryEffect().toString() : "null"; + + blockData.setPotionEffect(primaryEffectName + ":" + secondaryEffectName); + blockData.setStateType(BlockStateType.BEACON.toString()); + } else if (blockState instanceof BrewingStand) { + BrewingStand brewingStand = (BrewingStand) blockState; + blockData.setBrewingTime(brewingStand.getBrewingTime()); + blockData.setFuelLevel(brewingStand.getFuelLevel()); + blockData.setStateType(BlockStateType.BREWINGSTAND.toString()); + } else if (blockState instanceof Furnace) { + Furnace furnace = (Furnace) blockState; + blockData.setBurnTime(furnace.getBurnTime()); + blockData.setCookTime(furnace.getCookTime()); + + for (int i = 0; i < furnace.getInventory().getSize(); i++) { + ItemStack is = furnace.getInventory().getItem(i); + + if (is != null && is.getType() != Material.AIR) { + blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); + } + } + + blockData.setStateType(BlockStateType.FURNACE.toString()); + } else if (blockState instanceof Chest) { + Chest chest = (Chest) blockState; + + for (int i = 0; i < chest.getInventory().getSize(); i++) { + ItemStack is = chest.getInventory().getItem(i); + + if (is != null && is.getType() != Material.AIR) { + blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); + } + } + + blockData.setStateType(BlockStateType.CHEST.toString()); + } else if (blockState instanceof Dispenser) { + Dispenser dispenser = (Dispenser) blockState; + + for (int i = 0; i < dispenser.getInventory().getSize(); i++) { + ItemStack is = dispenser.getInventory().getItem(i); + + if (is != null && is.getType() != Material.AIR) { + blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); + } + } + + blockData.setStateType(BlockStateType.DISPENSER.toString()); + } else if (blockState instanceof Dropper) { + Dropper dropper = (Dropper) blockState; + + for (int i = 0; i < dropper.getInventory().getSize(); i++) { + ItemStack is = dropper.getInventory().getItem(i); + + if (is != null && is.getType() != Material.AIR) { + blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); + } + } + + blockData.setStateType(BlockStateType.DROPPER.toString()); + } else if (blockState instanceof Hopper) { + Hopper hopper = (Hopper) blockState; + + for (int i = 0; i < hopper.getInventory().getSize(); i++) { + ItemStack is = hopper.getInventory().getItem(i); + + if (is != null && is.getType() != Material.AIR) { + blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); + } + } + + blockData.setStateType(BlockStateType.HOPPER.toString()); + } else if (blockState instanceof CommandBlock) { + CommandBlock commandBlock = (CommandBlock) blockState; + blockData.setCommand(commandBlock.getCommand()); + blockData.setCommandBlockName(commandBlock.getName()); + blockData.setStateType(BlockStateType.COMMANDBLOCK.toString()); + } else if (blockState instanceof CreatureSpawner) { + CreatureSpawner creatureSpawner = (CreatureSpawner) blockState; + + if (creatureSpawner.getSpawnedType() != null) { + blockData.setEntity(creatureSpawner.getSpawnedType().toString()); + } + + blockData.setDelay(creatureSpawner.getDelay()); + blockData.setStateType(BlockStateType.CREATURESPAWNER.toString()); + } else if (blockState instanceof Jukebox) { + Jukebox jukebox = (Jukebox) blockState; + + if (jukebox.getPlaying() != null) { + blockData.setPlaying(jukebox.getPlaying().toString()); + } + + blockData.setStateType(BlockStateType.JUKEBOX.toString()); + } else if (blockState instanceof Sign) { + Sign sign = (Sign) blockState; + + String[] signLines = sign.getLines(); + + if (signLines != null) { + List correctedSignLines = new ArrayList<>(); + + for (String signLineList : signLines) { + for (ChatColor chatColorList : ChatColor.values()) { + signLineList = signLineList.replace(chatColorList + "", + "&" + chatColorList.toString().substring(chatColorList.toString().length() - 1)); + } + + correctedSignLines.add(signLineList); + } + + signLines = correctedSignLines.toArray(new String[correctedSignLines.size()]); + } + + blockData.setSignLines(signLines); + blockData.setStateType(BlockStateType.SIGN.toString()); + } else if (blockState instanceof Skull) { + Skull skull = (Skull) blockState; + blockData.setSkullOwner(skull.getOwner()); + blockData.setSkullType(skull.getSkullType().toString()); + blockData.setRotateFace(skull.getRotation().toString()); + blockData.setStateType(BlockStateType.SKULL.toString()); + } else { + if (NMSVersion > 8) { + if (blockState instanceof EndGateway) { + EndGateway endGateway = (EndGateway) blockState; + blockData.setExactTeleport(endGateway.isExactTeleport()); + + Location location = endGateway.getExitLocation(); + blockData.setExitLocation(location.getX() + ":" + location.getY() + ":" + location.getZ() + ":" + + location.getWorld().getName()); + blockData.setStateType(BlockStateType.ENDGATEWAY.toString()); + } + + if (NMSVersion > 10) { + if (blockState instanceof ShulkerBox) { + ShulkerBox shulkerBox = (ShulkerBox) blockState; + + for (int i = 0; i < shulkerBox.getInventory().getSize(); i++) { + ItemStack is = shulkerBox.getInventory().getItem(i); + + if (is != null && is.getType() != Material.AIR) { + blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); + } + } + + blockData.setStateType(BlockStateType.SHULKERBOX.toString()); + } + } + } + } + + if (materialData instanceof Stairs) { + blockData.setFacing(((Stairs) materialData).getFacing().toString()); + blockData.setDataType(BlockDataType.STAIRS.toString()); + } else if (materialData instanceof org.bukkit.material.FlowerPot) { + if (NMSVersion >= 8 && NMSVersion <= 12) { + try { + World world = block.getWorld(); + + Class blockPositionClass = NMSUtil.getNMSClass("BlockPosition"); + + Object worldHandle = world.getClass().getMethod("getHandle").invoke(world); + Object blockPosition = blockPositionClass.getConstructor(int.class, int.class, int.class) + .newInstance(block.getX(), block.getY(), block.getZ()); + Object tileEntity = worldHandle.getClass().getMethod("getTileEntity", blockPositionClass) + .invoke(worldHandle, blockPosition); + + Field aField = tileEntity.getClass().getDeclaredField("a"); + aField.setAccessible(true); + + Object item = aField.get(tileEntity); + + if (item != null) { + Object itemStackNMS = NMSUtil.getNMSClass("ItemStack") + .getConstructor(NMSUtil.getNMSClass("Item")).newInstance(item); + + ItemStack itemStack = (ItemStack) NMSUtil.getCraftClass("inventory.CraftItemStack") + .getMethod("asBukkitCopy", itemStackNMS.getClass()).invoke(null, itemStackNMS); + + Field fField = tileEntity.getClass().getDeclaredField("f"); + fField.setAccessible(true); + + int data = (int) fField.get(tileEntity); + + blockData.setFlower(itemStack.getType().name() + ":" + data); + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + org.bukkit.material.FlowerPot flowerPot = (org.bukkit.material.FlowerPot) materialData; + + if (flowerPot.getContents() != null && flowerPot.getContents().getItemType() != Material.AIR) { + blockData.setFlower( + flowerPot.getContents().getItemType().toString() + ":" + flowerPot.getContents().getData()); + } + } + + blockData.setDataType(BlockDataType.FLOWERPOT.toString()); + } + + return blockData; + } + + public static void convertBlockDataToBlock(Block block, BlockData blockData) { + int NMSVersion = NMSUtil.getVersionNumber(); + + Material material = null; + + if (NMSVersion > 12 && blockData.getVersion() > 12 && blockData.getBlockData() != null) { + block.setBlockData(Bukkit.getServer().createBlockData(blockData.getBlockData())); + } else { + material = MaterialUtil.getMaterial(NMSVersion, blockData.getVersion(), + blockData.getMaterial(), block.getData()); + setBlockFast(block.getWorld(), block.getX(), block.getY(), block.getZ(), material, blockData.getData()); + } + + // TODO Create a class to support biome changes + // block.setBiome(Biome.valueOf(blockData.getBiome().toUpperCase())); + + BlockStateType blockTypeState = BlockStateType.valueOf(blockData.getStateType()); + + if (blockTypeState == BlockStateType.BANNER) { + Banner banner = (Banner) block.getState(); + banner.setBaseColor(DyeColor.valueOf(blockData.getBaseColor().toUpperCase())); + + for (String patternList : blockData.getPatterns()) { + String[] pattern = patternList.split(":"); + banner.addPattern(new Pattern(DyeColor.valueOf(pattern[1].toUpperCase()), + PatternType.valueOf(pattern[0].toUpperCase()))); + } + } else if (blockTypeState == BlockStateType.BEACON) { + Beacon beacon = (Beacon) block.getState(); + String[] potionEffect = blockData.getPotionEffect().split(":"); + if (!potionEffect[0].equals("null")) { + beacon.setPrimaryEffect(PotionEffectType.getByName(potionEffect[0].toUpperCase())); + } + + if (!potionEffect[1].equals("null")) { + beacon.setSecondaryEffect(PotionEffectType.getByName(potionEffect[1].toUpperCase())); + } + } else if (blockTypeState == BlockStateType.BREWINGSTAND) { + BrewingStand brewingStand = (BrewingStand) block.getState(); + brewingStand.setBrewingTime(blockData.getBrewingTime()); + brewingStand.setFuelLevel(blockData.getFuelLevel()); + } else if (blockTypeState == BlockStateType.COMMANDBLOCK) { + CommandBlock commandBlock = (CommandBlock) block.getState(); + commandBlock.setCommand(blockData.getCommand()); + commandBlock.setName(blockData.getCommandBlockName()); + } else if (blockTypeState == BlockStateType.CHEST) { + Chest chest = (Chest) block.getState(); + + for (Integer slotList : blockData.getInventory().keySet()) { + if (slotList < chest.getInventory().getSize()) { + ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); + chest.getInventory().setItem(slotList, is); + } + } + } else if (blockTypeState == BlockStateType.DISPENSER) { + Dispenser dispenser = (Dispenser) block.getState(); + + for (Integer slotList : blockData.getInventory().keySet()) { + if (slotList < dispenser.getInventory().getSize()) { + ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); + dispenser.getInventory().setItem(slotList, is); + } + } + } else if (blockTypeState == BlockStateType.DROPPER) { + Dropper dropper = (Dropper) block.getState(); + + for (Integer slotList : blockData.getInventory().keySet()) { + if (slotList < dropper.getInventory().getSize()) { + ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); + dropper.getInventory().setItem(slotList, is); + } + } + } else if (blockTypeState == BlockStateType.HOPPER) { + Hopper hopper = (Hopper) block.getState(); + + for (Integer slotList : blockData.getInventory().keySet()) { + if (slotList < hopper.getInventory().getSize()) { + ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); + hopper.getInventory().setItem(slotList, is); + } + } + } else if (blockTypeState == BlockStateType.CREATURESPAWNER) { + CreatureSpawner creatureSpawner = (CreatureSpawner) block.getState(); + + if (blockData.getEntity() != null) { + creatureSpawner.setSpawnedType(EntityType.valueOf(blockData.getEntity().toUpperCase())); + } + + creatureSpawner.setDelay(blockData.getDelay()); + } else if (blockTypeState == BlockStateType.FURNACE) { + Furnace furnace = (Furnace) block.getState(); + furnace.setBurnTime(blockData.getBurnTime()); + furnace.setCookTime(blockData.getCookTime()); + + for (Integer slotList : blockData.getInventory().keySet()) { + if (slotList < furnace.getInventory().getSize()) { + ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); + furnace.getInventory().setItem(slotList, is); + } + } + } else if (blockTypeState == BlockStateType.JUKEBOX) { + Jukebox jukebox = (Jukebox) block.getState(); + + if (blockData.getPlaying() != null) { + jukebox.setPlaying(Material.valueOf(blockData.getPlaying().toUpperCase())); + } + } else if (blockTypeState == BlockStateType.SIGN) { + Sign sign = (Sign) block.getState(); + + for (int i = 0; i < blockData.getSignLines().length; i++) { + sign.setLine(i, ChatColor.translateAlternateColorCodes('&', blockData.getSignLines()[i])); + } + } else if (blockTypeState == BlockStateType.SKULL) { + Skull skull = (Skull) block.getState(); + + skull.setRotation(BlockFace.valueOf(blockData.getRotateFace().toUpperCase())); + skull.setSkullType(SkullType.valueOf(blockData.getSkullType().toUpperCase())); + + if (NMSVersion > 9) { + skull.setOwningPlayer(Bukkit.getServer().getOfflinePlayer(blockData.getSkullOwner())); + } else { + skull.setOwner(blockData.getSkullOwner()); + } + } else { + if (NMSVersion > 8) { + if (blockTypeState == BlockStateType.ENDGATEWAY) { + EndGateway endGateway = (EndGateway) block.getState(); + endGateway.setExactTeleport(blockData.isExactTeleport()); + + String[] exitLocation = blockData.getExitLocation().split(":"); + World exitLocationWorld = Bukkit.getServer().getWorld(exitLocation[3]); + + double exitLocationX = Double.parseDouble(exitLocation[0]); + double exitLocationY = Double.parseDouble(exitLocation[1]); + double exitLocationZ = Double.parseDouble(exitLocation[2]); + + endGateway.setExitLocation( + new Location(exitLocationWorld, exitLocationX, exitLocationY, exitLocationZ)); + } + + if (NMSVersion > 9) { + if (NMSVersion > 10) { + if (blockTypeState == BlockStateType.SHULKERBOX) { + ShulkerBox shulkerBox = (ShulkerBox) block.getState(); + + for (Integer slotList : blockData.getInventory().keySet()) { + if (slotList < shulkerBox.getInventory().getSize()) { + ItemStack is = ItemStackUtil + .deserializeItemStack(blockData.getInventory().get(slotList)); + shulkerBox.getInventory().setItem(slotList, is); + } + } + } + } + } + } + } + + BlockDataType blockDataType = BlockDataType.valueOf(blockData.getDataType()); + + if (blockDataType == BlockDataType.STAIRS) { + Stairs stairs = (Stairs) block.getState().getData(); + stairs.setFacingDirection(BlockFace.valueOf(blockData.getFacing())); + block.getState().setData(stairs); + } else if (blockDataType == BlockDataType.FLOWERPOT) { + if (NMSVersion >= 8 && NMSVersion <= 12) { + if (block.getLocation().clone().subtract(0.0D, 1.0D, 0.0D).getBlock().getType() == Material.AIR) { + setBlockFast(block.getWorld(), block.getX(), block.getY() - 1, block.getZ(), Material.STONE, + (byte) 0); + } + + if (blockData.getFlower() != null && !blockData.getFlower().isEmpty()) { + try { + String[] flower = blockData.getFlower().split(":"); + int materialData = Integer.parseInt(flower[1]); + + material = MaterialUtil.getMaterial(NMSVersion, + blockData.getVersion(), flower[0].toUpperCase(), materialData); + + if (material != null) { + ItemStack is = new ItemStack(material, 1, (byte) materialData); + + World world = block.getWorld(); + + Class blockPositionClass = NMSUtil.getNMSClass("BlockPosition"); + + Object worldHandle = world.getClass().getMethod("getHandle").invoke(world); + Object blockPosition = blockPositionClass.getConstructor(int.class, int.class, int.class) + .newInstance(block.getX(), block.getY(), block.getZ()); + Object tileEntity = worldHandle.getClass().getMethod("getTileEntity", blockPositionClass) + .invoke(worldHandle, blockPosition); + Object itemStack = NMSUtil.getCraftClass("inventory.CraftItemStack") + .getMethod("asNMSCopy", is.getClass()).invoke(null, is); + Object item = itemStack.getClass().getMethod("getItem").invoke(itemStack); + Object data = itemStack.getClass().getMethod("getData").invoke(itemStack); + + Field aField = tileEntity.getClass().getDeclaredField("a"); + aField.setAccessible(true); + aField.set(tileEntity, item); + + Field fField = tileEntity.getClass().getDeclaredField("f"); + fField.setAccessible(true); + fField.set(tileEntity, data); + + tileEntity.getClass().getMethod("update").invoke(tileEntity); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } else { + if (blockData.getFlower() != null && !blockData.getFlower().isEmpty()) { + org.bukkit.material.FlowerPot flowerPot = (org.bukkit.material.FlowerPot) block.getState() + .getData(); + String[] flower = blockData.getFlower().split(":"); + material = null; + + if (blockData.getVersion() > 12) { + if (NMSVersion > 12) { + material = Material.valueOf(flower[0].toUpperCase()); + } + } else { + if (NMSVersion < 13) { + material = Material.valueOf(flower[0].toUpperCase()); + } + } + + if (material != null) { + flowerPot.setContents(new MaterialData(material, (byte) Integer.parseInt(flower[1]))); + } + + block.getState().setData(flowerPot); + } + } + } + + if (NMSVersion < 13) { + block.getState().update(); + } + + if (blockData.getMaterial().equals("DOUBLE_PLANT")) { + Block topBlock = block.getLocation().clone().add(0.0D, 1.0D, 0.0D).getBlock(); + Block bottomBlock = block.getLocation().clone().subtract(0.0D, 1.0D, 0.0D).getBlock(); + + if (bottomBlock.getType() == Material.AIR && !topBlock.getType().name().equals("DOUBLE_PLANT")) { + bottomBlock.setType(Materials.LEGACY_DOUBLE_PLANT.getPostMaterial()); + + if (NMSVersion < 13) { + try { + bottomBlock.getClass().getMethod("setData", byte.class).invoke(bottomBlock, (byte) 2); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + + public static List getNearbyBlocks(Location loc, int rx, int ry, int rz) { + List nearbyBlocks = new ArrayList<>(); + + for (int x = -(rx); x <= rx; x++) { + for (int y = -(ry); y <= ry; y++) { + for (int z = -(rz); z <= rz; z++) { + nearbyBlocks.add( + new Location(loc.getWorld(), loc.getX() + x, loc.getY() + y, loc.getZ() + z).getBlock()); + } + } + } + + return nearbyBlocks; + } + + private static Class IBlockDataClass = NMSUtil.getNMSClass("IBlockData"); + private static Class blocksClass = NMSUtil.getNMSClass("Blocks"); + + private static void setBlockFast(World world, int x, int y, int z, Material material, byte data) { + try { + Object worldHandle = world.getClass().getMethod("getHandle").invoke(world); + Object chunk = worldHandle.getClass().getMethod("getChunkAt", int.class, int.class).invoke(worldHandle, + x >> 4, z >> 4); + Object blockPosition = NMSUtil.getNMSClass("BlockPosition").getConstructor(int.class, int.class, int.class) + .newInstance(x & 0xF, y, z & 0xF); + + if (NMSUtil.getVersionNumber() > 12) { + Object block = blocksClass.getField(material.name()).get(null); + Object IBlockData = block.getClass().getMethod("getBlockData").invoke(block); + worldHandle.getClass().getMethod("setTypeAndData", blockPosition.getClass(), IBlockDataClass, int.class) + .invoke(worldHandle, blockPosition, IBlockData, 2); + + try { + chunk.getClass().getMethod("a", blockPosition.getClass(), IBlockDataClass, boolean.class) + .invoke(chunk, blockPosition, IBlockData, true); + } catch (Exception e) { + chunk.getClass().getMethod("setType", blockPosition.getClass(), IBlockDataClass, boolean.class) + .invoke(chunk, blockPosition, IBlockData, true); + } + } else { + Object IBlockData = NMSUtil.getNMSClass("Block").getMethod("getByCombinedId", int.class).invoke(null, + material.getId() + (data << 12)); + worldHandle.getClass().getMethod("setTypeAndData", blockPosition.getClass(), IBlockDataClass, int.class) + .invoke(worldHandle, blockPosition, IBlockData, 3); + chunk.getClass().getMethod("a", blockPosition.getClass(), IBlockDataClass).invoke(chunk, blockPosition, + IBlockData); + } + } catch (Exception e) { + Block block = world.getBlockAt(x, y, z); + block.getState().setRawData(data); + block.setType(material); + } + } } From 0546e5e964c126285c1cc50a9299ad3360cde67b Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 2 Oct 2019 01:47:05 -0600 Subject: [PATCH 30/45] 2.0.3 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0ff6eda3..4efaa9b7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "2.0.2" + version: "2.0.3" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle From a2f1422035ad837fe5fd28c5541b5840f8da3705 Mon Sep 17 00:00:00 2001 From: theone1000 Date: Mon, 7 Oct 2019 11:50:21 -0600 Subject: [PATCH 31/45] Fixed untracked files. --- .classpath | 155 ------------------ .project | 22 --- .../playerdata/PlayerDataManager.java | 6 +- .../songoda/skyblock/stackable/Stackable.java | 6 +- .../skyblock/stackable/StackableManager.java | 8 +- 5 files changed, 9 insertions(+), 188 deletions(-) delete mode 100644 .classpath delete mode 100644 .project diff --git a/.classpath b/.classpath deleted file mode 100644 index ac8dc245..00000000 --- a/.classpath +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index a7a77cf9..00000000 --- a/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - FabledSkyblock - - - - org.eclipse.jdt.core.javanature - org.eclipse.buildship.core.gradleprojectnature - - - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - - diff --git a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java index 5f28dbcd..73f1c7fb 100644 --- a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java +++ b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java @@ -118,11 +118,7 @@ public class PlayerDataManager { } public PlayerData getPlayerData(Player player) { - if (hasPlayerData(player)) { - return playerDataStorage.get(player.getUniqueId()); - } - - return null; + return playerDataStorage.get(player.getUniqueId()); } public boolean hasPlayerData(Player player) { diff --git a/src/main/java/com/songoda/skyblock/stackable/Stackable.java b/src/main/java/com/songoda/skyblock/stackable/Stackable.java index 81063f4c..8c9543fe 100644 --- a/src/main/java/com/songoda/skyblock/stackable/Stackable.java +++ b/src/main/java/com/songoda/skyblock/stackable/Stackable.java @@ -25,7 +25,7 @@ public class Stackable { private Location location; private Material material; - private Integer size = 2; + private int size = 2; private ArmorStand display; public Stackable(Location location, Material material) { @@ -66,11 +66,11 @@ public class Stackable { this.save(); } - public Integer getSize() { + public int getSize() { return this.size; } - public void setSize(Integer size) { + public void setSize(int size) { this.size = size; this.updateDisplay(); this.save(); diff --git a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java index 86d72d48..c42285df 100644 --- a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java +++ b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java @@ -48,9 +48,11 @@ public class StackableManager { FileManager.Config config = fileManager.getConfig(new File(configFile, file.getName())); FileConfiguration configLoad = config.getFileConfiguration(); ConfigurationSection cs = configLoad.getConfigurationSection("Stackables"); - if (cs == null || cs.getKeys(false) == null) continue; - for (String uuid : cs.getKeys(false)) { - ConfigurationSection section = configLoad.getConfigurationSection("Stackables." + uuid); + if (cs == null) continue; + Set keys = cs.getKeys(false); + if (keys == null) continue; + for (String uuid : keys) { + ConfigurationSection section = cs.getConfigurationSection(uuid); Location location = (Location) section.get("Location"); org.bukkit.Material material = org.bukkit.Material.valueOf(section.getString("Material")); int size = section.getInt("Size"); From 6fd2eca406ec163726fe831e24c2bb03b25a0567 Mon Sep 17 00:00:00 2001 From: theone1000 Date: Mon, 7 Oct 2019 11:57:52 -0600 Subject: [PATCH 32/45] Updated .gitignore to ignore eclipse specific files (.classpath and .project) --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index b659edc0..3703d73a 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,10 @@ hs_err_pid* /.idea/ **/build/ /bin/ + +### Eclipse Patch ### +# Eclipse Core +.project + +# JDT-specific (Eclipse Java Development Tools) +.classpath \ No newline at end of file From 26035dfc8fd5bf9d9a3b43f539f6bde34eeb31ab Mon Sep 17 00:00:00 2001 From: theone1000 Date: Mon, 7 Oct 2019 12:10:38 -0600 Subject: [PATCH 33/45] Changed the onDisable() method in PlayerDataManager to use the more appropriate values() method. --- .../com/songoda/skyblock/playerdata/PlayerDataManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java index 73f1c7fb..09b3d42a 100644 --- a/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java +++ b/src/main/java/com/songoda/skyblock/playerdata/PlayerDataManager.java @@ -47,8 +47,8 @@ public class PlayerDataManager { } public void onDisable() { - for (UUID playerDataStorageList : playerDataStorage.keySet()) { - playerDataStorage.get(playerDataStorageList).save(); + for (PlayerData data : playerDataStorage.values()) { + data.save(); } } From a3ee51d1d84b40982ceee1be490d92bac812e412 Mon Sep 17 00:00:00 2001 From: theone1000 Date: Mon, 7 Oct 2019 21:08:42 -0600 Subject: [PATCH 34/45] Added a new command, a color string method to StringUtil, and a method to check if a block can be stacked in StackableManager. --- .gitlab-ci.yml | 2 +- .../skyblock/command/CommandManager.java | 3 +- .../commands/admin/StackableCommand.java | 117 ++++++++++++++++++ .../skyblock/stackable/StackableManager.java | 4 + .../songoda/skyblock/utils/StringUtil.java | 6 + src/main/resources/language.yml | 11 ++ 6 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4efaa9b7..dfdb98d5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "2.0.3" + version: "2.0.4" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle diff --git a/src/main/java/com/songoda/skyblock/command/CommandManager.java b/src/main/java/com/songoda/skyblock/command/CommandManager.java index 0ec84a08..de086955 100644 --- a/src/main/java/com/songoda/skyblock/command/CommandManager.java +++ b/src/main/java/com/songoda/skyblock/command/CommandManager.java @@ -110,7 +110,8 @@ public class CommandManager implements CommandExecutor, TabCompleter { new com.songoda.skyblock.command.commands.admin.SetSpawnCommand(), new com.songoda.skyblock.command.commands.admin.SettingsCommand(), new StructureCommand(), - new com.songoda.skyblock.command.commands.admin.UpgradeCommand() + new com.songoda.skyblock.command.commands.admin.UpgradeCommand(), + new StackableCommand() ); } diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java new file mode 100644 index 00000000..4c1d270c --- /dev/null +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java @@ -0,0 +1,117 @@ +package com.songoda.skyblock.command.commands.admin; + +import java.io.File; +import java.util.Set; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; + +import com.songoda.skyblock.command.SubCommand; +import com.songoda.skyblock.message.MessageManager; +import com.songoda.skyblock.stackable.Stackable; +import com.songoda.skyblock.stackable.StackableManager; +import com.songoda.skyblock.utils.StringUtil; + +public class StackableCommand extends SubCommand { + + @Override + public void onCommandByPlayer(Player player, String[] args) { + final MessageManager messageManager = skyblock.getMessageManager(); + + if (args.length == 0) { + player.sendMessage(StringUtil.color("&e/island admin stackable setsize &7- &f&osets the target block's stack size if applicable")); + return; + } + + final FileConfiguration messageConfig = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration(); + + if (args[0].equalsIgnoreCase("setsize")) { + + if (args.length == 1) { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Setsize.No-Arguments")); + return; + } + + int amount = 0; + + try { + amount = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + messageManager.sendMessage(player, (messageConfig.getString("Command.Island.Admin.Stackable.Setsize.Invalid-Number")).replace("%number%", args[1])); + return; + } + + final Block block = player.getTargetBlock((Set) null, 6); + + if (block == null) { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Target.None")); + return; + } + + final StackableManager stackableManager = skyblock.getStackableManager(); + + if (!stackableManager.isStackableMaterial(block.getType())) { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Target.Unstackable")); + return; + } + + final Location loc = block.getLocation(); + Stackable stack = stackableManager.getStack(loc, block.getType()); + + if (amount <= 1) { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Target.Remove-Stack")); + if (stack != null) stackableManager.removeStack(stack); + return; + } + + if (stack == null) { + stack = new Stackable(loc, block.getType()); + stackableManager.addStack(stack); + } + + final int oldSize = stack.getSize(); + + stack.setSize(amount); + + String input = messageConfig.getString("Command.Island.Admin.Stackable.Setsize.Success"); + + input = input.replace("%old_size%", Integer.toString(oldSize)); + input = input.replace("%new_size%", Integer.toString(amount)); + + messageManager.sendMessage(player, input); + } else { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Argument.Unrecognised.Message")); + } + + } + + @Override + public void onCommandByConsole(ConsoleCommandSender sender, String[] args) { + sender.sendMessage("SkyBlock | Error: You must be a player to perform that command."); + } + + @Override + public String getName() { + return "stackable"; + } + + @Override + public String getInfoMessagePath() { + return "Command.Island.Admin.Stackable.Info.Message"; + } + + @Override + public String[] getAliases() { + return new String[] { "stackables" }; + } + + @Override + public String[] getArguments() { + return new String[] { "setsize" }; + } + +} diff --git a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java index c42285df..9418526a 100644 --- a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java +++ b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java @@ -69,6 +69,10 @@ public class StackableManager { public List getStackableMaterials() { return Collections.unmodifiableList(stackableMaterials); } + + public boolean isStackableMaterial(Material material) { + return stackableMaterials.contains(material); + } public Map getStacks() { return Collections.unmodifiableMap(stacks); diff --git a/src/main/java/com/songoda/skyblock/utils/StringUtil.java b/src/main/java/com/songoda/skyblock/utils/StringUtil.java index 0e9f4d8e..6590f449 100644 --- a/src/main/java/com/songoda/skyblock/utils/StringUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/StringUtil.java @@ -3,6 +3,8 @@ package com.songoda.skyblock.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.md_5.bungee.api.ChatColor; + public final class StringUtil { public static String capatilizeUppercaseLetters(String string) { @@ -19,4 +21,8 @@ public final class StringUtil { return stringBuilder.toString(); } + + public static String color(String input) { + return input == null ? null : ChatColor.translateAlternateColorCodes('&', input); + } } diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index bf2a9506..ea4a8eb1 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -142,6 +142,17 @@ Command: Message: '&f&oReload all loaded files.' Reloaded: Message: '&bSkyBlock &8| &aInfo&8: &eAll loaded files have been reloaded.' + Stackable: + Info: + Message: '&f&oManage stackables' + Target: + None: '&bSkyBlock &8| &cError&8: &eYou must be looking at a block.' + Unstackable: '&bSkyBlock &8| &cError&8: &eUnable to target unstackable block.' + Remove-Stack: '&bSkyBlock &8| &aInfo&8: &eSuccessfully removed stack if one was present.' + Setsize: + No-Arguments: '&bSkyBlock &8| &cError&8: &ePlease input a number that will become the new stack size.' + Invalid-Number: '&bSkyBlock &8| &cError&8: &eFailed to parse a number from %number%' + Success: '&bSkyBlock &8| &aInfo&8: &eSuccessfully changed the target block''s stack size from %old_size% to %new_size%' RemoveUpgrade: Invalid: Message: '&bSkyBlock &8| &cError&8: &eInvalid: /island admin removeupgrade ' From 4dfe31db16571df82434d623164c94d25a217d9c Mon Sep 17 00:00:00 2001 From: theone1000 Date: Mon, 7 Oct 2019 21:26:59 -0600 Subject: [PATCH 35/45] Changed stackableMaterials field to an EnumSet for better performance. Likewise, the getStackableMaterials() method had to have it's return type changed. --- src/main/java/com/songoda/skyblock/listeners/Interact.java | 2 +- .../com/songoda/skyblock/stackable/StackableManager.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/listeners/Interact.java b/src/main/java/com/songoda/skyblock/listeners/Interact.java index 2aa4395c..eac79954 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Interact.java +++ b/src/main/java/com/songoda/skyblock/listeners/Interact.java @@ -141,7 +141,7 @@ public class Interact implements Listener { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (stackableManager != null - && stackableManager.getStackableMaterials().contains(event.getMaterial()) + && stackableManager.isStackableMaterial(event.getMaterial()) && event.getClickedBlock().getType() == event.getMaterial() && !player.isSneaking() && islandManager.hasPermission(player, block.getLocation(), "Place") && (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Stackable.RequirePermission") || player.hasPermission("fabledskyblock.stackable"))) { diff --git a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java index 9418526a..4f4bb160 100644 --- a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java +++ b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java @@ -15,7 +15,7 @@ public class StackableManager { //ToDO: Should pobably be a GUI for this private final SkyBlock skyblock; - private List stackableMaterials = new ArrayList<>(); + private Set stackableMaterials = EnumSet.noneOf(Material.class); private Map stacks = new HashMap<>(); public StackableManager(SkyBlock skyblock) { @@ -66,8 +66,8 @@ public class StackableManager { stackableMaterials.clear(); } - public List getStackableMaterials() { - return Collections.unmodifiableList(stackableMaterials); + public Set getStackableMaterials() { + return Collections.unmodifiableSet(stackableMaterials); } public boolean isStackableMaterial(Material material) { From f5fdcf173ced505bfe0f65458cbbeeed5f5c4783 Mon Sep 17 00:00:00 2001 From: theone1000 Date: Mon, 7 Oct 2019 21:50:23 -0600 Subject: [PATCH 36/45] Made oldSize more accurate. --- .../skyblock/command/commands/admin/StackableCommand.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java index 4c1d270c..ff24df1b 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java @@ -68,13 +68,16 @@ public class StackableCommand extends SubCommand { return; } + final int oldSize; + if (stack == null) { stack = new Stackable(loc, block.getType()); stackableManager.addStack(stack); + oldSize = 0; + } else { + oldSize = stack.getSize(); } - final int oldSize = stack.getSize(); - stack.setSize(amount); String input = messageConfig.getString("Command.Island.Admin.Stackable.Setsize.Success"); From e5222c6d24b6010b26c2a37cd85975b3508457cc Mon Sep 17 00:00:00 2001 From: Darkmans39 Date: Tue, 8 Oct 2019 03:57:22 +0000 Subject: [PATCH 37/45] Added a new command, a color string method to StringUtil, and a method to check if a block can be stacked in StackableManager. --- .gitlab-ci.yml | 2 +- .../skyblock/command/CommandManager.java | 3 +- .../commands/admin/StackableCommand.java | 120 ++++++++++++++++++ .../songoda/skyblock/listeners/Interact.java | 2 +- .../skyblock/stackable/StackableManager.java | 10 +- .../songoda/skyblock/utils/StringUtil.java | 6 + src/main/resources/language.yml | 11 ++ 7 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4efaa9b7..dfdb98d5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "2.0.3" + version: "2.0.4" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle diff --git a/src/main/java/com/songoda/skyblock/command/CommandManager.java b/src/main/java/com/songoda/skyblock/command/CommandManager.java index 0ec84a08..de086955 100644 --- a/src/main/java/com/songoda/skyblock/command/CommandManager.java +++ b/src/main/java/com/songoda/skyblock/command/CommandManager.java @@ -110,7 +110,8 @@ public class CommandManager implements CommandExecutor, TabCompleter { new com.songoda.skyblock.command.commands.admin.SetSpawnCommand(), new com.songoda.skyblock.command.commands.admin.SettingsCommand(), new StructureCommand(), - new com.songoda.skyblock.command.commands.admin.UpgradeCommand() + new com.songoda.skyblock.command.commands.admin.UpgradeCommand(), + new StackableCommand() ); } diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java new file mode 100644 index 00000000..ff24df1b --- /dev/null +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/StackableCommand.java @@ -0,0 +1,120 @@ +package com.songoda.skyblock.command.commands.admin; + +import java.io.File; +import java.util.Set; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; + +import com.songoda.skyblock.command.SubCommand; +import com.songoda.skyblock.message.MessageManager; +import com.songoda.skyblock.stackable.Stackable; +import com.songoda.skyblock.stackable.StackableManager; +import com.songoda.skyblock.utils.StringUtil; + +public class StackableCommand extends SubCommand { + + @Override + public void onCommandByPlayer(Player player, String[] args) { + final MessageManager messageManager = skyblock.getMessageManager(); + + if (args.length == 0) { + player.sendMessage(StringUtil.color("&e/island admin stackable setsize &7- &f&osets the target block's stack size if applicable")); + return; + } + + final FileConfiguration messageConfig = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration(); + + if (args[0].equalsIgnoreCase("setsize")) { + + if (args.length == 1) { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Setsize.No-Arguments")); + return; + } + + int amount = 0; + + try { + amount = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + messageManager.sendMessage(player, (messageConfig.getString("Command.Island.Admin.Stackable.Setsize.Invalid-Number")).replace("%number%", args[1])); + return; + } + + final Block block = player.getTargetBlock((Set) null, 6); + + if (block == null) { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Target.None")); + return; + } + + final StackableManager stackableManager = skyblock.getStackableManager(); + + if (!stackableManager.isStackableMaterial(block.getType())) { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Target.Unstackable")); + return; + } + + final Location loc = block.getLocation(); + Stackable stack = stackableManager.getStack(loc, block.getType()); + + if (amount <= 1) { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Admin.Stackable.Target.Remove-Stack")); + if (stack != null) stackableManager.removeStack(stack); + return; + } + + final int oldSize; + + if (stack == null) { + stack = new Stackable(loc, block.getType()); + stackableManager.addStack(stack); + oldSize = 0; + } else { + oldSize = stack.getSize(); + } + + stack.setSize(amount); + + String input = messageConfig.getString("Command.Island.Admin.Stackable.Setsize.Success"); + + input = input.replace("%old_size%", Integer.toString(oldSize)); + input = input.replace("%new_size%", Integer.toString(amount)); + + messageManager.sendMessage(player, input); + } else { + messageManager.sendMessage(player, messageConfig.getString("Command.Island.Argument.Unrecognised.Message")); + } + + } + + @Override + public void onCommandByConsole(ConsoleCommandSender sender, String[] args) { + sender.sendMessage("SkyBlock | Error: You must be a player to perform that command."); + } + + @Override + public String getName() { + return "stackable"; + } + + @Override + public String getInfoMessagePath() { + return "Command.Island.Admin.Stackable.Info.Message"; + } + + @Override + public String[] getAliases() { + return new String[] { "stackables" }; + } + + @Override + public String[] getArguments() { + return new String[] { "setsize" }; + } + +} diff --git a/src/main/java/com/songoda/skyblock/listeners/Interact.java b/src/main/java/com/songoda/skyblock/listeners/Interact.java index 2aa4395c..eac79954 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Interact.java +++ b/src/main/java/com/songoda/skyblock/listeners/Interact.java @@ -141,7 +141,7 @@ public class Interact implements Listener { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (stackableManager != null - && stackableManager.getStackableMaterials().contains(event.getMaterial()) + && stackableManager.isStackableMaterial(event.getMaterial()) && event.getClickedBlock().getType() == event.getMaterial() && !player.isSneaking() && islandManager.hasPermission(player, block.getLocation(), "Place") && (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Stackable.RequirePermission") || player.hasPermission("fabledskyblock.stackable"))) { diff --git a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java index c42285df..4f4bb160 100644 --- a/src/main/java/com/songoda/skyblock/stackable/StackableManager.java +++ b/src/main/java/com/songoda/skyblock/stackable/StackableManager.java @@ -15,7 +15,7 @@ public class StackableManager { //ToDO: Should pobably be a GUI for this private final SkyBlock skyblock; - private List stackableMaterials = new ArrayList<>(); + private Set stackableMaterials = EnumSet.noneOf(Material.class); private Map stacks = new HashMap<>(); public StackableManager(SkyBlock skyblock) { @@ -66,8 +66,12 @@ public class StackableManager { stackableMaterials.clear(); } - public List getStackableMaterials() { - return Collections.unmodifiableList(stackableMaterials); + public Set getStackableMaterials() { + return Collections.unmodifiableSet(stackableMaterials); + } + + public boolean isStackableMaterial(Material material) { + return stackableMaterials.contains(material); } public Map getStacks() { diff --git a/src/main/java/com/songoda/skyblock/utils/StringUtil.java b/src/main/java/com/songoda/skyblock/utils/StringUtil.java index 0e9f4d8e..6590f449 100644 --- a/src/main/java/com/songoda/skyblock/utils/StringUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/StringUtil.java @@ -3,6 +3,8 @@ package com.songoda.skyblock.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.md_5.bungee.api.ChatColor; + public final class StringUtil { public static String capatilizeUppercaseLetters(String string) { @@ -19,4 +21,8 @@ public final class StringUtil { return stringBuilder.toString(); } + + public static String color(String input) { + return input == null ? null : ChatColor.translateAlternateColorCodes('&', input); + } } diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index bf2a9506..ea4a8eb1 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -142,6 +142,17 @@ Command: Message: '&f&oReload all loaded files.' Reloaded: Message: '&bSkyBlock &8| &aInfo&8: &eAll loaded files have been reloaded.' + Stackable: + Info: + Message: '&f&oManage stackables' + Target: + None: '&bSkyBlock &8| &cError&8: &eYou must be looking at a block.' + Unstackable: '&bSkyBlock &8| &cError&8: &eUnable to target unstackable block.' + Remove-Stack: '&bSkyBlock &8| &aInfo&8: &eSuccessfully removed stack if one was present.' + Setsize: + No-Arguments: '&bSkyBlock &8| &cError&8: &ePlease input a number that will become the new stack size.' + Invalid-Number: '&bSkyBlock &8| &cError&8: &eFailed to parse a number from %number%' + Success: '&bSkyBlock &8| &aInfo&8: &eSuccessfully changed the target block''s stack size from %old_size% to %new_size%' RemoveUpgrade: Invalid: Message: '&bSkyBlock &8| &cError&8: &eInvalid: /island admin removeupgrade ' From 173726bb9f2e5c0ab922a171c727af85203cc9d4 Mon Sep 17 00:00:00 2001 From: Brianna Date: Fri, 11 Oct 2019 17:01:32 -0400 Subject: [PATCH 38/45] Updated EpicAnchors compatibility. --- build.gradle | 2 +- src/main/java/com/songoda/skyblock/listeners/Interact.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 71737dc2..27f4c44d 100644 --- a/build.gradle +++ b/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation (group: 'com.songoda', name: 'epicspawners', version: '6-pre4') // EpicAnchors - implementation (group: 'com.songoda', name: 'epicanchors', version: '1.2.5') + implementation (group: 'com.songoda', name: 'EpicAnchors', version: '1.4.2') // UltimateStacker implementation (group: 'com.songoda', name: 'ultimatestacker', version: '1.3.1') diff --git a/src/main/java/com/songoda/skyblock/listeners/Interact.java b/src/main/java/com/songoda/skyblock/listeners/Interact.java index eac79954..cb231173 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Interact.java +++ b/src/main/java/com/songoda/skyblock/listeners/Interact.java @@ -518,7 +518,7 @@ public class Interact implements Listener { return; if (Bukkit.getPluginManager().isPluginEnabled("EpicAnchors")) { - if (com.songoda.epicanchors.EpicAnchorsPlugin.getInstance().getAnchorManager().getAnchor(block.getLocation()) != null) { + if (com.songoda.epicanchors.EpicAnchors.getInstance().getAnchorManager().getAnchor(block.getLocation()) != null) { event.setCancelled(true); return; } From 46308e328fc20fb41cce616c13cef7b7f63192d3 Mon Sep 17 00:00:00 2001 From: theone1000 Date: Sun, 13 Oct 2019 19:10:58 -0600 Subject: [PATCH 39/45] update --- .../commands/admin/UpgradeCommand.java | 2 +- .../songoda/skyblock/config/FileManager.java | 114 +++--- .../skyblock/island/IslandManager.java | 10 +- .../com/songoda/skyblock/listeners/Block.java | 4 +- .../com/songoda/skyblock/listeners/Grow.java | 8 +- .../java/com/songoda/skyblock/menus/Coop.java | 11 +- .../com/songoda/skyblock/menus/Upgrade.java | 1 + .../utils/structure/StructureUtil.java | 334 ++++++++++-------- .../resources/structures/default.structure | Bin 2656 -> 153500 bytes 9 files changed, 263 insertions(+), 221 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java index d920abd5..72b657f0 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/UpgradeCommand.java @@ -25,7 +25,7 @@ public class UpgradeCommand extends SubCommand { Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); FileConfiguration configLoad = config.getFileConfiguration(); - + if (skyblock.getUpgradeManager() == null) { messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.Upgrade.Disabled.Message")); soundManager.playSound(player, Sounds.ANVIL_LAND.bukkitSound(), 1.0F, 1.0F); diff --git a/src/main/java/com/songoda/skyblock/config/FileManager.java b/src/main/java/com/songoda/skyblock/config/FileManager.java index 5729aac4..0ddf9abe 100644 --- a/src/main/java/com/songoda/skyblock/config/FileManager.java +++ b/src/main/java/com/songoda/skyblock/config/FileManager.java @@ -5,15 +5,16 @@ import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.island.IslandWorld; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import java.io.*; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.logging.Level; public class FileManager { @@ -31,13 +32,18 @@ public class FileManager { if (!skyblock.getDataFolder().exists()) { skyblock.getDataFolder().mkdir(); } + + File structureDirectory = new File(skyblock.getDataFolder().toString() + "/structures"); - if (!new File(skyblock.getDataFolder().toString() + "/structures").exists()) { - new File(skyblock.getDataFolder().toString() + "/structures").mkdir(); + if (!structureDirectory.exists()) { + structureDirectory.mkdir(); } + + // Will remain null unless WorldEdit is present. + File schematicsDirectory = null; - if (Bukkit.getPluginManager().isPluginEnabled("WorldEdit") && !new File(skyblock.getDataFolder().toString() + "/schematics").exists()) { - new File(skyblock.getDataFolder().toString() + "/schematics").mkdir(); + if (Bukkit.getPluginManager().isPluginEnabled("WorldEdit") && !(schematicsDirectory = new File(skyblock.getDataFolder().toString() + "/schematics")).exists()) { + schematicsDirectory.mkdir(); } Map configFiles = new LinkedHashMap<>(); @@ -53,19 +59,40 @@ public class FileManager { configFiles.put("structures.yml", new File(skyblock.getDataFolder(), "structures.yml")); configFiles.put("structures/default.structure", new File(skyblock.getDataFolder().toString() + "/structures", "default.structure")); + + File oldStructureFile = new File(skyblock.getDataFolder().toString() + "/structures", "default.structure"); + oldStructureFile.delete(); - for (String configFileList : configFiles.keySet()) { - File configFile = configFiles.get(configFileList); + for (Entry configEntry : configFiles.entrySet()) { + + String fileName = configEntry.getKey(); + File configFile = configEntry.getValue(); + + if (fileName.equals("structures/default.structure")) { + configFile.delete(); + try { + configFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + try (InputStream is = skyblock.getResource(fileName); + OutputStream os = new FileOutputStream(configFile)) { + ByteStreams.copy(is, os); + } catch (IOException e) { + e.printStackTrace(); + } + continue; + } if (configFile.exists()) { - if (configFileList.equals("config.yml") || configFileList.equals("language.yml") - || configFileList.equals("settings.yml")) { + if (fileName.equals("config.yml") || fileName.equals("language.yml") + || fileName.equals("settings.yml")) { FileChecker fileChecker; - if (configFileList.equals("config.yml")) { - fileChecker = new FileChecker(skyblock, this, configFileList, true); + if (fileName.equals("config.yml")) { + fileChecker = new FileChecker(skyblock, this, fileName, true); } else { - fileChecker = new FileChecker(skyblock, this, configFileList, false); + fileChecker = new FileChecker(skyblock, this, fileName, false); } fileChecker.loadSections(); @@ -75,13 +102,13 @@ public class FileManager { } else { try { configFile.createNewFile(); - try (InputStream is = skyblock.getResource(configFileList); + try (InputStream is = skyblock.getResource(fileName); OutputStream os = new FileOutputStream(configFile)) { ByteStreams.copy(is, os); } - if (configFileList.equals("worlds.yml")) { - File mainConfigFile = new File(skyblock.getDataFolder(), "config.yml"); + if (fileName.equals("worlds.yml")) { + File mainConfigFile = configFiles.get("config.yml"); if (isFileExist(mainConfigFile)) { Config config = new Config(this, configFile); @@ -116,54 +143,46 @@ public class FileManager { } public void setLocation(Config config, String path, Location location, boolean direction) { - File configFile = config.getFile(); - FileConfiguration configLoad = config.getFileConfiguration(); - configLoad.set(path + ".world", location.getWorld().getName()); - configLoad.set(path + ".x", Double.valueOf(location.getX())); - configLoad.set(path + ".y", Double.valueOf(location.getY())); - configLoad.set(path + ".z", Double.valueOf(location.getZ())); + final ConfigurationSection section = config.getFileConfiguration().createSection(path); + + section.set("world", location.getWorld().getName()); + section.set("x", Double.valueOf(location.getX())); + section.set("y", Double.valueOf(location.getY())); + section.set("z", Double.valueOf(location.getZ())); if (direction) { - configLoad.set(path + ".yaw", Float.valueOf(location.getYaw())); - configLoad.set(path + ".pitch", Float.valueOf(location.getPitch())); + section.set("yaw", Float.valueOf(location.getYaw())); + section.set("pitch", Float.valueOf(location.getPitch())); } try { - configLoad.save(configFile); + config.getFileConfiguration().save(config.getFile()); } catch (IOException ex) { ex.printStackTrace(); } } public Location getLocation(Config config, String path, boolean direction) { - Location location = null; - FileConfiguration configLoad = config.getFileConfiguration(); + ConfigurationSection section = config.getFileConfiguration().getConfigurationSection(path); - if (configLoad.contains(path)) { - String world = configLoad.getString(path + ".world"); + if (section == null) return null; - double x = configLoad.getDouble(path + ".x"); - double y = configLoad.getDouble(path + ".y"); - double z = configLoad.getDouble(path + ".z"); - double yaw = 0.0D; - double pitch = 0.0D; + String world = section.getString("world"); + double x = section.getDouble("x"); + double y = section.getDouble("y"); + double z = section.getDouble("z"); - if (configLoad.contains(path + ".yaw")) { - yaw = configLoad.getDouble(path + ".yaw"); - pitch = configLoad.getDouble(path + ".pitch"); - } + double yaw = 0.0D; + double pitch = 0.0D; - location = new org.bukkit.Location(Bukkit.getWorld(world), x, y, z); - - if (direction) { - location.setYaw((float) yaw); - location.setPitch((float) pitch); - } + if (direction) { + yaw = section.getDouble("yaw"); + pitch = section.getDouble("pitch"); } - return location; + return new org.bukkit.Location(Bukkit.getWorld(world), x, y, z, (short) yaw, (short) pitch); } public boolean isFileExist(File configPath) { @@ -181,9 +200,10 @@ public class FileManager { } public Config getConfig(File configPath) { - if (loadedConfigs.containsKey(configPath.getPath())) { - return loadedConfigs.get(configPath.getPath()); - } + + Config cached = loadedConfigs.get(configPath.getPath()); + + if (cached != null) return cached; Config config = new Config(this, configPath); loadedConfigs.put(configPath.getPath(), config); diff --git a/src/main/java/com/songoda/skyblock/island/IslandManager.java b/src/main/java/com/songoda/skyblock/island/IslandManager.java index 36d6c187..89765bc8 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandManager.java +++ b/src/main/java/com/songoda/skyblock/island/IslandManager.java @@ -1276,7 +1276,7 @@ public class IslandManager { FileConfiguration configLoad = config.getFileConfiguration(); boolean coopPlayers = island.getSetting(IslandRole.Operator, "CoopPlayers").getStatus(); - + for (Player all : Bukkit.getOnlinePlayers()) { if (uuid != null && all.getUniqueId().equals(uuid)) { continue; @@ -1367,9 +1367,7 @@ public class IslandManager { public List getCoopIslands(Player player) { List islands = new ArrayList<>(); - for (UUID islandList : getIslands().keySet()) { - Island island = getIslands().get(islandList); - + for (Island island : getIslands().values()) { if (island.getCoopPlayers().containsKey(player.getUniqueId())) { islands.add(island); } @@ -1379,9 +1377,7 @@ public class IslandManager { } public Island getIslandAtLocation(org.bukkit.Location location) { - for (UUID islandList : getIslands().keySet()) { - Island island = getIslands().get(islandList); - + for (Island island : getIslands().values()) { if (isLocationAtIsland(island, location)) { return island; } diff --git a/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java index 9919e0ed..0b19c20f 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -99,7 +99,7 @@ public class Block implements Listener { int droppedAmount = 0; if (event.getPlayer().isSneaking()) { - Location dropLoc = event.getBlock().getLocation().clone().add(0.5, 0.5, 0.5); + Location dropLoc = event.getBlock().getLocation().add(0.5, 0.5, 0.5); int count = stackable.getSize(); droppedAmount = count; while (count > 64) { @@ -110,7 +110,7 @@ public class Block implements Listener { block.setType(Material.AIR); stackable.setSize(0); } else { - block.getWorld().dropItemNaturally(block.getLocation().clone().add(.5, 1, .5), new ItemStack(material, 1, data)); + block.getWorld().dropItemNaturally(block.getLocation().add(.5, 1, .5), new ItemStack(material, 1, data)); stackable.takeOne(); droppedAmount = 1; } diff --git a/src/main/java/com/songoda/skyblock/listeners/Grow.java b/src/main/java/com/songoda/skyblock/listeners/Grow.java index c531e39f..22bbc4c9 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Grow.java +++ b/src/main/java/com/songoda/skyblock/listeners/Grow.java @@ -2,6 +2,7 @@ package com.songoda.skyblock.listeners; import java.io.File; import java.lang.reflect.InvocationTargetException; +import java.util.Iterator; import java.util.List; import org.bukkit.Material; @@ -46,19 +47,20 @@ public class Grow implements Listener { IslandManager islandManager = skyblock.getIslandManager(); Island origin = islandManager.getIslandAtLocation(event.getLocation()); - for (BlockState state : event.getBlocks()) { + for (Iterator it = event.getBlocks().iterator(); it.hasNext();) { + BlockState state = it.next(); Island growingTo = islandManager.getIslandAtLocation(state.getLocation()); // This block is ok to continue as it's not related to Skyblock islands. if (origin == null && growingTo == null) continue; // A block from the structure is outside/inside that it's not suppose to. if (origin == null || growingTo == null) { - event.getBlocks().remove(state); + it.remove(); continue; } // The structure is growing from one island to another. if (!origin.getIslandUUID().equals(growingTo.getIslandUUID())) { - event.getBlocks().remove(state); + it.remove(); continue; } } diff --git a/src/main/java/com/songoda/skyblock/menus/Coop.java b/src/main/java/com/songoda/skyblock/menus/Coop.java index 1f0cf999..60da1401 100644 --- a/src/main/java/com/songoda/skyblock/menus/Coop.java +++ b/src/main/java/com/songoda/skyblock/menus/Coop.java @@ -162,7 +162,13 @@ public class Coop { if ((island.hasRole(IslandRole.Operator, player.getUniqueId()) && island.getSetting(IslandRole.Operator, "CoopPlayers").getStatus()) || island.hasRole(IslandRole.Owner, player.getUniqueId())) { + String playerName = ChatColor.stripColor(is.getItemMeta().getDisplayName()); + + int space = playerName.indexOf(" "); + + if(space != -1) playerName = playerName.substring(0, space); + Bukkit.getServer().dispatchCommand(player, "island coop " + playerName); Bukkit.getServer().getScheduler().runTaskLater(skyblock, @@ -184,10 +190,7 @@ public class Coop { Island island = islandManager.getIsland(player); Map coopPlayers = island.getCoopPlayers(); - for (UUID uuid : coopPlayers.keySet()) - if (!Bukkit.getOfflinePlayer(uuid).hasPlayedBefore()) - coopPlayers.remove(uuid); - + int playerMenuPage = playerData.getPage(), nextEndIndex = coopPlayers.size() - playerMenuPage * 36; nInv.addItem(nInv.createItem(Materials.OAK_FENCE_GATE.parseItem(), diff --git a/src/main/java/com/songoda/skyblock/menus/Upgrade.java b/src/main/java/com/songoda/skyblock/menus/Upgrade.java index a12c01f9..8fda10de 100644 --- a/src/main/java/com/songoda/skyblock/menus/Upgrade.java +++ b/src/main/java/com/songoda/skyblock/menus/Upgrade.java @@ -379,6 +379,7 @@ public class Upgrade { economyManager.withdraw(player, upgrade.getCost()); island.setSize(upgrade.getValue()); + islandManager.updateBorder(island); Bukkit.getServer().getPluginManager().callEvent(new IslandUpgradeEvent( island.getAPIWrapper(), player, APIUtil.fromImplementation( diff --git a/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java index d1daaf8a..eac82b58 100644 --- a/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java @@ -1,6 +1,8 @@ package com.songoda.skyblock.utils.structure; +import com.google.common.io.Files; import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager; @@ -32,203 +34,221 @@ import java.util.ArrayList; import java.util.Base64; import java.util.LinkedHashMap; import java.util.List; +import java.util.logging.Level; public final class StructureUtil { - public static void saveStructure(File configFile, org.bukkit.Location originLocation, - org.bukkit.Location[] positions) throws Exception { - if (!configFile.exists()) { - configFile.createNewFile(); - } + public static void saveStructure(File configFile, org.bukkit.Location originLocation, + org.bukkit.Location[] positions) throws Exception { + if (!configFile.exists()) { + configFile.createNewFile(); + } - LinkedHashMap blocks = SelectionLocation.getBlocks(originLocation, positions[0], positions[1]); - LinkedHashMap entities = SelectionLocation.getEntities(originLocation, positions[0], - positions[1]); + LinkedHashMap blocks = SelectionLocation.getBlocks(originLocation, positions[0], positions[1]); + LinkedHashMap entities = SelectionLocation.getEntities(originLocation, positions[0], + positions[1]); - List blockData = new ArrayList<>(); - List entityData = new ArrayList<>(); + List blockData = new ArrayList<>(); + List entityData = new ArrayList<>(); - String originBlockLocation = ""; + String originBlockLocation = ""; - for (Block blockList : blocks.keySet()) { - Location location = blocks.get(blockList); + for (Block blockList : blocks.keySet()) { + Location location = blocks.get(blockList); - if (location.isOriginLocation()) { - originBlockLocation = location.getX() + ":" + location.getY() + ":" + location.getZ() + ":" - + positions[0].getWorld().getName(); + if (location.isOriginLocation()) { + originBlockLocation = location.getX() + ":" + location.getY() + ":" + location.getZ() + ":" + + positions[0].getWorld().getName(); - if (blockList.getType() == Material.AIR) { - blockData.add(BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), - location.getZ())); - } - } + if (blockList.getType() == Material.AIR) { + blockData.add(BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), + location.getZ())); + } + } - if (blockList.getType() == Material.AIR) { - continue; - } + if (blockList.getType() == Material.AIR) { + continue; + } - blockData.add( - BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), location.getZ())); - } + blockData.add( + BlockUtil.convertBlockToBlockData(blockList, location.getX(), location.getY(), location.getZ())); + } - for (Entity entityList : entities.keySet()) { - if (entityList.getType() == EntityType.PLAYER) { - continue; - } + for (Entity entityList : entities.keySet()) { + if (entityList.getType() == EntityType.PLAYER) { + continue; + } - Location location = entities.get(entityList); - entityData.add(EntityUtil.convertEntityToEntityData(entityList, location.getX(), location.getY(), - location.getZ())); - } + Location location = entities.get(entityList); + entityData.add(EntityUtil.convertEntityToEntityData(entityList, location.getX(), location.getY(), + location.getZ())); + } - if (!originBlockLocation.isEmpty()) { - originBlockLocation = originBlockLocation + ":" + originLocation.getYaw() + ":" + originLocation.getPitch(); - } + if (!originBlockLocation.isEmpty()) { + originBlockLocation = originBlockLocation + ":" + originLocation.getYaw() + ":" + originLocation.getPitch(); + } - String JSONString = new Gson().toJson(new Storage(new Gson().toJson(blockData), new Gson().toJson(entityData), - originBlockLocation, System.currentTimeMillis(), NMSUtil.getVersionNumber()), Storage.class); + String JSONString = new Gson().toJson(new Storage(new Gson().toJson(blockData), new Gson().toJson(entityData), + originBlockLocation, System.currentTimeMillis(), NMSUtil.getVersionNumber()), Storage.class); - FileOutputStream fileOutputStream = new FileOutputStream(configFile, false); - fileOutputStream.write(Base64.getEncoder().encode(JSONString.getBytes(StandardCharsets.UTF_8))); - fileOutputStream.flush(); - fileOutputStream.close(); - } + FileOutputStream fileOutputStream = new FileOutputStream(configFile, false); + fileOutputStream.write(Base64.getEncoder().encode(JSONString.getBytes(StandardCharsets.UTF_8))); + fileOutputStream.flush(); + fileOutputStream.close(); + } - public static Structure loadStructure(File configFile) throws IOException { - if (!configFile.exists()) - return null; + private static String getBase64String(File file) { + if (!file.exists()) return null; - byte[] content = new byte[(int) configFile.length()]; + String firstLine = null; - FileInputStream fileInputStream = new FileInputStream(configFile); - fileInputStream.read(content); - fileInputStream.close(); + try { + firstLine = Files.asCharSource(file, StandardCharsets.UTF_8).readFirstLine(); + } catch (IOException e) { + e.printStackTrace(); + } - String json; - try { - json = Compression.decompress(content); - } catch (Exception e) { - Bukkit.getConsoleSender().sendMessage("Could not load structure '" + configFile.getName() + "' Try using the '/is admin structure tool' command to make a new schematic of it."); - File defaultStructure = new File(SkyBlock.getInstance().getDataFolder() + "/" + "structures", "default.structure"); - content = new byte[(int) defaultStructure.length()]; - fileInputStream = new FileInputStream(defaultStructure); - fileInputStream.read(content); - fileInputStream.close(); - json = Compression.decompress(content); - } + return firstLine; + } - Storage storage = new Gson().fromJson(json, Storage.class); - return new Structure(storage, configFile.getName()); - } + public static Structure loadStructure(File configFile) throws IOException { + String base64 = getBase64String(configFile); - @SuppressWarnings("unchecked") - public static Float[] pasteStructure(Structure structure, org.bukkit.Location location, BlockDegreesType type) { - Storage storage = structure.getStructureStorage(); + if (base64 == null) { + base64 = getBase64String( + new File(SkyBlock.getInstance().getDataFolder() + "/" + "structures", "default.structure")); + SkyBlock.getInstance().getLogger().log(Level.SEVERE, + "Unable to load structure '" + configFile.getAbsolutePath() + "' using default instead."); + } - String[] originLocationPositions = null; + if (base64 == null) { + throw new IllegalArgumentException("Couldn't load the default structure file."); + } - if (!storage.getOriginLocation().isEmpty()) { - originLocationPositions = storage.getOriginLocation().split(":"); - } + Storage storage; - float yaw = 0.0F, pitch = 0.0F; + try { + storage = new Gson().fromJson( + new String(Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8))), Storage.class); + } catch (JsonSyntaxException e) { + e.printStackTrace(); + return null; + } - if (originLocationPositions.length == 6) { - yaw = Float.valueOf(originLocationPositions[4]); - pitch = Float.valueOf(originLocationPositions[5]); - } + return new Structure(storage, configFile.getName()); + } - List blockData = new Gson().fromJson(storage.getBlocks(), - new TypeToken>() { - }.getType()); + @SuppressWarnings("unchecked") + public static Float[] pasteStructure(Structure structure, org.bukkit.Location location, BlockDegreesType type) { + Storage storage = structure.getStructureStorage(); - for (BlockData blockDataList : blockData) { - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { - try { - org.bukkit.Location blockRotationLocation = LocationUtil - .rotateLocation(new org.bukkit.Location(location.getWorld(), blockDataList.getX(), - blockDataList.getY(), blockDataList.getZ()), type); - org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), - location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), - location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), - location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); - blockLocation.add(blockRotationLocation); - BlockUtil.convertBlockDataToBlock(blockLocation.getBlock(), blockDataList); - } catch (Exception e) { - SkyBlock.getInstance().getLogger().warning("Unable to convert BlockData to Block for type {" + blockDataList.getMaterial() + - ":" + blockDataList.getData() + "} in structure {" + structure.getStructureFile() + "}"); - } - }); - } + String[] originLocationPositions = null; - Bukkit.getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { - for (EntityData entityDataList : (List) new Gson().fromJson(storage.getEntities(), - new TypeToken>() { - }.getType())) { - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { - try { - org.bukkit.Location blockRotationLocation = LocationUtil - .rotateLocation(new org.bukkit.Location(location.getWorld(), entityDataList.getX(), - entityDataList.getY(), entityDataList.getZ()), type); - org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), - location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), - location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), - location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); - blockLocation.add(blockRotationLocation); - EntityUtil.convertEntityDataToEntity(entityDataList, blockLocation, type); - } catch (Exception e) { - SkyBlock.getInstance().getLogger().warning("Unable to convert EntityData to Entity for type {" + entityDataList.getEntityType() + - "} in structure {" + structure.getStructureFile() + "}"); - } - }); - } - }, 60L); + if (!storage.getOriginLocation().isEmpty()) { + originLocationPositions = storage.getOriginLocation().split(":"); + } - return new Float[]{yaw, pitch}; - } + float yaw = 0.0F, pitch = 0.0F; - public static ItemStack getTool() throws Exception { - SkyBlock skyblock = SkyBlock.getInstance(); + if (originLocationPositions.length == 6) { + yaw = Float.valueOf(originLocationPositions[4]); + pitch = Float.valueOf(originLocationPositions[5]); + } - FileManager fileManager = skyblock.getFileManager(); + List blockData = new Gson().fromJson(storage.getBlocks(), new TypeToken>() { + }.getType()); - FileManager.Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); + for (BlockData blockDataList : blockData) { + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { + try { + org.bukkit.Location blockRotationLocation = LocationUtil + .rotateLocation(new org.bukkit.Location(location.getWorld(), blockDataList.getX(), + blockDataList.getY(), blockDataList.getZ()), type); + org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), + location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), + location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), + location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); + blockLocation.add(blockRotationLocation); + BlockUtil.convertBlockDataToBlock(blockLocation.getBlock(), blockDataList); + } catch (Exception e) { + SkyBlock.getInstance().getLogger() + .warning("Unable to convert BlockData to Block for type {" + blockDataList.getMaterial() + + ":" + blockDataList.getData() + "} in structure {" + structure.getStructureFile() + + "}"); + } + }); + } - ItemStack is = new ItemStack( - Material.valueOf(fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")) - .getFileConfiguration().getString("Island.Admin.Structure.Selector"))); - ItemMeta im = is.getItemMeta(); - im.setDisplayName(ChatColor.translateAlternateColorCodes('&', - configLoad.getString("Island.Structure.Tool.Item.Displayname"))); + Bukkit.getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { + for (EntityData entityDataList : (List) new Gson().fromJson(storage.getEntities(), + new TypeToken>() { + }.getType())) { + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(SkyBlock.getInstance(), () -> { + try { + org.bukkit.Location blockRotationLocation = LocationUtil + .rotateLocation(new org.bukkit.Location(location.getWorld(), entityDataList.getX(), + entityDataList.getY(), entityDataList.getZ()), type); + org.bukkit.Location blockLocation = new org.bukkit.Location(location.getWorld(), + location.getX() - Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[0])), + location.getY() - Integer.valueOf(storage.getOriginLocation().split(":")[1]), + location.getZ() + Math.abs(Integer.valueOf(storage.getOriginLocation().split(":")[2]))); + blockLocation.add(blockRotationLocation); + EntityUtil.convertEntityDataToEntity(entityDataList, blockLocation, type); + } catch (Exception e) { + SkyBlock.getInstance().getLogger() + .warning("Unable to convert EntityData to Entity for type {" + + entityDataList.getEntityType() + "} in structure {" + + structure.getStructureFile() + "}"); + } + }); + } + }, 60L); - List itemLore = new ArrayList<>(); + return new Float[] { yaw, pitch }; + } - for (String itemLoreList : configLoad.getStringList("Island.Structure.Tool.Item.Lore")) { - itemLore.add(ChatColor.translateAlternateColorCodes('&', itemLoreList)); - } + public static ItemStack getTool() throws Exception { + SkyBlock skyblock = SkyBlock.getInstance(); - im.setLore(itemLore); - is.setItemMeta(im); + FileManager fileManager = skyblock.getFileManager(); - return is; - } + FileManager.Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); - public static org.bukkit.Location[] getFixedLocations(org.bukkit.Location location1, - org.bukkit.Location location2) { - org.bukkit.Location location1Fixed = location1.clone(); - org.bukkit.Location location2Fixed = location2.clone(); + ItemStack is = new ItemStack( + Material.valueOf(fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")) + .getFileConfiguration().getString("Island.Admin.Structure.Selector"))); + ItemMeta im = is.getItemMeta(); + im.setDisplayName(ChatColor.translateAlternateColorCodes('&', + configLoad.getString("Island.Structure.Tool.Item.Displayname"))); - if (location1.getX() > location2.getX()) { - location1Fixed.setX(location2.getX()); - location2Fixed.setX(location1.getX()); - } + List itemLore = new ArrayList<>(); - if (location1.getZ() < location2.getZ()) { - location1Fixed.setZ(location2.getZ()); - location2Fixed.setZ(location1.getZ()); - } + for (String itemLoreList : configLoad.getStringList("Island.Structure.Tool.Item.Lore")) { + itemLore.add(ChatColor.translateAlternateColorCodes('&', itemLoreList)); + } - return new org.bukkit.Location[]{location1Fixed, location2Fixed}; - } + im.setLore(itemLore); + is.setItemMeta(im); + + return is; + } + + public static org.bukkit.Location[] getFixedLocations(org.bukkit.Location location1, + org.bukkit.Location location2) { + org.bukkit.Location location1Fixed = location1.clone(); + org.bukkit.Location location2Fixed = location2.clone(); + + if (location1.getX() > location2.getX()) { + location1Fixed.setX(location2.getX()); + location2Fixed.setX(location1.getX()); + } + + if (location1.getZ() < location2.getZ()) { + location1Fixed.setZ(location2.getZ()); + location2Fixed.setZ(location1.getZ()); + } + + return new org.bukkit.Location[] { location1Fixed, location2Fixed }; + } } diff --git a/src/main/resources/structures/default.structure b/src/main/resources/structures/default.structure index fc2652e3780ef49ab6a1655bed75ba65f1e60298..c4836d5467b29b23889b49c7a22306b4056e0361 100644 GIT binary patch literal 153500 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 Date: Mon, 14 Oct 2019 17:52:39 -0400 Subject: [PATCH 40/45] 2.0.4 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dfdb98d5..45dc1dce 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "2.0.4" + version: "2.0.5" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle From 80d4d9165f143b1b92c60cfa4991d2bbfe8acde4 Mon Sep 17 00:00:00 2001 From: SirBlobman Date: Tue, 15 Oct 2019 18:20:18 +0000 Subject: [PATCH 41/45] Fix console errors when generator is disabled --- src/main/java/com/songoda/skyblock/listeners/Block.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java index 0b19c20f..52363392 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -506,9 +506,10 @@ public class Block implements Listener { return; GeneratorManager generatorManager = skyblock.getGeneratorManager(); + if(generatorManager == null) return; + List generators = Lists.newArrayList(generatorManager.getGenerators()); - if (generatorManager == null || generators.size() == 0) - return; + if(generators == null || generators.isEmpty()) return; Collections.reverse(generators); // Use the highest generator available // Filter valid players on the island. From 38a2e833919124b8288ce44a327f860a92dbc7b3 Mon Sep 17 00:00:00 2001 From: theone1000 Date: Fri, 18 Oct 2019 19:40:59 -0600 Subject: [PATCH 42/45] more things including island stuff. --- .../java/com/songoda/skyblock/SkyBlock.java | 14 +- .../com/songoda/skyblock/ban/BanManager.java | 13 +- .../songoda/skyblock/biome/BiomeManager.java | 9 +- .../command/commands/admin/ReloadCommand.java | 33 +- .../admin/SetAlwaysLoadedCommand.java | 36 +- .../confirmation/ConfirmationTask.java | 15 +- .../skyblock/cooldown/CooldownManager.java | 237 ++- .../skyblock/cooldown/CooldownTask.java | 22 +- .../skyblock/cooldown/CooldownType.java | 16 +- .../skyblock/invite/InviteManager.java | 15 +- .../com/songoda/skyblock/island/Island.java | 58 +- .../songoda/skyblock/island/IslandLevel.java | 92 +- .../skyblock/island/IslandManager.java | 7 +- .../songoda/skyblock/island/IslandRole.java | 16 +- .../leaderboard/leaderheads/TopBank.java | 2 +- .../leaderboard/leaderheads/TopLevel.java | 2 +- .../leaderboard/leaderheads/TopVotes.java | 6 +- .../skyblock/limit/EnumLimitation.java | 77 + .../songoda/skyblock/limit/LimitManager.java | 115 -- .../songoda/skyblock/limit/Limitation.java | 13 + .../limit/LimitationInstanceHandler.java | 42 + .../skyblock/limit/impl/BlockLimitation.java | 106 ++ .../skyblock/limit/impl/EntityLimitaton.java | 55 + .../com/songoda/skyblock/listeners/Block.java | 24 +- .../songoda/skyblock/listeners/Entity.java | 1382 +++++++++-------- .../songoda/skyblock/listeners/Interact.java | 29 +- .../skyblock/utils/structure/Area.java | 6 +- .../utils/structure/SchematicUtil.java | 6 +- .../utils/structure/StructureUtil.java | 2 - src/main/resources/language.yml | 2 + src/main/resources/limits.yml | 7 +- 31 files changed, 1321 insertions(+), 1138 deletions(-) create mode 100644 src/main/java/com/songoda/skyblock/limit/EnumLimitation.java delete mode 100644 src/main/java/com/songoda/skyblock/limit/LimitManager.java create mode 100644 src/main/java/com/songoda/skyblock/limit/Limitation.java create mode 100644 src/main/java/com/songoda/skyblock/limit/LimitationInstanceHandler.java create mode 100644 src/main/java/com/songoda/skyblock/limit/impl/BlockLimitation.java create mode 100644 src/main/java/com/songoda/skyblock/limit/impl/EntityLimitaton.java diff --git a/src/main/java/com/songoda/skyblock/SkyBlock.java b/src/main/java/com/songoda/skyblock/SkyBlock.java index af0ff5eb..f8d7a38e 100644 --- a/src/main/java/com/songoda/skyblock/SkyBlock.java +++ b/src/main/java/com/songoda/skyblock/SkyBlock.java @@ -15,7 +15,7 @@ import com.songoda.skyblock.invite.InviteManager; import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.leaderboard.LeaderboardManager; import com.songoda.skyblock.levelling.LevellingManager; -import com.songoda.skyblock.limit.LimitManager; +import com.songoda.skyblock.limit.LimitationInstanceHandler; import com.songoda.skyblock.listeners.*; import com.songoda.skyblock.menus.Rollback; import com.songoda.skyblock.menus.admin.Creator; @@ -61,7 +61,6 @@ public class SkyBlock extends JavaPlugin { private UpgradeManager upgradeManager; private PlayerDataManager playerDataManager; private CooldownManager cooldownManager; - private LimitManager limitManager; private ScoreboardManager scoreboardManager; private InviteManager inviteManager; private BiomeManager biomeManager; @@ -76,6 +75,7 @@ public class SkyBlock extends JavaPlugin { private MessageManager messageManager; private EconomyManager economyManager; private HologramManager hologramManager; + private LimitationInstanceHandler limitationHandler; public static SkyBlock getInstance() { return instance; @@ -101,7 +101,7 @@ public class SkyBlock extends JavaPlugin { upgradeManager = new UpgradeManager(this); playerDataManager = new PlayerDataManager(this); cooldownManager = new CooldownManager(this); - limitManager = new LimitManager(this); + limitationHandler = new LimitationInstanceHandler(); if (fileManager.getConfig(new File(getDataFolder(), "config.yml")).getFileConfiguration() .getBoolean("Island.Scoreboard.Enable")) { @@ -261,10 +261,6 @@ public class SkyBlock extends JavaPlugin { return cooldownManager; } - public LimitManager getLimitManager() { - return limitManager; - } - public ScoreboardManager getScoreboardManager() { return scoreboardManager; } @@ -329,6 +325,10 @@ public class SkyBlock extends JavaPlugin { return stackableManager; } + public LimitationInstanceHandler getLimitationHandler() { + return limitationHandler; + } + @Override public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { return new VoidGenerator(); diff --git a/src/main/java/com/songoda/skyblock/ban/BanManager.java b/src/main/java/com/songoda/skyblock/ban/BanManager.java index fca4dd24..608a0a88 100644 --- a/src/main/java/com/songoda/skyblock/ban/BanManager.java +++ b/src/main/java/com/songoda/skyblock/ban/BanManager.java @@ -31,8 +31,7 @@ public class BanManager { public void onDisable() { Map banIslands = getIslands(); - for (UUID banIslandList : banIslands.keySet()) { - Ban ban = banIslands.get(banIslandList); + for (Ban ban : banIslands.values()) { ban.save(); } } @@ -96,11 +95,7 @@ public class BanManager { } public Ban getIsland(UUID islandOwnerUUID) { - if (hasIsland(islandOwnerUUID)) { - return banStorage.get(islandOwnerUUID); - } - - return null; + return banStorage.get(islandOwnerUUID); } public Map getIslands() { @@ -116,9 +111,7 @@ public class BanManager { } public void removeIsland(UUID islandOwnerUUID) { - if (hasIsland(islandOwnerUUID)) { - banStorage.remove(islandOwnerUUID); - } + banStorage.remove(islandOwnerUUID); } public void unloadIsland(UUID islandOwnerUUID) { diff --git a/src/main/java/com/songoda/skyblock/biome/BiomeManager.java b/src/main/java/com/songoda/skyblock/biome/BiomeManager.java index 7bc60c10..a4651dd0 100644 --- a/src/main/java/com/songoda/skyblock/biome/BiomeManager.java +++ b/src/main/java/com/songoda/skyblock/biome/BiomeManager.java @@ -11,8 +11,8 @@ import org.bukkit.block.Biome; import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; public class BiomeManager { @@ -23,7 +23,7 @@ public class BiomeManager { } public void setBiome(Island island, Biome biome) { - List chunks = new ArrayList<>(); + Set chunks = new HashSet<>(); Location location = island.getLocation(IslandWorld.Normal, IslandEnvironment.Island); int radius = (int) Math.ceil(island.getRadius()); @@ -31,8 +31,7 @@ public class BiomeManager { for (int z = location.getBlockZ() - radius; z < location.getBlockZ() + radius; z++) { location.getWorld().setBiome(x, z, biome); Chunk chunk = location.getWorld().getChunkAt(x >> 4, z >> 4); - if (!chunks.contains(chunk)) - chunks.add(chunk); + chunks.add(chunk); } } diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java index d5e3a33d..9f731479 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/ReloadCommand.java @@ -1,25 +1,25 @@ package com.songoda.skyblock.command.commands.admin; -import com.songoda.skyblock.command.SubCommand; -import com.songoda.skyblock.config.FileManager; -import com.songoda.skyblock.config.FileManager.Config; -import com.songoda.skyblock.generator.GeneratorManager; -import com.songoda.skyblock.hologram.HologramManager; -import com.songoda.skyblock.leaderboard.LeaderboardManager; -import com.songoda.skyblock.levelling.LevellingManager; -import com.songoda.skyblock.limit.LimitManager; -import com.songoda.skyblock.message.MessageManager; -import com.songoda.skyblock.scoreboard.ScoreboardManager; -import com.songoda.skyblock.sound.SoundManager; -import com.songoda.skyblock.utils.version.Sounds; +import java.io.File; +import java.util.Map; + import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; -import java.io.File; -import java.util.Map; +import com.songoda.skyblock.command.SubCommand; +import com.songoda.skyblock.config.FileManager; +import com.songoda.skyblock.config.FileManager.Config; +import com.songoda.skyblock.generator.GeneratorManager; +import com.songoda.skyblock.leaderboard.LeaderboardManager; +import com.songoda.skyblock.levelling.LevellingManager; +import com.songoda.skyblock.limit.LimitationInstanceHandler; +import com.songoda.skyblock.message.MessageManager; +import com.songoda.skyblock.scoreboard.ScoreboardManager; +import com.songoda.skyblock.sound.SoundManager; +import com.songoda.skyblock.utils.version.Sounds; public class ReloadCommand extends SubCommand { @@ -35,10 +35,9 @@ public class ReloadCommand extends SubCommand { public void onCommand(CommandSender sender, String[] args) { LeaderboardManager leaderboardManager = skyblock.getLeaderboardManager(); - HologramManager hologramManager = skyblock.getHologramManager(); MessageManager messageManager = skyblock.getMessageManager(); SoundManager soundManager = skyblock.getSoundManager(); - LimitManager limitManager = skyblock.getLimitManager(); + LimitationInstanceHandler limitHandler = skyblock.getLimitationHandler(); FileManager fileManager = skyblock.getFileManager(); messageManager.sendMessage(sender, "&cPlease note that this command is not supported and may " + @@ -96,7 +95,7 @@ public class ReloadCommand extends SubCommand { Bukkit.getScheduler().runTask(skyblock, () -> skyblock.getHologramManager().resetHologram()); }); - limitManager.reload(); + limitHandler.reloadAll(); messageManager.sendMessage(sender, configLoad.getString("Command.Island.Admin.Reload.Reloaded.Message")); soundManager.playSound(sender, Sounds.ANVIL_USE.bukkitSound(), 1.0F, 1.0F); diff --git a/src/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java b/src/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java index ac7146ef..227c8a72 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/admin/SetAlwaysLoadedCommand.java @@ -1,5 +1,14 @@ package com.songoda.skyblock.command.commands.admin; +import java.io.File; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; + import com.songoda.skyblock.command.SubCommand; import com.songoda.skyblock.config.FileManager; import com.songoda.skyblock.config.FileManager.Config; @@ -10,16 +19,6 @@ import com.songoda.skyblock.playerdata.PlayerDataManager; import com.songoda.skyblock.sound.SoundManager; import com.songoda.skyblock.utils.player.OfflinePlayer; import com.songoda.skyblock.utils.version.Sounds; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; - -import java.io.File; -import java.io.IOException; -import java.util.UUID; public class SetAlwaysLoadedCommand extends SubCommand { @@ -34,14 +33,21 @@ public class SetAlwaysLoadedCommand extends SubCommand { } public void onCommand(CommandSender sender, String[] args) { - PlayerDataManager playerDataManager = skyblock.getPlayerDataManager(); - MessageManager messageManager = skyblock.getMessageManager(); - IslandManager islandManager = skyblock.getIslandManager(); - SoundManager soundManager = skyblock.getSoundManager(); - FileManager fileManager = skyblock.getFileManager(); + FileManager fileManager = skyblock.getFileManager(); Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")); FileConfiguration configLoad = config.getFileConfiguration(); + MessageManager messageManager = skyblock.getMessageManager(); + + if (args.length == 0) { + messageManager.sendMessage(sender, + configLoad.getString("Command.Island.Admin.SetAlwaysLoaded.No-Player-Input.Message")); + return; + } + + PlayerDataManager playerDataManager = skyblock.getPlayerDataManager(); + IslandManager islandManager = skyblock.getIslandManager(); + SoundManager soundManager = skyblock.getSoundManager(); if (args.length == 1) { Player targetPlayer = Bukkit.getServer().getPlayer(args[0]); diff --git a/src/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java b/src/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java index 782e29e0..2d6994fa 100644 --- a/src/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java +++ b/src/main/java/com/songoda/skyblock/confirmation/ConfirmationTask.java @@ -1,10 +1,9 @@ package com.songoda.skyblock.confirmation; +import org.bukkit.scheduler.BukkitRunnable; + import com.songoda.skyblock.playerdata.PlayerData; import com.songoda.skyblock.playerdata.PlayerDataManager; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; public class ConfirmationTask extends BukkitRunnable { @@ -16,13 +15,9 @@ public class ConfirmationTask extends BukkitRunnable { @Override public void run() { - for (Player all : Bukkit.getOnlinePlayers()) { - if (playerDataManager.hasPlayerData(all)) { - PlayerData playerData = playerDataManager.getPlayerData(all); - - if (playerData.getConfirmationTime() > 0) { - playerData.setConfirmationTime(playerData.getConfirmationTime() - 1); - } + for (PlayerData playerData : playerDataManager.getPlayerData().values()) { + if (playerData.getConfirmationTime() > 0) { + playerData.setConfirmationTime(playerData.getConfirmationTime() - 1); } } } diff --git a/src/main/java/com/songoda/skyblock/cooldown/CooldownManager.java b/src/main/java/com/songoda/skyblock/cooldown/CooldownManager.java index 63e5747d..9418e52d 100644 --- a/src/main/java/com/songoda/skyblock/cooldown/CooldownManager.java +++ b/src/main/java/com/songoda/skyblock/cooldown/CooldownManager.java @@ -13,7 +13,9 @@ import org.bukkit.entity.Player; import java.io.File; import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collections; +import java.util.EnumMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -21,14 +23,14 @@ public class CooldownManager { private final SkyBlock skyblock; - private Map> cooldownStorage = new HashMap<>(); + private Map> cooldownStorage = new EnumMap<>(CooldownType.class); public CooldownManager(SkyBlock skyblock) { this.skyblock = skyblock; IslandManager islandManager = skyblock.getIslandManager(); - for (CooldownType cooldownTypeList : CooldownType.values()) { + for (CooldownType cooldownTypeList : CooldownType.getTypes()) { List cooldownPlayers = new ArrayList<>(); for (Player all : Bukkit.getOnlinePlayers()) { @@ -60,7 +62,7 @@ public class CooldownManager { } public void onDisable() { - for (CooldownType cooldownTypeList : CooldownType.values()) { + for (CooldownType cooldownTypeList : CooldownType.getTypes()) { setCooldownPlayer(cooldownTypeList); saveCooldownPlayer(cooldownTypeList); } @@ -69,23 +71,19 @@ public class CooldownManager { public CooldownPlayer loadCooldownPlayer(CooldownType cooldownType, OfflinePlayer player) { if (cooldownType == CooldownType.Biome || cooldownType == CooldownType.Creation) { Config config = skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), - player.getUniqueId().toString() + ".yml")); + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), player.getUniqueId().toString() + ".yml")); FileConfiguration configLoad = config.getFileConfiguration(); if (configLoad.getString("Island." + cooldownType.name() + ".Cooldown") != null) { - return new CooldownPlayer(player.getUniqueId(), - new Cooldown(configLoad.getInt("Island." + cooldownType.name() + ".Cooldown"))); + return new CooldownPlayer(player.getUniqueId(), new Cooldown(configLoad.getInt("Island." + cooldownType.name() + ".Cooldown"))); } } else if (cooldownType == CooldownType.Levelling || cooldownType == CooldownType.Ownership) { Config config = skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), - player.getUniqueId().toString() + ".yml")); + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), player.getUniqueId().toString() + ".yml")); FileConfiguration configLoad = config.getFileConfiguration(); if (configLoad.getString(cooldownType.name() + ".Cooldown") != null) { - return new CooldownPlayer(player.getUniqueId(), - new Cooldown(configLoad.getInt(cooldownType.name() + ".Cooldown"))); + return new CooldownPlayer(player.getUniqueId(), new Cooldown(configLoad.getInt(cooldownType.name() + ".Cooldown"))); } } @@ -95,79 +93,73 @@ public class CooldownManager { public void createPlayer(CooldownType cooldownType, OfflinePlayer player) { FileManager fileManager = skyblock.getFileManager(); - if (cooldownStorage.containsKey(cooldownType)) { - int time = 0; + List cooldowns = cooldownStorage.get(cooldownType); - if (cooldownType == CooldownType.Biome || cooldownType == CooldownType.Creation) { - time = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() - .getInt("Island." + cooldownType.name() + ".Cooldown.Time"); + if (cooldowns == null) return; - Config config = fileManager - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), - player.getUniqueId().toString() + ".yml")); - File configFile = config.getFile(); - FileConfiguration configLoad = config.getFileConfiguration(); + int time = 0; - configLoad.set("Island." + cooldownType.name() + ".Cooldown", time); + if (cooldownType == CooldownType.Biome || cooldownType == CooldownType.Creation) { + time = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() + .getInt("Island." + cooldownType.name() + ".Cooldown.Time"); - try { - configLoad.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } - } else if (cooldownType == CooldownType.Levelling || cooldownType == CooldownType.Ownership) { - time = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() - .getInt("Island." + cooldownType.name() + ".Cooldown.Time"); + Config config = fileManager + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), player.getUniqueId().toString() + ".yml")); + File configFile = config.getFile(); + FileConfiguration configLoad = config.getFileConfiguration(); - Config config = skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), - player.getUniqueId().toString() + ".yml")); - File configFile = config.getFile(); - FileConfiguration configLoad = config.getFileConfiguration(); + configLoad.set("Island." + cooldownType.name() + ".Cooldown", time); - configLoad.set(cooldownType.name() + ".Cooldown", time); - - try { - configLoad.save(configFile); - } catch (IOException e) { - e.printStackTrace(); - } + try { + configLoad.save(configFile); + } catch (IOException e) { + e.printStackTrace(); } + } else if (cooldownType == CooldownType.Levelling || cooldownType == CooldownType.Ownership) { + time = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() + .getInt("Island." + cooldownType.name() + ".Cooldown.Time"); - cooldownStorage.get(cooldownType).add(new CooldownPlayer(player.getUniqueId(), new Cooldown(time))); + Config config = skyblock.getFileManager() + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), player.getUniqueId().toString() + ".yml")); + File configFile = config.getFile(); + FileConfiguration configLoad = config.getFileConfiguration(); + + configLoad.set(cooldownType.name() + ".Cooldown", time); + + try { + configLoad.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } } + + cooldowns.add(new CooldownPlayer(player.getUniqueId(), new Cooldown(time))); } public void deletePlayer(CooldownType cooldownType, OfflinePlayer player) { - if (cooldownStorage.containsKey(cooldownType)) { - for (CooldownPlayer cooldownPlayerList : cooldownStorage.get(cooldownType)) { - if (cooldownPlayerList.getUUID().equals(player.getUniqueId())) { - if (cooldownType == CooldownType.Biome || cooldownType == CooldownType.Creation) { - skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), - player.getUniqueId().toString() + ".yml")) - .getFileConfiguration().set("Island." + cooldownType.name() + ".Cooldown", null); - } else if (cooldownType == CooldownType.Levelling || cooldownType == CooldownType.Ownership) { - skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), - player.getUniqueId().toString() + ".yml")) - .getFileConfiguration().set(cooldownType.name() + ".Cooldown", null); - } - - cooldownStorage.get(cooldownType).remove(cooldownPlayerList); - - break; + for (Iterator it = getCooldownPlayersOrEmptyList(cooldownType).iterator(); it.hasNext();) { + if (it.next().getUUID().equals(player.getUniqueId())) { + if (cooldownType == CooldownType.Biome || cooldownType == CooldownType.Creation) { + skyblock.getFileManager() + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), + player.getUniqueId().toString() + ".yml")) + .getFileConfiguration().set("Island." + cooldownType.name() + ".Cooldown", null); + } else if (cooldownType == CooldownType.Levelling || cooldownType == CooldownType.Ownership) { + skyblock.getFileManager().getConfig( + new File(new File(skyblock.getDataFolder().toString() + "/island-data"), player.getUniqueId().toString() + ".yml")) + .getFileConfiguration().set(cooldownType.name() + ".Cooldown", null); } + it.remove(); + break; } } } public boolean hasPlayer(CooldownType cooldownType, OfflinePlayer player) { - if (cooldownStorage.containsKey(cooldownType)) { - for (CooldownPlayer cooldownPlayerList : cooldownStorage.get(cooldownType)) { - if (cooldownPlayerList.getUUID().equals(player.getUniqueId())) { - return true; - } + + for (CooldownPlayer cooldownPlayerList : getCooldownPlayersOrEmptyList(cooldownType)) { + if (cooldownPlayerList.getUUID().equals(player.getUniqueId())) { + return true; } } @@ -175,72 +167,55 @@ public class CooldownManager { } public void transferPlayer(CooldownType cooldownType, OfflinePlayer player1, OfflinePlayer player2) { - if (cooldownStorage.containsKey(cooldownType)) { - for (CooldownPlayer cooldownPlayerList : cooldownStorage.get(cooldownType)) { - if (cooldownPlayerList.getUUID().equals(player1.getUniqueId())) { - cooldownPlayerList.setUUID(player2.getUniqueId()); - - break; - } + for (CooldownPlayer cooldownPlayerList : getCooldownPlayersOrEmptyList(cooldownType)) { + if (cooldownPlayerList.getUUID().equals(player1.getUniqueId())) { + cooldownPlayerList.setUUID(player2.getUniqueId()); + break; } } } public void removeCooldownPlayer(CooldownType cooldownType, CooldownPlayer cooldownPlayer) { - if (cooldownStorage.containsKey(cooldownType)) { - cooldownStorage.get(cooldownType).remove(cooldownPlayer); - } + getCooldownPlayersOrEmptyList(cooldownType).remove(cooldownPlayer); } public void removeCooldownPlayer(CooldownType cooldownType, OfflinePlayer player) { - if (cooldownStorage.containsKey(cooldownType)) { - for (CooldownPlayer cooldownPlayerList : cooldownStorage.get(cooldownType)) { - if (cooldownPlayerList.getUUID().equals(player.getUniqueId())) { - cooldownStorage.get(cooldownType).remove(cooldownPlayerList); - - break; - } + for (Iterator it = getCooldownPlayersOrEmptyList(cooldownType).iterator(); it.hasNext();) { + if (it.next().getUUID().equals(player.getUniqueId())) { + it.remove(); + break; } } } public void setCooldownPlayer(CooldownType cooldownType) { - if (cooldownStorage.containsKey(cooldownType)) { - for (CooldownPlayer cooldownPlayerList : cooldownStorage.get(cooldownType)) { - setCooldownPlayer(cooldownType, Bukkit.getServer().getOfflinePlayer(cooldownPlayerList.getUUID())); - } + for (CooldownPlayer cooldownPlayerList : getCooldownPlayersOrEmptyList(cooldownType)) { + setCooldownPlayer(cooldownType, Bukkit.getServer().getOfflinePlayer(cooldownPlayerList.getUUID())); } } public void setCooldownPlayer(CooldownType cooldownType, OfflinePlayer player) { - if (cooldownStorage.containsKey(cooldownType)) { - for (CooldownPlayer cooldownPlayerList : cooldownStorage.get(cooldownType)) { - if (cooldownPlayerList.getUUID().equals(player.getUniqueId())) { - if (cooldownType == CooldownType.Biome || cooldownType == CooldownType.Creation) { - skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), - player.getUniqueId().toString() + ".yml")) - .getFileConfiguration().set("Island." + cooldownType + ".Cooldown", - cooldownPlayerList.getCooldown().getTime()); - } else if (cooldownType == CooldownType.Levelling || cooldownType == CooldownType.Ownership) { - skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), - player.getUniqueId().toString() + ".yml")) - .getFileConfiguration() - .set(cooldownType.name() + ".Cooldown", cooldownPlayerList.getCooldown().getTime()); - } - - break; + for (CooldownPlayer cooldownPlayerList : getCooldownPlayersOrEmptyList(cooldownType)) { + if (cooldownPlayerList.getUUID().equals(player.getUniqueId())) { + if (cooldownType == CooldownType.Biome || cooldownType == CooldownType.Creation) { + skyblock.getFileManager() + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), + player.getUniqueId().toString() + ".yml")) + .getFileConfiguration().set("Island." + cooldownType + ".Cooldown", cooldownPlayerList.getCooldown().getTime()); + } else if (cooldownType == CooldownType.Levelling || cooldownType == CooldownType.Ownership) { + skyblock.getFileManager() + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), + player.getUniqueId().toString() + ".yml")) + .getFileConfiguration().set(cooldownType.name() + ".Cooldown", cooldownPlayerList.getCooldown().getTime()); } + break; } } } public void saveCooldownPlayer(CooldownType cooldownType) { - if (cooldownStorage.containsKey(cooldownType)) { - for (CooldownPlayer cooldownPlayerList : cooldownStorage.get(cooldownType)) { - saveCooldownPlayer(cooldownType, Bukkit.getServer().getOfflinePlayer(cooldownPlayerList.getUUID())); - } + for (CooldownPlayer cooldownPlayerList : getCooldownPlayersOrEmptyList(cooldownType)) { + saveCooldownPlayer(cooldownType, Bukkit.getServer().getOfflinePlayer(cooldownPlayerList.getUUID())); } } @@ -249,12 +224,10 @@ public class CooldownManager { if (cooldownType == CooldownType.Biome || cooldownType == CooldownType.Creation) { config = skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), - player.getUniqueId().toString() + ".yml")); + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/player-data"), player.getUniqueId().toString() + ".yml")); } else if (cooldownType == CooldownType.Levelling || cooldownType == CooldownType.Ownership) { config = skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), - player.getUniqueId().toString() + ".yml")); + .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), player.getUniqueId().toString() + ".yml")); } if (config != null) { @@ -267,19 +240,20 @@ public class CooldownManager { } public void addCooldownPlayer(CooldownType cooldownType, CooldownPlayer cooldownPlayer) { - if (cooldownType != null && cooldownPlayer != null) { - if (cooldownStorage.containsKey(cooldownType)) { - cooldownStorage.get(cooldownType).add(cooldownPlayer); - } - } + + if (cooldownType == null || cooldownPlayer == null) return; + + List cooldowns = cooldownStorage.get(cooldownType); + + if (cooldowns == null) return; + + cooldowns.add(cooldownPlayer); } public CooldownPlayer getCooldownPlayer(CooldownType cooldownType, OfflinePlayer player) { - if (cooldownStorage.containsKey(cooldownType)) { - for (CooldownPlayer cooldownPlayerList : cooldownStorage.get(cooldownType)) { - if (cooldownPlayerList.getUUID().equals(player.getUniqueId())) { - return cooldownPlayerList; - } + for (CooldownPlayer cooldownPlayerList : getCooldownPlayersOrEmptyList(cooldownType)) { + if (cooldownPlayerList.getUUID().equals(player.getUniqueId())) { + return cooldownPlayerList; } } @@ -287,14 +261,21 @@ public class CooldownManager { } public List getCooldownPlayers(CooldownType cooldownType) { - if (cooldownStorage.containsKey(cooldownType)) { - return cooldownStorage.get(cooldownType); - } + return cooldownStorage.get(cooldownType); + } - return null; + /** + * Convenience method. This method functions the same as + * {@link CooldownManager#getCooldownPlayers(CooldownType)} but returns a + * {@link Collections#emptyList()} when no value is present in the map under the + * key, cooldownType. + */ + public List getCooldownPlayersOrEmptyList(CooldownType cooldownType) { + return cooldownStorage.getOrDefault(cooldownType, Collections.emptyList()); } public boolean hasCooldownType(CooldownType cooldownType) { return cooldownStorage.containsKey(cooldownType); } + } diff --git a/src/main/java/com/songoda/skyblock/cooldown/CooldownTask.java b/src/main/java/com/songoda/skyblock/cooldown/CooldownTask.java index 757b0e29..d589492c 100644 --- a/src/main/java/com/songoda/skyblock/cooldown/CooldownTask.java +++ b/src/main/java/com/songoda/skyblock/cooldown/CooldownTask.java @@ -15,22 +15,22 @@ public class CooldownTask extends BukkitRunnable { @Override public void run() { - for (CooldownType cooldownTypeList : CooldownType.values()) { - if (cooldownManager.hasCooldownType(cooldownTypeList)) { - List cooldownPlayers = cooldownManager.getCooldownPlayers(cooldownTypeList); + for (CooldownType cooldownType : CooldownType.getTypes()) { + List cooldownPlayers = cooldownManager.getCooldownPlayers(cooldownType); - for (int i = 0; i < cooldownPlayers.size(); i++) { - CooldownPlayer cooldownPlayer = cooldownPlayers.get(i); - Cooldown cooldown = cooldownPlayer.getCooldown(); + if (cooldownPlayers == null) return; - cooldown.setTime(cooldown.getTime() - 1); + for (int i = 0; i < cooldownPlayers.size(); i++) { + CooldownPlayer cooldownPlayer = cooldownPlayers.get(i); + Cooldown cooldown = cooldownPlayer.getCooldown(); - if (cooldown.getTime() <= 0) { - cooldownManager.deletePlayer(cooldownTypeList, - Bukkit.getServer().getOfflinePlayer(cooldownPlayer.getUUID())); - } + cooldown.setTime(cooldown.getTime() - 1); + + if (cooldown.getTime() <= 0) { + cooldownManager.deletePlayer(cooldownType, Bukkit.getServer().getOfflinePlayer(cooldownPlayer.getUUID())); } } + } } } diff --git a/src/main/java/com/songoda/skyblock/cooldown/CooldownType.java b/src/main/java/com/songoda/skyblock/cooldown/CooldownType.java index 65379d21..f96010b4 100644 --- a/src/main/java/com/songoda/skyblock/cooldown/CooldownType.java +++ b/src/main/java/com/songoda/skyblock/cooldown/CooldownType.java @@ -1,7 +1,21 @@ package com.songoda.skyblock.cooldown; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Set; + public enum CooldownType { - Biome, Creation, Levelling, Ownership, Teleport + Biome, + Creation, + Levelling, + Ownership, + Teleport; + + private static final Set types = Collections.unmodifiableSet(EnumSet.allOf(CooldownType.class)); + + public static Set getTypes() { + return types; + } } diff --git a/src/main/java/com/songoda/skyblock/invite/InviteManager.java b/src/main/java/com/songoda/skyblock/invite/InviteManager.java index 5e2cb94c..97b4b2c8 100644 --- a/src/main/java/com/songoda/skyblock/invite/InviteManager.java +++ b/src/main/java/com/songoda/skyblock/invite/InviteManager.java @@ -18,22 +18,17 @@ public class InviteManager { public Invite createInvite(Player player, Player sender, UUID owner, int time) { Invite invite = new Invite(player, sender, owner, time); inviteStorage.put(player.getUniqueId(), invite); - return invite; } public void removeInvite(UUID uuid) { - if (hasInvite(uuid)) { - inviteStorage.remove(uuid); - } + inviteStorage.remove(uuid); } public void tranfer(UUID uuid1, UUID uuid2) { Map islandInvites = getInvites(); - for (UUID islandInviteList : islandInvites.keySet()) { - Invite invite = islandInvites.get(islandInviteList); - + for (Invite invite : islandInvites.values()) { if (invite.getOwnerUUID().equals(uuid1)) { invite.setOwnerUUID(uuid2); } @@ -45,11 +40,7 @@ public class InviteManager { } public Invite getInvite(UUID uuid) { - if (hasInvite(uuid)) { - return inviteStorage.get(uuid); - } - - return null; + return inviteStorage.get(uuid); } public boolean hasInvite(UUID uuid) { diff --git a/src/main/java/com/songoda/skyblock/island/Island.java b/src/main/java/com/songoda/skyblock/island/Island.java index 06a88f81..d9f3f47d 100644 --- a/src/main/java/com/songoda/skyblock/island/Island.java +++ b/src/main/java/com/songoda/skyblock/island/Island.java @@ -27,6 +27,7 @@ import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.Map.Entry; public class Island { @@ -104,7 +105,7 @@ public class Island { if (playerDataConfigLoad.getString("Island.Owner") == null || !playerDataConfigLoad.getString("Island.Owner").equals(ownerUUID.toString())) { - members.remove(member); + members.remove(i); } } @@ -122,7 +123,7 @@ public class Island { if (playerDataConfigLoad.getString("Island.Owner") == null || !playerDataConfigLoad.getString("Island.Owner").equals(ownerUUID.toString())) { - operators.remove(operator); + operators.remove(i); } } @@ -131,24 +132,21 @@ public class Island { Config settingsDataConfig = null; - if (fileManager.isFileExist(new File(skyblock.getDataFolder().toString() + "/setting-data", - getOwnerUUID().toString() + ".yml"))) { - settingsDataConfig = fileManager.getConfig(new File( - skyblock.getDataFolder().toString() + "/setting-data", getOwnerUUID().toString() + ".yml")); + File settingDataFile = new File(skyblock.getDataFolder().toString() + "/setting-data", getOwnerUUID().toString() + ".yml"); + + if (fileManager.isFileExist(settingDataFile)) { + settingsDataConfig = fileManager.getConfig(settingDataFile); } - for (IslandRole roleList : IslandRole.values()) { + for (IslandRole roleList : IslandRole.getRoles()) { List settings = new ArrayList<>(); - - for (String settingList : defaultSettingsConfig.getFileConfiguration() - .getConfigurationSection("Settings." + roleList.name()).getKeys(false)) { - if (settingsDataConfig == null || settingsDataConfig.getFileConfiguration() - .getString("Settings." + roleList.name() + "." + settingList) == null) { - settings.add(new IslandSetting(settingList, defaultSettingsConfig.getFileConfiguration() - .getBoolean("Settings." + roleList.name() + "." + settingList))); + + for (String settingList : defaultSettingsConfig.getFileConfiguration().getConfigurationSection("Settings." + roleList.name()).getKeys(false)) { + if (settingsDataConfig == null || settingsDataConfig.getFileConfiguration().getString("Settings." + roleList.name() + "." + settingList) == null) { + settings.add( + new IslandSetting(settingList, defaultSettingsConfig.getFileConfiguration().getBoolean("Settings." + roleList.name() + "." + settingList))); } else { - settings.add(new IslandSetting(settingList, settingsDataConfig.getFileConfiguration() - .getBoolean("Settings." + roleList.name() + "." + settingList))); + settings.add(new IslandSetting(settingList, settingsDataConfig.getFileConfiguration().getBoolean("Settings." + roleList.name() + "." + settingList))); } } @@ -167,13 +165,13 @@ public class Island { configLoad.set("Weather.Weather", mainConfigLoad.getString("Island.Weather.Default.Weather").toUpperCase()); configLoad.set("Ownership.Original", ownerUUID.toString()); - for (IslandRole roleList : IslandRole.values()) { - List settings = new ArrayList<>(); + for (IslandRole roleList : IslandRole.getRoles()) { - for (String settingList : defaultSettingsConfig.getFileConfiguration() - .getConfigurationSection("Settings." + roleList.name()).getKeys(false)) { - settings.add(new IslandSetting(settingList, defaultSettingsConfig.getFileConfiguration() - .getBoolean("Settings." + roleList.name() + "." + settingList))); + Set keys = defaultSettingsConfig.getFileConfiguration().getConfigurationSection("Settings." + roleList.name()).getKeys(false); + List settings = new ArrayList<>(keys.size()); + + for (String settingList : keys) { + settings.add(new IslandSetting(settingList, defaultSettingsConfig.getFileConfiguration().getBoolean("Settings." + roleList.name() + "." + settingList))); } islandSettings.put(roleList, settings); @@ -227,12 +225,8 @@ public class Island { } public UUID getOriginalOwnerUUID() { - return UUID - .fromString( - skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), - ownerUUID.toString() + ".yml")) - .getFileConfiguration().getString("Ownership.Original")); + return UUID.fromString(skyblock.getFileManager().getConfig(new File(new File(skyblock.getDataFolder().toString() + "/island-data"), ownerUUID.toString() + ".yml")) + .getFileConfiguration().getString("Ownership.Original")); } public int getSize() { @@ -772,9 +766,9 @@ public class Island { .getConfig(new File(skyblock.getDataFolder().toString() + "/setting-data", ownerUUID.toString() + ".yml")); FileConfiguration configLoad = config.getFileConfiguration(); - for (IslandRole roleList : islandSettings.keySet()) { - for (IslandSetting settingList : islandSettings.get(roleList)) { - configLoad.set("Settings." + roleList + "." + settingList.getName(), settingList.getStatus()); + for (Entry> entry : islandSettings.entrySet()) { + for (IslandSetting setting : entry.getValue()) { + configLoad.set("Settings." + entry.getKey() + "." + setting.getName(), setting.getStatus()); } } @@ -790,7 +784,7 @@ public class Island { .getConfig(new File(skyblock.getDataFolder().toString() + "/coop-data", ownerUUID.toString() + ".yml")); configLoad = config.getFileConfiguration(); - List coopPlayersAsString = new ArrayList<>(); + List coopPlayersAsString = new ArrayList<>(coopPlayers.size()); for (Map.Entry entry : coopPlayers.entrySet()) { if (entry.getValue() == IslandCoop.TEMP) continue; diff --git a/src/main/java/com/songoda/skyblock/island/IslandLevel.java b/src/main/java/com/songoda/skyblock/island/IslandLevel.java index 80f175ae..dba05c80 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandLevel.java +++ b/src/main/java/com/songoda/skyblock/island/IslandLevel.java @@ -2,12 +2,16 @@ package com.songoda.skyblock.island; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager.Config; + +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import java.util.UUID; public class IslandLevel { @@ -25,18 +29,25 @@ public class IslandLevel { this.skyblock = skyblock; this.ownerUUID = ownerUUID; - Config config = skyblock.getFileManager().getConfig( - new File(new File(skyblock.getDataFolder().toString() + "/level-data"), ownerUUID.toString() + ".yml")); + Config config = skyblock.getFileManager().getConfig(new File(new File(skyblock.getDataFolder().toString() + "/level-data"), ownerUUID.toString() + ".yml")); FileConfiguration configLoad = config.getFileConfiguration(); - Map materials = new HashMap<>(); + Map materials; - if (configLoad.getString("Levelling.Materials") != null) { - for (String materialList : configLoad.getConfigurationSection("Levelling.Materials").getKeys(false)) { - if (configLoad.getString("Levelling.Materials." + materialList + ".Amount") != null) { - materials.put(materialList, configLoad.getLong("Levelling.Materials." + materialList + ".Amount")); - } + ConfigurationSection materialSection = configLoad.getConfigurationSection("Leveling.Materials"); + + if (materialSection != null) { + Set keys = materialSection.getKeys(false); + materials = new HashMap<>(keys.size() * 2); + + for (String material : materialSection.getKeys(false)) { + + final ConfigurationSection current = materialSection.getConfigurationSection(material); + + if (current.isSet("Amount")) materials.put(material, current.getLong("Amount")); } + } else { + materials = new HashMap<>(); } this.materials = materials; @@ -50,18 +61,18 @@ public class IslandLevel { Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "levelling.yml")); FileConfiguration configLoad = config.getFileConfiguration(); + ConfigurationSection materialSection = configLoad.getConfigurationSection("Materials"); + + if (materialSection == null) return 0; + long pointsEarned = 0; - for (String materialList : this.materials.keySet()) { - long materialAmount = this.materials.get(materialList); + for (Entry entry : this.materials.entrySet()) { + ConfigurationSection current = materialSection.getConfigurationSection(entry.getKey()); - if (configLoad.getString("Materials." + materialList + ".Points") != null) { - long pointsRequired = config.getFileConfiguration().getLong("Materials." + materialList + ".Points"); + long pointsRequired = current.getLong("Points", 0); - if (pointsRequired != 0) { - pointsEarned = pointsEarned + (materialAmount * pointsRequired); - } - } + if (pointsRequired != 0) pointsEarned = pointsEarned + (entry.getValue() * pointsRequired); } return pointsEarned; @@ -71,26 +82,25 @@ public class IslandLevel { Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "levelling.yml")); FileConfiguration configLoad = config.getFileConfiguration(); - long pointsEarned = 0; + ConfigurationSection materialSection = configLoad.getConfigurationSection("Materials"); - if (this.materials.containsKey(material)) { - long materialAmount = this.materials.get(material); + if (materialSection == null) return 0; - if (configLoad.getString("Materials." + material + ".Points") != null) { - long pointsRequired = configLoad.getLong("Materials." + material + ".Points"); + ConfigurationSection current = materialSection.getConfigurationSection(material); - if (pointsRequired != 0) { - pointsEarned = materialAmount * pointsRequired; - } - } - } + if (current == null) return 0; - return pointsEarned; + Long boxedAmount = this.materials.get(material); + + if (boxedAmount == null) return 0; + + long pointsRequired = current.getLong("Points"); + + return pointsRequired == 0 ? 0 : boxedAmount * pointsRequired; } public long getLevel() { - long division = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")) - .getFileConfiguration().getLong("Island.Levelling.Division"); + long division = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getLong("Island.Levelling.Division"); if (division == 0) { division = 1; @@ -100,27 +110,19 @@ public class IslandLevel { } public void setMaterialAmount(String material, long amount) { - skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/level-data"), - ownerUUID.toString() + ".yml")) - .getFileConfiguration().set("Levelling.Materials." + material + ".Amount", amount); + skyblock.getFileManager().getConfig(new File(new File(skyblock.getDataFolder().toString() + "/level-data"), ownerUUID.toString() + ".yml")).getFileConfiguration() + .set("Levelling.Materials." + material + ".Amount", amount); this.materials.put(material, amount); } public long getMaterialAmount(String material) { - if (this.materials.containsKey(material)) { - return this.materials.get(material); - } - - return 0; + return this.materials.getOrDefault(material, 0l); } public void removeMaterial(String material) { - skyblock.getFileManager() - .getConfig(new File(new File(skyblock.getDataFolder().toString() + "/level-data"), - ownerUUID.toString() + ".yml")) - .getFileConfiguration().set("Levelling.Materials." + material, null); + skyblock.getFileManager().getConfig(new File(new File(skyblock.getDataFolder().toString() + "/level-data"), ownerUUID.toString() + ".yml")).getFileConfiguration() + .set("Levelling.Materials." + material, null); this.materials.remove(material); } @@ -138,8 +140,7 @@ public class IslandLevel { } public void setMaterials(Map materials) { - Config config = skyblock.getFileManager().getConfig( - new File(new File(skyblock.getDataFolder().toString() + "/level-data"), ownerUUID.toString() + ".yml")); + Config config = skyblock.getFileManager().getConfig(new File(new File(skyblock.getDataFolder().toString() + "/level-data"), ownerUUID.toString() + ".yml")); FileConfiguration configLoad = config.getFileConfiguration(); configLoad.set("Levelling.Materials", null); @@ -168,8 +169,7 @@ public class IslandLevel { } public void save() { - Config config = skyblock.getFileManager().getConfig( - new File(new File(skyblock.getDataFolder().toString() + "/level-data"), ownerUUID.toString() + ".yml")); + Config config = skyblock.getFileManager().getConfig(new File(new File(skyblock.getDataFolder().toString() + "/level-data"), ownerUUID.toString() + ".yml")); File configFile = config.getFile(); FileConfiguration configLoad = config.getFileConfiguration(); diff --git a/src/main/java/com/songoda/skyblock/island/IslandManager.java b/src/main/java/com/songoda/skyblock/island/IslandManager.java index 89765bc8..7682c017 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandManager.java +++ b/src/main/java/com/songoda/skyblock/island/IslandManager.java @@ -615,6 +615,7 @@ public class IslandManager { if (island.isDeleted()) return; island.save(); + int islandMembers = island.getRole(IslandRole.Member).size() + island.getRole(IslandRole.Operator).size() + 1, islandVisitors = getVisitorsAtIsland(island).size(); @@ -627,7 +628,7 @@ public class IslandManager { if (island.hasRole(IslandRole.Member, all.getUniqueId()) || island.hasRole(IslandRole.Operator, all.getUniqueId()) - || island.hasRole(IslandRole.Owner, all.getUniqueId())) { + || island.hasRole(IslandRole.Owner, all.getUniqueId()) || island.getCoopType(all.getUniqueId()) == IslandCoop.NORMAL) { if (scoreboardManager != null) { try { if (islandMembers == 1 && islandVisitors == 0) { @@ -1291,7 +1292,9 @@ public class IslandManager { for (UUID coopPlayerAtIslandList : getCoopPlayersAtIsland(island)) { Player targetPlayer = Bukkit.getServer().getPlayer(coopPlayerAtIslandList); - + + if(island.getCoopType(coopPlayerAtIslandList) == IslandCoop.NORMAL) continue; + if (targetPlayer != null) { LocationUtil.teleportPlayerToSpawn(targetPlayer); diff --git a/src/main/java/com/songoda/skyblock/island/IslandRole.java b/src/main/java/com/songoda/skyblock/island/IslandRole.java index d33c4bc9..84b40259 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandRole.java +++ b/src/main/java/com/songoda/skyblock/island/IslandRole.java @@ -1,7 +1,21 @@ package com.songoda.skyblock.island; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Set; + public enum IslandRole { - Coop, Visitor, Member, Operator, Owner + Coop, + Visitor, + Member, + Operator, + Owner; + + private static final Set roles = Collections.unmodifiableSet(EnumSet.allOf(IslandRole.class)); + + public static Set getRoles() { + return roles; + } } diff --git a/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java index 1c190bc8..773b200d 100644 --- a/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java +++ b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopBank.java @@ -27,9 +27,9 @@ public class TopBank extends DataCollector { @Override public List> requestAll() { - Map topLevels = new HashMap<>(); List leaderboards = skyblock.getLeaderboardManager().getLeaderboard(Type.Bank); + Map topLevels = new HashMap<>(leaderboards.size()); for (Leaderboard leaderboard : leaderboards) { Visit visit = leaderboard.getVisit(); diff --git a/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java index 93325596..19d110d5 100644 --- a/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java +++ b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopLevel.java @@ -26,9 +26,9 @@ public class TopLevel extends DataCollector { @Override public List> requestAll() { - Map topLevels = new HashMap<>(); List leaderboards = skyblock.getLeaderboardManager().getLeaderboard(Leaderboard.Type.Level); + Map topLevels = new HashMap<>(leaderboards.size()); for (int i = 0; i < leaderboards.size(); i++) { Leaderboard leaderboard = leaderboards.get(i); diff --git a/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java index 0b152305..64c388ec 100644 --- a/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java +++ b/src/main/java/com/songoda/skyblock/leaderboard/leaderheads/TopVotes.java @@ -27,10 +27,10 @@ public class TopVotes extends DataCollector { @Override public List> requestAll() { - Map topLevels = new HashMap<>(); - + List leaderboards = skyblock.getLeaderboardManager().getLeaderboard(Type.Votes); - + Map topLevels = new HashMap<>(leaderboards.size()); + for (int i = 0; i < leaderboards.size(); i++) { Leaderboard leaderboard = leaderboards.get(i); Visit visit = leaderboard.getVisit(); diff --git a/src/main/java/com/songoda/skyblock/limit/EnumLimitation.java b/src/main/java/com/songoda/skyblock/limit/EnumLimitation.java new file mode 100644 index 00000000..7a0b6781 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/limit/EnumLimitation.java @@ -0,0 +1,77 @@ +package com.songoda.skyblock.limit; + +import java.util.EnumMap; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import org.bukkit.configuration.ConfigurationSection; + +public abstract class EnumLimitation> implements Limitation { + + private long defaultLimit; + private final Class type; + private final Map map; + + public EnumLimitation(Class type) { + this.defaultLimit = -1; + this.map = new EnumMap<>(type); + this.type = type; + } + + public boolean isBeingTracked(Enum type) { + return map.containsKey(type) || getDefault() >= 0; + } + + protected Map getMap() { + return map; + } + + public long getDefault() { + return defaultLimit; + } + + public boolean hasTooMuch(long currentAmount, Enum type) { + final long cached = map.getOrDefault(type, getDefault()); + + if (cached <= -1) return false; + + return currentAmount > cached; + } + + @Override + public void reload(ConfigurationSection loadFrom) { + unload(); + + if (loadFrom == null) return; + + final Set keys = loadFrom.getKeys(false); + + removeAndLoadDefaultLimit(loadFrom, keys); + + for (String key : keys) { + + final String enumName = key.toUpperCase(Locale.ENGLISH); + + try { + map.put(Enum.valueOf(type, enumName), loadFrom.getLong(key)); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Incorrect enum constant '" + enumName + "' in " + loadFrom.getCurrentPath(), e); + } + + } + + } + + @Override + public void unload() { + map.clear(); + defaultLimit = -1; + } + + protected void removeAndLoadDefaultLimit(ConfigurationSection loadFrom, Set keys) { + keys.remove("DefaultLimit"); + defaultLimit = loadFrom.getInt("DefaultLimit", -1); + } + +} diff --git a/src/main/java/com/songoda/skyblock/limit/LimitManager.java b/src/main/java/com/songoda/skyblock/limit/LimitManager.java deleted file mode 100644 index e99fe007..00000000 --- a/src/main/java/com/songoda/skyblock/limit/LimitManager.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.songoda.skyblock.limit; - -import com.songoda.skyblock.SkyBlock; -import com.songoda.skyblock.island.Island; -import com.songoda.skyblock.island.IslandManager; -import com.songoda.skyblock.utils.version.Materials; -import org.bukkit.block.Block; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionAttachmentInfo; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -public class LimitManager { - - private final SkyBlock skyblock; - private Map blockLimits; - - public LimitManager(SkyBlock skyblock) { - this.skyblock = skyblock; - this.blockLimits = new HashMap<>(); - - this.reload(); - } - - public void reload() { - this.blockLimits.clear(); - - FileConfiguration limitsConfig = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "limits.yml")).getFileConfiguration(); - ConfigurationSection blockLimitSection = limitsConfig.getConfigurationSection("block"); - - if (blockLimitSection != null) { - for (String materialString : blockLimitSection.getKeys(false)) { - Materials material = Materials.fromString(materialString); - if (material != null) { - long limit = blockLimitSection.getLong(materialString); - this.blockLimits.put(material, limit); - } - } - } - } - - /** - * Gets the max number of a type of block a player can place - * - * @param player The player to check - * @param block The block to check - * @return The max number of the type of block the player can place - */ - public long getBlockLimit(Player player, Block block) { - if (player == null || block == null) - return -1; - - if (player.hasPermission("fabledskyblock.limit.block.*")) - return -1; - - Materials material = Materials.getMaterials(block.getType(), block.getData()); - if (material == null) - return -1; - - long limit = -1; - if (this.blockLimits.containsKey(material)) - limit = Math.max(limit, this.blockLimits.get(material)); - - Set permissions = player.getEffectivePermissions() - .stream() - .filter(x -> x.getPermission().toLowerCase().startsWith("fabledskyblock.limit.block." + material.name().toLowerCase())) - .collect(Collectors.toSet()); - - for (PermissionAttachmentInfo permission : permissions) { - try { - String permString = permission.getPermission(); - String numberString = permString.substring(permString.lastIndexOf(".") + 1); - if (numberString.equals("*")) - return -1; - - limit = Math.max(limit, Integer.parseInt(numberString)); - } catch (Exception ignored) { - } - } - - return limit; - } - - /** - * Checks if a player has exceeded the number of blocks they can place - * - * @param player The player to check - * @param block The block to check - * @return true if the player has exceeded the block limit, otherwise false - */ - public boolean isBlockLimitExceeded(Player player, Block block) { - IslandManager islandManager = this.skyblock.getIslandManager(); - - long limit = this.getBlockLimit(player, block); - if (limit == -1) - return false; - - Island island = islandManager.getIslandAtLocation(block.getLocation()); - long totalPlaced; - if (block.getType() == Materials.SPAWNER.parseMaterial()) { - totalPlaced = island.getLevel().getMaterials().entrySet().stream().filter(x -> x.getKey().contains("SPAWNER")).mapToLong(Map.Entry::getValue).sum(); - } else { - totalPlaced = island.getLevel().getMaterialAmount(Materials.getMaterials(block.getType(), block.getData()).name()); - } - - return limit < totalPlaced + 1; - } - -} diff --git a/src/main/java/com/songoda/skyblock/limit/Limitation.java b/src/main/java/com/songoda/skyblock/limit/Limitation.java new file mode 100644 index 00000000..3d554ca0 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/limit/Limitation.java @@ -0,0 +1,13 @@ +package com.songoda.skyblock.limit; + +import org.bukkit.configuration.ConfigurationSection; + +public interface Limitation { + + void unload(); + + void reload(ConfigurationSection loadFrom); + + String getSectionName(); + +} diff --git a/src/main/java/com/songoda/skyblock/limit/LimitationInstanceHandler.java b/src/main/java/com/songoda/skyblock/limit/LimitationInstanceHandler.java new file mode 100644 index 00000000..555478ea --- /dev/null +++ b/src/main/java/com/songoda/skyblock/limit/LimitationInstanceHandler.java @@ -0,0 +1,42 @@ +package com.songoda.skyblock.limit; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.configuration.Configuration; + +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.limit.impl.BlockLimitation; +import com.songoda.skyblock.limit.impl.EntityLimitaton; + +public final class LimitationInstanceHandler { + + private final Map, Limitation> instances; + + public LimitationInstanceHandler() { + this.instances = new HashMap<>(); + registerInstance(new EntityLimitaton()); + registerInstance(new BlockLimitation()); + reloadAll(); + } + + public T getInstance(Class type) { + return type.cast(instances.get(type)); + } + + public void registerInstance(Limitation instance) { + instances.put(instance.getClass(), instance); + } + + public void reloadAll() { + final SkyBlock instance = SkyBlock.getInstance(); + final Configuration config = instance.getFileManager().getConfig(new File(instance.getDataFolder(), "limits.yml")).getFileConfiguration(); + + for (Limitation limit : instances.values()) { + limit.reload(config.getConfigurationSection(limit.getSectionName())); + } + + } + +} diff --git a/src/main/java/com/songoda/skyblock/limit/impl/BlockLimitation.java b/src/main/java/com/songoda/skyblock/limit/impl/BlockLimitation.java new file mode 100644 index 00000000..00333724 --- /dev/null +++ b/src/main/java/com/songoda/skyblock/limit/impl/BlockLimitation.java @@ -0,0 +1,106 @@ +package com.songoda.skyblock.limit.impl; + +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.bukkit.block.Block; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionAttachmentInfo; + +import com.songoda.skyblock.SkyBlock; +import com.songoda.skyblock.island.Island; +import com.songoda.skyblock.island.IslandManager; +import com.songoda.skyblock.limit.EnumLimitation; +import com.songoda.skyblock.utils.version.Materials; + +public final class BlockLimitation extends EnumLimitation { + + public BlockLimitation() { + super(Materials.class); + } + + @Override + public String getSectionName() { + return "block"; + } + + @Override + public boolean hasTooMuch(long currentAmount, Enum type) { + throw new UnsupportedOperationException("Not implemented. Use getBlockLimit and isBlockLimitExceeded instead."); + } + + @Override + public void reload(ConfigurationSection loadFrom) { + unload(); + + if (loadFrom == null) return; + + final Set keys = loadFrom.getKeys(false); + + removeAndLoadDefaultLimit(loadFrom, keys); + + for (String key : keys) { + final String enumName = key.toUpperCase(Locale.ENGLISH); + final Materials type = Materials.fromString(enumName); + + if (type == null) throw new IllegalArgumentException("Unable to parse Materials from '" + enumName + "' in " + loadFrom.getCurrentPath()); + + getMap().put(type, loadFrom.getLong(key)); + } + + } + + @SuppressWarnings("deprecation") + public long getBlockLimit(Player player, Block block) { + if (player == null || block == null) return -1; + + if (player.hasPermission("fabledskyblock.limit.block.*")) return -1; + + final Materials material = Materials.getMaterials(block.getType(), block.getData()); + + if (material == null) return -1; + + long limit = getMap().getOrDefault(material, getDefault()); + + final String name = material.name().toLowerCase(); + + Set permissions = player.getEffectivePermissions().stream() + .filter(x -> x.getPermission().toLowerCase().startsWith("fabledskyblock.limit.block." + name)).collect(Collectors.toSet()); + + for (PermissionAttachmentInfo permission : permissions) { + try { + String permString = permission.getPermission(); + String numberString = permString.substring(permString.lastIndexOf(".") + 1); + if (numberString.equals("*")) return -1; + + limit = Math.max(limit, Integer.parseInt(numberString)); + } catch (Exception ignored) { + } + } + + return limit; + } + + @SuppressWarnings("deprecation") + public boolean isBlockLimitExceeded(Player player, Block block, long limit) { + + if (limit == -1) return false; + + final IslandManager islandManager = SkyBlock.getInstance().getIslandManager(); + final Island island = islandManager.getIslandAtLocation(block.getLocation()); + final long totalPlaced; + + if (block.getType() == Materials.SPAWNER.parseMaterial()) { + totalPlaced = island.getLevel().getMaterials().entrySet().stream().filter(x -> x.getKey().contains("SPAWNER")) + .mapToLong(Map.Entry::getValue).sum(); + } else { + totalPlaced = island.getLevel().getMaterialAmount(Materials.getMaterials(block.getType(), block.getData()).name()); + } + + return limit < totalPlaced + 1; + } + +} diff --git a/src/main/java/com/songoda/skyblock/limit/impl/EntityLimitaton.java b/src/main/java/com/songoda/skyblock/limit/impl/EntityLimitaton.java new file mode 100644 index 00000000..984e8b2e --- /dev/null +++ b/src/main/java/com/songoda/skyblock/limit/impl/EntityLimitaton.java @@ -0,0 +1,55 @@ +package com.songoda.skyblock.limit.impl; + +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; + +import com.songoda.skyblock.island.Island; +import com.songoda.skyblock.island.IslandEnvironment; +import com.songoda.skyblock.island.IslandWorld; +import com.songoda.skyblock.limit.EnumLimitation; + +public final class EntityLimitaton extends EnumLimitation { + + public EntityLimitaton() { + super(EntityType.class); + } + + public long getEntityCount(Island island, IslandWorld islandWorld, EntityType type) { + final Location islandLocation = island.getLocation(islandWorld, IslandEnvironment.Island); + final World world = islandLocation.getWorld(); + + final Location minLocation = new Location(world, islandLocation.getBlockX() - island.getRadius(), 0, + islandLocation.getBlockZ() - island.getRadius()); + final Location maxLocation = new Location(world, islandLocation.getBlockX() + island.getRadius(), world.getMaxHeight(), + islandLocation.getBlockZ() + island.getRadius()); + + final int minX = Math.min(maxLocation.getBlockX(), minLocation.getBlockX()); + final int minZ = Math.min(maxLocation.getBlockZ(), minLocation.getBlockZ()); + + final int maxX = Math.max(maxLocation.getBlockX(), minLocation.getBlockX()); + final int maxZ = Math.max(maxLocation.getBlockZ(), minLocation.getBlockZ()); + + int count = 0; + + for (int x = minX; x < maxX + 16; x += 16) { + for (int z = minZ; z < maxZ + 16; z += 16) { + final Chunk chunk = world.getChunkAt(x >> 4, z >> 4); + + for (Entity ent : chunk.getEntities()) { + if (ent.getType() == type) count++; + } + + } + } + return count; + } + + @Override + public String getSectionName() { + return "entity"; + } + +} diff --git a/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java index 0b19c20f..91ef9931 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -43,7 +43,7 @@ import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.island.IslandRole; import com.songoda.skyblock.island.IslandWorld; import com.songoda.skyblock.levelling.LevellingManager; -import com.songoda.skyblock.limit.LimitManager; +import com.songoda.skyblock.limit.impl.BlockLimitation; import com.songoda.skyblock.stackable.Stackable; import com.songoda.skyblock.stackable.StackableManager; import com.songoda.skyblock.utils.NumberUtil; @@ -74,14 +74,17 @@ public class Block implements Listener { if (!worldManager.isIslandWorld(block.getWorld())) return; IslandWorld world = worldManager.getIslandWorld(block.getWorld()); - Island island = islandManager.getIslandAtLocation(block.getLocation()); + + Location blockLocation = block.getLocation(); + + Island island = islandManager.getIslandAtLocation(blockLocation); if (island == null) { event.setCancelled(true); return; } - if (!islandManager.hasPermission(player, block.getLocation(), "Destroy")) { + if (!islandManager.hasPermission(player, blockLocation, "Destroy")) { event.setCancelled(true); skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) @@ -91,7 +94,7 @@ public class Block implements Listener { } if (stackableManager != null - && stackableManager.isStacked(block.getLocation())) { + && stackableManager.isStacked(blockLocation)) { Stackable stackable = stackableManager.getStack(block.getLocation(), block.getType()); if (stackable != null) { Material material = block.getType(); @@ -99,7 +102,7 @@ public class Block implements Listener { int droppedAmount = 0; if (event.getPlayer().isSneaking()) { - Location dropLoc = event.getBlock().getLocation().add(0.5, 0.5, 0.5); + Location dropLoc = blockLocation.clone().add(0.5, 0.5, 0.5); int count = stackable.getSize(); droppedAmount = count; while (count > 64) { @@ -110,7 +113,7 @@ public class Block implements Listener { block.setType(Material.AIR); stackable.setSize(0); } else { - block.getWorld().dropItemNaturally(block.getLocation().add(.5, 1, .5), new ItemStack(material, 1, data)); + block.getWorld().dropItemNaturally(blockLocation.clone().add(.5, 1, .5), new ItemStack(material, 1, data)); stackable.takeOne(); droppedAmount = 1; } @@ -247,15 +250,18 @@ public class Block implements Listener { } } - LimitManager limitManager = skyblock.getLimitManager(); - if (limitManager.isBlockLimitExceeded(player, block)) { + BlockLimitation limits = skyblock.getLimitationHandler().getInstance(BlockLimitation.class); + + long limit = limits.getBlockLimit(player, block); + + if (limits.isBlockLimitExceeded(player, block, limit)) { Materials material = Materials.getMaterials(block.getType(), block.getData()); skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) .getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))) - .replace("%limit", NumberUtil.formatNumber(limitManager.getBlockLimit(player, block)))); + .replace("%limit", NumberUtil.formatNumber(limit))); skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); event.setCancelled(true); diff --git a/src/main/java/com/songoda/skyblock/listeners/Entity.java b/src/main/java/com/songoda/skyblock/listeners/Entity.java index 4967ae3c..064c60af 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Entity.java +++ b/src/main/java/com/songoda/skyblock/listeners/Entity.java @@ -3,6 +3,7 @@ package com.songoda.skyblock.listeners; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -55,7 +56,6 @@ import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; -import com.google.common.collect.Sets; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager; import com.songoda.skyblock.config.FileManager.Config; @@ -65,6 +65,7 @@ import com.songoda.skyblock.island.IslandLevel; import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.island.IslandRole; import com.songoda.skyblock.island.IslandWorld; +import com.songoda.skyblock.limit.impl.EntityLimitaton; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.sound.SoundManager; import com.songoda.skyblock.stackable.StackableManager; @@ -77,691 +78,698 @@ import com.songoda.skyblock.world.WorldManager; public class Entity implements Listener { - private final SkyBlock skyblock; - - private Set preventFireTicks = new HashSet<>(); - - public Entity(SkyBlock skyblock) { - this.skyblock = skyblock; - } - - @EventHandler - public void onEntityDamage(EntityDamageEvent event) { - if (!(event.getEntity() instanceof Player)) { - return; - } - - Player player = (Player) event.getEntity(); - - FileManager fileManager = skyblock.getFileManager(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (event.getCause() != null) { - if (event.getCause() == DamageCause.VOID) { - return; - } else if (event.getCause() == DamageCause.ENTITY_ATTACK) { - EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event; - - if (entityDamageByEntityEvent.getDamager() != null - && entityDamageByEntityEvent.getDamager() instanceof Player) { - return; - } - } else { - if (NMSUtil.getVersionNumber() > 11) { - if (event.getCause() == DamageCause.valueOf("ENTITY_SWEEP_ATTACK")) { - EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event; - - if (entityDamageByEntityEvent.getDamager() != null - && entityDamageByEntityEvent.getDamager() instanceof Player) { - return; - } - } - } - } - } - - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (configLoad.getBoolean("Island.Settings.Damage.Enable")) { - if (!skyblock.getIslandManager().hasSetting(player.getLocation(), IslandRole.Owner, "Damage")) { - event.setCancelled(true); - } - } else if (!configLoad.getBoolean("Island.Damage.Enable")) { - event.setCancelled(true); - } - } - - // Fix a bug in minecraft where arrows with flame still apply fire ticks even if the shot entity isn't damaged - if (preventFireTicks.contains(player.getUniqueId()) && event.getCause() == DamageCause.FIRE_TICK) { - player.setFireTicks(0); - event.setCancelled(true); - } - } - - @EventHandler - public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { - MessageManager messageManager = skyblock.getMessageManager(); - IslandManager islandManager = skyblock.getIslandManager(); - SoundManager soundManager = skyblock.getSoundManager(); - FileManager fileManager = skyblock.getFileManager(); - - if (event.getDamager() instanceof Player) { - Player player = (Player) event.getDamager(); - org.bukkit.entity.Entity entity = event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { - if (entity instanceof Player) { - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { - event.setCancelled(true); - } - } else if (!configLoad.getBoolean("Island.PvP.Enable")) { - event.setCancelled(true); - } - } else if (entity instanceof ArmorStand) { - if (!islandManager.hasPermission(player, entity.getLocation(), "Destroy")) { - event.setCancelled(true); - - messageManager.sendMessage(player, - fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } else { - if (!islandManager.hasPermission(player, entity.getLocation(), "MobHurting")) { - event.setCancelled(true); - - messageManager.sendMessage(player, - fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - - return; - } - } - } - - return; - } - - if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof Player) { - Player player = (Player) ((Projectile) event.getDamager()).getShooter(); - org.bukkit.entity.Entity entity = event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { - if (event.getEntity() instanceof Player) { - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (entity.getType() == EntityType.ITEM_FRAME && !islandManager.hasPermission(player, entity.getLocation(), "HangingDestroy")) { - event.setCancelled(true); - return; - } - - if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { - event.setCancelled(true); - } - } else if (!configLoad.getBoolean("Island.PvP.Enable")) { - event.setCancelled(true); - } - } else { - if (!islandManager.hasPermission(player, entity.getLocation(), "MobHurting")) { - event.setCancelled(true); - - messageManager.sendMessage(player, - fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - - return; - } - } - } - } else if (event.getEntity() instanceof Player) { - Player player = (Player) event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - if (configLoad.getBoolean("Island.Settings.Damage.Enable")) { - if (!islandManager.hasSetting(player.getLocation(), IslandRole.Owner, "Damage") - || (event.getDamager() instanceof TNTPrimed && !islandManager - .hasSetting(player.getLocation(), IslandRole.Owner, "Explosions"))) { - event.setCancelled(true); - } - } else if (!configLoad.getBoolean("Island.Damage.Enable")) { - event.setCancelled(true); - } - } - } else if (event.getDamager() instanceof TNTPrimed) { - org.bukkit.entity.Entity entity = event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "Explosions")) { - event.setCancelled(true); - } - } - } - - // Fix a bug in minecraft where arrows with flame still apply fire ticks even if the shot entity isn't damaged - if (event.isCancelled() && event.getEntity() != null && event.getDamager() instanceof Arrow && ((Arrow) event.getDamager()).getShooter() instanceof Player) { - Arrow arrow = (Arrow) event.getDamager(); - if (arrow.getFireTicks() != 0) { - preventFireTicks.add(event.getEntity().getUniqueId()); - new BukkitRunnable() { - public void run() { - preventFireTicks.remove(event.getEntity().getUniqueId()); - } - }.runTaskLater(SkyBlock.getInstance(), 5L); - } - } - } - - @EventHandler - public void onPlayerShearEntity(PlayerShearEntityEvent event) { - Player player = event.getPlayer(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "Shearing")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - /** - * Checks that an entity is not targeting another entity on different islands. - * @author LimeGlass - */ - @EventHandler - public void onEntityTarget(EntityTargetEvent event) { - org.bukkit.entity.Entity entity = event.getEntity(); - WorldManager worldManager = skyblock.getWorldManager(); - if (!worldManager.isIslandWorld(entity.getWorld())) - return; - - org.bukkit.entity.Entity target = event.getTarget(); - // Somehow the target can be null, thanks Spigot. - if (target == null) - return; - - IslandManager islandManager = skyblock.getIslandManager(); - Island entityIsland = islandManager.getIslandAtLocation(entity.getLocation()); - Island targetIsland = islandManager.getIslandAtLocation(target.getLocation()); - // Event not related to Skyblock islands. - if (entityIsland == null && targetIsland == null) - return; - // One entity is on an island, and the other isn't. - if (entityIsland == null || targetIsland == null) { - event.setCancelled(true); - return; - } - // Both entities are on different islands. - if (!entityIsland.getIslandUUID().equals(targetIsland.getIslandUUID())) { - event.setCancelled(true); - return; - } - } - - @EventHandler - public void onStackableInteract(PlayerArmorStandManipulateEvent event) { - Player player = event.getPlayer(); - if (!skyblock.getIslandManager().hasPermission(player, event.getRightClicked().getLocation(), "ArmorStandUse")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - - if (NMSUtil.getVersionNumber() != 8) - return; - - StackableManager stackableManager = SkyBlock.getInstance().getStackableManager(); - if (stackableManager == null) - return; - - ArmorStand armorStand = event.getRightClicked(); - for (Location stackLocation : stackableManager.getStacks().keySet()) { - if (stackLocation.getWorld().equals(armorStand.getWorld()) && armorStand.getLocation().distanceSquared(stackLocation) <= 1.5) { - event.setCancelled(true); - return; - } - } - } - - @EventHandler - public void onHangingPlace(HangingPlaceEvent event) { - Player player = event.getPlayer(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), - "EntityPlacement")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onHangingBreak(HangingBreakEvent event) { - Hanging hanging = event.getEntity(); - - if (event.getCause() != RemoveCause.EXPLOSION) { - return; - } - - if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { - if (!skyblock.getIslandManager().hasSetting(hanging.getLocation(), IslandRole.Owner, "Explosions")) { - event.setCancelled(true); - } - } - } - - @EventHandler - public void onHangingBreak(HangingBreakByEntityEvent event) { - Hanging hanging = event.getEntity(); - - if (!(event.getRemover() instanceof Player)) { - return; - } - - Player player = (Player) event.getRemover(); - - if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onHangingInteract(PlayerInteractEntityEvent event) { - if (!(event.getRightClicked() instanceof Hanging)) { - return; - } - - Player player = event.getPlayer(); - Hanging hanging = (Hanging) event.getRightClicked(); - - if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onHangingRemoveItem(EntityDamageByEntityEvent event) { - if (!(event.getDamager() instanceof Player && event.getEntity() instanceof Hanging)) { - return; - } - - Player player = (Player) event.getDamager(); - Hanging hanging = (Hanging) event.getEntity(); - - if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - public void onEntityTaming(EntityTameEvent event) { - if (!(event.getOwner() instanceof Player)) { - return; - } - - Player player = (Player) event.getOwner(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "MobTaming")) { - event.setCancelled(true); - - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Settings.Permission.Message")); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - } - } - } - - @EventHandler - @SuppressWarnings("deprecation") - public void onEntityChangeBlock(EntityChangeBlockEvent event) { - org.bukkit.entity.Entity entity = event.getEntity(); - - if (entity instanceof Player) { - return; - } - - IslandManager islandManager = skyblock.getIslandManager(); - WorldManager worldManager = skyblock.getWorldManager(); - - Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); - - if (island == null || !skyblock.getWorldManager().isIslandWorld(entity.getWorld())) return; - - if (event.isCancelled()) return; - - Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); - FileConfiguration configLoad = config.getFileConfiguration(); - - IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); - - org.bukkit.block.Block block = event.getBlock(); - - // Check spawn block falling, this can be a bit glitchy, but it's better than nothing - if ((LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone().subtract(0, 1, 0)) - || LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Visitor).clone().subtract(0, 1, 0))) && - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - return; - } - - if ((event.getEntityType() == EntityType.FALLING_BLOCK) && LocationUtil.isLocationLocation(event.getBlock().getLocation(), - island.getLocation(world, IslandEnvironment.Main) - .clone()) - && configLoad.getBoolean("Island.Spawn.Protection")) { - FallingBlock fallingBlock = (FallingBlock) event.getEntity(); - if (fallingBlock.getDropItem()) { - if (NMSUtil.getVersionNumber() > 12) { - fallingBlock.getWorld().dropItemNaturally(fallingBlock.getLocation(), new ItemStack(fallingBlock.getBlockData().getMaterial(), 1)); - } else { - try { - Method getBlockDataMethod = FallingBlock.class.getMethod("getBlockData"); - byte data = (byte) getBlockDataMethod.invoke(fallingBlock); - if (fallingBlock.getMaterial().name().endsWith("ANVIL")) { - data = (byte) Math.ceil(data / 4.0); - } - fallingBlock.getWorld().dropItemNaturally(fallingBlock.getLocation(), new ItemStack(fallingBlock.getMaterial(), 1, data)); - } catch (Exception ignored) { - } - } - } - event.setCancelled(true); - } - - if (entity instanceof FallingBlock) - return; - - // Check entities interacting with spawn - if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world) && - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { - event.setCancelled(true); - return; - } - - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "MobGriefing")) { - event.setCancelled(true); - } - - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")) - .getFileConfiguration().getBoolean("Island.Block.Level.Enable")) return; - - Materials materials = Materials.getMaterials(block.getType(), block.getData()); - - if (materials != null) { - IslandLevel level = island.getLevel(); - - if (level.hasMaterial(materials.name())) { - long materialAmount = level.getMaterialAmount(materials.name()); - - if (materialAmount - 1 <= 0) { - level.removeMaterial(materials.name()); - } else { - level.setMaterialAmount(materials.name(), materialAmount - 1); - } - } - } - - if (event.getTo() != null && event.getTo() != Material.AIR) { - materials = null; - - if (NMSUtil.getVersionNumber() > 12) { - materials = Materials.fromString(event.getTo().name()); - } else { - try { - materials = Materials.requestMaterials(event.getTo().name(), - (byte) event.getClass().getMethod("getData").invoke(event)); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException - | NoSuchMethodException | SecurityException e) { - e.printStackTrace(); - } - } - - if (materials != null) { - long materialAmount = 0; - IslandLevel level = island.getLevel(); - - if (level.hasMaterial(materials.name())) { - materialAmount = level.getMaterialAmount(materials.name()); - } - - level.setMaterialAmount(materials.name(), materialAmount + 1); - } - } - - } - - @EventHandler - public void onEntityExplode(EntityExplodeEvent event) { - org.bukkit.entity.Entity entity = event.getEntity(); - - WorldManager worldManager = skyblock.getWorldManager(); - IslandManager islandManager = skyblock.getIslandManager(); - - if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { - if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "Explosions")) { - event.setCancelled(true); - } - - if (!event.isCancelled()) { - Island island = islandManager.getIslandAtLocation(entity.getLocation()); - - if (island != null) { - if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")) - .getFileConfiguration().getBoolean("Island.Block.Level.Enable")) { - for (org.bukkit.block.Block blockList : event.blockList()) { - @SuppressWarnings("deprecation") - Materials materials = Materials.getMaterials(blockList.getType(), blockList.getData()); - - if (materials != null) { - IslandLevel level = island.getLevel(); - - if (level.hasMaterial(materials.name())) { - long materialAmount = level.getMaterialAmount(materials.name()); - - if (materialAmount - 1 <= 0) { - level.removeMaterial(materials.name()); - } else { - level.setMaterialAmount(materials.name(), materialAmount - 1); - } - } - } - } - } - - if (SkyBlock.getInstance().getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { - IslandWorld world = worldManager.getIslandWorld(event.getEntity().getWorld()); - for (org.bukkit.block.Block block : event.blockList()) { - if (LocationUtil.isLocationLocation(block.getLocation(), - island.getLocation(world, IslandEnvironment.Main) - .clone() - .subtract(0.0D, 1.0D, 0.0D))) { - event.blockList().remove(block); - break; - } - } - } - } - } - } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onEntityDeath(EntityDeathEvent event) { - LivingEntity livingEntity = event.getEntity(); - - // Certain entities shouldn't drop twice the amount - if (livingEntity instanceof Player - || livingEntity instanceof ArmorStand - || livingEntity instanceof Horse) { - return; - } - - if (NMSUtil.getVersionNumber() > 9) { - if (livingEntity instanceof Donkey || livingEntity instanceof Mule || livingEntity instanceof ElderGuardian) - return; - } - - if (NMSUtil.getVersionNumber() > 10) { - if (livingEntity instanceof Evoker) - return; - } - - if (NMSUtil.getVersionNumber() > 13) { - if (livingEntity instanceof Ravager || livingEntity instanceof Illager) - return; - } - - if (livingEntity.hasMetadata("SkyBlock")) - return; - - IslandManager islandManager = skyblock.getIslandManager(); - - if (skyblock.getWorldManager().isIslandWorld(livingEntity.getWorld())) { - Island island = islandManager.getIslandAtLocation(livingEntity.getLocation()); - - if (island != null) { - List upgrades = skyblock.getUpgradeManager().getUpgrades(Upgrade.Type.Drops); - - if (upgrades != null && upgrades.size() > 0 && upgrades.get(0).isEnabled() && island.isUpgrade(Upgrade.Type.Drops)) { - Set dontMultiply = new HashSet<>(); - - if (NMSUtil.getVersionNumber() > 8) { - EntityEquipment equipment = livingEntity.getEquipment(); - if (equipment != null) { - for (ItemStack item : event.getDrops()) { - if (item.equals(equipment.getHelmet()) - || item.equals(equipment.getChestplate()) - || item.equals(equipment.getLeggings()) - || item.equals(equipment.getBoots()) - || item.equals(equipment.getItemInMainHand()) - || item.equals(equipment.getItemInOffHand())) { - dontMultiply.add(item); - } - } - } - - if (livingEntity instanceof Pig) { - Pig pig = (Pig) livingEntity; - if (pig.hasSaddle()) - dontMultiply.add(new ItemStack(Material.SADDLE, 1)); - } - } - - for (ItemStack is : event.getDrops()) - if (!dontMultiply.contains(is)) - livingEntity.getWorld().dropItemNaturally(livingEntity.getLocation(), is); - } - } - } - } - - @EventHandler - public void onEntityTargetLivingEntity(EntityTargetLivingEntityEvent event) { - if (!(event.getTarget() instanceof Player)) { - return; - } - - if (!(event.getEntity() instanceof ExperienceOrb)) { - return; - } - - Player player = (Player) event.getTarget(); - - if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { - if (!skyblock.getIslandManager().hasPermission(player, "ExperienceOrbPickup")) { - event.setTarget(null); - event.setCancelled(true); - } - } - } - - @SuppressWarnings("deprecation") - @EventHandler - public void onCreatureSpawn(CreatureSpawnEvent event) { - LivingEntity entity = event.getEntity(); - if (entity instanceof ArmorStand) - return; - if (entity.hasMetadata("SkyBlock")) - return; - - SpawnReason reason = event.getSpawnReason(); - Set reasons = Sets.newHashSet(SpawnReason.NATURAL, SpawnReason.JOCKEY, SpawnReason.MOUNT, getSpawnReason("RAID"), getSpawnReason("PATROL")); - // Check that the reason of this event is not any of these above. - if (!reasons.stream().filter(r -> r != null).anyMatch(r -> r == reason)) - return; - - if (!skyblock.getWorldManager().isIslandWorld(entity.getWorld())) - return; - if (skyblock.getIslandManager().hasSetting(entity.getLocation(), IslandRole.Owner, "NaturalMobSpawning")) - return; - if (event.getSpawnReason() != SpawnReason.JOCKEY && event.getSpawnReason() != SpawnReason.MOUNT) { - entity.remove(); // Older versions ignore the event being cancelled, so this fixes that issue. - return; - } - Bukkit.getScheduler().scheduleSyncDelayedTask(skyblock, () -> { - if (NMSUtil.getVersionNumber() > 10) { // getPassengers() was added in 1.11 - for (org.bukkit.entity.Entity passenger : entity.getPassengers()) - passenger.remove(); - } else { - if (entity.getPassenger() != null) - entity.getPassenger().remove(); - } - entity.remove(); - }); - event.setCancelled(true); // For other plugin API reasons. - } - - private SpawnReason getSpawnReason(String reason) { - try { - return SpawnReason.valueOf(reason); - } catch (Exception e) { - return null; - } - } + private final SkyBlock skyblock; + + private Set preventFireTicks = new HashSet<>(); + + public Entity(SkyBlock skyblock) { + this.skyblock = skyblock; + } + + @EventHandler + public void onEntityDamage(EntityDamageEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + + Player player = (Player) event.getEntity(); + + FileManager fileManager = skyblock.getFileManager(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (event.getCause() != null) { + if (event.getCause() == DamageCause.VOID) { + return; + } else if (event.getCause() == DamageCause.ENTITY_ATTACK) { + EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event; + + if (entityDamageByEntityEvent.getDamager() != null && entityDamageByEntityEvent.getDamager() instanceof Player) { + return; + } + } else { + if (NMSUtil.getVersionNumber() > 11) { + if (event.getCause() == DamageCause.valueOf("ENTITY_SWEEP_ATTACK")) { + EntityDamageByEntityEvent entityDamageByEntityEvent = (EntityDamageByEntityEvent) event; + + if (entityDamageByEntityEvent.getDamager() != null && entityDamageByEntityEvent.getDamager() instanceof Player) { + return; + } + } + } + } + } + + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (configLoad.getBoolean("Island.Settings.Damage.Enable")) { + if (!skyblock.getIslandManager().hasSetting(player.getLocation(), IslandRole.Owner, "Damage")) { + event.setCancelled(true); + } + } else if (!configLoad.getBoolean("Island.Damage.Enable")) { + event.setCancelled(true); + } + } + + // Fix a bug in minecraft where arrows with flame still apply fire ticks even if + // the shot entity isn't damaged + if (preventFireTicks.contains(player.getUniqueId()) && event.getCause() == DamageCause.FIRE_TICK) { + player.setFireTicks(0); + event.setCancelled(true); + } + } + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + MessageManager messageManager = skyblock.getMessageManager(); + IslandManager islandManager = skyblock.getIslandManager(); + SoundManager soundManager = skyblock.getSoundManager(); + FileManager fileManager = skyblock.getFileManager(); + + if (event.getDamager() instanceof Player) { + Player player = (Player) event.getDamager(); + org.bukkit.entity.Entity entity = event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { + if (entity instanceof Player) { + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { + event.setCancelled(true); + } + } else if (!configLoad.getBoolean("Island.PvP.Enable")) { + event.setCancelled(true); + } + } else if (entity instanceof ArmorStand) { + if (!islandManager.hasPermission(player, entity.getLocation(), "Destroy")) { + event.setCancelled(true); + + messageManager.sendMessage(player, fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } else { + if (!islandManager.hasPermission(player, entity.getLocation(), "MobHurting")) { + event.setCancelled(true); + + messageManager.sendMessage(player, fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + + return; + } + } + } + + return; + } + + if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof Player) { + Player player = (Player) ((Projectile) event.getDamager()).getShooter(); + org.bukkit.entity.Entity entity = event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { + if (event.getEntity() instanceof Player) { + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (entity.getType() == EntityType.ITEM_FRAME && !islandManager.hasPermission(player, entity.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + return; + } + + if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { + event.setCancelled(true); + } + } else if (!configLoad.getBoolean("Island.PvP.Enable")) { + event.setCancelled(true); + } + } else { + if (!islandManager.hasPermission(player, entity.getLocation(), "MobHurting")) { + event.setCancelled(true); + + messageManager.sendMessage(player, fileManager.getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + soundManager.playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + + return; + } + } + } + } else if (event.getEntity() instanceof Player) { + Player player = (Player) event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + if (configLoad.getBoolean("Island.Settings.Damage.Enable")) { + if (!islandManager.hasSetting(player.getLocation(), IslandRole.Owner, "Damage") || (event.getDamager() instanceof TNTPrimed + && !islandManager.hasSetting(player.getLocation(), IslandRole.Owner, "Explosions"))) { + event.setCancelled(true); + } + } else if (!configLoad.getBoolean("Island.Damage.Enable")) { + event.setCancelled(true); + } + } + } else if (event.getDamager() instanceof TNTPrimed) { + org.bukkit.entity.Entity entity = event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "Explosions")) { + event.setCancelled(true); + } + } + } + + // Fix a bug in minecraft where arrows with flame still apply fire ticks even if + // the shot entity isn't damaged + if (event.isCancelled() && event.getEntity() != null && event.getDamager() instanceof Arrow + && ((Arrow) event.getDamager()).getShooter() instanceof Player) { + Arrow arrow = (Arrow) event.getDamager(); + if (arrow.getFireTicks() != 0) { + preventFireTicks.add(event.getEntity().getUniqueId()); + new BukkitRunnable() { + public void run() { + preventFireTicks.remove(event.getEntity().getUniqueId()); + } + }.runTaskLater(SkyBlock.getInstance(), 5L); + } + } + } + + @EventHandler + public void onPlayerShearEntity(PlayerShearEntityEvent event) { + Player player = event.getPlayer(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "Shearing")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() + .getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + /** + * Checks that an entity is not targeting another entity on different islands. + * + * @author LimeGlass + */ + @EventHandler + public void onEntityTarget(EntityTargetEvent event) { + org.bukkit.entity.Entity entity = event.getEntity(); + WorldManager worldManager = skyblock.getWorldManager(); + if (!worldManager.isIslandWorld(entity.getWorld())) return; + + org.bukkit.entity.Entity target = event.getTarget(); + // Somehow the target can be null, thanks Spigot. + if (target == null) return; + + IslandManager islandManager = skyblock.getIslandManager(); + Island entityIsland = islandManager.getIslandAtLocation(entity.getLocation()); + Island targetIsland = islandManager.getIslandAtLocation(target.getLocation()); + // Event not related to Skyblock islands. + if (entityIsland == null && targetIsland == null) return; + // One entity is on an island, and the other isn't. + if (entityIsland == null || targetIsland == null) { + event.setCancelled(true); + return; + } + // Both entities are on different islands. + if (!entityIsland.getIslandUUID().equals(targetIsland.getIslandUUID())) { + event.setCancelled(true); + return; + } + } + + @EventHandler + public void onStackableInteract(PlayerArmorStandManipulateEvent event) { + Player player = event.getPlayer(); + if (!skyblock.getIslandManager().hasPermission(player, event.getRightClicked().getLocation(), "ArmorStandUse")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + + if (NMSUtil.getVersionNumber() != 8) return; + + StackableManager stackableManager = SkyBlock.getInstance().getStackableManager(); + if (stackableManager == null) return; + + ArmorStand armorStand = event.getRightClicked(); + for (Location stackLocation : stackableManager.getStacks().keySet()) { + if (stackLocation.getWorld().equals(armorStand.getWorld()) && armorStand.getLocation().distanceSquared(stackLocation) <= 1.5) { + event.setCancelled(true); + return; + } + } + } + + @EventHandler + public void onHangingPlace(HangingPlaceEvent event) { + Player player = event.getPlayer(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "EntityPlacement")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() + .getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onHangingBreak(HangingBreakEvent event) { + Hanging hanging = event.getEntity(); + + if (event.getCause() != RemoveCause.EXPLOSION) { + return; + } + + if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { + if (!skyblock.getIslandManager().hasSetting(hanging.getLocation(), IslandRole.Owner, "Explosions")) { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onHangingBreak(HangingBreakByEntityEvent event) { + Hanging hanging = event.getEntity(); + + if (!(event.getRemover() instanceof Player)) { + return; + } + + Player player = (Player) event.getRemover(); + + if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() + .getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onHangingInteract(PlayerInteractEntityEvent event) { + if (!(event.getRightClicked() instanceof Hanging)) { + return; + } + + Player player = event.getPlayer(); + Hanging hanging = (Hanging) event.getRightClicked(); + + if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() + .getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onHangingRemoveItem(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player && event.getEntity() instanceof Hanging)) { + return; + } + + Player player = (Player) event.getDamager(); + Hanging hanging = (Hanging) event.getEntity(); + + if (skyblock.getWorldManager().isIslandWorld(hanging.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, hanging.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() + .getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + public void onEntityTaming(EntityTameEvent event) { + if (!(event.getOwner() instanceof Player)) { + return; + } + + Player player = (Player) event.getOwner(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, event.getEntity().getLocation(), "MobTaming")) { + event.setCancelled(true); + + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")).getFileConfiguration() + .getString("Island.Settings.Permission.Message")); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + } + } + } + + @EventHandler + @SuppressWarnings("deprecation") + public void onEntityChangeBlock(EntityChangeBlockEvent event) { + org.bukkit.entity.Entity entity = event.getEntity(); + + if (entity instanceof Player) { + return; + } + + IslandManager islandManager = skyblock.getIslandManager(); + WorldManager worldManager = skyblock.getWorldManager(); + + Island island = islandManager.getIslandAtLocation(event.getBlock().getLocation()); + + if (island == null || !skyblock.getWorldManager().isIslandWorld(entity.getWorld())) return; + + if (event.isCancelled()) return; + + Config config = skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")); + FileConfiguration configLoad = config.getFileConfiguration(); + + IslandWorld world = worldManager.getIslandWorld(event.getBlock().getWorld()); + + org.bukkit.block.Block block = event.getBlock(); + + // Check spawn block falling, this can be a bit glitchy, but it's better than + // nothing + if ((LocationUtil.isLocationLocation(block.getLocation(), island.getLocation(world, IslandEnvironment.Main).clone().subtract(0, 1, 0)) + || LocationUtil.isLocationLocation(block.getLocation(), + island.getLocation(world, IslandEnvironment.Visitor).clone().subtract(0, 1, 0))) + && skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() + .getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + return; + } + + if ((event.getEntityType() == EntityType.FALLING_BLOCK) + && LocationUtil.isLocationLocation(event.getBlock().getLocation(), island.getLocation(world, IslandEnvironment.Main).clone()) + && configLoad.getBoolean("Island.Spawn.Protection")) { + FallingBlock fallingBlock = (FallingBlock) event.getEntity(); + if (fallingBlock.getDropItem()) { + if (NMSUtil.getVersionNumber() > 12) { + fallingBlock.getWorld().dropItemNaturally(fallingBlock.getLocation(), + new ItemStack(fallingBlock.getBlockData().getMaterial(), 1)); + } else { + try { + Method getBlockDataMethod = FallingBlock.class.getMethod("getBlockData"); + byte data = (byte) getBlockDataMethod.invoke(fallingBlock); + if (fallingBlock.getMaterial().name().endsWith("ANVIL")) { + data = (byte) Math.ceil(data / 4.0); + } + fallingBlock.getWorld().dropItemNaturally(fallingBlock.getLocation(), new ItemStack(fallingBlock.getMaterial(), 1, data)); + } catch (Exception ignored) { + } + } + } + event.setCancelled(true); + } + + if (entity instanceof FallingBlock) return; + + // Check entities interacting with spawn + if (LocationUtil.isLocationAffectingIslandSpawn(block.getLocation(), island, world) && skyblock.getFileManager() + .getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) { + event.setCancelled(true); + return; + } + + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "MobGriefing")) { + event.setCancelled(true); + } + + if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() + .getBoolean("Island.Block.Level.Enable")) + return; + + Materials materials = Materials.getMaterials(block.getType(), block.getData()); + + if (materials != null) { + IslandLevel level = island.getLevel(); + + if (level.hasMaterial(materials.name())) { + long materialAmount = level.getMaterialAmount(materials.name()); + + if (materialAmount - 1 <= 0) { + level.removeMaterial(materials.name()); + } else { + level.setMaterialAmount(materials.name(), materialAmount - 1); + } + } + } + + if (event.getTo() != null && event.getTo() != Material.AIR) { + materials = null; + + if (NMSUtil.getVersionNumber() > 12) { + materials = Materials.fromString(event.getTo().name()); + } else { + try { + materials = Materials.requestMaterials(event.getTo().name(), (byte) event.getClass().getMethod("getData").invoke(event)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException + | SecurityException e) { + e.printStackTrace(); + } + } + + if (materials != null) { + long materialAmount = 0; + IslandLevel level = island.getLevel(); + + if (level.hasMaterial(materials.name())) { + materialAmount = level.getMaterialAmount(materials.name()); + } + + level.setMaterialAmount(materials.name(), materialAmount + 1); + } + } + + } + + @EventHandler + public void onEntityExplode(EntityExplodeEvent event) { + org.bukkit.entity.Entity entity = event.getEntity(); + + WorldManager worldManager = skyblock.getWorldManager(); + IslandManager islandManager = skyblock.getIslandManager(); + + if (skyblock.getWorldManager().isIslandWorld(entity.getWorld())) { + if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "Explosions")) { + event.setCancelled(true); + } + + if (!event.isCancelled()) { + Island island = islandManager.getIslandAtLocation(entity.getLocation()); + + if (island != null) { + if (skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() + .getBoolean("Island.Block.Level.Enable")) { + for (org.bukkit.block.Block blockList : event.blockList()) { + @SuppressWarnings("deprecation") + Materials materials = Materials.getMaterials(blockList.getType(), blockList.getData()); + + if (materials != null) { + IslandLevel level = island.getLevel(); + + if (level.hasMaterial(materials.name())) { + long materialAmount = level.getMaterialAmount(materials.name()); + + if (materialAmount - 1 <= 0) { + level.removeMaterial(materials.name()); + } else { + level.setMaterialAmount(materials.name(), materialAmount - 1); + } + } + } + } + } + + if (SkyBlock.getInstance().getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration() + .getBoolean("Island.Spawn.Protection")) { + IslandWorld world = worldManager.getIslandWorld(event.getEntity().getWorld()); + for (org.bukkit.block.Block block : event.blockList()) { + if (LocationUtil.isLocationLocation(block.getLocation(), + island.getLocation(world, IslandEnvironment.Main).clone().subtract(0.0D, 1.0D, 0.0D))) { + event.blockList().remove(block); + break; + } + } + } + } + } + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEntityDeath(EntityDeathEvent event) { + LivingEntity livingEntity = event.getEntity(); + + // Certain entities shouldn't drop twice the amount + if (livingEntity instanceof Player || livingEntity instanceof ArmorStand || livingEntity instanceof Horse) { + return; + } + + if (NMSUtil.getVersionNumber() > 9) { + if (livingEntity instanceof Donkey || livingEntity instanceof Mule || livingEntity instanceof ElderGuardian) return; + } + + if (NMSUtil.getVersionNumber() > 10) { + if (livingEntity instanceof Evoker) return; + } + + if (NMSUtil.getVersionNumber() > 13) { + if (livingEntity instanceof Ravager || livingEntity instanceof Illager) return; + } + + if (livingEntity.hasMetadata("SkyBlock")) return; + + IslandManager islandManager = skyblock.getIslandManager(); + + if (skyblock.getWorldManager().isIslandWorld(livingEntity.getWorld())) { + Island island = islandManager.getIslandAtLocation(livingEntity.getLocation()); + + if (island != null) { + List upgrades = skyblock.getUpgradeManager().getUpgrades(Upgrade.Type.Drops); + + if (upgrades != null && upgrades.size() > 0 && upgrades.get(0).isEnabled() && island.isUpgrade(Upgrade.Type.Drops)) { + Set dontMultiply = new HashSet<>(); + + if (NMSUtil.getVersionNumber() > 8) { + EntityEquipment equipment = livingEntity.getEquipment(); + if (equipment != null) { + for (ItemStack item : event.getDrops()) { + if (item.equals(equipment.getHelmet()) || item.equals(equipment.getChestplate()) + || item.equals(equipment.getLeggings()) || item.equals(equipment.getBoots()) + || item.equals(equipment.getItemInMainHand()) || item.equals(equipment.getItemInOffHand())) { + dontMultiply.add(item); + } + } + } + + if (livingEntity instanceof Pig) { + Pig pig = (Pig) livingEntity; + if (pig.hasSaddle()) dontMultiply.add(new ItemStack(Material.SADDLE, 1)); + } + } + + for (ItemStack is : event.getDrops()) + if (!dontMultiply.contains(is)) livingEntity.getWorld().dropItemNaturally(livingEntity.getLocation(), is); + } + } + } + } + + @EventHandler + public void onEntityTargetLivingEntity(EntityTargetLivingEntityEvent event) { + if (!(event.getTarget() instanceof Player)) { + return; + } + + if (!(event.getEntity() instanceof ExperienceOrb)) { + return; + } + + Player player = (Player) event.getTarget(); + + if (skyblock.getWorldManager().isIslandWorld(player.getWorld())) { + if (!skyblock.getIslandManager().hasPermission(player, "ExperienceOrbPickup")) { + event.setTarget(null); + event.setCancelled(true); + } + } + } + + private static final Set CHECKED_REASONS; + + static { + CHECKED_REASONS = EnumSet.of(SpawnReason.NATURAL, SpawnReason.JOCKEY, SpawnReason.MOUNT); + + final SpawnReason raid = getSpawnReason("RAID"); + final SpawnReason patrol = getSpawnReason("PATROL"); + + if (patrol != null) CHECKED_REASONS.add(patrol); + if (raid != null) CHECKED_REASONS.add(raid); + + } + + @SuppressWarnings("deprecation") + @EventHandler + public void onCreatureSpawn(CreatureSpawnEvent event) { + LivingEntity entity = event.getEntity(); + if (entity instanceof ArmorStand) return; + if (entity.hasMetadata("SkyBlock")) return; + + Location entityLocation = entity.getLocation(); + + Island island = skyblock.getIslandManager().getIslandAtLocation(entityLocation); + + if (island == null) return; + + EntityLimitaton limits = skyblock.getLimitationHandler().getInstance(EntityLimitaton.class); + EntityType type = entity.getType(); + + if (limits.isBeingTracked(type)) { + long count = limits.getEntityCount(island, skyblock.getWorldManager().getIslandWorld(entityLocation.getWorld()), type); + + if (limits.hasTooMuch(count + 1, type)) { + entity.remove(); + event.setCancelled(true); + return; + } + + } + + SpawnReason spawnReason = event.getSpawnReason(); + + if (!CHECKED_REASONS.contains(spawnReason)) return; + + if (!skyblock.getWorldManager().isIslandWorld(entity.getWorld())) return; + if (skyblock.getIslandManager().hasSetting(entityLocation, IslandRole.Owner, "NaturalMobSpawning")) return; + if (spawnReason != SpawnReason.JOCKEY && spawnReason != SpawnReason.MOUNT) { + entity.remove(); // Older versions ignore the event being cancelled, so this fixes that issue. + return; + } + Bukkit.getScheduler().scheduleSyncDelayedTask(skyblock, () -> { + if (NMSUtil.getVersionNumber() > 10) { // getPassengers() was added in 1.11 + for (org.bukkit.entity.Entity passenger : entity.getPassengers()) + passenger.remove(); + } else { + if (entity.getPassenger() != null) entity.getPassenger().remove(); + } + entity.remove(); + }); + event.setCancelled(true); // For other plugin API reasons. + } + + private static SpawnReason getSpawnReason(String reason) { + try { + return SpawnReason.valueOf(reason); + } catch (Exception e) { + return null; + } + } } diff --git a/src/main/java/com/songoda/skyblock/listeners/Interact.java b/src/main/java/com/songoda/skyblock/listeners/Interact.java index cb231173..b1d0feb2 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Interact.java +++ b/src/main/java/com/songoda/skyblock/listeners/Interact.java @@ -7,7 +7,7 @@ import com.songoda.skyblock.island.IslandLevel; import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.island.IslandWorld; import com.songoda.skyblock.levelling.LevellingManager; -import com.songoda.skyblock.limit.LimitManager; +import com.songoda.skyblock.limit.impl.BlockLimitation; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.sound.SoundManager; import com.songoda.skyblock.stackable.Stackable; @@ -157,21 +157,24 @@ public class Interact implements Listener { return; } - LimitManager limitManager = skyblock.getLimitManager(); - if (limitManager.isBlockLimitExceeded(player, block)) { - Materials material = Materials.getMaterials(block.getType(), block.getData()); + BlockLimitation limits = skyblock.getLimitationHandler().getInstance(BlockLimitation.class); + + long limit = limits.getBlockLimit(player, block); + + if (limits.isBlockLimitExceeded(player, block, limit)) { + Materials material = Materials.getMaterials(block.getType(), block.getData()); - skyblock.getMessageManager().sendMessage(player, - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") - .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))) - .replace("%limit", NumberUtil.formatNumber(limitManager.getBlockLimit(player, block)))); - skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); + skyblock.getMessageManager().sendMessage(player, + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Island.Limit.Block.Exceeded.Message") + .replace("%type", WordUtils.capitalizeFully(material.name().replace("_", " "))) + .replace("%limit", NumberUtil.formatNumber(limit))); + skyblock.getSoundManager().playSound(player, Sounds.VILLAGER_NO.bukkitSound(), 1.0F, 1.0F); - event.setCancelled(true); - return; + event.setCancelled(true); + return; } - + Location location = event.getClickedBlock().getLocation(); if (stackableManager.isStacked(location)) { Stackable stackable = stackableManager.getStack(location, event.getMaterial()); diff --git a/src/main/java/com/songoda/skyblock/utils/structure/Area.java b/src/main/java/com/songoda/skyblock/utils/structure/Area.java index b7aebac1..6d9d728a 100644 --- a/src/main/java/com/songoda/skyblock/utils/structure/Area.java +++ b/src/main/java/com/songoda/skyblock/utils/structure/Area.java @@ -14,11 +14,7 @@ public class Area { } public Location getPosition(int position) { - if (positions.containsKey(position)) { - return positions.get(position); - } - - return null; + return positions.get(position); } public void setPosition(int position, Location location) { diff --git a/src/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java b/src/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java index 363b4aa1..697668a4 100644 --- a/src/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/structure/SchematicUtil.java @@ -40,14 +40,14 @@ public class SchematicUtil { // TODO: Cache this later try { Class bukkitWorldClass = Class.forName("com.sk89q.worldedit.bukkit.BukkitWorld"); - Constructor bukkitWorldConstructor = bukkitWorldClass.getConstructor(World.class); + Constructor bukkitWorldConstructor = bukkitWorldClass.getConstructor(World.class); Class editSessionClass = Class.forName("com.sk89q.worldedit.EditSession"); Class localWorldClass = Class.forName("com.sk89q.worldedit.LocalWorld"); - Constructor editSessionConstructor = editSessionClass.getConstructor(localWorldClass, int.class); + Constructor editSessionConstructor = editSessionClass.getConstructor(localWorldClass, int.class); Class cuboidClipboardClass = Class.forName("com.sk89q.worldedit.CuboidClipboard"); Method loadSchematicMethod = cuboidClipboardClass.getMethod("loadSchematic", File.class); Class vectorClass = Class.forName("com.sk89q.worldedit.Vector"); - Constructor vectorConstructor = vectorClass.getConstructor(double.class, double.class, double.class); + Constructor vectorConstructor = vectorClass.getConstructor(double.class, double.class, double.class); Method pasteMethod = cuboidClipboardClass.getMethod("paste", editSessionClass, vectorClass, boolean.class); Object editSessionObj = editSessionConstructor.newInstance(bukkitWorldConstructor.newInstance(location.getWorld()), 999999999); diff --git a/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java index eac82b58..5f0336be 100644 --- a/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/structure/StructureUtil.java @@ -6,7 +6,6 @@ import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager; -import com.songoda.skyblock.utils.Compression; import com.songoda.skyblock.utils.version.NMSUtil; import com.songoda.skyblock.utils.world.LocationUtil; import com.songoda.skyblock.utils.world.block.BlockData; @@ -26,7 +25,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index ea4a8eb1..6503bf9a 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -242,6 +242,8 @@ Command: Message: '&bSkyBlock &8| &aInfo&8: &eThis island will unload.' Info: Message: '&f&oKeeps an island from unloading.' + No-Player-Input: + Message: '&bSkyBlock &8| &cError&8: &ePlease input a player.' Proxy: IsOn: Message: '&bSkyBlock &8| &aInfo&8: &eYou are now proxying %player.' diff --git a/src/main/resources/limits.yml b/src/main/resources/limits.yml index 8bd308b4..2d4c6861 100644 --- a/src/main/resources/limits.yml +++ b/src/main/resources/limits.yml @@ -1,3 +1,6 @@ block: - BEDROCK: 0 - END_PORTAL_FRAME: 12 + DefaultLimit: -1 + BEDROCK: 0 + END_PORTAL_FRAME: 12 +entity: + DefaultLimit: -1 \ No newline at end of file From be985d71c7b2e42ffec0cab42e99e53c561f6839 Mon Sep 17 00:00:00 2001 From: Brianna Date: Fri, 18 Oct 2019 23:09:04 -0400 Subject: [PATCH 43/45] 2.0.6 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 45dc1dce..31fd3fef 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "2.0.5" + version: "2.0.6" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle From ade7394f543a998afc3dd6cc95652241c746744d Mon Sep 17 00:00:00 2001 From: theone1000 Date: Mon, 21 Oct 2019 08:05:38 -0600 Subject: [PATCH 44/45] fixed an issue --- src/main/java/com/songoda/skyblock/island/IslandLevel.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/songoda/skyblock/island/IslandLevel.java b/src/main/java/com/songoda/skyblock/island/IslandLevel.java index dba05c80..24a86936 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandLevel.java +++ b/src/main/java/com/songoda/skyblock/island/IslandLevel.java @@ -70,6 +70,8 @@ public class IslandLevel { for (Entry entry : this.materials.entrySet()) { ConfigurationSection current = materialSection.getConfigurationSection(entry.getKey()); + if (current == null) continue; + long pointsRequired = current.getLong("Points", 0); if (pointsRequired != 0) pointsEarned = pointsEarned + (entry.getValue() * pointsRequired); From dc237e18a3b2c292dfc9aadae17e5216032735e1 Mon Sep 17 00:00:00 2001 From: Brianna Date: Mon, 21 Oct 2019 11:01:25 -0400 Subject: [PATCH 45/45] 2.0.7 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 31fd3fef..f142f4d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ image: gradle:alpine variables: name: "FabledSkyBlock" path: "/builds/$CI_PROJECT_PATH" - version: "2.0.6" + version: "2.0.7" before_script: - export GRADLE_USER_HOME=`pwd`/.gradle