From ecb94d1ca828ab531cb01852c752e3784df090bf Mon Sep 17 00:00:00 2001 From: WildInterloper <156627888+WildInterloper@users.noreply.github.com> Date: Sun, 10 Mar 2024 13:52:08 -0400 Subject: [PATCH] Re-Init... try this again xD --- pom.xml | 2 +- src/main/java/me/nvus/xprison/XPrison.java | 466 --- .../java/me/nvus/xprison/XPrisonModule.java | 18 - .../me/nvus/xprison/api/enums/LostCause.java | 30 - .../nvus/xprison/api/enums/ReceiveCause.java | 35 - .../nvus/xprison/api/events/XPrisonEvent.java | 6 - .../api/events/player/XPrisonPlayerEvent.java | 20 - .../xprison/autominer/XPrisonAutoMiner.java | 114 - .../autominer/api/XPrisonAutoMinerAPI.java | 22 - .../api/XPrisonAutoMinerAPIImpl.java | 23 - .../PlayerAutoMinerTimeModifyEvent.java | 46 - .../api/events/PlayerAutomineEvent.java | 42 - .../command/AdminAutoMinerCommand.java | 78 - .../autominer/command/AutoMinerCommand.java | 38 - .../autominer/config/AutoMinerConfig.java | 57 - .../autominer/listener/AutoMinerListener.java | 31 - .../autominer/manager/AutoMinerManager.java | 216 -- .../autominer/model/AutoMinerRegion.java | 75 - .../autominer/model/AutoMinerTask.java | 115 - .../autominer/repo/AutominerRepository.java | 17 - .../repo/impl/AutominerRepositoryImpl.java | 81 - .../autominer/service/AutominerService.java | 13 - .../service/impl/AutominerServiceImpl.java | 32 - .../autominer/utils/AutoMinerConstants.java | 6 - .../autominer/utils/AutoMinerUtils.java | 24 - .../xprison/autosell/XPrisonAutoSell.java | 108 - .../autosell/api/XPrisonAutoSellAPI.java | 68 - .../autosell/api/XPrisonAutoSellAPIImpl.java | 55 - .../api/events/XPrisonAutoSellEvent.java | 49 - .../api/events/XPrisonSellAllEvent.java | 53 - .../autosell/command/AutoSellCommand.java | 26 - .../autosell/command/SellAllCommand.java | 47 - .../autosell/command/SellPriceCommand.java | 139 - .../autosell/config/AutoSellConfig.java | 112 - .../autosell/gui/AllSellRegionsGui.java | 47 - .../xprison/autosell/gui/SellRegionGui.java | 59 - .../autosell/gui/UpdateSellPriceGui.java | 86 - .../autosell/listener/AutoSellListener.java | 79 - .../autosell/manager/AutoSellManager.java | 408 --- .../autosell/model/AutoSellBroadcastTask.java | 57 - .../autosell/model/AutoSellItemStack.java | 20 - .../xprison/autosell/model/SellRegion.java | 102 - .../autosell/utils/AutoSellContants.java | 7 - .../autosell/utils/SellPriceComparator.java | 22 - .../me/nvus/xprison/config/FileManager.java | 169 -- .../xprison/database/PooledSQLDatabase.java | 39 - .../me/nvus/xprison/database/SQLDatabase.java | 87 - .../xprison/database/impl/MySQLDatabase.java | 68 - .../xprison/database/impl/SQLiteDatabase.java | 65 - .../database/model/ConnectionProperties.java | 31 - .../database/model/DatabaseCredentials.java | 33 - .../database/model/SQLDatabaseType.java | 6 - .../xprison/enchants/XPrisonEnchants.java | 161 -- .../enchants/api/XPrisonEnchantsAPI.java | 89 - .../enchants/api/XPrisonEnchantsAPIImpl.java | 65 - .../api/events/ExplosionTriggerEvent.java | 48 - .../api/events/LayerTriggerEvent.java | 48 - .../enchants/api/events/NukeTriggerEvent.java | 48 - .../api/events/XPrisonPlayerEnchantEvent.java | 45 - .../XPrisonPlayerEnchantTriggerEvent.java | 27 - .../enchants/command/DisenchantCommand.java | 45 - .../enchants/command/EnchantMenuCommand.java | 44 - .../command/GiveFirstJoinPickaxeCommand.java | 33 - .../enchants/command/GivePickaxeCommand.java | 82 - .../enchants/command/ValueCommand.java | 54 - .../enchants/config/EnchantsConfig.java | 124 - .../xprison/enchants/gui/DisenchantGUI.java | 159 -- .../nvus/xprison/enchants/gui/EnchantGUI.java | 183 -- .../enchants/listener/EnchantsListener.java | 172 -- .../enchants/managers/CooldownManager.java | 27 - .../enchants/managers/EnchantsManager.java | 560 ---- .../enchants/managers/RespawnManager.java | 34 - .../xprison/enchants/model/LevelFormat.java | 76 - .../xprison/enchants/model/Refundable.java | 10 - .../enchants/model/XPrisonEnchantment.java | 116 - .../enchants/model/impl/AutoSellEnchant.java | 63 - .../model/impl/BackpackAutoSellEnchant.java | 69 - .../enchants/model/impl/BlessingEnchant.java | 92 - .../model/impl/BlockBoosterEnchant.java | 127 - .../enchants/model/impl/CharityEnchant.java | 91 - .../model/impl/EfficiencyEnchant.java | 47 - .../enchants/model/impl/ExplosiveEnchant.java | 209 -- .../enchants/model/impl/FlyEnchant.java | 46 - .../enchants/model/impl/FortuneEnchant.java | 63 - .../model/impl/GangValueFinderEnchant.java | 77 - .../enchants/model/impl/GemFinderEnchant.java | 76 - .../enchants/model/impl/HasteEnchant.java | 50 - .../enchants/model/impl/JumpBoostEnchant.java | 49 - .../enchants/model/impl/KeyFinderEnchant.java | 67 - .../enchants/model/impl/KeyallsEnchant.java | 66 - .../enchants/model/impl/LayerEnchant.java | 193 -- .../model/impl/NightVisionEnchant.java | 49 - .../enchants/model/impl/NukeEnchant.java | 213 -- .../model/impl/PrestigeFinderEnchant.java | 71 - .../enchants/model/impl/SalaryEnchant.java | 75 - .../enchants/model/impl/SpeedEnchant.java | 49 - .../enchants/model/impl/TokenatorEnchant.java | 76 - .../model/impl/UnbreakingEnchant.java | 48 - .../model/impl/VoucherFinderEnchant.java | 87 - .../enchants/repo/EnchantsRepository.java | 118 - .../xprison/enchants/utils/EnchantUtils.java | 50 - .../nvus/xprison/enchants/utils/GuiUtils.java | 32 - .../exception/ModuleNotEnabledException.java | 10 - .../me/nvus/xprison/gangs/XPrisonGangs.java | 120 - .../xprison/gangs/api/XPrisonGangsAPI.java | 35 - .../gangs/api/XPrisonGangsAPIImpl.java | 32 - .../gangs/api/events/GangCreateEvent.java | 51 - .../gangs/api/events/GangDisbandEvent.java | 43 - .../gangs/api/events/GangJoinEvent.java | 52 - .../gangs/api/events/GangLeaveEvent.java | 58 - .../xprison/gangs/commands/GangCommand.java | 117 - .../gangs/commands/GangSubCommand.java | 44 - .../commands/impl/GangAcceptSubCommand.java | 52 - .../commands/impl/GangChatSubCommand.java | 42 - .../commands/impl/GangCreateSubCommand.java | 42 - .../commands/impl/GangDisbandSubCommand.java | 60 - .../commands/impl/GangHelpSubCommand.java | 45 - .../commands/impl/GangInfoSubCommand.java | 59 - .../commands/impl/GangInviteSubCommand.java | 44 - .../commands/impl/GangKickSubCommand.java | 57 - .../commands/impl/GangLeaveSubCommand.java | 43 - .../commands/impl/GangRenameSubCommand.java | 62 - .../commands/impl/GangTopSubCommand.java | 40 - .../admin/GangAdminDisbandSubCommand.java | 52 - .../impl/admin/GangAdminJoinSubCommand.java | 53 - .../impl/admin/GangAdminKickSubCommand.java | 43 - .../impl/admin/GangAdminRenameSubCommand.java | 43 - .../impl/admin/GangAdminSubCommand.java | 47 - .../impl/value/GangValueAddSubCommand.java | 62 - .../impl/value/GangValueRemoveSubCommand.java | 62 - .../impl/value/GangValueSubCommand.java | 45 - .../xprison/gangs/config/GangsConfig.java | 115 - .../xprison/gangs/enums/GangCreateResult.java | 14 - .../xprison/gangs/enums/GangLeaveReason.java | 7 - .../gangs/enums/GangNameCheckResult.java | 10 - .../xprison/gangs/enums/GangRenameResult.java | 9 - .../gangs/gui/admin/DisbandGangAdminGUI.java | 26 - .../gangs/gui/panel/DisbandGangGUI.java | 26 - .../xprison/gangs/gui/panel/GangPanelGUI.java | 131 - .../gangs/gui/panel/ManageGangInvitesGui.java | 76 - .../gangs/gui/panel/ManageGangMembersGui.java | 73 - .../xprison/gangs/listener/GangsListener.java | 82 - .../xprison/gangs/managers/GangsManager.java | 534 ---- .../me/nvus/xprison/gangs/model/Gang.java | 170 -- .../xprison/gangs/model/GangInvitation.java | 34 - .../gangs/model/GangTopByValueProvider.java | 26 - .../xprison/gangs/model/GangTopProvider.java | 7 - .../gangs/model/GangUpdateTopTask.java | 37 - .../xprison/gangs/repo/GangsRepository.java | 27 - .../gangs/repo/impl/GangsRepositoryImpl.java | 178 -- .../xprison/gangs/service/GangsService.java | 23 - .../gangs/service/impl/GangsServiceImpl.java | 52 - .../xprison/gangs/utils/GangsConstants.java | 11 - .../me/nvus/xprison/gems/XPrisonGems.java | 159 -- .../nvus/xprison/gems/api/XPrisonGemsAPI.java | 43 - .../xprison/gems/api/XPrisonGemsAPIImpl.java | 36 - .../gems/api/events/PlayerGemsLostEvent.java | 45 - .../api/events/PlayerGemsReceiveEvent.java | 48 - .../xprison/gems/commands/GemsCommand.java | 39 - .../gems/commands/GemsGiveCommand.java | 61 - .../gems/commands/GemsHelpCommand.java | 51 - .../xprison/gems/commands/GemsPayCommand.java | 77 - .../gems/commands/GemsRemoveCommand.java | 63 - .../gems/commands/GemsSaveCommand.java | 51 - .../xprison/gems/commands/GemsSetCommand.java | 60 - .../gems/commands/GemsWithdrawCommand.java | 67 - .../xprison/gems/managers/CommandManager.java | 159 -- .../xprison/gems/managers/GemsManager.java | 389 --- .../xprison/gems/repo/GemsRepository.java | 21 - .../gems/repo/impl/GemsRepositoryImpl.java | 76 - .../xprison/gems/service/GemsService.java | 17 - .../gems/service/impl/GemsServiceImpl.java | 37 - .../nvus/xprison/history/XPrisonHistory.java | 181 -- .../history/api/XPrisonHistoryAPI.java | 27 - .../history/api/XPrisonHistoryAPIImpl.java | 27 - .../history/gui/PlayerHistoryFilterGUI.java | 69 - .../xprison/history/gui/PlayerHistoryGUI.java | 82 - .../PlayerClearHistoryConfirmationGUI.java | 28 - .../history/manager/HistoryManager.java | 126 - .../xprison/history/model/HistoryLine.java | 22 - .../history/repo/HistoryRepository.java | 19 - .../repo/impl/HistoryRepositoryImpl.java | 83 - .../history/service/HistoryService.java | 15 - .../service/impl/HistoryServiceImpl.java | 32 - .../xprison/interfaces/Permissionable.java | 6 - .../xprison/interfaces/UPCRepository.java | 8 - .../me/nvus/xprison/mainmenu/MainMenu.java | 139 - .../ReloadModuleConfirmationGui.java | 32 - .../ResetModulePlayerDataConfirmationGui.java | 31 - .../mainmenu/help/AutoMinerHelpGui.java | 94 - .../mainmenu/help/AutoSellHelpGui.java | 105 - .../mainmenu/help/EnchantsHelpGui.java | 111 - .../xprison/mainmenu/help/GangsHelpGui.java | 116 - .../xprison/mainmenu/help/GemsHelpGui.java | 100 - .../nvus/xprison/mainmenu/help/HelpGui.java | 138 - .../xprison/mainmenu/help/HistoryHelpGui.java | 95 - .../xprison/mainmenu/help/MinesHelpGui.java | 131 - .../mainmenu/help/MultipliersHelpGui.java | 102 - .../mainmenu/help/PickaxeLevelsHelpGui.java | 88 - .../mainmenu/help/PrestigesHelpGui.java | 97 - .../xprison/mainmenu/help/RanksHelpGui.java | 94 - .../xprison/mainmenu/help/TokensHelpGui.java | 103 - .../mainmenu/reload/ReloadSelectionGui.java | 145 - .../mainmenu/reset/ResetSelectionGui.java | 146 - .../nvus/xprison/migrator/ItemMigrator.java | 126 - .../me/nvus/xprison/mines/XPrisonMines.java | 169 -- .../xprison/mines/api/XPrisonMinesAPI.java | 23 - .../mines/api/XPrisonMinesAPIImpl.java | 24 - .../mines/api/events/MineCreateEvent.java | 47 - .../mines/api/events/MineDeleteEvent.java | 40 - .../mines/api/events/MinePostResetEvent.java | 34 - .../mines/api/events/MinePreResetEvent.java | 40 - .../xprison/mines/commands/MineCommand.java | 28 - .../commands/impl/MineAddBlockCommand.java | 60 - .../commands/impl/MineCreateCommand.java | 38 - .../commands/impl/MineDeleteCommand.java | 35 - .../mines/commands/impl/MineHelpCommand.java | 49 - .../mines/commands/impl/MineListCommand.java | 40 - .../commands/impl/MineMigrateCommand.java | 36 - .../mines/commands/impl/MinePanelCommand.java | 50 - .../commands/impl/MineRedefineCommand.java | 38 - .../commands/impl/MineRenameCommand.java | 39 - .../mines/commands/impl/MineResetCommand.java | 56 - .../mines/commands/impl/MineSaveCommand.java | 47 - .../mines/commands/impl/MineSetTpCommand.java | 48 - .../commands/impl/MineTeleportCommand.java | 54 - .../mines/commands/impl/MineToolCommand.java | 38 - .../nvus/xprison/mines/gui/MineBlocksGUI.java | 37 - .../mines/gui/MineEditBlockChanceGUI.java | 114 - .../mines/gui/MineEditResetPercentageGUI.java | 110 - .../mines/gui/MineEditTimedResetGUI.java | 71 - .../xprison/mines/gui/MineEffectsGUI.java | 65 - .../xprison/mines/gui/MineHologramsGUI.java | 49 - .../nvus/xprison/mines/gui/MinePanelGUI.java | 68 - .../mines/gui/MineResetOptionsGUI.java | 63 - .../xprison/mines/listener/MinesListener.java | 62 - .../xprison/mines/managers/MineManager.java | 526 ---- .../MinesMigrationNotSupportedException.java | 8 - .../migration/gui/AllMinesMigrationGui.java | 69 - .../migration/gui/MinesMigrationGui.java | 23 - .../mines/migration/model/MinesMigration.java | 74 - .../model/impl/MineResetLiteMigration.java | 68 - .../utils/MinesMigrationFactory.java | 17 - .../migration/utils/MinesMigrationUtils.java | 24 - .../mines/model/mine/BlockPalette.java | 96 - .../mines/model/mine/HologramType.java | 7 - .../nvus/xprison/mines/model/mine/Mine.java | 451 --- .../mines/model/mine/MineSelection.java | 23 - .../model/mine/loader/MineFileLoader.java | 66 - .../mines/model/mine/loader/MineLoader.java | 8 - .../mines/model/mine/reset/GradualReset.java | 61 - .../mines/model/mine/reset/InstantReset.java | 62 - .../mines/model/mine/reset/ResetType.java | 30 - .../mines/model/mine/saver/MineFileSaver.java | 26 - .../mines/model/mine/saver/MineSaver.java | 7 - .../multipliers/XPrisonMultipliers.java | 615 ---- .../api/XPrisonMultipliersAPI.java | 71 - .../api/XPrisonMultipliersAPIImpl.java | 73 - .../events/PlayerMultiplierExpireEvent.java | 39 - .../events/PlayerMultiplierReceiveEvent.java | 53 - .../multipliers/enums/MultiplierType.java | 6 - .../multiplier/GlobalMultiplier.java | 8 - .../multipliers/multiplier/Multiplier.java | 79 - .../multiplier/PlayerMultiplier.java | 28 - .../repo/MultipliersRepository.java | 25 - .../repo/impl/MultipliersRepositoryImpl.java | 180 -- .../service/MultipliersService.java | 21 - .../service/impl/MultipliersServiceImpl.java | 50 - .../nicknames/repo/NicknameRepository.java | 10 - .../repo/impl/NicknameRepositoryImpl.java | 39 - .../nicknames/service/NicknameService.java | 9 - .../service/impl/NicknameServiceImpl.java | 20 - .../pickaxelevels/XPrisonPickaxeLevels.java | 76 - .../api/XPrisonPickaxeLevelsAPI.java | 60 - .../api/XPrisonPickaxeLevelsAPIImpl.java | 48 - .../config/PickaxeLevelsConfig.java | 117 - .../listener/PickaxeLevelsListener.java | 44 - .../manager/PickaxeLevelsManager.java | 188 -- .../pickaxelevels/model/PickaxeLevel.java | 16 - .../placeholders/XPrisonMVdWPlaceholder.java | 248 -- .../placeholders/XPrisonPAPIPlaceholder.java | 267 -- .../xprison/prestiges/XPrisonPrestiges.java | 118 - .../prestiges/api/XPrisonPrestigesAPI.java | 33 - .../api/XPrisonPrestigesAPIImpl.java | 30 - .../api/events/PlayerPrestigeEvent.java | 49 - .../commands/MaxPrestigeCommand.java | 30 - .../commands/PrestigeAdminCommand.java | 48 - .../prestiges/commands/PrestigeCommand.java | 23 - .../commands/PrestigeTopCommand.java | 23 - .../prestiges/config/PrestigeConfig.java | 203 -- .../prestiges/listener/PrestigeListener.java | 31 - .../prestiges/manager/PrestigeManager.java | 445 --- .../xprison/prestiges/model/Prestige.java | 16 - .../prestiges/repo/PrestigeRepository.java | 21 - .../repo/impl/PrestigeRepositoryImpl.java | 76 - .../prestiges/service/PrestigeService.java | 17 - .../service/impl/PrestigeServiceImpl.java | 37 - .../prestiges/task/SavePlayerDataTask.java | 35 - .../me/nvus/xprison/ranks/XPrisonRanks.java | 100 - .../xprison/ranks/api/XPrisonRanksAPI.java | 43 - .../ranks/api/XPrisonRanksAPIImpl.java | 36 - .../ranks/api/events/PlayerRankUpEvent.java | 48 - .../ranks/commands/MaxRankupCommand.java | 26 - .../xprison/ranks/commands/RankupCommand.java | 24 - .../ranks/commands/SetRankCommand.java | 39 - .../xprison/ranks/config/RanksConfig.java | 121 - .../xprison/ranks/listener/RanksListener.java | 32 - .../xprison/ranks/manager/RanksManager.java | 358 --- .../me/nvus/xprison/ranks/model/Rank.java | 17 - .../xprison/ranks/repo/RanksRepository.java | 16 - .../ranks/repo/impl/RanksRepositoryImpl.java | 61 - .../xprison/ranks/service/RanksService.java | 12 - .../ranks/service/impl/RanksServiceImpl.java | 29 - .../me/nvus/xprison/tokens/XPrisonTokens.java | 152 - .../xprison/tokens/api/XPrisonTokensAPI.java | 45 - .../tokens/api/XPrisonTokensAPIImpl.java | 35 - .../api/events/PlayerTokensLostEvent.java | 45 - .../api/events/PlayerTokensReceiveEvent.java | 49 - .../api/events/XPrisonBlockBreakEvent.java | 43 - .../tokens/commands/TokensCommand.java | 41 - .../tokens/commands/TokensGiveCommand.java | 60 - .../tokens/commands/TokensHelpCommand.java | 51 - .../tokens/commands/TokensPayCommand.java | 78 - .../tokens/commands/TokensRemoveCommand.java | 62 - .../tokens/commands/TokensSetCommand.java | 60 - .../commands/TokensWithdrawCommand.java | 69 - .../tokens/config/BlockRewardsConfig.java | 63 - .../xprison/tokens/config/TokensConfig.java | 210 -- .../tokens/listener/TokensListener.java | 90 - .../tokens/managers/CommandManager.java | 224 -- .../tokens/managers/TokensManager.java | 642 ----- .../xprison/tokens/model/BlockReward.java | 36 - .../xprison/tokens/repo/BlocksRepository.java | 31 - .../xprison/tokens/repo/TokensRepository.java | 21 - .../repo/impl/BlocksRepositoryImpl.java | 122 - .../repo/impl/TokensRepositoryImpl.java | 77 - .../xprison/tokens/service/BlocksService.java | 27 - .../xprison/tokens/service/TokensService.java | 17 - .../service/impl/BlocksServiceImpl.java | 62 - .../service/impl/TokensServiceImpl.java | 39 - .../tokens/task/SavePlayerDataTask.java | 35 - .../xprison/tokens/utils/TokensConstants.java | 10 - .../java/me/nvus/xprison/utils/Constants.java | 15 - .../java/me/nvus/xprison/utils/Metrics.java | 882 ------ .../block/CuboidExplosionBlockProvider.java | 39 - .../utils/block/ExplosionBlockProvider.java | 10 - .../block/SpheroidExplosionBlockProvider.java | 34 - .../xprison/utils/compat/CompMaterial.java | 2516 ----------------- .../utils/compat/MinecraftVersion.java | 199 -- .../xprison/utils/economy/EconomyUtils.java | 19 - .../me/nvus/xprison/utils/gui/ClearDBGui.java | 36 - .../xprison/utils/gui/ConfirmationGui.java | 51 - .../utils/inventory/InventoryUtils.java | 34 - .../xprison/utils/item/ItemStackBuilder.java | 227 -- .../nvus/xprison/utils/item/PrisonItem.java | 71 - .../xprison/utils/location/LocationUtils.java | 29 - .../me/nvus/xprison/utils/misc/MapUtil.java | 25 - .../xprison/utils/misc/MaterialUtils.java | 38 - .../me/nvus/xprison/utils/misc/MathUtils.java | 44 - .../nvus/xprison/utils/misc/NumberUtils.java | 23 - .../nvus/xprison/utils/misc/ProgressBar.java | 41 - .../nvus/xprison/utils/misc/RegionUtils.java | 50 - .../nvus/xprison/utils/misc/SkullUtils.java | 78 - .../me/nvus/xprison/utils/misc/TimeUtil.java | 40 - .../xprison/utils/player/PlayerUtils.java | 68 - .../me/nvus/xprison/utils/text/TextUtils.java | 38 - src/main/libs/plugins/MVdWPlaceholderAPI.jar | Bin 245197 -> 0 bytes src/main/libs/plugins/MineResetLite.jar | Bin 61659 -> 0 bytes src/main/libs/plugins/helper.jar | Bin 1837193 -> 0 bytes src/main/pom.xml | 189 -- src/main/resources/config.yml | 63 +- src/main/resources/plugin.yml | 26 +- .../nvus/xprison/utils/LocationUtilsTest.java | 60 - .../nvus/xprison/utils/ProgressBarTest.java | 79 - .../xprison/utils/misc/MathUtilsTest.java | 38 - .../xprison/utils/misc/NumberUtilsTest.java | 39 - 376 files changed, 28 insertions(+), 31026 deletions(-) delete mode 100644 src/main/java/me/nvus/xprison/XPrison.java delete mode 100644 src/main/java/me/nvus/xprison/XPrisonModule.java delete mode 100644 src/main/java/me/nvus/xprison/api/enums/LostCause.java delete mode 100644 src/main/java/me/nvus/xprison/api/enums/ReceiveCause.java delete mode 100644 src/main/java/me/nvus/xprison/api/events/XPrisonEvent.java delete mode 100644 src/main/java/me/nvus/xprison/api/events/player/XPrisonPlayerEvent.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/XPrisonAutoMiner.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/api/XPrisonAutoMinerAPI.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/api/XPrisonAutoMinerAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/api/events/PlayerAutoMinerTimeModifyEvent.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/api/events/PlayerAutomineEvent.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/command/AdminAutoMinerCommand.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/command/AutoMinerCommand.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/config/AutoMinerConfig.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/listener/AutoMinerListener.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/manager/AutoMinerManager.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/model/AutoMinerRegion.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/model/AutoMinerTask.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/repo/AutominerRepository.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/repo/impl/AutominerRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/service/AutominerService.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/service/impl/AutominerServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/utils/AutoMinerConstants.java delete mode 100644 src/main/java/me/nvus/xprison/autominer/utils/AutoMinerUtils.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/XPrisonAutoSell.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/api/XPrisonAutoSellAPI.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/api/XPrisonAutoSellAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/api/events/XPrisonAutoSellEvent.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/api/events/XPrisonSellAllEvent.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/command/AutoSellCommand.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/command/SellAllCommand.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/command/SellPriceCommand.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/config/AutoSellConfig.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/gui/AllSellRegionsGui.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/gui/SellRegionGui.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/gui/UpdateSellPriceGui.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/listener/AutoSellListener.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/manager/AutoSellManager.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/model/AutoSellBroadcastTask.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/model/AutoSellItemStack.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/model/SellRegion.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/utils/AutoSellContants.java delete mode 100644 src/main/java/me/nvus/xprison/autosell/utils/SellPriceComparator.java delete mode 100644 src/main/java/me/nvus/xprison/config/FileManager.java delete mode 100644 src/main/java/me/nvus/xprison/database/PooledSQLDatabase.java delete mode 100644 src/main/java/me/nvus/xprison/database/SQLDatabase.java delete mode 100644 src/main/java/me/nvus/xprison/database/impl/MySQLDatabase.java delete mode 100644 src/main/java/me/nvus/xprison/database/impl/SQLiteDatabase.java delete mode 100644 src/main/java/me/nvus/xprison/database/model/ConnectionProperties.java delete mode 100644 src/main/java/me/nvus/xprison/database/model/DatabaseCredentials.java delete mode 100644 src/main/java/me/nvus/xprison/database/model/SQLDatabaseType.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/XPrisonEnchants.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/api/XPrisonEnchantsAPI.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/api/XPrisonEnchantsAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/api/events/ExplosionTriggerEvent.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/api/events/LayerTriggerEvent.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/api/events/NukeTriggerEvent.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/api/events/XPrisonPlayerEnchantEvent.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/api/events/XPrisonPlayerEnchantTriggerEvent.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/command/DisenchantCommand.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/command/EnchantMenuCommand.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/command/GiveFirstJoinPickaxeCommand.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/command/GivePickaxeCommand.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/command/ValueCommand.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/config/EnchantsConfig.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/gui/DisenchantGUI.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/gui/EnchantGUI.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/listener/EnchantsListener.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/managers/CooldownManager.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/managers/EnchantsManager.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/managers/RespawnManager.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/LevelFormat.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/Refundable.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/XPrisonEnchantment.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/AutoSellEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/BackpackAutoSellEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/BlessingEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/BlockBoosterEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/CharityEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/EfficiencyEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/ExplosiveEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/FlyEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/FortuneEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/GangValueFinderEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/GemFinderEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/HasteEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/JumpBoostEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/KeyFinderEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/KeyallsEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/LayerEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/NightVisionEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/NukeEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/PrestigeFinderEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/SalaryEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/SpeedEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/TokenatorEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/UnbreakingEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/model/impl/VoucherFinderEnchant.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/repo/EnchantsRepository.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/utils/EnchantUtils.java delete mode 100644 src/main/java/me/nvus/xprison/enchants/utils/GuiUtils.java delete mode 100644 src/main/java/me/nvus/xprison/exception/ModuleNotEnabledException.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/XPrisonGangs.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/api/XPrisonGangsAPI.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/api/XPrisonGangsAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/api/events/GangCreateEvent.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/api/events/GangDisbandEvent.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/api/events/GangJoinEvent.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/api/events/GangLeaveEvent.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/GangCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/GangSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangAcceptSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangChatSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangCreateSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangDisbandSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangHelpSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangInfoSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangInviteSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangKickSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangLeaveSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangRenameSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/GangTopSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminDisbandSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminJoinSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminKickSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminRenameSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueAddSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueRemoveSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueSubCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/config/GangsConfig.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/enums/GangCreateResult.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/enums/GangLeaveReason.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/enums/GangNameCheckResult.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/enums/GangRenameResult.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/gui/admin/DisbandGangAdminGUI.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/gui/panel/DisbandGangGUI.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/gui/panel/GangPanelGUI.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/gui/panel/ManageGangInvitesGui.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/gui/panel/ManageGangMembersGui.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/listener/GangsListener.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/managers/GangsManager.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/model/Gang.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/model/GangInvitation.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/model/GangTopByValueProvider.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/model/GangTopProvider.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/model/GangUpdateTopTask.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/repo/GangsRepository.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/repo/impl/GangsRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/service/GangsService.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/service/impl/GangsServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/gangs/utils/GangsConstants.java delete mode 100644 src/main/java/me/nvus/xprison/gems/XPrisonGems.java delete mode 100644 src/main/java/me/nvus/xprison/gems/api/XPrisonGemsAPI.java delete mode 100644 src/main/java/me/nvus/xprison/gems/api/XPrisonGemsAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/gems/api/events/PlayerGemsLostEvent.java delete mode 100644 src/main/java/me/nvus/xprison/gems/api/events/PlayerGemsReceiveEvent.java delete mode 100644 src/main/java/me/nvus/xprison/gems/commands/GemsCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gems/commands/GemsGiveCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gems/commands/GemsHelpCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gems/commands/GemsPayCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gems/commands/GemsRemoveCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gems/commands/GemsSaveCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gems/commands/GemsSetCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gems/commands/GemsWithdrawCommand.java delete mode 100644 src/main/java/me/nvus/xprison/gems/managers/CommandManager.java delete mode 100644 src/main/java/me/nvus/xprison/gems/managers/GemsManager.java delete mode 100644 src/main/java/me/nvus/xprison/gems/repo/GemsRepository.java delete mode 100644 src/main/java/me/nvus/xprison/gems/repo/impl/GemsRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/gems/service/GemsService.java delete mode 100644 src/main/java/me/nvus/xprison/gems/service/impl/GemsServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/history/XPrisonHistory.java delete mode 100644 src/main/java/me/nvus/xprison/history/api/XPrisonHistoryAPI.java delete mode 100644 src/main/java/me/nvus/xprison/history/api/XPrisonHistoryAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/history/gui/PlayerHistoryFilterGUI.java delete mode 100644 src/main/java/me/nvus/xprison/history/gui/PlayerHistoryGUI.java delete mode 100644 src/main/java/me/nvus/xprison/history/gui/confirmation/PlayerClearHistoryConfirmationGUI.java delete mode 100644 src/main/java/me/nvus/xprison/history/manager/HistoryManager.java delete mode 100644 src/main/java/me/nvus/xprison/history/model/HistoryLine.java delete mode 100644 src/main/java/me/nvus/xprison/history/repo/HistoryRepository.java delete mode 100644 src/main/java/me/nvus/xprison/history/repo/impl/HistoryRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/history/service/HistoryService.java delete mode 100644 src/main/java/me/nvus/xprison/history/service/impl/HistoryServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/interfaces/Permissionable.java delete mode 100644 src/main/java/me/nvus/xprison/interfaces/UPCRepository.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/MainMenu.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/confirmation/ReloadModuleConfirmationGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/confirmation/ResetModulePlayerDataConfirmationGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/AutoMinerHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/AutoSellHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/EnchantsHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/GangsHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/GemsHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/HelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/HistoryHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/MinesHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/MultipliersHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/PickaxeLevelsHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/PrestigesHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/RanksHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/help/TokensHelpGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/reload/ReloadSelectionGui.java delete mode 100644 src/main/java/me/nvus/xprison/mainmenu/reset/ResetSelectionGui.java delete mode 100644 src/main/java/me/nvus/xprison/migrator/ItemMigrator.java delete mode 100644 src/main/java/me/nvus/xprison/mines/XPrisonMines.java delete mode 100644 src/main/java/me/nvus/xprison/mines/api/XPrisonMinesAPI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/api/XPrisonMinesAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/mines/api/events/MineCreateEvent.java delete mode 100644 src/main/java/me/nvus/xprison/mines/api/events/MineDeleteEvent.java delete mode 100644 src/main/java/me/nvus/xprison/mines/api/events/MinePostResetEvent.java delete mode 100644 src/main/java/me/nvus/xprison/mines/api/events/MinePreResetEvent.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/MineCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineAddBlockCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineCreateCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineDeleteCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineHelpCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineListCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineMigrateCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MinePanelCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineRedefineCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineRenameCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineResetCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineSaveCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineSetTpCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineTeleportCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/commands/impl/MineToolCommand.java delete mode 100644 src/main/java/me/nvus/xprison/mines/gui/MineBlocksGUI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/gui/MineEditBlockChanceGUI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/gui/MineEditResetPercentageGUI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/gui/MineEditTimedResetGUI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/gui/MineEffectsGUI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/gui/MineHologramsGUI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/gui/MinePanelGUI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/gui/MineResetOptionsGUI.java delete mode 100644 src/main/java/me/nvus/xprison/mines/listener/MinesListener.java delete mode 100644 src/main/java/me/nvus/xprison/mines/managers/MineManager.java delete mode 100644 src/main/java/me/nvus/xprison/mines/migration/exception/MinesMigrationNotSupportedException.java delete mode 100644 src/main/java/me/nvus/xprison/mines/migration/gui/AllMinesMigrationGui.java delete mode 100644 src/main/java/me/nvus/xprison/mines/migration/gui/MinesMigrationGui.java delete mode 100644 src/main/java/me/nvus/xprison/mines/migration/model/MinesMigration.java delete mode 100644 src/main/java/me/nvus/xprison/mines/migration/model/impl/MineResetLiteMigration.java delete mode 100644 src/main/java/me/nvus/xprison/mines/migration/utils/MinesMigrationFactory.java delete mode 100644 src/main/java/me/nvus/xprison/mines/migration/utils/MinesMigrationUtils.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/BlockPalette.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/HologramType.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/Mine.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/MineSelection.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/loader/MineFileLoader.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/loader/MineLoader.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/reset/GradualReset.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/reset/InstantReset.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/reset/ResetType.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/saver/MineFileSaver.java delete mode 100644 src/main/java/me/nvus/xprison/mines/model/mine/saver/MineSaver.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/XPrisonMultipliers.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/api/XPrisonMultipliersAPI.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/api/XPrisonMultipliersAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/api/events/PlayerMultiplierExpireEvent.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/api/events/PlayerMultiplierReceiveEvent.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/enums/MultiplierType.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/multiplier/GlobalMultiplier.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/multiplier/Multiplier.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/multiplier/PlayerMultiplier.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/repo/MultipliersRepository.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/repo/impl/MultipliersRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/service/MultipliersService.java delete mode 100644 src/main/java/me/nvus/xprison/multipliers/service/impl/MultipliersServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/nicknames/repo/NicknameRepository.java delete mode 100644 src/main/java/me/nvus/xprison/nicknames/repo/impl/NicknameRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/nicknames/service/NicknameService.java delete mode 100644 src/main/java/me/nvus/xprison/nicknames/service/impl/NicknameServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/pickaxelevels/XPrisonPickaxeLevels.java delete mode 100644 src/main/java/me/nvus/xprison/pickaxelevels/api/XPrisonPickaxeLevelsAPI.java delete mode 100644 src/main/java/me/nvus/xprison/pickaxelevels/api/XPrisonPickaxeLevelsAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/pickaxelevels/config/PickaxeLevelsConfig.java delete mode 100644 src/main/java/me/nvus/xprison/pickaxelevels/listener/PickaxeLevelsListener.java delete mode 100644 src/main/java/me/nvus/xprison/pickaxelevels/manager/PickaxeLevelsManager.java delete mode 100644 src/main/java/me/nvus/xprison/pickaxelevels/model/PickaxeLevel.java delete mode 100644 src/main/java/me/nvus/xprison/placeholders/XPrisonMVdWPlaceholder.java delete mode 100644 src/main/java/me/nvus/xprison/placeholders/XPrisonPAPIPlaceholder.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/XPrisonPrestiges.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/api/XPrisonPrestigesAPI.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/api/XPrisonPrestigesAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/api/events/PlayerPrestigeEvent.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/commands/MaxPrestigeCommand.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/commands/PrestigeAdminCommand.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/commands/PrestigeCommand.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/commands/PrestigeTopCommand.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/config/PrestigeConfig.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/listener/PrestigeListener.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/manager/PrestigeManager.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/model/Prestige.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/repo/PrestigeRepository.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/repo/impl/PrestigeRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/service/PrestigeService.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/service/impl/PrestigeServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/prestiges/task/SavePlayerDataTask.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/XPrisonRanks.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/api/XPrisonRanksAPI.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/api/XPrisonRanksAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/api/events/PlayerRankUpEvent.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/commands/MaxRankupCommand.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/commands/RankupCommand.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/commands/SetRankCommand.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/config/RanksConfig.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/listener/RanksListener.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/manager/RanksManager.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/model/Rank.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/repo/RanksRepository.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/repo/impl/RanksRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/service/RanksService.java delete mode 100644 src/main/java/me/nvus/xprison/ranks/service/impl/RanksServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/XPrisonTokens.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/api/XPrisonTokensAPI.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/api/XPrisonTokensAPIImpl.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/api/events/PlayerTokensLostEvent.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/api/events/PlayerTokensReceiveEvent.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/api/events/XPrisonBlockBreakEvent.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/commands/TokensCommand.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/commands/TokensGiveCommand.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/commands/TokensHelpCommand.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/commands/TokensPayCommand.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/commands/TokensRemoveCommand.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/commands/TokensSetCommand.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/commands/TokensWithdrawCommand.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/config/BlockRewardsConfig.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/config/TokensConfig.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/listener/TokensListener.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/managers/CommandManager.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/managers/TokensManager.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/model/BlockReward.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/repo/BlocksRepository.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/repo/TokensRepository.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/repo/impl/BlocksRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/repo/impl/TokensRepositoryImpl.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/service/BlocksService.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/service/TokensService.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/service/impl/BlocksServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/service/impl/TokensServiceImpl.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/task/SavePlayerDataTask.java delete mode 100644 src/main/java/me/nvus/xprison/tokens/utils/TokensConstants.java delete mode 100644 src/main/java/me/nvus/xprison/utils/Constants.java delete mode 100644 src/main/java/me/nvus/xprison/utils/Metrics.java delete mode 100644 src/main/java/me/nvus/xprison/utils/block/CuboidExplosionBlockProvider.java delete mode 100644 src/main/java/me/nvus/xprison/utils/block/ExplosionBlockProvider.java delete mode 100644 src/main/java/me/nvus/xprison/utils/block/SpheroidExplosionBlockProvider.java delete mode 100644 src/main/java/me/nvus/xprison/utils/compat/CompMaterial.java delete mode 100644 src/main/java/me/nvus/xprison/utils/compat/MinecraftVersion.java delete mode 100644 src/main/java/me/nvus/xprison/utils/economy/EconomyUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/gui/ClearDBGui.java delete mode 100644 src/main/java/me/nvus/xprison/utils/gui/ConfirmationGui.java delete mode 100644 src/main/java/me/nvus/xprison/utils/inventory/InventoryUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/item/ItemStackBuilder.java delete mode 100644 src/main/java/me/nvus/xprison/utils/item/PrisonItem.java delete mode 100644 src/main/java/me/nvus/xprison/utils/location/LocationUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/misc/MapUtil.java delete mode 100644 src/main/java/me/nvus/xprison/utils/misc/MaterialUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/misc/MathUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/misc/NumberUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/misc/ProgressBar.java delete mode 100644 src/main/java/me/nvus/xprison/utils/misc/RegionUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/misc/SkullUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/misc/TimeUtil.java delete mode 100644 src/main/java/me/nvus/xprison/utils/player/PlayerUtils.java delete mode 100644 src/main/java/me/nvus/xprison/utils/text/TextUtils.java delete mode 100644 src/main/libs/plugins/MVdWPlaceholderAPI.jar delete mode 100644 src/main/libs/plugins/MineResetLite.jar delete mode 100644 src/main/libs/plugins/helper.jar delete mode 100644 src/main/pom.xml delete mode 100644 src/test/java/me/nvus/xprison/utils/LocationUtilsTest.java delete mode 100644 src/test/java/me/nvus/xprison/utils/ProgressBarTest.java delete mode 100644 src/test/java/me/nvus/xprison/utils/misc/MathUtilsTest.java delete mode 100644 src/test/java/me/nvus/xprison/utils/misc/NumberUtilsTest.java diff --git a/pom.xml b/pom.xml index f32714a..162ac89 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - me.nvus.xprison + dev.drawethree.xprison X-Prison 1.12.16 diff --git a/src/main/java/me/nvus/xprison/XPrison.java b/src/main/java/me/nvus/xprison/XPrison.java deleted file mode 100644 index 0137214..0000000 --- a/src/main/java/me/nvus/xprison/XPrison.java +++ /dev/null @@ -1,466 +0,0 @@ -package me.nvus.xprison; - -import com.github.lalyos.jfiglet.FigletFont; -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.database.impl.MySQLDatabase; -import me.nvus.xprison.database.impl.SQLiteDatabase; -import me.nvus.xprison.database.model.ConnectionProperties; -import me.nvus.xprison.database.model.DatabaseCredentials; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.history.XPrisonHistory; -import me.nvus.xprison.mainmenu.MainMenu; -import me.nvus.xprison.mainmenu.help.HelpGui; -import me.nvus.xprison.migrator.ItemMigrator; -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.multipliers.XPrisonMultipliers; -import me.nvus.xprison.nicknames.repo.NicknameRepository; -import me.nvus.xprison.nicknames.repo.impl.NicknameRepositoryImpl; -import me.nvus.xprison.nicknames.service.NicknameService; -import me.nvus.xprison.nicknames.service.impl.NicknameServiceImpl; -import me.nvus.xprison.pickaxelevels.XPrisonPickaxeLevels; -import me.nvus.xprison.placeholders.XPrisonMVdWPlaceholder; -import me.nvus.xprison.placeholders.XPrisonPAPIPlaceholder; -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.nvus.xprison.ranks.XPrisonRanks; -import me.nvus.xprison.tokens.XPrisonTokens; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.text.TextUtils; -import lombok.Getter; -import me.lucko.helper.Commands; -import me.lucko.helper.Events; -import me.lucko.helper.plugin.ExtendedJavaPlugin; -import net.milkbowl.vault.economy.Economy; -import me.nvus.xprison.utils.Metrics; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.codemc.worldguardwrapper.WorldGuardWrapper; -import org.codemc.worldguardwrapper.flag.WrappedState; - -import java.io.IOException; -import java.util.*; -import java.util.stream.Collectors; - -@Getter -public final class XPrison extends ExtendedJavaPlugin { - - private static XPrison instance; - - private boolean debugMode; - private Map modules; - private SQLDatabase pluginDatabase; - private Economy economy; - private FileManager fileManager; - private XPrisonTokens tokens; - private XPrisonGems gems; - private XPrisonRanks ranks; - private XPrisonPrestiges prestiges; - private XPrisonMultipliers multipliers; - private XPrisonEnchants enchants; - private XPrisonAutoSell autoSell; - private XPrisonAutoMiner autoMiner; - private XPrisonPickaxeLevels pickaxeLevels; - private XPrisonGangs gangs; - private XPrisonMines mines; - private XPrisonHistory history; - - private ItemMigrator itemMigrator; - - private List supportedPickaxes; - - private NicknameService nicknameService; - - - @Override - protected void load() { - instance = this; - registerWGFlag(); - } - - - @Override - protected void enable() { - - this.printOnEnableMessage(); - this.modules = new LinkedHashMap<>(); - this.fileManager = new FileManager(this); - this.fileManager.getConfig("config.yml").copyDefaults(true).save(); - this.debugMode = this.getConfig().getBoolean("debug-mode", false); - - // All you have to do is adding the following two lines in your onEnable method. - // You can find the plugin ids of your plugins on the page https://bstats.org/what-is-my-plugin-id - int pluginId = 10520; // <-- Replace with the id of your plugin! - Metrics metrics = new Metrics(this, pluginId); - - if (!this.initDatabase()) { - this.getServer().getPluginManager().disablePlugin(this); - return; - } - - if (!this.setupEconomy()) { - this.getLogger().warning("Economy provider for Vault not found! Economy provider is strictly required. Disabling plugin..."); - this.getServer().getPluginManager().disablePlugin(this); - return; - } else { - this.getLogger().info("Economy provider for Vault found - " + this.getEconomy().getName()); - } - - this.initVariables(); - this.initModules(); - this.loadModules(); - - this.itemMigrator = new ItemMigrator(this); - this.itemMigrator.reload(); - - this.initNicknameService(); - - this.registerPlaceholders(); - - this.registerMainEvents(); - this.registerMainCommand(); - this.startMetrics(); - - SkullUtils.init(); - } - - private void printOnEnableMessage() { - try { - this.getLogger().info(FigletFont.convertOneLine("X-PRISON")); - this.getLogger().info(this.getDescription().getVersion()); - this.getLogger().info("By: " + this.getDescription().getAuthors()); - this.getLogger().info("Website: " + this.getDescription().getWebsite()); - } catch (IOException ignored) { - } - } - - private void initNicknameService() { - NicknameRepository nicknameRepository = new NicknameRepositoryImpl(this.getPluginDatabase()); - nicknameRepository.createTables(); - this.nicknameService = new NicknameServiceImpl(nicknameRepository); - } - - private void initVariables() { - this.supportedPickaxes = this.getConfig().getStringList("supported-pickaxes").stream().map(CompMaterial::fromString).map(CompMaterial::getMaterial).collect(Collectors.toList()); - - for (Material m : this.supportedPickaxes) { - this.getLogger().info("Added support for pickaxe: " + m); - } - } - - private void loadModules() { - if (this.getConfig().getBoolean("modules.tokens")) { - this.loadModule(tokens); - } - - if (this.getConfig().getBoolean("modules.gems")) { - this.loadModule(gems); - } - - if (this.getConfig().getBoolean("modules.ranks")) { - this.loadModule(ranks); - } - - if (this.getConfig().getBoolean("modules.prestiges")) { - this.loadModule(prestiges); - } - - if (this.getConfig().getBoolean("modules.multipliers")) { - this.loadModule(multipliers); - } - - if (this.getConfig().getBoolean("modules.autosell")) { - if (isUltraBackpacksEnabled()) { - this.getLogger().info("Module AutoSell will not be loaded because selling system is handled by UltraBackpacks."); - } else { - this.loadModule(autoSell); - } - } - - if (this.getConfig().getBoolean("modules.mines")) { - this.loadModule(mines); - } - - if (this.getConfig().getBoolean("modules.enchants")) { - this.loadModule(enchants); - } - if (this.getConfig().getBoolean("modules.autominer")) { - this.loadModule(autoMiner); - } - if (this.getConfig().getBoolean("modules.gangs")) { - this.loadModule(gangs); - } - if (this.getConfig().getBoolean("modules.pickaxe_levels")) { - if (!this.isModuleEnabled("Enchants")) { - this.getLogger().warning(TextUtils.applyColor("&cX-Prison - Module 'Pickaxe Levels' requires to have enchants module enabled.")); - } else { - this.loadModule(pickaxeLevels); - } - } - if (this.getConfig().getBoolean("modules.history")) { - this.loadModule(history); - } - } - - private boolean initDatabase() { - try { - String databaseType = this.getConfig().getString("database_type"); - ConnectionProperties connectionProperties = ConnectionProperties.fromConfig(this.getConfig()); - - if ("sqlite".equalsIgnoreCase(databaseType)) { - this.pluginDatabase = new SQLiteDatabase(this, connectionProperties); - this.getLogger().info("Using SQLite (local) database."); - } else if ("mysql".equalsIgnoreCase(databaseType)) { - DatabaseCredentials credentials = DatabaseCredentials.fromConfig(this.getConfig()); - this.pluginDatabase = new MySQLDatabase(this, credentials, connectionProperties); - this.getLogger().info("Using MySQL (remote) database."); - } else { - this.getLogger().warning(String.format("Error! Unknown database type: %s. Disabling plugin.", databaseType)); - this.getServer().getPluginManager().disablePlugin(this); - return false; - } - - this.pluginDatabase.connect(); - } catch (Exception e) { - this.getLogger().warning("Could not maintain Database Connection. Disabling plugin."); - e.printStackTrace(); - return false; - } - return true; - } - - private void initModules() { - this.tokens = new XPrisonTokens(this); - this.gems = new XPrisonGems(this); - this.ranks = new XPrisonRanks(this); - this.prestiges = new XPrisonPrestiges(this); - this.multipliers = new XPrisonMultipliers(this); - this.enchants = new XPrisonEnchants(this); - this.autoSell = new XPrisonAutoSell(this); - this.autoMiner = new XPrisonAutoMiner(this); - this.pickaxeLevels = new XPrisonPickaxeLevels(this); - this.gangs = new XPrisonGangs(this); - this.mines = new XPrisonMines(this); - this.history = new XPrisonHistory(this); - - this.modules.put(this.tokens.getName().toLowerCase(), this.tokens); - this.modules.put(this.gems.getName().toLowerCase(), this.gems); - this.modules.put(this.ranks.getName().toLowerCase(), this.ranks); - this.modules.put(this.prestiges.getName().toLowerCase(), this.prestiges); - this.modules.put(this.multipliers.getName().toLowerCase(), this.multipliers); - this.modules.put(this.enchants.getName().toLowerCase(), this.enchants); - this.modules.put(this.autoSell.getName().toLowerCase(), this.autoSell); - this.modules.put(this.autoMiner.getName().toLowerCase(), this.autoMiner); - this.modules.put(this.pickaxeLevels.getName().toLowerCase(), this.pickaxeLevels); - this.modules.put(this.gangs.getName().toLowerCase(), this.gangs); - this.modules.put(this.mines.getName().toLowerCase(), this.mines); - this.modules.put(this.history.getName().toLowerCase(), this.history); - } - - private void registerMainEvents() { - //Updating of mapping table - Events.subscribe(PlayerJoinEvent.class, EventPriority.LOW) - .handler(e -> { - this.nicknameService.updatePlayerNickname(e.getPlayer()); - }).bindWith(this); - } - - private void startMetrics() { - new Metrics(this, Constants.METRICS_SERVICE_ID); - } - - private void loadModule(XPrisonModule module) { - if (module.isEnabled()) { - return; - } - module.enable(); - this.getLogger().info(TextUtils.applyColor(String.format("&aX-Prison - Module %s loaded.", module.getName()))); - } - - //Always unload via iterator! - private void unloadModule(XPrisonModule module) { - if (!module.isEnabled()) { - return; - } - module.disable(); - this.getLogger().info(TextUtils.applyColor(String.format("&aX-Prison - Module %s unloaded.", module.getName()))); - } - - public void debug(String msg, XPrisonModule module) { - if (!this.debugMode) { - return; - } - if (module != null) { - this.getLogger().info(String.format("[%s] %s", module.getName(), TextUtils.applyColor(msg))); - } else { - this.getLogger().info(TextUtils.applyColor(msg)); - } - } - - public void reloadModule(XPrisonModule module) { - if (!module.isEnabled()) { - return; - } - module.reload(); - this.getLogger().info(TextUtils.applyColor(String.format("X-Prison - Module %s reloaded.", module.getName()))); - } - - private void registerMainCommand() { - - List commandAliases = this.getConfig().getStringList("main-command-aliases"); - String[] commandAliasesArray = commandAliases.toArray(new String[commandAliases.size()]); - - Commands.create() - .assertPermission("xprison.admin") - .handler(c -> { - if (c.args().size() == 0 && c.sender() instanceof Player) { - new MainMenu(this, (Player) c.sender()).open(); - } else if (c.args().size() >= 1) { - if ("reload".equalsIgnoreCase(c.rawArg(0))) { - final String name = c.args().size() >= 2 ? c.rawArg(1).trim().toLowerCase().replace("-", "") : "all"; - switch (name) { - case "all": - case "*": - getModules().forEach(this::reloadModule); - getItemMigrator().reload(); - c.sender().sendMessage(TextUtils.applyColor("&aSuccessfully reloaded all the plugin")); - break; - case "migrator": - case "itemmigrator": - getItemMigrator().reload(); - c.sender().sendMessage(TextUtils.applyColor("&aSuccessfully reloaded item migrator")); - break; - default: - final XPrisonModule module = modules.get(name); - if (module != null) { - reloadModule(module); - c.sender().sendMessage(TextUtils.applyColor("&aSuccessfully reloaded &f" + name + " &amodule")); - } else { - c.sender().sendMessage(TextUtils.applyColor("&cThe module &6" + c.rawArg(1) + " &cdoesn't exist")); - } - break; - } - } else if (c.sender() instanceof Player && "help".equalsIgnoreCase(c.rawArg(0)) || "?".equalsIgnoreCase(c.rawArg(0))) { - new HelpGui((Player) c.sender()).open(); - } - } - }).registerAndBind(this, commandAliasesArray); - } - - @Override - protected void disable() { - - Iterator it = this.modules.values().iterator(); - - while (it.hasNext()) { - this.unloadModule(it.next()); - it.remove(); - } - - if (this.pluginDatabase != null) { - if (this.pluginDatabase instanceof SQLDatabase) { - SQLDatabase sqlDatabase = (SQLDatabase) this.pluginDatabase; - sqlDatabase.close(); - } - } - } - - - public boolean isModuleEnabled(String moduleName) { - XPrisonModule module = this.modules.get(moduleName.toLowerCase()); - return module != null && module.isEnabled(); - } - - private void registerPlaceholders() { - - if (isMVdWPlaceholderAPIEnabled()) { - new XPrisonMVdWPlaceholder(this).register(); - } - - if (isPlaceholderAPIEnabled()) { - new XPrisonPAPIPlaceholder(this).register(); - } - } - - private boolean setupEconomy() { - - if (getServer().getPluginManager().getPlugin("Vault") == null) { - return false; - } - - RegisteredServiceProvider rsp = getServer().getServicesManager().getRegistration(Economy.class); - - if (rsp == null) { - return false; - } - - economy = rsp.getProvider(); - return economy != null; - } - - public boolean isPickaxeSupported(Material m) { - return this.supportedPickaxes.contains(m); - } - - public boolean isPickaxeSupported(ItemStack item) { - return item != null && isPickaxeSupported(item.getType()); - } - - public Collection getModules() { - return this.modules.values(); - } - - public boolean isDebugMode() { - return debugMode; - } - - public void setDebugMode(boolean enabled) { - this.debugMode = enabled; - this.getConfig().set("debug-mode", debugMode); - this.saveConfig(); - } - - public boolean isUltraBackpacksEnabled() { - return this.getServer().getPluginManager().isPluginEnabled("UltraBackpacks"); - } - - public boolean isPlaceholderAPIEnabled() { - return this.getServer().getPluginManager().isPluginEnabled("PlaceholderAPI"); - } - - public boolean isMVdWPlaceholderAPIEnabled() { - return this.getServer().getPluginManager().isPluginEnabled("MVdWPlaceholderAPI"); - } - - private void registerWGFlag() { - - if (Bukkit.getPluginManager().getPlugin("WorldGuard") == null) { - return; - } - - try { - getWorldGuardWrapper().registerFlag(Constants.ENCHANTS_WG_FLAG_NAME, WrappedState.class, WrappedState.DENY); - } catch (IllegalStateException e) { - // This happens during plugin reloads. Flag cannot be registered as WG was already loaded, - // so we can safely ignore this exception. - } - } - - public static XPrison getInstance() { - return instance; - } - - public WorldGuardWrapper getWorldGuardWrapper() { - return WorldGuardWrapper.getInstance(); - } -} diff --git a/src/main/java/me/nvus/xprison/XPrisonModule.java b/src/main/java/me/nvus/xprison/XPrisonModule.java deleted file mode 100644 index 2142c95..0000000 --- a/src/main/java/me/nvus/xprison/XPrisonModule.java +++ /dev/null @@ -1,18 +0,0 @@ -package me.nvus.xprison; - -public interface XPrisonModule { - - void enable(); - - void disable(); - - void reload(); - - boolean isEnabled(); - - String getName(); - - boolean isHistoryEnabled(); - - void resetPlayerData(); -} diff --git a/src/main/java/me/nvus/xprison/api/enums/LostCause.java b/src/main/java/me/nvus/xprison/api/enums/LostCause.java deleted file mode 100644 index 76ce28c..0000000 --- a/src/main/java/me/nvus/xprison/api/enums/LostCause.java +++ /dev/null @@ -1,30 +0,0 @@ -package me.nvus.xprison.api.enums; - -public enum LostCause { - - /** - * Player lost currency by pay command - */ - PAY, - /** - * Player lost currency by enchanting - */ - ENCHANT, - /** - * Player lost currency by prestiging - */ - PRESTIGE, - /** - * Player lost currency by rank up - */ - RANKUP, - /** - * Player lost currency by admin running command - */ - ADMIN, - /** - * Player lost currency by withdrawing to physical form - */ - WITHDRAW, - -} diff --git a/src/main/java/me/nvus/xprison/api/enums/ReceiveCause.java b/src/main/java/me/nvus/xprison/api/enums/ReceiveCause.java deleted file mode 100644 index e35dbb3..0000000 --- a/src/main/java/me/nvus/xprison/api/enums/ReceiveCause.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.nvus.xprison.api.enums; - -/** - * ReceiveCause enum for Gems and Tokens events. - */ -public enum ReceiveCause { - /** - * Player received currency during mining (himself) - */ - MINING, - /** - * Player received currency by pay command - */ - PAY, - /** - * Player received currency by give command - */ - GIVE, - /** - * Player received currency by redeeming items - */ - REDEEM, - /** - * Player received currency by breaking lucky blocks - */ - LUCKY_BLOCK, - /** - * Player received currency by disenchanting - */ - REFUND, - /** - * Player received currency by mining (from other players) - */ - MINING_OTHERS -} diff --git a/src/main/java/me/nvus/xprison/api/events/XPrisonEvent.java b/src/main/java/me/nvus/xprison/api/events/XPrisonEvent.java deleted file mode 100644 index 232803d..0000000 --- a/src/main/java/me/nvus/xprison/api/events/XPrisonEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.nvus.xprison.api.events; - -import org.bukkit.event.Event; - -public abstract class XPrisonEvent extends Event { -} diff --git a/src/main/java/me/nvus/xprison/api/events/player/XPrisonPlayerEvent.java b/src/main/java/me/nvus/xprison/api/events/player/XPrisonPlayerEvent.java deleted file mode 100644 index 5a89b2b..0000000 --- a/src/main/java/me/nvus/xprison/api/events/player/XPrisonPlayerEvent.java +++ /dev/null @@ -1,20 +0,0 @@ -package me.nvus.xprison.api.events.player; - -import me.nvus.xprison.api.events.XPrisonEvent; -import lombok.Getter; -import org.bukkit.OfflinePlayer; - -public abstract class XPrisonPlayerEvent extends XPrisonEvent { - - @Getter - protected OfflinePlayer player; - - /** - * Abstract XPrisonPlayerEvent - * - * @param player Player - */ - public XPrisonPlayerEvent(OfflinePlayer player) { - this.player = player; - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/XPrisonAutoMiner.java b/src/main/java/me/nvus/xprison/autominer/XPrisonAutoMiner.java deleted file mode 100644 index b46cc45..0000000 --- a/src/main/java/me/nvus/xprison/autominer/XPrisonAutoMiner.java +++ /dev/null @@ -1,114 +0,0 @@ -package me.nvus.xprison.autominer; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.autominer.api.XPrisonAutoMinerAPI; -import me.nvus.xprison.autominer.api.XPrisonAutoMinerAPIImpl; -import me.nvus.xprison.autominer.command.AdminAutoMinerCommand; -import me.nvus.xprison.autominer.command.AutoMinerCommand; -import me.nvus.xprison.autominer.config.AutoMinerConfig; -import me.nvus.xprison.autominer.listener.AutoMinerListener; -import me.nvus.xprison.autominer.manager.AutoMinerManager; -import me.nvus.xprison.autominer.repo.AutominerRepository; -import me.nvus.xprison.autominer.repo.impl.AutominerRepositoryImpl; -import me.nvus.xprison.autominer.service.AutominerService; -import me.nvus.xprison.autominer.service.impl.AutominerServiceImpl; -import lombok.Getter; - -public final class XPrisonAutoMiner implements XPrisonModule { - - public static final String MODULE_NAME = "Auto Miner"; - - @Getter - private static XPrisonAutoMiner instance; - - @Getter - private final XPrison core; - - @Getter - private AutoMinerManager manager; - - @Getter - private AutoMinerConfig autoMinerConfig; - - @Getter - private XPrisonAutoMinerAPI api; - - @Getter - private AutominerService autominerService; - - @Getter - private AutominerRepository autominerRepository; - - private boolean enabled; - - public XPrisonAutoMiner(XPrison core) { - this.core = core; - } - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void enable() { - instance = this; - - this.autoMinerConfig = new AutoMinerConfig(this); - this.autoMinerConfig.load(); - - this.autominerRepository = new AutominerRepositoryImpl(this.core.getPluginDatabase()); - this.autominerRepository.createTables(); - this.autominerRepository.removeExpiredAutoMiners(); - - this.autominerService = new AutominerServiceImpl(this.autominerRepository); - - this.manager = new AutoMinerManager(this); - this.manager.load(); - - AutoMinerListener listener = new AutoMinerListener(this); - listener.subscribeToEvents(); - - this.registerCommands(); - - this.api = new XPrisonAutoMinerAPIImpl(this); - - this.enabled = true; - } - - @Override - public void disable() { - this.manager.disable(); - this.enabled = false; - } - - @Override - public void reload() { - this.autoMinerConfig.reload(); - this.manager.reload(); - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return true; - } - - @Override - public void resetPlayerData() { - this.autominerRepository.clearTableData(); - } - - private void registerCommands() { - AutoMinerCommand autoMinerCommand = new AutoMinerCommand(this); - autoMinerCommand.register(); - - AdminAutoMinerCommand adminAutoMinerCommand = new AdminAutoMinerCommand(this); - adminAutoMinerCommand.register(); - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/api/XPrisonAutoMinerAPI.java b/src/main/java/me/nvus/xprison/autominer/api/XPrisonAutoMinerAPI.java deleted file mode 100644 index b5969fa..0000000 --- a/src/main/java/me/nvus/xprison/autominer/api/XPrisonAutoMinerAPI.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.nvus.xprison.autominer.api; - -import org.bukkit.entity.Player; - -public interface XPrisonAutoMinerAPI { - - /** - * Returns true if player is in autominer region, otherwise return false - * - * @param player Player - * @return returns true if player is in autominer region, otherwise return false - */ - boolean isInAutoMinerRegion(Player player); - - /** - * Returns remaining autominer time in seconds for specific player - * - * @param player Player - * @return time in seconds left for specific player autominer - */ - int getAutoMinerTime(Player player); -} diff --git a/src/main/java/me/nvus/xprison/autominer/api/XPrisonAutoMinerAPIImpl.java b/src/main/java/me/nvus/xprison/autominer/api/XPrisonAutoMinerAPIImpl.java deleted file mode 100644 index 4763e16..0000000 --- a/src/main/java/me/nvus/xprison/autominer/api/XPrisonAutoMinerAPIImpl.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.nvus.xprison.autominer.api; - -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import org.bukkit.entity.Player; - -public final class XPrisonAutoMinerAPIImpl implements XPrisonAutoMinerAPI { - - private final XPrisonAutoMiner plugin; - - public XPrisonAutoMinerAPIImpl(XPrisonAutoMiner plugin) { - this.plugin = plugin; - } - - @Override - public boolean isInAutoMinerRegion(Player player) { - return this.plugin.getManager().isInAutoMinerRegion(player); - } - - @Override - public int getAutoMinerTime(Player player) { - return this.plugin.getManager().getAutoMinerTime(player); - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/api/events/PlayerAutoMinerTimeModifyEvent.java b/src/main/java/me/nvus/xprison/autominer/api/events/PlayerAutoMinerTimeModifyEvent.java deleted file mode 100644 index 313ad73..0000000 --- a/src/main/java/me/nvus/xprison/autominer/api/events/PlayerAutoMinerTimeModifyEvent.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.nvus.xprison.autominer.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -import java.util.concurrent.TimeUnit; - -public final class PlayerAutoMinerTimeModifyEvent extends XPrisonPlayerEvent { - - private static final HandlerList handlers = new HandlerList(); - - @Getter - @Setter - private final TimeUnit timeUnit; - - @Getter - @Setter - private final long duration; - - /** - * Called when player received autominer time - * - * @param player Player - * @param unit TimeUnit - * @param duration duration, can be negative - */ - public PlayerAutoMinerTimeModifyEvent(Player player, TimeUnit unit, long duration) { - super(player); - this.timeUnit = unit; - this.duration = duration; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public @NotNull HandlerList getHandlers() { - return handlers; - } - -} diff --git a/src/main/java/me/nvus/xprison/autominer/api/events/PlayerAutomineEvent.java b/src/main/java/me/nvus/xprison/autominer/api/events/PlayerAutomineEvent.java deleted file mode 100644 index 5d6feca..0000000 --- a/src/main/java/me/nvus/xprison/autominer/api/events/PlayerAutomineEvent.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.nvus.xprison.autominer.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public final class PlayerAutomineEvent extends XPrisonPlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - @Getter - @Setter - private boolean cancelled; - - @Getter - private final int timeLeft; - - /** - * Called when player auto mines in region - * - * @param player Player - * @param timeLeft Timeleft in seconds of player's autominer time - */ - public PlayerAutomineEvent(Player player, int timeLeft) { - super(player); - this.timeLeft = timeLeft; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public @NotNull HandlerList getHandlers() { - return handlers; - } - -} diff --git a/src/main/java/me/nvus/xprison/autominer/command/AdminAutoMinerCommand.java b/src/main/java/me/nvus/xprison/autominer/command/AdminAutoMinerCommand.java deleted file mode 100644 index baad65e..0000000 --- a/src/main/java/me/nvus/xprison/autominer/command/AdminAutoMinerCommand.java +++ /dev/null @@ -1,78 +0,0 @@ -package me.nvus.xprison.autominer.command; - -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import me.nvus.xprison.autominer.utils.AutoMinerConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import me.lucko.helper.command.context.CommandContext; -import me.lucko.helper.utils.Players; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -public class AdminAutoMinerCommand { - - private static final String[] COMMAND_ALIASES = {"adminautominer", "aam"}; - - private final XPrisonAutoMiner plugin; - - public AdminAutoMinerCommand(XPrisonAutoMiner plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPermission(AutoMinerConstants.ADMIN_PERMISSION) - .tabHandler(this::createTabHandler) - .handler(c -> { - - if (!validateArguments(c)) { - return; - } - - String action = c.rawArg(0); - - Player target = c.arg(1).parseOrFail(Player.class); - long time = c.arg(2).parseOrFail(Long.class); - - TimeUnit timeUnit; - try { - timeUnit = TimeUnit.valueOf(Objects.requireNonNull(c.rawArg(3)).toUpperCase()); - } catch (IllegalArgumentException e) { - PlayerUtils.sendMessage(c.sender(), "&cInvalid time unit! Please use one from: " + StringUtils.join(TimeUnit.values(), ",")); - return; - } - - if ("remove".equalsIgnoreCase(action)) { - time = -time; - } - - this.plugin.getManager().modifyPlayerAutoMinerTime(c.sender(), target, time, timeUnit); - }).registerAndBind(this.plugin.getCore(), COMMAND_ALIASES); - } - - private List createTabHandler(CommandContext context) { - List list = new ArrayList<>(); - - if (context.args().size() == 1) { - list = Arrays.asList("give", "remove"); - } else if (context.args().size() == 2) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } else if (context.args().size() == 4) { - list = Arrays.stream(TimeUnit.values()).map(TimeUnit::name).collect(Collectors.toList()); - } - - return list; - } - - private boolean validateArguments(CommandContext c) { - return c.args().size() == 4 && ("give".equalsIgnoreCase(c.rawArg(0)) || "remove".equalsIgnoreCase(c.rawArg(0))); - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/command/AutoMinerCommand.java b/src/main/java/me/nvus/xprison/autominer/command/AutoMinerCommand.java deleted file mode 100644 index 65d753d..0000000 --- a/src/main/java/me/nvus/xprison/autominer/command/AutoMinerCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.nvus.xprison.autominer.command; - -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import me.nvus.xprison.autominer.utils.AutoMinerUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import me.lucko.helper.command.context.CommandContext; -import org.bukkit.entity.Player; - -public class AutoMinerCommand { - - private static final String[] COMMAND_ALIASES = {"autominer"}; - - private final XPrisonAutoMiner plugin; - - public AutoMinerCommand(XPrisonAutoMiner plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPlayer() - .handler(c -> { - - if (!validateArguments(c)) { - return; - } - - int timeLeft = this.plugin.getManager().getAutoMinerTime(c.sender()); - PlayerUtils.sendMessage(c.sender(), this.plugin.getAutoMinerConfig().getMessage("auto_miner_time").replace("%time%", AutoMinerUtils.getAutoMinerTimeLeftFormatted(timeLeft))); - - }).registerAndBind(this.plugin.getCore(), COMMAND_ALIASES); - } - - private boolean validateArguments(CommandContext c) { - return c.args().size() == 0; - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/config/AutoMinerConfig.java b/src/main/java/me/nvus/xprison/autominer/config/AutoMinerConfig.java deleted file mode 100644 index 480e18d..0000000 --- a/src/main/java/me/nvus/xprison/autominer/config/AutoMinerConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -package me.nvus.xprison.autominer.config; - -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.utils.text.TextUtils; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.util.HashMap; -import java.util.Map; - -public class AutoMinerConfig { - - private final XPrisonAutoMiner plugin; - private final FileManager.Config config; - - private Map messages; - - public AutoMinerConfig(XPrisonAutoMiner plugin) { - this.plugin = plugin; - this.config = this.plugin.getCore().getFileManager().getConfig("autominer.yml").copyDefaults(true).save(); - } - - private void loadMessages() { - messages = new HashMap<>(); - - YamlConfiguration configuration = getYamlConfig(); - - for (String key : configuration.getConfigurationSection("messages").getKeys(false)) { - messages.put(key.toLowerCase(), TextUtils.applyColor(configuration.getString("messages." + key))); - } - } - - public String getMessage(String key) { - return messages.getOrDefault(key.toLowerCase(), "No message with key '" + key + "' found"); - } - - private void loadVariables() { - this.loadMessages(); - } - - private FileManager.Config getConfig() { - return this.config; - } - - public YamlConfiguration getYamlConfig() { - return this.config.get(); - } - - public void load() { - this.getConfig().reload(); - this.loadVariables(); - } - - public void reload() { - this.load(); - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/listener/AutoMinerListener.java b/src/main/java/me/nvus/xprison/autominer/listener/AutoMinerListener.java deleted file mode 100644 index 54efb0a..0000000 --- a/src/main/java/me/nvus/xprison/autominer/listener/AutoMinerListener.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.nvus.xprison.autominer.listener; - -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import me.lucko.helper.Events; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - -public class AutoMinerListener { - - private final XPrisonAutoMiner plugin; - - public AutoMinerListener(XPrisonAutoMiner plugin) { - this.plugin = plugin; - } - - public void subscribeToEvents() { - this.subscribeToPlayerJoinEvent(); - this.subscribeToPlayerQuitEvent(); - } - - private void subscribeToPlayerQuitEvent() { - Events.subscribe(PlayerQuitEvent.class) - .handler(e -> this.plugin.getManager().savePlayerAutoMinerData(e.getPlayer(), true)).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerJoinEvent() { - Events.subscribe(PlayerJoinEvent.class) - .handler(e -> this.plugin.getManager().loadPlayerAutoMinerData(e.getPlayer())).bindWith(this.plugin.getCore()); - } - -} diff --git a/src/main/java/me/nvus/xprison/autominer/manager/AutoMinerManager.java b/src/main/java/me/nvus/xprison/autominer/manager/AutoMinerManager.java deleted file mode 100644 index 4032401..0000000 --- a/src/main/java/me/nvus/xprison/autominer/manager/AutoMinerManager.java +++ /dev/null @@ -1,216 +0,0 @@ -package me.nvus.xprison.autominer.manager; - -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import me.nvus.xprison.autominer.api.events.PlayerAutoMinerTimeModifyEvent; -import me.nvus.xprison.autominer.api.events.PlayerAutomineEvent; -import me.nvus.xprison.autominer.model.AutoMinerRegion; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.utils.Players; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.codemc.worldguardwrapper.WorldGuardWrapper; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -public class AutoMinerManager { - - private final XPrisonAutoMiner plugin; - - private final Map autoMinerTimes; - - private List autoMinerRegions; - - public AutoMinerManager(XPrisonAutoMiner plugin) { - this.plugin = plugin; - this.autoMinerTimes = new ConcurrentHashMap<>(); - } - - private void loadAllPlayersAutoMinerData() { - Schedulers.async().run(() -> { - for (Player p : Players.all()) { - int timeLeft = this.plugin.getAutominerService().getPlayerAutoMinerTime(p); - this.autoMinerTimes.put(p.getUniqueId(), timeLeft); - this.plugin.getCore().debug(String.format("Loaded %s's AutoMiner Time.", p.getName()), this.plugin); - } - }); - } - - - public void loadPlayerAutoMinerData(Player p) { - Schedulers.async().run(() -> { - int timeLeft = this.plugin.getAutominerService().getPlayerAutoMinerTime(p); - this.autoMinerTimes.put(p.getUniqueId(), timeLeft); - this.plugin.getCore().debug(String.format("Loaded %s's AutoMiner Time.", p.getName()), this.plugin); - }); - } - - public void savePlayerAutoMinerData(Player p, boolean async) { - - int timeLeft = getAutoMinerTime(p); - - if (async) { - Schedulers.async().run(() -> savePlayerAutominerData(p, timeLeft)); - } else { - savePlayerAutominerData(p, timeLeft); - } - } - - private void savePlayerAutominerData(Player p, int timeLeft) { - this.plugin.getAutominerService().setAutoMiner(p, timeLeft); - this.autoMinerTimes.remove(p.getUniqueId()); - this.plugin.getCore().debug(String.format("Saved %s's AutoMiner time.", p.getName()), this.plugin); - } - - public void modifyPlayerAutoMinerTime(CommandSender sender, Player p, long time, TimeUnit unit) { - - if (p == null || !p.isOnline()) { - PlayerUtils.sendMessage(sender, "&cPlayer is not online!"); - return; - } - - PlayerAutoMinerTimeModifyEvent event = this.callAutoMinerTimeModifyEvent(p, time, unit); - - time = event.getDuration(); - unit = event.getTimeUnit(); - - int currentTime = getAutoMinerTime(p); - currentTime += unit.toSeconds(time); - - if (currentTime < 0) { - currentTime = 0; - } - - this.autoMinerTimes.put(p.getUniqueId(), currentTime); - - String messageKey = time < 0 ? "auto_miner_time_remove" : "auto_miner_time_add"; - PlayerUtils.sendMessage(sender, this.plugin.getAutoMinerConfig().getMessage(messageKey).replace("%time%", String.valueOf(Math.abs(time))).replace("%timeunit%", unit.name()).replace("%player%", p.getName())); - } - - private PlayerAutoMinerTimeModifyEvent callAutoMinerTimeModifyEvent(Player p, long time, TimeUnit unit) { - PlayerAutoMinerTimeModifyEvent event = new PlayerAutoMinerTimeModifyEvent(p, unit, time); - Events.callSync(event); - return event; - } - - public boolean hasAutoMinerTime(Player p) { - return getAutoMinerTime(p) > 0; - } - - public void decrementPlayerAutominerTime(Player p) { - int newAmount = autoMinerTimes.get(p.getUniqueId()) - 1; - autoMinerTimes.put(p.getUniqueId(), newAmount); - } - - public int getAutoMinerTime(Player player) { - return this.autoMinerTimes.getOrDefault(player.getUniqueId(), 0); - } - - public boolean isInAutoMinerRegion(Player player) { - for (AutoMinerRegion region : this.autoMinerRegions) { - if (region.getRegion().contains(player.getLocation())) { - return true; - } - } - return false; - } - - public PlayerAutomineEvent callAutoMineEvent(Player p) { - PlayerAutomineEvent event = new PlayerAutomineEvent(p, this.getAutoMinerTime(p)); - Events.callSync(event); - return event; - } - - public void saveAllPlayerAutoMinerData(boolean async) { - Players.all().forEach(p -> savePlayerAutoMinerData(p, async)); - this.plugin.getCore().getLogger().info("Saved online players auto miner data."); - } - - private void loadAutoMinerRegions() { - this.autoMinerRegions = new ArrayList<>(); - - YamlConfiguration configuration = this.plugin.getAutoMinerConfig().getYamlConfig(); - - Set regionNames = configuration.getConfigurationSection("auto-miner-regions").getKeys(false); - - for (String regionName : regionNames) { - String worldName = configuration.getString("auto-miner-regions." + regionName + ".world"); - World world = Bukkit.getWorld(worldName); - - if (world == null) { - plugin.getCore().getLogger().warning(String.format("Unable to get world with name %s! Disabling AutoMiner region.", worldName)); - return; - } - - int rewardPeriod = configuration.getInt("auto-miner-regions." + regionName + ".reward-period"); - - if (rewardPeriod <= 0) { - plugin.getCore().getLogger().warning("reward-period in autominer.yml for region " + regionName + " needs to be greater than 0!"); - return; - } - - Optional optRegion = WorldGuardWrapper.getInstance().getRegion(world, regionName); - - if (!optRegion.isPresent()) { - plugin.getCore().getLogger().warning(String.format("There is no such region named %s in world %s!", regionName, world.getName())); - return; - } - - List rewards = configuration.getStringList("auto-miner-regions." + regionName + ".rewards"); - - if (rewards.isEmpty()) { - plugin.getCore().getLogger().warning("rewards in autominer.yml for region " + regionName + " are empty!"); - return; - } - - int blocksBroken = configuration.getInt("auto-miner-regions." + regionName + ".blocks-broken"); - - if (blocksBroken <= 0) { - this.plugin.getCore().getLogger().warning("blocks-broken in autominer.yml for region " + regionName + " needs to be greater than 0!"); - return; - } - - AutoMinerRegion region = new AutoMinerRegion(this.plugin, world, optRegion.get(), rewards, rewardPeriod, blocksBroken); - region.startAutoMinerTask(); - - this.plugin.getCore().getLogger().info("AutoMiner region '" + regionName + "' loaded successfully!"); - this.autoMinerRegions.add(region); - } - } - - public void load() { - this.removeExpiredAutoMiners(); - this.loadAllPlayersAutoMinerData(); - this.loadAutoMinerRegions(); - } - - private void removeExpiredAutoMiners() { - Schedulers.async().run(() -> { - this.plugin.getAutominerService().removeExpiredAutoMiners(); - this.plugin.getCore().debug("Removed expired AutoMiners from database", this.plugin); - }); - } - - public void reload() { - this.stopAutoMinerRegions(); - this.loadAutoMinerRegions(); - } - - public void disable() { - this.stopAutoMinerRegions(); - this.saveAllPlayerAutoMinerData(false); - } - - private void stopAutoMinerRegions() { - for (AutoMinerRegion region : this.autoMinerRegions) { - region.stopAutoMinerTask(); - } - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/model/AutoMinerRegion.java b/src/main/java/me/nvus/xprison/autominer/model/AutoMinerRegion.java deleted file mode 100644 index 5507b5a..0000000 --- a/src/main/java/me/nvus/xprison/autominer/model/AutoMinerRegion.java +++ /dev/null @@ -1,75 +0,0 @@ -package me.nvus.xprison.autominer.model; - -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import lombok.Getter; -import me.lucko.helper.utils.Players; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.ArrayList; -import java.util.List; - -@Getter -public class AutoMinerRegion { - - private final XPrisonAutoMiner plugin; - private World world; - private IWrappedRegion region; - private List commands; - private int rewardPeriod; - private int blocksBroken; - private final AutoMinerTask autoMinerTask; - - public AutoMinerRegion(XPrisonAutoMiner plugin, World world, IWrappedRegion region, List rewards, int rewardPeriod, int blocksBroken) { - this.plugin = plugin; - this.world = world; - this.region = region; - this.commands = rewards; - this.rewardPeriod = rewardPeriod; - this.blocksBroken = blocksBroken; - this.autoMinerTask = new AutoMinerTask(this); - } - - public void startAutoMinerTask() { - this.autoMinerTask.start(); - } - - public List getPlayersInRegion() { - List list = new ArrayList<>(); - for (Player p : Players.all()) { - if (isInAutoMinerRegion(p)) { - list.add(p); - } - } - return list; - } - - private boolean isInAutoMinerRegion(Player p) { - return p.getWorld().getName().equals(this.world.getName()) && region.contains(p.getLocation()); - } - - public void stopAutoMinerTask() { - this.autoMinerTask.stop(); - } - - public void setWorld(World world) { - this.world = world; - } - - public void setRegion(IWrappedRegion region) { - this.region = region; - } - - public void setCommands(List commands) { - this.commands = commands; - } - - public void setRewardPeriod(int rewardPeriod) { - this.rewardPeriod = rewardPeriod; - } - - public void setBlocksBroken(int blocksBroken) { - this.blocksBroken = blocksBroken; - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/model/AutoMinerTask.java b/src/main/java/me/nvus/xprison/autominer/model/AutoMinerTask.java deleted file mode 100644 index 44243a4..0000000 --- a/src/main/java/me/nvus/xprison/autominer/model/AutoMinerTask.java +++ /dev/null @@ -1,115 +0,0 @@ -package me.nvus.xprison.autominer.model; - -import com.cryptomorin.xseries.messages.ActionBar; -import me.nvus.xprison.autominer.api.events.PlayerAutomineEvent; -import me.lucko.helper.Schedulers; -import me.lucko.helper.scheduler.Task; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -public final class AutoMinerTask implements Runnable { - - private final AtomicInteger counter; - private final AutoMinerRegion region; - private Task task; - - public AutoMinerTask(AutoMinerRegion region) { - this.region = region; - this.counter = new AtomicInteger(0); - } - - @Override - public void run() { - - int current = counter.getAndIncrement(); - boolean resetCounterAfterEnd = current >= region.getRewardPeriod(); - - List players = this.region.getPlayersInRegion(); - - for (Player p : players) { - - if (!this.executeTaskValidationAndNotifyPlayerOnFail(p)) { - continue; - } - - this.decrementPlayerAutoMinerTimeAndNotify(p); - - if (resetCounterAfterEnd) { - this.executeTaskLogic(p); - } - } - - if (resetCounterAfterEnd) { - counter.set(0); - } - } - - public void start() { - this.stop(); - this.task = Schedulers.async().runRepeating(this, 1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS); - } - - public void stop() { - if (this.task != null) { - this.task.stop(); - } - } - - private void decrementPlayerAutoMinerTimeAndNotify(Player p) { - this.region.getPlugin().getManager().decrementPlayerAutominerTime(p); - ActionBar.sendActionBar(p, this.region.getPlugin().getAutoMinerConfig().getMessage("auto_miner_enabled")); - } - - private boolean executeTaskValidationAndNotifyPlayerOnFail(Player p) { - - if (!this.checkPlayerAutoMinerTime(p)) { - ActionBar.sendActionBar(p, this.region.getPlugin().getAutoMinerConfig().getMessage("auto_miner_disabled")); - return false; - } - - if (!this.checkPlayerItemInHand(p)) { - ActionBar.sendActionBar(p, this.region.getPlugin().getAutoMinerConfig().getMessage("auto_miner_no_pickaxe")); - return false; - } - - return true; - } - - private void executeTaskLogic(Player p) { - - if (!this.callAutoMineEvent(p)) { - return; - } - - this.executeCommands(p); - this.region.getPlugin().getCore().getEnchants().getEnchantsManager().addBlocksBrokenToItem(p, p.getItemInHand(), this.region.getBlocksBroken()); - } - - private boolean callAutoMineEvent(Player p) { - PlayerAutomineEvent event = this.region.getPlugin().getManager().callAutoMineEvent(p); - return !event.isCancelled(); - } - - private boolean checkPlayerItemInHand(Player p) { - ItemStack item = p.getItemInHand(); - return this.region.getPlugin().getCore().isPickaxeSupported(item); - } - - private boolean checkPlayerAutoMinerTime(Player p) { - return this.region.getPlugin().getManager().hasAutoMinerTime(p); - } - - private void executeCommands(Player p) { - - if (this.region.getCommands().isEmpty()) { - return; - } - - this.region.getCommands().forEach(c -> Schedulers.sync().run(() -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), c.replace("%player%", p.getName())))); - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/repo/AutominerRepository.java b/src/main/java/me/nvus/xprison/autominer/repo/AutominerRepository.java deleted file mode 100644 index 6df0ca1..0000000 --- a/src/main/java/me/nvus/xprison/autominer/repo/AutominerRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.nvus.xprison.autominer.repo; - -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -public interface AutominerRepository { - - int getPlayerAutoMinerTime(OfflinePlayer player); - - void removeExpiredAutoMiners(); - - void saveAutoMiner(Player p, int timeLeft); - - void createTables(); - - void clearTableData(); -} diff --git a/src/main/java/me/nvus/xprison/autominer/repo/impl/AutominerRepositoryImpl.java b/src/main/java/me/nvus/xprison/autominer/repo/impl/AutominerRepositoryImpl.java deleted file mode 100644 index ef1f744..0000000 --- a/src/main/java/me/nvus/xprison/autominer/repo/impl/AutominerRepositoryImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -package me.nvus.xprison.autominer.repo.impl; - -import me.nvus.xprison.autominer.repo.AutominerRepository; -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.database.model.SQLDatabaseType; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class AutominerRepositoryImpl implements AutominerRepository { - - private static final String TABLE_NAME = "UltraPrison_AutoMiner"; - private static final String AUTOMINER_UUID_COLNAME = "UUID"; - private static final String AUTOMINER_TIME_COLNAME = "time"; - private final SQLDatabase database; - - public AutominerRepositoryImpl(SQLDatabase database) { - - this.database = database; - } - - @Override - public int getPlayerAutoMinerTime(OfflinePlayer p) { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT * FROM " + TABLE_NAME + " WHERE " + AUTOMINER_UUID_COLNAME + "=?")) { - statement.setString(1, p.getUniqueId().toString()); - try (ResultSet set = statement.executeQuery()) { - if (set.next()) { - return set.getInt(AUTOMINER_TIME_COLNAME); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; - } - - @Override - public void removeExpiredAutoMiners() { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "DELETE FROM " + TABLE_NAME + " WHERE " + AUTOMINER_TIME_COLNAME + " <= 0")) { - statement.execute(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - @Override - public void saveAutoMiner(Player p, int timeLeft) { - if (database.getDatabaseType() == SQLDatabaseType.MYSQL) { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "INSERT INTO " + TABLE_NAME + " VALUES (?,?) ON DUPLICATE KEY UPDATE " + AUTOMINER_TIME_COLNAME + "=?")) { - statement.setString(1, p.getUniqueId().toString()); - statement.setInt(2, timeLeft); - statement.setInt(3, timeLeft); - statement.execute(); - } catch (SQLException e) { - e.printStackTrace(); - } - } else { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "INSERT OR REPLACE INTO " + TABLE_NAME + " VALUES(?,?)")) { - statement.setString(1, p.getUniqueId().toString()); - statement.setDouble(2, timeLeft); - statement.execute(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - - @Override - public void createTables() { - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(UUID varchar(36) NOT NULL UNIQUE, time int, primary key (UUID))"); - } - - @Override - public void clearTableData() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME); - } -} diff --git a/src/main/java/me/nvus/xprison/autominer/service/AutominerService.java b/src/main/java/me/nvus/xprison/autominer/service/AutominerService.java deleted file mode 100644 index f637b70..0000000 --- a/src/main/java/me/nvus/xprison/autominer/service/AutominerService.java +++ /dev/null @@ -1,13 +0,0 @@ -package me.nvus.xprison.autominer.service; - -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -public interface AutominerService { - - int getPlayerAutoMinerTime(OfflinePlayer player); - - void removeExpiredAutoMiners(); - - void setAutoMiner(Player p, int timeLeft); -} diff --git a/src/main/java/me/nvus/xprison/autominer/service/impl/AutominerServiceImpl.java b/src/main/java/me/nvus/xprison/autominer/service/impl/AutominerServiceImpl.java deleted file mode 100644 index b31aac4..0000000 --- a/src/main/java/me/nvus/xprison/autominer/service/impl/AutominerServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.nvus.xprison.autominer.service.impl; - -import me.nvus.xprison.autominer.repo.AutominerRepository; -import me.nvus.xprison.autominer.service.AutominerService; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -public class AutominerServiceImpl implements AutominerService { - - private final AutominerRepository repository; - - public AutominerServiceImpl(AutominerRepository repository) { - - this.repository = repository; - } - - @Override - public int getPlayerAutoMinerTime(OfflinePlayer player) { - return repository.getPlayerAutoMinerTime(player); - } - - @Override - public void removeExpiredAutoMiners() { - repository.removeExpiredAutoMiners(); - } - - @Override - public void setAutoMiner(Player p, int timeLeft) { - repository.saveAutoMiner(p, timeLeft); - } - -} diff --git a/src/main/java/me/nvus/xprison/autominer/utils/AutoMinerConstants.java b/src/main/java/me/nvus/xprison/autominer/utils/AutoMinerConstants.java deleted file mode 100644 index 0a85666..0000000 --- a/src/main/java/me/nvus/xprison/autominer/utils/AutoMinerConstants.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.nvus.xprison.autominer.utils; - -public class AutoMinerConstants { - - public static final String ADMIN_PERMISSION = "xprison.autominer.admin"; -} diff --git a/src/main/java/me/nvus/xprison/autominer/utils/AutoMinerUtils.java b/src/main/java/me/nvus/xprison/autominer/utils/AutoMinerUtils.java deleted file mode 100644 index 52617ee..0000000 --- a/src/main/java/me/nvus/xprison/autominer/utils/AutoMinerUtils.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.nvus.xprison.autominer.utils; - -public class AutoMinerUtils { - - public static String getAutoMinerTimeLeftFormatted(int timeLeft) { - - if (timeLeft == 0) { - return "0s"; - } - - long days = timeLeft / (24 * 60 * 60); - timeLeft -= days * (24 * 60 * 60); - - long hours = timeLeft / (60 * 60); - timeLeft -= hours * (60 * 60); - - long minutes = timeLeft / (60); - timeLeft -= minutes * (60); - - long seconds = timeLeft; - - return days + "d " + hours + "h " + minutes + "m " + seconds + "s"; - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/XPrisonAutoSell.java b/src/main/java/me/nvus/xprison/autosell/XPrisonAutoSell.java deleted file mode 100644 index 6c4cfb9..0000000 --- a/src/main/java/me/nvus/xprison/autosell/XPrisonAutoSell.java +++ /dev/null @@ -1,108 +0,0 @@ -package me.nvus.xprison.autosell; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.autosell.api.XPrisonAutoSellAPI; -import me.nvus.xprison.autosell.api.XPrisonAutoSellAPIImpl; -import me.nvus.xprison.autosell.command.AutoSellCommand; -import me.nvus.xprison.autosell.command.SellAllCommand; -import me.nvus.xprison.autosell.command.SellPriceCommand; -import me.nvus.xprison.autosell.config.AutoSellConfig; -import me.nvus.xprison.autosell.listener.AutoSellListener; -import me.nvus.xprison.autosell.manager.AutoSellManager; -import me.nvus.xprison.autosell.model.AutoSellBroadcastTask; -import me.nvus.xprison.multipliers.XPrisonMultipliers; -import lombok.Getter; - -public final class XPrisonAutoSell implements XPrisonModule { - - public static final String MODULE_NAME = "Auto Sell"; - - @Getter - private static XPrisonAutoSell instance; - @Getter - private final XPrison core; - @Getter - private XPrisonAutoSellAPI api; - @Getter - private AutoSellConfig autoSellConfig; - @Getter - private AutoSellManager manager; - @Getter - private AutoSellBroadcastTask broadcastTask; - - private boolean enabled; - - public XPrisonAutoSell(XPrison core) { - instance = this; - this.core = core; - } - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void reload() { - this.autoSellConfig.reload(); - this.manager.reload(); - } - - - @Override - public void enable() { - this.autoSellConfig = new AutoSellConfig(this); - this.autoSellConfig.load(); - - this.manager = new AutoSellManager(this); - this.manager.load(); - - this.broadcastTask = new AutoSellBroadcastTask(this); - this.broadcastTask.start(); - - AutoSellListener listener = new AutoSellListener(this); - listener.subscribeToEvents(); - - this.registerCommands(); - - this.api = new XPrisonAutoSellAPIImpl(this); - this.enabled = true; - } - - private void registerCommands() { - SellAllCommand sellAllCommand = new SellAllCommand(this); - sellAllCommand.register(); - - AutoSellCommand autoSellCommand = new AutoSellCommand(this); - autoSellCommand.register(); - - SellPriceCommand sellPriceCommand = new SellPriceCommand(this); - sellPriceCommand.register(); - } - - public boolean isMultipliersModuleEnabled() { - return this.core.isModuleEnabled(XPrisonMultipliers.MODULE_NAME); - } - - @Override - public void disable() { - this.broadcastTask.stop(); - this.enabled = false; - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return false; - } - - @Override - public void resetPlayerData() { - } - -} diff --git a/src/main/java/me/nvus/xprison/autosell/api/XPrisonAutoSellAPI.java b/src/main/java/me/nvus/xprison/autosell/api/XPrisonAutoSellAPI.java deleted file mode 100644 index 0da5d71..0000000 --- a/src/main/java/me/nvus/xprison/autosell/api/XPrisonAutoSellAPI.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.nvus.xprison.autosell.api; - -import me.nvus.xprison.autosell.model.SellRegion; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.Collection; -import java.util.List; - -public interface XPrisonAutoSellAPI { - - /** - * Method to get current earnings of player - * - * @param player Player - * @return Current earnings - */ - double getCurrentEarnings(Player player); - - /** - * Method to get price for ItemStack in specified mine region - * - * @param regionName Name of region - * @param item ItemStack - * @return Price for item - */ - double getPriceForItem(String regionName, ItemStack item); - - /** - * Method to get price for Block - * - * @param block Block - * @return Price for block - */ - double getPriceForBlock(Block block); - - /** - * Sells the given blocks - * - * @param player Player - * @param blocks List of blocks - */ - void sellBlocks(Player player, List blocks); - - /** - * Method to get if player has autosell enabled - * - * @param p Player - * @return true if player has autosell enabled, otherwise false - */ - boolean hasAutoSellEnabled(Player p); - - /** - * Method to get all sell regions - * - * @return Collection of all loaded and active Sell Regions - */ - Collection getSellRegions(); - - /** - * Method to get SellRegion at specified location - * - * @return Sell Region at given location or null if not present. - */ - SellRegion getSellRegionAtLocation(Location location); -} diff --git a/src/main/java/me/nvus/xprison/autosell/api/XPrisonAutoSellAPIImpl.java b/src/main/java/me/nvus/xprison/autosell/api/XPrisonAutoSellAPIImpl.java deleted file mode 100644 index 3580d1f..0000000 --- a/src/main/java/me/nvus/xprison/autosell/api/XPrisonAutoSellAPIImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package me.nvus.xprison.autosell.api; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.model.SellRegion; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.Collection; -import java.util.List; - -public final class XPrisonAutoSellAPIImpl implements XPrisonAutoSellAPI { - - private final XPrisonAutoSell plugin; - - public XPrisonAutoSellAPIImpl(XPrisonAutoSell plugin) { - this.plugin = plugin; - } - - @Override - public double getCurrentEarnings(Player player) { - return plugin.getManager().getCurrentEarnings(player); - } - - @Override - public double getPriceForItem(String regionName, ItemStack item) { - return plugin.getManager().getPriceForItem(regionName, item); - } - - @Override - public double getPriceForBlock(Block block) { - return plugin.getManager().getPriceForBlock(block); - } - - @Override - public void sellBlocks(Player player, List blocks) { - plugin.getManager().sellBlocks(player, blocks); - } - - @Override - public boolean hasAutoSellEnabled(Player p) { - return plugin.getManager().hasAutoSellEnabled(p); - } - - @Override - public Collection getSellRegions() { - return plugin.getManager().getAutoSellRegions(); - } - - @Override - public SellRegion getSellRegionAtLocation(Location location) { - return plugin.getManager().getAutoSellRegion(location); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/api/events/XPrisonAutoSellEvent.java b/src/main/java/me/nvus/xprison/autosell/api/events/XPrisonAutoSellEvent.java deleted file mode 100644 index e8aed8d..0000000 --- a/src/main/java/me/nvus/xprison/autosell/api/events/XPrisonAutoSellEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.nvus.xprison.autosell.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import me.nvus.xprison.autosell.model.AutoSellItemStack; -import me.nvus.xprison.autosell.model.SellRegion; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -import java.util.Map; - - -@Getter -public final class XPrisonAutoSellEvent extends XPrisonPlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private final Player player; - private final SellRegion region; - @Setter - private Map itemsToSell; - @Setter - private boolean cancelled; - - /** - * Called when mined blocks are automatically sold - * - * @param player Player - * @param reg IWrappedRegion where block was mined - * @param itemsToSell ItemStacks to sell with prices - */ - public XPrisonAutoSellEvent(Player player, SellRegion reg, Map itemsToSell) { - super(player); - this.player = player; - this.region = reg; - this.itemsToSell = itemsToSell; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/api/events/XPrisonSellAllEvent.java b/src/main/java/me/nvus/xprison/autosell/api/events/XPrisonSellAllEvent.java deleted file mode 100644 index 877a43b..0000000 --- a/src/main/java/me/nvus/xprison/autosell/api/events/XPrisonSellAllEvent.java +++ /dev/null @@ -1,53 +0,0 @@ -package me.nvus.xprison.autosell.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import me.nvus.xprison.autosell.model.AutoSellItemStack; -import me.nvus.xprison.autosell.model.SellRegion; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -import java.util.Map; - - -@Getter -public final class XPrisonSellAllEvent extends XPrisonPlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private final Player player; - private final SellRegion region; - - @Getter - @Setter - private Map itemsToSell; - - @Getter - @Setter - private boolean cancelled; - - /** - * Called when mined blocks are automatically sold - * - * @param player Player - * @param reg SellRegion where block was mined - * @param itemsToSell Map of items to sell with prices as values - */ - public XPrisonSellAllEvent(Player player, SellRegion reg, Map itemsToSell) { - super(player); - this.player = player; - this.region = reg; - this.itemsToSell = itemsToSell; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/command/AutoSellCommand.java b/src/main/java/me/nvus/xprison/autosell/command/AutoSellCommand.java deleted file mode 100644 index 6d1980a..0000000 --- a/src/main/java/me/nvus/xprison/autosell/command/AutoSellCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.nvus.xprison.autosell.command; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.utils.AutoSellContants; -import me.lucko.helper.Commands; - -public class AutoSellCommand { - - private static final String COMMAND_NAME = "autosell"; - private final XPrisonAutoSell plugin; - - public AutoSellCommand(XPrisonAutoSell plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPlayer() - .assertPermission(AutoSellContants.AUTOSELL_PERMISSION, this.plugin.getAutoSellConfig().getMessage("no_permission_autosell_toggle")) - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getManager().toggleAutoSell(c.sender()); - } - }).registerAndBind(this.plugin.getCore(), COMMAND_NAME); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/command/SellAllCommand.java b/src/main/java/me/nvus/xprison/autosell/command/SellAllCommand.java deleted file mode 100644 index cbacd03..0000000 --- a/src/main/java/me/nvus/xprison/autosell/command/SellAllCommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.nvus.xprison.autosell.command; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.utils.misc.RegionUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import me.lucko.helper.command.context.CommandContext; -import org.bukkit.entity.Player; -import org.codemc.worldguardwrapper.WorldGuardWrapper; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -public class SellAllCommand { - - private static final String COMMAND_NAME = "sellall"; - private final XPrisonAutoSell plugin; - - public SellAllCommand(XPrisonAutoSell plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPlayer() - .handler(c -> { - IWrappedRegion region = this.parseRegionFromCommandContext(c); - - if (region == null) { - PlayerUtils.sendMessage(c.sender(), this.plugin.getAutoSellConfig().getMessage("invalid_region")); - return; - } - - this.plugin.getManager().sellAll(c.sender(), region); - - }).registerAndBind(this.plugin.getCore(), COMMAND_NAME); - } - - private IWrappedRegion parseRegionFromCommandContext(CommandContext c) { - IWrappedRegion region = null; - if (c.args().size() == 0) { - region = RegionUtils.getRegionWithHighestPriority(c.sender().getLocation()); - } else if (c.args().size() == 1) { - String regionName = c.rawArg(0); - region = WorldGuardWrapper.getInstance().getRegion(c.sender().getLocation().getWorld(), regionName).orElse(null); - } - return region; - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/command/SellPriceCommand.java b/src/main/java/me/nvus/xprison/autosell/command/SellPriceCommand.java deleted file mode 100644 index 4f0265a..0000000 --- a/src/main/java/me/nvus/xprison/autosell/command/SellPriceCommand.java +++ /dev/null @@ -1,139 +0,0 @@ -package me.nvus.xprison.autosell.command; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.gui.AllSellRegionsGui; -import me.nvus.xprison.autosell.model.SellRegion; -import me.nvus.xprison.autosell.utils.AutoSellContants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.misc.RegionUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import me.lucko.helper.command.CommandInterruptException; -import me.lucko.helper.command.context.CommandContext; -import org.bukkit.entity.Player; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -public class SellPriceCommand { - - private static final String COMMAND_NAME = "sellprice"; - private final XPrisonAutoSell plugin; - - public SellPriceCommand(XPrisonAutoSell plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPlayer() - .assertPermission(AutoSellContants.ADMIN_PERMISSION) - .handler(c -> { - - if (!this.validateContext(c)) { - this.sendInvalidUsage(c.sender()); - return; - } - - if (isEditorCommand(c)) { - this.openEditorGui(c.sender()); - return; - } - - CompMaterial type = this.parseMaterialFromCommandContext(c); - double price = this.parsePriceFromCommandContext(c); - - if (!validateMaterial(type)) { - PlayerUtils.sendMessage(c.sender(), "&cInvalid item in hand / specified item!"); - return; - } - - if (!validatePrice(price)) { - PlayerUtils.sendMessage(c.sender(), "&cSell price needs to be higher than 0!"); - return; - } - - IWrappedRegion wrappedRegion = RegionUtils.getFirstRegionAtLocation(c.sender().getLocation()); - - if (!validateRegion(wrappedRegion)) { - PlayerUtils.sendMessage(c.sender(), "&cYou must be standing in a region / specify a valid region!"); - return; - } - - SellRegion sellRegion = this.getSellRegionFromWrappedRegion(wrappedRegion); - - if (sellRegion == null) { - sellRegion = new SellRegion(wrappedRegion, c.sender().getWorld()); - } - - sellRegion.addSellPrice(type, price); - - this.plugin.getManager().updateSellRegion(sellRegion); - this.plugin.getAutoSellConfig().saveSellRegion(sellRegion); - - PlayerUtils.sendMessage(c.sender(), String.format("&aSuccessfuly set sell price of &e%s &ato &e$%.2f &ain region &e%s", type.name(), price, wrappedRegion.getId())); - - }).registerAndBind(this.plugin.getCore(), COMMAND_NAME); - } - - private void openEditorGui(Player sender) { - AllSellRegionsGui.createAndOpenTo(sender); - } - - private boolean isEditorCommand(CommandContext c) { - return "editor".equalsIgnoreCase(c.rawArg(0)); - } - - private SellRegion getSellRegionByName(String name) { - return this.plugin.getManager().getSellRegionByName(name); - } - - private SellRegion getSellRegionFromWrappedRegion(IWrappedRegion region) { - return this.plugin.getManager().getSellRegionFromWrappedRegion(region); - } - - private boolean validateRegion(IWrappedRegion region) { - return region != null; - } - - private boolean validatePrice(double price) { - return price > 0.0; - } - - private boolean validateMaterial(CompMaterial type) { - return type != null; - } - - private void sendInvalidUsage(Player player) { - PlayerUtils.sendMessage(player, "&cInvalid usage!"); - PlayerUtils.sendMessage(player, "&c/sellprice editor - Opens Editor GUI for sell prices"); - PlayerUtils.sendMessage(player, "&c/sellprice - Sets the sell price of specified material."); - PlayerUtils.sendMessage(player, "&c/sellprice - Sets the sell price of item material you have in your hand."); - } - - private boolean validateContext(CommandContext context) { - return context.args().size() == 1 || context.args().size() == 2 || context.args().size() == 3; - } - - private CompMaterial parseMaterialFromCommandContext(CommandContext c) { - CompMaterial material = null; - if (c.args().size() == 1) { - if (c.sender().getItemInHand() == null) { - PlayerUtils.sendMessage(c.sender(), "&cPlease hold some item!"); - } else { - material = CompMaterial.fromItem(c.sender().getItemInHand()); - } - } else if (c.args().size() == 2) { - material = CompMaterial.fromString(c.rawArg(0)); - } - return material; - } - - private double parsePriceFromCommandContext(CommandContext c) throws CommandInterruptException { - double price = 0.0; - if (c.args().size() == 1) { - price = c.arg(0).parseOrFail(Double.class); - } else if (c.args().size() == 2) { - price = c.arg(1).parseOrFail(Double.class); - } - return price; - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/config/AutoSellConfig.java b/src/main/java/me/nvus/xprison/autosell/config/AutoSellConfig.java deleted file mode 100644 index 3f56114..0000000 --- a/src/main/java/me/nvus/xprison/autosell/config/AutoSellConfig.java +++ /dev/null @@ -1,112 +0,0 @@ -package me.nvus.xprison.autosell.config; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.model.SellRegion; -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.text.TextUtils; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class AutoSellConfig { - - private final XPrisonAutoSell plugin; - private final FileManager.Config config; - - private Map messages; - private boolean enableAutosellAutomatically; - private boolean autoSmelt; - private int autoSellBroadcastTime; - private List autoSellBroadcastMessage; - private boolean inventoryFullNotificationEnabled; - private List inventoryFullNotificationTitle; - private String inventoryFullNotificationMessage; - - - public AutoSellConfig(XPrisonAutoSell plugin) { - this.plugin = plugin; - this.config = this.plugin.getCore().getFileManager().getConfig("autosell.yml").copyDefaults(true).save(); - } - - public void reload() { - this.getConfig().reload(); - this.load(); - } - - public void load() { - this.loadVariables(); - } - - private void loadVariables() { - this.loadMessages(); - this.autoSellBroadcastTime = this.getYamlConfig().getInt("auto_sell_broadcast.time"); - this.autoSellBroadcastMessage = this.getYamlConfig().getStringList("auto_sell_broadcast.message"); - this.enableAutosellAutomatically = this.getYamlConfig().getBoolean("enable-autosell-automatically"); - this.autoSmelt = this.getYamlConfig().getBoolean("auto-smelt"); - this.inventoryFullNotificationEnabled = this.getYamlConfig().getBoolean("inventory_full_notification.enabled"); - this.inventoryFullNotificationTitle = this.getYamlConfig().getStringList("inventory_full_notification.title"); - this.inventoryFullNotificationMessage = this.getYamlConfig().getString("inventory_full_notification.chat"); - } - - private void loadMessages() { - this.messages = new HashMap<>(); - for (String key : this.getYamlConfig().getConfigurationSection("messages").getKeys(false)) { - messages.put(key.toLowerCase(), TextUtils.applyColor(this.getYamlConfig().getString("messages." + key))); - } - } - - private FileManager.Config getConfig() { - return this.config; - } - - public YamlConfiguration getYamlConfig() { - return this.config.get(); - } - - public String getMessage(String key) { - return messages.getOrDefault(key.toLowerCase(), "Message not found with key: " + key); - } - - public boolean isEnableAutosellAutomatically() { - return enableAutosellAutomatically; - } - - public boolean isAutoSmelt() { - return autoSmelt; - } - - public int getAutoSellBroadcastTime() { - return autoSellBroadcastTime; - } - - public List getAutoSellBroadcastMessage() { - return autoSellBroadcastMessage; - } - - public boolean isInventoryFullNotificationEnabled() { - return inventoryFullNotificationEnabled; - } - - public List getInventoryFullNotificationTitle() { - return inventoryFullNotificationTitle; - } - - public String getInventoryFullNotificationMessage() { - return inventoryFullNotificationMessage; - } - - public void saveSellRegion(SellRegion region) { - this.getConfig().set("regions." + region.getRegion().getId() + ".world", region.getWorld().getName()); - for (CompMaterial material : region.getSellingMaterials()) { - double sellPrice = region.getSellPriceForMaterial(material); - if (sellPrice <= 0.0) { - continue; - } - this.getConfig().set("regions." + region.getRegion().getId() + ".items." + material.name(), sellPrice); - } - this.getConfig().save(); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/gui/AllSellRegionsGui.java b/src/main/java/me/nvus/xprison/autosell/gui/AllSellRegionsGui.java deleted file mode 100644 index 8e78367..0000000 --- a/src/main/java/me/nvus/xprison/autosell/gui/AllSellRegionsGui.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.nvus.xprison.autosell.gui; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.model.SellRegion; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Item; -import me.lucko.helper.menu.paginated.PaginatedGui; -import me.lucko.helper.menu.paginated.PaginatedGuiBuilder; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.util.Collection; -import java.util.stream.Collectors; - -public final class AllSellRegionsGui { - - private AllSellRegionsGui() { - throw new UnsupportedOperationException("Cannot instantiate"); - } - - public static void createAndOpenTo(Player player) { - - PaginatedGuiBuilder builder = PaginatedGuiBuilder.create(); - - builder.title("Sell Regions"); - builder.lines(6); - builder.previousPageSlot(45); - builder.nextPageSlot(53); - builder.nextPageItem((pageInfo) -> ItemStackBuilder.of(Material.ARROW).name("&aNext Page").lore("&7Click to see next page.").build()); - builder.previousPageItem((pageInfo) -> ItemStackBuilder.of(Material.ARROW).name("&aPrevious Page").lore("&7Click to see previous page.").build()); - - Collection regions = getSellRegions(); - PaginatedGui gui = builder.build(player, paginatedGui -> regions.stream().map(sellRegion -> buildItemForSellRegion(sellRegion, player)).collect(Collectors.toList())); - gui.open(); - } - - private static Item buildItemForSellRegion(SellRegion sellRegion, Player player) { - return ItemStackBuilder.of(Material.DIAMOND_PICKAXE) - .name(sellRegion.getRegion().getId()) - .lore(" ", "&7Click to edit sell prices.", " ") - .build(() -> new SellRegionGui(sellRegion, player).open()); - } - - private static Collection getSellRegions() { - return XPrisonAutoSell.getInstance().getManager().getAutoSellRegions(); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/gui/SellRegionGui.java b/src/main/java/me/nvus/xprison/autosell/gui/SellRegionGui.java deleted file mode 100644 index 166ba14..0000000 --- a/src/main/java/me/nvus/xprison/autosell/gui/SellRegionGui.java +++ /dev/null @@ -1,59 +0,0 @@ -package me.nvus.xprison.autosell.gui; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.model.SellRegion; -import me.nvus.xprison.autosell.utils.SellPriceComparator; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public final class SellRegionGui extends Gui { - - private final SellRegion sellRegion; - - public SellRegionGui(SellRegion sellRegion, Player player) { - super(player, 6, sellRegion.getRegion().getId() + " Prices"); - this.sellRegion = sellRegion; - } - - @Override - public void redraw() { - this.clearItems(); - - this.setActionItems(); - - this.setBackItem(); - } - - private void setBackItem() { - this.setItem(45, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to all regions").build(() -> { - this.close(); - AllSellRegionsGui.createAndOpenTo(this.getPlayer()); - })); - } - - private void setActionItems() { - for (CompMaterial material : this.sellRegion.getSellingMaterialsSorted(new SellPriceComparator(sellRegion))) { - this.addItemForMaterial(material); - } - } - - - private void addItemForMaterial(CompMaterial material) { - double price = this.sellRegion.getSellPriceForMaterial(material); - - this.addItem(ItemStackBuilder.of(material.toItem()).name(material.name()).lore(" ", String.format("&7Sell Price: &2$&a%,.2f", price), " ", "&aLeft-Click &7to edit the price", "&aRight-Click &7to remove.").build(() -> { - this.deleteSellPrice(material); - this.redraw(); - }, () -> { - new UpdateSellPriceGui(this.getPlayer(), sellRegion, material).open(); - })); - } - - private void deleteSellPrice(CompMaterial material) { - this.sellRegion.removeSellPrice(material); - XPrisonAutoSell.getInstance().getAutoSellConfig().saveSellRegion(sellRegion); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/gui/UpdateSellPriceGui.java b/src/main/java/me/nvus/xprison/autosell/gui/UpdateSellPriceGui.java deleted file mode 100644 index c54ae6b..0000000 --- a/src/main/java/me/nvus/xprison/autosell/gui/UpdateSellPriceGui.java +++ /dev/null @@ -1,86 +0,0 @@ -package me.nvus.xprison.autosell.gui; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.model.SellRegion; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public final class UpdateSellPriceGui extends Gui { - - private final SellRegion sellRegion; - private final CompMaterial material; - private double price; - - public UpdateSellPriceGui(Player player, SellRegion sellRegion, CompMaterial material) { - super(player, 5, "Editing Sell Price"); - this.sellRegion = sellRegion; - this.material = material; - this.price = sellRegion.getSellPriceForMaterial(material); - } - - @Override - public void redraw() { - this.setPreviewItem(); - this.setActionItems(); - this.setBackItem(); - this.setSaveItem(); - } - - private void setPreviewItem() { - this.setItem(4, ItemStackBuilder.of(this.material.toItem()).name("&eSell Price").lore(" ", "&7Selling price for this block", String.format("&7in region &b%s &7is &2$&a%,.2f", this.sellRegion.getRegion().getId(), this.price)).buildItem().build()); - } - - private void setSaveItem() { - this.setItem(40, ItemStackBuilder.of(CompMaterial.GREEN_WOOL.toItem()).name("&aSave").lore("&7Click to save the current price.").build(() -> { - this.saveChanges(); - this.close(); - new SellRegionGui(this.sellRegion, this.getPlayer()).open(); - })); - } - - private void setBackItem() { - this.setItem(36, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to all blocks.").build(() -> { - this.close(); - new SellRegionGui(this.sellRegion, this.getPlayer()).open(); - })); - } - - private void setActionItems() { - this.setItem(10, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$1.0").build(() -> handleAddition(1.0))); - this.setItem(11, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$5.0").build(() -> handleAddition(5.0))); - this.setItem(12, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$10.0").build(() -> handleAddition(10.0))); - this.setItem(19, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$25.0").build(() -> handleAddition(25.0))); - this.setItem(20, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$50.0").build(() -> handleAddition(50.0))); - this.setItem(21, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$100.0").build(() -> handleAddition(100.0))); - this.setItem(28, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$250.0").build(() -> handleAddition(250.0))); - this.setItem(29, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$500.0").build(() -> handleAddition(500.0))); - this.setItem(30, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+$1000.0").build(() -> handleAddition(1000.0))); - - this.setItem(14, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$1.0").build(() -> handleAddition(-1.0))); - this.setItem(15, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$5.0").build(() -> handleAddition(-5.0))); - this.setItem(16, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$10.0").build(() -> handleAddition(-10.0))); - this.setItem(23, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$25.0").build(() -> handleAddition(-25.0))); - this.setItem(24, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$50.0").build(() -> handleAddition(-50.0))); - this.setItem(25, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$100.0").build(() -> handleAddition(-100.0))); - this.setItem(32, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$250.0").build(() -> handleAddition(-250.0))); - this.setItem(33, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$500.0").build(() -> handleAddition(-500.0))); - this.setItem(34, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-$1000.0").build(() -> handleAddition(-1000.0))); - } - - private void saveChanges() { - this.sellRegion.addSellPrice(this.material, this.price); - XPrisonAutoSell.getInstance().getAutoSellConfig().saveSellRegion(sellRegion); - } - - private void handleAddition(double addition) { - if (this.price + addition < 0.0) { - this.price = 0.0; - } else { - this.price += addition; - } - this.redraw(); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/listener/AutoSellListener.java b/src/main/java/me/nvus/xprison/autosell/listener/AutoSellListener.java deleted file mode 100644 index d7417fd..0000000 --- a/src/main/java/me/nvus/xprison/autosell/listener/AutoSellListener.java +++ /dev/null @@ -1,79 +0,0 @@ -package me.nvus.xprison.autosell.listener; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.model.SellRegion; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.world.WorldLoadEvent; - -public class AutoSellListener { - - private final XPrisonAutoSell plugin; - - public AutoSellListener(XPrisonAutoSell plugin) { - this.plugin = plugin; - } - - public void subscribeToEvents() { - this.subscribeToPlayerJoinEvent(); - this.subscribeToBlockBreakEvent(); - this.subscribeToWorldLoadEvent(); - } - - private void subscribeToWorldLoadEvent() { - Events.subscribe(WorldLoadEvent.class) - .handler(e -> this.plugin.getManager().loadPostponedAutoSellRegions(e.getWorld())).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerJoinEvent() { - Events.subscribe(PlayerJoinEvent.class) - .handler(e -> Schedulers.sync().runLater(() -> { - - if (this.plugin.getManager().hasAutoSellEnabled(e.getPlayer())) { - PlayerUtils.sendMessage(e.getPlayer(), this.plugin.getAutoSellConfig().getMessage("autosell_enable")); - return; - } - - if (this.plugin.getManager().canPlayerEnableAutosellOnJoin(e.getPlayer())) { - this.plugin.getManager().toggleAutoSell(e.getPlayer()); - } - }, 20)).bindWith(this.plugin.getCore()); - } - - private void subscribeToBlockBreakEvent() { - - Events.subscribe(BlockBreakEvent.class, EventPriority.HIGHEST) - .filter(e -> !e.isCancelled() && e.getPlayer().getItemInHand() != null && this.plugin.getCore().isPickaxeSupported(e.getPlayer().getItemInHand().getType())) - .handler(e -> { - - SellRegion sellRegion = this.plugin.getManager().getAutoSellRegion(e.getBlock().getLocation()); - - if (sellRegion == null) { - return; - } - - boolean success = false; - - if (this.plugin.getManager().hasAutoSellEnabled(e.getPlayer())) { - success = this.plugin.getManager().autoSellBlock(e.getPlayer(), e.getBlock()); - } - - if (!success) { - success = this.plugin.getManager().givePlayerItem(e.getPlayer(), e.getBlock()); - } - - if (success) { - // Do not set block to air due compatibility issues - e.setDropItems(false); - } else { - e.setCancelled(true); - } - }).bindWith(this.plugin.getCore()); - } -} - diff --git a/src/main/java/me/nvus/xprison/autosell/manager/AutoSellManager.java b/src/main/java/me/nvus/xprison/autosell/manager/AutoSellManager.java deleted file mode 100644 index cca92ea..0000000 --- a/src/main/java/me/nvus/xprison/autosell/manager/AutoSellManager.java +++ /dev/null @@ -1,408 +0,0 @@ -package me.nvus.xprison.autosell.manager; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.autosell.api.events.XPrisonAutoSellEvent; -import me.nvus.xprison.autosell.api.events.XPrisonSellAllEvent; -import me.nvus.xprison.autosell.model.AutoSellItemStack; -import me.nvus.xprison.autosell.model.SellRegion; -import me.nvus.xprison.autosell.utils.AutoSellContants; -import me.nvus.xprison.enchants.utils.EnchantUtils; -import me.nvus.xprison.multipliers.enums.MultiplierType; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.economy.EconomyUtils; -import me.nvus.xprison.utils.inventory.InventoryUtils; -import me.nvus.xprison.utils.misc.MaterialUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import me.lucko.helper.cooldown.Cooldown; -import me.lucko.helper.cooldown.CooldownMap; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.codemc.worldguardwrapper.WorldGuardWrapper; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.*; -import java.util.concurrent.TimeUnit; - -public class AutoSellManager { - - private static final CooldownMap INVENTORY_FULL_COOLDOWN_MAP = CooldownMap.create(Cooldown.of(2, TimeUnit.SECONDS)); - - private final XPrisonAutoSell plugin; - private final Map lastEarnings; - private final Map lastItems; - private final Map regionsAutoSell; - private final List enabledAutoSellPlayers; - private final Map> notLoadedSellRegions; - - public AutoSellManager(XPrisonAutoSell plugin) { - this.plugin = plugin; - this.enabledAutoSellPlayers = new ArrayList<>(); - this.lastEarnings = new HashMap<>(); - this.lastItems = new HashMap<>(); - this.regionsAutoSell = new HashMap<>(); - this.notLoadedSellRegions = new HashMap<>(); - } - - - private void loadAutoSellRegions() { - this.regionsAutoSell.clear(); - - YamlConfiguration configuration = this.plugin.getAutoSellConfig().getYamlConfig(); - - ConfigurationSection section = configuration.getConfigurationSection("regions"); - - if (section == null) { - return; - } - - for (String regName : section.getKeys(false)) { - this.loadSellRegionFromConfig(configuration, regName); - } - } - - private boolean loadSellRegionFromConfig(YamlConfiguration config, String regionName) { - - String worldName = config.getString("regions." + regionName + ".world"); - - World world = Bukkit.getWorld(worldName); - - if (world == null) { - this.plugin.getCore().getLogger().warning("There is no such World named " + worldName + "! Perhaps its no loaded yet?"); - this.plugin.getCore().getLogger().warning("Postponing loading of region " + regionName + "."); - this.postponeLoadingOfSellRegion(worldName, regionName); - return false; - } - - IWrappedRegion region = this.validateWrappedRegion(regionName, world); - - if (region == null) { - this.plugin.getCore().getLogger().warning("There is no such WorldGuard region named " + regionName + " in world " + world.getName()); - return false; - } - - String permRequired = config.getString("regions." + regionName + ".permission"); - - Map sellPrices = this.loadSellPricesForRegion(config, regionName); - - SellRegion sellRegion = new SellRegion(region, world, permRequired, sellPrices); - this.regionsAutoSell.put(regionName, sellRegion); - - this.plugin.getCore().getLogger().info("Loaded auto-sell region named '" + regionName + "'"); - return true; - } - - private void postponeLoadingOfSellRegion(String worldName, String regionName) { - Set currentlyPostponed = this.notLoadedSellRegions.getOrDefault(worldName, new HashSet<>()); - currentlyPostponed.add(regionName); - this.notLoadedSellRegions.put(worldName, currentlyPostponed); - } - - private IWrappedRegion validateWrappedRegion(String regionName, World world) { - Optional optRegion = WorldGuardWrapper.getInstance().getRegion(world, regionName); - return optRegion.orElse(null); - } - - private Map loadSellPricesForRegion(YamlConfiguration config, String regionName) { - Map sellPrices = new HashMap<>(); - - for (String item : config.getConfigurationSection("regions." + regionName + ".items").getKeys(false)) { - CompMaterial type = CompMaterial.valueOf(item); - double sellPrice = config.getDouble("regions." + regionName + ".items." + item); - sellPrices.put(type, sellPrice); - } - return sellPrices; - } - - public void reload() { - this.load(); - } - - public void load() { - this.loadAutoSellRegions(); - } - - - public void sellAll(Player sender, IWrappedRegion region) { - - if (!this.validateRegionBeforeSellAll(sender, region)) { - return; - } - - this.plugin.getCore().debug("User " + sender.getName() + " ran /sellall in region " + region.getId(), this.plugin); - - SellRegion sellRegion = regionsAutoSell.get(region.getId()); - - if (!checkIfPlayerCanSellInSellRegion(sender, sellRegion)) { - return; - } - - Map itemsToSell = sellRegion.previewInventorySell(sender); - - XPrisonSellAllEvent event = this.callSellAllEvent(sender, sellRegion, itemsToSell); - - if (event.isCancelled()) { - return; - } - - itemsToSell = event.getItemsToSell(); - - double totalAmount = this.sellItems(sender, itemsToSell); - - itemsToSell.keySet().forEach(item -> sender.getInventory().remove(item.getItemStack())); - - if (totalAmount > 0.0) { - PlayerUtils.sendMessage(sender, this.plugin.getAutoSellConfig().getMessage("sell_all_complete").replace("%price%", String.format("%,.0f", totalAmount))); - } - } - - private double sellItems(Player player, Map itemsToSell) { - - double totalAmount = itemsToSell.values().stream().mapToDouble(Double::doubleValue).sum(); - - if (this.plugin.isMultipliersModuleEnabled()) { - totalAmount = (long) this.plugin.getCore().getMultipliers().getApi().getTotalToDeposit(player, totalAmount, MultiplierType.SELL); - } - - EconomyUtils.deposit(player, totalAmount); - return totalAmount; - } - - private XPrisonSellAllEvent callSellAllEvent(Player sender, SellRegion sellRegion, Map sellItems) { - XPrisonSellAllEvent event = new XPrisonSellAllEvent(sender, sellRegion, sellItems); - - Events.call(event); - - if (event.isCancelled()) { - this.plugin.getCore().debug("XPrisonSellAllEvent was cancelled.", this.plugin); - } - - return event; - } - - private XPrisonAutoSellEvent callAutoSellEvent(Player player, SellRegion sellRegion, Map itemsToSell) { - XPrisonAutoSellEvent event = new XPrisonAutoSellEvent(player, sellRegion, itemsToSell); - - Events.call(event); - - if (event.isCancelled()) { - this.plugin.getCore().debug("XPrisonAutoSellEvent was cancelled.", this.plugin); - } - - return event; - } - - private boolean checkIfPlayerCanSellInSellRegion(Player sender, SellRegion sellRegion) { - if (!sellRegion.canPlayerSellInRegion(sender)) { - PlayerUtils.sendMessage(sender, this.plugin.getAutoSellConfig().getMessage("no_permission_sell").replace("%perm%", sellRegion.getPermissionRequired())); - return false; - } - return true; - } - - private boolean validateRegionBeforeSellAll(Player sender, IWrappedRegion region) { - - if (region == null) { - //PlayerUtils.sendMessage(sender, this.plugin.getAutoSellConfig().getMessage("not_in_region")); - return false; - } - - return isAutoSellRegion(region); - } - - private boolean isAutoSellRegion(IWrappedRegion region) { - return regionsAutoSell.containsKey(region.getId()); - } - - public void resetLastEarnings() { - this.lastEarnings.clear(); - } - - public void resetLastItems() { - this.lastItems.clear(); - } - - public double getPlayerLastEarnings(Player p) { - return this.lastEarnings.getOrDefault(p.getUniqueId(), 0.0D); - } - - public long getPlayerLastItemsAmount(Player p) { - return this.lastItems.getOrDefault(p.getUniqueId(), 0L); - } - - public double getCurrentEarnings(Player player) { - return lastEarnings.getOrDefault(player.getUniqueId(), 0.0); - } - - public double getPriceForItem(String regionName, ItemStack item) { - SellRegion region = regionsAutoSell.get(regionName); - if (region != null) { - return region.getPriceForItem(item); - } - return 0.0; - } - - public boolean hasAutoSellEnabled(Player p) { - return enabledAutoSellPlayers.contains(p.getUniqueId()); - } - - public Collection getAutoSellRegions() { - return this.regionsAutoSell.values(); - } - - public SellRegion getAutoSellRegion(Location location) { - for (SellRegion region : this.regionsAutoSell.values()) { - if (region.contains(location)) { - return region; - } - } - return null; - } - - public void toggleAutoSell(Player player) { - boolean removed = enabledAutoSellPlayers.remove(player.getUniqueId()); - - if (removed) { - PlayerUtils.sendMessage(player, this.plugin.getAutoSellConfig().getMessage("autosell_disable")); - } else { - PlayerUtils.sendMessage(player, this.plugin.getAutoSellConfig().getMessage("autosell_enable")); - enabledAutoSellPlayers.add(player.getUniqueId()); - } - } - - public boolean canPlayerEnableAutosellOnJoin(Player player) { - if (!this.plugin.getAutoSellConfig().isEnableAutosellAutomatically()) { - return false; - } - return player.hasPermission(AutoSellContants.AUTOSELL_PERMISSION) && !hasAutoSellEnabled(player); - } - - public SellRegion getSellRegionFromWrappedRegion(IWrappedRegion region) { - return regionsAutoSell.getOrDefault(region.getId(), null); - } - - public void updateSellRegion(SellRegion sellRegion) { - this.regionsAutoSell.put(sellRegion.getRegion().getId(), sellRegion); - } - - public boolean givePlayerItem(Player player, Block block) { - - if (!InventoryUtils.hasSpace(player.getInventory())) { - this.notifyInventoryFull(player); - return true; - } - - player.getInventory().addItem(createItemStackToGive(player, block)); - return true; - } - - private ItemStack createItemStackToGive(Player player, Block block) { - int amount = EnchantUtils.getFortuneBlockCount(player.getItemInHand(), block); - - ItemStack toGive; - - if (this.plugin.getAutoSellConfig().isAutoSmelt()) { - toGive = MaterialUtils.getSmeltedFormAsItemStack(block); - } else { - toGive = CompMaterial.fromBlock(block).toItem(); - } - toGive.setAmount(amount); - return toGive; - } - - private void notifyInventoryFull(Player player) { - - if (!this.plugin.getAutoSellConfig().isInventoryFullNotificationEnabled() || !INVENTORY_FULL_COOLDOWN_MAP.test(player)) { - return; - } - - List inventoryFullTitle = this.plugin.getAutoSellConfig().getInventoryFullNotificationTitle(); - String inventoryFullNotificationMessage = this.plugin.getAutoSellConfig().getInventoryFullNotificationMessage(); - - if (!inventoryFullTitle.isEmpty()) { - PlayerUtils.sendTitle(player, inventoryFullTitle.get(0), inventoryFullTitle.get(1)); - } else { - PlayerUtils.sendMessage(player, inventoryFullNotificationMessage); - } - } - - public boolean autoSellBlock(Player player, Block block) { - - SellRegion sellRegion = this.getAutoSellRegion(block.getLocation()); - - if (sellRegion == null) { - return false; - } - - Map itemsToSell = sellRegion.previewItemsSell(Arrays.asList(createItemStackToGive(player, block))); - - XPrisonAutoSellEvent event = this.callAutoSellEvent(player, sellRegion, itemsToSell); - - if (event.isCancelled()) { - return false; - } - - itemsToSell = event.getItemsToSell(); - - int amountOfItems = itemsToSell.keySet().stream().mapToInt(item -> item.getItemStack().getAmount()).sum(); - double moneyEarned = this.sellItems(player, itemsToSell); - - this.updateCurrentEarningsAndLastItems(player, moneyEarned, amountOfItems); - - return true; - } - - private void updateCurrentEarningsAndLastItems(Player player, double moneyEarned, int amountOfItems) { - this.addToCurrentEarnings(player, moneyEarned); - this.addToLastItems(player, amountOfItems); - } - - public void addToCurrentEarnings(Player player, double amount) { - double current = this.lastEarnings.getOrDefault(player.getUniqueId(), 0.0); - this.lastEarnings.put(player.getUniqueId(), current + amount); - } - - public void addToLastItems(Player player, int amountOfItems) { - long current = this.lastItems.getOrDefault(player.getUniqueId(), 0L); - this.lastItems.put(player.getUniqueId(), current + amountOfItems); - } - - public double getPriceForBlock(String regionName, Block block) { - CompMaterial material = CompMaterial.fromBlock(block); - SellRegion region = regionsAutoSell.get(regionName); - if (region != null) { - return region.getSellPriceForMaterial(material); - } - return 0.0; - } - - public double getPriceForBlock(Block block) { - CompMaterial material = CompMaterial.fromBlock(block); - SellRegion region = getAutoSellRegion(block.getLocation()); - if (region != null) { - return region.getSellPriceForMaterial(material); - } - return 0.0; - } - - public void loadPostponedAutoSellRegions(World world) { - YamlConfiguration configuration = this.plugin.getAutoSellConfig().getYamlConfig(); - Set regionNames = this.notLoadedSellRegions.getOrDefault(world.getName(), new HashSet<>()); - regionNames.removeIf(regionName -> this.loadSellRegionFromConfig(configuration, regionName)); - this.notLoadedSellRegions.put(world.getName(), regionNames); - } - - public SellRegion getSellRegionByName(String name) { - return regionsAutoSell.get(name); - } - - public void sellBlocks(Player player, List blocks) { - blocks.forEach(block -> autoSellBlock(player, block)); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/model/AutoSellBroadcastTask.java b/src/main/java/me/nvus/xprison/autosell/model/AutoSellBroadcastTask.java deleted file mode 100644 index b5546fa..0000000 --- a/src/main/java/me/nvus/xprison/autosell/model/AutoSellBroadcastTask.java +++ /dev/null @@ -1,57 +0,0 @@ -package me.nvus.xprison.autosell.model; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Schedulers; -import me.lucko.helper.scheduler.Task; -import me.lucko.helper.utils.Players; -import org.bukkit.entity.Player; - -import java.util.concurrent.TimeUnit; - -public final class AutoSellBroadcastTask implements Runnable { - - private final XPrisonAutoSell plugin; - private Task task; - - public AutoSellBroadcastTask(XPrisonAutoSell plugin) { - this.plugin = plugin; - } - - @Override - public void run() { - - for (Player p : Players.all()) { - - double lastEarnings = this.plugin.getManager().getPlayerLastEarnings(p); - - if (lastEarnings <= 0.0) { - continue; - } - - long lastItems = this.plugin.getManager().getPlayerLastItemsAmount(p); - this.sendAutoSellBroadcastMessage(p, lastEarnings, lastItems); - } - - this.plugin.getManager().resetLastEarnings(); - this.plugin.getManager().resetLastItems(); - - } - - private void sendAutoSellBroadcastMessage(Player p, double lastEarnings, long lastItems) { - for (String s : this.plugin.getAutoSellConfig().getAutoSellBroadcastMessage()) { - PlayerUtils.sendMessage(p, s.replace("%money%", String.format("%,.0f", lastEarnings)).replace("%items%", String.format("%,d", lastItems))); - } - } - - - public void start() { - this.task = Schedulers.async().runRepeating(this, this.plugin.getAutoSellConfig().getAutoSellBroadcastTime(), TimeUnit.SECONDS, this.plugin.getAutoSellConfig().getAutoSellBroadcastTime(), TimeUnit.SECONDS); - } - - public void stop() { - if (this.task != null) { - this.task.stop(); - } - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/model/AutoSellItemStack.java b/src/main/java/me/nvus/xprison/autosell/model/AutoSellItemStack.java deleted file mode 100644 index c1bab22..0000000 --- a/src/main/java/me/nvus/xprison/autosell/model/AutoSellItemStack.java +++ /dev/null @@ -1,20 +0,0 @@ -package me.nvus.xprison.autosell.model; - -import org.bukkit.inventory.ItemStack; - -public class AutoSellItemStack { - - private final ItemStack itemStack; - - public AutoSellItemStack(ItemStack stack) { - this.itemStack = stack; - } - - public ItemStack getItemStack() { - return itemStack; - } - - public static AutoSellItemStack of(ItemStack item) { - return new AutoSellItemStack(item); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/model/SellRegion.java b/src/main/java/me/nvus/xprison/autosell/model/SellRegion.java deleted file mode 100644 index 39e9aa7..0000000 --- a/src/main/java/me/nvus/xprison/autosell/model/SellRegion.java +++ /dev/null @@ -1,102 +0,0 @@ -package me.nvus.xprison.autosell.model; - -import me.nvus.xprison.utils.compat.CompMaterial; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.ToString; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.*; -import java.util.stream.Collectors; - -@AllArgsConstructor -@ToString -public class SellRegion { - - @Getter - private final IWrappedRegion region; - @Getter - private final World world; - - @Getter - private final String permissionRequired; - private final Map sellPrices; - - - public SellRegion(IWrappedRegion region, World world) { - this.region = region; - this.world = world; - this.permissionRequired = null; - this.sellPrices = new HashMap<>(); - } - - public double getSellPriceForMaterial(CompMaterial material) { - return sellPrices.getOrDefault(material, 0.0); - } - - public Set getSellingMaterials() { - return this.sellPrices.keySet(); - } - - public Set getSellingMaterialsSorted(Comparator comparator) { - return this.sellPrices.keySet().stream().sorted(comparator).collect(Collectors.toCollection(LinkedHashSet::new)); - } - - public void addSellPrice(CompMaterial material, double price) { - this.sellPrices.put(material, price); - } - - public boolean contains(Location loc) { - return Objects.equals(loc.getWorld(), this.world) && this.region.contains(loc); - } - - public boolean canPlayerSellInRegion(Player player) { - if (this.permissionRequired == null || this.permissionRequired.isEmpty()) { - return true; - } - return player.hasPermission(this.permissionRequired); - } - - public double getPriceForItem(ItemStack item) { - CompMaterial material = CompMaterial.fromItem(item); - return item.getAmount() * this.sellPrices.getOrDefault(material, 0.0); - } - - public Map previewInventorySell(Player player) { - return previewItemsSell(Arrays.asList(player.getInventory().getContents())); - } - - public Map previewItemsSell(Collection items) { - - Map itemsToSell = new HashMap<>(); - - for (ItemStack item : items) { - - if (item == null) { - continue; - } - - double priceForItem = this.getPriceForItem(item); - - if (priceForItem <= 0.0) { - continue; - } - - itemsToSell.put(new AutoSellItemStack(item), priceForItem); - } - - return itemsToSell; - } - - public boolean sellsMaterial(CompMaterial material) { - return this.sellPrices.containsKey(material); - } - - public void removeSellPrice(CompMaterial material) { - this.sellPrices.remove(material); - } -} diff --git a/src/main/java/me/nvus/xprison/autosell/utils/AutoSellContants.java b/src/main/java/me/nvus/xprison/autosell/utils/AutoSellContants.java deleted file mode 100644 index c5e474e..0000000 --- a/src/main/java/me/nvus/xprison/autosell/utils/AutoSellContants.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.nvus.xprison.autosell.utils; - -public class AutoSellContants { - - public static final String AUTOSELL_PERMISSION = "xprison.autosell.toggle"; - public static final String ADMIN_PERMISSION = "xprison.autosell.admin"; -} diff --git a/src/main/java/me/nvus/xprison/autosell/utils/SellPriceComparator.java b/src/main/java/me/nvus/xprison/autosell/utils/SellPriceComparator.java deleted file mode 100644 index 16578bb..0000000 --- a/src/main/java/me/nvus/xprison/autosell/utils/SellPriceComparator.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.nvus.xprison.autosell.utils; - -import me.nvus.xprison.autosell.model.SellRegion; -import me.nvus.xprison.utils.compat.CompMaterial; - -import java.util.Comparator; - -public class SellPriceComparator implements Comparator { - - private final SellRegion region; - - public SellPriceComparator(SellRegion region) { - this.region = region; - } - - @Override - public int compare(CompMaterial o1, CompMaterial o2) { - double sellPrice1 = region.getSellPriceForMaterial(o1); - double sellPrice2 = region.getSellPriceForMaterial(o2); - return Double.compare(sellPrice1, sellPrice2); - } -} diff --git a/src/main/java/me/nvus/xprison/config/FileManager.java b/src/main/java/me/nvus/xprison/config/FileManager.java deleted file mode 100644 index f270898..0000000 --- a/src/main/java/me/nvus/xprison/config/FileManager.java +++ /dev/null @@ -1,169 +0,0 @@ -package me.nvus.xprison.config; - -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.java.JavaPlugin; - -import java.io.*; -import java.util.HashMap; - - -public class FileManager { - - private final JavaPlugin plugin; - private HashMap configs = new HashMap(); - - public FileManager(JavaPlugin plugin) { - this.plugin = plugin; - } - - /** - * Get the config by the name(Don't forget the .yml) - * - * @param name - * @return - */ - public Config getConfig(String name) { - if (!configs.containsKey(name)) - configs.put(name, new Config(name)); - - return configs.get(name); - } - - /** - * Save the config by the name(Don't forget the .yml) - * - * @param name - * @return - */ - public Config saveConfig(String name) { - return getConfig(name).save(); - } - - /** - * Reload the config by the name(Don't forget the .yml) - * - * @param name - * @return - */ - public Config reloadConfig(String name) { - return getConfig(name).reload(); - } - - public class Config { - - private String name; - private File file; - private YamlConfiguration config; - - public Config(String name) { - this.name = name; - } - - /** - * Saves the config as long as the config isn't empty - * - * @return - */ - public Config save() { - if ((this.config == null) || (this.file == null)) - return this; - try { - if (config.getConfigurationSection("").getKeys(true).size() != 0) - config.save(this.file); - } catch (IOException ex) { - ex.printStackTrace(); - } - return this; - } - - /** - * Gets the config as a YamlConfiguration - * - * @return - */ - public YamlConfiguration get() { - if (this.config == null) - reload(); - - return this.config; - } - - /** - * Saves the default config(Will overwrite anything in the current config's file) - *

- * Don't forget to reload after! - * - * @return - */ - public Config saveDefaultConfig() { - file = new File(plugin.getDataFolder(), this.name); - - plugin.saveResource(this.name, false); - - return this; - } - - /** - * Reloads the config - * - * @return - */ - public Config reload() { - if (file == null) - this.file = new File(plugin.getDataFolder(), this.name); - - this.config = YamlConfiguration.loadConfiguration(file); - - Reader defConfigStream; - try { - defConfigStream = new InputStreamReader(plugin.getResource(this.name), "UTF8"); - - if (defConfigStream != null) { - YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); - this.config.setDefaults(defConfig); - } - } catch (UnsupportedEncodingException | NullPointerException e) { - - } - return this; - } - - /** - * Copies the config from the resources to the config's default settings. - *

- * Force = true ----> Will add any new values from the default file - *

- * Force = false ---> Will NOT add new values from the default file - * - * @param force - * @return - */ - public Config copyDefaults(boolean force) { - get().options().copyDefaults(force); - return this; - } - - /** - * An easy way to set a value into the config - * - * @param key - * @param value - * @return - */ - public Config set(String key, Object value) { - get().set(key, value); - return this; - } - - /** - * An easy way to get a value from the config - * - * @param key - * @return - */ - public Object get(String key) { - return get().get(key); - } - } - -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/database/PooledSQLDatabase.java b/src/main/java/me/nvus/xprison/database/PooledSQLDatabase.java deleted file mode 100644 index caafa0a..0000000 --- a/src/main/java/me/nvus/xprison/database/PooledSQLDatabase.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.nvus.xprison.database; - -import com.zaxxer.hikari.HikariDataSource; -import me.nvus.xprison.XPrison; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.concurrent.atomic.AtomicInteger; - -public abstract class PooledSQLDatabase extends SQLDatabase { - - protected static final AtomicInteger POOL_COUNTER = new AtomicInteger(0); - protected HikariDataSource hikari; - - public PooledSQLDatabase(XPrison plugin) { - super(plugin); - } - - @Override - public void close() { - if (this.hikari != null) { - this.hikari.close(); - this.plugin.getLogger().info("Database Connection closed"); - } - } - - @Override - public Connection getConnection() { - try { - return this.hikari.getConnection(); - } catch (SQLException e) { - this.plugin.getLogger().warning("Unable to get database connection!"); - e.printStackTrace(); - } - return null; - } - - -} diff --git a/src/main/java/me/nvus/xprison/database/SQLDatabase.java b/src/main/java/me/nvus/xprison/database/SQLDatabase.java deleted file mode 100644 index e20c555..0000000 --- a/src/main/java/me/nvus/xprison/database/SQLDatabase.java +++ /dev/null @@ -1,87 +0,0 @@ -package me.nvus.xprison.database; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.database.model.SQLDatabaseType; -import me.lucko.helper.Schedulers; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.Arrays; - -public abstract class SQLDatabase { - - protected final XPrison plugin; - - SQLDatabase(XPrison plugin) { - this.plugin = plugin; - } - - public abstract SQLDatabaseType getDatabaseType(); - - public abstract void connect(); - - public abstract void close(); - - public abstract Connection getConnection(); - - public PreparedStatement prepareStatement(Connection connection, String sql, Object... replacements) { - - PreparedStatement statement; - try { - statement = connection.prepareStatement(sql); - this.replaceQueryParameters(statement,replacements); - - if (this.plugin.isDebugMode()) { - this.plugin.getLogger().info("Statement prepared: " + sql + " (Replacement values: " + Arrays.toString(replacements) + ")"); - } - - return statement; - } catch (SQLException e) { - e.printStackTrace(); - } - return null; - } - - public void executeSql(String sql, Object... replacements) { - - if (sql == null || sql.isEmpty()) { - return; - } - - long startTime = System.currentTimeMillis(); - - try (Connection c = getConnection(); PreparedStatement statement = prepareStatement(c,sql,replacements)) { - - statement.execute(); - - long endTime = System.currentTimeMillis(); - - if (this.plugin.isDebugMode()) { - this.plugin.getLogger().info("Statement executed: " + sql + " (Replacement values: " + Arrays.toString(replacements) + "). Took " + (endTime - startTime) + "ms."); - } - - } catch (SQLException e) { - e.printStackTrace(); - } - } - - private void replaceQueryParameters(PreparedStatement statement, Object[] replacements) { - if (replacements != null) { - for (int i = 0; i < replacements.length; i++) { - int position = i + 1; - Object value = replacements[i]; - try { - statement.setObject(position, value); - } catch (SQLException e) { - this.plugin.getLogger().warning("Unable to set query parameter at position " + position + " to " + value + " for query: " + statement); - e.printStackTrace(); - } - } - } - } - - public void executeSqlAsync(String sql, Object... replacements) { - Schedulers.async().run(() -> this.executeSql(sql, replacements)); - } -} diff --git a/src/main/java/me/nvus/xprison/database/impl/MySQLDatabase.java b/src/main/java/me/nvus/xprison/database/impl/MySQLDatabase.java deleted file mode 100644 index d44be89..0000000 --- a/src/main/java/me/nvus/xprison/database/impl/MySQLDatabase.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.nvus.xprison.database.impl; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; -import me.nvus.xprison.XPrison; -import me.nvus.xprison.database.PooledSQLDatabase; -import me.nvus.xprison.database.model.ConnectionProperties; -import me.nvus.xprison.database.model.DatabaseCredentials; -import me.nvus.xprison.database.model.SQLDatabaseType; - -public final class MySQLDatabase extends PooledSQLDatabase { - - private final DatabaseCredentials credentials; - private final ConnectionProperties connectionProperties; - - public MySQLDatabase(XPrison parent, DatabaseCredentials credentials, ConnectionProperties connectionProperties) { - super(parent); - this.connectionProperties = connectionProperties; - this.credentials = credentials; - } - - @Override - public void connect() { - final HikariConfig hikari = new HikariConfig(); - - hikari.setPoolName("xprison-" + POOL_COUNTER.getAndIncrement()); - - this.applyCredentials(hikari, credentials, connectionProperties); - this.applyConnectionProperties(hikari, connectionProperties); - this.addDefaultDataSourceProperties(hikari); - this.hikari = new HikariDataSource(hikari); - } - - private void applyCredentials(HikariConfig hikari, DatabaseCredentials credentials, ConnectionProperties connectionProperties) { - hikari.setJdbcUrl("jdbc:mysql://" + credentials.getHost() + ":" + credentials.getPort() + "/" + credentials.getDatabaseName() + "?characterEncoding=" + connectionProperties.getCharacterEncoding()); - hikari.setUsername(credentials.getUserName()); - hikari.setPassword(credentials.getPassword()); - } - - private void applyConnectionProperties(HikariConfig hikari, ConnectionProperties connectionProperties) { - hikari.setConnectionTimeout(connectionProperties.getConnectionTimeout()); - hikari.setIdleTimeout(connectionProperties.getIdleTimeout()); - hikari.setKeepaliveTime(connectionProperties.getKeepAliveTime()); - hikari.setMaxLifetime(connectionProperties.getMaxLifetime()); - hikari.setMinimumIdle(connectionProperties.getMinimumIdle()); - hikari.setMaximumPoolSize(connectionProperties.getMaximumPoolSize()); - hikari.setLeakDetectionThreshold(connectionProperties.getLeakDetectionThreshold()); - hikari.setConnectionTestQuery(connectionProperties.getTestQuery()); - } - - private void addDefaultDataSourceProperties(HikariConfig hikari) { - hikari.addDataSourceProperty("cachePrepStmts", true); - hikari.addDataSourceProperty("prepStmtCacheSize", 250); - hikari.addDataSourceProperty("prepStmtCacheSqlLimit", 2048); - hikari.addDataSourceProperty("useServerPrepStmts", true); - hikari.addDataSourceProperty("useLocalSessionState", true); - hikari.addDataSourceProperty("rewriteBatchedStatements", true); - hikari.addDataSourceProperty("cacheResultSetMetadata", true); - hikari.addDataSourceProperty("cacheServerConfiguration", true); - hikari.addDataSourceProperty("elideSetAutoCommits", true); - hikari.addDataSourceProperty("maintainTimeStats", false); - } - - @Override - public SQLDatabaseType getDatabaseType() { - return SQLDatabaseType.MYSQL; - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/database/impl/SQLiteDatabase.java b/src/main/java/me/nvus/xprison/database/impl/SQLiteDatabase.java deleted file mode 100644 index 6530791..0000000 --- a/src/main/java/me/nvus/xprison/database/impl/SQLiteDatabase.java +++ /dev/null @@ -1,65 +0,0 @@ -package me.nvus.xprison.database.impl; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; -import me.nvus.xprison.XPrison; -import me.nvus.xprison.database.PooledSQLDatabase; -import me.nvus.xprison.database.model.ConnectionProperties; -import me.nvus.xprison.database.model.SQLDatabaseType; - -import java.io.File; -import java.io.IOException; - -public final class SQLiteDatabase extends PooledSQLDatabase { - - private static final String FILE_NAME = "playerdata.db"; - - private final String filePath; - private final ConnectionProperties connectionProperties; - - public SQLiteDatabase(XPrison plugin, ConnectionProperties connectionProperties) { - super(plugin); - this.connectionProperties = connectionProperties; - this.filePath = this.plugin.getDataFolder().getPath() + File.separator + FILE_NAME; - } - - @Override - public SQLDatabaseType getDatabaseType() { - return SQLDatabaseType.SQLITE; - } - - @Override - public void connect() { - - this.createDBFile(); - - final HikariConfig hikari = new HikariConfig(); - - hikari.setPoolName("xprison-" + POOL_COUNTER.getAndIncrement()); - - hikari.setDriverClassName("org.sqlite.JDBC"); - hikari.setJdbcUrl("jdbc:sqlite:" + this.filePath); - - hikari.setConnectionTimeout(connectionProperties.getConnectionTimeout()); - hikari.setIdleTimeout(connectionProperties.getIdleTimeout()); - hikari.setKeepaliveTime(connectionProperties.getKeepAliveTime()); - hikari.setMaxLifetime(connectionProperties.getMaxLifetime()); - hikari.setMinimumIdle(connectionProperties.getMinimumIdle()); - hikari.setMaximumPoolSize(1); - hikari.setLeakDetectionThreshold(connectionProperties.getLeakDetectionThreshold()); - hikari.setConnectionTestQuery(connectionProperties.getTestQuery()); - - this.hikari = new HikariDataSource(hikari); - } - - private void createDBFile() { - File dbFile = new File(this.filePath); - try { - dbFile.createNewFile(); - } catch (IOException e) { - this.plugin.getLogger().warning(String.format("Unable to create %s", FILE_NAME)); - e.printStackTrace(); - } - } - -} diff --git a/src/main/java/me/nvus/xprison/database/model/ConnectionProperties.java b/src/main/java/me/nvus/xprison/database/model/ConnectionProperties.java deleted file mode 100644 index cd02a77..0000000 --- a/src/main/java/me/nvus/xprison/database/model/ConnectionProperties.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.nvus.xprison.database.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.bukkit.configuration.file.FileConfiguration; - -@Getter -@AllArgsConstructor -public class ConnectionProperties { - - private final long idleTimeout, maxLifetime, connectionTimeout, leakDetectionThreshold, keepAliveTime; - private final int minimumIdle, maximumPoolSize; - private final String testQuery, characterEncoding; - - public static ConnectionProperties fromConfig(FileConfiguration config) { - - String rootPath = "connection_properties."; - - long connectionTimeout = config.getLong(rootPath + "connection_timeout"); - long idleTimeout = config.getLong(rootPath + "idle_timeout"); - long keepAliveTime = config.getLong(rootPath + "keep_alive_time"); - long maxLifeTime = config.getLong(rootPath + "max_life_time"); - int minimumIdle = config.getInt(rootPath + "minimum_idle"); - int maximumPoolSize = config.getInt(rootPath + "maximum_pool_size"); - long leakDetectionThreshold = config.getLong(rootPath + "leak_detection_threshold"); - String characterEncoding = config.getString(rootPath + "character_encoding", "utf8"); - String testQuery = config.getString(rootPath + "connection_test_query"); - return new ConnectionProperties(idleTimeout, maxLifeTime, connectionTimeout, leakDetectionThreshold, keepAliveTime, minimumIdle, maximumPoolSize, testQuery,characterEncoding); - } -} - diff --git a/src/main/java/me/nvus/xprison/database/model/DatabaseCredentials.java b/src/main/java/me/nvus/xprison/database/model/DatabaseCredentials.java deleted file mode 100644 index 0d592ba..0000000 --- a/src/main/java/me/nvus/xprison/database/model/DatabaseCredentials.java +++ /dev/null @@ -1,33 +0,0 @@ -package me.nvus.xprison.database.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.apache.commons.lang.Validate; -import org.bukkit.configuration.file.FileConfiguration; - -@Getter -@AllArgsConstructor -public class DatabaseCredentials { - - private final String host, databaseName, userName, password; - private final int port; - - public static DatabaseCredentials fromConfig(FileConfiguration config) { - - String rootPath = "mysql."; - - String host = config.getString(rootPath + "host"); - String dbName = config.getString(rootPath + "database"); - String userName = config.getString(rootPath + "username"); - String password = config.getString(rootPath + "password"); - int port = config.getInt(rootPath + "port"); - - Validate.notNull(host); - Validate.notNull(dbName); - Validate.notNull(userName); - Validate.notNull(password); - - return new DatabaseCredentials(host, dbName, userName, password, port); - } - -} diff --git a/src/main/java/me/nvus/xprison/database/model/SQLDatabaseType.java b/src/main/java/me/nvus/xprison/database/model/SQLDatabaseType.java deleted file mode 100644 index 9cd890d..0000000 --- a/src/main/java/me/nvus/xprison/database/model/SQLDatabaseType.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.nvus.xprison.database.model; - -public enum SQLDatabaseType { - SQLITE, - MYSQL -} diff --git a/src/main/java/me/nvus/xprison/enchants/XPrisonEnchants.java b/src/main/java/me/nvus/xprison/enchants/XPrisonEnchants.java deleted file mode 100644 index f228ff0..0000000 --- a/src/main/java/me/nvus/xprison/enchants/XPrisonEnchants.java +++ /dev/null @@ -1,161 +0,0 @@ -package me.nvus.xprison.enchants; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.enchants.api.XPrisonEnchantsAPI; -import me.nvus.xprison.enchants.api.XPrisonEnchantsAPIImpl; -import me.nvus.xprison.enchants.command.*; -import me.nvus.xprison.enchants.config.EnchantsConfig; -import me.nvus.xprison.enchants.gui.DisenchantGUI; -import me.nvus.xprison.enchants.gui.EnchantGUI; -import me.nvus.xprison.enchants.listener.EnchantsListener; -import me.nvus.xprison.enchants.managers.CooldownManager; -import me.nvus.xprison.enchants.managers.EnchantsManager; -import me.nvus.xprison.enchants.managers.RespawnManager; -import me.nvus.xprison.enchants.repo.EnchantsRepository; -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.multipliers.XPrisonMultipliers; -import lombok.Getter; -import me.lucko.helper.utils.Players; -import org.bukkit.entity.Player; - -public final class XPrisonEnchants implements XPrisonModule { - - - public static final String MODULE_NAME = "Enchants"; - - @Getter - private static XPrisonEnchants instance; - - @Getter - private XPrisonEnchantsAPI api; - - @Getter - private EnchantsManager enchantsManager; - - @Getter - private CooldownManager cooldownManager; - - @Getter - private RespawnManager respawnManager; - - @Getter - private EnchantsConfig enchantsConfig; - - @Getter - private EnchantsListener enchantsListener; - - @Getter - private EnchantsRepository enchantsRepository; - - @Getter - private final XPrison core; - - private boolean enabled; - - public XPrisonEnchants(XPrison core) { - instance = this; - this.core = core; - } - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void reload() { - - this.enchantsConfig.reload(); - this.enchantsRepository.reload(); - - EnchantGUI.init(); - DisenchantGUI.init(); - - } - - @Override - public void enable() { - - this.enchantsConfig = new EnchantsConfig(this); - this.enchantsConfig.load(); - - this.cooldownManager = new CooldownManager(this); - this.respawnManager = new RespawnManager(this); - - this.enchantsManager = new EnchantsManager(this); - this.enchantsManager.enable(); - - this.enchantsListener = new EnchantsListener(this); - this.enchantsListener.register(); - - this.registerCommands(); - - this.enchantsRepository = new EnchantsRepository(this); - this.enchantsRepository.loadDefaultEnchantments(); - - EnchantGUI.init(); - DisenchantGUI.init(); - - this.api = new XPrisonEnchantsAPIImpl(this.enchantsManager, this.enchantsRepository); - - - this.enabled = true; - } - - - private void registerCommands() { - DisenchantCommand disenchantCommand = new DisenchantCommand(this); - disenchantCommand.register(); - - EnchantMenuCommand enchantMenuCommand = new EnchantMenuCommand(this); - enchantMenuCommand.register(); - - GiveFirstJoinPickaxeCommand giveFirstJoinPickaxeCommand = new GiveFirstJoinPickaxeCommand(this); - giveFirstJoinPickaxeCommand.register(); - - GivePickaxeCommand givePickaxeCommand = new GivePickaxeCommand(this); - givePickaxeCommand.register(); - - ValueCommand valueCommand = new ValueCommand(this); - valueCommand.register(); - } - - - @Override - public void disable() { - for (Player p : Players.all()) { - p.closeInventory(); - } - this.enchantsManager.disable(); - this.enabled = false; - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return false; - } - - @Override - public void resetPlayerData() { - } - - public boolean isAutoSellModuleEnabled() { - return this.core.isModuleEnabled(XPrisonAutoSell.MODULE_NAME); - } - - public boolean isMultipliersModuleEnabled() { - return this.core.isModuleEnabled(XPrisonMultipliers.MODULE_NAME); - } - - public boolean isMinesModuleEnabled() { - return this.core.isModuleEnabled(XPrisonMines.MODULE_NAME); - } - -} diff --git a/src/main/java/me/nvus/xprison/enchants/api/XPrisonEnchantsAPI.java b/src/main/java/me/nvus/xprison/enchants/api/XPrisonEnchantsAPI.java deleted file mode 100644 index 69a012b..0000000 --- a/src/main/java/me/nvus/xprison/enchants/api/XPrisonEnchantsAPI.java +++ /dev/null @@ -1,89 +0,0 @@ -package me.nvus.xprison.enchants.api; - -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.Map; - -public interface XPrisonEnchantsAPI { - - - /** - * Method to get all custom enchants applied on specific ItemStack - * - * @param itemStack ItemStack - * @return - */ - Map getEnchants(ItemStack itemStack); - - /** - * Method to check if item has specific enchant - * - * @param item {@link ItemStack} - * @param enchantment {@link XPrisonEnchantment} - * @return true if item has enchant - */ - boolean hasEnchant(ItemStack item, XPrisonEnchantment enchantment); - - /** - * Method to get enchant level of specific ItemStack - * - * @param item ItemStack - * @param enchantment {@link XPrisonEnchantment} - * @return 0 if enchant was not found, otherwise level of enchant - */ - int getEnchantLevel(ItemStack item, XPrisonEnchantment enchantment); - - /** - * Method to set enchant with specific level to pickaxe - * - * @param item pickaxe - * @param enchantment {@link XPrisonEnchantment} - * @param level Enchant Level - * @return modified ItemStack - */ - ItemStack setEnchantLevel(Player player, ItemStack item, XPrisonEnchantment enchantment, int level); - - /** - * Method to remove enchant from pickaxe - * - * @param item ItemStack pickaxe - * @param enchantment {@link XPrisonEnchantment} - * @return modified ItemStack - */ - ItemStack removeEnchant(Player player, ItemStack item, XPrisonEnchantment enchantment); - - /** - * Method to get Enchant by ID - * - * @param id enchant id - * @return XPrisonEnchantment - */ - XPrisonEnchantment getById(int id); - - /** - * Method to get Enchant by ID - * - * @param rawName enchant rawname - * @return XPrisonEnchantment - */ - XPrisonEnchantment getByName(String rawName); - - /** - * Registers a specific {@link XPrisonEnchantment} - * - * @param enchantment - * @return - */ - boolean registerEnchant(XPrisonEnchantment enchantment); - - /** - * Unregisters a specific {@link XPrisonEnchantment} - * - * @param enchantment - * @return - */ - boolean unregisterEnchant(XPrisonEnchantment enchantment); - -} diff --git a/src/main/java/me/nvus/xprison/enchants/api/XPrisonEnchantsAPIImpl.java b/src/main/java/me/nvus/xprison/enchants/api/XPrisonEnchantsAPIImpl.java deleted file mode 100644 index dfe6670..0000000 --- a/src/main/java/me/nvus/xprison/enchants/api/XPrisonEnchantsAPIImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package me.nvus.xprison.enchants.api; - -import me.nvus.xprison.enchants.managers.EnchantsManager; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.repo.EnchantsRepository; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.Map; - -public final class XPrisonEnchantsAPIImpl implements XPrisonEnchantsAPI { - - private final EnchantsManager enchantsManager; - private final EnchantsRepository enchantsRepository; - - public XPrisonEnchantsAPIImpl(EnchantsManager enchantsManager, EnchantsRepository enchantsRepository) { - this.enchantsManager = enchantsManager; - this.enchantsRepository = enchantsRepository; - } - - @Override - public Map getEnchants(ItemStack pickAxe) { - return this.enchantsManager.getItemEnchants(pickAxe); - } - - @Override - public boolean hasEnchant(ItemStack item, XPrisonEnchantment enchant) { - return getEnchantLevel(item, enchant) != 0; - } - - @Override - public int getEnchantLevel(ItemStack item, XPrisonEnchantment enchantment) { - return this.enchantsManager.getEnchantLevel(item, enchantment); - } - - @Override - public ItemStack setEnchantLevel(Player player, ItemStack item, XPrisonEnchantment enchantment, int level) { - return this.enchantsManager.setEnchantLevel(player, item, enchantment, level); - } - - @Override - public ItemStack removeEnchant(Player player, ItemStack item, XPrisonEnchantment enchantment) { - return this.enchantsManager.removeEnchant(player, item, enchantment); - } - - @Override - public XPrisonEnchantment getById(int id) { - return this.enchantsRepository.getEnchantById(id); - } - - @Override - public XPrisonEnchantment getByName(String rawName) { - return this.enchantsRepository.getEnchantByName(rawName); - } - - @Override - public boolean registerEnchant(XPrisonEnchantment enchantment) { - return this.enchantsRepository.register(enchantment); - } - - @Override - public boolean unregisterEnchant(XPrisonEnchantment enchantment) { - return this.enchantsRepository.unregister(enchantment); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/api/events/ExplosionTriggerEvent.java b/src/main/java/me/nvus/xprison/enchants/api/events/ExplosionTriggerEvent.java deleted file mode 100644 index 15cb3f0..0000000 --- a/src/main/java/me/nvus/xprison/enchants/api/events/ExplosionTriggerEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.nvus.xprison.enchants.api.events; - - -import lombok.Getter; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.List; - -@Getter -public final class ExplosionTriggerEvent extends XPrisonPlayerEnchantTriggerEvent { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - private boolean cancelled; - - /** - * Called when explosive enchant procs - * - * @param p Player - * @param mineRegion WorldGuard region where it was triggered - * @param originBlock Original block broken that triggered it - * @param blocksAffected List of affected blocks (marked for removal) - */ - public ExplosionTriggerEvent(Player p, IWrappedRegion mineRegion, Block originBlock, List blocksAffected) { - super(p, mineRegion, originBlock, blocksAffected); - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - this.cancelled = cancel; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/api/events/LayerTriggerEvent.java b/src/main/java/me/nvus/xprison/enchants/api/events/LayerTriggerEvent.java deleted file mode 100644 index 23c741e..0000000 --- a/src/main/java/me/nvus/xprison/enchants/api/events/LayerTriggerEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.nvus.xprison.enchants.api.events; - - -import lombok.Getter; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.List; - -@Getter -public final class LayerTriggerEvent extends XPrisonPlayerEnchantTriggerEvent { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - private boolean cancelled; - - /** - * Called when layer enchant procs - * - * @param p Player - * @param mineRegion WorldGuard region where it was triggered - * @param originBlock Original block broken that triggered it - * @param blocks List of affected blocks (marked for removal) - */ - public LayerTriggerEvent(Player p, IWrappedRegion mineRegion, Block originBlock, List blocks) { - super(p, mineRegion, originBlock, blocks); - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - this.cancelled = cancel; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/api/events/NukeTriggerEvent.java b/src/main/java/me/nvus/xprison/enchants/api/events/NukeTriggerEvent.java deleted file mode 100644 index 0cdcf55..0000000 --- a/src/main/java/me/nvus/xprison/enchants/api/events/NukeTriggerEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.nvus.xprison.enchants.api.events; - - -import lombok.Getter; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.List; - -@Getter -public final class NukeTriggerEvent extends XPrisonPlayerEnchantTriggerEvent { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - private boolean cancelled; - - /** - * Called when nuke enchant procs - * - * @param p Player - * @param mineRegion WorldGuard region where it was triggered - * @param originBlock Original block broken that triggered it - * @param blocks List of affected blocks (marked for removal) - */ - public NukeTriggerEvent(Player p, IWrappedRegion mineRegion, Block originBlock, List blocks) { - super(p, mineRegion, originBlock, blocks); - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - this.cancelled = cancel; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/api/events/XPrisonPlayerEnchantEvent.java b/src/main/java/me/nvus/xprison/enchants/api/events/XPrisonPlayerEnchantEvent.java deleted file mode 100644 index 9b3de87..0000000 --- a/src/main/java/me/nvus/xprison/enchants/api/events/XPrisonPlayerEnchantEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.nvus.xprison.enchants.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class XPrisonPlayerEnchantEvent extends XPrisonPlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - @Getter - @Setter - private long tokenCost; - @Getter - private final int level; - @Getter - @Setter - private boolean cancelled; - - - /** - * Called when player enchants a tool - * - * @param player Player - * @param tokenCost cost of enchant in tokens - * @param level level of enchant - */ - public XPrisonPlayerEnchantEvent(Player player, long tokenCost, int level) { - super(player); - this.tokenCost = tokenCost; - this.level = level; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/api/events/XPrisonPlayerEnchantTriggerEvent.java b/src/main/java/me/nvus/xprison/enchants/api/events/XPrisonPlayerEnchantTriggerEvent.java deleted file mode 100644 index 73d2521..0000000 --- a/src/main/java/me/nvus/xprison/enchants/api/events/XPrisonPlayerEnchantTriggerEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.nvus.xprison.enchants.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.List; - -@Getter -public abstract class XPrisonPlayerEnchantTriggerEvent extends XPrisonPlayerEvent implements Cancellable { - - protected final Player player; - protected final IWrappedRegion mineRegion; - protected final Block originBlock; - protected final List blocksAffected; - - public XPrisonPlayerEnchantTriggerEvent(Player p, IWrappedRegion mineRegion, Block originBlock, List blocksAffected) { - super(p); - this.player = p; - this.mineRegion = mineRegion; - this.originBlock = originBlock; - this.blocksAffected = blocksAffected; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/command/DisenchantCommand.java b/src/main/java/me/nvus/xprison/enchants/command/DisenchantCommand.java deleted file mode 100644 index 6d7686d..0000000 --- a/src/main/java/me/nvus/xprison/enchants/command/DisenchantCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.nvus.xprison.enchants.command; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.gui.DisenchantGUI; -import me.nvus.xprison.utils.inventory.InventoryUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -public class DisenchantCommand { - - private final XPrisonEnchants plugin; - - public DisenchantCommand(XPrisonEnchants plugin) { - - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPlayer() - .handler(c -> { - ItemStack pickAxe = c.sender().getItemInHand(); - - if (!validatePickaxe(pickAxe)) { - PlayerUtils.sendMessage(c.sender(), this.plugin.getEnchantsConfig().getMessage("no_pickaxe_found")); - return; - } - - openDisenchantGui(pickAxe, c.sender()); - - }).registerAndBind(this.plugin.getCore(), "disenchant", "dise", "de", "disenchantmenu", "dismenu"); - } - - private void openDisenchantGui(ItemStack pickAxe, Player player) { - int pickaxeSlot = InventoryUtils.getInventorySlot(player, pickAxe); - this.plugin.getCore().debug("Pickaxe slot is: " + pickaxeSlot, this.plugin); - new DisenchantGUI(this.plugin, player, pickAxe, pickaxeSlot).open(); - } - - private boolean validatePickaxe(ItemStack pickAxe) { - return pickAxe != null && this.plugin.getCore().isPickaxeSupported(pickAxe.getType()); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/command/EnchantMenuCommand.java b/src/main/java/me/nvus/xprison/enchants/command/EnchantMenuCommand.java deleted file mode 100644 index f42f9f7..0000000 --- a/src/main/java/me/nvus/xprison/enchants/command/EnchantMenuCommand.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.nvus.xprison.enchants.command; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.gui.EnchantGUI; -import me.nvus.xprison.utils.inventory.InventoryUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -public class EnchantMenuCommand { - - private final XPrisonEnchants plugin; - - public EnchantMenuCommand(XPrisonEnchants plugin) { - - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPlayer() - .handler(c -> { - ItemStack pickAxe = c.sender().getItemInHand(); - - if (!validatePickaxe(pickAxe)) { - PlayerUtils.sendMessage(c.sender(), this.plugin.getEnchantsConfig().getMessage("no_pickaxe_found")); - return; - } - - openEnchantMenu(pickAxe, c.sender()); - }).registerAndBind(this.plugin.getCore(), "enchantmenu", "enchmenu"); - } - - private void openEnchantMenu(ItemStack pickAxe, Player player) { - int pickaxeSlot = InventoryUtils.getInventorySlot(player, pickAxe); - this.plugin.getCore().debug("Pickaxe slot is: " + pickaxeSlot, this.plugin); - new EnchantGUI(this.plugin, player, pickAxe, pickaxeSlot).open(); - } - - private boolean validatePickaxe(ItemStack pickAxe) { - return pickAxe != null && this.plugin.getCore().isPickaxeSupported(pickAxe.getType()); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/command/GiveFirstJoinPickaxeCommand.java b/src/main/java/me/nvus/xprison/enchants/command/GiveFirstJoinPickaxeCommand.java deleted file mode 100644 index 82ef649..0000000 --- a/src/main/java/me/nvus/xprison/enchants/command/GiveFirstJoinPickaxeCommand.java +++ /dev/null @@ -1,33 +0,0 @@ -package me.nvus.xprison.enchants.command; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import org.bukkit.entity.Player; - -public class GiveFirstJoinPickaxeCommand { - - private final XPrisonEnchants plugin; - - public GiveFirstJoinPickaxeCommand(XPrisonEnchants plugin) { - - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertOp() - .handler(c -> { - - if (c.args().size() == 0) { - PlayerUtils.sendMessage(c.sender(), "&c/givefirstjoinpickaxe "); - return; - } - - Player target = c.arg(0).parseOrFail(Player.class); - - this.plugin.getEnchantsManager().giveFirstJoinPickaxe(target); - PlayerUtils.sendMessage(c.sender(), "&aYou have given first join pickaxe to &e" + target.getName()); - }).registerAndBind(this.plugin.getCore(), "givefirstjoinpickaxe"); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/command/GivePickaxeCommand.java b/src/main/java/me/nvus/xprison/enchants/command/GivePickaxeCommand.java deleted file mode 100644 index 46095f9..0000000 --- a/src/main/java/me/nvus/xprison/enchants/command/GivePickaxeCommand.java +++ /dev/null @@ -1,82 +0,0 @@ -package me.nvus.xprison.enchants.command; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.repo.EnchantsRepository; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import org.apache.commons.lang.StringUtils; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Map; - -public class GivePickaxeCommand { - - private final XPrisonEnchants plugin; - - public GivePickaxeCommand(XPrisonEnchants plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertOp() - .handler(c -> { - - if (c.args().size() == 0) { - PlayerUtils.sendMessage(c.sender(), "&c/givepickaxe <[enchant1]=[level1],[enchant2]=[level2],...[enchantX]=[levelX]> "); - return; - } - - String input = null, name = null; - Player target = null; - - if (c.args().size() == 1) { - input = c.rawArg(0); - } else if (c.args().size() == 2) { - target = c.arg(0).parseOrFail(Player.class); - input = c.rawArg(1); - } else if (c.args().size() >= 3) { - target = c.arg(0).parseOrFail(Player.class); - input = c.rawArg(1); - name = StringUtils.join(c.args().subList(2, c.args().size()), " "); - } - - Map enchants = parseEnchantsFromInput(input); - - this.plugin.getEnchantsManager().givePickaxe(target, enchants, name, c.sender()); - }).registerAndBind(this.plugin.getCore(), "givepickaxe"); - } - - - private Map parseEnchantsFromInput(String input) { - Map enchants = new HashMap<>(); - - String[] split = input.split(","); - for (String s : split) { - String[] enchantData = s.split("="); - - try { - XPrisonEnchantment enchantment = getEnchantsRepository().getEnchantByName(enchantData[0]); - if (enchantment == null) { - enchantment = getEnchantsRepository().getEnchantById(Integer.parseInt(enchantData[0])); - } - - if (enchantment == null) { - continue; - } - - int enchantLevel = Integer.parseInt(enchantData[1]); - enchants.put(enchantment, enchantLevel); - } catch (Exception ignored) { - - } - } - return enchants; - } - - private EnchantsRepository getEnchantsRepository() { - return this.plugin.getEnchantsRepository(); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/command/ValueCommand.java b/src/main/java/me/nvus/xprison/enchants/command/ValueCommand.java deleted file mode 100644 index ccc4558..0000000 --- a/src/main/java/me/nvus/xprison/enchants/command/ValueCommand.java +++ /dev/null @@ -1,54 +0,0 @@ -package me.nvus.xprison.enchants.command; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.managers.CooldownManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -public class ValueCommand { - - private static final String COMMAND_NAME = "value"; - - private final XPrisonEnchants plugin; - - public ValueCommand(XPrisonEnchants plugin) { - this.plugin = plugin; - } - - - public void register() { - Commands.create() - .assertPlayer() - .assertPermission("xprison.value", this.plugin.getEnchantsConfig().getMessage("value_no_permission")) - .handler(c -> { - - if (!checkCooldown(c.sender())) { - PlayerUtils.sendMessage(c.sender(), this.plugin.getEnchantsConfig().getMessage("value_cooldown").replace("%time%", String.valueOf(this.getCooldownManager().getRemainingTime(c.sender())))); - return; - } - - ItemStack pickAxe = c.sender().getItemInHand(); - - if (!validatePickaxe(pickAxe)) { - PlayerUtils.sendMessage(c.sender(), this.plugin.getEnchantsConfig().getMessage("value_no_pickaxe")); - return; - } - - PlayerUtils.sendMessage(c.sender(), this.plugin.getEnchantsConfig().getMessage("value_value").replace("%player%", c.sender().getName()).replace("%tokens%", String.format("%,d", this.plugin.getEnchantsManager().getPickaxeValue(pickAxe)))); - }).registerAndBind(plugin.getCore(), COMMAND_NAME); - } - - private boolean validatePickaxe(ItemStack pickAxe) { - return pickAxe != null && this.plugin.getCore().isPickaxeSupported(pickAxe.getType()); - } - - private boolean checkCooldown(Player sender) { - return (sender.isOp() || !getCooldownManager().hasValueCooldown(sender)); - } - - private CooldownManager getCooldownManager() { - return this.plugin.getCooldownManager(); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/config/EnchantsConfig.java b/src/main/java/me/nvus/xprison/enchants/config/EnchantsConfig.java deleted file mode 100644 index ea91358..0000000 --- a/src/main/java/me/nvus/xprison/enchants/config/EnchantsConfig.java +++ /dev/null @@ -1,124 +0,0 @@ -package me.nvus.xprison.enchants.config; - -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.LevelFormat; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.text.TextUtils; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.event.block.Action; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public class EnchantsConfig { - - private final XPrisonEnchants plugin; - private final FileManager.Config config; - - private Map messages; - - private LevelFormat levelFormat; - private String excludedFormat; - private List pickaxeLore; - private boolean allowEnchantsOutside; - private boolean firstJoinPickaxeEnabled; - private CompMaterial firstJoinPickaxeMaterial; - private List firstJoinPickaxeEnchants; - private String firstJoinPickaxeName; - private boolean keepPickaxesOnDeath; - private boolean useUnbreakablePermission; - private List openEnchantMenuActions; - - public EnchantsConfig(XPrisonEnchants plugin) { - this.plugin = plugin; - this.config = plugin.getCore().getFileManager().getConfig("enchants.yml").copyDefaults(true).save(); - } - - public void reload() { - this.getConfig().reload(); - this.load(); - } - - public void load() { - this.loadVariables(); - this.loadMessages(); - } - - private void loadVariables() { - this.levelFormat = LevelFormat.of(getYamlConfig().getString("Pickaxe.level-format", "NUMBER")); - this.excludedFormat = getYamlConfig().getString("Pickaxe.excluded-format", "&7[&c-&7] &8%Enchant% %Level%"); - this.pickaxeLore = getYamlConfig().getStringList("Pickaxe.lore"); - this.openEnchantMenuActions = Arrays.stream(getYamlConfig().getString("open-enchant-menu-action", "RIGHT_CLICK_AIR,RIGHT_CLICK_BLOCK").split(",")).map(s-> Action.valueOf(s.toUpperCase())).collect(Collectors.toList()); - this.allowEnchantsOutside = getYamlConfig().getBoolean("allow-enchants-outside-mine-regions"); - this.firstJoinPickaxeEnabled = getYamlConfig().getBoolean("first-join-pickaxe.enabled"); - this.firstJoinPickaxeMaterial = CompMaterial.fromString(getYamlConfig().getString("first-join-pickaxe.material")); - this.firstJoinPickaxeEnchants = getYamlConfig().getStringList("first-join-pickaxe.enchants"); - this.firstJoinPickaxeName = getYamlConfig().getString("first-join-pickaxe.name"); - this.keepPickaxesOnDeath = getYamlConfig().getBoolean("keep-pickaxes-on-death"); - this.useUnbreakablePermission = getYamlConfig().getBoolean("use-unbreakable-permission"); - } - - private void loadMessages() { - this.messages = new HashMap<>(); - for (String key : getYamlConfig().getConfigurationSection("messages").getKeys(false)) { - messages.put(key, TextUtils.applyColor(getConfig().get().getString("messages." + key))); - } - } - - - private FileManager.Config getConfig() { - return this.config; - } - - public YamlConfiguration getYamlConfig() { - return this.config.get(); - } - - public String getMessage(String key) { - return messages.getOrDefault(key.toLowerCase(), "Message not found with key: " + key); - } - - public LevelFormat getLevelFormat() { - return levelFormat; - } - - public String getExcludedFormat() { - return excludedFormat; - } - - public List getPickaxeLore() { - return pickaxeLore; - } - - public boolean isFirstJoinPickaxeEnabled() { - return firstJoinPickaxeEnabled; - } - - public CompMaterial getFirstJoinPickaxeMaterial() { - return firstJoinPickaxeMaterial; - } - - public List getFirstJoinPickaxeEnchants() { - return firstJoinPickaxeEnchants; - } - - public String getFirstJoinPickaxeName() { - return firstJoinPickaxeName; - } - - public boolean isKeepPickaxesOnDeath() { - return keepPickaxesOnDeath; - } - - public boolean isUseUnbreakablePermission() { - return useUnbreakablePermission; - } - - public List getOpenEnchantMenuActions() { - return openEnchantMenuActions; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/gui/DisenchantGUI.java b/src/main/java/me/nvus/xprison/enchants/gui/DisenchantGUI.java deleted file mode 100644 index 468124c..0000000 --- a/src/main/java/me/nvus/xprison/enchants/gui/DisenchantGUI.java +++ /dev/null @@ -1,159 +0,0 @@ -package me.nvus.xprison.enchants.gui; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.utils.GuiUtils; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.text.TextUtils; -import lombok.Getter; -import lombok.Setter; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.Item; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventPriority; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public final class DisenchantGUI extends Gui { - - private static List GUI_ITEM_LORE; - private static String GUI_TITLE; - private static Item EMPTY_SLOT_ITEM; - private static Item HELP_ITEM; - private static int HELP_ITEM_SLOT; - private static int PICKAXE_ITEM_SLOT; - private static int GUI_LINES; - private static boolean PICKAXE_ITEM_ENABLED; - private static boolean HELP_ITEM_ENABLED; - - @Getter - @Setter - private ItemStack pickAxe; - - @Getter - private final int pickaxePlayerInventorySlot; - - private final XPrisonEnchants plugin; - - public DisenchantGUI(XPrisonEnchants plugin, Player player, ItemStack pickAxe, int pickaxePlayerInventorySlot) { - super(player, GUI_LINES, GUI_TITLE); - this.plugin = plugin; - this.pickAxe = pickAxe; - this.pickaxePlayerInventorySlot = pickaxePlayerInventorySlot; - - Events.subscribe(InventoryCloseEvent.class, EventPriority.LOWEST) - .filter(e -> e.getInventory().equals(this.getHandle())) - .handler(e -> { - XPrison.getInstance().getEnchants().getEnchantsManager().handlePickaxeUnequip(this.getPlayer(), this.pickAxe); - XPrison.getInstance().getEnchants().getEnchantsManager().handlePickaxeEquip(this.getPlayer(), this.pickAxe); - }).bindWith(this); - - Schedulers.sync().runLater(() -> { - if (!pickAxe.equals(this.getPlayer().getInventory().getItem(this.pickaxePlayerInventorySlot))) { - this.close(); - } - }, 10); - setFallbackGui(player1 -> new EnchantGUI(plugin, player, pickAxe, pickaxePlayerInventorySlot)); - - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - for (int i = 0; i < this.getHandle().getSize(); i++) { - this.setItem(i, EMPTY_SLOT_ITEM); - } - } - - - if (HELP_ITEM_ENABLED) { - this.setItem(HELP_ITEM_SLOT, HELP_ITEM); - } - - if (PICKAXE_ITEM_ENABLED) { - this.setItem(PICKAXE_ITEM_SLOT, Item.builder(pickAxe).build()); - } - - Collection allEnchants = this.plugin.getEnchantsRepository().getAll(); - - for (XPrisonEnchantment enchantment : allEnchants) { - - if (!enchantment.isRefundEnabled() || !enchantment.isEnabled()) { - continue; - } - - int level = XPrisonEnchants.getInstance().getEnchantsManager().getEnchantLevel(this.pickAxe, enchantment); - this.setItem(enchantment.getRefundGuiSlot(), getRefundGuiItem(enchantment, this, level)); - } - } - - - private Item getRefundGuiItem(XPrisonEnchantment enchantment, DisenchantGUI gui, int level) { - Material m = enchantment.isRefundEnabled() ? enchantment.getMaterial() : CompMaterial.BARRIER.toMaterial(); - ItemStackBuilder builder = ItemStackBuilder.of(m); - - if (enchantment.getBase64() != null && !enchantment.getBase64().isEmpty()) { - builder = ItemStackBuilder.of(SkullUtils.getCustomTextureHead(enchantment.getBase64())); - } - - builder.name(enchantment.isRefundEnabled() ? enchantment.getGuiName() : this.plugin.getEnchantsConfig().getMessage("enchant_cant_disenchant")); - builder.lore(enchantment.isRefundEnabled() ? GuiUtils.translateGuiLore(enchantment, GUI_ITEM_LORE, level) : new ArrayList<>()); - - return enchantment.isRefundEnabled() ? builder.buildItem().bind(handler -> { - if (handler.getClick() == ClickType.MIDDLE || handler.getClick() == ClickType.SHIFT_RIGHT) { - this.plugin.getEnchantsManager().disenchant(enchantment, gui, level, 100); - gui.redraw(); - } else if (handler.getClick() == ClickType.LEFT) { - this.plugin.getEnchantsManager().disenchant(enchantment, gui, level, 1); - gui.redraw(); - } else if (handler.getClick() == ClickType.RIGHT) { - this.plugin.getEnchantsManager().disenchant(enchantment, gui, level, 10); - gui.redraw(); - } else if (handler.getClick() == ClickType.DROP) { - this.plugin.getEnchantsManager().disenchantMax(enchantment, gui, level); - } - }, ClickType.MIDDLE, ClickType.SHIFT_RIGHT, ClickType.LEFT, ClickType.RIGHT, ClickType.DROP).build() : builder.buildConsumer(handler -> handler.getWhoClicked().sendMessage(this.plugin.getEnchantsConfig().getMessage("enchant_cant_disenchant"))); - } - - public static void init() { - - GUI_ITEM_LORE = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getStringList("disenchant_menu.item.lore"); - GUI_TITLE = TextUtils.applyColor(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("disenchant_menu.title")); - GUI_LINES = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getInt("disenchant_menu.lines"); - - EMPTY_SLOT_ITEM = ItemStackBuilder. - of(CompMaterial.fromString(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("disenchant_menu.empty_slots")).toItem()).buildItem().build(); - - HELP_ITEM_ENABLED = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getBoolean("disenchant_menu.help_item.enabled", true); - PICKAXE_ITEM_ENABLED = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getBoolean("disenchant_menu.pickaxe_enabled", true); - - if (HELP_ITEM_ENABLED) { - String base64 = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("disenchant_menu.help_item.Base64", null); - - if (base64 != null) { - HELP_ITEM = ItemStackBuilder.of(SkullUtils.getCustomTextureHead(base64)) - .name(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("disenchant_menu.help_item.name")).lore(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getStringList("disenchant_menu.help_item.lore")).buildItem().build(); - } else { - HELP_ITEM = ItemStackBuilder.of(CompMaterial.fromString(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("disenchant_menu.help_item.material")).toMaterial()) - .name(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("disenchant_menu.help_item.name")).lore(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getStringList("disenchant_menu.help_item.lore")).buildItem().build(); - } - HELP_ITEM_SLOT = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getInt("disenchant_menu.help_item.slot"); - } - - if (PICKAXE_ITEM_ENABLED) { - PICKAXE_ITEM_SLOT = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getInt("disenchant_menu.pickaxe_slot"); - } - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/gui/EnchantGUI.java b/src/main/java/me/nvus/xprison/enchants/gui/EnchantGUI.java deleted file mode 100644 index 0d51746..0000000 --- a/src/main/java/me/nvus/xprison/enchants/gui/EnchantGUI.java +++ /dev/null @@ -1,183 +0,0 @@ -package me.nvus.xprison.enchants.gui; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.utils.GuiUtils; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.nvus.xprison.utils.text.TextUtils; -import lombok.Getter; -import lombok.Setter; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.Item; -import org.bukkit.entity.Player; -import org.bukkit.event.EventPriority; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.Collection; -import java.util.List; - -public final class EnchantGUI extends Gui { - - private static List GUI_ITEM_LORE; - private static String GUI_TITLE; - private static Item EMPTY_SLOT_ITEM; - private static int PICKAXE_ITEM_SLOT; - private static int HELP_ITEM_SLOT; - private static int DISENCHANT_ITEM_SLOT; - private static int GUI_LINES; - private static Item HELP_ITEM; - private static ItemStack DISENCHANT_ITEM; - private static boolean PICKAXE_ITEM_ENABLED; - private static boolean HELP_ITEM_ENABLED; - private static boolean DISENCHANT_ITEM_ENABLED; - - @Getter - @Setter - private ItemStack pickAxe; - - @Getter - private final int pickaxePlayerInventorySlot; - - private final XPrisonEnchants plugin; - - public EnchantGUI(XPrisonEnchants plugin, Player player, ItemStack pickAxe, int pickaxePlayerInventorySlot) { - super(player, GUI_LINES, GUI_TITLE); - this.plugin = plugin; - this.pickAxe = pickAxe; - this.pickaxePlayerInventorySlot = pickaxePlayerInventorySlot; - - Events.subscribe(InventoryCloseEvent.class, EventPriority.LOWEST) - .filter(e -> e.getInventory().equals(this.getHandle())) - .handler(e -> { - XPrison.getInstance().getEnchants().getEnchantsManager().handlePickaxeUnequip(this.getPlayer(), this.pickAxe); - XPrison.getInstance().getEnchants().getEnchantsManager().handlePickaxeEquip(this.getPlayer(), this.pickAxe); - }).bindWith(this); - - // Checking for duping - Schedulers.sync().runLater(() -> { - if (!pickAxe.equals(this.getPlayer().getInventory().getItem(this.pickaxePlayerInventorySlot))) { - this.close(); - } - },10); - } - - @Override - public void redraw() { - - // perform initial setup. - if (isFirstDraw()) { - for (int i = 0; i < this.getHandle().getSize(); i++) { - this.setItem(i, EMPTY_SLOT_ITEM); - } - } - - if (HELP_ITEM_ENABLED) { - this.setItem(HELP_ITEM_SLOT, HELP_ITEM); - } - - if (DISENCHANT_ITEM_ENABLED) { - this.setItem(DISENCHANT_ITEM_SLOT, ItemStackBuilder.of(DISENCHANT_ITEM).build(() -> { - this.close(); - new DisenchantGUI(this.plugin, this.getPlayer(), this.pickAxe, this.pickaxePlayerInventorySlot).open(); - })); - } - - if (PICKAXE_ITEM_ENABLED) { - this.setItem(PICKAXE_ITEM_SLOT, Item.builder(this.pickAxe).build()); - } - - Collection allEnchants = this.plugin.getEnchantsRepository().getAll(); - for (XPrisonEnchantment enchantment : allEnchants) { - if (!enchantment.isEnabled()) { - continue; - } - int level = XPrisonEnchants.getInstance().getEnchantsManager().getEnchantLevel(this.pickAxe, enchantment); - this.setItem(enchantment.getGuiSlot(), getGuiItem(enchantment, this, level)); - } - } - - private Item getGuiItem(XPrisonEnchantment enchantment, EnchantGUI gui, int currentLevel) { - - ItemStackBuilder builder = ItemStackBuilder.of(enchantment.getMaterial()); - - if (enchantment.getBase64() != null && !enchantment.getBase64().isEmpty()) { - builder = ItemStackBuilder.of(SkullUtils.getCustomTextureHead(enchantment.getBase64())); - } - - builder.name(enchantment.getGuiName()); - builder.lore(GuiUtils.translateGuiLore(enchantment, GUI_ITEM_LORE, currentLevel)); - - return builder.buildItem().bind(handler -> { - if (!enchantment.canBeBought(gui.getPickAxe())) { - PlayerUtils.sendMessage(this.getPlayer(), this.plugin.getEnchantsConfig().getMessage("pickaxe_level_required").replace("%pickaxe_level%", String.format("%,d", enchantment.getRequiredPickaxeLevel()))); - return; - } - if (handler.getClick() == ClickType.MIDDLE || handler.getClick() == ClickType.SHIFT_RIGHT) { - this.plugin.getEnchantsManager().buyEnchnant(enchantment, gui, currentLevel, 100); - gui.redraw(); - } else if (handler.getClick() == ClickType.LEFT) { - this.plugin.getEnchantsManager().buyEnchnant(enchantment, gui, currentLevel, 1); - gui.redraw(); - } else if (handler.getClick() == ClickType.RIGHT) { - this.plugin.getEnchantsManager().buyEnchnant(enchantment, gui, currentLevel, 10); - gui.redraw(); - } else if (handler.getClick() == ClickType.DROP) { - this.plugin.getEnchantsManager().buyMaxEnchant(enchantment, gui, currentLevel); - } - }, ClickType.MIDDLE, ClickType.SHIFT_RIGHT, ClickType.RIGHT, ClickType.LEFT, ClickType.DROP).build(); - } - - public static void init() { - - GUI_ITEM_LORE = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getStringList("enchant_menu.item.lore"); - GUI_TITLE = TextUtils.applyColor(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.title")); - EMPTY_SLOT_ITEM = ItemStackBuilder. - of(CompMaterial.fromString(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.empty_slots")).toItem()).buildItem().build(); - GUI_LINES = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getInt("enchant_menu.lines"); - - HELP_ITEM_ENABLED = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getBoolean("enchant_menu.help_item.enabled", true); - PICKAXE_ITEM_ENABLED = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getBoolean("enchant_menu.pickaxe_enabled", true); - DISENCHANT_ITEM_ENABLED = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getBoolean("enchant_menu.disenchant_item.enabled", true); - - if (DISENCHANT_ITEM_ENABLED) { - String base64 = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.disenchant_item.Base64", null); - - if (base64 != null) { - DISENCHANT_ITEM = ItemStackBuilder.of(SkullUtils.getCustomTextureHead(base64)) - .name(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.disenchant_item.name")).lore(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getStringList("enchant_menu.disenchant_item.lore")).build(); - } else { - DISENCHANT_ITEM = ItemStackBuilder.of(CompMaterial.fromString(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.disenchant_item.material")).toMaterial()) - .name(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.disenchant_item.name")).lore(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getStringList("enchant_menu.disenchant_item.lore")).build(); - } - DISENCHANT_ITEM_SLOT = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getInt("enchant_menu.disenchant_item.slot"); - - } - - if (HELP_ITEM_ENABLED) { - String base64 = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.help_item.Base64", null); - - if (base64 != null) { - HELP_ITEM = ItemStackBuilder.of(SkullUtils.getCustomTextureHead(base64)) - .name(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.help_item.name")).lore(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getStringList("enchant_menu.help_item.lore")).buildItem().build(); - } else { - HELP_ITEM = ItemStackBuilder.of(CompMaterial.fromString(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.help_item.material")).toMaterial()) - .name(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getString("enchant_menu.help_item.name")).lore(XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getStringList("enchant_menu.help_item.lore")).buildItem().build(); - } - - HELP_ITEM_SLOT = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getInt("enchant_menu.help_item.slot"); - - } - - if (PICKAXE_ITEM_ENABLED) { - PICKAXE_ITEM_SLOT = XPrisonEnchants.getInstance().getEnchantsConfig().getYamlConfig().getInt("enchant_menu.pickaxe_slot"); - } - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/listener/EnchantsListener.java b/src/main/java/me/nvus/xprison/enchants/listener/EnchantsListener.java deleted file mode 100644 index 2c04d60..0000000 --- a/src/main/java/me/nvus/xprison/enchants/listener/EnchantsListener.java +++ /dev/null @@ -1,172 +0,0 @@ -package me.nvus.xprison.enchants.listener; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.gui.EnchantGUI; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.MinecraftVersion; -import me.nvus.xprison.utils.inventory.InventoryUtils; -import me.lucko.helper.Events; -import org.bukkit.entity.Player; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.inventory.InventoryAction; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.*; -import org.bukkit.inventory.GrindstoneInventory; -import org.bukkit.inventory.ItemStack; -import org.codemc.worldguardwrapper.flag.IWrappedFlag; -import org.codemc.worldguardwrapper.flag.WrappedState; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public class EnchantsListener { - - private final XPrisonEnchants plugin; - private final List ignoredEvents = new ArrayList<>(); - - public EnchantsListener(XPrisonEnchants plugin) { - this.plugin = plugin; - } - - public void register() { - - this.subscribeToPlayerDeathEvent(); - this.subscribeToPlayerRespawnEvent(); - this.subscribeToInventoryClickEvent(); - this.subscribeToPlayerJoinEvent(); - this.subscribeToPlayerDropItemEvent(); - this.subscribeToPlayerInteractEvent(); - this.subscribeToPlayerItemHeldEvent(); - this.subscribeToBlockBreakEvent(); - } - - public List getIgnoredEvents() { - return ignoredEvents; - } - - private void subscribeToBlockBreakEvent() { - Events.subscribe(BlockBreakEvent.class, EventPriority.HIGHEST) - .filter(e -> !e.isCancelled() && !ignoredEvents.contains(e)) - .filter(e -> e.getPlayer().getItemInHand() != null && this.plugin.getCore().isPickaxeSupported(e.getPlayer().getItemInHand().getType())) - .handler(e -> this.plugin.getEnchantsManager().handleBlockBreak(e, e.getPlayer().getItemInHand())).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerItemHeldEvent() { - // Switching pickaxes - Events.subscribe(PlayerItemHeldEvent.class, EventPriority.HIGHEST) - .handler(e -> { - - ItemStack newItem = e.getPlayer().getInventory().getItem(e.getNewSlot()); - ItemStack previousItem = e.getPlayer().getInventory().getItem(e.getPreviousSlot()); - - // Old item - if (previousItem != null && this.plugin.getCore().isPickaxeSupported(previousItem.getType())) { - this.plugin.getEnchantsManager().handlePickaxeUnequip(e.getPlayer(), previousItem); - } - - // New item - if (newItem != null && this.plugin.getCore().isPickaxeSupported(newItem.getType())) { - this.plugin.getEnchantsManager().handlePickaxeEquip(e.getPlayer(), newItem); - } - - }).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerInteractEvent() { - Events.subscribe(PlayerInteractEvent.class) - .filter(e -> e.getItem() != null && this.plugin.getCore().isPickaxeSupported(e.getItem().getType())) - .filter(e -> (this.plugin.getEnchantsConfig().getOpenEnchantMenuActions().contains(e.getAction()))) - .handler(e -> { - - e.setCancelled(true); - - ItemStack pickAxe = e.getItem(); - int pickaxeSlot = InventoryUtils.getInventorySlot(e.getPlayer(), pickAxe); - this.plugin.getCore().debug("Pickaxe slot is: " + pickaxeSlot, this.plugin); - - new EnchantGUI(this.plugin, e.getPlayer(), pickAxe, pickaxeSlot).open(); - }).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerDropItemEvent() { - // Dropping pickaxe - Events.subscribe(PlayerDropItemEvent.class, EventPriority.HIGHEST) - .handler(e -> { - if (this.plugin.getCore().isPickaxeSupported(e.getItemDrop().getItemStack())) { - this.plugin.getEnchantsManager().handlePickaxeUnequip(e.getPlayer(), e.getItemDrop().getItemStack()); - } - }).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerJoinEvent() { - //First join pickaxe - Events.subscribe(PlayerJoinEvent.class) - .filter(e -> !e.getPlayer().hasPlayedBefore() && this.plugin.getEnchantsConfig().isFirstJoinPickaxeEnabled()) - .handler(e -> { - ItemStack firstJoinPickaxe = this.plugin.getEnchantsManager().createFirstJoinPickaxe(e.getPlayer()); - e.getPlayer().getInventory().addItem(firstJoinPickaxe); - }).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerRespawnEvent() { - Events.subscribe(PlayerRespawnEvent.class, EventPriority.LOWEST) - .handler(e -> this.plugin.getRespawnManager().handleRespawn(e.getPlayer())).bindWith(this.plugin.getCore()); - } - - private void subscribeToInventoryClickEvent() { - //Grindstone disenchanting - disable - if (MinecraftVersion.atLeast(MinecraftVersion.V.v1_14)) { - Events.subscribe(InventoryClickEvent.class) - .filter(e -> e.getInventory() instanceof GrindstoneInventory) - .handler(e -> { - ItemStack item1 = e.getInventory().getItem(0); - ItemStack item2 = e.getInventory().getItem(1); - if (e.getSlot() == 2 && (this.plugin.getEnchantsManager().hasEnchants(item1) || this.plugin.getEnchantsManager().hasEnchants(item2))) { - e.setCancelled(true); - } - }).bindWith(this.plugin.getCore()); - } - - Events.subscribe(InventoryClickEvent.class, EventPriority.MONITOR) - .filter(e -> e.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY) - .filter(e -> e.getWhoClicked() instanceof Player) - .filter(e -> !e.isCancelled()) - .handler(e -> { - ItemStack item = e.getCurrentItem(); - if (this.plugin.getCore().isPickaxeSupported(item)) { - this.plugin.getEnchantsManager().handlePickaxeUnequip((Player) e.getWhoClicked(), item); - } - }).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerDeathEvent() { - Events.subscribe(PlayerDeathEvent.class, EventPriority.LOWEST) - .handler(e -> { - - if (!this.plugin.getEnchantsConfig().isKeepPickaxesOnDeath()) { - return; - } - - List pickaxes = e.getDrops().stream().filter(itemStack -> this.plugin.getCore().isPickaxeSupported(itemStack) && - this.plugin.getEnchantsManager().hasEnchants(itemStack)).collect(Collectors.toList()); - e.getDrops().removeAll(pickaxes); - - this.plugin.getRespawnManager().addRespawnItems(e.getEntity(), pickaxes); - - if (pickaxes.size() > 0) { - this.plugin.getCore().debug("Removed " + e.getEntity().getName() + "'s pickaxes from drops (" + pickaxes.size() + "). Will be given back on respawn.", this.plugin); - } else { - this.plugin.getCore().debug("No Pickaxes found for player " + e.getEntity().getName() + " (PlayerDeathEvent)", this.plugin); - } - - }).bindWith(this.plugin.getCore()); - } - - private Optional> getWGFlag() { - return this.plugin.getCore().getWorldGuardWrapper().getFlag(Constants.ENCHANTS_WG_FLAG_NAME, WrappedState.class); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/managers/CooldownManager.java b/src/main/java/me/nvus/xprison/enchants/managers/CooldownManager.java deleted file mode 100644 index ec441a9..0000000 --- a/src/main/java/me/nvus/xprison/enchants/managers/CooldownManager.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.nvus.xprison.enchants.managers; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.lucko.helper.cooldown.Cooldown; -import me.lucko.helper.cooldown.CooldownMap; -import org.bukkit.entity.Player; - -import java.util.concurrent.TimeUnit; - -public class CooldownManager { - - private final XPrisonEnchants plugin; - private final CooldownMap valueCooldown; - - public CooldownManager(XPrisonEnchants plugin) { - this.plugin = plugin; - this.valueCooldown = CooldownMap.create(Cooldown.of(30, TimeUnit.SECONDS)); - } - - public boolean hasValueCooldown(Player sender) { - return !valueCooldown.test(sender); - } - - public long getRemainingTime(Player sender) { - return valueCooldown.get(sender).remainingTime(TimeUnit.SECONDS); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/managers/EnchantsManager.java b/src/main/java/me/nvus/xprison/enchants/managers/EnchantsManager.java deleted file mode 100644 index 996d87c..0000000 --- a/src/main/java/me/nvus/xprison/enchants/managers/EnchantsManager.java +++ /dev/null @@ -1,560 +0,0 @@ -package me.nvus.xprison.enchants.managers; - -import com.saicone.rtag.util.ServerInstance; -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.api.events.XPrisonPlayerEnchantEvent; -import me.nvus.xprison.enchants.gui.DisenchantGUI; -import me.nvus.xprison.enchants.gui.EnchantGUI; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.repo.EnchantsRepository; -import me.nvus.xprison.enchants.utils.EnchantUtils; -import me.nvus.xprison.pickaxelevels.XPrisonPickaxeLevels; -import me.nvus.xprison.pickaxelevels.model.PickaxeLevel; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.item.PrisonItem; -import me.nvus.xprison.utils.misc.RegionUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.nvus.xprison.utils.text.TextUtils; -import me.clip.placeholderapi.PlaceholderAPI; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.time.Time; -import org.bukkit.Material; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.codemc.worldguardwrapper.flag.WrappedState; - -import java.util.*; -import java.util.function.BiConsumer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class EnchantsManager { - - private static final String EXCLUDE_PERMISSION = "xprison.enchant.exclude."; - private static final String UNBREAK_PERMISSION = "xprison.pickaxe.unbreakable"; - private static final boolean USE_META_UNBREAK = ServerInstance.verNumber >= 11; - private static final Pattern PICKAXE_LORE_ENCHANT_PATTER = Pattern.compile("(?i)%Enchant-\\d+%"); - - private final XPrisonEnchants plugin; - private final List lockedPlayers; - - public EnchantsManager(XPrisonEnchants plugin) { - this.plugin = plugin; - this.lockedPlayers = Collections.synchronizedList(new ArrayList<>()); - } - - public Map getItemEnchants(ItemStack itemStack) { - - if (itemStack == null || itemStack.getType() == Material.AIR) { - return new HashMap<>(); - } - - return new PrisonItem(itemStack).getEnchants(getEnchantsRepository()); - } - - public ItemStack updatePickaxe(Player player, ItemStack item) { - - if (item == null || !this.plugin.getCore().isPickaxeSupported(item.getType())) { - return item; - } - - return this.applyLoreToPickaxe(player, item); - } - - private ItemStack applyLoreToPickaxe(Player player, ItemStack item) { - - ItemMeta meta = item.getItemMeta(); - List lore = new ArrayList<>(); - - boolean pickaxeLevels = this.plugin.getCore().isModuleEnabled(XPrisonPickaxeLevels.MODULE_NAME); - - PickaxeLevel currentLevel = null; - PickaxeLevel nextLevel = null; - String pickaxeProgressBar = ""; - - if (pickaxeLevels) { - currentLevel = this.plugin.getCore().getPickaxeLevels().getPickaxeLevelsManager().getPickaxeLevel(item).orElse(null); - nextLevel = this.plugin.getCore().getPickaxeLevels().getPickaxeLevelsManager().getNextPickaxeLevel(currentLevel).orElse(null); - pickaxeProgressBar = this.plugin.getCore().getPickaxeLevels().getPickaxeLevelsManager().getProgressBar(item); - } - - long blocksBroken = getBlocksBroken(item); - final PrisonItem prisonItem = new PrisonItem(item); - Map enchants = prisonItem.getEnchants(getEnchantsRepository()); - - List pickaxeLore = this.plugin.getEnchantsConfig().getPickaxeLore(); - - final boolean isUnbreakable; - Boolean unbreakResult = null; - if (USE_META_UNBREAK ? meta.isUnbreakable() : prisonItem.isUnbreakable()) { - if (!this.plugin.getEnchantsConfig().isUseUnbreakablePermission() || player.hasPermission(UNBREAK_PERMISSION)) { - isUnbreakable = true; - } else { - isUnbreakable = false; - unbreakResult = false; - } - } else { - if (this.plugin.getEnchantsConfig().isUseUnbreakablePermission() && player.hasPermission(UNBREAK_PERMISSION)) { - isUnbreakable = true; - unbreakResult = true; - } else { - isUnbreakable = false; - } - } - final String durability = isUnbreakable ? "∞" : String.valueOf(item.getType().getMaxDurability() - EnchantUtils.getDurability(item, meta)); - if (unbreakResult != null) { - if (USE_META_UNBREAK) { - meta.setUnbreakable(unbreakResult); - } else { - if (unbreakResult) { - prisonItem.setUnbreakable(true); - } else { - prisonItem.remove("Unbreakable"); - } - prisonItem.load(); - meta = item.getItemMeta(); - } - } - - for (String s : pickaxeLore) { - s = s.replace("%Blocks%", String.valueOf(blocksBroken)); - s = s.replace("%Durability%", durability); - - if (pickaxeLevels) { - s = s.replace("%Blocks_Required%", nextLevel == null ? "∞" : String.valueOf(nextLevel.getBlocksRequired())); - s = s.replace("%PickaxeLevel%", currentLevel == null ? "0" : String.valueOf(currentLevel.getLevel())); - s = s.replace("%PickaxeProgress%", pickaxeProgressBar); - } - - Matcher matcher = PICKAXE_LORE_ENCHANT_PATTER.matcher(s); - - if (matcher.find()) { - int enchId = Integer.parseInt(matcher.group().replaceAll("\\D", "")); - XPrisonEnchantment enchantment = getEnchantsRepository().getEnchantById(enchId); - - if (enchantment != null) { - int enchLvl = enchants.getOrDefault(enchantment, 0); - if (enchLvl > 0) { - final String line; - if (player.hasPermission(EXCLUDE_PERMISSION + enchantment.getRawName())) { - line = this.plugin.getEnchantsConfig().getExcludedFormat() - .replace("%Enchant%", enchantment.getNameUncolor()) - .replace("%Level%", this.plugin.getEnchantsConfig().getLevelFormat().format(enchLvl)); - } else { - line = enchantment.getName() + " " + this.plugin.getEnchantsConfig().getLevelFormat().format(enchLvl); - } - s = s.replace(matcher.group(), line); - } else { - continue; - } - } else { - continue; - } - } - - if (this.plugin.getCore().isPlaceholderAPIEnabled()) { - s = PlaceholderAPI.setPlaceholders(player, s); - } - - lore.add(TextUtils.applyColor(s)); - } - - meta.setLore(lore); - meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - item.setItemMeta(meta); - return item; - } - - private EnchantsRepository getEnchantsRepository() { - return this.plugin.getEnchantsRepository(); - } - - public long getBlocksBroken(ItemStack item) { - - if (item == null || item.getType() == Material.AIR) { - return 0; - } - - return new PrisonItem(item).getBrokenBlocks(); - } - - public synchronized void addBlocksBrokenToItem(Player p, int amount) { - - if (amount == 0) { - return; - } - - final PrisonItem prisonItem = new PrisonItem(p.getItemInHand()); - prisonItem.addBrokenBlocks(amount); - ItemStack item = prisonItem.loadCopy(); - applyLoreToPickaxe(p, item); - p.setItemInHand(item); - } - - public synchronized void addBlocksBrokenToItem(Player player, ItemStack item, int amount) { - - if (amount == 0) { - return; - } - - final PrisonItem prisonItem = new PrisonItem(item); - prisonItem.addBrokenBlocks(amount); - player.setItemInHand(prisonItem.loadCopy()); - applyLoreToPickaxe(player, player.getItemInHand()); - } - - public synchronized int getEnchantLevel(ItemStack itemStack, XPrisonEnchantment enchantment) { - - if (enchantment == null || itemStack == null || itemStack.getType() == Material.AIR) { - return 0; - } - - return Math.min(new PrisonItem(itemStack).getEnchantLevel(enchantment), enchantment.getMaxLevel()); - } - - public void forEachEffectiveEnchant(Player player, ItemStack item, BiConsumer consumer) { - for (var entry : this.getItemEnchants(item).entrySet()) { - final XPrisonEnchantment enchant = entry.getKey(); - if (enchant.isEnabled() && !player.hasPermission(EXCLUDE_PERMISSION + enchant.getRawName())) { - consumer.accept(enchant, entry.getValue()); - } - } - } - - public void handleBlockBreak(BlockBreakEvent e, ItemStack pickAxe) { - - this.addBlocksBrokenToItem(e.getPlayer(), 1); - - if (RegionUtils.getRegionWithHighestPriorityAndFlag(e.getBlock().getLocation(), Constants.ENCHANTS_WG_FLAG_NAME, WrappedState.ALLOW) == null) { - this.plugin.getCore().debug("EnchantsManager::handleBlockBreak >> No region with flag upc-enchants found. Enchants will not be triggered.", this.plugin); - return; - } - - forEachEffectiveEnchant(e.getPlayer(), pickAxe, (enchant, level) -> enchant.onBlockBreak(e, level)); - } - - public void handlePickaxeEquip(Player p, ItemStack newItem) { - forEachEffectiveEnchant(p, newItem, (enchant, level) -> enchant.onEquip(p, newItem, level)); - } - - public void handlePickaxeUnequip(Player p, ItemStack newItem) { - forEachEffectiveEnchant(p, newItem, (enchant, level) -> enchant.onUnequip(p, newItem, level)); - } - - public ItemStack setEnchantLevel(Player player, ItemStack item, XPrisonEnchantment enchantment, int level) { - - if (enchantment == null || item == null) { - return item; - } - - final PrisonItem prisonItem = new PrisonItem(item); - prisonItem.setEnchant(enchantment, level); - prisonItem.load(); - return this.applyLoreToPickaxe(player, item); - } - - public ItemStack removeEnchant(Player player, ItemStack item, XPrisonEnchantment enchantment) { - return setEnchantLevel(player, item, enchantment, 0); - } - - public void buyEnchnant(XPrisonEnchantment enchantment, EnchantGUI gui, int currentLevel, int addition) { - - if (currentLevel >= enchantment.getMaxLevel()) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_max_level")); - return; - } - - if (currentLevel + addition > enchantment.getMaxLevel()) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_max_level_exceed")); - return; - } - - long totalCost = 0; - - long startTime = Time.nowMillis(); - - for (int j = 0; j < addition; j++) { - totalCost += enchantment.getCostOfLevel(currentLevel + j + 1); - } - - this.plugin.getCore().debug(String.format("Calculation of levels %,d - %,d of %s enchant took %dms", currentLevel + 1, currentLevel + addition + 1, enchantment.getRawName(), Time.nowMillis() - startTime), this.plugin); - - if (!plugin.getCore().getTokens().getApi().hasEnough(gui.getPlayer(), totalCost)) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("not_enough_tokens")); - return; - } - - XPrisonPlayerEnchantEvent event = new XPrisonPlayerEnchantEvent(gui.getPlayer(), totalCost, currentLevel + addition); - - Events.callSync(event); - - if (event.isCancelled()) { - return; - } - - plugin.getCore().getTokens().getApi().removeTokens(gui.getPlayer(), totalCost, LostCause.ENCHANT); - - this.setEnchantLevel(gui.getPlayer(), gui.getPickAxe(), enchantment, currentLevel + addition); - - enchantment.onUnequip(gui.getPlayer(), gui.getPickAxe(), currentLevel); - enchantment.onEquip(gui.getPlayer(), gui.getPickAxe(), currentLevel + addition); - - gui.getPlayer().getInventory().setItem(gui.getPickaxePlayerInventorySlot(), gui.getPickAxe()); - - if (addition == 1) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_bought").replace("%tokens%", String.format("%,d", totalCost))); - } else { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_bought_multiple") - .replace("%amount%", String.valueOf(addition)) - .replace("%enchant%", enchantment.getName()) - .replace("%tokens%", String.format("%,d", totalCost))); - } - } - - public void disenchant(XPrisonEnchantment enchantment, DisenchantGUI gui, int currentLevel, int substraction) { - - if (currentLevel <= 0) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_no_level")); - return; - } - - if (currentLevel - substraction < 0) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_min_level_exceed")); - return; - } - - long totalRefunded = 0; - - for (int j = 0; j < substraction; j++) { - totalRefunded += enchantment.getRefundForLevel(currentLevel - j); - } - - plugin.getCore().getTokens().getTokensManager().giveTokens(gui.getPlayer(), totalRefunded, null, ReceiveCause.REFUND); - - this.setEnchantLevel(gui.getPlayer(), gui.getPickAxe(), enchantment, currentLevel - substraction); - - enchantment.onUnequip(gui.getPlayer(), gui.getPickAxe(), currentLevel); - enchantment.onEquip(gui.getPlayer(), gui.getPickAxe(), currentLevel - substraction); - - gui.getPlayer().getInventory().setItem(gui.getPickaxePlayerInventorySlot(), gui.getPickAxe()); - - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_refunded").replace("%amount%", String.format("%,d", substraction)).replace("%enchant%", enchantment.getName())); - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_tokens_back").replace("%tokens%", String.format("%,d", totalRefunded))); - } - - public void disenchantMax(XPrisonEnchantment enchantment, DisenchantGUI gui, int currentLevel) { - - if (currentLevel <= 0) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_no_level")); - return; - } - - if (this.lockedPlayers.contains(gui.getPlayer().getUniqueId())) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("transaction_in_progress")); - return; - } - - this.lockedPlayers.add(gui.getPlayer().getUniqueId()); - - - Schedulers.async().run(() -> { - int current = currentLevel; - int levelsToRefund = current; - - long totalRefunded = 0; - - while (gui.getPlayer().isOnline() && current > 0) { - totalRefunded += enchantment.getRefundForLevel(current); - current--; - } - - if (!gui.getPlayer().isOnline()) { - this.lockedPlayers.remove(gui.getPlayer().getUniqueId()); - return; - } - - int finalCurrent = current; - - this.lockedPlayers.remove(gui.getPlayer().getUniqueId()); - - Schedulers.sync().run(() -> { - enchantment.onUnequip(gui.getPlayer(), gui.getPickAxe(), currentLevel); - this.setEnchantLevel(gui.getPlayer(), gui.getPickAxe(), enchantment, finalCurrent); - gui.getPlayer().getInventory().setItem(gui.getPickaxePlayerInventorySlot(), gui.getPickAxe()); - enchantment.onEquip(gui.getPlayer(), gui.getPickAxe(), finalCurrent); - gui.redraw(); - }); - - plugin.getCore().getTokens().getTokensManager().giveTokens(gui.getPlayer(), totalRefunded, null, ReceiveCause.REFUND); - - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_refunded").replace("%amount%", String.format("%,d", levelsToRefund)).replace("%enchant%", enchantment.getName())); - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_tokens_back").replace("%tokens%", String.format("%,d", totalRefunded))); - }); - } - - public void buyMaxEnchant(XPrisonEnchantment enchantment, EnchantGUI gui, int currentLevel) { - - if (currentLevel >= enchantment.getMaxLevel()) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_max_level")); - return; - } - - if (this.lockedPlayers.contains(gui.getPlayer().getUniqueId())) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("transaction_in_progress")); - return; - } - - this.lockedPlayers.add(gui.getPlayer().getUniqueId()); - - Schedulers.async().run(() -> { - int levelsToBuy = 0; - long totalCost = 0; - - while (gui.getPlayer().isOnline() && (currentLevel + levelsToBuy + 1) <= enchantment.getMaxLevel() && this.plugin.getCore().getTokens().getApi().hasEnough(gui.getPlayer(), totalCost + enchantment.getCostOfLevel(currentLevel + levelsToBuy + 1))) { - levelsToBuy += 1; - totalCost += enchantment.getCostOfLevel(currentLevel + levelsToBuy + 1); - } - - if (!gui.getPlayer().isOnline()) { - this.lockedPlayers.remove(gui.getPlayer().getUniqueId()); - return; - } - - if (levelsToBuy == 0) { - this.lockedPlayers.remove(gui.getPlayer().getUniqueId()); - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("not_enough_tokens")); - return; - } - - XPrisonPlayerEnchantEvent event = new XPrisonPlayerEnchantEvent(gui.getPlayer(), totalCost, currentLevel + levelsToBuy); - - Events.callSync(event); - - if (event.isCancelled()) { - this.lockedPlayers.remove(gui.getPlayer().getUniqueId()); - return; - } - - plugin.getCore().getTokens().getApi().removeTokens(gui.getPlayer(), totalCost, LostCause.ENCHANT); - - int finalLevelsToBuy = levelsToBuy; - - this.lockedPlayers.remove(gui.getPlayer().getUniqueId()); - Schedulers.sync().run(() -> { - enchantment.onUnequip(gui.getPlayer(), gui.getPickAxe(), currentLevel); - this.setEnchantLevel(gui.getPlayer(), gui.getPickAxe(), enchantment, currentLevel + finalLevelsToBuy); - enchantment.onEquip(gui.getPlayer(), gui.getPickAxe(), currentLevel + finalLevelsToBuy); - gui.getPlayer().getInventory().setItem(gui.getPickaxePlayerInventorySlot(), gui.getPickAxe()); - gui.redraw(); - }); - - if (levelsToBuy == 1) { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_bought").replace("%tokens%", String.format("%,d", totalCost))); - } else { - PlayerUtils.sendMessage(gui.getPlayer(), plugin.getEnchantsConfig().getMessage("enchant_bought_multiple") - .replace("%amount%", String.valueOf(levelsToBuy)) - .replace("%enchant%", enchantment.getName()) - .replace("%tokens%", String.format("%,d", totalCost))); - } - }); - } - - public long getPickaxeValue(ItemStack pickAxe) { - - long sum = 0; - - Map playerEnchants = this.getItemEnchants(pickAxe); - - for (XPrisonEnchantment enchantment : playerEnchants.keySet()) { - for (int i = 1; i <= playerEnchants.get(enchantment); i++) { - sum += enchantment.getCostOfLevel(i); - } - } - return sum; - } - - // /givepickaxe - public void givePickaxe(Player target, Map enchants, String pickaxeName, CommandSender sender) { - ItemStackBuilder pickaxeBuilder = ItemStackBuilder.of(Material.DIAMOND_PICKAXE); - - if (pickaxeName != null) { - pickaxeBuilder.name(pickaxeName); - } - - ItemStack pickaxe = pickaxeBuilder.build(); - - for (Map.Entry entry : enchants.entrySet()) { - this.setEnchantLevel(target, pickaxe, entry.getKey(), entry.getValue()); - } - - pickaxe = this.applyLoreToPickaxe(target, pickaxe); - - if (target == null && sender instanceof Player) { - target = (Player) sender; - } - - if (target != null) { - if (target.getInventory().firstEmpty() == -1) { - PlayerUtils.sendMessage(sender, this.plugin.getEnchantsConfig().getMessage("pickaxe_inventory_full").replace("%player%", target.getName())); - return; - } - - target.getInventory().addItem(pickaxe); - PlayerUtils.sendMessage(sender, this.plugin.getEnchantsConfig().getMessage("pickaxe_given").replace("%player%", target.getName())); - PlayerUtils.sendMessage(target, this.plugin.getEnchantsConfig().getMessage("pickaxe_received").replace("%sender%", sender.getName())); - } - } - - public ItemStack createFirstJoinPickaxe(Player player) { - - String pickaxeName = this.plugin.getEnchantsConfig().getFirstJoinPickaxeName(); - pickaxeName = pickaxeName.replace("%player%", player.getName()); - - if (this.plugin.getCore().isPlaceholderAPIEnabled()) { - pickaxeName = PlaceholderAPI.setPlaceholders(player, pickaxeName); - } - - CompMaterial material = this.plugin.getEnchantsConfig().getFirstJoinPickaxeMaterial(); - ItemStack item = ItemStackBuilder.of(material.toItem()).name(pickaxeName).build(); - - List firstJoinPickaxeEnchants = this.plugin.getEnchantsConfig().getFirstJoinPickaxeEnchants(); - - for (String s : firstJoinPickaxeEnchants) { - try { - String[] data = s.split(" "); - XPrisonEnchantment enchantment = getEnchantsRepository().getEnchantByName(data[0]); - int level = Integer.parseInt(data[1]); - this.setEnchantLevel(player, item, enchantment, level); - } catch (Exception e) { - - } - } - - return this.applyLoreToPickaxe(player, item); - } - - public boolean hasEnchants(ItemStack item) { - return item != null && !this.getItemEnchants(item).isEmpty(); - } - - public void enable() { - - } - - public void disable() { - - } - - public void giveFirstJoinPickaxe(Player target) { - target.getInventory().addItem(this.createFirstJoinPickaxe(target)); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/managers/RespawnManager.java b/src/main/java/me/nvus/xprison/enchants/managers/RespawnManager.java deleted file mode 100644 index 00f7b7d..0000000 --- a/src/main/java/me/nvus/xprison/enchants/managers/RespawnManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.nvus.xprison.enchants.managers; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class RespawnManager { - - private final XPrisonEnchants plugin; - private final Map> respawnItems; - - - public RespawnManager(XPrisonEnchants plugin) { - this.plugin = plugin; - this.respawnItems = new HashMap<>(); - } - - public void addRespawnItems(Player player, List items) { - this.respawnItems.put(player.getUniqueId(), items); - } - - public void handleRespawn(Player player) { - if (this.respawnItems.containsKey(player.getUniqueId())) { - this.respawnItems.remove(player.getUniqueId()).forEach(itemStack -> { - player.getInventory().addItem(itemStack); - }); - } - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/LevelFormat.java b/src/main/java/me/nvus/xprison/enchants/model/LevelFormat.java deleted file mode 100644 index 4319a36..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/LevelFormat.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.nvus.xprison.enchants.model; - -import java.util.Map; -import java.util.TreeMap; - -public enum LevelFormat { - - NUMBER, ROMAN, FIXED; - - private static final Map FIXED_NUMBERS = Map.of( - 1, "I", - 2, "II", - 3, "III", - 4, "IV", - 5, "V", - 6, "VI", - 7, "VII", - 8, "VIII", - 9, "IX", - 10, "X" - ); - - private static final TreeMap ROMAN_NUMBERS = new TreeMap<>(); - - static { - ROMAN_NUMBERS.put(1000, "M"); - ROMAN_NUMBERS.put(900, "CM"); - ROMAN_NUMBERS.put(500, "D"); - ROMAN_NUMBERS.put(400, "CD"); - ROMAN_NUMBERS.put(100, "C"); - ROMAN_NUMBERS.put(90, "XC"); - ROMAN_NUMBERS.put(50, "L"); - ROMAN_NUMBERS.put(40, "XL"); - ROMAN_NUMBERS.put(10, "X"); - ROMAN_NUMBERS.put(9, "IX"); - ROMAN_NUMBERS.put(5, "V"); - ROMAN_NUMBERS.put(4, "IV"); - ROMAN_NUMBERS.put(1, "I"); - } - - public static LevelFormat of(String name) { - if (name == null) { - return LevelFormat.NUMBER; - } - switch (name.trim().toUpperCase()) { - case "ROMAN": - return LevelFormat.ROMAN; - case "FIXED": - return LevelFormat.FIXED; - case "NUMBER": - default: - return LevelFormat.NUMBER; - } - } - - public String format(int level) { - if (this == NUMBER || level < 1) { - return String.valueOf(level); - } - if (level <= 10) { - return FIXED_NUMBERS.get(level); - } - if (this == ROMAN) { - return toRoman(level); - } - return String.valueOf(level); - } - - private String toRoman(int level) { - final int mapLevel = ROMAN_NUMBERS.floorKey(level); - if (mapLevel == level) { - return ROMAN_NUMBERS.get(level); - } - return ROMAN_NUMBERS.get(mapLevel) + toRoman(level - mapLevel); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/Refundable.java b/src/main/java/me/nvus/xprison/enchants/model/Refundable.java deleted file mode 100644 index d74a66b..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/Refundable.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.nvus.xprison.enchants.model; - -public interface Refundable { - - boolean isRefundEnabled(); - - int getRefundGuiSlot(); - - double getRefundPercentage(); -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/XPrisonEnchantment.java b/src/main/java/me/nvus/xprison/enchants/model/XPrisonEnchantment.java deleted file mode 100644 index 06355a7..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/XPrisonEnchantment.java +++ /dev/null @@ -1,116 +0,0 @@ -package me.nvus.xprison.enchants.model; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.pickaxelevels.XPrisonPickaxeLevels; -import me.nvus.xprison.pickaxelevels.model.PickaxeLevel; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.text.TextUtils; -import lombok.Getter; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.List; -import java.util.Optional; - -@Getter -public abstract class XPrisonEnchantment implements Refundable { - - protected final XPrisonEnchants plugin; - - protected final int id; - private String rawName; - private String name; - private String nameUncolor; - private String guiName; - private String base64; - private Material material; - private List description; - private boolean enabled; - private int guiSlot; - private int maxLevel; - private long cost; - private long increaseCost; - private int requiredPickaxeLevel; - private boolean messagesEnabled; - private boolean refundEnabled; - private int refundGuiSlot; - private double refundPercentage; - - public XPrisonEnchantment(XPrisonEnchants plugin, int id) { - this.plugin = plugin; - this.id = id; - this.reloadDefaultAttributes(); - this.reload(); - } - - private void reloadDefaultAttributes() { - this.rawName = this.plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".RawName"); - this.name = TextUtils.applyColor(this.plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Name")); - this.nameUncolor = this.name.replaceAll("§.", ""); - this.guiName = TextUtils.applyColor(this.plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".GuiName")); - this.material = CompMaterial.fromString(this.plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Material")).toMaterial(); - this.description = TextUtils.applyColor(this.plugin.getEnchantsConfig().getYamlConfig().getStringList("enchants." + id + ".Description")); - this.enabled = this.plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Enabled"); - this.guiSlot = this.plugin.getEnchantsConfig().getYamlConfig().getInt("enchants." + id + ".InGuiSlot"); - this.maxLevel = this.plugin.getEnchantsConfig().getYamlConfig().getInt("enchants." + id + ".Max"); - this.cost = this.plugin.getEnchantsConfig().getYamlConfig().getLong("enchants." + id + ".Cost"); - this.increaseCost = this.plugin.getEnchantsConfig().getYamlConfig().getLong("enchants." + id + ".Increase-Cost-by"); - this.requiredPickaxeLevel = this.plugin.getEnchantsConfig().getYamlConfig().getInt("enchants." + id + ".Pickaxe-Level-Required"); - this.messagesEnabled = this.plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Messages-Enabled", true); - this.base64 = this.plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Base64", null); - this.refundEnabled = this.plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + this.id + ".Refund.Enabled", true); - this.refundGuiSlot = this.plugin.getEnchantsConfig().getYamlConfig().getInt("enchants." + this.id + ".Refund.InGuiSlot"); - this.refundPercentage = this.plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + this.id + ".Refund.Percentage", 100.0d); - } - - public abstract String getAuthor(); - - public abstract void onEquip(Player p, ItemStack pickAxe, int level); - - public abstract void onUnequip(Player p, ItemStack pickAxe, int level); - - public abstract void onBlockBreak(BlockBreakEvent e, int enchantLevel); - - public abstract double getChanceToTrigger(int enchantLevel); - - public void reload() { - this.reloadDefaultAttributes(); - } - - public long getCostOfLevel(int level) { - return (this.cost + (this.increaseCost * (level - 1))); - } - - public long getRefundForLevel(int level) { - return (long) (this.getCostOfLevel(level) * (this.getRefundPercentage() / 100.0)); - } - - @Override - public boolean isRefundEnabled() { - return refundEnabled; - } - - @Override - public double getRefundPercentage() { - return refundPercentage; - } - - @Override - public int getRefundGuiSlot() { - return refundGuiSlot; - } - - public int getMaxLevel() { - return this.maxLevel == -1 ? Integer.MAX_VALUE : this.maxLevel; - } - - public boolean canBeBought(ItemStack pickAxe) { - if (!this.plugin.getCore().isModuleEnabled(XPrisonPickaxeLevels.MODULE_NAME)) { - return true; - } - Optional pickaxeLevelOptional = this.plugin.getCore().getPickaxeLevels().getApi().getPickaxeLevel(pickAxe); - return pickaxeLevelOptional.map(level -> level.getLevel() >= this.requiredPickaxeLevel).orElse(true); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/AutoSellEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/AutoSellEnchant.java deleted file mode 100644 index f1293df..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/AutoSellEnchant.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.autosell.XPrisonAutoSell; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.utils.misc.RegionUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class AutoSellEnchant extends XPrisonEnchantment { - - private double chance; - - public AutoSellEnchant(XPrisonEnchants instance) { - super(instance, 19); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - if (!this.plugin.getCore().isModuleEnabled(XPrisonAutoSell.MODULE_NAME)) { - return; - } - - double chance = getChanceToTrigger(enchantLevel); - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - this.plugin.getCore().getAutoSell().getManager().sellAll(e.getPlayer(), RegionUtils.getRegionWithHighestPriority(e.getPlayer().getLocation())); - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/BackpackAutoSellEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/BackpackAutoSellEnchant.java deleted file mode 100644 index 642d771..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/BackpackAutoSellEnchant.java +++ /dev/null @@ -1,69 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import dev.drawethree.ultrabackpacks.api.UltraBackpacksAPI; -import dev.drawethree.ultrabackpacks.api.exception.BackpackNotFoundException; -import me.nvus.xprison.XPrison; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class BackpackAutoSellEnchant extends XPrisonEnchantment { - - private double chance; - - public BackpackAutoSellEnchant(XPrisonEnchants instance) { - super(instance, 19); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - if (!XPrison.getInstance().isUltraBackpacksEnabled()) { - return; - } - - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - try { - UltraBackpacksAPI.sellBackpack(e.getPlayer(), true); - } catch (BackpackNotFoundException ignored) { - this.plugin.getCore().debug("BackpackAutoSellEnchant::onBlockBreak > Player " + e.getPlayer().getName() + " does not have backpack.", this.plugin); - } - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return this.chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/BlessingEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/BlessingEnchant.java deleted file mode 100644 index eb09602..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/BlessingEnchant.java +++ /dev/null @@ -1,92 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.tokens.XPrisonTokens; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import net.objecthunter.exp4j.Expression; -import net.objecthunter.exp4j.ExpressionBuilder; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class BlessingEnchant extends XPrisonEnchantment { - - private double chance; - private String amountToGiveExpression; - - public BlessingEnchant(XPrisonEnchants instance) { - super(instance, 13); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - if (!this.plugin.getCore().isModuleEnabled(XPrisonTokens.MODULE_NAME)) { - return; - } - - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - long amount = (long) createExpression(enchantLevel).evaluate(); - - for (Player p : Players.all()) { - plugin.getCore().getTokens().getTokensManager().giveTokens(p, amount, null, ReceiveCause.MINING_OTHERS); - - if (!this.isMessagesEnabled()) { - continue; - } - - if (p.equals(e.getPlayer())) { - PlayerUtils.sendMessage(p, plugin.getEnchantsConfig().getMessage("blessing_your").replace("%amount%", String.format("%,d", amount))); - } else { - PlayerUtils.sendMessage(p, plugin.getEnchantsConfig().getMessage("blessing_other").replace("%amount%", String.format("%,d", amount)).replace("%player%", e.getPlayer().getName())); - } - } - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - private Expression createExpression(int level) { - return new ExpressionBuilder(this.amountToGiveExpression) - .variables("level") - .build() - .setVariable("level", level); - } - -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/BlockBoosterEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/BlockBoosterEnchant.java deleted file mode 100644 index 9250feb..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/BlockBoosterEnchant.java +++ /dev/null @@ -1,127 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.tokens.api.events.XPrisonBlockBreakEvent; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.time.Time; -import org.bukkit.ChatColor; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.TimeUnit; - -public final class BlockBoosterEnchant extends XPrisonEnchantment { - - private static final Map BOOSTED_PLAYERS = new HashMap<>(); - private double chance; - - public BlockBoosterEnchant(XPrisonEnchants instance) { - super(instance, 17); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - - Events.subscribe(XPrisonBlockBreakEvent.class) - .handler(e -> { - if (BOOSTED_PLAYERS.containsKey(e.getPlayer().getUniqueId())) { - List blocks = new ArrayList<>(); - for (Block b : e.getBlocks()) { - blocks.add(b); - blocks.add(b); - } - e.setBlocks(blocks); - } - }).bindWith(instance.getCore()); - } - - public static boolean hasBlockBoosterRunning(Player p) { - return BOOSTED_PLAYERS.containsKey(p.getUniqueId()); - } - - public static String getTimeLeft(Player p) { - - if (!BOOSTED_PLAYERS.containsKey(p.getUniqueId())) { - return ""; - } - - long endTime = BOOSTED_PLAYERS.get(p.getUniqueId()); - - if (System.currentTimeMillis() > endTime) { - return ""; - } - - - long timeLeft = endTime - System.currentTimeMillis(); - - long days = timeLeft / (24 * 60 * 60 * 1000); - timeLeft -= days * (24 * 60 * 60 * 1000); - - long hours = timeLeft / (60 * 60 * 1000); - timeLeft -= hours * (60 * 60 * 1000); - - long minutes = timeLeft / (60 * 1000); - timeLeft -= minutes * (60 * 1000); - - long seconds = timeLeft / (1000); - - timeLeft -= seconds * 1000; - - return ChatColor.GRAY + "(" + ChatColor.WHITE + days + "d " + hours + "h " + minutes + "m " + seconds + "s" + ChatColor.GRAY + ")"; - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - if (hasBlockBoosterRunning(e.getPlayer())) { - return; - } - - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - PlayerUtils.sendMessage(e.getPlayer(), this.plugin.getEnchantsConfig().getMessage("block_booster_on")); - - BOOSTED_PLAYERS.put(e.getPlayer().getUniqueId(), Time.nowMillis() + TimeUnit.MINUTES.toMillis(1)); - - Schedulers.sync().runLater(() -> { - if (e.getPlayer().isOnline()) { - PlayerUtils.sendMessage(e.getPlayer(), this.plugin.getEnchantsConfig().getMessage("block_booster_off")); - } - BOOSTED_PLAYERS.remove(e.getPlayer().getUniqueId()); - }, 5, TimeUnit.MINUTES); - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/CharityEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/CharityEnchant.java deleted file mode 100644 index d1f4e8d..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/CharityEnchant.java +++ /dev/null @@ -1,91 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.tokens.XPrisonTokens; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import net.objecthunter.exp4j.Expression; -import net.objecthunter.exp4j.ExpressionBuilder; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class CharityEnchant extends XPrisonEnchantment { - - private double chance; - private String amountToGiveExpression; - - public CharityEnchant(XPrisonEnchants instance) { - super(instance, 11); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - if (!this.plugin.getCore().isModuleEnabled(XPrisonTokens.MODULE_NAME)) { - return; - } - - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - long amount = (long) createExpression(enchantLevel).evaluate(); - - for (Player p : Players.all()) { - plugin.getCore().getEconomy().depositPlayer(p, amount); - - if (!this.isMessagesEnabled()) { - continue; - } - - if (p.equals(e.getPlayer())) { - PlayerUtils.sendMessage(p, plugin.getEnchantsConfig().getMessage("charity_your").replace("%amount%", String.format("%,d", amount))); - } else { - PlayerUtils.sendMessage(p, plugin.getEnchantsConfig().getMessage("charity_other").replace("%amount%", String.format("%,d", amount)).replace("%player%", e.getPlayer().getName())); - } - } - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - private Expression createExpression(int level) { - return new ExpressionBuilder(this.amountToGiveExpression) - .variables("level") - .build() - .setVariable("level", level); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/EfficiencyEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/EfficiencyEnchant.java deleted file mode 100644 index 488cc83..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/EfficiencyEnchant.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -public final class EfficiencyEnchant extends XPrisonEnchantment { - public EfficiencyEnchant(XPrisonEnchants instance) { - super(instance, 1); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - ItemMeta meta = pickAxe.getItemMeta(); - meta.addEnchant(Enchantment.DIG_SPEED, level, true); - pickAxe.setItemMeta(meta); - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return 100.0; - } - - @Override - public void reload() { - super.reload(); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/ExplosiveEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/ExplosiveEnchant.java deleted file mode 100644 index 48ff832..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/ExplosiveEnchant.java +++ /dev/null @@ -1,209 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import dev.drawethree.ultrabackpacks.api.UltraBackpacksAPI; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.api.events.ExplosionTriggerEvent; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.utils.EnchantUtils; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.multipliers.enums.MultiplierType; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.block.CuboidExplosionBlockProvider; -import me.nvus.xprison.utils.block.ExplosionBlockProvider; -import me.nvus.xprison.utils.block.SpheroidExplosionBlockProvider; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.misc.RegionUtils; -import me.lucko.helper.Events; -import me.lucko.helper.time.Time; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.codemc.worldguardwrapper.flag.WrappedState; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; - -public final class ExplosiveEnchant extends XPrisonEnchantment { - - private double chance; - private boolean countBlocksBroken; - private boolean soundsEnabled; - private boolean useEvents; - private ExplosionBlockProvider blockProvider; - - public ExplosiveEnchant(XPrisonEnchants instance) { - super(instance, 9); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.countBlocksBroken = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Count-Blocks-Broken"); - this.soundsEnabled = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Sounds"); - this.useEvents = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Use-Events"); - this.blockProvider = this.loadBlockProvider(); - } - - private ExplosionBlockProvider loadBlockProvider() { - String explosionType = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Explosion-Type", "CUBE"); - - if ("CUBE".equalsIgnoreCase(explosionType)) { - return CuboidExplosionBlockProvider.instance(); - } else if ("SPHERE".equalsIgnoreCase(explosionType)) { - return SpheroidExplosionBlockProvider.instance(); - } else { - return CuboidExplosionBlockProvider.instance(); - } - } - - @Override - public String getAuthor() { - return "Drawethree"; - } - - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - long timeStart = Time.nowMillis(); - final Player p = e.getPlayer(); - final Block b = e.getBlock(); - - IWrappedRegion region = RegionUtils.getRegionWithHighestPriorityAndFlag(b.getLocation(), Constants.ENCHANTS_WG_FLAG_NAME, WrappedState.ALLOW); - - if (region == null) { - return; - } - - this.plugin.getCore().debug("ExplosiveEnchant::onBlockBreak >> WG Region used: " + region.getId(), this.plugin); - int radius = this.calculateRadius(enchantLevel); - - List blocksAffected = this.blockProvider.provide(b, radius).stream().filter(block -> region.contains(block.getLocation()) && block.getType() != Material.AIR).collect(Collectors.toList()); - - ExplosionTriggerEvent event = this.callExplosionTriggerEvent(e.getPlayer(), region, e.getBlock(), blocksAffected); - - if (event.isCancelled() || event.getBlocksAffected().isEmpty()) { - this.plugin.getCore().debug("ExplosiveEnchant::onBlockBreak >> ExplosiveTriggerEvent was cancelled. (Blocks affected size: " + event.getBlocksAffected().size(), this.plugin); - return; - } - - if (this.soundsEnabled) { - b.getWorld().createExplosion(b.getLocation().getX(), b.getLocation().getY(), b.getLocation().getZ(), 0F, false, false); - } - - if (this.useEvents) { - final List ignored = this.plugin.getEnchantsListener().getIgnoredEvents(); - blocksAffected = event.getBlocksAffected().stream().filter(block -> { - final BlockBreakEvent blockEvent = new BlockBreakEvent(block, p); - ignored.add(blockEvent); - Bukkit.getPluginManager().callEvent(blockEvent); - ignored.remove(blockEvent); - return !e.isCancelled(); - }).collect(Collectors.toList()); - } else { - blocksAffected = event.getBlocksAffected(); - } - - if (!this.plugin.getCore().isUltraBackpacksEnabled()) { - handleAffectedBlocks(p, region, blocksAffected); - } else { - UltraBackpacksAPI.handleBlocksBroken(p, blocksAffected); - } - - if (!this.useEvents && this.plugin.isMinesModuleEnabled()) { - Mine mine = plugin.getCore().getMines().getApi().getMineAtLocation(e.getBlock().getLocation()); - if (mine != null) { - mine.handleBlockBreak(blocksAffected); - } - } - - if (this.countBlocksBroken) { - plugin.getEnchantsManager().addBlocksBrokenToItem(p, blocksAffected.size()); - } - - if (!this.useEvents) { - plugin.getCore().getTokens().getTokensManager().handleBlockBreak(p, blocksAffected, countBlocksBroken); - } - - long timeEnd = Time.nowMillis(); - this.plugin.getCore().debug("ExplosiveEnchant::onBlockBreak >> Took " + (timeEnd - timeStart) + " ms.", this.plugin); - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - private void handleAffectedBlocks(Player p, IWrappedRegion region, List blocksAffected) { - double totalDeposit = 0.0; - int fortuneLevel = EnchantUtils.getItemFortuneLevel(p.getItemInHand()); - boolean autoSellPlayerEnabled = this.plugin.isAutoSellModuleEnabled() && plugin.getCore().getAutoSell().getManager().hasAutoSellEnabled(p); - - for (Block block : blocksAffected) { - - int amplifier = fortuneLevel; - - if (FortuneEnchant.isBlockBlacklisted(block)) { - amplifier = 1; - } - - if (autoSellPlayerEnabled) { - totalDeposit += ((plugin.getCore().getAutoSell().getManager().getPriceForBlock(region.getId(), block) + 0.0) * amplifier); - } else { - ItemStack itemToGive = CompMaterial.fromBlock(block).toItem(amplifier); - p.getInventory().addItem(itemToGive); - } - block.setType(Material.AIR, true); - } - this.giveEconomyRewardToPlayer(p, totalDeposit); - } - - private void giveEconomyRewardToPlayer(Player p, double totalDeposit) { - - double total = this.plugin.isMultipliersModuleEnabled() ? plugin.getCore().getMultipliers().getApi().getTotalToDeposit(p, totalDeposit, MultiplierType.SELL) : totalDeposit; - - plugin.getCore().getEconomy().depositPlayer(p, total); - - if (this.plugin.isAutoSellModuleEnabled()) { - plugin.getCore().getAutoSell().getManager().addToCurrentEarnings(p, total); - } - } - - private int calculateRadius(int enchantLevel) { - int threshold = this.getMaxLevel() / 3; - return enchantLevel <= threshold ? 3 : enchantLevel <= threshold * 2 ? 4 : 5; - } - - private ExplosionTriggerEvent callExplosionTriggerEvent(Player p, IWrappedRegion mineRegion, Block originBlock, List blocks) { - ExplosionTriggerEvent event = new ExplosionTriggerEvent(p, mineRegion, originBlock, blocks); - Events.callSync(event); - this.plugin.getCore().debug("ExplosiveEnchant::callExplosiveTriggerEvent >> ExplosiveTriggerEvent called.", this.plugin); - return event; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.countBlocksBroken = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Count-Blocks-Broken"); - this.soundsEnabled = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Sounds"); - this.useEvents = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Use-Events"); - this.blockProvider = this.loadBlockProvider(); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/FlyEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/FlyEnchant.java deleted file mode 100644 index 106c23d..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/FlyEnchant.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -public final class FlyEnchant extends XPrisonEnchantment { - - - - public FlyEnchant(XPrisonEnchants instance) { - super(instance, 8); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - p.setAllowFlight(true); - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - p.setAllowFlight(false); - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return 100.0; - } - - @Override - public void reload() { - super.reload(); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/FortuneEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/FortuneEnchant.java deleted file mode 100644 index 6fa4925..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/FortuneEnchant.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.utils.compat.CompMaterial; -import org.bukkit.block.Block; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -public final class FortuneEnchant extends XPrisonEnchantment { - - private static List blackListedBlocks; - - public FortuneEnchant(XPrisonEnchants instance) { - super(instance, 3); - blackListedBlocks = plugin.getEnchantsConfig().getYamlConfig().getStringList("enchants." + id + ".Blacklist").stream().map(CompMaterial::fromString).filter(Objects::nonNull).collect(Collectors.toList()); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - ItemMeta meta = pickAxe.getItemMeta(); - meta.removeEnchant(Enchantment.LOOT_BONUS_BLOCKS); - pickAxe.setItemMeta(meta); - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return 100.0; - } - - @Override - public void reload() { - super.reload(); - blackListedBlocks = plugin.getEnchantsConfig().getYamlConfig().getStringList("enchants." + id + ".Blacklist").stream().map(CompMaterial::fromString).filter(Objects::nonNull).collect(Collectors.toList()); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } - - public static boolean isBlockBlacklisted(Block block) { - CompMaterial blockMaterial = CompMaterial.fromBlock(block); - return blackListedBlocks.contains(blockMaterial); - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/GangValueFinderEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/GangValueFinderEnchant.java deleted file mode 100644 index 09b1d49..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/GangValueFinderEnchant.java +++ /dev/null @@ -1,77 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.gangs.XPrisonGangs; -import net.objecthunter.exp4j.Expression; -import net.objecthunter.exp4j.ExpressionBuilder; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class GangValueFinderEnchant extends XPrisonEnchantment { - - private double chance; - private String amountToGiveExpression; - - - public GangValueFinderEnchant(XPrisonEnchants instance) { - super(instance, 23); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - if (!this.plugin.getCore().isModuleEnabled(XPrisonGangs.MODULE_NAME)) { - return; - } - - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - int amount = (int) createExpression(enchantLevel).evaluate(); - plugin.getCore().getGangs().getGangsManager().getPlayerGang(e.getPlayer()).ifPresent(gang -> gang.setValue(gang.getValue() + amount)); - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - } - - private Expression createExpression(int level) { - return new ExpressionBuilder(this.amountToGiveExpression) - .variables("level") - .build() - .setVariable("level", level); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/GemFinderEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/GemFinderEnchant.java deleted file mode 100644 index f27add0..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/GemFinderEnchant.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.gems.XPrisonGems; -import net.objecthunter.exp4j.Expression; -import net.objecthunter.exp4j.ExpressionBuilder; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class GemFinderEnchant extends XPrisonEnchantment { - - private double chance; - private String amountToGiveExpression; - - public GemFinderEnchant(XPrisonEnchants instance) { - super(instance, 22); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - if (!this.plugin.getCore().isModuleEnabled(XPrisonGems.MODULE_NAME)) { - return; - } - - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - long amount = (long) createExpression(enchantLevel).evaluate(); - plugin.getCore().getGems().getGemsManager().giveGems(e.getPlayer(), amount, null, ReceiveCause.MINING); - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - } - - private Expression createExpression(int level) { - return new ExpressionBuilder(this.amountToGiveExpression) - .variables("level") - .build() - .setVariable("level", level); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/HasteEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/HasteEnchant.java deleted file mode 100644 index 8512dc6..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/HasteEnchant.java +++ /dev/null @@ -1,50 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -public final class HasteEnchant extends XPrisonEnchantment { - - public HasteEnchant(XPrisonEnchants instance) { - super(instance, 4); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - if (level == 0) { - this.onUnequip(p, pickAxe, level); - return; - } - p.addPotionEffect(new PotionEffect(PotionEffectType.FAST_DIGGING, Integer.MAX_VALUE, level - 1, true, true), true); - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - p.removePotionEffect(PotionEffectType.FAST_DIGGING); - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return 100.0; - } - - @Override - public void reload() { - super.reload(); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/JumpBoostEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/JumpBoostEnchant.java deleted file mode 100644 index 37ee020..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/JumpBoostEnchant.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -public final class JumpBoostEnchant extends XPrisonEnchantment { - public JumpBoostEnchant(XPrisonEnchants instance) { - super(instance, 6); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - if (level == 0) { - this.onUnequip(p, pickAxe, level); - return; - } - p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, level - 1, true, true), true); - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - p.removePotionEffect(PotionEffectType.JUMP); - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return 100.0; - } - - @Override - public void reload() { - super.reload(); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/KeyFinderEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/KeyFinderEnchant.java deleted file mode 100644 index 0eaa775..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/KeyFinderEnchant.java +++ /dev/null @@ -1,67 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -public final class KeyFinderEnchant extends XPrisonEnchantment { - - private double chance; - private List commandsToExecute; - - public KeyFinderEnchant(XPrisonEnchants instance) { - super(instance, 15); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.commandsToExecute = plugin.getEnchantsConfig().getYamlConfig().getStringList("enchants." + id + ".Commands"); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - String randomCmd = this.getRandomCommandToExecute(); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), randomCmd.replace("%player%", e.getPlayer().getName())); - } - - - private String getRandomCommandToExecute() { - return this.commandsToExecute.get(ThreadLocalRandom.current().nextInt(commandsToExecute.size())); - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return this.chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.commandsToExecute = plugin.getEnchantsConfig().getYamlConfig().getStringList("enchants." + id + ".Commands"); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/KeyallsEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/KeyallsEnchant.java deleted file mode 100644 index 2ce6d89..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/KeyallsEnchant.java +++ /dev/null @@ -1,66 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -public final class KeyallsEnchant extends XPrisonEnchantment { - - private double chance; - private List commandsToExecute; - - public KeyallsEnchant(XPrisonEnchants instance) { - super(instance, 18); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.commandsToExecute = plugin.getEnchantsConfig().getYamlConfig().getStringList("enchants." + id + ".Commands"); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - String randomCmd = getRandomCommandToExecute(); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), randomCmd.replace("%player%", e.getPlayer().getName())); - } - - private String getRandomCommandToExecute() { - return this.commandsToExecute.get(ThreadLocalRandom.current().nextInt(commandsToExecute.size())); - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.commandsToExecute = plugin.getEnchantsConfig().getYamlConfig().getStringList("enchants." + id + ".Commands"); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/LayerEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/LayerEnchant.java deleted file mode 100644 index 1fdd035..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/LayerEnchant.java +++ /dev/null @@ -1,193 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import dev.drawethree.ultrabackpacks.api.UltraBackpacksAPI; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.api.events.LayerTriggerEvent; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.utils.EnchantUtils; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.multipliers.enums.MultiplierType; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.misc.RegionUtils; -import me.lucko.helper.Events; -import me.lucko.helper.time.Time; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.codemc.worldguardwrapper.flag.WrappedState; -import org.codemc.worldguardwrapper.region.IWrappedRegion; -import org.codemc.worldguardwrapper.selection.ICuboidSelection; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; - -public final class LayerEnchant extends XPrisonEnchantment { - - private double chance; - private boolean countBlocksBroken; - private boolean useEvents; - - public LayerEnchant(XPrisonEnchants instance) { - super(instance, 10); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.countBlocksBroken = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Count-Blocks-Broken"); - this.useEvents = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Use-Events"); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - long startTime = Time.nowMillis(); - final Player p = e.getPlayer(); - final Block b = e.getBlock(); - - IWrappedRegion region = RegionUtils.getRegionWithHighestPriorityAndFlag(b.getLocation(), Constants.ENCHANTS_WG_FLAG_NAME, WrappedState.ALLOW); - - if (region == null) { - return; - } - - this.plugin.getCore().debug("LayerEnchant::onBlockBreak >> WG Region used: " + region.getId(), this.plugin); - List blocksAffected = this.getAffectedBlocks(b, region); - - LayerTriggerEvent event = this.callLayerTriggerEvent(e.getPlayer(), region, e.getBlock(), blocksAffected); - - if (event.isCancelled() || event.getBlocksAffected().isEmpty()) { - this.plugin.getCore().debug("LayerEnchant::onBlockBreak >> LayerTriggerEvent was cancelled. (Blocks affected size: " + event.getBlocksAffected().size(), this.plugin); - return; - } - - if (this.useEvents) { - final List ignored = this.plugin.getEnchantsListener().getIgnoredEvents(); - blocksAffected = event.getBlocksAffected().stream().filter(block -> { - final BlockBreakEvent blockEvent = new BlockBreakEvent(block, p); - ignored.add(blockEvent); - Bukkit.getPluginManager().callEvent(blockEvent); - ignored.remove(blockEvent); - return !e.isCancelled(); - }).collect(Collectors.toList()); - } else { - blocksAffected = event.getBlocksAffected(); - } - - if (!this.plugin.getCore().isUltraBackpacksEnabled()) { - handleAffectedBlocks(p, region, blocksAffected); - } else { - UltraBackpacksAPI.handleBlocksBroken(p, blocksAffected); - } - - if (!this.useEvents && this.plugin.isMinesModuleEnabled()) { - Mine mine = plugin.getCore().getMines().getApi().getMineAtLocation(e.getBlock().getLocation()); - if (mine != null) { - mine.handleBlockBreak(blocksAffected); - } - } - - if (this.countBlocksBroken) { - plugin.getEnchantsManager().addBlocksBrokenToItem(p, blocksAffected.size()); - } - - if (!this.useEvents) { - plugin.getCore().getTokens().getTokensManager().handleBlockBreak(p, blocksAffected, countBlocksBroken); - } - - long timeEnd = Time.nowMillis(); - this.plugin.getCore().debug("LayerEnchant::onBlockBreak >> Took " + (timeEnd - startTime) + " ms.", this.plugin); - } - - private List getAffectedBlocks(Block startBlock, IWrappedRegion region) { - List blocksAffected = new ArrayList<>(); - ICuboidSelection selection = (ICuboidSelection) region.getSelection(); - for (int x = selection.getMinimumPoint().getBlockX(); x <= selection.getMaximumPoint().getBlockX(); x++) { - for (int z = selection.getMinimumPoint().getBlockZ(); z <= selection.getMaximumPoint().getBlockZ(); z++) { - Block b1 = startBlock.getWorld().getBlockAt(x, startBlock.getY(), z); - if (b1.getType() == Material.AIR) { - continue; - } - blocksAffected.add(b1); - } - } - return blocksAffected; - } - - private void handleAffectedBlocks(Player p, IWrappedRegion region, List blocksAffected) { - double totalDeposit = 0.0; - int fortuneLevel = EnchantUtils.getItemFortuneLevel(p.getItemInHand()); - boolean autoSellPlayerEnabled = this.plugin.isAutoSellModuleEnabled() && plugin.getCore().getAutoSell().getManager().hasAutoSellEnabled(p); - - for (Block block : blocksAffected) { - - int amplifier = fortuneLevel; - if (FortuneEnchant.isBlockBlacklisted(block)) { - amplifier = 1; - } - - if (autoSellPlayerEnabled) { - totalDeposit += ((plugin.getCore().getAutoSell().getManager().getPriceForBlock(region.getId(), block) + 0.0) * amplifier); - } else { - ItemStack itemToGive = CompMaterial.fromBlock(block).toItem(amplifier); - p.getInventory().addItem(itemToGive); - } - block.setType(Material.AIR, true); - } - this.giveEconomyRewardToPlayer(p, totalDeposit); - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - private void giveEconomyRewardToPlayer(Player p, double totalDeposit) { - double total = this.plugin.isMultipliersModuleEnabled() ? plugin.getCore().getMultipliers().getApi().getTotalToDeposit(p, totalDeposit, MultiplierType.SELL) : totalDeposit; - - plugin.getCore().getEconomy().depositPlayer(p, total); - - if (plugin.isAutoSellModuleEnabled()) { - plugin.getCore().getAutoSell().getManager().addToCurrentEarnings(p, total); - } - } - - private LayerTriggerEvent callLayerTriggerEvent(Player player, IWrappedRegion region, Block originBlock, List blocksAffected) { - LayerTriggerEvent event = new LayerTriggerEvent(player, region, originBlock, blocksAffected); - Events.callSync(event); - this.plugin.getCore().debug("LayerEnchant::callLayerTriggerEvent >> LayerTriggerEvent called.", this.plugin); - return event; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.countBlocksBroken = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Count-Blocks-Broken"); - this.useEvents = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Use-Events"); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } - - -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/NightVisionEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/NightVisionEnchant.java deleted file mode 100644 index 6065260..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/NightVisionEnchant.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -public final class NightVisionEnchant extends XPrisonEnchantment { - public NightVisionEnchant(XPrisonEnchants instance) { - super(instance, 7); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - if (level == 0) { - this.onUnequip(p, pickAxe, level); - return; - } - p.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, level - 1, true, true), true); - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - p.removePotionEffect(PotionEffectType.NIGHT_VISION); - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return 100.0; - } - - @Override - public void reload() { - super.reload(); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/NukeEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/NukeEnchant.java deleted file mode 100644 index 92ec60f..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/NukeEnchant.java +++ /dev/null @@ -1,213 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import dev.drawethree.ultrabackpacks.api.UltraBackpacksAPI; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.api.events.NukeTriggerEvent; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.utils.EnchantUtils; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.multipliers.enums.MultiplierType; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.misc.MathUtils; -import me.nvus.xprison.utils.misc.RegionUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.nvus.xprison.utils.text.TextUtils; -import me.lucko.helper.Events; -import me.lucko.helper.time.Time; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.codemc.worldguardwrapper.flag.WrappedState; -import org.codemc.worldguardwrapper.region.IWrappedRegion; -import org.codemc.worldguardwrapper.selection.ICuboidSelection; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; - -public final class NukeEnchant extends XPrisonEnchantment { - - private double chance; - private boolean countBlocksBroken; - private boolean removeBlocks; - private boolean useEvents; - private String message; - - public NukeEnchant(XPrisonEnchants instance) { - super(instance, 21); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.countBlocksBroken = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Count-Blocks-Broken"); - this.removeBlocks = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Remove-Blocks"); - this.useEvents = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Use-Events"); - this.message = TextUtils.applyColor(plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Message")); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - long startTime = Time.nowMillis(); - final Player p = e.getPlayer(); - final Block b = e.getBlock(); - - IWrappedRegion region = RegionUtils.getRegionWithHighestPriorityAndFlag(b.getLocation(), Constants.ENCHANTS_WG_FLAG_NAME, WrappedState.ALLOW); - - if (region == null) { - return; - } - - this.plugin.getCore().debug("NukeEnchant::onBlockBreak >> WG Region used: " + region.getId(), this.plugin); - List blocksAffected = this.getAffectedBlocks(b, region); - - NukeTriggerEvent event = this.callNukeTriggerEvent(e.getPlayer(), region, e.getBlock(), blocksAffected); - - if (event.isCancelled() || event.getBlocksAffected().isEmpty()) { - this.plugin.getCore().debug("NukeEnchant::onBlockBreak >> NukeTriggerEvent was cancelled. (Blocks affected size: " + event.getBlocksAffected().size(), this.plugin); - return; - } - - if (this.useEvents) { - final List ignored = this.plugin.getEnchantsListener().getIgnoredEvents(); - blocksAffected = event.getBlocksAffected().stream().filter(block -> { - final BlockBreakEvent blockEvent = new BlockBreakEvent(block, p); - ignored.add(blockEvent); - Bukkit.getPluginManager().callEvent(blockEvent); - ignored.remove(blockEvent); - return !e.isCancelled(); - }).collect(Collectors.toList()); - } else { - blocksAffected = event.getBlocksAffected(); - } - - if (!this.plugin.getCore().isUltraBackpacksEnabled()) { - handleAffectedBlocks(p, region, blocksAffected); - } else { - UltraBackpacksAPI.handleBlocksBroken(p, blocksAffected); - } - - if (!this.useEvents && this.plugin.isMinesModuleEnabled() && removeBlocks) { - Mine mine = plugin.getCore().getMines().getApi().getMineAtLocation(e.getBlock().getLocation()); - - if (mine != null) { - mine.handleBlockBreak(blocksAffected); - } - } - - if (this.countBlocksBroken) { - plugin.getEnchantsManager().addBlocksBrokenToItem(p, blocksAffected.size()); - } - - if (!this.useEvents) { - plugin.getCore().getTokens().getTokensManager().handleBlockBreak(p, blocksAffected, countBlocksBroken); - } - - long timeEnd = Time.nowMillis(); - this.plugin.getCore().debug("NukeEnchant::onBlockBreak >> Took " + (timeEnd - startTime) + " ms.", this.plugin); - } - - private void handleAffectedBlocks(Player p, IWrappedRegion region, List blocksAffected) { - double totalDeposit = 0.0; - int fortuneLevel = EnchantUtils.getItemFortuneLevel(p.getItemInHand()); - boolean autoSellPlayerEnabled = this.plugin.isAutoSellModuleEnabled() && plugin.getCore().getAutoSell().getManager().hasAutoSellEnabled(p); - - for (Block block : blocksAffected) { - - int amplifier = fortuneLevel; - - if (FortuneEnchant.isBlockBlacklisted(block)) { - amplifier = 1; - } - - if (autoSellPlayerEnabled) { - totalDeposit += ((plugin.getCore().getAutoSell().getManager().getPriceForBlock(region.getId(), block) + 0.0) * amplifier); - } else { - ItemStack itemToGive = CompMaterial.fromBlock(block).toItem(amplifier); - p.getInventory().addItem(itemToGive); - } - - if (this.removeBlocks) { - block.setType(Material.AIR, true); - } - - } - this.giveEconomyRewardsToPlayer(p, totalDeposit); - } - - private List getAffectedBlocks(Block b, IWrappedRegion region) { - List blocksAffected = new ArrayList<>(); - ICuboidSelection selection = (ICuboidSelection) region.getSelection(); - for (int x = selection.getMinimumPoint().getBlockX(); x <= selection.getMaximumPoint().getBlockX(); x++) { - for (int z = selection.getMinimumPoint().getBlockZ(); z <= selection.getMaximumPoint().getBlockZ(); z++) { - for (int y = selection.getMinimumPoint().getBlockY(); y <= selection.getMaximumPoint().getBlockY(); y++) { - Block b1 = b.getWorld().getBlockAt(x, y, z); - if (b1.getType() == Material.AIR) { - continue; - } - blocksAffected.add(b1); - } - } - } - return blocksAffected; - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - private void giveEconomyRewardsToPlayer(Player p, double totalDeposit) { - double total = this.plugin.isMultipliersModuleEnabled() ? plugin.getCore().getMultipliers().getApi().getTotalToDeposit(p, totalDeposit, MultiplierType.SELL) : totalDeposit; - - plugin.getCore().getEconomy().depositPlayer(p, total); - - if (plugin.isAutoSellModuleEnabled()) { - plugin.getCore().getAutoSell().getManager().addToCurrentEarnings(p, total); - } - - if (message != null || !message.isEmpty()) { - PlayerUtils.sendMessage(p,message.replace("%money%", MathUtils.formatNumber(total))); - } - } - - private NukeTriggerEvent callNukeTriggerEvent(Player p, IWrappedRegion region, Block startBlock, List affectedBlocks) { - NukeTriggerEvent event = new NukeTriggerEvent(p, region, startBlock, affectedBlocks); - Events.callSync(event); - this.plugin.getCore().debug("NukeEnchant::callNukeTriggerEvent >> NukeTriggerEvent called.", this.plugin); - return event; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.countBlocksBroken = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Count-Blocks-Broken"); - this.removeBlocks = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Remove-Blocks"); - this.useEvents = plugin.getEnchantsConfig().getYamlConfig().getBoolean("enchants." + id + ".Use-Events"); - this.message = TextUtils.applyColor(plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Message")); - - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/PrestigeFinderEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/PrestigeFinderEnchant.java deleted file mode 100644 index 1334757..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/PrestigeFinderEnchant.java +++ /dev/null @@ -1,71 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import net.objecthunter.exp4j.Expression; -import net.objecthunter.exp4j.ExpressionBuilder; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class PrestigeFinderEnchant extends XPrisonEnchantment { - - private double chance; - private String commandToExecute; - private String amountToGiveExpression; - - public PrestigeFinderEnchant(XPrisonEnchants instance) { - super(instance, 16); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.commandToExecute = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Command"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - double chance = getChanceToTrigger(enchantLevel); - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - int levels = (int) createExpression(enchantLevel).evaluate(); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), commandToExecute.replace("%player%", e.getPlayer().getName()).replace("%amount%", String.valueOf(levels))); - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.commandToExecute = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Command"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - private Expression createExpression(int level) { - return new ExpressionBuilder(this.amountToGiveExpression) - .variables("level") - .build() - .setVariable("level", level); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/SalaryEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/SalaryEnchant.java deleted file mode 100644 index 7adef4d..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/SalaryEnchant.java +++ /dev/null @@ -1,75 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import net.objecthunter.exp4j.Expression; -import net.objecthunter.exp4j.ExpressionBuilder; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class SalaryEnchant extends XPrisonEnchantment { - - private double chance; - private String amountToGiveExpression; - - public SalaryEnchant(XPrisonEnchants instance) { - super(instance, 12); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - double randAmount = createExpression(enchantLevel).evaluate(); - - plugin.getCore().getEconomy().depositPlayer(e.getPlayer(), randAmount); - - if (this.plugin.isAutoSellModuleEnabled()) { - plugin.getCore().getAutoSell().getManager().addToCurrentEarnings(e.getPlayer(), randAmount); - } - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return this.chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - private Expression createExpression(int level) { - return new ExpressionBuilder(this.amountToGiveExpression) - .variables("level") - .build() - .setVariable("level", level); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/SpeedEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/SpeedEnchant.java deleted file mode 100644 index 672d467..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/SpeedEnchant.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -public final class SpeedEnchant extends XPrisonEnchantment { - public SpeedEnchant(XPrisonEnchants instance) { - super(instance, 5); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - if (level == 0) { - this.onUnequip(p, pickAxe, level); - return; - } - p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, level - 1, true, true), true); - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - p.removePotionEffect(PotionEffectType.SPEED); - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return 100.0; - } - - @Override - public void reload() { - super.reload(); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/TokenatorEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/TokenatorEnchant.java deleted file mode 100644 index 37b874d..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/TokenatorEnchant.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.tokens.XPrisonTokens; -import net.objecthunter.exp4j.Expression; -import net.objecthunter.exp4j.ExpressionBuilder; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -public final class TokenatorEnchant extends XPrisonEnchantment { - - private double chance; - private String amountToGiveExpression; - - - public TokenatorEnchant(XPrisonEnchants instance) { - super(instance, 14); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - if (!this.plugin.getCore().isModuleEnabled(XPrisonTokens.MODULE_NAME)) { - return; - } - - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - long randAmount = (long) createExpression(enchantLevel).evaluate(); - plugin.getCore().getTokens().getTokensManager().giveTokens(e.getPlayer(), randAmount, null, ReceiveCause.MINING); - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.amountToGiveExpression = plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Amount-To-Give"); - } - - private Expression createExpression(int level) { - return new ExpressionBuilder(this.amountToGiveExpression) - .variables("level") - .build() - .setVariable("level", level); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/UnbreakingEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/UnbreakingEnchant.java deleted file mode 100644 index cb49ff4..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/UnbreakingEnchant.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -public final class UnbreakingEnchant extends XPrisonEnchantment { - - public UnbreakingEnchant(XPrisonEnchants instance) { - super(instance, 2); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - ItemMeta meta = pickAxe.getItemMeta(); - meta.addEnchant(Enchantment.DURABILITY, level, true); - pickAxe.setItemMeta(meta); - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return 100.0; - } - - @Override - public void reload() { - super.reload(); - } - - @Override - public String getAuthor() { - return "Drawethree"; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/model/impl/VoucherFinderEnchant.java b/src/main/java/me/nvus/xprison/enchants/model/impl/VoucherFinderEnchant.java deleted file mode 100644 index e002e30..0000000 --- a/src/main/java/me/nvus/xprison/enchants/model/impl/VoucherFinderEnchant.java +++ /dev/null @@ -1,87 +0,0 @@ -package me.nvus.xprison.enchants.model.impl; - -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import lombok.AllArgsConstructor; -import lombok.Getter; -import me.lucko.helper.random.RandomSelector; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -public final class VoucherFinderEnchant extends XPrisonEnchantment { - - private double chance; - private List commandsToExecute; - - public VoucherFinderEnchant(XPrisonEnchants instance) { - super(instance, 20); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.commandsToExecute = this.loadCommands(); - } - - @Override - public void onEquip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onUnequip(Player p, ItemStack pickAxe, int level) { - - } - - @Override - public void onBlockBreak(BlockBreakEvent e, int enchantLevel) { - double chance = getChanceToTrigger(enchantLevel); - - if (chance < ThreadLocalRandom.current().nextDouble(100)) { - return; - } - - CommandWithChance randomCmd = getRandomCommandToExecute(); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), randomCmd.getCommand().replace("%player%", e.getPlayer().getName())); - } - - private CommandWithChance getRandomCommandToExecute() { - return RandomSelector.weighted(this.commandsToExecute, CommandWithChance::getChance).pick(); - } - - @Override - public double getChanceToTrigger(int enchantLevel) { - return this.chance * enchantLevel; - } - - @Override - public void reload() { - super.reload(); - this.chance = plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Chance"); - this.commandsToExecute = this.loadCommands(); - } - - private List loadCommands() { - List returnList = new ArrayList<>(); - for (String key : this.plugin.getEnchantsConfig().getYamlConfig().getConfigurationSection("enchants." + id + ".Commands").getKeys(false)) { - String cmd = this.plugin.getEnchantsConfig().getYamlConfig().getString("enchants." + id + ".Commands." + key + ".command"); - double chance = this.plugin.getEnchantsConfig().getYamlConfig().getDouble("enchants." + id + ".Commands." + key + ".chance"); - returnList.add(new CommandWithChance(cmd, chance)); - } - return returnList; - } - - @Override - public String getAuthor() { - return "Drawethree"; - } - - @AllArgsConstructor - @Getter - private static class CommandWithChance { - private final String command; - private final double chance; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/repo/EnchantsRepository.java b/src/main/java/me/nvus/xprison/enchants/repo/EnchantsRepository.java deleted file mode 100644 index 86beede..0000000 --- a/src/main/java/me/nvus/xprison/enchants/repo/EnchantsRepository.java +++ /dev/null @@ -1,118 +0,0 @@ -package me.nvus.xprison.enchants.repo; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.model.impl.*; -import me.nvus.xprison.utils.text.TextUtils; -import org.apache.commons.lang.Validate; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -public class EnchantsRepository { - - private final XPrisonEnchants plugin; - - private final Map enchantsById; - private final Map enchantsByName; - - public EnchantsRepository(XPrisonEnchants plugin) { - this.plugin = plugin; - this.enchantsById = new HashMap<>(); - this.enchantsByName = new HashMap<>(); - } - - public Collection getAll() { - return enchantsById.values(); - } - - public XPrisonEnchantment getEnchantBy(Object object) { - if (object instanceof Integer) { - return getEnchantById((int) object); - } else { - final String s = String.valueOf(object); - try { - return getEnchantById(Integer.parseInt(s)); - } catch (NumberFormatException e) { - return getEnchantByName(s); - } - } - } - - public XPrisonEnchantment getEnchantById(int id) { - return enchantsById.get(id); - } - - public XPrisonEnchantment getEnchantByName(String name) { - return enchantsByName.get(name.toLowerCase()); - } - - public void reload() { - - enchantsById.values().forEach(XPrisonEnchantment::reload); - - XPrison.getInstance().getLogger().info(TextUtils.applyColor("&aSuccessfully reloaded all enchants.")); - } - - public void loadDefaultEnchantments() { - register(new EfficiencyEnchant(this.plugin)); - register(new UnbreakingEnchant(this.plugin)); - register(new FortuneEnchant(this.plugin)); - register(new HasteEnchant(this.plugin)); - register(new SpeedEnchant(this.plugin)); - register(new JumpBoostEnchant(this.plugin)); - register(new NightVisionEnchant(this.plugin)); - register(new FlyEnchant(this.plugin)); - register(new ExplosiveEnchant(this.plugin)); - register(new LayerEnchant(this.plugin)); - register(new CharityEnchant(this.plugin)); - register(new SalaryEnchant(this.plugin)); - register(new BlessingEnchant(this.plugin)); - register(new TokenatorEnchant(this.plugin)); - register(new KeyFinderEnchant(this.plugin)); - register(new PrestigeFinderEnchant(this.plugin)); - register(new BlockBoosterEnchant(this.plugin)); - register(new KeyallsEnchant(this.plugin)); - if (XPrison.getInstance().isUltraBackpacksEnabled()) { - register(new BackpackAutoSellEnchant(this.plugin)); - } else { - register(new AutoSellEnchant(this.plugin)); - } - register(new VoucherFinderEnchant(this.plugin)); - register(new NukeEnchant(this.plugin)); - register(new GemFinderEnchant(this.plugin)); - register(new GangValueFinderEnchant(this.plugin)); - } - - public boolean register(XPrisonEnchantment enchantment) { - - if (enchantsById.containsKey(enchantment.getId()) || enchantsByName.containsKey(enchantment.getRawName())) { - XPrison.getInstance().getLogger().warning(TextUtils.applyColor("&cUnable to register enchant " + enchantment.getName() + "&c created by " + enchantment.getAuthor() + ". That enchant is already registered.")); - return false; - } - - Validate.notNull(enchantment.getRawName()); - - enchantsById.put(enchantment.getId(), enchantment); - enchantsByName.put(enchantment.getRawName().toLowerCase(), enchantment); - - XPrison.getInstance().getLogger().info(TextUtils.applyColor("&aSuccessfully registered enchant " + enchantment.getName() + "&a created by " + enchantment.getAuthor())); - return true; - } - - public boolean unregister(XPrisonEnchantment enchantment) { - - if (!enchantsById.containsKey(enchantment.getId()) && !enchantsByName.containsKey(enchantment.getRawName())) { - XPrison.getInstance().getLogger().warning(TextUtils.applyColor("&cUnable to unregister enchant " + enchantment.getName() + "&c created by " + enchantment.getAuthor() + ". That enchant is not registered.")); - return false; - } - - enchantsById.remove(enchantment.getId()); - enchantsByName.remove(enchantment.getRawName()); - - XPrison.getInstance().getLogger().info(TextUtils.applyColor("&aSuccessfully unregistered enchant " + enchantment.getName() + "&a created by " + enchantment.getAuthor())); - return true; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/utils/EnchantUtils.java b/src/main/java/me/nvus/xprison/enchants/utils/EnchantUtils.java deleted file mode 100644 index b578091..0000000 --- a/src/main/java/me/nvus/xprison/enchants/utils/EnchantUtils.java +++ /dev/null @@ -1,50 +0,0 @@ -package me.nvus.xprison.enchants.utils; - -import com.saicone.rtag.util.ServerInstance; -import me.nvus.xprison.enchants.XPrisonEnchants; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.model.impl.FortuneEnchant; -import org.bukkit.block.Block; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; - -public final class EnchantUtils { - - private EnchantUtils() { - throw new UnsupportedOperationException("Cannot instantiate."); - } - - public static int getFortuneBlockCount(ItemStack pickaxe, Block block) { - if (FortuneEnchant.isBlockBlacklisted(block)) { - return 1; - } - return getItemFortuneLevel(pickaxe) + 1; - } - - public static int getItemFortuneLevel(ItemStack item) { - if (item == null) { - return 0; - } - XPrisonEnchantment fortuneEnchant = XPrisonEnchants.getInstance().getEnchantsRepository().getEnchantById(3); - - if (fortuneEnchant == null || !fortuneEnchant.isEnabled()) { - return 0; - } - - return XPrisonEnchants.getInstance().getEnchantsManager().getEnchantLevel(item, fortuneEnchant); - } - - public static int getDurability(ItemStack item) { - return getDurability(item, item.getItemMeta()); - } - - public static int getDurability(ItemStack item, ItemMeta meta) { - if (ServerInstance.isLegacy) { - return item.getDurability(); - } else if (meta instanceof Damageable) { - return ((Damageable) meta).getDamage(); - } - return 0; - } -} diff --git a/src/main/java/me/nvus/xprison/enchants/utils/GuiUtils.java b/src/main/java/me/nvus/xprison/enchants/utils/GuiUtils.java deleted file mode 100644 index 0075361..0000000 --- a/src/main/java/me/nvus/xprison/enchants/utils/GuiUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.nvus.xprison.enchants.utils; - -import me.nvus.xprison.enchants.model.XPrisonEnchantment; - -import java.util.ArrayList; -import java.util.List; - -public class GuiUtils { - - private GuiUtils() { - throw new UnsupportedOperationException("Cannot instantiate."); - } - - public static List translateGuiLore(XPrisonEnchantment enchantment, List guiItemLore, - int currentLevel) { - List newList = new ArrayList<>(); - for (String s : guiItemLore) { - if (s.contains("%description%")) { - newList.addAll(enchantment.getDescription()); - continue; - } - newList.add(s - .replace("%refund%", String.format("%,d", enchantment.getRefundForLevel(currentLevel))) - .replace("%cost%", String.format("%,d", enchantment.getCost() + (enchantment.getIncreaseCost() * currentLevel))) - .replace("%max_level%", enchantment.getMaxLevel() == Integer.MAX_VALUE ? "Unlimited" : String.format("%,d", enchantment.getMaxLevel())) - .replace("%chance%", String.format("%,.2f", enchantment.getChanceToTrigger(currentLevel))) - .replace("%current_level%", String.format("%,d", currentLevel)) - .replace("%pickaxe_level%", String.format("%,d", enchantment.getRequiredPickaxeLevel()))); - } - return newList; - } -} diff --git a/src/main/java/me/nvus/xprison/exception/ModuleNotEnabledException.java b/src/main/java/me/nvus/xprison/exception/ModuleNotEnabledException.java deleted file mode 100644 index 8a58b85..0000000 --- a/src/main/java/me/nvus/xprison/exception/ModuleNotEnabledException.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.nvus.xprison.support.exception; - -import me.nvus.xprison.XPrisonModule; - -public class ModuleNotEnabledException extends Exception { - - public ModuleNotEnabledException(XPrisonModule module) { - super("Module " + module.getName() + " is not enabled"); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/XPrisonGangs.java b/src/main/java/me/nvus/xprison/gangs/XPrisonGangs.java deleted file mode 100644 index 375193d..0000000 --- a/src/main/java/me/nvus/xprison/gangs/XPrisonGangs.java +++ /dev/null @@ -1,120 +0,0 @@ -package me.nvus.xprison.gangs; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.gangs.api.XPrisonGangsAPI; -import me.nvus.xprison.gangs.api.XPrisonGangsAPIImpl; -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.config.GangsConfig; -import me.nvus.xprison.gangs.listener.GangsListener; -import me.nvus.xprison.gangs.managers.GangsManager; -import me.nvus.xprison.gangs.model.GangTopByValueProvider; -import me.nvus.xprison.gangs.model.GangTopProvider; -import me.nvus.xprison.gangs.model.GangUpdateTopTask; -import me.nvus.xprison.gangs.repo.GangsRepository; -import me.nvus.xprison.gangs.repo.impl.GangsRepositoryImpl; -import me.nvus.xprison.gangs.service.GangsService; -import me.nvus.xprison.gangs.service.impl.GangsServiceImpl; -import lombok.Getter; - -public final class XPrisonGangs implements XPrisonModule { - - public static final String MODULE_NAME = "Gangs"; - - @Getter - private static XPrisonGangs instance; - - @Getter - private XPrisonGangsAPI api; - - @Getter - private GangsConfig config; - - @Getter - private GangsManager gangsManager; - - @Getter - private GangTopProvider gangTopProvider; - - @Getter - private GangUpdateTopTask gangUpdateTopTask; - - @Getter - private final XPrison core; - - @Getter - private GangsRepository gangsRepository; - - @Getter - private GangsService gangsService; - - private boolean enabled; - - public XPrisonGangs(XPrison prisonCore) { - instance = this; - this.core = prisonCore; - } - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void reload() { - this.config.reload(); - } - - @Override - public void enable() { - this.config = new GangsConfig(this); - this.config.load(); - - GangCommand gangCommand = new GangCommand(this); - gangCommand.register(); - - this.gangsRepository = new GangsRepositoryImpl(this.core.getPluginDatabase()); - this.gangsRepository.createTables(); - - this.gangsService = new GangsServiceImpl(this.gangsRepository); - - this.gangsManager = new GangsManager(this); - this.gangsManager.enable(); - - this.gangTopProvider = new GangTopByValueProvider(this.gangsManager); - - GangsListener gangsListener = new GangsListener(this); - gangsListener.register(); - - this.gangUpdateTopTask = new GangUpdateTopTask(this, this.gangTopProvider); - this.gangUpdateTopTask.start(); - - - this.api = new XPrisonGangsAPIImpl(this.gangsManager); - - this.enabled = true; - } - - - @Override - public void disable() { - this.gangsManager.disable(); - this.gangUpdateTopTask.stop(); - this.enabled = false; - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return true; - } - - @Override - public void resetPlayerData() { - this.gangsRepository.clearTableData(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/api/XPrisonGangsAPI.java b/src/main/java/me/nvus/xprison/gangs/api/XPrisonGangsAPI.java deleted file mode 100644 index ce82825..0000000 --- a/src/main/java/me/nvus/xprison/gangs/api/XPrisonGangsAPI.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.nvus.xprison.gangs.api; - -import me.nvus.xprison.gangs.model.Gang; -import org.bukkit.OfflinePlayer; - -import java.util.Collection; -import java.util.Optional; - -public interface XPrisonGangsAPI { - - /** - * Method to get Gang from player - * - * @param player OfflinePlayer - * @return Optional gang - */ - Optional getPlayerGang(OfflinePlayer player); - - /** - * Method to get Gang from name - * - * @param name name of gang - * @return Optional gang - */ - Optional getByName(String name); - - /** - * Method to get all gangs - * - * @return List of gangs - */ - Collection getAllGangs(); - - -} diff --git a/src/main/java/me/nvus/xprison/gangs/api/XPrisonGangsAPIImpl.java b/src/main/java/me/nvus/xprison/gangs/api/XPrisonGangsAPIImpl.java deleted file mode 100644 index 5778748..0000000 --- a/src/main/java/me/nvus/xprison/gangs/api/XPrisonGangsAPIImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.nvus.xprison.gangs.api; - -import me.nvus.xprison.gangs.managers.GangsManager; -import me.nvus.xprison.gangs.model.Gang; -import org.bukkit.OfflinePlayer; - -import java.util.Collection; -import java.util.Optional; - -public final class XPrisonGangsAPIImpl implements XPrisonGangsAPI { - - private final GangsManager gangsManager; - - public XPrisonGangsAPIImpl(GangsManager gangsManager) { - this.gangsManager = gangsManager; - } - - @Override - public Optional getPlayerGang(OfflinePlayer player) { - return this.gangsManager.getPlayerGang(player); - } - - @Override - public Optional getByName(String name) { - return this.gangsManager.getGangWithName(name); - } - - @Override - public Collection getAllGangs() { - return this.gangsManager.getAllGangs(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/api/events/GangCreateEvent.java b/src/main/java/me/nvus/xprison/gangs/api/events/GangCreateEvent.java deleted file mode 100644 index 90e46f4..0000000 --- a/src/main/java/me/nvus/xprison/gangs/api/events/GangCreateEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package me.nvus.xprison.gangs.api.events; - -import me.nvus.xprison.api.events.XPrisonEvent; -import me.nvus.xprison.gangs.model.Gang; -import lombok.Getter; -import org.bukkit.command.CommandSender; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class GangCreateEvent extends XPrisonEvent implements Cancellable { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - - private boolean cancelled; - - @Getter - private final CommandSender creator; - - @Getter - private final Gang gang; - - /** - * Fired when gang is created - * - * @param creator CommandSender who created the gang - * @param gang Gang - */ - public GangCreateEvent(CommandSender creator, Gang gang) { - this.creator = creator; - this.gang = gang; - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - this.cancelled = cancel; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/api/events/GangDisbandEvent.java b/src/main/java/me/nvus/xprison/gangs/api/events/GangDisbandEvent.java deleted file mode 100644 index 2f9ff84..0000000 --- a/src/main/java/me/nvus/xprison/gangs/api/events/GangDisbandEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.nvus.xprison.gangs.api.events; - -import me.nvus.xprison.api.events.XPrisonEvent; -import me.nvus.xprison.gangs.model.Gang; -import lombok.Getter; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class GangDisbandEvent extends XPrisonEvent implements Cancellable { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - @Getter - private final Gang gang; - private boolean cancelled; - - /** - * Called when gang is disbanded - * - * @param gang Gang - */ - public GangDisbandEvent(Gang gang) { - this.gang = gang; - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - this.cancelled = cancel; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/api/events/GangJoinEvent.java b/src/main/java/me/nvus/xprison/gangs/api/events/GangJoinEvent.java deleted file mode 100644 index 65d2f83..0000000 --- a/src/main/java/me/nvus/xprison/gangs/api/events/GangJoinEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.nvus.xprison.gangs.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import me.nvus.xprison.gangs.model.Gang; -import lombok.Getter; -import org.bukkit.OfflinePlayer; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class GangJoinEvent extends XPrisonPlayerEvent implements Cancellable { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - - private boolean cancelled; - - @Getter - private final OfflinePlayer player; - - @Getter - private final Gang gang; - - /** - * Called when player joins a gang - * - * @param player Player - * @param gang Gang - */ - public GangJoinEvent(OfflinePlayer player, Gang gang) { - super(player); - this.player = player; - this.gang = gang; - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - this.cancelled = cancel; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/api/events/GangLeaveEvent.java b/src/main/java/me/nvus/xprison/gangs/api/events/GangLeaveEvent.java deleted file mode 100644 index bb4f519..0000000 --- a/src/main/java/me/nvus/xprison/gangs/api/events/GangLeaveEvent.java +++ /dev/null @@ -1,58 +0,0 @@ -package me.nvus.xprison.gangs.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import me.nvus.xprison.gangs.enums.GangLeaveReason; -import me.nvus.xprison.gangs.model.Gang; -import lombok.Getter; -import org.bukkit.OfflinePlayer; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class GangLeaveEvent extends XPrisonPlayerEvent implements Cancellable { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - - private boolean cancelled; - - @Getter - private final OfflinePlayer player; - - @Getter - private final Gang gang; - - @Getter - private final GangLeaveReason leaveReason; - - /** - * Called when player leaves a gang - * - * @param player Player - * @param gang Gang - * @param leaveReason GangLeaveReason - */ - public GangLeaveEvent(OfflinePlayer player, Gang gang, GangLeaveReason leaveReason) { - super(player); - this.player = player; - this.gang = gang; - this.leaveReason = leaveReason; - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - this.cancelled = cancel; - } - - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/GangCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/GangCommand.java deleted file mode 100644 index 934ceb2..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/GangCommand.java +++ /dev/null @@ -1,117 +0,0 @@ -package me.nvus.xprison.gangs.commands; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gangs.commands.impl.*; -import me.nvus.xprison.gangs.commands.impl.admin.GangAdminSubCommand; -import me.nvus.xprison.gangs.commands.impl.value.GangValueSubCommand; -import me.nvus.xprison.gangs.gui.panel.GangPanelGUI; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.player.PlayerUtils; -import lombok.Getter; -import me.lucko.helper.Commands; -import me.lucko.helper.command.context.CommandContext; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; - -import java.util.*; - -public class GangCommand { - - @Getter - private final XPrisonGangs plugin; - private final Map subCommands; - - public GangCommand(XPrisonGangs plugin) { - this.plugin = plugin; - this.subCommands = new HashMap<>(); - } - - private void registerSubCommands() { - registerSubCommand(new GangHelpSubCommand(this)); - registerSubCommand(new GangInfoSubCommand(this)); - registerSubCommand(new GangCreateSubCommand(this)); - registerSubCommand(new GangInviteSubCommand(this)); - registerSubCommand(new GangAcceptSubCommand(this)); - registerSubCommand(new GangLeaveSubCommand(this)); - registerSubCommand(new GangDisbandSubCommand(this)); - registerSubCommand(new GangKickSubCommand(this)); - registerSubCommand(new GangTopSubCommand(this)); - registerSubCommand(new GangAdminSubCommand(this)); - registerSubCommand(new GangValueSubCommand(this)); - registerSubCommand(new GangRenameSubCommand(this)); - registerSubCommand(new GangChatSubCommand(this)); - } - - public void register() { - this.registerSubCommands(); - this.registerMainCommand(); - } - - private void registerMainCommand() { - Commands.create() - .tabHandler(this::createTabHandler) - .handler(c -> { - - if (c.args().size() == 0) { - - if (c.sender() instanceof Player) { - Optional optionalGang = this.getPlugin().getGangsManager().getPlayerGang((Player) c.sender()); - optionalGang.ifPresent(gang -> openGangPanelGui(gang, (Player) c.sender())); - return; - } else if (c.sender() instanceof ConsoleCommandSender) { - this.getHelpSubCommand().execute(c.sender(), c.args()); - return; - } - - } - - GangSubCommand subCommand = this.getSubCommand(Objects.requireNonNull(c.rawArg(0))); - - if (subCommand != null) { - - if (!subCommand.canExecute(c.sender())) { - PlayerUtils.sendMessage(c.sender(), this.plugin.getConfig().getMessage("no-permission")); - return; - } - - subCommand.execute(c.sender(), c.args().subList(1, c.args().size())); - } else { - this.getHelpSubCommand().execute(c.sender(), c.args()); - } - }).registerAndBind(this.plugin.getCore(), this.plugin.getConfig().getGangsCommandAliases()); - } - - private GangSubCommand getHelpSubCommand() { - return getSubCommand("help"); - } - - private List createTabHandler(CommandContext context) { - - if (context.args().size() == 0) { - return new ArrayList<>(this.subCommands.keySet()); - } - - GangSubCommand subCommand = getSubCommand(context.rawArg(0)); - - if (subCommand != null) { - return subCommand.getTabComplete(); - } - - return new ArrayList<>(this.subCommands.keySet()); - } - - private void registerSubCommand(GangSubCommand command) { - for (String alias : command.getAliases()) { - this.subCommands.put(alias.toLowerCase(), command); - } - } - - private GangSubCommand getSubCommand(String arg) { - return subCommands.get(arg.toLowerCase()); - } - - private void openGangPanelGui(Gang gang, Player player) { - new GangPanelGUI(this.plugin, gang, player).open(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/GangSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/GangSubCommand.java deleted file mode 100644 index 00c1a41..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/GangSubCommand.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.nvus.xprison.gangs.commands; - -import lombok.Getter; -import org.bukkit.command.CommandSender; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public abstract class GangSubCommand { - - @Getter - protected final GangCommand command; - @Getter - private final String[] aliases; - - protected final Map subCommands; - - public GangSubCommand(GangCommand command, String... aliases) { - this.command = command; - this.aliases = aliases; - this.subCommands = new HashMap<>(); - } - - public abstract boolean execute(CommandSender sender, List args); - - public abstract String getUsage(); - - public abstract boolean canExecute(CommandSender sender); - - public abstract List getTabComplete(); - - protected void registerSubCommand(GangSubCommand subCommand) { - for (String alias : subCommand.getAliases()) { - this.subCommands.put(alias.toLowerCase(), subCommand); - } - } - - protected GangSubCommand getSubCommand(String name) { - return subCommands.get(name.toLowerCase()); - } - - -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangAcceptSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangAcceptSubCommand.java deleted file mode 100644 index b2a399c..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangAcceptSubCommand.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -public final class GangAcceptSubCommand extends GangSubCommand { - - public GangAcceptSubCommand(GangCommand command) { - super(command, "accept", "join"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang accept "; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (sender instanceof Player && args.size() == 1) { - - String gangName = args.get(0); - Optional gangOptional = this.command.getPlugin().getGangsManager().getGangWithName(gangName); - - if (!gangOptional.isPresent()) { - PlayerUtils.sendMessage(sender, this.command.getPlugin().getConfig().getMessage("gang-not-exists")); - return false; - } - - return this.command.getPlugin().getGangsManager().acceptInvite((Player) sender, gangOptional.get()); - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangChatSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangChatSubCommand.java deleted file mode 100644 index 1034fb1..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangChatSubCommand.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - - -public final class GangChatSubCommand extends GangSubCommand { - - public GangChatSubCommand(GangCommand command) { - super(command, "chat", "c"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang chat"; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 0 && sender instanceof Player) { - Player p = (Player) sender; - return this.command.getPlugin().getGangsManager().toggleGangChat(p); - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangCreateSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangCreateSubCommand.java deleted file mode 100644 index cc06c57..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangCreateSubCommand.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.enums.GangCreateResult; -import me.nvus.xprison.gangs.utils.GangsConstants; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public final class GangCreateSubCommand extends GangSubCommand { - - public GangCreateSubCommand(GangCommand command) { - super(command, "create", "new"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang create "; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (sender instanceof Player && args.size() == 1) { - return this.command.getPlugin().getGangsManager().createGang(args.get(0), (Player) sender) == GangCreateResult.SUCCESS; - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_CREATE_PERM); - } - - @Override - public List getTabComplete() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangDisbandSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangDisbandSubCommand.java deleted file mode 100644 index b443839..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangDisbandSubCommand.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.gui.panel.DisbandGangGUI; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -public final class GangDisbandSubCommand extends GangSubCommand { - - public GangDisbandSubCommand(GangCommand command) { - super(command, "disband", "dis"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang disband"; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (sender instanceof Player && args.size() == 0) { - - Player player = (Player) sender; - Optional gangOptional = this.command.getPlugin().getGangsManager().getPlayerGang(player); - - if (!gangOptional.isPresent()) { - PlayerUtils.sendMessage(player, this.command.getPlugin().getConfig().getMessage("not-in-gang")); - return false; - } - - Gang gang = gangOptional.get(); - - if (!gang.isOwner(player)) { - PlayerUtils.sendMessage(player, this.command.getPlugin().getConfig().getMessage("gang-not-owner")); - return false; - } - - new DisbandGangGUI(this.command.getPlugin(), player, gang).open(); - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangHelpSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangHelpSubCommand.java deleted file mode 100644 index 2d9f2b5..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangHelpSubCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.utils.GangsConstants; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import java.util.ArrayList; -import java.util.List; - -public final class GangHelpSubCommand extends GangSubCommand { - - public GangHelpSubCommand(GangCommand command) { - super(command, "help", "?"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang help"; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.isEmpty()) { - this.command.getPlugin().getGangsManager().sendHelpMenu(sender); - if (sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM)) { - this.command.getPlugin().getGangsManager().sendAdminHelpMenu(sender); - } - return true; - } - return false; - } - - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangInfoSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangInfoSubCommand.java deleted file mode 100644 index a4177a8..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangInfoSubCommand.java +++ /dev/null @@ -1,59 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.model.Gang; -import me.lucko.helper.utils.Players; -import org.bukkit.ChatColor; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class GangInfoSubCommand extends GangSubCommand { - - public GangInfoSubCommand(GangCommand command) { - super(command, "info", "inspect"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang info "; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (sender instanceof Player) { - Player p = (Player) sender; - if (args.size() == 0) { - return this.command.getPlugin().getGangsManager().sendGangInfo(p, p); - } else if (args.size() == 1) { - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - - if (this.command.getPlugin().getGangsManager().getPlayerGang(target).isPresent()) { - return this.command.getPlugin().getGangsManager().sendGangInfo(p, target); - } else { - return this.command.getPlugin().getGangsManager().sendGangInfo(p, args.get(0)); - } - } - } - return false; - } - - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - List tabComplete = new ArrayList<>(); - tabComplete.addAll(Players.all().stream().map(Player::getName).collect(Collectors.toList())); - tabComplete.addAll(this.command.getPlugin().getGangsManager().getAllGangs().stream().map(Gang::getName).collect(Collectors.toList())); - return tabComplete; - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangInviteSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangInviteSubCommand.java deleted file mode 100644 index e88adca..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangInviteSubCommand.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.lucko.helper.utils.Players; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; -import java.util.stream.Collectors; - -public final class GangInviteSubCommand extends GangSubCommand { - - public GangInviteSubCommand(GangCommand command) { - super(command, "invite", "inv"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang invite [player]"; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (sender instanceof Player && args.size() == 1) { - Player p = (Player) sender; - Player target = Players.getNullable(args.get(0)); - return this.command.getPlugin().getGangsManager().invitePlayer(p, target); - } - return false; - } - - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangKickSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangKickSubCommand.java deleted file mode 100644 index 3334abd..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangKickSubCommand.java +++ /dev/null @@ -1,57 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.ChatColor; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public final class GangKickSubCommand extends GangSubCommand { - - public GangKickSubCommand(GangCommand command) { - super(command, "kick", "remove"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang kick "; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 1 && sender instanceof Player) { - Player p = (Player) sender; - Optional gang = this.command.getPlugin().getGangsManager().getPlayerGang(p); - - if (!gang.isPresent()) { - PlayerUtils.sendMessage(p, this.command.getPlugin().getConfig().getMessage("not-in-gang")); - return false; - } - - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - - return this.command.getPlugin().getGangsManager().removeFromGang(p, gang.get(), target); - } - return false; - } - - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangLeaveSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangLeaveSubCommand.java deleted file mode 100644 index c227f62..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangLeaveSubCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.enums.GangLeaveReason; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public final class GangLeaveSubCommand extends GangSubCommand { - - public GangLeaveSubCommand(GangCommand command) { - super(command, "leave", "quit"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang leave"; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 0 && sender instanceof Player) { - Player p = (Player) sender; - return this.command.getPlugin().getGangsManager().leaveGang(p, GangLeaveReason.LEAVE); - } - return false; - } - - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangRenameSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangRenameSubCommand.java deleted file mode 100644 index 4d390f7..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangRenameSubCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.enums.GangRenameResult; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -public final class GangRenameSubCommand extends GangSubCommand { - - public GangRenameSubCommand(GangCommand command) { - super(command, "rename"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang rename [new_name]"; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 1 && sender instanceof Player) { - Player p = (Player) sender; - String newName = args.get(0); - - Optional gangOptional = this.command.getPlugin().getGangsManager().getPlayerGang(p); - - if (!gangOptional.isPresent()) { - PlayerUtils.sendMessage(p, this.command.getPlugin().getConfig().getMessage("not-in-gang")); - return false; - } - - Gang gang = gangOptional.get(); - - if (!gang.isOwner(p)) { - PlayerUtils.sendMessage(p, this.command.getPlugin().getConfig().getMessage("gang-not-owner")); - return false; - } - - return this.command.getPlugin().getGangsManager().renameGang(gang, newName, p) == GangRenameResult.SUCCESS; - } - return false; - } - - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangTopSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/GangTopSubCommand.java deleted file mode 100644 index f6c38b8..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/GangTopSubCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import java.util.ArrayList; -import java.util.List; - -public final class GangTopSubCommand extends GangSubCommand { - - public GangTopSubCommand(GangCommand command) { - super(command, "top", "leaderboard"); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang top"; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 0) { - return this.command.getPlugin().getGangsManager().sendGangTop(sender); - } - return false; - } - - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public List getTabComplete() { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminDisbandSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminDisbandSubCommand.java deleted file mode 100644 index 4d46c59..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminDisbandSubCommand.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl.admin; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.utils.GangsConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public final class GangAdminDisbandSubCommand extends GangSubCommand { - - public GangAdminDisbandSubCommand(GangCommand command) { - super(command, "disband"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 1) { - Optional gangOptional = this.command.getPlugin().getGangsManager().getGangWithName(args.get(0)); - - if (!gangOptional.isPresent()) { - PlayerUtils.sendMessage(sender, this.command.getPlugin().getConfig().getMessage("gang-not-exists")); - return false; - } - - return this.command.getPlugin().getGangsManager().forceDisband(sender, gangOptional.get()); - } - return false; - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang admin disband "; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM); - } - - @Override - public List getTabComplete() { - return Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminJoinSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminJoinSubCommand.java deleted file mode 100644 index 708530b..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminJoinSubCommand.java +++ /dev/null @@ -1,53 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl.admin; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.utils.GangsConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public final class GangAdminJoinSubCommand extends GangSubCommand { - - public GangAdminJoinSubCommand(GangCommand command) { - super(command, "join", "add"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 2) { - Player target = Players.getNullable(args.get(0)); - Optional gangOptional = this.command.getPlugin().getGangsManager().getGangWithName(args.get(1)); - - if (!gangOptional.isPresent()) { - PlayerUtils.sendMessage(sender, this.command.getPlugin().getConfig().getMessage("gang-not-exists")); - return false; - } - - return this.command.getPlugin().getGangsManager().forceAdd(sender, target, gangOptional.get()); - } - return false; - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang admin join "; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM); - } - - @Override - public List getTabComplete() { - return Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminKickSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminKickSubCommand.java deleted file mode 100644 index d66623c..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminKickSubCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl.admin; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.utils.GangsConstants; -import me.lucko.helper.utils.Players; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; -import java.util.stream.Collectors; - -public final class GangAdminKickSubCommand extends GangSubCommand { - - public GangAdminKickSubCommand(GangCommand command) { - super(command, "kick", "remove"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 1) { - Player target = Players.getNullable(args.get(0)); - return this.command.getPlugin().getGangsManager().forceRemove(sender, target); - } - return false; - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang admin kick "; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM); - } - - @Override - public List getTabComplete() { - return Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminRenameSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminRenameSubCommand.java deleted file mode 100644 index 7b2fc3e..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminRenameSubCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl.admin; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.utils.GangsConstants; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import java.util.List; -import java.util.stream.Collectors; - -public final class GangAdminRenameSubCommand extends GangSubCommand { - - public GangAdminRenameSubCommand(GangCommand command) { - super(command, "rename"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 2) { - String oldGangName = args.get(0); - String newGangName = args.get(1); - return this.command.getPlugin().getGangsManager().forceRename(sender, oldGangName, newGangName); - } - return false; - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang admin rename "; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM); - } - - @Override - public List getTabComplete() { - return this.command.getPlugin().getGangsManager().getAllGangs().stream().map(Gang::getName).collect(Collectors.toList()); - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminSubCommand.java deleted file mode 100644 index fd3d0fa..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/admin/GangAdminSubCommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl.admin; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.utils.GangsConstants; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import java.util.ArrayList; -import java.util.List; - -public final class GangAdminSubCommand extends GangSubCommand { - - public GangAdminSubCommand(GangCommand command) { - super(command, "admin"); - registerSubCommand(new GangAdminJoinSubCommand(command)); - registerSubCommand(new GangAdminKickSubCommand(command)); - registerSubCommand(new GangAdminDisbandSubCommand(command)); - registerSubCommand(new GangAdminRenameSubCommand(command)); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang admin "; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() > 0) { - GangSubCommand subCommand = getSubCommand(args.get(0)); - if (subCommand != null) { - return subCommand.execute(sender, args.subList(1, args.size())); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM); - } - - @Override - public List getTabComplete() { - return new ArrayList<>(this.subCommands.keySet()); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueAddSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueAddSubCommand.java deleted file mode 100644 index 8b33cc4..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueAddSubCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl.value; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.utils.GangsConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public final class GangValueAddSubCommand extends GangSubCommand { - public GangValueAddSubCommand(GangCommand command) { - super(command, "add"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 2) { - try { - Optional gang = this.command.getPlugin().getGangsManager().getGangWithName(args.get(0)); - - if (!gang.isPresent()) { - gang = this.command.getPlugin().getGangsManager().getPlayerGang(Players.getOfflineNullable(args.get(0))); - } - - if (!gang.isPresent()) { - PlayerUtils.sendMessage(sender, this.command.getPlugin().getConfig().getMessage("gang-not-exists")); - return false; - } - - long amount = Long.parseLong(args.get(1)); - String operation = "add"; - - return this.command.getPlugin().getGangsManager().modifyValue(sender, gang.get(), amount, operation); - } catch (Exception e) { - sender.sendMessage("§cInternal error."); - return false; - } - } - return false; - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang value add "; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM); - } - - @Override - public List getTabComplete() { - return this.command.getPlugin().getGangsManager().getAllGangs().stream().map(Gang::getName).collect(Collectors.toList()); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueRemoveSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueRemoveSubCommand.java deleted file mode 100644 index 4abca19..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueRemoveSubCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl.value; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.utils.GangsConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -public final class GangValueRemoveSubCommand extends GangSubCommand { - public GangValueRemoveSubCommand(GangCommand command) { - super(command, "remove"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() == 2) { - try { - Optional gang = this.command.getPlugin().getGangsManager().getGangWithName(args.get(0)); - - if (!gang.isPresent()) { - gang = this.command.getPlugin().getGangsManager().getPlayerGang(Players.getOfflineNullable(args.get(0))); - } - - if (!gang.isPresent()) { - PlayerUtils.sendMessage(sender, this.command.getPlugin().getConfig().getMessage("gang-not-exists")); - return false; - } - - long amount = Long.parseLong(args.get(1)); - String operation = "remove"; - - return this.command.getPlugin().getGangsManager().modifyValue(sender, gang.get(), amount, operation); - } catch (Exception e) { - sender.sendMessage("§cInternal error."); - return false; - } - } - return false; - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang value remove "; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM); - } - - @Override - public List getTabComplete() { - return this.command.getPlugin().getGangsManager().getAllGangs().stream().map(Gang::getName).collect(Collectors.toList()); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueSubCommand.java b/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueSubCommand.java deleted file mode 100644 index 831c646..0000000 --- a/src/main/java/me/nvus/xprison/gangs/commands/impl/value/GangValueSubCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.nvus.xprison.gangs.commands.impl.value; - -import me.nvus.xprison.gangs.commands.GangCommand; -import me.nvus.xprison.gangs.commands.GangSubCommand; -import me.nvus.xprison.gangs.utils.GangsConstants; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import java.util.ArrayList; -import java.util.List; - -public final class GangValueSubCommand extends GangSubCommand { - - public GangValueSubCommand(GangCommand command) { - super(command, "value"); - registerSubCommand(new GangValueAddSubCommand(command)); - registerSubCommand(new GangValueRemoveSubCommand(command)); - } - - @Override - public String getUsage() { - return ChatColor.RED + "/gang value "; - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() > 0) { - GangSubCommand subCommand = getSubCommand(args.get(0)); - if (subCommand != null) { - return subCommand.execute(sender, args.subList(1, args.size())); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GangsConstants.GANGS_ADMIN_PERM); - } - - @Override - public List getTabComplete() { - return new ArrayList<>(this.subCommands.keySet()); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/config/GangsConfig.java b/src/main/java/me/nvus/xprison/gangs/config/GangsConfig.java deleted file mode 100644 index b5cbeca..0000000 --- a/src/main/java/me/nvus/xprison/gangs/config/GangsConfig.java +++ /dev/null @@ -1,115 +0,0 @@ -package me.nvus.xprison.gangs.config; - -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.utils.text.TextUtils; -import lombok.Getter; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.event.EventPriority; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class GangsConfig { - - private final XPrisonGangs plugin; - private final FileManager.Config config; - - private Map messages; - private Map placeholders; - @Getter - private String gangDisbandGUITitle; - @Getter - private List gangInfoFormat; - @Getter - private List gangTopFormat; - @Getter - private List gangAdminHelpMenu; - @Getter - private List gangHelpMenu; - @Getter - private List restrictedNames; - @Getter - private EventPriority gangChatPriority; - @Getter - private int maxGangMembers; - @Getter - private int gangUpdateDelay; - @Getter - private int maxGangNameLength; - @Getter - private boolean enableColorCodes; - @Getter - private boolean gangFriendlyFire; - @Getter - private String[] gangsCommandAliases; - - - public GangsConfig(XPrisonGangs plugin) { - this.plugin = plugin; - this.config = this.plugin.getCore().getFileManager().getConfig("gangs.yml").copyDefaults(true).save(); - } - - private void loadMessages() { - messages = new HashMap<>(); - - YamlConfiguration configuration = getYamlConfig(); - - for (String key : configuration.getConfigurationSection("messages").getKeys(false)) { - messages.put(key.toLowerCase(), TextUtils.applyColor(configuration.getString("messages." + key))); - } - } - - public String getMessage(String key) { - return messages.getOrDefault(key.toLowerCase(), "No message with key '" + key + "' found"); - } - - private void loadVariables() { - - this.loadMessages(); - this.loadPlaceholders(); - - this.gangInfoFormat = this.getYamlConfig().getStringList("gang-info-format"); - this.gangHelpMenu = this.getYamlConfig().getStringList("gang-help-menu"); - this.gangDisbandGUITitle = this.getYamlConfig().getString("gang-disband-gui-title"); - this.gangAdminHelpMenu = this.getYamlConfig().getStringList("gang-admin-help-menu"); - this.gangTopFormat = this.getYamlConfig().getStringList("gang-top-format"); - this.gangUpdateDelay = this.getYamlConfig().getInt("gang-top-update", 1); - this.maxGangMembers = this.getYamlConfig().getInt("max-gang-members", 10); - this.maxGangNameLength = this.getYamlConfig().getInt("max-gang-name-length", 10); - this.enableColorCodes = this.getYamlConfig().getBoolean("color-codes-in-gang-name"); - this.gangFriendlyFire = this.getYamlConfig().getBoolean("gang-friendly-fire"); - this.gangChatPriority = EventPriority.valueOf(this.getYamlConfig().getString("gang-chat-priority")); - this.gangsCommandAliases = this.getYamlConfig().getStringList("gangs-command-aliases").toArray(new String[0]); - this.restrictedNames = this.getYamlConfig().getStringList("restricted-names"); - } - - private FileManager.Config getConfig() { - return this.config; - } - - public YamlConfiguration getYamlConfig() { - return this.config.get(); - } - - public void load() { - this.getConfig().reload(); - this.loadVariables(); - } - - private void loadPlaceholders() { - this.placeholders = new HashMap<>(); - for (String key : this.config.get().getConfigurationSection("placeholders").getKeys(false)) { - this.placeholders.put(key.toLowerCase(), TextUtils.applyColor(this.config.get().getString("placeholders." + key))); - } - } - - public String getPlaceholder(String name) { - return this.placeholders.get(name.toLowerCase()); - } - - public void reload() { - this.load(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/enums/GangCreateResult.java b/src/main/java/me/nvus/xprison/gangs/enums/GangCreateResult.java deleted file mode 100644 index 324dc1e..0000000 --- a/src/main/java/me/nvus/xprison/gangs/enums/GangCreateResult.java +++ /dev/null @@ -1,14 +0,0 @@ -package me.nvus.xprison.gangs.enums; - -public enum GangCreateResult { - SUCCESS, - NAME_RESTRICTED, - NAME_VALID, - NAME_TOO_LONG, - NAME_CONTAINS_COLORS, - NAME_TAKEN, - NAME_EMPTY, - PLAYER_HAS_GANG, - EVENT_CANCELLED, - -} diff --git a/src/main/java/me/nvus/xprison/gangs/enums/GangLeaveReason.java b/src/main/java/me/nvus/xprison/gangs/enums/GangLeaveReason.java deleted file mode 100644 index 0c13a20..0000000 --- a/src/main/java/me/nvus/xprison/gangs/enums/GangLeaveReason.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.nvus.xprison.gangs.enums; - -public enum GangLeaveReason { - ADMIN, - KICK, - LEAVE -} diff --git a/src/main/java/me/nvus/xprison/gangs/enums/GangNameCheckResult.java b/src/main/java/me/nvus/xprison/gangs/enums/GangNameCheckResult.java deleted file mode 100644 index abb05de..0000000 --- a/src/main/java/me/nvus/xprison/gangs/enums/GangNameCheckResult.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.nvus.xprison.gangs.enums; - -public enum GangNameCheckResult { - SUCCESS, - NAME_RESTRICTED, - NAME_TOO_LONG, - NAME_CONTAINS_COLORS, - NAME_TAKEN, - NAME_EMPTY -} diff --git a/src/main/java/me/nvus/xprison/gangs/enums/GangRenameResult.java b/src/main/java/me/nvus/xprison/gangs/enums/GangRenameResult.java deleted file mode 100644 index ad0e508..0000000 --- a/src/main/java/me/nvus/xprison/gangs/enums/GangRenameResult.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.nvus.xprison.gangs.enums; - -public enum GangRenameResult { - SUCCESS, - NAME_TOO_LONG, - NAME_CONTAINS_COLORS, - NAME_TAKEN, - NAME_EMPTY -} diff --git a/src/main/java/me/nvus/xprison/gangs/gui/admin/DisbandGangAdminGUI.java b/src/main/java/me/nvus/xprison/gangs/gui/admin/DisbandGangAdminGUI.java deleted file mode 100644 index 599b626..0000000 --- a/src/main/java/me/nvus/xprison/gangs/gui/admin/DisbandGangAdminGUI.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.nvus.xprison.gangs.gui.admin; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.gui.ConfirmationGui; -import org.bukkit.entity.Player; - -public final class DisbandGangAdminGUI extends ConfirmationGui { - - private final XPrisonGangs plugin; - private final Gang gang; - - public DisbandGangAdminGUI(XPrisonGangs plugin, Player player, Gang gang) { - super(player, "Disband " + gang.getName() + " gang ?"); - this.plugin = plugin; - this.gang = gang; - } - - @Override - public void confirm(boolean confirm) { - if (confirm) { - this.plugin.getGangsManager().disbandGang(this.getPlayer(), this.gang, true); - } - this.close(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/gui/panel/DisbandGangGUI.java b/src/main/java/me/nvus/xprison/gangs/gui/panel/DisbandGangGUI.java deleted file mode 100644 index e370dfd..0000000 --- a/src/main/java/me/nvus/xprison/gangs/gui/panel/DisbandGangGUI.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.nvus.xprison.gangs.gui.panel; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.gui.ConfirmationGui; -import org.bukkit.entity.Player; - -public final class DisbandGangGUI extends ConfirmationGui { - - private final XPrisonGangs plugin; - private final Gang gang; - - public DisbandGangGUI(XPrisonGangs plugin, Player player, Gang gang) { - super(player, plugin.getConfig().getGangDisbandGUITitle()); - this.plugin = plugin; - this.gang = gang; - } - - @Override - public void confirm(boolean confirm) { - if (confirm) { - this.plugin.getGangsManager().disbandGang(getPlayer(), this.gang, false); - } - this.close(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/gui/panel/GangPanelGUI.java b/src/main/java/me/nvus/xprison/gangs/gui/panel/GangPanelGUI.java deleted file mode 100644 index 9e01a2f..0000000 --- a/src/main/java/me/nvus/xprison/gangs/gui/panel/GangPanelGUI.java +++ /dev/null @@ -1,131 +0,0 @@ -package me.nvus.xprison.gangs.gui.panel; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.Services; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.Item; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import me.lucko.helper.signprompt.SignPromptFactory; -import org.bukkit.entity.Player; - -import java.util.Arrays; - -public final class GangPanelGUI extends Gui { - - private static final MenuScheme LAYOUT = new MenuScheme() - .mask("111111111") - .mask("100000001") - .mask("111111111"); - - private static final MenuScheme BUTTONS = new MenuScheme() - .mask("000000000") - .mask("011111110") - .mask("000000000"); - - - private final XPrisonGangs plugin; - private final Gang gang; - - public GangPanelGUI(XPrisonGangs plugin, Gang gang, Player player) { - super(player, 3, "Gang Panel"); - this.plugin = plugin; - this.gang = gang; - } - - @Override - public void redraw() { - if (isFirstDraw()) { - populateLayout(); - populateButtons(); - } - } - - private void populateLayout() { - MenuPopulator populator = LAYOUT.newPopulator(this); - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.BLACK_STAINED_GLASS_PANE.toItem()).name("&a").buildItem().build()); - } - } - - private void populateButtons() { - MenuPopulator populator = BUTTONS.newPopulator(this); - - populator.acceptIfSpace(createGangInfoItem()); - - if (gang.canRenameGang(getPlayer())) { - populator.acceptIfSpace(createGangRenameItem()); - } - if (gang.canManageMembers(getPlayer())) { - populator.acceptIfSpace(createManageMembersItem()); - } - if (gang.canManageInvites(getPlayer())) { - populator.acceptIfSpace(createManageInvitesItem()); - } - if (gang.canDisband(getPlayer())) { - populator.acceptIfSpace(createDisbandGangItem()); - } - - } - - private Item createManageInvitesItem() { - return ItemStackBuilder.of(CompMaterial.PLAYER_HEAD.toItem()).name("&eManage Invites").lore("&7Click to manage pending invites.").build(this::openManageInvitesGui); - } - - private Item createDisbandGangItem() { - return ItemStackBuilder.of(CompMaterial.BARRIER.toItem()).name("&cDisband Gang").lore("&7Click to disband your gang.").build(this::openDisbandGangGui); - } - - private void openDisbandGangGui() { - close(); - new DisbandGangGUI(this.plugin, this.getPlayer(), this.gang).open(); - } - - private Item createManageMembersItem() { - return ItemStackBuilder.of(CompMaterial.PLAYER_HEAD.toItem()).name("&eManage Members").lore("&7Click to manage your gang members.").build(this::openManageMembersGui); - } - - private void openManageMembersGui() { - close(); - new ManageGangMembersGui(this.plugin, this.gang, this.getPlayer()).open(); - } - - private void openManageInvitesGui() { - close(); - new ManageGangInvitesGui(this.plugin, this.gang, this.getPlayer()).open(); - } - - private Item createGangRenameItem() { - return ItemStackBuilder.of(CompMaterial.OAK_SIGN.toItem()).name("&eRename Gang").lore("&7Click to rename your gang.").build(() -> { - SignPromptFactory factory = Services.load(SignPromptFactory.class); - factory.openPrompt(this.getPlayer(), Arrays.asList("", "§e^ ^ ^", "§7Enter gang name", ""), responseHandler -> { - if (responseHandler.get(0).isEmpty()) { - return SignPromptFactory.Response.ACCEPTED; - } - this.plugin.getGangsManager().renameGang(this.gang, responseHandler.get(0), this.getPlayer()); - return SignPromptFactory.Response.ACCEPTED; - }); - }); - } - - private Item createGangInfoItem() { - int gangTopPosition = getGangTopPosition(); - - return ItemStackBuilder.of(CompMaterial.BOOK.toItem()).name("&eGang Info").lore( - " ", - String.format("&8» &e%s &7Gang", this.gang.getName()), - String.format("&8» &7Owner: &e%s", this.gang.getOwnerOffline().getName()), - String.format("&8» &7Members: &e%,d", this.gang.getMembersOffline().size()), - String.format("&8» &7Value: &e%,d", this.gang.getValue()), - String.format("&8» &7Top Placement: &e%s", gangTopPosition == -1 ? "Please Wait" : String.format("#%,d", gangTopPosition)), - " " - ).buildItem().build(); - } - - private int getGangTopPosition() { - return this.plugin.getGangsManager().getGangTopPosition(this.gang); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/gui/panel/ManageGangInvitesGui.java b/src/main/java/me/nvus/xprison/gangs/gui/panel/ManageGangInvitesGui.java deleted file mode 100644 index f7d371c..0000000 --- a/src/main/java/me/nvus/xprison/gangs/gui/panel/ManageGangInvitesGui.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.nvus.xprison.gangs.gui.panel; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.model.GangInvitation; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.Item; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; - -import java.text.SimpleDateFormat; - -public final class ManageGangInvitesGui extends Gui { - - private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss"); - - private static final MenuScheme LAYOUT = new MenuScheme() - .mask("111111111") - .mask("100000001") - .mask("100000001") - .mask("100000001") - .mask("100000001") - .mask("111111111"); - - private final XPrisonGangs plugin; - private final Gang gang; - - public ManageGangInvitesGui(XPrisonGangs plugin, Gang gang, Player player) { - super(player, 6, "Pending Invites"); - this.plugin = plugin; - this.gang = gang; - } - - @Override - public void redraw() { - clearItems(); - populateLayout(); - populateButtons(); - } - - private void populateLayout() { - MenuPopulator populator = LAYOUT.newPopulator(this); - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.BLACK_STAINED_GLASS_PANE.toItem()).name("&a").buildItem().build()); - } - } - - private void populateButtons() { - this.gang.getPendingInvites().forEach(gangInvitation -> this.addItem(createInviteItem(gangInvitation))); - } - - private Item createInviteItem(GangInvitation invitation) { - - String statusColor = invitation.getInvitedPlayer().isOnline() ? "&a" : "&c"; - String status = invitation.getInvitedPlayer().isOnline() ? "Online" : "Offline"; - - return ItemStackBuilder.of(CompMaterial.PLAYER_HEAD.toItem()) - .name(statusColor + invitation.getInvitedPlayer().getName()) - .lore( - " ", - "&8» &7Online Status: " + statusColor + status, - "&8» &7Invited By: &e" + invitation.getInvitedBy().getName(), - "&8» &7Invited At: &e" + DATE_FORMAT.format(invitation.getInviteDate()), - " ", - "&7Right-click to &cCancel" - ) - .build(ClickType.RIGHT, () -> { - this.gang.removeInvitation(invitation); - redraw(); - }); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/gui/panel/ManageGangMembersGui.java b/src/main/java/me/nvus/xprison/gangs/gui/panel/ManageGangMembersGui.java deleted file mode 100644 index 5941180..0000000 --- a/src/main/java/me/nvus/xprison/gangs/gui/panel/ManageGangMembersGui.java +++ /dev/null @@ -1,73 +0,0 @@ -package me.nvus.xprison.gangs.gui.panel; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.Item; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; - -public final class ManageGangMembersGui extends Gui { - - - private static final MenuScheme LAYOUT = new MenuScheme() - .mask("111111111") - .mask("100000001") - .mask("100000001") - .mask("100000001") - .mask("100000001") - .mask("111111111"); - - private final XPrisonGangs plugin; - private final Gang gang; - - public ManageGangMembersGui(XPrisonGangs plugin, Gang gang, Player player) { - super(player, 6, "Gang Members"); - this.plugin = plugin; - this.gang = gang; - } - - @Override - public void redraw() { - clearItems(); - populateLayout(); - populateButtons(); - } - - private void populateLayout() { - MenuPopulator populator = LAYOUT.newPopulator(this); - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.BLACK_STAINED_GLASS_PANE.toItem()).name("&a").buildItem().build()); - } - } - - private void populateButtons() { - this.gang.getMembersOffline().forEach(player -> this.addItem(createGangMemberItem(player))); - } - - private Item createGangMemberItem(OfflinePlayer player) { - - String statusColor = player.isOnline() ? "&a" : "&c"; - String status = player.isOnline() ? "Online" : "Offline"; - - return ItemStackBuilder.of(CompMaterial.PLAYER_HEAD.toItem()) - .name(statusColor + player.getName()) - .lore( - " ", - "&8» &7Online Status: " + statusColor + status, - "&8» &7Role: &e" + (gang.isOwner(player) ? "Owner" : "Member"), - " ", - "&7Right-Click to &cKICK" - ) - .build(ClickType.RIGHT, () -> { - this.plugin.getGangsManager().kickPlayerFromGang(this.gang, player); - redraw(); - }); - } - -} diff --git a/src/main/java/me/nvus/xprison/gangs/listener/GangsListener.java b/src/main/java/me/nvus/xprison/gangs/listener/GangsListener.java deleted file mode 100644 index 7e1aed1..0000000 --- a/src/main/java/me/nvus/xprison/gangs/listener/GangsListener.java +++ /dev/null @@ -1,82 +0,0 @@ -package me.nvus.xprison.gangs.listener; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.EventPriority; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; - -import java.util.Optional; - -public class GangsListener { - - private final XPrisonGangs plugin; - - public GangsListener(XPrisonGangs plugin) { - this.plugin = plugin; - } - - public void register() { - this.subscribeToEntityDamageByEntityEvent(); - this.subscribeToAsyncPlayerChatEvent(); - } - - private void subscribeToEntityDamageByEntityEvent() { - Events.subscribe(EntityDamageByEntityEvent.class, EventPriority.HIGHEST) - .filter(e -> e.getDamager() instanceof Player && (e.getEntity() instanceof Player || e.getEntity() instanceof Projectile)) - .handler(e -> { - - if (this.plugin.getConfig().isGangFriendlyFire()) { - return; - } - - Player player = (Player) e.getEntity(); - Player damager = null; - if (e.getDamager() instanceof Player) { - damager = (Player) e.getDamager(); - } else if (e.getDamager() instanceof Projectile) { - Projectile projectile = (Projectile) e.getDamager(); - if (projectile.getShooter() instanceof Player) { - damager = (Player) projectile.getShooter(); - } - } - - if (damager == null) { - return; - } - - if (this.plugin.getGangsManager().arePlayersInSameGang(player, damager)) { - e.setCancelled(true); - } - - }).bindWith(this.plugin.getCore()); - } - - private void subscribeToAsyncPlayerChatEvent() { - Events.subscribe(AsyncPlayerChatEvent.class, this.plugin.getConfig().getGangChatPriority()) - .filter(e -> this.plugin.getGangsManager().hasGangChatEnabled(e.getPlayer())) - .handler(e -> { - - Optional gangOptional = this.plugin.getGangsManager().getPlayerGang(e.getPlayer()); - - if (!gangOptional.isPresent()) { - this.plugin.getGangsManager().disableGangChat(e.getPlayer()); - return; - } - - e.setCancelled(true); - e.getRecipients().clear(); - - Gang gang = gangOptional.get(); - - for (Player p : gang.getOnlinePlayers()) { - PlayerUtils.sendMessage(p, this.plugin.getConfig().getMessage("gang-chat-format").replace("%player%", e.getPlayer().getName()).replace("%message%", e.getMessage()).replace("%gang%", gang.getName())); - } - }).bindWith(this.plugin.getCore()); - } - -} diff --git a/src/main/java/me/nvus/xprison/gangs/managers/GangsManager.java b/src/main/java/me/nvus/xprison/gangs/managers/GangsManager.java deleted file mode 100644 index 048a72d..0000000 --- a/src/main/java/me/nvus/xprison/gangs/managers/GangsManager.java +++ /dev/null @@ -1,534 +0,0 @@ -package me.nvus.xprison.gangs.managers; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gangs.api.events.GangCreateEvent; -import me.nvus.xprison.gangs.api.events.GangDisbandEvent; -import me.nvus.xprison.gangs.enums.GangCreateResult; -import me.nvus.xprison.gangs.enums.GangLeaveReason; -import me.nvus.xprison.gangs.enums.GangNameCheckResult; -import me.nvus.xprison.gangs.enums.GangRenameResult; -import me.nvus.xprison.gangs.gui.admin.DisbandGangAdminGUI; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.model.GangInvitation; -import me.nvus.xprison.gangs.model.GangTopProvider; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.nvus.xprison.utils.text.TextUtils; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.utils.Players; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -public class GangsManager { - - private final XPrisonGangs plugin; - private final Map gangs; - private final List gangChatEnabledPlayers; - private List topGangs; - - public GangsManager(XPrisonGangs plugin) { - this.plugin = plugin; - this.gangChatEnabledPlayers = new ArrayList<>(); - this.gangs = new ConcurrentHashMap<>(); - this.topGangs = new ArrayList<>(); - } - - public void enable() { - this.loadGangs(); - } - - public boolean arePlayersInSameGang(Player player1, Player player2) { - Optional player1Gang = this.getPlayerGang(player1); - Optional player2Gang = this.getPlayerGang(player2); - - if (!player1Gang.isPresent() || !player2Gang.isPresent()) { - return false; - } - - return player1Gang.get().equals(player2Gang.get()); - } - - private void loadGangs() { - this.gangs.clear(); - Schedulers.async().run(() -> { - for (Gang g : this.plugin.getGangsService().getAllGangs()) { - this.gangs.put(g.getUuid(), g); - } - }); - } - - private void saveDataOnDisable() { - for (Gang g : this.gangs.values()) { - this.plugin.getGangsService().updateGang(g); - } - this.plugin.getCore().getLogger().info("Saved all gangs."); - } - - public Optional getPlayerGang(OfflinePlayer p) { - return this.gangs.values().stream().filter(gang -> gang.containsPlayer(p)).findFirst(); - } - - public Optional getGangWithName(String name) { - return this.gangs.values().stream().filter(gang -> ChatColor.stripColor(TextUtils.applyColor(gang.getName())).equalsIgnoreCase(name)).findFirst(); - } - - public GangRenameResult renameGang(Gang gang, String newName, CommandSender whoRenamed) { - - GangNameCheckResult nameCheckResult = this.performNameCheck(newName, whoRenamed); - if (nameCheckResult != GangNameCheckResult.SUCCESS) { - return GangRenameResult.valueOf(nameCheckResult.name()); - } - - gang.setName(newName); - - PlayerUtils.sendMessage(whoRenamed, this.plugin.getConfig().getMessage("gang-rename").replace("%gang%", TextUtils.applyColor(gang.getName()))); - return GangRenameResult.SUCCESS; - } - - public GangCreateResult createGang(String name, Player creator) { - - if (this.getPlayerGang(creator).isPresent()) { - PlayerUtils.sendMessage(creator, this.plugin.getConfig().getMessage("gang-cant-create")); - return GangCreateResult.PLAYER_HAS_GANG; - } - - GangNameCheckResult nameCheckResult = this.performNameCheck(name, creator); - - if (nameCheckResult != GangNameCheckResult.SUCCESS) { - return GangCreateResult.valueOf(nameCheckResult.name()); - } - - Gang g = new Gang(name, creator.getUniqueId()); - - GangCreateEvent gangCreateEvent = new GangCreateEvent(creator, g); - - this.plugin.getCore().debug("Calling GangCreateEvent for gang " + g.getName() + ".", this.plugin); - - Events.call(gangCreateEvent); - - if (gangCreateEvent.isCancelled()) { - this.plugin.getCore().debug("GangCreateEvent for gang " + g.getName() + " was cancelled.", this.plugin); - return GangCreateResult.EVENT_CANCELLED; - } - - this.gangs.put(g.getUuid(), g); - - PlayerUtils.sendMessage(creator, this.plugin.getConfig().getMessage("gang-created").replace("%name%", TextUtils.applyColor(name))); - - this.plugin.getGangsService().createGang(g); - Players.all().forEach(player1 -> PlayerUtils.sendMessage(player1, this.plugin.getConfig().getMessage("gang-create-broadcast").replace("%gang%", TextUtils.applyColor(g.getName())).replace("%player%", creator.getName()))); - return GangCreateResult.SUCCESS; - } - - private GangNameCheckResult performNameCheck(String name, CommandSender sender) { - GangNameCheckResult nameCheck = checkGangName(name); - - if (nameCheck == GangNameCheckResult.NAME_TOO_LONG) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-name-long")); - } else if (nameCheck == GangNameCheckResult.NAME_CONTAINS_COLORS) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-name-colors")); - } else if (nameCheck == GangNameCheckResult.NAME_TAKEN) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-already-exists").replace("%name%", TextUtils.applyColor(name))); - } else if (nameCheck == GangNameCheckResult.NAME_EMPTY) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-invalid-name")); - } else if (nameCheck == GangNameCheckResult.NAME_RESTRICTED) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-name-restricted")); - } - - return nameCheck; - } - - private GangNameCheckResult checkGangName(String name) { - - if (name.isEmpty()) { - return GangNameCheckResult.NAME_EMPTY; - } - - for (String s : this.plugin.getConfig().getRestrictedNames()) { - if (name.contains(s)) { - return GangNameCheckResult.NAME_RESTRICTED; - } - } - - if (this.plugin.getConfig().isEnableColorCodes()) { - if (ChatColor.stripColor(TextUtils.applyColor(name)).length() > this.plugin.getConfig().getMaxGangNameLength()) { - return GangNameCheckResult.NAME_TOO_LONG; - } - } else { - - if (!ChatColor.translateAlternateColorCodes('&', name).equals(name)) { - return GangNameCheckResult.NAME_CONTAINS_COLORS; - } - - if (name.length() > this.plugin.getConfig().getMaxGangNameLength()) { - return GangNameCheckResult.NAME_TOO_LONG; - } - - } - if (!this.getGangWithName(name).isPresent()) { - return GangNameCheckResult.SUCCESS; - } else { - return GangNameCheckResult.NAME_TAKEN; - } - } - - public boolean invitePlayer(Player invitedBy, Player invited) { - - if (invited == null || !invited.isOnline()) { - PlayerUtils.sendMessage(invitedBy, this.plugin.getConfig().getMessage("player-not-online")); - return false; - } - - Optional gangOptional = this.getPlayerGang(invitedBy); - - if (!gangOptional.isPresent()) { - PlayerUtils.sendMessage(invitedBy, this.plugin.getConfig().getMessage("not-in-gang")); - return false; - } - - Gang gang = gangOptional.get(); - - if (!gang.isOwner(invitedBy)) { - PlayerUtils.sendMessage(invitedBy, this.plugin.getConfig().getMessage("gang-not-owner")); - return false; - } - - if (gang.getMembersOffline().size() >= this.plugin.getConfig().getMaxGangMembers()) { - PlayerUtils.sendMessage(invitedBy, this.plugin.getConfig().getMessage("gang-full")); - return false; - } - - Optional gang1 = this.getPlayerGang(invited); - - if (gang1.isPresent()) { - PlayerUtils.sendMessage(invitedBy, this.plugin.getConfig().getMessage("gang-cant-invite")); - return false; - } - - if (gang.hasPendingInvite(invited)) { - PlayerUtils.sendMessage(invitedBy, this.plugin.getConfig().getMessage("gang-invite-pending")); - return false; - } - - GangInvitation invitation = gang.invitePlayer(invitedBy, invited); - - PlayerUtils.sendMessage(invitedBy, this.plugin.getConfig().getMessage("gang-invite-success").replace("%player%", invited.getName())); - PlayerUtils.sendMessage(invited, this.plugin.getConfig().getMessage("gang-invite-received").replace("%gang%", gang.getName())); - - Schedulers.sync().runLater(() -> gang.removeInvitation(invitation), 5, TimeUnit.MINUTES); - return true; - } - - public boolean leaveGang(Player player, GangLeaveReason reason) { - - Optional optGang = this.getPlayerGang(player); - - if (!optGang.isPresent()) { - PlayerUtils.sendMessage(player, this.plugin.getConfig().getMessage("not-in-gang")); - return false; - } - - Gang gang = optGang.get(); - - if (gang.isOwner(player)) { - PlayerUtils.sendMessage(player, this.plugin.getConfig().getMessage("gang-please-disband")); - return false; - } - - if (gang.leavePlayer(player, reason)) { - gang.getOnlinePlayers().forEach(player1 -> PlayerUtils.sendMessage(player1, this.plugin.getConfig().getMessage("gang-player-left").replace("%player%", player.getName()))); - PlayerUtils.sendMessage(player, this.plugin.getConfig().getMessage("gang-left").replace("%gang%", gang.getName())); - return true; - } - - return false; - } - - public boolean joinGang(OfflinePlayer player, Gang gang) { - - Optional optGang = this.getPlayerGang(player); - - if (optGang.isPresent()) { - if (player.isOnline()) { - PlayerUtils.sendMessage(player.getPlayer(), this.plugin.getConfig().getMessage("gang-cant-join")); - } - return false; - } - - if (gang.joinPlayer(player)) { - if (player.isOnline()) { - PlayerUtils.sendMessage(player.getPlayer(), this.plugin.getConfig().getMessage("gang-joined").replace("%gang%", gang.getName())); - } - gang.getOnlinePlayers().stream().filter(player1 -> player1 != player).forEach(player1 -> PlayerUtils.sendMessage(player1, this.plugin.getConfig().getMessage("gang-player-joined").replace("%player%", player.getName()))); - return true; - } else { - return false; - } - } - - private List getGangInfoFormat(Gang g) { - List originalFormat = this.plugin.getConfig().getGangInfoFormat(); - List returnList = new ArrayList<>(); - - for (String s : originalFormat) { - returnList.add(s - .replace("%gang_top%", String.format("%,d", this.getGangTopPosition(g))) - .replace("%gang_value%", String.format("%,d", g.getValue())) - .replace("%gang%", TextUtils.applyColor(g.getName())) - .replace("%gang_owner%", g.getOwnerOffline().getName()) - .replace("%gang_members%", StringUtils.join(g.getMembersOffline().stream().map(OfflinePlayer::getName).toArray(), ", "))); - } - return returnList; - } - - public boolean sendGangInfo(Player p, OfflinePlayer target) { - Optional targetGang = this.getPlayerGang(target); - - if (!targetGang.isPresent()) { - PlayerUtils.sendMessage(p, this.plugin.getConfig().getMessage("gang-player-not-in-gang")); - return true; - } - - for (String s : this.getGangInfoFormat(targetGang.get())) { - PlayerUtils.sendMessage(p, s); - } - return true; - } - - public boolean sendGangInfo(Player p, String gangName) { - Optional targetGang = this.getGangWithName(gangName); - - if (!targetGang.isPresent()) { - PlayerUtils.sendMessage(p, this.plugin.getConfig().getMessage("gang-not-exists")); - return true; - } - - for (String s : this.getGangInfoFormat(targetGang.get())) { - PlayerUtils.sendMessage(p, s); - } - return true; - } - - public boolean hasGangChatEnabled(Player p) { - return this.gangChatEnabledPlayers.contains(p.getUniqueId()); - } - - public void disbandGang(Player player, Gang gang, boolean force) { - - if (!gang.isOwner(player) && !force) { - PlayerUtils.sendMessage(player, this.plugin.getConfig().getMessage("gang-not-owner")); - return; - } - - GangDisbandEvent gangDisbandEvent = new GangDisbandEvent(gang); - - this.plugin.getCore().debug("Calling GangDisbandEvent for gang " + gang.getName() + ".", this.plugin); - - Events.call(gangDisbandEvent); - - if (gangDisbandEvent.isCancelled()) { - this.plugin.getCore().debug("GangDisbandEvent for gang " + gang.getName() + " was cancelled.", this.plugin); - return; - } - - gang.disband(); - - this.gangs.remove(gang.getUuid()); - this.plugin.getGangsService().deleteGang(gang); - - Players.all().forEach(player1 -> PlayerUtils.sendMessage(player1, this.plugin.getConfig().getMessage("gang-disband-broadcast").replace("%gang%", gang.getName()).replace("%player%", player.getName()))); - } - - public boolean acceptInvite(Player player, Gang gang) { - - if (!gang.hasPendingInvite(player)) { - PlayerUtils.sendMessage(player, this.plugin.getConfig().getMessage("gang-no-invite-pending")); - return false; - } - - return joinGang(player, gang); - } - - public void sendHelpMenu(CommandSender sender) { - List gangHelpMenu = this.plugin.getConfig().getGangHelpMenu(); - gangHelpMenu.forEach(s -> PlayerUtils.sendMessage(sender, s)); - } - - public void sendAdminHelpMenu(CommandSender sender) { - List gangAdminHelpMenu = this.plugin.getConfig().getGangHelpMenu(); - gangAdminHelpMenu.forEach(s -> PlayerUtils.sendMessage(sender, s)); - } - - public int getGangTopPosition(Gang gang) { - if (!this.topGangs.contains(gang)) { - return -1; - } - return this.topGangs.indexOf(gang) + 1; - } - - public boolean removeFromGang(Player p, Gang gang, OfflinePlayer target) { - - if (!gang.isOwner(p)) { - PlayerUtils.sendMessage(p, this.plugin.getConfig().getMessage("gang-not-owner")); - return false; - } - - if (target == null) { - PlayerUtils.sendMessage(p, this.plugin.getConfig().getMessage("player-not-online")); - return false; - } - - this.kickPlayerFromGang(gang, target); - return true; - } - - public void kickPlayerFromGang(Gang gang, OfflinePlayer target) { - if (gang.kickPlayer(target)) { - gang.getOnlinePlayers().forEach(player -> PlayerUtils.sendMessage(player, this.plugin.getConfig().getMessage("gang-player-kicked").replace("%player%", target.getName()))); - if (target.isOnline()) { - PlayerUtils.sendMessage(target.getPlayer(), this.plugin.getConfig().getMessage("gang-kicked").replace("%gang%", gang.getName())); - } - } - } - - public boolean sendGangTop(CommandSender sender) { - List gangTopFormat = this.plugin.getConfig().getGangTopFormat(); - for (String s : gangTopFormat) { - if (s.startsWith("{FOR_EACH_GANG}")) { - String rawContent = s.replace("{FOR_EACH_GANG} ", ""); - for (int i = 0; i < 10; i++) { - try { - Gang gang = this.topGangs.get(i); - PlayerUtils.sendMessage(sender, rawContent.replace("%position%", String.valueOf(i + 1)).replace("%gang%", gang.getName()).replace("%value%", String.format("%,d", gang.getValue()))); - } catch (Exception e) { - break; - } - } - } else { - PlayerUtils.sendMessage(sender, s); - } - } - return true; - } - - public boolean forceAdd(CommandSender sender, Player target, Gang gang) { - - if (target == null) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("player-not-online")); - return false; - } - - Optional currentGang = this.getPlayerGang(target); - - if (currentGang.isPresent()) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-cant-invite")); - return false; - } - - return joinGang(target, gang); - } - - public boolean forceRemove(CommandSender sender, Player target) { - - if (target == null) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("player-not-online")); - return false; - } - - Optional currentGang = this.getPlayerGang(target); - - if (!currentGang.isPresent()) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-player-not-in-gang")); - return false; - } - - return leaveGang(target, GangLeaveReason.ADMIN); - } - - public boolean forceDisband(CommandSender sender, Gang gang) { - - if (sender instanceof Player) { - new DisbandGangAdminGUI(this.plugin, (Player) sender, gang).open(); - } else { - PlayerUtils.sendMessage(sender, "§cOnly for players."); - } - return true; - } - - public boolean forceRename(CommandSender sender, String oldName, String newName) { - - Optional targetGang = this.getGangWithName(oldName); - - if (!targetGang.isPresent()) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-not-exists")); - return true; - } - - Gang gang = targetGang.get(); - - gang.setName(newName); - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-force-rename").replace("%old_gang%", oldName).replace("%gang%", gang.getName())); - return true; - } - - public boolean toggleGangChat(Player p) { - - if (!getPlayerGang(p).isPresent()) { - PlayerUtils.sendMessage(p, this.plugin.getConfig().getMessage("not-in-gang")); - return false; - } - - if (this.gangChatEnabledPlayers.contains(p.getUniqueId())) { - this.gangChatEnabledPlayers.remove(p.getUniqueId()); - PlayerUtils.sendMessage(p, this.plugin.getConfig().getMessage("gang-chat-off")); - } else { - this.gangChatEnabledPlayers.add(p.getUniqueId()); - PlayerUtils.sendMessage(p, this.plugin.getConfig().getMessage("gang-chat-on")); - } - return true; - } - - public boolean modifyValue(CommandSender sender, Gang gang, long amount, String operation) { - - if (amount <= 0) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("invalid-value")); - return false; - } - - if (operation.equalsIgnoreCase("add")) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-value-add").replace("%value%", String.valueOf(amount)).replace("%gang%", gang.getName())); - gang.setValue(gang.getValue() + amount); - return true; - } else if (operation.equalsIgnoreCase("remove")) { - PlayerUtils.sendMessage(sender, this.plugin.getConfig().getMessage("gang-value-remove").replace("%value%", String.valueOf(amount)).replace("%gang%", gang.getName())); - gang.setValue(gang.getValue() - amount); - return true; - } else { - PlayerUtils.sendMessage(sender, "§cInvalid operation given."); - return false; - } - } - - public Collection getAllGangs() { - return this.gangs.values(); - } - - public void disable() { - this.saveDataOnDisable(); - } - - public void disableGangChat(Player player) { - this.gangChatEnabledPlayers.remove(player.getUniqueId()); - } - - public void updateGangTop(GangTopProvider provider) { - this.topGangs = provider.provide(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/model/Gang.java b/src/main/java/me/nvus/xprison/gangs/model/Gang.java deleted file mode 100644 index b632aeb..0000000 --- a/src/main/java/me/nvus/xprison/gangs/model/Gang.java +++ /dev/null @@ -1,170 +0,0 @@ -package me.nvus.xprison.gangs.model; - -import me.nvus.xprison.gangs.api.events.GangJoinEvent; -import me.nvus.xprison.gangs.api.events.GangLeaveEvent; -import me.nvus.xprison.gangs.enums.GangLeaveReason; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import me.lucko.helper.Events; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; - - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class Gang { - - private UUID uuid; - private UUID gangOwner; - private List gangMembers; - private List pendingInvites; - private String name; - private long value; - - public Gang(String name, UUID gangOwner) { - this.uuid = UUID.randomUUID(); - this.name = name; - this.gangOwner = gangOwner; - this.gangMembers = new ArrayList<>(); - this.pendingInvites = new ArrayList<>(); - } - - public boolean containsPlayer(OfflinePlayer p) { - return this.gangOwner.equals(p.getUniqueId()) || this.gangMembers.contains(p.getUniqueId()); - } - - public boolean isOwner(OfflinePlayer p) { - return this.gangOwner.equals(p.getUniqueId()); - } - - public boolean leavePlayer(OfflinePlayer p, GangLeaveReason reason) { - - if (!this.gangMembers.contains(p.getUniqueId())) { - return false; - } - - if (this.callGangLeaveEvent(p, reason)) { - return false; - } - - this.gangMembers.remove(p.getUniqueId()); - return true; - } - - public GangInvitation invitePlayer(Player invitedBy, Player player) { - GangInvitation invitation = getGangInvite(player); - - if (invitation != null) { - return invitation; - } - - invitation = new GangInvitation(this, player, invitedBy); - this.pendingInvites.add(invitation); - return invitation; - } - - private GangInvitation getGangInvite(OfflinePlayer player) { - for (GangInvitation gangInvitation : this.pendingInvites) { - if (gangInvitation.getInvitedPlayer().getUniqueId().equals(player.getUniqueId())) { - return gangInvitation; - } - } - return null; - } - - public boolean hasPendingInvite(Player player) { - return getGangInvite(player) != null; - } - - private boolean callGangLeaveEvent(OfflinePlayer p, GangLeaveReason reason) { - GangLeaveEvent event = new GangLeaveEvent(p, this, reason); - - Events.call(event); - - return event.isCancelled(); - } - - public boolean joinPlayer(OfflinePlayer p) { - - if (this.gangMembers.contains(p.getUniqueId())) { - return false; - } - - if (this.callGangJoinEvent(p)) { - return false; - } - - GangInvitation invitation = getGangInvite(p); - this.removeInvitation(invitation); - - this.gangMembers.add(p.getUniqueId()); - return true; - } - - private boolean callGangJoinEvent(OfflinePlayer p) { - GangJoinEvent event = new GangJoinEvent(p, this); - - Events.call(event); - - return event.isCancelled(); - } - - - public List getOnlinePlayers() { - return Players.all().stream().filter(this::containsPlayer).collect(Collectors.toList()); - } - - public List getMembersOffline() { - List returnList = new ArrayList<>(); - for (UUID uuid : this.gangMembers) { - returnList.add(Players.getOfflineNullable(uuid)); - } - return returnList; - } - - public OfflinePlayer getOwnerOffline() { - return Players.getOfflineNullable(this.gangOwner); - } - - public void disband() { - this.gangMembers.clear(); - this.gangOwner = null; - } - - public boolean kickPlayer(OfflinePlayer target) { - leavePlayer(target, GangLeaveReason.KICK); - return true; - } - - public List getPendingInvites() { - return pendingInvites; - } - - public void removeInvitation(GangInvitation invitation) { - this.pendingInvites.remove(invitation); - } - - public boolean canRenameGang(Player player) { - return isOwner(player); - } - - public boolean canManageMembers(Player player) { - return isOwner(player); - } - - public boolean canDisband(Player player) { - return isOwner(player); - } - - public boolean canManageInvites(Player player) { - return isOwner(player); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/model/GangInvitation.java b/src/main/java/me/nvus/xprison/gangs/model/GangInvitation.java deleted file mode 100644 index bdcf30c..0000000 --- a/src/main/java/me/nvus/xprison/gangs/model/GangInvitation.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.nvus.xprison.gangs.model; - -import lombok.Data; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -import java.util.Date; -import java.util.UUID; - -@Data -public class GangInvitation { - - private UUID uuid; - private Gang gang; - private OfflinePlayer invitedPlayer; - private OfflinePlayer invitedBy; - private Date inviteDate; - - public GangInvitation(Gang gang, OfflinePlayer invitedPlayer, Player invitedBy) { - this.uuid = UUID.randomUUID(); - this.gang = gang; - this.invitedPlayer = invitedPlayer; - this.invitedBy = invitedBy; - this.inviteDate = new Date(); - } - - public GangInvitation(UUID uuid, Gang gang, OfflinePlayer invitedPlayer, OfflinePlayer invitedBy, Date inviteDate) { - this.uuid = uuid; - this.gang = gang; - this.invitedPlayer = invitedPlayer; - this.invitedBy = invitedBy; - this.inviteDate = inviteDate; - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/model/GangTopByValueProvider.java b/src/main/java/me/nvus/xprison/gangs/model/GangTopByValueProvider.java deleted file mode 100644 index 20b3277..0000000 --- a/src/main/java/me/nvus/xprison/gangs/model/GangTopByValueProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.nvus.xprison.gangs.model; - -import me.nvus.xprison.gangs.managers.GangsManager; - -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -public final class GangTopByValueProvider implements GangTopProvider { - - private final GangsManager manager; - - public GangTopByValueProvider(GangsManager manager) { - this.manager = manager; - } - - @Override - public List provide() { - return getAllGangs().stream().sorted(Comparator.comparingLong(Gang::getValue).reversed()).collect(Collectors.toList()); - } - - private Collection getAllGangs() { - return manager.getAllGangs(); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/model/GangTopProvider.java b/src/main/java/me/nvus/xprison/gangs/model/GangTopProvider.java deleted file mode 100644 index e8d88c4..0000000 --- a/src/main/java/me/nvus/xprison/gangs/model/GangTopProvider.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.nvus.xprison.gangs.model; - -import java.util.List; - -public interface GangTopProvider { - List provide(); -} diff --git a/src/main/java/me/nvus/xprison/gangs/model/GangUpdateTopTask.java b/src/main/java/me/nvus/xprison/gangs/model/GangUpdateTopTask.java deleted file mode 100644 index fc665f2..0000000 --- a/src/main/java/me/nvus/xprison/gangs/model/GangUpdateTopTask.java +++ /dev/null @@ -1,37 +0,0 @@ -package me.nvus.xprison.gangs.model; - -import me.nvus.xprison.gangs.XPrisonGangs; -import me.lucko.helper.Schedulers; -import me.lucko.helper.scheduler.Task; - -import java.util.concurrent.TimeUnit; - -public final class GangUpdateTopTask implements Runnable { - - private final XPrisonGangs plugin; - private final GangTopProvider gangTopProvider; - - private Task task; - - public GangUpdateTopTask(XPrisonGangs plugin, GangTopProvider gangTopProvider) { - this.plugin = plugin; - this.gangTopProvider = gangTopProvider; - } - - @Override - public void run() { - this.plugin.getGangsManager().updateGangTop(gangTopProvider); - } - - public void start() { - this.stop(); - int delay = this.plugin.getConfig().getGangUpdateDelay(); - this.task = Schedulers.async().runRepeating(this, delay, TimeUnit.MINUTES, delay, TimeUnit.MINUTES); - } - - public void stop() { - if (this.task != null) { - this.task.stop(); - } - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/repo/GangsRepository.java b/src/main/java/me/nvus/xprison/gangs/repo/GangsRepository.java deleted file mode 100644 index 32d6317..0000000 --- a/src/main/java/me/nvus/xprison/gangs/repo/GangsRepository.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.nvus.xprison.gangs.repo; - -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.model.GangInvitation; - -import java.util.List; - -public interface GangsRepository { - - void updateGang(Gang g); - - void deleteGang(Gang g); - - void createGang(Gang g); - - List getAllGangs(); - - List getGangInvitations(Gang gang); - - void createGangInvitation(GangInvitation gangInvitation); - - void deleteGangInvitation(GangInvitation gangInvitation); - - void createTables(); - - void clearTableData(); -} diff --git a/src/main/java/me/nvus/xprison/gangs/repo/impl/GangsRepositoryImpl.java b/src/main/java/me/nvus/xprison/gangs/repo/impl/GangsRepositoryImpl.java deleted file mode 100644 index c0bd6ab..0000000 --- a/src/main/java/me/nvus/xprison/gangs/repo/impl/GangsRepositoryImpl.java +++ /dev/null @@ -1,178 +0,0 @@ -package me.nvus.xprison.gangs.repo.impl; - -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.database.model.SQLDatabaseType; -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.model.GangInvitation; -import me.nvus.xprison.gangs.repo.GangsRepository; -import me.lucko.helper.utils.Log; -import me.lucko.helper.utils.Players; -import org.apache.commons.lang.StringUtils; -import org.bukkit.OfflinePlayer; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.UUID; - -public class GangsRepositoryImpl implements GangsRepository { - - private static final String TABLE_NAME = "UltraPrison_Gangs"; - private static final String INVITES_TABLE_NAME = "UltraPrison_Gang_Invites"; - private static final String GANGS_UUID_COLNAME = "UUID"; - private static final String GANGS_NAME_COLNAME = "name"; - private static final String GANGS_OWNER_COLNAME = "owner"; - private static final String GANGS_MEMBERS_COLNAME = "members"; - private static final String GANGS_VALUE_COLNAME = "value"; - - private static final String GANG_INVITATION_UUID = "uuid"; - private static final String GANG_INVITATION_GANG_ID = "gang_id"; - private static final String GANG_INVITATION_INVITED_BY = "invited_by"; - private static final String GANG_INVITATION_INVITED_PLAYER = "invited_player"; - private static final String GANG_INVITATION_INVITE_DATE = "invite_date"; - - private final SQLDatabase database; - - public GangsRepositoryImpl(SQLDatabase database) { - this.database = database; - } - - @Override - public List getAllGangs() { - List returnList = new ArrayList<>(); - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con,"SELECT * FROM " + TABLE_NAME); ResultSet set = statement.executeQuery()) { - while (set.next()) { - Gang gang = new Gang(); - - UUID gangUUID = UUID.fromString(set.getString(GANGS_UUID_COLNAME)); - - if (gangUUID == null) { - gangUUID = UUID.randomUUID(); - } - - gang.setUuid(gangUUID); - - String gangName = set.getString(GANGS_NAME_COLNAME); - gang.setName(gangName); - - UUID owner = UUID.fromString(set.getString(GANGS_OWNER_COLNAME)); - gang.setGangOwner(owner); - - List members = new ArrayList<>(); - - for (String s : set.getString(GANGS_MEMBERS_COLNAME).split(",")) { - if (s.isEmpty()) { - continue; - } - try { - UUID uuid = UUID.fromString(s); - members.add(uuid); - } catch (Exception e) { - Log.warn("Unable to fetch UUID: " + s); - e.printStackTrace(); - } - } - gang.setGangMembers(members); - - long value = set.getLong(GANGS_VALUE_COLNAME); - gang.setValue(value); - List gangInvitations = getGangInvitations(gang); - gang.setPendingInvites(gangInvitations); - - returnList.add(gang); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return returnList; - } - - - @Override - public void createGang(Gang g) { - String sql = database.getDatabaseType() == SQLDatabaseType.SQLITE ? "INSERT OR IGNORE INTO " + TABLE_NAME + "(UUID,name,owner,members) VALUES(?,?,?,?)" : "INSERT IGNORE INTO " + TABLE_NAME + "(UUID,name,owner,members) VALUES(?,?,?,?)"; - this.database.executeSqlAsync(sql, g.getUuid().toString(), g.getName(), g.getGangOwner().toString(), ""); - } - - @Override - public void createGangInvitation(GangInvitation gangInvitation) { - this.database.executeSql("INSERT IGNORE INTO " + INVITES_TABLE_NAME + "(uuid,gang_id,invited_by,invited_player,invite_date) VALUES(?,?,?,?,?)", - gangInvitation.getUuid().toString(), - gangInvitation.getGang().getUuid().toString(), - gangInvitation.getInvitedBy().getUniqueId().toString(), - gangInvitation.getInvitedPlayer().getUniqueId().toString(), - gangInvitation.getInviteDate()); - } - - @Override - public void deleteGang(Gang g) { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME + " WHERE ?=?", GANGS_UUID_COLNAME, g.getUuid().toString()); - for (GangInvitation gangInvitation : g.getPendingInvites()) { - this.deleteGangInvitation(gangInvitation); - } - } - - - @Override - public List getGangInvitations(Gang gang) { - List returnList = new ArrayList<>(); - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con,"SELECT * FROM " + INVITES_TABLE_NAME + " WHERE ?=?")) { - statement.setString(1, GANG_INVITATION_GANG_ID); - statement.setString(2, gang.getUuid().toString()); - try (ResultSet set = statement.executeQuery()) { - while (set.next()) { - UUID uuid = UUID.fromString(set.getString(GANG_INVITATION_UUID)); - OfflinePlayer invitedPlayer = Players.getOfflineNullable(UUID.fromString(set.getString(GANG_INVITATION_INVITED_PLAYER))); - OfflinePlayer invitedBy = Players.getOfflineNullable(UUID.fromString(set.getString(GANG_INVITATION_INVITED_BY))); - Date inviteDate = set.getDate(GANG_INVITATION_INVITE_DATE); - GangInvitation invitation = new GangInvitation(uuid, gang, invitedPlayer, invitedBy, inviteDate); - returnList.add(invitation); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return returnList; - } - - @Override - public void deleteGangInvitation(GangInvitation gangInvitation) { - this.database.executeSqlAsync("DELETE FROM " + INVITES_TABLE_NAME + " WHERE ?=?", GANG_INVITATION_UUID, gangInvitation.getUuid().toString()); - } - - @Override - public void updateGang(Gang g) { - this.database.executeSql("UPDATE " + - TABLE_NAME + " SET " + - GANGS_MEMBERS_COLNAME + "=?," + - GANGS_NAME_COLNAME + "=?," + - GANGS_VALUE_COLNAME + "=? WHERE " + - GANGS_UUID_COLNAME + "=?", - StringUtils.join(g.getMembersOffline().stream().map(OfflinePlayer::getUniqueId).map(UUID::toString).toArray(), ","), - g.getName(), - g.getValue(), - g.getUuid().toString()); - - this.database.executeSql("DELETE FROM " + INVITES_TABLE_NAME + " WHERE ?=?", GANG_INVITATION_GANG_ID, g.getUuid().toString()); - - for (GangInvitation gangInvitation : g.getPendingInvites()) { - createGangInvitation(gangInvitation); - } - } - - @Override - public void createTables() { - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(UUID varchar(36) NOT NULL UNIQUE, name varchar(36) NOT NULL UNIQUE, owner varchar(36) NOT NULL, value bigint default 0, members text, primary key (UUID,name))"); - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + INVITES_TABLE_NAME + "(uuid varchar(36) NOT NULL, gang_id varchar(36) NOT NULL, invited_by varchar(36), invited_player varchar(36) not null, invite_date datetime not null, primary key(uuid))"); - } - - @Override - public void clearTableData() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME); - this.database.executeSqlAsync("DELETE FROM " + INVITES_TABLE_NAME); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/service/GangsService.java b/src/main/java/me/nvus/xprison/gangs/service/GangsService.java deleted file mode 100644 index fd59527..0000000 --- a/src/main/java/me/nvus/xprison/gangs/service/GangsService.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.nvus.xprison.gangs.service; - -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.model.GangInvitation; - -import java.util.List; - -public interface GangsService { - - void updateGang(Gang g); - - void deleteGang(Gang g); - - void createGang(Gang g); - - List getAllGangs(); - - List getGangInvitations(Gang gang); - - void createGangInvitation(GangInvitation gangInvitation); - - void deleteGangInvitation(GangInvitation gangInvitation); -} diff --git a/src/main/java/me/nvus/xprison/gangs/service/impl/GangsServiceImpl.java b/src/main/java/me/nvus/xprison/gangs/service/impl/GangsServiceImpl.java deleted file mode 100644 index 5e187b0..0000000 --- a/src/main/java/me/nvus/xprison/gangs/service/impl/GangsServiceImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.nvus.xprison.gangs.service.impl; - -import me.nvus.xprison.gangs.model.Gang; -import me.nvus.xprison.gangs.model.GangInvitation; -import me.nvus.xprison.gangs.repo.GangsRepository; -import me.nvus.xprison.gangs.service.GangsService; - -import java.util.List; - -public class GangsServiceImpl implements GangsService { - - private final GangsRepository repository; - - public GangsServiceImpl(GangsRepository repository) { - this.repository = repository; - } - - @Override - public void updateGang(Gang g) { - repository.updateGang(g); - } - - @Override - public void deleteGang(Gang g) { - repository.deleteGang(g); - } - - @Override - public void createGang(Gang g) { - repository.createGang(g); - } - - @Override - public List getAllGangs() { - return repository.getAllGangs(); - } - - @Override - public List getGangInvitations(Gang gang) { - return repository.getGangInvitations(gang); - } - - @Override - public void createGangInvitation(GangInvitation gangInvitation) { - repository.createGangInvitation(gangInvitation); - } - - @Override - public void deleteGangInvitation(GangInvitation gangInvitation) { - repository.deleteGangInvitation(gangInvitation); - } -} diff --git a/src/main/java/me/nvus/xprison/gangs/utils/GangsConstants.java b/src/main/java/me/nvus/xprison/gangs/utils/GangsConstants.java deleted file mode 100644 index feb95cf..0000000 --- a/src/main/java/me/nvus/xprison/gangs/utils/GangsConstants.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.nvus.xprison.gangs.utils; - -public class GangsConstants { - - public static final String GANGS_ADMIN_PERM = "xprison.gangs.admin"; - public static final String GANGS_CREATE_PERM = "xprison.gangs.create"; - - private GangsConstants() { - throw new UnsupportedOperationException("Cannot instantiate."); - } -} diff --git a/src/main/java/me/nvus/xprison/gems/XPrisonGems.java b/src/main/java/me/nvus/xprison/gems/XPrisonGems.java deleted file mode 100644 index 8c92ed4..0000000 --- a/src/main/java/me/nvus/xprison/gems/XPrisonGems.java +++ /dev/null @@ -1,159 +0,0 @@ -package me.nvus.xprison.gems; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.gems.api.XPrisonGemsAPI; -import me.nvus.xprison.gems.api.XPrisonGemsAPIImpl; -import me.nvus.xprison.gems.managers.CommandManager; -import me.nvus.xprison.gems.managers.GemsManager; -import me.nvus.xprison.gems.repo.GemsRepository; -import me.nvus.xprison.gems.repo.impl.GemsRepositoryImpl; -import me.nvus.xprison.gems.service.GemsService; -import me.nvus.xprison.gems.service.impl.GemsServiceImpl; -import me.nvus.xprison.utils.text.TextUtils; -import lombok.Getter; -import me.lucko.helper.Events; -import me.lucko.helper.reflect.MinecraftVersion; -import org.bukkit.event.Event; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.EquipmentSlot; - -import java.util.HashMap; - -public final class XPrisonGems implements XPrisonModule { - - public static final String MODULE_NAME = "Gems"; - public static final String GEMS_ADMIN_PERM = "xprison.gems.admin"; - - @Getter - private static XPrisonGems instance; - - @Getter - private FileManager.Config config; - - @Getter - private XPrisonGemsAPI api; - - @Getter - private GemsManager gemsManager; - @Getter - private final XPrison core; - - @Getter - private GemsRepository gemsRepository; - - @Getter - private GemsService gemsService; - - private HashMap messages; - - private boolean enabled; - private CommandManager commandManager; - - @Getter - private long commandCooldown; - - public XPrisonGems(XPrison XPrison) { - instance = this; - this.core = XPrison; - } - - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void reload() { - this.config.reload(); - - this.loadMessages(); - this.loadVariables(); - - this.gemsManager.reload(); - this.commandManager.reload(); - } - - @Override - public void enable() { - this.enabled = true; - this.config = this.core.getFileManager().getConfig("gems.yml").copyDefaults(true).save(); - - this.loadVariables(); - this.loadMessages(); - - this.gemsRepository = new GemsRepositoryImpl(this.core.getPluginDatabase()); - this.gemsRepository.createTables(); - this.gemsService = new GemsServiceImpl(this.gemsRepository); - this.gemsManager = new GemsManager(this); - this.commandManager = new CommandManager(this); - this.commandManager.enable(); - this.api = new XPrisonGemsAPIImpl(this.gemsManager); - - this.registerEvents(); - } - - private void loadVariables() { - this.commandCooldown = getConfig().get().getLong("gems-command-cooldown"); - } - - - @Override - public void disable() { - this.gemsManager.stopUpdating(); - this.gemsManager.savePlayerDataOnDisable(); - this.enabled = false; - } - - public static void saveGems() { - this.gemsManager.savePlayerDataOnDisable(); - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return true; - } - - @Override - public void resetPlayerData() { - this.gemsRepository.clearTableData(); - } - - private void registerEvents() { - Events.subscribe(PlayerInteractEvent.class, EventPriority.LOWEST) - .filter(e -> e.getItem() != null && e.getItem().getType() == this.gemsManager.getGemsItemMaterial() && (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.RIGHT_CLICK_AIR)) - .handler(e -> { - if (e.getItem().hasItemMeta()) { - e.setCancelled(true); - e.setUseInteractedBlock(Event.Result.DENY); - boolean offHandClick = false; - if (MinecraftVersion.getRuntimeVersion().isAfter(MinecraftVersion.of(1, 8, 9))) { - offHandClick = e.getHand() == EquipmentSlot.OFF_HAND; - } - this.gemsManager.redeemGems(e.getPlayer(), e.getItem(), e.getPlayer().isSneaking(), offHandClick); - } - }).bindWith(core); - } - - - private void loadMessages() { - this.messages = new HashMap<>(); - for (String key : this.getConfig().get().getConfigurationSection("messages").getKeys(false)) { - this.messages.put(key, TextUtils.applyColor(this.getConfig().get().getString("messages." + key))); - } - } - - public String getMessage(String key) { - return this.messages.get(key); - } -} - diff --git a/src/main/java/me/nvus/xprison/gems/api/XPrisonGemsAPI.java b/src/main/java/me/nvus/xprison/gems/api/XPrisonGemsAPI.java deleted file mode 100644 index 51916aa..0000000 --- a/src/main/java/me/nvus/xprison/gems/api/XPrisonGemsAPI.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.nvus.xprison.gems.api; - -import me.nvus.xprison.api.enums.ReceiveCause; -import org.bukkit.OfflinePlayer; - -public interface XPrisonGemsAPI { - - /** - * Method to get player gems - * - * @param p Player - * @return Player gems amount - */ - long getPlayerGems(OfflinePlayer p); - - /** - * Method to check if player has more or equal gems than specified amount - * - * @param p Player - * @param amount amount - * @return true if player has more or equal gems - */ - boolean hasEnough(OfflinePlayer p, long amount); - - /** - * Method to remove gems from player - * - * @param p Player - * @param amount amount - */ - void removeGems(OfflinePlayer p, long amount); - - /** - * Method to add gems to player - * - * @param p Player - * @param amount amount - * @param cause - Represents why player get these gemes - */ - void addGems(OfflinePlayer p, long amount, ReceiveCause cause); - - -} diff --git a/src/main/java/me/nvus/xprison/gems/api/XPrisonGemsAPIImpl.java b/src/main/java/me/nvus/xprison/gems/api/XPrisonGemsAPIImpl.java deleted file mode 100644 index ed65f18..0000000 --- a/src/main/java/me/nvus/xprison/gems/api/XPrisonGemsAPIImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.nvus.xprison.gems.api; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.gems.managers.GemsManager; -import org.bukkit.OfflinePlayer; - -public final class XPrisonGemsAPIImpl implements XPrisonGemsAPI { - - - private final GemsManager manager; - - public XPrisonGemsAPIImpl(GemsManager manager) { - this.manager = manager; - } - - @Override - public long getPlayerGems(OfflinePlayer p) { - return this.manager.getPlayerGems(p); - } - - @Override - public boolean hasEnough(OfflinePlayer p, long amount) { - return this.getPlayerGems(p) >= amount; - } - - @Override - public void removeGems(OfflinePlayer p, long amount) { - this.manager.removeGems(p, amount, null, LostCause.ADMIN); - } - - @Override - public void addGems(OfflinePlayer p, long amount, ReceiveCause cause) { - this.manager.giveGems(p, amount, null, cause); - } -} diff --git a/src/main/java/me/nvus/xprison/gems/api/events/PlayerGemsLostEvent.java b/src/main/java/me/nvus/xprison/gems/api/events/PlayerGemsLostEvent.java deleted file mode 100644 index aaed685..0000000 --- a/src/main/java/me/nvus/xprison/gems/api/events/PlayerGemsLostEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.nvus.xprison.gems.api.events; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.OfflinePlayer; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public final class PlayerGemsLostEvent extends XPrisonPlayerEvent { - - - private static final HandlerList handlers = new HandlerList(); - - @Getter - private final LostCause cause; - - @Getter - @Setter - private long amount; - - /** - * Called when player loses tokens - * - * @param cause LostCause - * @param player Player - * @param amount Amount of tokens lost - */ - public PlayerGemsLostEvent(LostCause cause, OfflinePlayer player, long amount) { - super(player); - this.cause = cause; - this.amount = amount; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public @NotNull HandlerList getHandlers() { - return handlers; - } - -} diff --git a/src/main/java/me/nvus/xprison/gems/api/events/PlayerGemsReceiveEvent.java b/src/main/java/me/nvus/xprison/gems/api/events/PlayerGemsReceiveEvent.java deleted file mode 100644 index aba1afd..0000000 --- a/src/main/java/me/nvus/xprison/gems/api/events/PlayerGemsReceiveEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.nvus.xprison.gems.api.events; - -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.OfflinePlayer; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class PlayerGemsReceiveEvent extends XPrisonPlayerEvent implements Cancellable { - - - private static final HandlerList handlers = new HandlerList(); - - @Getter - private final ReceiveCause cause; - @Getter - @Setter - private long amount; - - @Getter - @Setter - private boolean cancelled; - - /** - * Called when player receive gems - * - * @param cause ReceiveCause - * @param player Player - * @param amount Amount of gems received - */ - public PlayerGemsReceiveEvent(ReceiveCause cause, OfflinePlayer player, long amount) { - super(player); - this.cause = cause; - this.amount = amount; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - -} diff --git a/src/main/java/me/nvus/xprison/gems/commands/GemsCommand.java b/src/main/java/me/nvus/xprison/gems/commands/GemsCommand.java deleted file mode 100644 index aafd93d..0000000 --- a/src/main/java/me/nvus/xprison/gems/commands/GemsCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.nvus.xprison.gems.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.gems.managers.CommandManager; -import me.nvus.xprison.interfaces.Permissionable; -import lombok.Getter; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public abstract class GemsCommand implements Permissionable { - - protected static final String PERMISSION_ROOT = "xprison.gems.command."; - - @Getter - private final String name; - protected final CommandManager commandManager; - @Getter - private final String[] aliases; - - GemsCommand(CommandManager commandManager, String name, String... aliases) { - this.commandManager = commandManager; - this.name = name; - this.aliases = aliases; - } - - public abstract String execute(CommandSender sender, ImmutableList args); - - public abstract boolean canExecute(CommandSender sender); - - public abstract String getUsage(); - - @Override - public String getRequiredPermission() { - return PERMISSION_ROOT + this.name; - } - - public abstract List getTabComplete(List args); -} diff --git a/src/main/java/me/nvus/xprison/gems/commands/GemsGiveCommand.java b/src/main/java/me/nvus/xprison/gems/commands/GemsGiveCommand.java deleted file mode 100644 index b339b39..0000000 --- a/src/main/java/me/nvus/xprison/gems/commands/GemsGiveCommand.java +++ /dev/null @@ -1,61 +0,0 @@ -package me.nvus.xprison.gems.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.gems.managers.CommandManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class GemsGiveCommand extends GemsCommand { - - private static final String COMMAND_NAME = "give"; - - public GemsGiveCommand(CommandManager manager) { - super(manager, COMMAND_NAME); - } - - @Override - public String execute(CommandSender sender, ImmutableList args) { - - if (args.size() == 2) { - try { - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - long amount = Long.parseLong(args.get(1)); - this.commandManager.getPlugin().getGemsManager().giveGems(target, amount, sender, ReceiveCause.GIVE); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, this.commandManager.getPlugin().getMessage("not_a_number").replace("%input%", String.valueOf(args.get(1)))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonGems.GEMS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/gems give [player] [gems] - Gives gems to player."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/gems/commands/GemsHelpCommand.java b/src/main/java/me/nvus/xprison/gems/commands/GemsHelpCommand.java deleted file mode 100644 index 988b9ba..0000000 --- a/src/main/java/me/nvus/xprison/gems/commands/GemsHelpCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -package me.nvus.xprison.gems.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.gems.managers.CommandManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; - -import java.util.ArrayList; -import java.util.List; - -public final class GemsHelpCommand extends GemsCommand { - - private static final String COMMAND_NAME = "help"; - private static final String[] COMMAND_ALIASES = {"?"}; - - public GemsHelpCommand(CommandManager commandManager) { - super(commandManager, COMMAND_NAME, COMMAND_ALIASES); - } - - @Override - public String execute(CommandSender sender, ImmutableList args) { - if (args.isEmpty()) { - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - PlayerUtils.sendMessage(sender, "&e&lGEMS HELP MENU "); - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - for (GemsCommand command : this.commandManager.getAll()) { - if (command.canExecute(sender)) { - PlayerUtils.sendMessage(sender, "&e" + command.getUsage()); - } - } - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - return true; - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public String getUsage() { - return "/gems help - Displays all available commands."; - } - - @Override - public List getTabComplete(List args) { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gems/commands/GemsPayCommand.java b/src/main/java/me/nvus/xprison/gems/commands/GemsPayCommand.java deleted file mode 100644 index 663a0b9..0000000 --- a/src/main/java/me/nvus/xprison/gems/commands/GemsPayCommand.java +++ /dev/null @@ -1,77 +0,0 @@ -package me.nvus.xprison.gems.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.gems.managers.CommandManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class GemsPayCommand extends GemsCommand { - - private static final String COMMAND_NAME = "pay"; - private static final String[] COMMAND_ALIASES = {"send"}; - - public GemsPayCommand(CommandManager manager) { - super(manager, COMMAND_NAME, COMMAND_ALIASES); - } - - @Override - public String execute(CommandSender sender, ImmutableList args) { - if (args.size() == 2 && sender instanceof Player) { - Player p = (Player) sender; - try { - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - - if (!target.isOnline()) { - PlayerUtils.sendMessage(sender, this.commandManager.getPlugin().getMessage("player_not_online").replace("%player%", target.getName())); - return true; - } - - long amount = Long.parseLong(args.get(1).replace(",", "")); - - if (0 >= amount) { - return false; - } - - if (target.getUniqueId().equals(p.getUniqueId())) { - PlayerUtils.sendMessage(sender, this.commandManager.getPlugin().getMessage("gems_cant_send_to_yourself")); - return true; - } - - this.commandManager.getPlugin().getGemsManager().payGems(p, amount, target); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, this.commandManager.getPlugin().getMessage("not_a_number").replace("%input%", String.valueOf(args.get(1)))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonGems.GEMS_ADMIN_PERM) || sender.hasPermission(this.getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/gems pay [player] [amount] - Send gems to a player."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/gems/commands/GemsRemoveCommand.java b/src/main/java/me/nvus/xprison/gems/commands/GemsRemoveCommand.java deleted file mode 100644 index 0d83187..0000000 --- a/src/main/java/me/nvus/xprison/gems/commands/GemsRemoveCommand.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.nvus.xprison.gems.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.gems.managers.CommandManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class GemsRemoveCommand extends GemsCommand { - - private static final String COMMAND_NAME = "remove"; - private static final String[] COMMAND_ALIASES = {"subtract", "delete"}; - - public GemsRemoveCommand(CommandManager manager) { - super(manager, COMMAND_NAME, COMMAND_ALIASES); - } - - @Override - public String execute(CommandSender sender, ImmutableList args) { - - if (args.size() == 2) { - try { - long amount = Long.parseLong(args.get(1)); - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - this.commandManager.getPlugin().getGemsManager().removeGems(target, amount, sender, LostCause.ADMIN); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, this.commandManager.getPlugin().getMessage("not_a_number").replace("%input%", String.valueOf(args.get(0)))); - } - } - return false; - } - - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonGems.GEMS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/gems remove [player] [amount] - Remove gems from player."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/gems/commands/GemsSaveCommand.java b/src/main/java/me/nvus/xprison/gems/commands/GemsSaveCommand.java deleted file mode 100644 index 2d9049b..0000000 --- a/src/main/java/me/nvus/xprison/gems/commands/GemsSaveCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -package me.nvus.xprison.gems.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.gems.managers.CommandManager; -import me.lucko.helper.utils.Players; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import static me.nvus.xprison.gems.XPrisonGems.*; - -public final class GemsSaveCommand extends GemsCommand { - - private static final String COMMAND_NAME = "save"; - - public GemsSaveCommand(CommandManager manager) { - super(manager, COMMAND_NAME); - } - - @Override - public String execute(CommandSender sender, ImmutableList args) { - // MANUALLY SAVE GLOBAL PLAYER GEMS DATA TO DB (SQLITE/MYSQL) HERE. - XPrisonGems.saveGems(); - return "All gems data saved!"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(GEMS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/gems save - Saves ALL player gems."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/gems/commands/GemsSetCommand.java b/src/main/java/me/nvus/xprison/gems/commands/GemsSetCommand.java deleted file mode 100644 index 8a46bdf..0000000 --- a/src/main/java/me/nvus/xprison/gems/commands/GemsSetCommand.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.nvus.xprison.gems.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.gems.managers.CommandManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class GemsSetCommand extends GemsCommand { - - private static final String COMMAND_NAME = "set"; - - public GemsSetCommand(CommandManager manager) { - super(manager, COMMAND_NAME); - } - - @Override - public String execute(CommandSender sender, ImmutableList args) { - - if (args.size() == 2) { - try { - long amount = Long.parseLong(args.get(1)); - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - this.commandManager.getPlugin().getGemsManager().setGems(target, amount, sender); - return true; - } catch (Exception e) { - PlayerUtils.sendMessage(sender, this.commandManager.getPlugin().getMessage("not_a_number").replace("%input%", String.valueOf(args.get(0)))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonGems.GEMS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/gems set [player] [amount] - Sets player gems."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/gems/commands/GemsWithdrawCommand.java b/src/main/java/me/nvus/xprison/gems/commands/GemsWithdrawCommand.java deleted file mode 100644 index 5a7231a..0000000 --- a/src/main/java/me/nvus/xprison/gems/commands/GemsWithdrawCommand.java +++ /dev/null @@ -1,67 +0,0 @@ -package me.nvus.xprison.gems.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.gems.managers.CommandManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public final class GemsWithdrawCommand extends GemsCommand { - - private static final String COMMAND_NAME = "withdraw"; - - public GemsWithdrawCommand(CommandManager manager) { - super(manager, COMMAND_NAME); - } - - @Override - public String execute(CommandSender sender, ImmutableList args) { - if (args.size() == 2 && sender instanceof Player) { - Player p = (Player) sender; - try { - long amount = Long.parseLong(args.get(0)); - int value = Integer.parseInt(args.get(1)); - if (0 >= amount || 0 >= value) { - return false; - } - this.commandManager.getPlugin().getGemsManager().withdrawGems(p, amount, value); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, this.commandManager.getPlugin().getMessage("not_a_number").replace("%input%", args.get(0) + " or " + args.get(1))); - } - } else if (args.size() == 1 && sender instanceof Player) { - Player p = (Player) sender; - try { - long amount = Long.parseLong(args.get(0)); - int value = 1; - if (0 >= amount) { - return false; - } - this.commandManager.getPlugin().getGemsManager().withdrawGems(p, amount, value); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, this.commandManager.getPlugin().getMessage("not_a_number").replace("%input%", args.get(0) + " or " + args.get(1))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonGems.GEMS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/gems withdraw [amount] [value] - Withdraw gems to physical item."; - } - - @Override - public List getTabComplete(List args) { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/gems/managers/CommandManager.java b/src/main/java/me/nvus/xprison/gems/managers/CommandManager.java deleted file mode 100644 index 4d0b804..0000000 --- a/src/main/java/me/nvus/xprison/gems/managers/CommandManager.java +++ /dev/null @@ -1,159 +0,0 @@ -package me.nvus.xprison.gems.managers; - -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.gems.commands.*; -import me.nvus.xprison.utils.player.PlayerUtils; -import lombok.Getter; -import me.lucko.helper.Commands; -import me.lucko.helper.command.context.CommandContext; -import me.lucko.helper.cooldown.Cooldown; -import me.lucko.helper.cooldown.CooldownMap; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import static me.nvus.xprison.gems.XPrisonGems.GEMS_ADMIN_PERM; - - -public class CommandManager { - - @Getter - private final XPrisonGems plugin; - private final Set commands; - private CooldownMap gemsCommandCooldownMap; - private String[] gemsCommandAliases; - private String[] gemsTopCommandAliases; - private String[] gemsMessageCommandAliases; - - public CommandManager(XPrisonGems plugin) { - this.plugin = plugin; - this.commands = new HashSet<>(); - this.gemsCommandCooldownMap = CooldownMap.create(Cooldown.of(plugin.getCommandCooldown(), TimeUnit.SECONDS)); - } - - private boolean checkCommandCooldown(CommandSender sender) { - if (sender.hasPermission(GEMS_ADMIN_PERM)) { - return true; - } - if (!gemsCommandCooldownMap.test(sender)) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("cooldown").replace("%time%", String.format("%,d", this.gemsCommandCooldownMap.remainingTime(sender, TimeUnit.SECONDS)))); - return false; - } - return true; - } - - private void registerCommands() { - - this.commands.clear(); - - this.registerCommand(new GemsGiveCommand(this)); - this.registerCommand(new GemsPayCommand(this)); - this.registerCommand(new GemsRemoveCommand(this)); - this.registerCommand(new GemsSetCommand(this)); - this.registerCommand(new GemsWithdrawCommand(this)); - this.registerCommand(new GemsHelpCommand(this)); - - Commands.create() - .tabHandler(this::createTabHandler) - .handler(c -> { - if (c.args().size() == 0 && c.sender() instanceof Player) { - this.plugin.getGemsManager().sendInfoMessage(c.sender(), (OfflinePlayer) c.sender()); - return; - } - - GemsCommand subCommand = this.getCommand(c.rawArg(0)); - if (subCommand != null) { - if (subCommand.canExecute(c.sender())) { - subCommand.execute(c.sender(), c.args().subList(1, c.args().size())); - } else { - PlayerUtils.sendMessage(c.sender(), this.plugin.getMessage("no_permission")); - } - } else { - if (!checkCommandCooldown(c.sender())) { - return; - } - OfflinePlayer target = Players.getOfflineNullable(c.rawArg(0)); - this.plugin.getGemsManager().sendInfoMessage(c.sender(), target); - } - }) - .registerAndBind(this.plugin.getCore(), this.gemsCommandAliases); - Commands.create() - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getGemsManager().sendGemsTop(c.sender()); - } - }).registerAndBind(this.plugin.getCore(), this.gemsTopCommandAliases); - - // /gemsmessage - Commands.create() - .assertPlayer() - .handler(c -> this.plugin.getGemsManager().toggleGemsMessage(c.sender())).registerAndBind(this.plugin.getCore(), this.gemsMessageCommandAliases); - - } - - private List createTabHandler(CommandContext context) { - List returnList = this.commands.stream().map(GemsCommand::getName).collect(Collectors.toList()); - - GemsCommand subCommand = this.getCommand(context.rawArg(0)); - - if (subCommand != null) { - return subCommand.getTabComplete(context.args().subList(1, context.args().size())); - } - - return returnList; - } - - private void registerCommand(GemsCommand command) { - this.commands.add(command); - } - - private GemsCommand getCommand(String arg) { - for (GemsCommand command : this.commands) { - - if (command.getName().equalsIgnoreCase(arg)) { - return command; - } - - if (command.getAliases() == null) { - continue; - } - - for (String alias : command.getAliases()) { - if (alias.equalsIgnoreCase(arg)) { - return command; - } - } - } - return null; - } - - private void loadVariables() { - this.gemsCommandAliases = this.plugin.getConfig().get().getStringList("gems-command-aliases").toArray(new String[0]); - this.gemsTopCommandAliases = this.plugin.getConfig().get().getStringList("gems-top-command-aliases").toArray(new String[0]); - this.gemsMessageCommandAliases = this.plugin.getConfig().get().getStringList("gems-message-command-aliases").toArray(new String[0]); - } - - public Set getAll() { - return new HashSet<>(this.commands); - } - - public void reload() { - Map cooldownMap = this.gemsCommandCooldownMap.getAll(); - this.gemsCommandCooldownMap = CooldownMap.create(Cooldown.of(plugin.getCommandCooldown(), TimeUnit.SECONDS)); - cooldownMap.forEach((commandSender, cooldown) -> this.gemsCommandCooldownMap.put(commandSender, cooldown)); - this.loadVariables(); - } - - public void enable() { - this.loadVariables(); - this.registerCommands(); - } -} diff --git a/src/main/java/me/nvus/xprison/gems/managers/GemsManager.java b/src/main/java/me/nvus/xprison/gems/managers/GemsManager.java deleted file mode 100644 index bb356c4..0000000 --- a/src/main/java/me/nvus/xprison/gems/managers/GemsManager.java +++ /dev/null @@ -1,389 +0,0 @@ -package me.nvus.xprison.gems.managers; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.gems.api.events.PlayerGemsLostEvent; -import me.nvus.xprison.gems.api.events.PlayerGemsReceiveEvent; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.item.PrisonItem; -import me.nvus.xprison.utils.misc.NumberUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.scheduler.Task; -import me.lucko.helper.utils.Players; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -public class GemsManager { - - - private final XPrisonGems plugin; - private String SPACER_LINE; - private String SPACER_LINE_BOTTOM; - private String TOP_FORMAT_GEMS; - private final Map gemsCache = new ConcurrentHashMap<>(); - private Map top10Gems = new LinkedHashMap<>(); - private Task task; - private boolean updating; - private boolean displayGemsMessages; - - private String gemsItemDisplayName; - private ItemStack gemsItem; - private List gemsItemLore; - private final List gemsMessageOnPlayers; - - private long startingGems; - - public GemsManager(XPrisonGems plugin) { - this.plugin = plugin; - this.gemsMessageOnPlayers = new ArrayList<>(); - this.reload(); - - Events.subscribe(PlayerJoinEvent.class) - .handler(e -> { - this.addIntoTable(e.getPlayer()); - this.loadPlayerData(e.getPlayer()); - if (this.displayGemsMessages && hasOffGemsMessages(e.getPlayer())) { - this.gemsMessageOnPlayers.add(e.getPlayer().getUniqueId()); - } - }).bindWith(plugin.getCore()); - Events.subscribe(PlayerQuitEvent.class) - .handler(e -> { - this.savePlayerData(e.getPlayer(), true, true); - e.getPlayer().getActivePotionEffects().forEach(effect -> e.getPlayer().removePotionEffect(effect.getType())); - }).bindWith(plugin.getCore()); - - this.loadPlayerDataOnEnable(); - this.updateTop10(); - } - - public void reload() { - this.SPACER_LINE = plugin.getMessage("top_spacer_line"); - this.SPACER_LINE_BOTTOM = plugin.getMessage("top_spacer_line_bottom"); - this.TOP_FORMAT_GEMS = plugin.getMessage("top_format_gems"); - this.displayGemsMessages = plugin.getConfig().get().getBoolean("display-gems-messages"); - this.gemsItemDisplayName = plugin.getConfig().get().getString("gems.item.name"); - this.gemsItemLore = plugin.getConfig().get().getStringList("gems.item.lore"); - this.gemsItem = CompMaterial.fromString(plugin.getConfig().get().getString("gems.item.material")).toItem(); - this.startingGems = plugin.getConfig().get().getLong("starting-gems"); - } - - public void stopUpdating() { - this.plugin.getCore().debug("Stopping updating Top 10 - Gems", this.plugin); - task.close(); - } - - private void updateTop10() { - this.updating = true; - task = Schedulers.async().runRepeating(() -> { - this.updating = true; - Players.all().forEach(p -> savePlayerData(p, false, false)); - this.updateGemsTop(); - this.updating = false; - }, 1, TimeUnit.MINUTES, 1, TimeUnit.HOURS); - } - - private void savePlayerData(Player player, boolean removeFromCache, boolean async) { - if (async) { - Schedulers.async().run(() -> { - this.plugin.getGemsService().setGems(player, gemsCache.getOrDefault(player.getUniqueId(), 0L)); - if (removeFromCache) { - gemsCache.remove(player.getUniqueId()); - } - this.plugin.getCore().debug(String.format("Saved player %s gems to database.", player.getName()), this.plugin); - }); - } else { - this.plugin.getGemsService().setGems(player, gemsCache.getOrDefault(player.getUniqueId(), 0L)); - if (removeFromCache) { - gemsCache.remove(player.getUniqueId()); - } - this.plugin.getCore().debug(String.format("Saved player %s gems to database.", player.getName()), this.plugin); - } - } - - public void savePlayerDataOnDisable() { - for (UUID uuid : gemsCache.keySet()) { - this.plugin.getGemsService().setGems(Players.getOfflineNullable(uuid), gemsCache.getOrDefault(uuid, 0L)); - } - gemsCache.clear(); - this.plugin.getCore().getLogger().info("Saved online players gems."); - } - - private void addIntoTable(Player player) { - Schedulers.async().run(() -> { - this.plugin.getGemsService().createGems(player, startingGems); - }); - } - - private void loadPlayerDataOnEnable() { - Players.all().forEach(p -> loadPlayerData(p)); - } - - private void loadPlayerData(Player player) { - Schedulers.async().run(() -> { - long playerGems = this.plugin.getGemsService().getPlayerGems(player); - this.gemsCache.put(player.getUniqueId(), playerGems); - this.plugin.getCore().debug(String.format("Loaded gems of player %s from database", player.getName()), this.plugin); - }); - } - - public void setGems(OfflinePlayer p, long newAmount, CommandSender executor) { - Schedulers.async().run(() -> { - if (!p.isOnline()) { - this.plugin.getGemsService().setGems(p, newAmount); - } else { - gemsCache.put(p.getUniqueId(), newAmount); - } - PlayerUtils.sendMessage(executor, plugin.getMessage("admin_set_gems").replace("%player%", p.getName()).replace("%gems%", String.format("%,d", newAmount))); - }); - } - - public void giveGems(OfflinePlayer p, long amount, CommandSender executor, ReceiveCause cause) { - if (Bukkit.isPrimaryThread()) { - giveGemsSync(p, amount, executor, cause); - } else { - Schedulers.sync().run(() -> giveGemsSync(p, amount, executor, cause)); - } - } - - private void giveGemsSync(OfflinePlayer p, long amount, CommandSender executor, ReceiveCause cause) { - long currentGems = getPlayerGems(p); - - this.plugin.getCore().debug("XPrisonPlayerGemsReceiveEvent :: Player Gems :: " + currentGems, this.plugin); - - long finalAmount = this.callGemsReceiveEvent(cause, p, amount); - - this.plugin.getCore().debug("XPrisonPlayerGemsReceiveEvent :: Final amount :: " + finalAmount, this.plugin); - - long newAmount; - - if (NumberUtils.wouldAdditionBeOverMaxLong(currentGems, finalAmount)) { - newAmount = Long.MAX_VALUE; - } else { - newAmount = currentGems + finalAmount; - } - - if (!p.isOnline()) { - Schedulers.async().run(() -> this.plugin.getGemsService().setGems(p, newAmount)); - } else { - gemsCache.put(p.getUniqueId(), newAmount); - if (executor instanceof ConsoleCommandSender && !this.hasOffGemsMessages(p.getPlayer())) { - PlayerUtils.sendMessage(p.getPlayer(), plugin.getMessage("gems_received_console").replace("%gems%", String.format("%,d", finalAmount)).replace("%player%", executor == null ? "Console" : executor.getName())); - } else if (cause == ReceiveCause.MINING && !this.hasOffGemsMessages(p.getPlayer())) { - PlayerUtils.sendMessage(p.getPlayer(), this.plugin.getMessage("gems_received_mining").replace("%amount%", String.format("%,d", finalAmount))); - } - } - - this.plugin.getCore().debug("XPrisonPlayerGemsReceiveEvent :: Player gems final :: " + this.gemsCache.getOrDefault(p.getUniqueId(), 0L), this.plugin); - - if (executor != null && !(executor instanceof ConsoleCommandSender)) { - PlayerUtils.sendMessage(executor, plugin.getMessage("admin_give_gems").replace("%player%", p.getName()).replace("%gems%", String.format("%,d", finalAmount))); - } - - } - - private long callGemsReceiveEvent(ReceiveCause cause, OfflinePlayer p, long amount) { - PlayerGemsReceiveEvent event = new PlayerGemsReceiveEvent(cause, p, amount); - - Events.call(event); - - if (event.isCancelled()) { - return amount; - } - - return event.getAmount(); - } - - public void redeemGems(Player p, ItemStack item, boolean shiftClick, boolean offhand) { - final Long gemsAmount = new PrisonItem(item).getGems(); - if (gemsAmount == null) { - PlayerUtils.sendMessage(p, plugin.getMessage("not_gems_item")); - return; - } - int itemAmount = item.getAmount(); - if (shiftClick) { - if (offhand) { - p.getInventory().setItemInOffHand(null); - } else { - p.setItemInHand(null); - } - this.giveGems(p, gemsAmount * itemAmount, null, ReceiveCause.REDEEM); - PlayerUtils.sendMessage(p, plugin.getMessage("gems_redeem").replace("%gems%", String.format("%,d", gemsAmount * itemAmount))); - } else { - this.giveGems(p, gemsAmount, null, ReceiveCause.REDEEM); - if (item.getAmount() == 1) { - if (offhand) { - p.getInventory().setItemInOffHand(null); - } else { - p.setItemInHand(null); - } - } else { - item.setAmount(item.getAmount() - 1); - } - PlayerUtils.sendMessage(p, plugin.getMessage("gems_redeem").replace("%gems%", String.format("%,d", gemsAmount))); - } - } - - public void payGems(Player executor, long amount, OfflinePlayer target) { - Schedulers.async().run(() -> { - if (getPlayerGems(executor) >= amount) { - this.removeGems(executor, amount, null, LostCause.PAY); - this.giveGems(target, amount, null, ReceiveCause.PAY); - PlayerUtils.sendMessage(executor, plugin.getMessage("gems_send").replace("%player%", target.getName()).replace("%gems%", String.format("%,d", amount))); - if (target.isOnline()) { - PlayerUtils.sendMessage((CommandSender) target, plugin.getMessage("gems_received").replace("%player%", executor.getName()).replace("%gems%", String.format("%,d", amount))); - } - } else { - PlayerUtils.sendMessage(executor, plugin.getMessage("not_enough_gems")); - } - }); - } - - public void withdrawGems(Player executor, long amount, int value) { - Schedulers.async().run(() -> { - long totalAmount = amount * value; - - if (this.getPlayerGems(executor) < totalAmount) { - PlayerUtils.sendMessage(executor, plugin.getMessage("not_enough_gems")); - return; - } - - removeGems(executor, totalAmount, null, LostCause.WITHDRAW); - - ItemStack item = createGemsItem(amount, value); - Collection notFit = executor.getInventory().addItem(item).values(); - - if (!notFit.isEmpty()) { - notFit.forEach(itemStack -> { - this.giveGems(executor, amount * item.getAmount(), null, ReceiveCause.REDEEM); - }); - } - - PlayerUtils.sendMessage(executor, plugin.getMessage("withdraw_successful").replace("%amount%", String.format("%,d", amount)).replace("%value%", String.format("%,d", value))); - }); - } - - public synchronized long getPlayerGems(OfflinePlayer p) { - if (!p.isOnline()) { - return this.plugin.getGemsService().getPlayerGems(p); - } else { - return gemsCache.getOrDefault(p.getUniqueId(), (long) 0); - } - } - - public void removeGems(OfflinePlayer p, long amount, CommandSender executor, LostCause cause) { - Schedulers.async().run(() -> { - long currentgems = getPlayerGems(p); - long finalgems = currentgems - amount; - - if (finalgems < 0) { - finalgems = 0; - } - - this.callGemsLostEvent(cause, p, amount); - - if (!p.isOnline()) { - this.plugin.getGemsService().setGems(p, finalgems); - } else { - gemsCache.put(p.getUniqueId(), finalgems); - } - if (executor != null) { - PlayerUtils.sendMessage(executor, plugin.getMessage("admin_remove_gems").replace("%player%", p.getName()).replace("%gems%", String.format("%,d", amount))); - } - }); - } - - private void callGemsLostEvent(LostCause cause, OfflinePlayer p, long amount) { - PlayerGemsLostEvent event = new PlayerGemsLostEvent(cause, p, amount); - Events.callSync(event); - } - - private ItemStack createGemsItem(long amount, int value) { - ItemStack item = ItemStackBuilder.of(this.gemsItem.clone()).amount(value).name(this.gemsItemDisplayName.replace("%amount%", String.format("%,d", amount)).replace("%tokens%", String.format("%,d", amount))).lore(this.gemsItemLore).enchant(Enchantment.PROTECTION_ENVIRONMENTAL).flag(ItemFlag.HIDE_ENCHANTS).build(); - final PrisonItem prisonItem = new PrisonItem(item); - prisonItem.setGems(amount); - prisonItem.load(); - return item; - } - - public void sendInfoMessage(CommandSender sender, OfflinePlayer target) { - Schedulers.async().run(() -> { - if (sender == target) { - PlayerUtils.sendMessage(sender, plugin.getMessage("your_gems").replace("%gems%", String.format("%,d", this.getPlayerGems(target)))); - } else { - PlayerUtils.sendMessage(sender, plugin.getMessage("other_gems").replace("%gems%", String.format("%,d", this.getPlayerGems(target))).replace("%player%", target.getName())); - } - }); - } - - - private void updateGemsTop() { - top10Gems = new LinkedHashMap<>(); - this.plugin.getCore().debug("Starting updating Top 10 - Gems", this.plugin); - this.top10Gems = this.plugin.getGemsService().getTopGems(10); - this.plugin.getCore().debug("GemsTop updated!", this.plugin); - } - - public void sendGemsTop(CommandSender sender) { - Schedulers.async().run(() -> { - PlayerUtils.sendMessage(sender, SPACER_LINE); - if (this.updating) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("top_updating")); - PlayerUtils.sendMessage(sender, SPACER_LINE_BOTTOM); - return; - } - for (int i = 0; i < 10; i++) { - try { - UUID uuid = (UUID) top10Gems.keySet().toArray()[i]; - OfflinePlayer player = Players.getOfflineNullable(uuid); - String name; - if (player.getName() == null) { - name = "Unknown Player"; - } else { - name = player.getName(); - } - long gems = top10Gems.get(uuid); - PlayerUtils.sendMessage(sender, TOP_FORMAT_GEMS.replace("%position%", String.valueOf(i + 1)).replace("%player%", name).replace("%amount%", String.format("%,d", gems))); - } catch (ArrayIndexOutOfBoundsException e) { - break; - } - } - PlayerUtils.sendMessage(sender, SPACER_LINE_BOTTOM); - }); - } - - - public void toggleGemsMessage(Player p) { - if (this.gemsMessageOnPlayers.contains(p.getUniqueId())) { - PlayerUtils.sendMessage(p, plugin.getMessage("gems_message_disabled")); - this.gemsMessageOnPlayers.remove(p.getUniqueId()); - } else { - PlayerUtils.sendMessage(p, plugin.getMessage("gems_message_enabled")); - this.gemsMessageOnPlayers.add(p.getUniqueId()); - } - } - - public boolean hasOffGemsMessages(Player p) { - return !this.gemsMessageOnPlayers.contains(p.getUniqueId()); - } - - public Material getGemsItemMaterial() { - return this.gemsItem.getType(); - } -} diff --git a/src/main/java/me/nvus/xprison/gems/repo/GemsRepository.java b/src/main/java/me/nvus/xprison/gems/repo/GemsRepository.java deleted file mode 100644 index 3794fda..0000000 --- a/src/main/java/me/nvus/xprison/gems/repo/GemsRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.nvus.xprison.gems.repo; - -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public interface GemsRepository { - - long getPlayerGems(OfflinePlayer player); - - void updateGems(OfflinePlayer player, long newAmount); - - Map getTopGems(int amountOfRecords); - - void addIntoGems(OfflinePlayer player, long startingGems); - - void createTables(); - - void clearTableData(); -} diff --git a/src/main/java/me/nvus/xprison/gems/repo/impl/GemsRepositoryImpl.java b/src/main/java/me/nvus/xprison/gems/repo/impl/GemsRepositoryImpl.java deleted file mode 100644 index 1279e03..0000000 --- a/src/main/java/me/nvus/xprison/gems/repo/impl/GemsRepositoryImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.nvus.xprison.gems.repo.impl; - -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.database.model.SQLDatabaseType; -import me.nvus.xprison.gems.repo.GemsRepository; -import org.bukkit.OfflinePlayer; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; - -public class GemsRepositoryImpl implements GemsRepository { - - private static final String TABLE_NAME = "UltraPrison_Gems"; - private static final String GEMS_UUID_COLNAME = "UUID"; - private static final String GEMS_GEMS_COLNAME = "Gems"; - - private final SQLDatabase database; - - public GemsRepositoryImpl(SQLDatabase database) { - this.database = database; - } - - @Override - public long getPlayerGems(OfflinePlayer p) { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con,"SELECT * FROM " + TABLE_NAME + " WHERE " + GEMS_UUID_COLNAME + "=?")) { - statement.setString(1, p.getUniqueId().toString()); - try (ResultSet set = statement.executeQuery()) { - if (set.next()) { - return set.getLong(GEMS_GEMS_COLNAME); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; - } - - @Override - public void updateGems(OfflinePlayer p, long newAmount) { - this.database.executeSql("UPDATE " + TABLE_NAME + " SET " + GEMS_GEMS_COLNAME + "=? WHERE " + GEMS_UUID_COLNAME + "=?", newAmount, p.getUniqueId().toString()); - } - - @Override - public Map getTopGems(int amountOfRecords) { - Map topGems = new LinkedHashMap<>(); - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con,"SELECT " + GEMS_UUID_COLNAME + "," + GEMS_GEMS_COLNAME + " FROM " + TABLE_NAME + " ORDER BY " + GEMS_GEMS_COLNAME + " DESC LIMIT " + amountOfRecords); ResultSet set = statement.executeQuery()) { - while (set.next()) { - topGems.put(UUID.fromString(set.getString(GEMS_UUID_COLNAME)), set.getLong(GEMS_GEMS_COLNAME)); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return topGems; - } - - @Override - public void addIntoGems(OfflinePlayer player, long startingGems) { - String sql = this.database.getDatabaseType() == SQLDatabaseType.SQLITE ? "INSERT OR IGNORE INTO " + TABLE_NAME + " VALUES(?,?)" : "INSERT IGNORE INTO " + TABLE_NAME + " VALUES(?,?)"; - this.database.executeSql(sql, player.getUniqueId().toString(), startingGems); - } - - @Override - public void createTables() { - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(UUID varchar(36) NOT NULL UNIQUE, Gems bigint, primary key (UUID))"); - } - - @Override - public void clearTableData() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME); - } -} diff --git a/src/main/java/me/nvus/xprison/gems/service/GemsService.java b/src/main/java/me/nvus/xprison/gems/service/GemsService.java deleted file mode 100644 index 3e3fe31..0000000 --- a/src/main/java/me/nvus/xprison/gems/service/GemsService.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.nvus.xprison.gems.service; - -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public interface GemsService { - - long getPlayerGems(OfflinePlayer player); - - void setGems(OfflinePlayer player, long newAmount); - - Map getTopGems(int amountOfRecords); - - void createGems(OfflinePlayer player, long startingGems); -} diff --git a/src/main/java/me/nvus/xprison/gems/service/impl/GemsServiceImpl.java b/src/main/java/me/nvus/xprison/gems/service/impl/GemsServiceImpl.java deleted file mode 100644 index 1324717..0000000 --- a/src/main/java/me/nvus/xprison/gems/service/impl/GemsServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package me.nvus.xprison.gems.service.impl; - -import me.nvus.xprison.gems.repo.GemsRepository; -import me.nvus.xprison.gems.service.GemsService; -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public class GemsServiceImpl implements GemsService { - - private final GemsRepository repository; - - public GemsServiceImpl(GemsRepository repository) { - this.repository = repository; - } - - @Override - public long getPlayerGems(OfflinePlayer player) { - return repository.getPlayerGems(player); - } - - @Override - public void setGems(OfflinePlayer player, long newAmount) { - repository.updateGems(player, newAmount); - } - - @Override - public Map getTopGems(int amountOfRecords) { - return repository.getTopGems(amountOfRecords); - } - - @Override - public void createGems(OfflinePlayer player, long startingGems) { - repository.addIntoGems(player, startingGems); - } -} diff --git a/src/main/java/me/nvus/xprison/history/XPrisonHistory.java b/src/main/java/me/nvus/xprison/history/XPrisonHistory.java deleted file mode 100644 index 4e7b724..0000000 --- a/src/main/java/me/nvus/xprison/history/XPrisonHistory.java +++ /dev/null @@ -1,181 +0,0 @@ -package me.nvus.xprison.history; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.autominer.api.events.PlayerAutoMinerTimeModifyEvent; -import me.nvus.xprison.autominer.api.events.PlayerAutomineEvent; -import me.nvus.xprison.gangs.api.events.GangCreateEvent; -import me.nvus.xprison.gangs.api.events.GangDisbandEvent; -import me.nvus.xprison.gangs.api.events.GangJoinEvent; -import me.nvus.xprison.gangs.api.events.GangLeaveEvent; -import me.nvus.xprison.gems.api.events.PlayerGemsLostEvent; -import me.nvus.xprison.gems.api.events.PlayerGemsReceiveEvent; -import me.nvus.xprison.history.api.XPrisonHistoryAPI; -import me.nvus.xprison.history.api.XPrisonHistoryAPIImpl; -import me.nvus.xprison.history.gui.PlayerHistoryGUI; -import me.nvus.xprison.history.manager.HistoryManager; -import me.nvus.xprison.history.repo.HistoryRepository; -import me.nvus.xprison.history.repo.impl.HistoryRepositoryImpl; -import me.nvus.xprison.history.service.HistoryService; -import me.nvus.xprison.history.service.impl.HistoryServiceImpl; -import me.nvus.xprison.multipliers.api.events.PlayerMultiplierReceiveEvent; -import me.nvus.xprison.prestiges.api.events.PlayerPrestigeEvent; -import me.nvus.xprison.ranks.api.events.PlayerRankUpEvent; -import me.nvus.xprison.tokens.api.events.PlayerTokensLostEvent; -import me.nvus.xprison.tokens.api.events.PlayerTokensReceiveEvent; -import me.nvus.xprison.utils.misc.TimeUtil; -import me.nvus.xprison.utils.player.PlayerUtils; -import lombok.Getter; -import me.lucko.helper.Commands; -import me.lucko.helper.Events; -import me.lucko.helper.event.filter.EventFilters; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.EventPriority; - -public final class XPrisonHistory implements XPrisonModule { - - private static final String MODULE_NAME = "History"; - @Getter - private final XPrison core; - - @Getter - private HistoryManager historyManager; - - @Getter - private HistoryRepository historyRepository; - - @Getter - private HistoryService historyService; - - @Getter - private XPrisonHistoryAPI api; - - private boolean enabled; - - public XPrisonHistory(XPrison core) { - this.core = core; - this.enabled = false; - } - - @Override - public void enable() { - this.enabled = true; - this.historyRepository = new HistoryRepositoryImpl(this.core.getPluginDatabase()); - this.historyRepository.createTables(); - this.historyService = new HistoryServiceImpl(this.historyRepository); - this.historyManager = new HistoryManager(this); - this.api = new XPrisonHistoryAPIImpl(this); - this.registerCommands(); - this.registerEvents(); - } - - private void registerEvents() { - Events.subscribe(PlayerGemsReceiveEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getGems(), String.format("&a&l+%,d GEMS &f(%s). &7Current Gems: &e%,d", e.getAmount(), e.getCause().name(), this.core.getGems().getApi().getPlayerGems(e.getPlayer()))); - }).bindWith(this.core); - Events.subscribe(PlayerGemsLostEvent.class, EventPriority.MONITOR) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getGems(), String.format("&c&l-%,d GEMS &f(%s). &7Current Gems: &e%,d", e.getAmount(), e.getCause().name(), this.core.getTokens().getApi().getPlayerTokens(e.getPlayer()))); - }).bindWith(this.core); - Events.subscribe(PlayerTokensReceiveEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getTokens(), String.format("&a&l+%,d TOKENS &f(%s).&7Current Tokens: &e%,d", e.getAmount(), e.getCause().name(), this.core.getTokens().getApi().getPlayerTokens(e.getPlayer()))); - }).bindWith(this.core); - Events.subscribe(PlayerTokensLostEvent.class, EventPriority.MONITOR) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getTokens(), String.format("&c&l-%,d TOKENS &f(%s).&7Current Tokens: &e%,d", e.getAmount(), e.getCause().name(), this.core.getTokens().getApi().getPlayerTokens(e.getPlayer()))); - }).bindWith(this.core); - Events.subscribe(PlayerRankUpEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getRanks(), String.format("Rank Up: %s&r -> %s", e.getOldRank().getPrefix(), e.getNewRank().getPrefix())); - }).bindWith(this.core); - Events.subscribe(PlayerPrestigeEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getPrestiges(), String.format("Prestige Up: %s&r -> %s", e.getOldPrestige().getPrefix(), e.getNewPrestige().getPrefix())); - }).bindWith(this.core); - Events.subscribe(GangLeaveEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getGangs(), String.format("Left Gang: &e%s", e.getGang().getName())); - }).bindWith(this.core); - Events.subscribe(GangJoinEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getGangs(), String.format("Joined Gang: &e%s", e.getGang().getName())); - }).bindWith(this.core); - Events.subscribe(GangCreateEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - if (e.getCreator() instanceof Player) { - this.historyManager.createPlayerHistoryLine((OfflinePlayer) e.getCreator(), this.core.getGangs(), String.format("Created Gang: &e%s", e.getGang().getName())); - } - }).bindWith(this.core); - Events.subscribe(GangDisbandEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getGang().getOwnerOffline(), this.core.getGangs(), String.format("Disbanded Gang: &e%s", e.getGang().getName())); - }).bindWith(this.core); - Events.subscribe(PlayerMultiplierReceiveEvent.class, EventPriority.MONITOR) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getMultipliers(), String.format("Received x%,.2f %s Multiplier for %,d %s", e.getMultiplier(), e.getType(), e.getDuration(), e.getTimeUnit().name())); - }).bindWith(this.core); - Events.subscribe(PlayerAutomineEvent.class, EventPriority.MONITOR) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getAutoMiner(), String.format("Player is Auto-Mining. Time left: %s", TimeUtil.getTime(e.getTimeLeft() - 1))); - }).bindWith(this.core); - Events.subscribe(PlayerAutoMinerTimeModifyEvent.class, EventPriority.MONITOR) - .handler(e -> { - this.historyManager.createPlayerHistoryLine(e.getPlayer(), this.core.getAutoMiner(), String.format("Received %,d %s of Auto-Miner time.", e.getDuration(), e.getTimeUnit().name())); - }).bindWith(this.core); - } - - private void registerCommands() { - Commands.create() - .assertPermission("xprison.history") - .assertPlayer() - .handler(c -> { - if (c.args().size() != 1) { - PlayerUtils.sendMessage(c.sender(),"&c/history "); - return; - } - OfflinePlayer target = c.arg(0).parseOrFail(OfflinePlayer.class); - new PlayerHistoryGUI(c.sender(), target, this).open(); - }).registerAndBind(this.core, "history"); - } - - @Override - public void disable() { - this.enabled = false; - } - - @Override - public void reload() { - } - - @Override - public boolean isEnabled() { - return this.enabled; - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return false; - } - - @Override - public void resetPlayerData() { - this.historyRepository.clearTableData(); - } -} diff --git a/src/main/java/me/nvus/xprison/history/api/XPrisonHistoryAPI.java b/src/main/java/me/nvus/xprison/history/api/XPrisonHistoryAPI.java deleted file mode 100644 index f23368d..0000000 --- a/src/main/java/me/nvus/xprison/history/api/XPrisonHistoryAPI.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.nvus.xprison.history.api; - -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.history.model.HistoryLine; -import org.bukkit.OfflinePlayer; - -import java.util.List; - -public interface XPrisonHistoryAPI { - - /** - * Gets players history - * - * @param player Player - * @return List containing all HistoryLine.class of Player - */ - List getPlayerHistory(OfflinePlayer player); - - /** - * Creates a new history line for player - * - * @param player Player - * @param context Context of the history - * @param module XPrisonModule associated with the history - */ - void createHistoryLine(OfflinePlayer player, XPrisonModule module, String context); -} diff --git a/src/main/java/me/nvus/xprison/history/api/XPrisonHistoryAPIImpl.java b/src/main/java/me/nvus/xprison/history/api/XPrisonHistoryAPIImpl.java deleted file mode 100644 index b566245..0000000 --- a/src/main/java/me/nvus/xprison/history/api/XPrisonHistoryAPIImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.nvus.xprison.history.api; - -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.history.XPrisonHistory; -import me.nvus.xprison.history.model.HistoryLine; -import org.bukkit.OfflinePlayer; - -import java.util.List; - -public final class XPrisonHistoryAPIImpl implements XPrisonHistoryAPI { - - private final XPrisonHistory plugin; - - public XPrisonHistoryAPIImpl(XPrisonHistory plugin) { - this.plugin = plugin; - } - - @Override - public List getPlayerHistory(OfflinePlayer player) { - return this.plugin.getHistoryManager().getPlayerHistory(player); - } - - @Override - public void createHistoryLine(OfflinePlayer player, XPrisonModule module, String context) { - this.plugin.getHistoryManager().createPlayerHistoryLine(player, module, context); - } -} diff --git a/src/main/java/me/nvus/xprison/history/gui/PlayerHistoryFilterGUI.java b/src/main/java/me/nvus/xprison/history/gui/PlayerHistoryFilterGUI.java deleted file mode 100644 index 9980c55..0000000 --- a/src/main/java/me/nvus/xprison/history/gui/PlayerHistoryFilterGUI.java +++ /dev/null @@ -1,69 +0,0 @@ -package me.nvus.xprison.history.gui; - -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.history.XPrisonHistory; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -public class PlayerHistoryFilterGUI extends Gui { - - private static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("100000001") - .mask("100000001") - .mask("011111110"); - - private static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - private final OfflinePlayer target; - private final XPrisonHistory plugin; - - public PlayerHistoryFilterGUI(Player player, OfflinePlayer target, XPrisonHistory plugin) { - super(player, 4, "History Filter"); - this.target = target; - this.plugin = plugin; - } - - @Override - public void redraw() { - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - for (XPrisonModule module : this.plugin.getCore().getModules()) { - if (!module.isHistoryEnabled()) { - continue; - } - this.addItem(ItemStackBuilder.of(CompMaterial.HOPPER.toItem()).name("&e" + module.getName()).lore("&7Show only history related to this module.").build(() -> { - this.close(); - this.plugin.getHistoryManager().openPlayerHistoryGui(this.getPlayer(), this.target, historyLine -> historyLine.getModule().equalsIgnoreCase(module.getName())); - })); - } - this.setItem(27, ItemStackBuilder.of(Material.ARROW).name("&c&lBack").lore("&7Click to go back.").build(() -> { - this.close(); - new PlayerHistoryGUI(this.getPlayer(), this.target, this.plugin).open(); - })); - - } - } -} diff --git a/src/main/java/me/nvus/xprison/history/gui/PlayerHistoryGUI.java b/src/main/java/me/nvus/xprison/history/gui/PlayerHistoryGUI.java deleted file mode 100644 index 8fa975c..0000000 --- a/src/main/java/me/nvus/xprison/history/gui/PlayerHistoryGUI.java +++ /dev/null @@ -1,82 +0,0 @@ -package me.nvus.xprison.history.gui; - -import me.nvus.xprison.history.XPrisonHistory; -import me.nvus.xprison.history.gui.confirmation.PlayerClearHistoryConfirmationGUI; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -import java.util.Arrays; - -public class PlayerHistoryGUI extends Gui { - - private static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - private static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - private final OfflinePlayer target; - private final XPrisonHistory plugin; - - public PlayerHistoryGUI(Player viewer, OfflinePlayer target, XPrisonHistory plugin) { - super(viewer, 5, "History Management"); - this.target = target; - this.plugin = plugin; - } - - @Override - public void redraw() { - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - } - - //Player - this.setItem(13, ItemStackBuilder.of(SkullUtils.createPlayerHead(target, "&e&l" + target.getName(), Arrays.asList("&7Currently viewing history profile", "&7of this player."))).buildItem().build()); - - //Filter - this.setItem(20, ItemStackBuilder.of(CompMaterial.HOPPER.toItem()).name("&eFilter History").lore("&7Click to select a filter").build(() -> { - this.close(); - new PlayerHistoryFilterGUI(this.getPlayer(), this.target, this.plugin).open(); - })); - - //Full History - this.setItem(22, ItemStackBuilder.of(CompMaterial.BOOK.toItem()).name("&eFull History").lore("&7Click to show full history").build(() -> { - this.close(); - this.plugin.getHistoryManager().openPlayerHistoryGui(this.getPlayer(), this.target, null); - })); - - //Clear History - this.setItem(24, ItemStackBuilder.of(CompMaterial.BARRIER.toItem()).name("&eClear History").lore("&7Click to clear history").build(() -> { - this.close(); - new PlayerClearHistoryConfirmationGUI(this.getPlayer(), this.target, this.plugin).open(); - })); - - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lClose").lore("&7Click to close the gui.").build(this::close)); - } -} diff --git a/src/main/java/me/nvus/xprison/history/gui/confirmation/PlayerClearHistoryConfirmationGUI.java b/src/main/java/me/nvus/xprison/history/gui/confirmation/PlayerClearHistoryConfirmationGUI.java deleted file mode 100644 index 5c27678..0000000 --- a/src/main/java/me/nvus/xprison/history/gui/confirmation/PlayerClearHistoryConfirmationGUI.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.nvus.xprison.history.gui.confirmation; - -import me.nvus.xprison.history.XPrisonHistory; -import me.nvus.xprison.utils.gui.ConfirmationGui; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; - -public class PlayerClearHistoryConfirmationGUI extends ConfirmationGui { - - private final OfflinePlayer target; - private XPrisonHistory plugin; - - public PlayerClearHistoryConfirmationGUI(Player player, OfflinePlayer target, XPrisonHistory plugin) { - super(player, "Clear " + target.getName() + "?"); - this.target = target; - this.plugin = plugin; - } - - @Override - public void confirm(boolean confirm) { - if (confirm) { - this.plugin.getHistoryManager().clearPlayerHistory(this.target); - PlayerUtils.sendMessage(this.getPlayer(),"&aYou have cleared history data of player &e" + target.getName()); - } - this.close(); - } -} diff --git a/src/main/java/me/nvus/xprison/history/manager/HistoryManager.java b/src/main/java/me/nvus/xprison/history/manager/HistoryManager.java deleted file mode 100644 index 4130376..0000000 --- a/src/main/java/me/nvus/xprison/history/manager/HistoryManager.java +++ /dev/null @@ -1,126 +0,0 @@ -package me.nvus.xprison.history.manager; - -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.autominer.XPrisonAutoMiner; -import me.nvus.xprison.gangs.XPrisonGangs; -import me.nvus.xprison.gems.XPrisonGems; -import me.nvus.xprison.history.XPrisonHistory; -import me.nvus.xprison.history.model.HistoryLine; -import me.nvus.xprison.multipliers.XPrisonMultipliers; -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.nvus.xprison.ranks.XPrisonRanks; -import me.nvus.xprison.tokens.XPrisonTokens; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.lucko.helper.menu.Item; -import me.lucko.helper.menu.paginated.PaginatedGuiBuilder; -import org.apache.commons.lang.Validate; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class HistoryManager { - - private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); - - private final XPrisonHistory plugin; - - public HistoryManager(XPrisonHistory plugin) { - this.plugin = plugin; - } - - public List getPlayerHistory(OfflinePlayer player) { - return this.plugin.getHistoryService().getPlayerHistory(player); - } - - public void createPlayerHistoryLine(OfflinePlayer player, XPrisonModule module, String context) { - HistoryLine history = createHistoryLineObject(player, module, context); - this.plugin.getHistoryService().createHistoryLine(player, history); - } - - public void clearPlayerHistory(OfflinePlayer target) { - this.plugin.getHistoryService().deleteHistory(target); - } - - public void openPlayerHistoryGui(Player sender, OfflinePlayer target, Predicate filter) { - PaginatedGuiBuilder builder = PaginatedGuiBuilder.create(); - builder.lines(6); - builder.title("History: " + target.getName()); - builder.nextPageSlot(53); - builder.previousPageSlot(45); - builder.build(sender, gui -> { - Stream historyLinesStream = getPlayerHistory(target).stream(); - if (filter != null) { - historyLinesStream = historyLinesStream.filter(filter); - } - List historyLines = historyLinesStream.sorted(Comparator.comparing(HistoryLine::getCreatedAt).reversed()).collect(Collectors.toList()); - if (historyLines.isEmpty()) { - return Collections.singletonList(getEmptyHistoryItem()); - } else { - return historyLines.stream().map(this::createHistoryLineGuiItem).collect(Collectors.toList()); - } - }).open(); - } - - private Item getEmptyHistoryItem() { - return ItemStackBuilder.of(CompMaterial.BARRIER.toItem()).name("&4&lNo History").lore("&cNo history is present for this player.").buildItem().build(); - } - - private HistoryLine createHistoryLineObject(OfflinePlayer player, XPrisonModule module, String context) { - Validate.notNull(player, "Player cannot be null!"); - Validate.notNull(module, "Module cannot be null!"); - Validate.notNull(context, "Context cannot be null!"); - - HistoryLine history = new HistoryLine(); - history.setCreatedAt(new Date()); - history.setContext(context); - history.setPlayerUuid(player.getUniqueId()); - history.setModule(module.getName()); - history.setUuid(UUID.randomUUID()); - return history; - } - - private Item createHistoryLineGuiItem(HistoryLine line) { - return ItemStackBuilder - .of(getIconForModule(line.getModule())) - .name("&e" + line.getModule()) - .lore( - " ", - "&7Module: &e" + line.getModule(), - "&7Date: &e" + DATE_FORMAT.format(line.getCreatedAt()), - "&7Context:", - "&f" + line.getContext(), - " ").buildItem().build(); - } - - private ItemStack getIconForModule(String moduleName) { - switch (moduleName) { - case XPrisonTokens.MODULE_NAME: - case XPrisonMultipliers.MODULE_NAME: - return SkullUtils.COIN_SKULL.clone(); - case XPrisonGems.MODULE_NAME: - return ItemStackBuilder.of(CompMaterial.EMERALD.toItem()).build(); - case XPrisonGangs.MODULE_NAME: - return SkullUtils.GANG_SKULL.clone(); - case XPrisonPrestiges - .MODULE_NAME: - return SkullUtils.DIAMOND_P_SKULL.clone(); - case XPrisonRanks - .MODULE_NAME: - return SkullUtils.DIAMOND_R_SKULL.clone(); - case XPrisonAutoMiner - .MODULE_NAME: - return ItemStackBuilder.of(CompMaterial.DIAMOND_PICKAXE.toItem()).build(); - default: - return ItemStackBuilder.of(CompMaterial.BOOK.toItem()).build(); - } - - } -} diff --git a/src/main/java/me/nvus/xprison/history/model/HistoryLine.java b/src/main/java/me/nvus/xprison/history/model/HistoryLine.java deleted file mode 100644 index 70e07a5..0000000 --- a/src/main/java/me/nvus/xprison/history/model/HistoryLine.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.nvus.xprison.history.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Date; -import java.util.UUID; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class HistoryLine { - - private UUID uuid; - private UUID playerUuid; - private String module; - private String context; - private Date createdAt; -} diff --git a/src/main/java/me/nvus/xprison/history/repo/HistoryRepository.java b/src/main/java/me/nvus/xprison/history/repo/HistoryRepository.java deleted file mode 100644 index da15cc4..0000000 --- a/src/main/java/me/nvus/xprison/history/repo/HistoryRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.nvus.xprison.history.repo; - -import me.nvus.xprison.history.model.HistoryLine; -import org.bukkit.OfflinePlayer; - -import java.util.List; - -public interface HistoryRepository { - - List getPlayerHistory(OfflinePlayer player); - - void addHistoryLine(OfflinePlayer player, HistoryLine history); - - void deleteHistory(OfflinePlayer target); - - void createTables(); - - void clearTableData(); -} diff --git a/src/main/java/me/nvus/xprison/history/repo/impl/HistoryRepositoryImpl.java b/src/main/java/me/nvus/xprison/history/repo/impl/HistoryRepositoryImpl.java deleted file mode 100644 index b2550bc..0000000 --- a/src/main/java/me/nvus/xprison/history/repo/impl/HistoryRepositoryImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -package me.nvus.xprison.history.repo.impl; - -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.history.model.HistoryLine; -import me.nvus.xprison.history.repo.HistoryRepository; -import org.bukkit.OfflinePlayer; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.UUID; - -public final class HistoryRepositoryImpl implements HistoryRepository { - - private static final String TABLE_NAME = "UltraPrison_History"; - - private static final String HISTORY_UUID_COLNAME = "uuid"; - private static final String HISTORY_PLAYER_UUID_COLNAME = "player_uuid"; - private static final String HISTORY_MODULE_COLNAME = "module"; - private static final String HISTORY_CONTEXT_COLNAME = "context"; - private static final String HISTORY_CREATED_AT_COLNAME = "created_at"; - - private final SQLDatabase database; - - public HistoryRepositoryImpl(SQLDatabase database) { - this.database = database; - } - - @Override - public List getPlayerHistory(OfflinePlayer player) { - List returnList = new ArrayList<>(); - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con,"SELECT * FROM " + TABLE_NAME + " where ?=?")) { - statement.setString(1, HISTORY_PLAYER_UUID_COLNAME); - statement.setString(2, player.getUniqueId().toString()); - try (ResultSet set = statement.executeQuery()) { - while (set.next()) { - - UUID recordId = UUID.fromString(set.getString(HISTORY_UUID_COLNAME)); - UUID playerUuid = UUID.fromString(set.getString(HISTORY_PLAYER_UUID_COLNAME)); - String moduleName = set.getString(HISTORY_MODULE_COLNAME); - String context = set.getString(HISTORY_CONTEXT_COLNAME); - Date createdAt = set.getDate(HISTORY_CREATED_AT_COLNAME); - - HistoryLine line = HistoryLine.builder() - .uuid(recordId) - .playerUuid(playerUuid) - .module(moduleName) - .context(context) - .createdAt(createdAt) - .build(); - returnList.add(line); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return returnList; - } - - @Override - public void addHistoryLine(OfflinePlayer player, HistoryLine history) { - this.database.executeSqlAsync("INSERT INTO " + TABLE_NAME + " values(?,?,?,?,?)", history.getUuid().toString(), history.getPlayerUuid().toString(), history.getModule(), history.getContext(), history.getCreatedAt()); - } - - @Override - public void deleteHistory(OfflinePlayer target) { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME + " where ?=?", HISTORY_PLAYER_UUID_COLNAME, target.getUniqueId().toString()); - } - - @Override - public void createTables() { - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(uuid varchar(36) NOT NULL UNIQUE, player_uuid varchar(36) NOT NULL, module varchar(36) NOT NULL, context TEXT ,created_at DATETIME)"); - } - - @Override - public void clearTableData() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME); - } -} diff --git a/src/main/java/me/nvus/xprison/history/service/HistoryService.java b/src/main/java/me/nvus/xprison/history/service/HistoryService.java deleted file mode 100644 index 941b1d6..0000000 --- a/src/main/java/me/nvus/xprison/history/service/HistoryService.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.nvus.xprison.history.service; - -import me.nvus.xprison.history.model.HistoryLine; -import org.bukkit.OfflinePlayer; - -import java.util.List; - -public interface HistoryService { - - List getPlayerHistory(OfflinePlayer player); - - void createHistoryLine(OfflinePlayer player, HistoryLine history); - - void deleteHistory(OfflinePlayer target); -} diff --git a/src/main/java/me/nvus/xprison/history/service/impl/HistoryServiceImpl.java b/src/main/java/me/nvus/xprison/history/service/impl/HistoryServiceImpl.java deleted file mode 100644 index 810a5cb..0000000 --- a/src/main/java/me/nvus/xprison/history/service/impl/HistoryServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.nvus.xprison.history.service.impl; - -import me.nvus.xprison.history.model.HistoryLine; -import me.nvus.xprison.history.repo.HistoryRepository; -import me.nvus.xprison.history.service.HistoryService; -import org.bukkit.OfflinePlayer; - -import java.util.List; - -public class HistoryServiceImpl implements HistoryService { - - private final HistoryRepository repository; - - public HistoryServiceImpl(HistoryRepository repository) { - this.repository = repository; - } - - @Override - public List getPlayerHistory(OfflinePlayer player) { - return repository.getPlayerHistory(player); - } - - @Override - public void createHistoryLine(OfflinePlayer player, HistoryLine history) { - repository.addHistoryLine(player, history); - } - - @Override - public void deleteHistory(OfflinePlayer target) { - repository.deleteHistory(target); - } -} diff --git a/src/main/java/me/nvus/xprison/interfaces/Permissionable.java b/src/main/java/me/nvus/xprison/interfaces/Permissionable.java deleted file mode 100644 index f86cdea..0000000 --- a/src/main/java/me/nvus/xprison/interfaces/Permissionable.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.nvus.xprison.interfaces; - -public interface Permissionable { - - String getRequiredPermission(); -} diff --git a/src/main/java/me/nvus/xprison/interfaces/UPCRepository.java b/src/main/java/me/nvus/xprison/interfaces/UPCRepository.java deleted file mode 100644 index 91827bc..0000000 --- a/src/main/java/me/nvus/xprison/interfaces/UPCRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package me.nvus.xprison.interfaces; - -public interface UPCRepository { - - void createTables(); - - void resetData(); -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/MainMenu.java b/src/main/java/me/nvus/xprison/mainmenu/MainMenu.java deleted file mode 100644 index 6786e98..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/MainMenu.java +++ /dev/null @@ -1,139 +0,0 @@ -package me.nvus.xprison.mainmenu; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.history.gui.PlayerHistoryGUI; -import me.nvus.xprison.mainmenu.reload.ReloadSelectionGui; -import me.nvus.xprison.mainmenu.reset.ResetSelectionGui; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.paginated.PaginatedGuiBuilder; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import me.lucko.helper.utils.Players; -import org.apache.commons.lang.StringUtils; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.util.Collections; -import java.util.stream.Collectors; - -public class MainMenu extends Gui { - - private static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - private static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - private static final MenuScheme CONTENT = new MenuScheme() - .mask("000000000") - .mask("000111000") - .mask("001111100") - .mask("000111000") - .mask("000000000"); - - - private final XPrison core; - - public MainMenu(XPrison core, Player player) { - super(player, 5, "X-Prison - Main Menu"); - this.core = core; - } - - @Override - public void redraw() { - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - } - - //Information - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&e&lInformation").lore("&7Author: &f" + StringUtils.join(this.core.getDescription().getAuthors(), ", "), "&7Version: &f" + this.core.getDescription().getVersion()).build(() -> { - - })); - - //Reload - this.setItem(21, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&e&lReload Modules").lore("&7Click to reload specific module").build(() -> { - if (!this.getPlayer().hasPermission("xprison.mainmenu.reload")) { - return; - } - this.close(); - new ReloadSelectionGui(this.core, this.getPlayer()).open(); - })); - - //Debug - this.setItem(22, ItemStackBuilder.of(this.core.isDebugMode() ? SkullUtils.CHECK_SKULL.clone() : SkullUtils.CROSS_SKULL.clone()).name("&e&lDebug Mode: " + (this.core.isDebugMode() ? "&2&lON" : "&c&lOFF")).lore("&7Click to toggle debug mode.").build(() -> { - if (!this.getPlayer().hasPermission("xprison.mainmenu.debug")) { - return; - } - this.core.setDebugMode(!this.core.isDebugMode()); - this.redraw(); - })); - - //Reset Data - this.setItem(23, ItemStackBuilder.of(SkullUtils.DANGER_SKULL.clone()).name("&e&lReset Player Data").lore("&7Click to select which module data", "&7would you like to wipe.").build(() -> { - if (!this.getPlayer().hasPermission("xprison.mainmenu.reset")) { - return; - } - this.close(); - new ResetSelectionGui(this.core, this.getPlayer()).open(); - })); - - //Players History - this.setItem(31, ItemStackBuilder.of(CompMaterial.BOOK.toItem()).name("&e&lPlayers History").lore("&7Click to see players history.").build(() -> { - if (!this.getPlayer().hasPermission("xprison.mainmenu.history")) { - return; - } - this.close(); - this.openHistorySelectorGui(); - })); - - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lClose").lore("&7Click to close the gui.").build(this::close)); - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - - } - - private void openHistorySelectorGui() { - PaginatedGuiBuilder builder = PaginatedGuiBuilder.create(); - builder.lines(6); - builder.title("Select a player"); - builder.build(this.getPlayer(), gui -> Players.all().stream().map(p -> ItemStackBuilder.of(SkullUtils.createPlayerHead(p, p.getName(), Collections.singletonList("&7Click to view history of this player."))).build(() -> { - new PlayerHistoryGUI(this.getPlayer(), p, this.core.getHistory()).open(); - })).collect(Collectors.toList())).open(); - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/confirmation/ReloadModuleConfirmationGui.java b/src/main/java/me/nvus/xprison/mainmenu/confirmation/ReloadModuleConfirmationGui.java deleted file mode 100644 index f1cb9a2..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/confirmation/ReloadModuleConfirmationGui.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.nvus.xprison.mainmenu.confirmation; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.utils.gui.ConfirmationGui; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.entity.Player; - -public class ReloadModuleConfirmationGui extends ConfirmationGui { - - private final XPrisonModule module; - - public ReloadModuleConfirmationGui(Player player, XPrisonModule module) { - super(player, module == null ? "Reload all modules ?" : "Reload module " + module.getName() + "?"); - this.module = module; - } - - @Override - public void confirm(boolean confirm) { - if (confirm) { - if (module == null) { - XPrison.getInstance().getModules().forEach(module1 -> XPrison.getInstance().reloadModule(module1)); - XPrison.getInstance().getItemMigrator().reload(); - PlayerUtils.sendMessage(this.getPlayer(), "&aSuccessfully reloaded all modules."); - } else { - XPrison.getInstance().reloadModule(module); - PlayerUtils.sendMessage(this.getPlayer(), "&aSuccessfully reloaded &e&l" + this.module.getName() + " &amodule."); - } - } - this.close(); - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/confirmation/ResetModulePlayerDataConfirmationGui.java b/src/main/java/me/nvus/xprison/mainmenu/confirmation/ResetModulePlayerDataConfirmationGui.java deleted file mode 100644 index f19eee0..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/confirmation/ResetModulePlayerDataConfirmationGui.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.nvus.xprison.mainmenu.confirmation; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.utils.gui.ConfirmationGui; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.entity.Player; - -public class ResetModulePlayerDataConfirmationGui extends ConfirmationGui { - private final XPrisonModule module; - - public ResetModulePlayerDataConfirmationGui(Player player, XPrisonModule module) { - super(player, module == null ? "Reset all player data ?" : "Reset " + module.getName() + " player data?"); - this.module = module; - } - - @Override - public void confirm(boolean confirm) { - if (confirm) { - if (module == null) { - XPrison.getInstance().getModules().forEach(XPrisonModule::resetPlayerData); - PlayerUtils.sendMessage(this.getPlayer(), "&aSuccessfully reset player data of all modules."); - } else { - module.resetPlayerData(); - PlayerUtils.sendMessage(this.getPlayer(), "&aSuccessfully reset player data of &e&l" + this.module.getName() + " &amodule."); - } - - } - this.close(); - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/AutoMinerHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/AutoMinerHelpGui.java deleted file mode 100644 index 6d04d21..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/AutoMinerHelpGui.java +++ /dev/null @@ -1,94 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class AutoMinerHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public AutoMinerHelpGui(Player player) { - super(player, 5, "AutoMiner Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7An autominer lets your", - "&7players have an extra", - "&7source of income without", - "&7having to mine." - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eCommands").lore( - "&f/autominer", - "&7Shows the remaining time", - "&7on a player's autominer.", - " ", - "&f/adminautominer give [player] [time] [DAYS/HOURS/MINUTES/SECONDS]", - "&7Give a player autominer time." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - - - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/AutoSellHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/AutoSellHelpGui.java deleted file mode 100644 index 28c97b8..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/AutoSellHelpGui.java +++ /dev/null @@ -1,105 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class AutoSellHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public AutoSellHelpGui(Player player) { - super(player, 5, "AutoSell Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7AutoSell lets your players", - "&7automatically sell any block", - "&7they mine in your set", - "&7mine regions." - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eCommands").lore( - "&f/sellprice [price]", - "&7Set the price for any item", - "&7you are holding. Make sure to", - "&7stand in the correct region that", - "&7you want autosell and sellall to work in.", - " ", - "&f/autosell", - "&7Toggle your autosell mode.", - "&7If enabled, blocks mined will", - "&7be sold automatically.", - "&7If disabled, blocks mined will", - "&7go to your inventory.", - " ", - "&f/sellall", - "&7Instantly sell every item", - "&7that is in your inventory.", - "&7You need to be standing in", - "&7mine region." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/EnchantsHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/EnchantsHelpGui.java deleted file mode 100644 index c768954..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/EnchantsHelpGui.java +++ /dev/null @@ -1,111 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class EnchantsHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public EnchantsHelpGui(Player player) { - super(player, 5, "Enchants Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7Enchants are made", - "&7to make your prison server", - "&7more unique!", - "&7You can customize all", - "&7enchants in &fenchants.yml", - "&7You can also create your own", - "&7custom enchants using our API.", - "&7Tutorial can be found on Wiki." - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eCommands").lore( - "&f/givepickaxe [player] [enchant:rawname=level]", - "&7Example: /givepickaxe Drawethree fortune=10,layer=50", - "&7Give your players a custom pickaxe to mine with.", - " ", - "&f/enchant", - "&7Open up the enchanting GUI.", - " ", - "&f/disenchant", - "&7Opens up the disenchanting GUI.", - " ", - "&f/value", - "&7Display the total value of tokens", - "&7of your held pickaxe.", - " ", - "&f/explosive", - "&fToggle the explosive enchant.", - " ", - "&f/layer", - "&7Toggle the layer enchant." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/GangsHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/GangsHelpGui.java deleted file mode 100644 index 97f7561..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/GangsHelpGui.java +++ /dev/null @@ -1,116 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class GangsHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public GangsHelpGui(Player player) { - super(player, 5, "Gangs Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore("&7Gangs are a way to let", "&7your players play together in", "&7competitive groups!").buildItem().build()); - - //Commands - this.setItem(21, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&ePlayer Commands").lore( - "&f/gang create [name]", - "&7Create a gang.", - " ", - "&f/gang invite [player]", - "&7Invite a player to your gang.", - " ", - "&f/gang kick [player]", - "&7Kick a player for your gang.", - " ", - "&f/gang info [player/gang]", - "&7Shows information about gang.", - " ", - "&f/gang chat", - "&7Toggle gang chat.", - " ", - "&f/gang top", - "&7Display top gangs based on their value.", - " ", - "&f/gang accept", - "&7Accept a gang invite.", - " ", - "&f/gang disband", - "&7Disband your gang." - ).buildItem().build()); - - //Commands - this.setItem(23, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eAdmin Commands").lore( - "&f/gang value [add/remove] [gang] [amount]", - "&7Add/remove value from/to a gang.", - " ", - "&f/gang admin [add/remove] [player] [gang]", - "&7Forcibly add or remove player from a gang.", - " ", - "&f/gang admin disband [gang]", - "&7Forcibly disband a gang." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/GemsHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/GemsHelpGui.java deleted file mode 100644 index 73e4122..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/GemsHelpGui.java +++ /dev/null @@ -1,100 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class GemsHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public GemsHelpGui(Player player) { - super(player, 5, "Gems Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7Gems allows you to create any", - "&7shop you want. Gems is a currency", - "&7with tons of uses!" - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&ePlayer Commands").lore( - "&f/gems [player]", - "&7View yours or player's balance.", - " ", - "&f/gemstop", - "&7View a list of players with most gems.", - " ", - "&f/gems [add/remove/set] [player] [amount]", - "&7Add, remove or set player's gems balance.", - " ", - "&f/gems pay [player] [amount]", - "&7Give an other player gems from your balance.", - " ", - "&f/gems help", - "&7Displays the help usage for gems." - ).buildItem().build()); - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - - - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/HelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/HelpGui.java deleted file mode 100644 index a60eb0d..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/HelpGui.java +++ /dev/null @@ -1,138 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class HelpGui extends Gui { - - private static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - private static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - private static final MenuScheme CONTENT = new MenuScheme() - .mask("000000000") - .mask("000111000") - .mask("001111100") - .mask("000111000") - .mask("000000000"); - - - public HelpGui(Player player) { - super(player, 5, "X-Prison - Help Menu"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //AutoMiner - this.setItem(11, ItemStackBuilder.of(Material.DIAMOND_PICKAXE).name("&e&lAutoMiner").lore("&7Click to see detailed info", "&7about AutoMiner feature.").build(() -> { - this.close(); - new AutoMinerHelpGui(this.getPlayer()).open(); - })); - //Autosell - this.setItem(12, ItemStackBuilder.of(SkullUtils.MONEY_SKULL.clone()).name("&e&lAutoSell").lore("&7Click to see detailed info", "&7about AutoSell feature.").build(() -> { - this.close(); - new AutoSellHelpGui(this.getPlayer()).open(); - })); - //Enchants - this.setItem(13, ItemStackBuilder.of(CompMaterial.ENCHANTED_BOOK.toItem()).name("&e&lEnchants").lore("&7Click to see detailed info", "&7about Enchants feature.").build(() -> { - this.close(); - new EnchantsHelpGui(this.getPlayer()).open(); - })); - //Gangs - this.setItem(14, ItemStackBuilder.of(SkullUtils.GANG_SKULL.clone()).name("&e&lGangs").lore("&7Click to see detailed info", "&7about Gangs feature.").build(() -> { - this.close(); - new GangsHelpGui(this.getPlayer()).open(); - })); - //Gems - this.setItem(15, ItemStackBuilder.of(Material.EMERALD).name("&e&lGems").lore("&7Click to see detailed info", "&7about Gems feature.").build(() -> { - this.close(); - new GemsHelpGui(this.getPlayer()).open(); - })); - //Ranks - this.setItem(19, ItemStackBuilder.of(SkullUtils.DIAMOND_R_SKULL.clone()).name("&e&lRanks").lore("&7Click to see detailed info", "&7about Ranks feature.").build(() -> { - this.close(); - new RanksHelpGui(this.getPlayer()).open(); - })); - //Prestiges - this.setItem(20, ItemStackBuilder.of(SkullUtils.DIAMOND_P_SKULL.clone()).name("&e&lPrestiges").lore("&7Click to see detailed info", "&7about Prestiges feature.").build(() -> { - this.close(); - new PrestigesHelpGui(this.getPlayer()).open(); - })); - //PickaxeLevels - this.setItem(21, ItemStackBuilder.of(CompMaterial.EXPERIENCE_BOTTLE.toItem()).name("&e&lPickaxe Levels").lore("&7Click to see detailed info", "&7about Pickaxe leveling feature.").build(() -> { - this.close(); - new PickaxeLevelsHelpGui(this.getPlayer()).open(); - })); - //Tokens - this.setItem(22, ItemStackBuilder.of(SkullUtils.COIN_SKULL.clone()).name("&e&lTokens").lore("&7Click to see detailed info", "&7about Tokens feature.").build(() -> { - this.close(); - new TokensHelpGui(this.getPlayer()).open(); - })); - //Multipliers - this.setItem(23, ItemStackBuilder.of(Material.GOLD_INGOT).name("&e&lMultipliers").lore("&7Click to see detailed info", "&7about Multipliers feature.").build(() -> { - this.close(); - new MultipliersHelpGui(this.getPlayer()).open(); - })); - //Mines - this.setItem(24, ItemStackBuilder.of(Material.DIAMOND_ORE).name("&e&lMines").lore("&7Click to see detailed info", "&7about Mines feature.").build(() -> { - this.close(); - new MinesHelpGui(this.getPlayer()).open(); - })); - //History - this.setItem(25, ItemStackBuilder.of(CompMaterial.BOOK.toItem()).name("&e&lHistory").lore("&7Click to see detailed info", "&7about History feature.").build(() -> { - this.close(); - new HistoryHelpGui(this.getPlayer()).open(); - })); - - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lClose").lore("&7Click to close the gui.").build(this::close)); - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/HistoryHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/HistoryHelpGui.java deleted file mode 100644 index 34823a5..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/HistoryHelpGui.java +++ /dev/null @@ -1,95 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class HistoryHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public HistoryHelpGui(Player player) { - super(player, 5, "Tokens Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7History module allows you to", - "&7keep a track up how your players", - "&7how they are interacting with our system.", - " ", - "&7History system allows you lookup", - "&7overall player data, or filter it by module.", - " ", - "&7System is GUI-based, you can open the History GUI", - "&7'/upc' command and clicking on book item, or via", - "&7'/history ' command." - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eCommands").lore( - "&f/history [player]", - "&7Views player's history." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/MinesHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/MinesHelpGui.java deleted file mode 100644 index 6149354..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/MinesHelpGui.java +++ /dev/null @@ -1,131 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class MinesHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public MinesHelpGui(Player player) { - super(player, 5, "Mines Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7With Mines module", - "&7you can create unlimited", - "&7amount of prison mines", - "&7where your players can", - "&7mine blocks and progress." - ).buildItem().build()); - - //Commands - this.setItem(21, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eAdmin Commands").lore( - "&f/mines create [name]", - "&7Create a mine.", - " ", - "&f/mines delete [name]", - "&7Deletes a mine.", - " ", - "&f/mines redefine [name]", - "&7Redefine mine region.", - " ", - "&f/mines rename [name] [new_name]", - "&7Renames a mine.", - " ", - "&f/mines reset [name]", - "&7Resets a mine contents.", - " ", - "&f/mines panel [name]", - "&7Opens admin panel for a mine.", - " ", - "&f/mines save [name]", - "&7Saves a mine." - ).buildItem().build()); - - //Commands - this.setItem(23, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eAdmin Commands").lore( - "&f/mines addblock [name]", - "&7Adds a block to a mine you hold in hand.", - " ", - "&f/mines settp [name]", - "&7Sets teleport location for a mine.", - " ", - "&f/mines tp [name]", - "&7Teleports to a mine.", - " ", - "&f/mines list", - "&7Shows all mines.", - " ", - "&f/mines tool", - "&7Gives you a mine selection tool.", - " ", - "&f/mines migrate ", - "&7Migrates mines from other plugins.", - "&7Currently supported: &fJetsPrisonMines, MineResetLite&7." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - - - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/MultipliersHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/MultipliersHelpGui.java deleted file mode 100644 index 33387db..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/MultipliersHelpGui.java +++ /dev/null @@ -1,102 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class MultipliersHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public MultipliersHelpGui(Player player) { - super(player, 5, "Multipliers Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7Multipliers allows your players", - "&7to earn more money when they", - "&7are mining." - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eCommands").lore( - "&f/gmulti [sell/token] [multiplier] [duration] [time_unit] ", - "&7Example: /gmulti sell 1.0 10 MINUTES", - "&7Set the global sell / token multiplier for all players on server.", - " ", - "&f/gmulti [sell/token] reset", - "&7Resets the global sell / token multiplier.", - " ", - "&f/sellmulti [player] [multiplier] [duration] [time_unit] ", - "&7Example: /sellmulti Drawethree 1.0 10 MINUTES", - "&7Set the personal sell multiplier for player.", - " ", - "&f/tokenmulti [player] [multiplier] [duration] [time_unit] ", - "&7Example: /tokenmulti Drawethree 1.0 10 MINUTES", - "&7Set the personal token multiplier for player.", - " ", - "&f/multi", - "&7Check your active multipliers." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/PickaxeLevelsHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/PickaxeLevelsHelpGui.java deleted file mode 100644 index 3e34f56..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/PickaxeLevelsHelpGui.java +++ /dev/null @@ -1,88 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class PickaxeLevelsHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public PickaxeLevelsHelpGui(Player player) { - super(player, 5, "Pickaxe Levels Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7Pickaxe levels allows your", - "&7players to level up their pickaxes", - "&7and unlock various rewards by", - "&7breaking blocks." - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eCommands").lore( - "&cThere are no commands associated with this module.", - "&cEverything is customizable in &fpickaxe-levels.yml" - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/PrestigesHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/PrestigesHelpGui.java deleted file mode 100644 index 1db1f97..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/PrestigesHelpGui.java +++ /dev/null @@ -1,97 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class PrestigesHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public PrestigesHelpGui(Player player) { - super(player, 5, "Prestiges Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7Prestiges allow your players", - "&7to earn more rewards after they", - "&7achieve highest rank!" - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&ePlayer Commands").lore( - "&f/prestige", - "&7Attempt to buy next prestige.", - " ", - "&f/maxprestige", - "&7Attempt to buy highest prestige possible", - "&7based on your balance.", - " ", - "&f/prestigetop", - "&7Display top prestige users.", - " ", - "&f/prestigeadmin [add/remove/set] [player] [amount]", - "&7Forcibly add, remove or set player's prestige." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/RanksHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/RanksHelpGui.java deleted file mode 100644 index 9afde97..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/RanksHelpGui.java +++ /dev/null @@ -1,94 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class RanksHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public RanksHelpGui(Player player) { - super(player, 5, "Ranks Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7Ranks allow your players", - "&7to advance to different mines", - "&7and earn custom rewards!" - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&ePlayer Commands").lore( - "&f/rankup", - "&7Attempt to buy next rank.", - " ", - "&f/maxrankup", - "&7Attempt to buy highest rank possible", - "&7based on your balance.", - " ", - "&f/setrank [player] [rank_id]", - "&7Forcibly set player's rank." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/help/TokensHelpGui.java b/src/main/java/me/nvus/xprison/mainmenu/help/TokensHelpGui.java deleted file mode 100644 index 3f97d31..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/help/TokensHelpGui.java +++ /dev/null @@ -1,103 +0,0 @@ -package me.nvus.xprison.mainmenu.help; - -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class TokensHelpGui extends Gui { - - protected static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - protected static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - - public TokensHelpGui(Player player) { - super(player, 5, "Tokens Help"); - } - - @Override - public void redraw() { - - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //Info - this.setItem(13, ItemStackBuilder.of(SkullUtils.INFO_SKULL.clone()).name("&eWhat it is ?").lore( - "&7Tokens is a currency that allows", - "&7your players to upgrade their", - "&7pickaxe enchants." - ).buildItem().build()); - - //Commands - this.setItem(22, ItemStackBuilder.of(SkullUtils.COMMAND_BLOCK_SKULL.clone()).name("&eCommands").lore( - "&f/tokens [player]", - "&7View yours or player's tokens balance.", - " ", - "&f/tokenstop", - "&7View a list of players with most tokens.", - " ", - "&f/tokens [add/remove/set] [player] [amount]", - "&7Add, remove or set player's tokens balance.", - " ", - "&f/tokens pay [player] [amount]", - "&7Give an other player tokens from your balance.", - " ", - "&f/tokens withdraw [amount] [value]", - "&7Withdraw your tokens to a physical form.", - " ", - "&f/tokens help", - "&7Displays the help usage for tokens." - ).buildItem().build()); - - //Back - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lBack").lore("&7Back to main gui.").build(() -> { - this.close(); - new HelpGui(this.getPlayer()).open(); - })); - - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - } - - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/reload/ReloadSelectionGui.java b/src/main/java/me/nvus/xprison/mainmenu/reload/ReloadSelectionGui.java deleted file mode 100644 index a83eece..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/reload/ReloadSelectionGui.java +++ /dev/null @@ -1,145 +0,0 @@ -package me.nvus.xprison.mainmenu.reload; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.mainmenu.confirmation.ReloadModuleConfirmationGui; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class ReloadSelectionGui extends Gui { - - private static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - private static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - private static final MenuScheme CONTENT = new MenuScheme() - .mask("000000000") - .mask("000111000") - .mask("001111100") - .mask("000111000") - .mask("000000000"); - - private final XPrison core; - - public ReloadSelectionGui(XPrison core, Player player) { - super(player, 5, "UPC - Reload Module"); - this.core = core; - } - - @Override - public void redraw() { - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //AutoMiner - this.setItem(11, ItemStackBuilder.of(Material.DIAMOND_PICKAXE).name("&e&lAutoMiner").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getAutoMiner()).open(); - })); - - //Autosell - this.setItem(12, ItemStackBuilder.of(SkullUtils.MONEY_SKULL.clone()).name("&e&lAutoSell").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getAutoSell()).open(); - })); - - //Enchants - this.setItem(13, ItemStackBuilder.of(CompMaterial.ENCHANTED_BOOK.toItem()).name("&e&lEnchants").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getEnchants()).open(); - })); - - //Gangs - this.setItem(14, ItemStackBuilder.of(SkullUtils.GANG_SKULL.clone()).name("&e&lGangs").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getGangs()).open(); - })); - - //Gems - this.setItem(15, ItemStackBuilder.of(Material.EMERALD).name("&e&lGems").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getGems()).open(); - })); - - //Ranks - this.setItem(19, ItemStackBuilder.of(SkullUtils.DIAMOND_R_SKULL.clone()).name("&e&lRanks").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getRanks()).open(); - })); - - //Prestiges - this.setItem(20, ItemStackBuilder.of(SkullUtils.DIAMOND_P_SKULL.clone()).name("&e&lPrestiges").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getPrestiges()).open(); - })); - - //PickaxeLevels - this.setItem(21, ItemStackBuilder.of(CompMaterial.EXPERIENCE_BOTTLE.toItem()).name("&e&lPickaxe Levels").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getPickaxeLevels()).open(); - })); - - //Tokens - this.setItem(22, ItemStackBuilder.of(SkullUtils.COIN_SKULL.clone()).name("&e&lTokens").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getTokens()).open(); - })); - - //Multipliers - this.setItem(23, ItemStackBuilder.of(Material.GOLD_INGOT).name("&e&lMultipliers").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getMultipliers()).open(); - })); - - //Mines - this.setItem(24, ItemStackBuilder.of(Material.DIAMOND_ORE).name("&e&lMines").lore("&7Click to reload this module.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getMines()).open(); - })); - - //History - this.setItem(25, ItemStackBuilder.of(CompMaterial.BOOK.toItem()).name("&e&lHistory").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), this.core.getHistory()).open(); - })); - - //All Modules - this.setItem(31, ItemStackBuilder.of(CompMaterial.REDSTONE_BLOCK.toItem()).name("&e&lReload All Modules").lore("&7Click to reload all modules.").build(() -> { - new ReloadModuleConfirmationGui(this.getPlayer(), null).open(); - })); - - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lClose").lore("&7Click to close the gui.").build(this::close)); - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - - } - } -} diff --git a/src/main/java/me/nvus/xprison/mainmenu/reset/ResetSelectionGui.java b/src/main/java/me/nvus/xprison/mainmenu/reset/ResetSelectionGui.java deleted file mode 100644 index 618368a..0000000 --- a/src/main/java/me/nvus/xprison/mainmenu/reset/ResetSelectionGui.java +++ /dev/null @@ -1,146 +0,0 @@ -package me.nvus.xprison.mainmenu.reset; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.mainmenu.confirmation.ResetModulePlayerDataConfirmationGui; -import me.nvus.xprison.utils.Constants; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.misc.SkullUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class ResetSelectionGui extends Gui { - - private static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - private static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - private static final MenuScheme CONTENT = new MenuScheme() - .mask("000000000") - .mask("000111000") - .mask("001111100") - .mask("000111000") - .mask("000000000"); - - private final XPrison core; - - public ResetSelectionGui(XPrison core, Player player) { - super(player, 5, "UPC - Reset Player Data"); - this.core = core; - - } - - @Override - public void redraw() { - if (isFirstDraw()) { - - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - //AutoMiner - this.setItem(11, ItemStackBuilder.of(Material.DIAMOND_PICKAXE).name("&e&lAutoMiner").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getAutoMiner()).open(); - })); - - //Autosell - this.setItem(12, ItemStackBuilder.of(SkullUtils.MONEY_SKULL.clone()).name("&e&lAutoSell").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getAutoSell()).open(); - })); - - //Enchants - this.setItem(13, ItemStackBuilder.of(CompMaterial.ENCHANTED_BOOK.toItem()).name("&e&lEnchants").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getEnchants()).open(); - })); - - //Gangs - this.setItem(14, ItemStackBuilder.of(SkullUtils.GANG_SKULL.clone()).name("&e&lGangs").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getGangs()).open(); - })); - - //Gems - this.setItem(15, ItemStackBuilder.of(Material.EMERALD).name("&e&lGems").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getGems()).open(); - })); - - //Ranks - this.setItem(19, ItemStackBuilder.of(SkullUtils.DIAMOND_R_SKULL.clone()).name("&e&lRanks").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getRanks()).open(); - })); - - //Prestiges - this.setItem(20, ItemStackBuilder.of(SkullUtils.DIAMOND_P_SKULL.clone()).name("&e&lPrestiges").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getPrestiges()).open(); - })); - - //PickaxeLevels - this.setItem(21, ItemStackBuilder.of(CompMaterial.EXPERIENCE_BOTTLE.toItem()).name("&e&lPickaxe Levels").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getPickaxeLevels()).open(); - })); - - //Tokens - this.setItem(22, ItemStackBuilder.of(SkullUtils.COIN_SKULL.clone()).name("&e&lTokens").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getTokens()).open(); - })); - - //Multipliers - this.setItem(23, ItemStackBuilder.of(Material.GOLD_INGOT).name("&e&lMultipliers").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getMultipliers()).open(); - })); - - //Mines - this.setItem(24, ItemStackBuilder.of(Material.DIAMOND_ORE).name("&e&lMines").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getMines()).open(); - })); - - //History - this.setItem(25, ItemStackBuilder.of(CompMaterial.BOOK.toItem()).name("&e&lHistory").lore("&7Click to reset this module", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), this.core.getHistory()).open(); - })); - - //All Modules - this.setItem(31, ItemStackBuilder.of(CompMaterial.REDSTONE_BLOCK.toItem()).name("&e&lReset All Modules").lore("&7Click to reset all modules", "&7player data.").build(() -> { - new ResetModulePlayerDataConfirmationGui(this.getPlayer(), null).open(); - })); - - this.setItem(36, ItemStackBuilder.of(Material.BARRIER).name("&c&lClose").lore("&7Click to close the gui.").build(this::close)); - this.setItem(44, ItemStackBuilder.of(SkullUtils.HELP_SKULL.clone()).name("&e&lNeed more help?").lore("&7Right-Click to see plugin's Wiki", "&7Left-Click to join Discord Support.") - .build(() -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Wiki"); - PlayerUtils.sendMessage(this.getPlayer(), "&7https://github.com/Drawethree/X-Prison/wiki"); - PlayerUtils.sendMessage(this.getPlayer(), " "); - }, () -> { - this.close(); - PlayerUtils.sendMessage(this.getPlayer(), " "); - PlayerUtils.sendMessage(this.getPlayer(), "&eX-Prison - Discord"); - PlayerUtils.sendMessage(this.getPlayer(), "&7" + Constants.DISCORD_LINK); - PlayerUtils.sendMessage(this.getPlayer(), " "); - })); - - } - } -} diff --git a/src/main/java/me/nvus/xprison/migrator/ItemMigrator.java b/src/main/java/me/nvus/xprison/migrator/ItemMigrator.java deleted file mode 100644 index 5a85612..0000000 --- a/src/main/java/me/nvus/xprison/migrator/ItemMigrator.java +++ /dev/null @@ -1,126 +0,0 @@ -package me.nvus.xprison.migrator; - -import com.saicone.rtag.RtagItem; -import com.saicone.rtag.tag.TagCompound; -import me.nvus.xprison.XPrison; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import java.util.HashSet; -import java.util.Map; - -public class ItemMigrator implements Listener { - - private static final String MAIN = "upc"; - private static final String ENCHANT_PATH = "ultra-prison-ench-"; - private static final Map PATHS = Map.of( - "blocks-broken", "blocks", - "gems-amount", "gems", - "ultra-prison-pickaxe-level", "level", - "token-amount", "tokens" - ); - - private final XPrison plugin; - - private boolean enabled; - private boolean bindJoin; - private boolean bindInventory; - - public ItemMigrator(XPrison plugin) { - this.plugin = plugin; - } - - public void reload() { - final boolean enabled = plugin.getConfig().getBoolean("item-migrator.enabled", true); - if (enabled) { - if (!this.enabled) { - this.enabled = true; - Bukkit.getPluginManager().registerEvents(this, plugin); - } - } else if (this.enabled) { - this.enabled = false; - HandlerList.unregisterAll(this); - return; - } - this.bindJoin = plugin.getConfig().getBoolean("item-migrator.bind.join", true); - this.bindInventory = plugin.getConfig().getBoolean("item-migrator.bind.inventory", false); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onJoin(PlayerJoinEvent e) { - if (!bindJoin) { - return; - } - Bukkit.getScheduler().runTaskLater(plugin, () -> { - final Player player = e.getPlayer(); - if (!player.isOnline()) { - return; - } - final Inventory inventory = player.getInventory(); - try { - for (int i = 0; i < inventory.getContents().length; i++) { - final ItemStack item = migrate(inventory.getItem(i)); - if (item != null) { - inventory.setItem(i, item); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - }, 80L); - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onClickInventory(InventoryClickEvent e) { - if (!bindInventory) { - return; - } - try { - final ItemStack item = migrate(e.getCurrentItem()); - if (item != null) { - e.setCancelled(true); - e.setCurrentItem(item); - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - public ItemStack migrate(ItemStack item) { - if (item == null || item.getType() == Material.AIR) { - return null; - } - final RtagItem tag = new RtagItem(item); - if (tag.notHasTag()) { - return null; - } - final Map map = TagCompound.getValue(tag.getTag()); - boolean edited = false; - for (String key : new HashSet<>(map.keySet())) { - if (PATHS.containsKey(key)) { - final Object value = map.get(key); - map.remove(key); - tag.set(value, MAIN, PATHS.get(key)); - edited = true; - } else if (key.startsWith(ENCHANT_PATH)) { - final Object value = map.get(key); - map.remove(key); - tag.set(value, MAIN, "enchants", key.substring(18)); - edited = true; - } - } - if (edited) { - return tag.loadCopy(); - } - return null; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/XPrisonMines.java b/src/main/java/me/nvus/xprison/mines/XPrisonMines.java deleted file mode 100644 index b5d679f..0000000 --- a/src/main/java/me/nvus/xprison/mines/XPrisonMines.java +++ /dev/null @@ -1,169 +0,0 @@ -package me.nvus.xprison.mines; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.mines.api.XPrisonMinesAPI; -import me.nvus.xprison.mines.api.XPrisonMinesAPIImpl; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.commands.impl.*; -import me.nvus.xprison.mines.listener.MinesListener; -import me.nvus.xprison.mines.managers.MineManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.nvus.xprison.utils.text.TextUtils; -import lombok.Getter; -import me.lucko.helper.Commands; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -public class XPrisonMines implements XPrisonModule { - - public static final String MODULE_NAME = "Mines"; - - public static final String MINES_ADMIN_PERM = "xprison.mines.admin"; - - @Getter - private static XPrisonMines instance; - - private boolean enabled; - - private Map messages; - @Getter - private FileManager.Config config; - @Getter - private MineManager manager; - @Getter - private XPrisonMinesAPI api; - @Getter - private final XPrison core; - - private Map commands; - - - public XPrisonMines(XPrison core) { - instance = this; - this.core = core; - this.enabled = false; - } - - @Override - public void enable() { - this.enabled = true; - this.config = this.core.getFileManager().getConfig("mines.yml").copyDefaults(true).save(); - this.loadMessages(); - this.manager = new MineManager(this); - this.manager.enable(); - new MinesListener(this).register(); - this.registerCommands(); - this.api = new XPrisonMinesAPIImpl(this); - } - - @Override - public void disable() { - this.enabled = false; - this.manager.disable(); - } - - @Override - public boolean isEnabled() { - return this.enabled; - } - - @Override - public void reload() { - this.config.reload(); - - this.loadMessages(); - - this.manager.reload(); - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return false; - } - - @Override - public void resetPlayerData() { - } - - private void loadMessages() { - this.messages = new HashMap<>(); - for (String key : this.config.get().getConfigurationSection("messages").getKeys(false)) { - this.messages.put(key.toLowerCase(), TextUtils.applyColor(this.config.get().getString("messages." + key))); - } - } - - public String getMessage(String key) { - return this.messages.getOrDefault(key.toLowerCase(), TextUtils.applyColor("&cInvalid message key: " + key)); - } - - private void registerCommands() { - this.commands = new HashMap<>(); - - registerCommand(new MineCreateCommand(this)); - registerCommand(new MineDeleteCommand(this)); - registerCommand(new MineRedefineCommand(this)); - registerCommand(new MinePanelCommand(this)); - registerCommand(new MineTeleportCommand(this)); - registerCommand(new MineToolCommand(this)); - registerCommand(new MineHelpCommand(this)); - registerCommand(new MineResetCommand(this)); - registerCommand(new MineListCommand(this)); - registerCommand(new MineAddBlockCommand(this)); - registerCommand(new MineSetTpCommand(this)); - registerCommand(new MineSaveCommand(this)); - registerCommand(new MineMigrateCommand(this)); - registerCommand(new MineRenameCommand(this)); - - Commands.create() - .handler(c -> { - - if (c.args().size() == 0 && c.sender() instanceof Player) { - this.getCommand("help").execute(c.sender(), c.args()); - return; - } - - MineCommand subCommand = this.getCommand(Objects.requireNonNull(c.rawArg(0))); - - if (subCommand != null) { - if (!subCommand.canExecute(c.sender())) { - PlayerUtils.sendMessage(c.sender(), this.getMessage("no_permission")); - return; - } - - if (!subCommand.execute(c.sender(), c.args().subList(1, c.args().size()))) { - PlayerUtils.sendMessage(c.sender(), subCommand.getUsage()); - } - - } else { - this.getCommand("help").execute(c.sender(), c.args()); - } - }).registerAndBind(core, "mines", "mine"); - } - - private MineCommand getCommand(String name) { - return this.commands.get(name.toLowerCase()); - } - - - private void registerCommand(MineCommand command) { - this.commands.put(command.getName(), command); - - if (command.getAliases() == null || command.getAliases().length == 0) { - return; - } - - for (String alias : command.getAliases()) { - this.commands.put(alias, command); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mines/api/XPrisonMinesAPI.java b/src/main/java/me/nvus/xprison/mines/api/XPrisonMinesAPI.java deleted file mode 100644 index 87e8ab5..0000000 --- a/src/main/java/me/nvus/xprison/mines/api/XPrisonMinesAPI.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.nvus.xprison.mines.api; - -import me.nvus.xprison.mines.model.mine.Mine; -import org.bukkit.Location; - -public interface XPrisonMinesAPI { - - /** - * Gets a mine by name - * - * @param name String - * @return Mine.class - */ - Mine getMineByName(String name); - - /** - * Gets a mine by location - * - * @param loc Location - * @return Mine.class - */ - Mine getMineAtLocation(Location loc); -} diff --git a/src/main/java/me/nvus/xprison/mines/api/XPrisonMinesAPIImpl.java b/src/main/java/me/nvus/xprison/mines/api/XPrisonMinesAPIImpl.java deleted file mode 100644 index d4dfab2..0000000 --- a/src/main/java/me/nvus/xprison/mines/api/XPrisonMinesAPIImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.nvus.xprison.mines.api; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.model.mine.Mine; -import org.bukkit.Location; - -public final class XPrisonMinesAPIImpl implements XPrisonMinesAPI { - - private final XPrisonMines plugin; - - public XPrisonMinesAPIImpl(XPrisonMines plugin) { - this.plugin = plugin; - } - - @Override - public Mine getMineByName(String name) { - return this.plugin.getManager().getMineByName(name); - } - - @Override - public Mine getMineAtLocation(Location loc) { - return this.plugin.getManager().getMineAtLocation(loc); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/api/events/MineCreateEvent.java b/src/main/java/me/nvus/xprison/mines/api/events/MineCreateEvent.java deleted file mode 100644 index ce81109..0000000 --- a/src/main/java/me/nvus/xprison/mines/api/events/MineCreateEvent.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.nvus.xprison.mines.api.events; - -import me.nvus.xprison.api.events.XPrisonEvent; -import me.nvus.xprison.mines.model.mine.Mine; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public final class MineCreateEvent extends XPrisonEvent implements Cancellable { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - - @Getter - @Setter - private boolean cancelled; - - @Getter - private CommandSender creator; - - @Getter - private Mine mine; - - /** - * Fired when mine is created - * - * @param creator CommandSender who created the mine - * @param mine Mine - */ - public MineCreateEvent(Player creator, Mine mine) { - this.creator = creator; - this.mine = mine; - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @NotNull - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/api/events/MineDeleteEvent.java b/src/main/java/me/nvus/xprison/mines/api/events/MineDeleteEvent.java deleted file mode 100644 index d3795fa..0000000 --- a/src/main/java/me/nvus/xprison/mines/api/events/MineDeleteEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.nvus.xprison.mines.api.events; - -import me.nvus.xprison.api.events.XPrisonEvent; -import me.nvus.xprison.mines.model.mine.Mine; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public final class MineDeleteEvent extends XPrisonEvent implements Cancellable { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - - @Getter - @Setter - private boolean cancelled; - - @Getter - private Mine mine; - - /** - * Called when mine is deleted - * - * @param mine MIne - */ - public MineDeleteEvent(Mine mine) { - this.mine = mine; - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @NotNull - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/api/events/MinePostResetEvent.java b/src/main/java/me/nvus/xprison/mines/api/events/MinePostResetEvent.java deleted file mode 100644 index efe7e12..0000000 --- a/src/main/java/me/nvus/xprison/mines/api/events/MinePostResetEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.nvus.xprison.mines.api.events; - -import me.nvus.xprison.api.events.XPrisonEvent; -import me.nvus.xprison.mines.model.mine.Mine; -import lombok.Getter; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public final class MinePostResetEvent extends XPrisonEvent { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - - @Getter - private Mine mine; - - /** - * Fired when mine reset was completed - * - * @param mine Mine - */ - public MinePostResetEvent(Mine mine) { - this.mine = mine; - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @NotNull - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/api/events/MinePreResetEvent.java b/src/main/java/me/nvus/xprison/mines/api/events/MinePreResetEvent.java deleted file mode 100644 index fd68afd..0000000 --- a/src/main/java/me/nvus/xprison/mines/api/events/MinePreResetEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.nvus.xprison.mines.api.events; - -import me.nvus.xprison.api.events.XPrisonEvent; -import me.nvus.xprison.mines.model.mine.Mine; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public final class MinePreResetEvent extends XPrisonEvent implements Cancellable { - - private static final HandlerList HANDLERS_LIST = new HandlerList(); - - @Getter - private Mine mine; - - @Getter - @Setter - private boolean cancelled; - - /** - * Fired when mine is going to be reset - * - * @param mine Mine - */ - public MinePreResetEvent(Mine mine) { - this.mine = mine; - } - - public static HandlerList getHandlerList() { - return HANDLERS_LIST; - } - - @NotNull - @Override - public HandlerList getHandlers() { - return HANDLERS_LIST; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/MineCommand.java b/src/main/java/me/nvus/xprison/mines/commands/MineCommand.java deleted file mode 100644 index 157ee9d..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/MineCommand.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.nvus.xprison.mines.commands; - -import me.nvus.xprison.mines.XPrisonMines; -import lombok.Getter; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public abstract class MineCommand { - - protected XPrisonMines plugin; - @Getter - private final String name; - @Getter - private final String[] aliases; - - public MineCommand(XPrisonMines plugin, String name, String... aliases) { - this.plugin = plugin; - this.name = name; - this.aliases = aliases; - } - - public abstract boolean execute(CommandSender sender, List args); - - public abstract String getUsage(); - - public abstract boolean canExecute(CommandSender sender); -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineAddBlockCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineAddBlockCommand.java deleted file mode 100644 index d52361f..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineAddBlockCommand.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.Material; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.List; - -public class MineAddBlockCommand extends MineCommand { - - public MineAddBlockCommand(XPrisonMines plugin) { - super(plugin, "addblock", "blockadd"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - - if (!(sender instanceof Player)) { - return false; - } - - if (args.size() != 1) { - return false; - } - - Mine mine = this.plugin.getManager().getMineByName(args.get(0)); - - if (mine == null) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_not_exists").replace("%mine%", args.get(0))); - return true; - } - - ItemStack inHand = ((Player) sender).getItemInHand(); - if (inHand == null || inHand.getType() == Material.AIR) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_no_item_in_hand")); - return true; - } - - CompMaterial material = CompMaterial.fromItem(inHand); - mine.getBlockPalette().addToPalette(material, 0.0); - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_block_added").replace("%block%", material.name()).replace("%mine%", mine.getName())); - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines addblock - Adds a block in your hand to the specified mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineCreateCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineCreateCommand.java deleted file mode 100644 index 753080e..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineCreateCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MineCreateCommand extends MineCommand { - - public MineCreateCommand(XPrisonMines plugin) { - super(plugin, "create", "new"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() != 1) { - return false; - } - if (!(sender instanceof Player)) { - return false; - } - - this.plugin.getManager().createMine((Player) sender, args.get(0)); - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines create - Creates a new mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineDeleteCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineDeleteCommand.java deleted file mode 100644 index b547354..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineDeleteCommand.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public class MineDeleteCommand extends MineCommand { - - public MineDeleteCommand(XPrisonMines plugin) { - super(plugin, "delete", "remove"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - - if (args.size() != 1) { - return false; - } - - this.plugin.getManager().deleteMine(sender, args.get(0)); - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines delete - Delete a mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineHelpCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineHelpCommand.java deleted file mode 100644 index 2bee16b..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineHelpCommand.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public class MineHelpCommand extends MineCommand { - - public MineHelpCommand(XPrisonMines plugin) { - super(plugin, "help", "?"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM)) { - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - PlayerUtils.sendMessage(sender, "&e&lMINES ADMIN HELP MENU "); - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - PlayerUtils.sendMessage(sender, "&e/mines create [mine] - Creates a new mine"); - PlayerUtils.sendMessage(sender, "&e/mines delete [mine] - Deletes a mine"); - PlayerUtils.sendMessage(sender, "&e/mines redefine [mine] - Redefine mine region for a mine"); - PlayerUtils.sendMessage(sender, "&e/mines rename [mine] [new_name] - Renames a mine"); - PlayerUtils.sendMessage(sender, "&e/mines reset [mine/all] - Reset a mine"); - PlayerUtils.sendMessage(sender, "&e/mines panel [mine] - Opens a Mine Panel"); - PlayerUtils.sendMessage(sender, "&e/mines save [mine] - Force-save a mine"); - PlayerUtils.sendMessage(sender, "&e/mines addblock [mine] - Adds a block you hold in hand to a mine"); - PlayerUtils.sendMessage(sender, "&e/mines settp [mine] - Sets teleport location of a mine"); - PlayerUtils.sendMessage(sender, "&e/mines tp [mine] - Teleports to a mine"); - PlayerUtils.sendMessage(sender, "&e/mines list - Shows all Mines"); - PlayerUtils.sendMessage(sender, "&e/mines tool - Gives you a selection tool"); - PlayerUtils.sendMessage(sender, "&e/mines migrate - Migrate mines from other plugins. [JetsPrisonMines,MineResetLite]"); - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - } - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines help - Shows usage"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineListCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineListCommand.java deleted file mode 100644 index 55e4211..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineListCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MineListCommand extends MineCommand { - - public MineListCommand(XPrisonMines plugin) { - super(plugin, "list"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (sender instanceof Player) { - this.plugin.getManager().openMinesListGUI((Player) sender); - } else { - PlayerUtils.sendMessage(sender, "All mines:"); - for (Mine mine : this.plugin.getManager().getMines()) { - PlayerUtils.sendMessage(sender, mine.getName()); - } - } - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines list - Display all mines"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineMigrateCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineMigrateCommand.java deleted file mode 100644 index e99eb28..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineMigrateCommand.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.migration.utils.MinesMigrationUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public final class MineMigrateCommand extends MineCommand { - - public MineMigrateCommand(XPrisonMines plugin) { - super(plugin, "migrate"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (sender instanceof Player) { - MinesMigrationUtils.openAllMinesMigrationGui((Player) sender); - } else { - sender.sendMessage("This command can only be executed from game."); - } - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines migrate - Opens Migration GUI"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MinePanelCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MinePanelCommand.java deleted file mode 100644 index ba508e5..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MinePanelCommand.java +++ /dev/null @@ -1,50 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.gui.MinePanelGUI; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MinePanelCommand extends MineCommand { - - public MinePanelCommand(XPrisonMines plugin) { - super(plugin, "panel", "editor"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - - if (!(sender instanceof Player)) { - return false; - } - - if (args.size() != 1) { - return false; - } - - Mine mine = this.plugin.getManager().getMineByName(args.get(0)); - - if (mine == null) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_not_exists").replace("%mine%", args.get(0))); - return true; - } - - new MinePanelGUI(mine, (Player) sender).open(); - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines panel - Opens a editor for a specified mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineRedefineCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineRedefineCommand.java deleted file mode 100644 index 807dd6e..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineRedefineCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MineRedefineCommand extends MineCommand { - - public MineRedefineCommand(XPrisonMines plugin) { - super(plugin, "redefine"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() != 1) { - return false; - } - if (!(sender instanceof Player)) { - return false; - } - - this.plugin.getManager().redefineMine((Player) sender, args.get(0)); - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines redefine - Redefines region for a mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineRenameCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineRenameCommand.java deleted file mode 100644 index 5a338fa..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineRenameCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MineRenameCommand extends MineCommand { - - public MineRenameCommand(XPrisonMines plugin) { - super(plugin, "rename"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (args.size() != 2) { - return false; - } - - if (!(sender instanceof Player)) { - return false; - } - - this.plugin.getManager().renameMine((Player) sender, args.get(0), args.get(1)); - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines rename - Renames a mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineResetCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineResetCommand.java deleted file mode 100644 index 8a177ee..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineResetCommand.java +++ /dev/null @@ -1,56 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public class MineResetCommand extends MineCommand { - - public MineResetCommand(XPrisonMines plugin) { - super(plugin, "reset"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - - if (args.size() != 1) { - return false; - } - - if ("all".equalsIgnoreCase(args.get(0))) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_all_reset_started")); - this.plugin.getManager().resetAllMines(); - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_all_reset_success")); - return true; - } - - Mine mine = this.plugin.getManager().getMineByName(args.get(0)); - - if (mine == null) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_not_exists").replace("%mine%", args.get(0))); - return true; - } - - if (mine.isResetting()) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_already_reset").replace("%mine%", args.get(0))); - return true; - } - - this.plugin.getManager().resetMine(mine); - return true; - } - - @Override - public String getUsage() { - return "&cUsage:/mines reset - Resets mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineSaveCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineSaveCommand.java deleted file mode 100644 index f05a18d..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineSaveCommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public class MineSaveCommand extends MineCommand { - - - public MineSaveCommand(XPrisonMines plugin) { - super(plugin, "save"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - - if (args.size() != 1) { - return false; - } - - Mine mine = this.plugin.getManager().getMineByName(args.get(0)); - - if (mine == null) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_not_exists").replace("%mine%", args.get(0))); - return true; - } - - this.plugin.getManager().getMineSaver().save(mine); - - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_saved").replace("%mine%", mine.getName())); - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines save - Saves a mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineSetTpCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineSetTpCommand.java deleted file mode 100644 index e32e02e..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineSetTpCommand.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MineSetTpCommand extends MineCommand { - - public MineSetTpCommand(XPrisonMines plugin) { - super(plugin, "settp", "tpset"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - - if (!(sender instanceof Player)) { - return false; - } - - if (args.size() != 1) { - return false; - } - - Mine mine = this.plugin.getManager().getMineByName(args.get(0)); - - if (mine == null) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_not_exists").replace("%mine%", args.get(0))); - return true; - } - - return this.plugin.getManager().setTeleportLocation((Player) sender, mine); - } - - @Override - public String getUsage() { - return "&cUsage: /mines settp - Sets the teleport location of specified mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineTeleportCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineTeleportCommand.java deleted file mode 100644 index 7151710..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineTeleportCommand.java +++ /dev/null @@ -1,54 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MineTeleportCommand extends MineCommand { - - public MineTeleportCommand(XPrisonMines plugin) { - super(plugin, "teleport", "tp"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - - if (!(sender instanceof Player)) { - return false; - } - - if (args.size() != 1) { - return false; - } - - Mine mine = this.plugin.getManager().getMineByName(args.get(0)); - - if (mine == null) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_not_exists").replace("%mine%", args.get(0))); - return true; - } - - if (!mine.canTeleport((Player) sender)) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("no_permission")); - return true; - } - - this.plugin.getManager().teleportToMine((Player) sender, mine); - return true; - } - - @Override - public String getUsage() { - return "&cUsage: /mines teleport - Teleports you to a specified mine"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/commands/impl/MineToolCommand.java b/src/main/java/me/nvus/xprison/mines/commands/impl/MineToolCommand.java deleted file mode 100644 index 2c8e9ea..0000000 --- a/src/main/java/me/nvus/xprison/mines/commands/impl/MineToolCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.nvus.xprison.mines.commands.impl; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.commands.MineCommand; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MineToolCommand extends MineCommand { - - public MineToolCommand(XPrisonMines plugin) { - super(plugin, "tool"); - } - - @Override - public boolean execute(CommandSender sender, List args) { - if (!(sender instanceof Player)) { - return false; - } - - if (args.size() != 0) { - return false; - } - - return this.plugin.getManager().giveTool((Player) sender); - } - - @Override - public String getUsage() { - return "/mines tool - Gives you a selection tool"; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(XPrisonMines.MINES_ADMIN_PERM); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/gui/MineBlocksGUI.java b/src/main/java/me/nvus/xprison/mines/gui/MineBlocksGUI.java deleted file mode 100644 index b46732e..0000000 --- a/src/main/java/me/nvus/xprison/mines/gui/MineBlocksGUI.java +++ /dev/null @@ -1,37 +0,0 @@ -package me.nvus.xprison.mines.gui; - -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class MineBlocksGUI extends Gui { - - private final Mine mine; - - public MineBlocksGUI(Mine mine, Player player) { - super(player, 5, mine.getName() + " - Blocks"); - this.mine = mine; - } - - @Override - public void redraw() { - this.clearItems(); - for (CompMaterial material : this.mine.getBlockPalette().getMaterials()) { - double chance = this.mine.getBlockPalette().getPercentage(material); - this.addItem(ItemStackBuilder.of(material.toItem()).name(material.name()).lore(" ", "&7Chance of spawning this blocks", String.format("&7is &b%,.2f%%", chance), " ", "&aLeft-Click &7to edit the chance", "&aRight-Click &7to remove.").build(() -> { - this.mine.getBlockPalette().removeFromPalette(material); - this.redraw(); - }, () -> { - new MineEditBlockChanceGUI(this.getPlayer(), mine, material).open(); - })); - } - - this.setItem(36, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to panel").build(() -> { - this.close(); - new MinePanelGUI(this.mine, this.getPlayer()).open(); - })); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/gui/MineEditBlockChanceGUI.java b/src/main/java/me/nvus/xprison/mines/gui/MineEditBlockChanceGUI.java deleted file mode 100644 index 95c8da3..0000000 --- a/src/main/java/me/nvus/xprison/mines/gui/MineEditBlockChanceGUI.java +++ /dev/null @@ -1,114 +0,0 @@ -package me.nvus.xprison.mines.gui; - -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class MineEditBlockChanceGUI extends Gui { - - private final Mine mine; - private final CompMaterial material; - - private double currentChance; - - public MineEditBlockChanceGUI(Player player, Mine mine, CompMaterial material) { - super(player, 5, "Editing Block Chance"); - this.mine = mine; - this.material = material; - this.currentChance = mine.getBlockPalette().getPercentage(this.material); - } - - @Override - public void redraw() { - this.setItem(4, ItemStackBuilder.of(this.material.toItem()).name("&eBlock Chance").lore(" ", "&7The chance of spawning this", String.format("&7block is &b%,.2f%%", this.currentChance)).buildItem().build()); - - // + - this.setItem(10, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+0.1").build(() -> { - handleChanceAddition(0.1); - })); - this.setItem(11, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+0.2").build(() -> { - handleChanceAddition(0.2); - })); - this.setItem(12, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+0.5").build(() -> { - handleChanceAddition(0.5); - })); - - this.setItem(19, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+1.0").build(() -> { - handleChanceAddition(1.0); - })); - this.setItem(20, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+2.0").build(() -> { - handleChanceAddition(2.0); - })); - this.setItem(21, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+5.0").build(() -> { - handleChanceAddition(5.0); - })); - - this.setItem(28, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+10.0").build(() -> { - handleChanceAddition(10.0); - })); - this.setItem(29, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+20.0").build(() -> { - handleChanceAddition(20.0); - })); - this.setItem(30, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+50.0").build(() -> { - handleChanceAddition(50.0); - })); - - // - - this.setItem(14, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-0.1").build(() -> { - handleChanceAddition(-0.1); - })); - this.setItem(15, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-0.2").build(() -> { - handleChanceAddition(-0.2); - })); - this.setItem(16, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-0.5").build(() -> { - handleChanceAddition(-0.5); - })); - - this.setItem(23, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-1.0").build(() -> { - handleChanceAddition(-1.0); - })); - this.setItem(24, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-2.0").build(() -> { - handleChanceAddition(-2.0); - })); - this.setItem(25, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-5.0").build(() -> { - handleChanceAddition(-5.0); - })); - - this.setItem(32, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-10.0").build(() -> { - handleChanceAddition(-10.0); - })); - this.setItem(33, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-20.0").build(() -> { - handleChanceAddition(-20.0); - })); - this.setItem(34, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-50.0").build(() -> { - handleChanceAddition(-50.0); - })); - - - this.setItem(36, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to all blocks.").build(() -> { - this.close(); - new MineBlocksGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(40, ItemStackBuilder.of(CompMaterial.GREEN_WOOL.toItem()).name("&aSave").lore("&7Click to save the current chance.").build(() -> { - this.close(); - if (this.mine.getBlockPalette().getTotalPercentage() - this.mine.getBlockPalette().getPercentage(this.material) + this.currentChance > 100.0) { - this.currentChance = 100 - (this.mine.getBlockPalette().getTotalPercentage() - this.mine.getBlockPalette().getPercentage(this.material)); - } - this.mine.getBlockPalette().setPercentage(this.material, this.currentChance); - new MineBlocksGUI(this.mine, this.getPlayer()).open(); - })); - - } - - private void handleChanceAddition(double addition) { - if (this.currentChance + addition > 100.0 || this.currentChance + addition < 0.0) { - return; - } - this.currentChance += addition; - this.redraw(); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/gui/MineEditResetPercentageGUI.java b/src/main/java/me/nvus/xprison/mines/gui/MineEditResetPercentageGUI.java deleted file mode 100644 index d3df583..0000000 --- a/src/main/java/me/nvus/xprison/mines/gui/MineEditResetPercentageGUI.java +++ /dev/null @@ -1,110 +0,0 @@ -package me.nvus.xprison.mines.gui; - -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class MineEditResetPercentageGUI extends Gui { - - - private final Mine mine; - - private double currentChance; - - public MineEditResetPercentageGUI(Mine mine, Player player) { - super(player, 5, "Editing Reset Percentage"); - this.mine = mine; - this.currentChance = this.mine.getResetPercentage(); - } - - @Override - public void redraw() { - this.setItem(4, ItemStackBuilder.of(CompMaterial.CLOCK.toItem()).name("&eReset Percentage").lore(" ", "&7Current reset percentage of", String.format("&7this mine is &b%,.2f%%", this.currentChance)).buildItem().build()); - - // + - this.setItem(10, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+0.1").build(() -> { - handleChanceAddition(0.1); - })); - this.setItem(11, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+0.2").build(() -> { - handleChanceAddition(0.2); - })); - this.setItem(12, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+0.5").build(() -> { - handleChanceAddition(0.5); - })); - - this.setItem(19, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+1.0").build(() -> { - handleChanceAddition(1.0); - })); - this.setItem(20, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+2.0").build(() -> { - handleChanceAddition(2.0); - })); - this.setItem(21, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+5.0").build(() -> { - handleChanceAddition(5.0); - })); - - this.setItem(28, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+10.0").build(() -> { - handleChanceAddition(10.0); - })); - this.setItem(29, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+20.0").build(() -> { - handleChanceAddition(20.0); - })); - this.setItem(30, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+50.0").build(() -> { - handleChanceAddition(50.0); - })); - - // - - this.setItem(14, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-0.1").build(() -> { - handleChanceAddition(-0.1); - })); - this.setItem(15, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-0.2").build(() -> { - handleChanceAddition(-0.2); - })); - this.setItem(16, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-0.5").build(() -> { - handleChanceAddition(-0.5); - })); - - this.setItem(23, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-1.0").build(() -> { - handleChanceAddition(-1.0); - })); - this.setItem(24, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-2.0").build(() -> { - handleChanceAddition(-2.0); - })); - this.setItem(25, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-5.0").build(() -> { - handleChanceAddition(-5.0); - })); - - this.setItem(32, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-10.0").build(() -> { - handleChanceAddition(-10.0); - })); - this.setItem(33, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-20.0").build(() -> { - handleChanceAddition(-20.0); - })); - this.setItem(34, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-50.0").build(() -> { - handleChanceAddition(-50.0); - })); - - - this.setItem(36, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to reset settings.").build(() -> { - this.close(); - new MineResetOptionsGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(40, ItemStackBuilder.of(CompMaterial.GREEN_WOOL.toItem()).name("&aSave").lore("&7Click to save the current reset percentage.").build(() -> { - this.close(); - this.mine.setResetPercentage(this.currentChance); - new MineResetOptionsGUI(this.mine, this.getPlayer()).open(); - })); - - } - - private void handleChanceAddition(double addition) { - if (this.currentChance + addition > 95.0 || this.currentChance + addition < 5.0) { - return; - } - this.currentChance += addition; - this.redraw(); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/gui/MineEditTimedResetGUI.java b/src/main/java/me/nvus/xprison/mines/gui/MineEditTimedResetGUI.java deleted file mode 100644 index a5292a6..0000000 --- a/src/main/java/me/nvus/xprison/mines/gui/MineEditTimedResetGUI.java +++ /dev/null @@ -1,71 +0,0 @@ -package me.nvus.xprison.mines.gui; - -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class MineEditTimedResetGUI extends Gui { - - private final Mine mine; - - private int currentTime; - - public MineEditTimedResetGUI(Mine mine, Player player) { - super(player, 5, "Editing Timed Reset"); - this.mine = mine; - this.currentTime = this.mine.getResetTime(); - } - - @Override - public void redraw() { - this.setItem(4, ItemStackBuilder.of(CompMaterial.CLOCK.toItem()).name("&eReset Time (minutes)").lore(" ", "&7Current reset time of", String.format("&7this mine is &b%,d minutes.", this.currentTime)).buildItem().build()); - - // + - - this.setItem(19, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+1.0").build(() -> { - handleTimeAddition(1); - })); - this.setItem(20, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+2.0").build(() -> { - handleTimeAddition(2); - })); - this.setItem(21, ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&a+5.0").build(() -> { - handleTimeAddition(5); - })); - - // - - - this.setItem(23, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-1.0").build(() -> { - handleTimeAddition(-1); - })); - this.setItem(24, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-2.0").build(() -> { - handleTimeAddition(-2); - })); - this.setItem(25, ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&c-5.0").build(() -> { - handleTimeAddition(-5); - })); - - - this.setItem(36, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to reset settings.").build(() -> { - this.close(); - new MineResetOptionsGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(40, ItemStackBuilder.of(CompMaterial.GREEN_WOOL.toItem()).name("&aSave").lore("&7Click to save the current reset time.").build(() -> { - this.close(); - this.mine.setResetTime(this.currentTime); - new MineResetOptionsGUI(this.mine, this.getPlayer()).open(); - })); - - } - - private void handleTimeAddition(int addition) { - if (this.currentTime + addition < 1.0) { - return; - } - this.currentTime += addition; - this.redraw(); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/gui/MineEffectsGUI.java b/src/main/java/me/nvus/xprison/mines/gui/MineEffectsGUI.java deleted file mode 100644 index f8a50a5..0000000 --- a/src/main/java/me/nvus/xprison/mines/gui/MineEffectsGUI.java +++ /dev/null @@ -1,65 +0,0 @@ -package me.nvus.xprison.mines.gui; - -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.Item; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.potion.PotionEffectType; - -public class MineEffectsGUI extends Gui { - - private Mine mine; - - public MineEffectsGUI(Mine mine, Player player) { - super(player, 3, "Player effects"); - this.mine = mine; - } - - @Override - public void redraw() { - - this.clearItems(); - - for (PotionEffectType type : PotionEffectType.values()) { - if (type == null) { - continue; - } - this.addItem(this.getItemForEffect(type)); - } - - this.setItem(26, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to panel").build(() -> { - this.close(); - new MinePanelGUI(this.mine, this.getPlayer()).open(); - })); - } - - private Item getItemForEffect(PotionEffectType type) { - boolean enabled = this.mine.isEffectEnabled(type); - - if (enabled) { - return ItemStackBuilder.of(CompMaterial.GLOWSTONE_DUST.toItem()).name("&7" + type.getName() + " &aENABLED &b(" + this.mine.getEffectLevel(type) + ")").lore("&aShift-Left-Click &7to &aincrease.", "&aShift-Right-Click &7to &cdecrease.", "&aClick &7to disable.").buildItem().bind(event -> { - switch (event.getClick()) { - case LEFT: - this.mine.disableEffect(type); - break; - case SHIFT_LEFT: - this.mine.increaseEffect(type); - break; - case SHIFT_RIGHT: - this.mine.decreaseEffect(type); - break; - } - this.redraw(); - }, ClickType.LEFT, ClickType.SHIFT_RIGHT, ClickType.SHIFT_LEFT).build(); - } else { - return ItemStackBuilder.of(CompMaterial.GUNPOWDER.toItem()).name("&7" + type.getName() + " &cDISABLED").lore("&aClick &7to enable.").build(() -> { - this.mine.enableEffect(type); - this.redraw(); - }); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mines/gui/MineHologramsGUI.java b/src/main/java/me/nvus/xprison/mines/gui/MineHologramsGUI.java deleted file mode 100644 index f1c1fd5..0000000 --- a/src/main/java/me/nvus/xprison/mines/gui/MineHologramsGUI.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.nvus.xprison.mines.gui; - -import me.nvus.xprison.mines.model.mine.HologramType; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class MineHologramsGUI extends Gui { - - private final Mine mine; - - public MineHologramsGUI(Mine mine, Player player) { - super(player, 1, "Mine Holograms"); - this.mine = mine; - } - - @Override - public void redraw() { - this.setItem(0, ItemStackBuilder.of(CompMaterial.NAME_TAG.toItem()).name("&eBlocks Mined Hologram").lore(" ", "&aLeft-Click &7to spawn on your location.", "&aRight-Click &7to remove.").build(() -> { - this.close(); - this.mine.getManager().deleteHologram(this.mine, HologramType.BLOCKS_MINED, this.getPlayer()); - }, () -> { - this.close(); - this.mine.getManager().createHologram(this.mine, HologramType.BLOCKS_MINED, this.getPlayer()); - })); - this.setItem(1, ItemStackBuilder.of(CompMaterial.NAME_TAG.toItem()).name("&eBlocks Left Hologram").lore(" ", "&aLeft-Click &7to spawn on your location.", "&aRight-Click &7to remove.").build(() -> { - this.close(); - this.mine.getManager().deleteHologram(this.mine, HologramType.BLOCKS_LEFT, this.getPlayer()); - }, () -> { - this.close(); - this.mine.getManager().createHologram(this.mine, HologramType.BLOCKS_LEFT, this.getPlayer()); - })); - this.setItem(2, ItemStackBuilder.of(CompMaterial.NAME_TAG.toItem()).name("&eTimed Reset Hologram").lore(" ", "&aLeft-Click &7to spawn on your location.", "&aRight-Click &7to remove.").build(() -> { - this.close(); - this.mine.getManager().deleteHologram(this.mine, HologramType.TIMED_RESET, this.getPlayer()); - }, () -> { - this.close(); - this.mine.getManager().createHologram(this.mine, HologramType.TIMED_RESET, this.getPlayer()); - })); - - this.setItem(8, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to panel").build(() -> { - this.close(); - new MinePanelGUI(this.mine, this.getPlayer()).open(); - })); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/gui/MinePanelGUI.java b/src/main/java/me/nvus/xprison/mines/gui/MinePanelGUI.java deleted file mode 100644 index e99eaf5..0000000 --- a/src/main/java/me/nvus/xprison/mines/gui/MinePanelGUI.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.nvus.xprison.mines.gui; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; - -public class MinePanelGUI extends Gui { - - private Mine mine; - - public MinePanelGUI(Mine mine, Player player) { - super(player, 5, mine.getName() + " Panel"); - this.mine = mine; - } - - @Override - public void redraw() { - for (int i = 0; i < 5 * 9; i++) { - this.setItem(i, ItemStackBuilder.of(CompMaterial.BLACK_STAINED_GLASS_PANE.toItem()).name("&a").buildItem().build()); - } - - this.setItem(11, ItemStackBuilder.of(CompMaterial.DIAMOND_ORE.toItem()).name("&eBlock Percentages").lore(" ", "&7Click to modify blocks in this mine.").build(() -> { - this.close(); - new MineBlocksGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(13, ItemStackBuilder.of(CompMaterial.BEACON.toItem()).name("&eSpawn Location").lore(" ", "&aLeft-Click &7to teleport to mine", "&aRight-Click &7to set the location").build(() -> { - if (XPrisonMines.getInstance().getManager().setTeleportLocation(this.getPlayer(), this.mine)) { - this.close(); - } - }, () -> { - this.close(); - XPrisonMines.getInstance().getManager().teleportToMine(this.getPlayer(), this.mine); - })); - - this.setItem(15, ItemStackBuilder.of(CompMaterial.COMPARATOR.toItem()).name("&eMine Reset Options").lore(" ", "&7Click to modify the reset options.").build(() -> { - this.close(); - new MineResetOptionsGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(29, ItemStackBuilder.of(CompMaterial.NAME_TAG.toItem()).name("&eMine Holograms").lore(" ", "&7Click to modify mine's holograms").build(() -> { - this.close(); - new MineHologramsGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(31, ItemStackBuilder.of(CompMaterial.NETHER_STAR.toItem()).name("&eMine Player Effects").lore(" ", "&7Click to modify mine player effects").build(() -> { - this.close(); - new MineEffectsGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(36, ItemStackBuilder.of(CompMaterial.ARROW.toItem()).name("&cBack").lore("&7Click to show all mines").build(() -> { - this.close(); - XPrisonMines.getInstance().getManager().openMinesListGUI(this.getPlayer()); - })); - - this.setItem(44, ItemStackBuilder.of(CompMaterial.BARRIER.toItem()).name("&c&lDELETE MINE").lore("&7This action cannot be undone!", " ", "&aShift-Left-Click &7to delete this mine.").build(ClickType.SHIFT_LEFT, () -> { - if (XPrisonMines.getInstance().getManager().deleteMine(this.getPlayer(), mine)) { - this.close(); - XPrisonMines.getInstance().getManager().openMinesListGUI(this.getPlayer()); - } - })); - - } -} diff --git a/src/main/java/me/nvus/xprison/mines/gui/MineResetOptionsGUI.java b/src/main/java/me/nvus/xprison/mines/gui/MineResetOptionsGUI.java deleted file mode 100644 index 37bb447..0000000 --- a/src/main/java/me/nvus/xprison/mines/gui/MineResetOptionsGUI.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.nvus.xprison.mines.gui; - -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.mines.model.mine.reset.ResetType; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public class MineResetOptionsGUI extends Gui { - - private final Mine mine; - - public MineResetOptionsGUI(Mine mine, Player player) { - super(player, 5, "Reset Options"); - this.mine = mine; - } - - @Override - public void redraw() { - - for (int i = 0; i < 5 * 9; i++) { - this.setItem(i, ItemStackBuilder.of(CompMaterial.BLACK_STAINED_GLASS_PANE.toItem()).name("&a").buildItem().build()); - } - - this.setItem(11, ItemStackBuilder.of(CompMaterial.STONE_BUTTON.toItem()).name("&eReset NOW").lore(" ", "&7Resets the mine now.").build(() -> { - this.close(); - this.mine.getManager().resetMine(this.mine); - })); - - this.setItem(13, ItemStackBuilder.of(CompMaterial.COMPARATOR.toItem()).name("&eReset Type: " + this.mine.getResetType().getName()).lore(" ", "&7Instant: Will use more CPU power", "&7but the mine will reset instantly.", " ", "&7Gradual: Will use less CPU power", "&7but mine reset may take more time.", " ", "&aClick &7to change.").build(() -> { - if (this.mine.getResetType() == ResetType.GRADUAL) { - this.mine.setResetType(ResetType.INSTANT); - } else { - this.mine.setResetType(ResetType.GRADUAL); - } - this.redraw(); - })); - - this.setItem(15, ItemStackBuilder.of(CompMaterial.CLOCK.toItem()).name("&eEdit Reset Percentage").lore(" ", "&7Click to edit mine's reset percentage").build(() -> { - this.close(); - new MineEditResetPercentageGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(29, ItemStackBuilder.of(CompMaterial.CLOCK.toItem()).name("&eEdit Timed Reset").lore(" ", "&7Click to edit timed reset").build(() -> { - this.close(); - new MineEditTimedResetGUI(this.mine, this.getPlayer()).open(); - })); - - this.setItem(31, ItemStackBuilder.of(CompMaterial.PAPER.toItem()).name("&eBroadcast Reset: " + this.mine.isBroadcastReset()).lore(" ", "&aTrue &7- All players will get message", "&7on mine's reset.", "&cFalse &7- No broadcast message.").build(() -> { - this.mine.setBroadcastReset(!this.mine.isBroadcastReset()); - this.redraw(); - })); - - this.setItem(36, ItemStackBuilder.of(Material.ARROW).name("&cBack").lore("&7Click to go back to panel").build(() -> { - this.close(); - new MinePanelGUI(this.mine, this.getPlayer()).open(); - })); - - - } -} diff --git a/src/main/java/me/nvus/xprison/mines/listener/MinesListener.java b/src/main/java/me/nvus/xprison/mines/listener/MinesListener.java deleted file mode 100644 index 4425d5f..0000000 --- a/src/main/java/me/nvus/xprison/mines/listener/MinesListener.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.nvus.xprison.mines.listener; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.managers.MineManager; -import me.nvus.xprison.mines.model.mine.Mine; -import me.lucko.helper.Events; -import me.lucko.helper.serialize.Position; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.player.PlayerInteractEvent; - -import java.util.Arrays; - -public class MinesListener { - - private final XPrisonMines plugin; - - public MinesListener(XPrisonMines plugin) { - this.plugin = plugin; - } - - public void register() { - this.subscribeToBlockBreakEvent(); - this.subscribeToPlayerInteractEvent(); - } - - private void subscribeToBlockBreakEvent() { - Events.subscribe(BlockBreakEvent.class, EventPriority.HIGH) - .filter(e -> !e.isCancelled()) - .handler(e -> { - Mine mine = this.plugin.getManager().getMineAtLocation(e.getBlock().getLocation()); - - if (mine == null) { - return; - } - - if (mine.isResetting()) { - e.setCancelled(true); - return; - } - - mine.handleBlockBreak(Arrays.asList(e.getBlock())); - }).bindWith(this.plugin.getCore()); - } - - private void subscribeToPlayerInteractEvent() { - Events.subscribe(PlayerInteractEvent.class) - .filter(e -> e.getItem() != null && e.getItem().isSimilar(MineManager.SELECTION_TOOL) && e.getClickedBlock() != null) - .handler(e -> { - int pos = e.getAction() == Action.LEFT_CLICK_BLOCK ? 1 : e.getAction() == Action.RIGHT_CLICK_BLOCK ? 2 : -1; - - if (pos == -1) { - return; - } - - e.setCancelled(true); - - this.plugin.getManager().selectPosition(e.getPlayer(), pos, Position.of(e.getClickedBlock())); - }).bindWith(this.plugin.getCore()); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/managers/MineManager.java b/src/main/java/me/nvus/xprison/mines/managers/MineManager.java deleted file mode 100644 index c6c1958..0000000 --- a/src/main/java/me/nvus/xprison/mines/managers/MineManager.java +++ /dev/null @@ -1,526 +0,0 @@ -package me.nvus.xprison.mines.managers; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.api.events.MineCreateEvent; -import me.nvus.xprison.mines.api.events.MineDeleteEvent; -import me.nvus.xprison.mines.api.events.MinePostResetEvent; -import me.nvus.xprison.mines.api.events.MinePreResetEvent; -import me.nvus.xprison.mines.gui.MinePanelGUI; -import me.nvus.xprison.mines.model.mine.HologramType; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.mines.model.mine.MineSelection; -import me.nvus.xprison.mines.model.mine.loader.MineFileLoader; -import me.nvus.xprison.mines.model.mine.loader.MineLoader; -import me.nvus.xprison.mines.model.mine.saver.MineFileSaver; -import me.nvus.xprison.mines.model.mine.saver.MineSaver; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.location.LocationUtils; -import me.nvus.xprison.utils.misc.TimeUtil; -import me.nvus.xprison.utils.player.PlayerUtils; -import lombok.Getter; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.hologram.Hologram; -import me.lucko.helper.menu.Item; -import me.lucko.helper.menu.paginated.PaginatedGuiBuilder; -import me.lucko.helper.serialize.Point; -import me.lucko.helper.serialize.Position; -import me.lucko.helper.serialize.Region; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.command.CommandSender; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffectType; - -import java.io.File; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -public class MineManager { - - public static final ItemStack SELECTION_TOOL = ItemStackBuilder.of(Material.STICK).enchant(Enchantment.DURABILITY).name("&eMine Selection Tool").lore("&aRight-Click &fto set &aPosition 1 &7(MIN)", "&aLeft-Click &fto set &aPosition 2 &7(MAX)").build(); - - private final MineLoader mineLoader; - private final MineSaver mineSaver; - - @Getter - private final XPrisonMines plugin; - - private final Map mineSelections; - private Map mines; - - private List hologramBlocksLeftLines; - private List hologramBlocksMinedLines; - private List hologramTimedResetLines; - - private File minesDirectory; - - public MineManager(XPrisonMines plugin) { - this.plugin = plugin; - this.mineSelections = new HashMap<>(); - this.hologramBlocksLeftLines = this.plugin.getConfig().get().getStringList("holograms.blocks_left"); - this.hologramBlocksMinedLines = this.plugin.getConfig().get().getStringList("holograms.blocks_mined"); - this.hologramTimedResetLines = this.plugin.getConfig().get().getStringList("holograms.timed_reset"); - this.mineLoader = new MineFileLoader(this); - this.mineSaver = new MineFileSaver(this); - } - - public void enable() { - this.setupMinesDirectory(); - this.loadMines(); - } - - public List getHologramBlocksLeftLines(Mine mine) { - List copy = new ArrayList<>(); - for (String s : this.hologramBlocksLeftLines) { - copy.add(s.replace("%mine%", mine.getName()).replace("%blocks%", String.format("%,.2f", (double) mine.getCurrentBlocks() / mine.getTotalBlocks() * 100.0D))); - } - return copy; - } - - - public List getHologramBlocksMinedLines(Mine mine) { - List copy = new ArrayList<>(); - for (String s : this.hologramBlocksMinedLines) { - copy.add(s.replace("%mine%", mine.getName()).replace("%blocks%", String.format("%,d", mine.getTotalBlocks() - mine.getCurrentBlocks()))); - } - return copy; - } - - private void setupMinesDirectory() { - File directory = new File(this.plugin.getCore().getDataFolder().getPath() + "/mines/"); - - if (!directory.exists()) { - directory.mkdir(); - this.plugin.getCore().getLogger().info("Created /mines directory"); - } - this.minesDirectory = directory; - } - - private void loadMines() { - this.mines = new HashMap<>(); - File[] files = this.minesDirectory.listFiles(); - - if (files == null) { - return; - } - - for (File file : files) { - if (!file.getName().endsWith(".json")) { - continue; - } - - Mine mine = this.mineLoader.load(file); - - if (mine == null) { - continue; - } - - this.mines.put(mine.getName(), mine); - this.plugin.getCore().getLogger().info("Loaded Mine " + mine.getName()); - - double ratio = (double) mine.getCurrentBlocks() / mine.getTotalBlocks() * 100.0; - - if (ratio <= mine.getResetPercentage() && !mine.isResetting()) { - this.resetMine(mine); - } - } - } - - private void saveMines() { - this.getMines().forEach(this.mineSaver::save); - } - - public void selectPosition(Player player, int position, Position pos) { - - MineSelection selection; - - if (!mineSelections.containsKey(player.getUniqueId())) { - this.mineSelections.put(player.getUniqueId(), new MineSelection()); - } - - selection = this.mineSelections.get(player.getUniqueId()); - - switch (position) { - case 1: - selection.setPos1(pos); - break; - case 2: - selection.setPos2(pos); - break; - } - - if (selection.isValid()) { - PlayerUtils.sendMessage(player, this.plugin.getMessage("selection_valid")); - } - - PlayerUtils.sendMessage(player, this.plugin.getMessage("selection_point_set").replace("%position%", String.valueOf(position)).replace("%location%", LocationUtils.toXYZW(pos.toLocation()))); - } - - public MineSelection getMineSelection(Player player) { - return this.mineSelections.get(player.getUniqueId()); - } - - public boolean createMine(Player creator, String name) { - MineSelection selection = this.getMineSelection(creator); - - if (selection == null || !selection.isValid()) { - PlayerUtils.sendMessage(creator, this.plugin.getMessage("selection_invalid")); - return false; - } - - if (this.getMineByName(name) != null) { - PlayerUtils.sendMessage(creator, this.plugin.getMessage("mine_exists")); - return false; - } - - Mine mine = new Mine(this, name, selection.toRegion()); - - MineCreateEvent event = new MineCreateEvent(creator, mine); - - Events.call(event); - - if (event.isCancelled()) { - this.plugin.getCore().debug("MineCreateEvent was cancelled.", this.plugin); - return true; - } - - this.mines.put(mine.getName(), mine); - - this.mineSaver.save(mine); - - PlayerUtils.sendMessage(creator, this.plugin.getMessage("mine_created").replace("%mine%", name)); - return true; - } - - public boolean deleteMine(CommandSender sender, String name) { - Mine mine = this.getMineByName(name); - - if (mine == null) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_not_exists").replace("%mine%", name)); - return false; - } - - return deleteMine(sender, mine); - } - - public boolean deleteMine(CommandSender sender, Mine mine) { - MineDeleteEvent event = new MineDeleteEvent(mine); - - Events.call(event); - - if (event.isCancelled()) { - this.plugin.getCore().debug("MineDeleteEvent was cancelled.", this.plugin); - return true; - } - - if (mine.getFile() != null) { - mine.getFile().delete(); - } - - mine.stopTicking(); - - this.despawnHolograms(mine); - - this.mines.remove(mine.getName()); - - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_deleted").replace("%mine%", mine.getName())); - return true; - } - - public Mine getMineByName(String name) { - return this.mines.get(name); - } - - public Mine getMineAtLocation(Location loc) { - for (Mine mine : this.mines.values()) { - if (mine.isInMine(loc)) { - return mine; - } - } - return null; - } - - public void disable() { - this.saveMines(); - this.getMines().forEach(this::despawnHolograms); - } - - public Collection getMines() { - return this.mines.values(); - } - - public boolean teleportToMine(Player player, Mine mine) { - - if (mine.getTeleportLocation() == null) { - PlayerUtils.sendMessage(player, this.plugin.getMessage("mine_no_teleport_location").replace("%mine%", mine.getName())); - return false; - } - - player.teleport(mine.getTeleportLocation().toLocation()); - PlayerUtils.sendMessage(player, this.plugin.getMessage("mine_teleport").replace("%mine%", mine.getName())); - return true; - } - - public void openMinesListGUI(Player player) { - PaginatedGuiBuilder builder = PaginatedGuiBuilder.create(); - - builder.lines(6); - builder.title("Mine List"); - builder.nextPageSlot(53); - builder.previousPageSlot(44); - builder.nextPageItem((pageInfo) -> ItemStackBuilder.of(Material.ARROW).name("&aNext Page").lore("&7Click to see next page.").build()); - builder.previousPageItem((pageInfo) -> ItemStackBuilder.of(Material.ARROW).name("&aPrevious Page").lore("&7Click to see previous page.").build()); - - builder.build(player, paginatedGui -> { - List items = new ArrayList<>(); - List mines = this.mines.values().stream().sorted(Comparator.comparing(Mine::getName)).collect(Collectors.toList()); - for (Mine mine : mines) { - items.add(ItemStackBuilder.of(Material.STONE).name(mine.getName()).lore("&aLeft-Click &7to open Mine Panel for this mine.", "&aRight-Click &7to teleport to this mine.").build(() -> { - this.teleportToMine(player, mine); - }, () -> { - new MinePanelGUI(mine, player).open(); - })); - } - return items; - }).open(); - - } - - public boolean setTeleportLocation(Player player, Mine mine) { - mine.setTeleportLocation(Point.of(player.getLocation())); - PlayerUtils.sendMessage(player, this.plugin.getMessage("mine_teleport_set").replace("%mine%", mine.getName())); - return true; - } - - public boolean giveTool(Player sender) { - sender.getInventory().addItem(SELECTION_TOOL); - PlayerUtils.sendMessage(sender, this.plugin.getMessage("selection_tool_given")); - return true; - } - - public void reload() { - this.hologramBlocksLeftLines = this.plugin.getConfig().get().getStringList("holograms.blocks_left"); - this.hologramBlocksMinedLines = this.plugin.getConfig().get().getStringList("holograms.blocks_mined"); - this.hologramTimedResetLines = this.plugin.getConfig().get().getStringList("holograms.timed_reset"); - } - - public boolean addMineFromMigration(Mine migrated) { - - if (migrated == null) { - return false; - } - - if (this.mines.containsKey(migrated.getName())) { - return false; - } - - this.mines.put(migrated.getName(), migrated); - - return true; - } - - public void resetAllMines() { - this.getMines().forEach(this::resetMine); - } - - public List getHologramTimedResetLines(Mine mine) { - List copy = new ArrayList<>(); - for (String s : this.hologramTimedResetLines) { - copy.add(s.replace("%mine%", mine.getName()).replace("%time%", TimeUtil.getTime(mine.getSecondsToNextReset()))); - } - return copy; - } - - public void resetMine(Mine mine) { - - if (mine == null) { - return; - } - - if (mine.isResetting()) { - return; - } - - MinePreResetEvent preResetEvent = new MinePreResetEvent(mine); - - Events.call(preResetEvent); - - if (preResetEvent.isCancelled()) { - this.getPlugin().getCore().debug("MinePreResetEvent was cancelled.", this.getPlugin()); - return; - } - - mine.setResetting(true); - - if (mine.isBroadcastReset()) { - mine.getPlayersInMine().forEach(player -> PlayerUtils.sendMessage(player, this.getPlugin().getMessage("mine_resetting").replace("%mine%", mine.getName()))); - } - - Schedulers.sync().runLater(() -> { - - if (mine.getTeleportLocation() != null) { - mine.getPlayersInMine().forEach(player -> player.teleport(mine.getTeleportLocation().toLocation())); - } - - mine.getResetType().reset(mine, mine.getBlockPalette()); - - if (mine.isBroadcastReset()) { - mine.getPlayersInMine().forEach(player -> PlayerUtils.sendMessage(player, this.getPlugin().getMessage("mine_reset").replace("%mine%", mine.getName()))); - } - - mine.setNextResetDate(new Date(System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(mine.getResetTime()))); - - mine.setResetting(false); - - MinePostResetEvent postResetEvent = new MinePostResetEvent(mine); - - Events.call(postResetEvent); - }, 5, TimeUnit.SECONDS); - - } - - public void giveMineEffects(Mine mine, Player player) { - for (PotionEffectType type : mine.getMineEffects().keySet()) { - player.removePotionEffect(type); - player.addPotionEffect(mine.getEffect(type)); - } - } - - - public void createHologram(Mine mine, HologramType type, Player player) { - switch (type) { - case BLOCKS_LEFT: { - if (mine.getBlocksLeftHologram() == null) { - mine.setBlocksLeftHologram(Hologram.create(Position.of(player.getLocation()), this.getHologramBlocksLeftLines(mine))); - mine.getBlocksLeftHologram().spawn(); - } else { - mine.getBlocksLeftHologram().despawn(); - mine.getBlocksLeftHologram().updatePosition(Position.of(player.getLocation())); - mine.getBlocksLeftHologram().spawn(); - } - break; - } - case BLOCKS_MINED: { - if (mine.getBlocksMinedHologram() == null) { - mine.setBlocksMinedHologram(Hologram.create(Position.of(player.getLocation()), this.getHologramBlocksMinedLines(mine))); - mine.getBlocksMinedHologram().spawn(); - } else { - mine.getBlocksMinedHologram().despawn(); - mine.getBlocksMinedHologram().updatePosition(Position.of(player.getLocation())); - mine.getBlocksMinedHologram().spawn(); - } - break; - } - case TIMED_RESET: { - if (mine.getTimedResetHologram() == null) { - mine.setTimedResetHologram(Hologram.create(Position.of(player.getLocation()), this.getHologramTimedResetLines(mine))); - mine.getTimedResetHologram().spawn(); - } else { - mine.getTimedResetHologram().despawn(); - mine.getTimedResetHologram().updatePosition(Position.of(player.getLocation())); - mine.getTimedResetHologram().spawn(); - } - break; - } - } - PlayerUtils.sendMessage(player, this.getPlugin().getMessage("mine_hologram_create").replace("%type%", type.name()).replace("%mine%", mine.getName())); - } - - public void deleteHologram(Mine mine, HologramType type, Player player) { - switch (type) { - case BLOCKS_LEFT: { - if (mine.getBlocksLeftHologram() != null) { - mine.getBlocksLeftHologram().despawn(); - mine.setBlocksLeftHologram(null); - } - break; - } - case BLOCKS_MINED: { - if (mine.getBlocksMinedHologram() != null) { - mine.getBlocksMinedHologram().despawn(); - mine.setBlocksMinedHologram(null); - } - break; - } - case TIMED_RESET: { - if (mine.getTimedResetHologram() != null) { - mine.getTimedResetHologram().despawn(); - mine.setTimedResetHologram(null); - } - break; - } - } - PlayerUtils.sendMessage(player, this.getPlugin().getMessage("mine_hologram_delete").replace("%type%", type.name()).replace("%mine%", mine.getName())); - } - - private void despawnHolograms(Mine mine) { - - if (mine.getBlocksMinedHologram() != null) { - mine.getBlocksMinedHologram().despawn(); - } - - if (mine.getBlocksLeftHologram() != null) { - mine.getBlocksLeftHologram().despawn(); - } - - if (mine.getTimedResetHologram() != null) { - mine.getTimedResetHologram().despawn(); - } - } - - public boolean renameMine(Player sender, String oldMineName, String newName) { - - Mine mine = this.getMineByName(oldMineName); - - if (mine == null) { - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_not_exists")); - return false; - } - - if (mine.getFile() != null) { - mine.getFile().delete(); - } - - this.mines.remove(oldMineName); - mine.setName(newName); - this.mines.put(newName, mine); - - this.mineSaver.save(mine); - - PlayerUtils.sendMessage(sender, this.plugin.getMessage("mine_renamed").replace("%mine%", oldMineName).replace("%new_name%", newName)); - return true; - } - - public boolean redefineMine(Player creator, String name) { - MineSelection selection = this.getMineSelection(creator); - - if (selection == null || !selection.isValid()) { - PlayerUtils.sendMessage(creator, this.plugin.getMessage("selection_invalid")); - return false; - } - - Mine mine = this.getMineByName(name); - if (mine == null) { - PlayerUtils.sendMessage(creator, this.plugin.getMessage("mine_not_exists")); - return false; - } - - Region region = selection.toRegion(); - mine.setMineRegion(region); - - PlayerUtils.sendMessage(creator, this.plugin.getMessage("mine_redefined").replace("%mine%", name)); - return true; - } - - public MineLoader getMineLoader() { - return mineLoader; - } - - public MineSaver getMineSaver() { - return mineSaver; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/migration/exception/MinesMigrationNotSupportedException.java b/src/main/java/me/nvus/xprison/mines/migration/exception/MinesMigrationNotSupportedException.java deleted file mode 100644 index 038b5c2..0000000 --- a/src/main/java/me/nvus/xprison/mines/migration/exception/MinesMigrationNotSupportedException.java +++ /dev/null @@ -1,8 +0,0 @@ -package me.nvus.xprison.mines.migration.exception; - -public class MinesMigrationNotSupportedException extends Throwable { - - public MinesMigrationNotSupportedException(String pluginName) { - super("Mines migration from plugin " + pluginName + " is not supported!"); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/migration/gui/AllMinesMigrationGui.java b/src/main/java/me/nvus/xprison/mines/migration/gui/AllMinesMigrationGui.java deleted file mode 100644 index 8f8308f..0000000 --- a/src/main/java/me/nvus/xprison/mines/migration/gui/AllMinesMigrationGui.java +++ /dev/null @@ -1,69 +0,0 @@ -package me.nvus.xprison.mines.migration.gui; - -import me.nvus.xprison.mines.migration.model.MinesMigration; -import me.nvus.xprison.mines.migration.model.impl.MineResetLiteMigration; -import me.nvus.xprison.mines.migration.utils.MinesMigrationUtils; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.Item; -import me.lucko.helper.menu.scheme.MenuPopulator; -import me.lucko.helper.menu.scheme.MenuScheme; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -public final class AllMinesMigrationGui extends Gui { - - private static final MenuScheme LAYOUT_WHITE = new MenuScheme() - .mask("011111110") - .mask("110000011") - .mask("100000001") - .mask("110000011") - .mask("011111110"); - - private static final MenuScheme LAYOUT_RED = new MenuScheme() - .mask("100000001") - .mask("000000000") - .mask("000000000") - .mask("000000000") - .mask("100000001"); - - public AllMinesMigrationGui(Player player) { - super(player, 5, "Mines Migration"); - } - - @Override - public void redraw() { - if (isFirstDraw()) { - populateLayout(); - } - this.populateAvailableMigrations(); - } - - private void populateAvailableMigrations() { - try { - MinesMigration migration = new MineResetLiteMigration(); - this.addItem(createItemForMigration(migration)); - } catch (NoClassDefFoundError e) { - - } - } - - private Item createItemForMigration(MinesMigration migration) { - return ItemStackBuilder.of(Material.DIAMOND_PICKAXE).name("&a" + migration.getFromPlugin()).lore(" ", "&7Click to migrate mines from this plugin.", " ").build(() -> MinesMigrationUtils.openMinesMigrationGui(getPlayer(), migration)); - } - - private void populateLayout() { - MenuPopulator populator = LAYOUT_WHITE.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.WHITE_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - - populator = LAYOUT_RED.newPopulator(this); - - while (populator.hasSpace()) { - populator.accept(ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name(" ").buildItem().build()); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mines/migration/gui/MinesMigrationGui.java b/src/main/java/me/nvus/xprison/mines/migration/gui/MinesMigrationGui.java deleted file mode 100644 index 4e17d2f..0000000 --- a/src/main/java/me/nvus/xprison/mines/migration/gui/MinesMigrationGui.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.nvus.xprison.mines.migration.gui; - -import me.nvus.xprison.mines.migration.model.MinesMigration; -import me.nvus.xprison.utils.gui.ConfirmationGui; -import org.bukkit.entity.Player; - -public final class MinesMigrationGui extends ConfirmationGui { - - private final MinesMigration migration; - - public MinesMigrationGui(Player player, MinesMigration migration) { - super(player, "Migrate from " + migration.getFromPlugin() + "?"); - this.migration = migration; - } - - @Override - public void confirm(boolean confirm) { - this.close(); - if (confirm) { - migration.migrate(getPlayer()); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mines/migration/model/MinesMigration.java b/src/main/java/me/nvus/xprison/mines/migration/model/MinesMigration.java deleted file mode 100644 index 311e422..0000000 --- a/src/main/java/me/nvus/xprison/mines/migration/model/MinesMigration.java +++ /dev/null @@ -1,74 +0,0 @@ -package me.nvus.xprison.mines.migration.model; - -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.player.PlayerUtils; -import lombok.Getter; -import org.bukkit.command.CommandSender; - -import java.util.ArrayList; -import java.util.List; - -public abstract class MinesMigration { - - @Getter - protected String fromPlugin; - - public MinesMigration(String fromPlugin) { - this.fromPlugin = fromPlugin; - } - - public void migrate(CommandSender sender) { - - List migrated = migrateAllMines(sender); - - int completed = 0, skipped = 0; - - for (Mine mine : migrated) { - if (this.getMinesPlugin().getManager().addMineFromMigration(mine)) { - PlayerUtils.sendMessage(sender, this.getMinesPlugin().getMessage("mine_migration_mine_completed").replace("%plugin%", this.fromPlugin).replace("%mine%", mine.getName())); - completed++; - } else { - PlayerUtils.sendMessage(sender, this.getMinesPlugin().getMessage("mine_migration_mine_skipped").replace("%plugin%", this.fromPlugin).replace("%mine%", mine.getName())); - skipped++; - } - } - - PlayerUtils.sendMessage(sender, this.getMinesPlugin().getMessage("mine_migration_completed").replace("%plugin%", this.fromPlugin)); - PlayerUtils.sendMessage(sender, this.getMinesPlugin().getMessage("mine_migration_result").replace("%plugin%", this.fromPlugin).replace("%completed%", String.format("%,d", completed)).replace("%skipped%", String.format("%,d", skipped))); - } - - private List migrateAllMines(CommandSender sender) { - - List migratedMines = new ArrayList<>(); - - if (!this.preValidateMigration()) { - PlayerUtils.sendMessage(sender, this.getMinesPlugin().getMessage("mine_migration_plugin_not_present").replace("%plugin%", this.fromPlugin)); - return migratedMines; - } - - PlayerUtils.sendMessage(sender, this.getMinesPlugin().getMessage("mine_migration_started").replace("%plugin%", this.fromPlugin)); - - for (T type : this.getMinesToMigrate()) { - - Mine mine = this.migrate(type); - - if (mine != null) { - migratedMines.add(mine); - } - } - - return migratedMines; - } - - private XPrisonMines getMinesPlugin() { - return XPrisonMines.getInstance(); - } - - protected abstract boolean preValidateMigration(); - - protected abstract Mine migrate(T mineClass); - - protected abstract List getMinesToMigrate(); - -} diff --git a/src/main/java/me/nvus/xprison/mines/migration/model/impl/MineResetLiteMigration.java b/src/main/java/me/nvus/xprison/mines/migration/model/impl/MineResetLiteMigration.java deleted file mode 100644 index 4ccff63..0000000 --- a/src/main/java/me/nvus/xprison/mines/migration/model/impl/MineResetLiteMigration.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.nvus.xprison.mines.migration.model.impl; - -import com.koletar.jj.mineresetlite.Mine; -import com.koletar.jj.mineresetlite.MineResetLite; -import com.koletar.jj.mineresetlite.SerializableBlock; -import me.nvus.xprison.mines.migration.model.MinesMigration; -import me.nvus.xprison.mines.model.mine.BlockPalette; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.lucko.helper.serialize.Point; -import me.lucko.helper.serialize.Position; -import me.lucko.helper.serialize.Region; -import org.bukkit.Bukkit; - -import java.util.List; -import java.util.Map; - -public final class MineResetLiteMigration extends MinesMigration { - - private final MineResetLite plugin; - - public MineResetLiteMigration() { - super("MineResetLite"); - this.plugin = ((MineResetLite) Bukkit.getPluginManager().getPlugin(this.fromPlugin)); - } - - @Override - protected List getMinesToMigrate() { - return this.plugin.mines; - } - - @Override - protected boolean preValidateMigration() { - return this.plugin != null; - } - - @Override - protected me.nvus.xprison.mines.model.mine.Mine migrate(Mine mine) { - me.nvus.xprison.mines.model.mine.Mine.Builder builder = new me.nvus.xprison.mines.model.mine.Mine.Builder(); - - //Name - String name = mine.getName(); - builder.name(name); - - //Region - Position minPoint = Position.of(mine.getMinX(), mine.getMinY(), mine.getMinZ(), mine.getWorld()); - Position maxPoint = Position.of(mine.getMaxX(), mine.getMaxY(), mine.getMaxZ(), mine.getWorld()); - Region region = minPoint.regionWith(maxPoint); - builder.region(region); - - //Teleport location - if (mine.getTpPos() != null) { - Point teleportLocation = Point.of(mine.getTpPos()); - builder.teleportLocation(teleportLocation); - } - - //Block palette - BlockPalette blockPalette = new BlockPalette(); - - for (Map.Entry entry : mine.getComposition().entrySet()) { - double chance = entry.getValue(); - CompMaterial material = CompMaterial.fromId(entry.getKey().getBlockId(), entry.getKey().getData()); - blockPalette.addToPalette(material, chance); - } - - builder.blockPalette(blockPalette); - return builder.build(); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/migration/utils/MinesMigrationFactory.java b/src/main/java/me/nvus/xprison/mines/migration/utils/MinesMigrationFactory.java deleted file mode 100644 index 07a4e05..0000000 --- a/src/main/java/me/nvus/xprison/mines/migration/utils/MinesMigrationFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.nvus.xprison.mines.migration.utils; - -import me.nvus.xprison.mines.migration.exception.MinesMigrationNotSupportedException; -import me.nvus.xprison.mines.migration.model.MinesMigration; -import me.nvus.xprison.mines.migration.model.impl.MineResetLiteMigration; - -public class MinesMigrationFactory { - - public static MinesMigration fromPlugin(String pluginName) throws MinesMigrationNotSupportedException { - - if ("mineresetlite".equalsIgnoreCase(pluginName)) { - return new MineResetLiteMigration(); - } - throw new MinesMigrationNotSupportedException(pluginName); - - } -} diff --git a/src/main/java/me/nvus/xprison/mines/migration/utils/MinesMigrationUtils.java b/src/main/java/me/nvus/xprison/mines/migration/utils/MinesMigrationUtils.java deleted file mode 100644 index b6a1aa8..0000000 --- a/src/main/java/me/nvus/xprison/mines/migration/utils/MinesMigrationUtils.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.nvus.xprison.mines.migration.utils; - -import me.nvus.xprison.mines.migration.gui.AllMinesMigrationGui; -import me.nvus.xprison.mines.migration.gui.MinesMigrationGui; -import me.nvus.xprison.mines.migration.model.MinesMigration; -import org.bukkit.entity.Player; - -public class MinesMigrationUtils { - - public static void openMinesMigrationGui(Player player, MinesMigration migration) { - MinesMigrationGui gui = new MinesMigrationGui(player, migration); - gui.open(); - } - - public static void openAllMinesMigrationGui(Player player) { - AllMinesMigrationGui gui = new AllMinesMigrationGui(player); - gui.open(); - } - - - private MinesMigrationUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/BlockPalette.java b/src/main/java/me/nvus/xprison/mines/model/mine/BlockPalette.java deleted file mode 100644 index 78330a8..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/BlockPalette.java +++ /dev/null @@ -1,96 +0,0 @@ -package me.nvus.xprison.mines.model.mine; - -import com.google.common.base.Preconditions; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.lucko.helper.gson.GsonSerializable; -import me.lucko.helper.gson.JsonBuilder; - -import javax.annotation.Nonnull; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -public class BlockPalette implements GsonSerializable { - - private Map blockPercentages; - - public BlockPalette() { - this.blockPercentages = new HashMap<>(); - } - - private BlockPalette(Map blockPercentages) { - this.blockPercentages = blockPercentages; - } - - public static BlockPalette deserialize(JsonElement element) { - Preconditions.checkArgument(element.isJsonObject()); - JsonObject object = element.getAsJsonObject(); - - Map blocks = new HashMap<>(); - - for (Map.Entry entry : object.entrySet()) { - CompMaterial material = CompMaterial.valueOf(entry.getKey()); - double percentage = entry.getValue().getAsDouble(); - if (percentage <= 0.0) { - continue; - } - blocks.put(material, percentage); - } - - return new BlockPalette(blocks); - } - - public boolean contains(CompMaterial material) { - return blockPercentages.containsKey(material); - } - - public double getPercentage(CompMaterial material) { - return blockPercentages.getOrDefault(material, 0.0); - } - - public void setPercentage(CompMaterial material, double newPercentage) { - if (newPercentage <= 0.0) { - this.blockPercentages.remove(material); - } else { - this.blockPercentages.put(material, newPercentage); - } - } - - public void addToPalette(CompMaterial material, double percentage) { - this.blockPercentages.put(material, percentage); - } - - public void removeFromPalette(CompMaterial material) { - this.blockPercentages.remove(material); - } - - public Set getMaterials() { - return this.blockPercentages.keySet(); - } - - public Set getValidMaterials() { - return this.blockPercentages.keySet().stream().filter(material -> getPercentage(material) > 0.0).collect(Collectors.toSet()); - } - - public double getTotalPercentage() { - return this.blockPercentages.values().stream().mapToDouble(Double::valueOf).sum(); - } - - @Nonnull - @Override - public JsonElement serialize() { - JsonBuilder.JsonObjectBuilder builder = JsonBuilder.object(); - - for (Map.Entry entry : blockPercentages.entrySet()) { - builder.addIfAbsent(entry.getKey().name(), entry.getValue()); - } - return builder.build(); - } - - public boolean isEmpty() { - return this.blockPercentages.isEmpty() || this.getTotalPercentage() <= 0.0; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/HologramType.java b/src/main/java/me/nvus/xprison/mines/model/mine/HologramType.java deleted file mode 100644 index 70e9eb0..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/HologramType.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.nvus.xprison.mines.model.mine; - -public enum HologramType { - BLOCKS_LEFT, - TIMED_RESET, - BLOCKS_MINED -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/Mine.java b/src/main/java/me/nvus/xprison/mines/model/mine/Mine.java deleted file mode 100644 index 9d00f2a..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/Mine.java +++ /dev/null @@ -1,451 +0,0 @@ -package me.nvus.xprison.mines.model.mine; - -import com.google.gson.JsonElement; -import me.nvus.xprison.mines.XPrisonMines; -import me.nvus.xprison.mines.managers.MineManager; -import me.nvus.xprison.mines.model.mine.reset.ResetType; -import me.nvus.xprison.utils.compat.CompMaterial; -import lombok.Getter; -import lombok.Setter; -import me.lucko.helper.Schedulers; -import me.lucko.helper.gson.GsonSerializable; -import me.lucko.helper.gson.JsonBuilder; -import me.lucko.helper.hologram.Hologram; -import me.lucko.helper.scheduler.Task; -import me.lucko.helper.serialize.Point; -import me.lucko.helper.serialize.Position; -import me.lucko.helper.serialize.Region; -import me.lucko.helper.utils.Players; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import javax.annotation.Nonnull; -import java.io.File; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -public class Mine implements GsonSerializable { - - @Getter - private final MineManager manager; - - @Getter - @Setter - private String name; - - @Getter - @Setter - private Region mineRegion; - - @Getter - @Setter - private Point teleportLocation; - - @Getter - private final BlockPalette blockPalette; - - @Getter - @Setter - private double resetPercentage; - - @Getter - private final int totalBlocks; - - @Getter - @Setter - private int currentBlocks; - - @Getter - @Setter - private ResetType resetType; - - @Getter - @Setter - private boolean resetting; - - @Getter - @Setter - private boolean broadcastReset; - - @Getter - @Setter - private Hologram blocksLeftHologram; - @Getter - @Setter - private Hologram blocksMinedHologram; - @Getter - @Setter - private Hologram timedResetHologram; - - @Getter - @Setter - private Date nextResetDate; - - @Getter - @Setter - private int resetTime; - - @Getter - private final Map mineEffects; - private Task mineTask; - - public Mine(MineManager manager, String name, Region region) { - this.manager = manager; - this.name = name; - this.mineRegion = region; - this.teleportLocation = null; - this.blockPalette = new BlockPalette(); - this.blockPalette.addToPalette(CompMaterial.STONE, 100.0); - this.resetType = ResetType.INSTANT; - this.resetPercentage = 50.0; - this.resetTime = 10; - this.broadcastReset = true; - this.totalBlocks = this.calculateTotalBlocks(); - this.currentBlocks = this.calculateCurrentBlocks(); - this.mineEffects = new HashMap<>(); - this.startTicking(); - } - - public Mine(MineManager manager, String name, Region region, Point teleportLocation, BlockPalette palette, ResetType resetType, double resetPercentage, boolean broadcastReset, Hologram blocksLeftHologram, Hologram blocksMinedHologram, Hologram timedResetHologram, Map mineEffect, int resetTime) { - this.manager = manager; - this.name = name; - this.mineRegion = region; - this.teleportLocation = teleportLocation; - this.blockPalette = palette; - this.resetType = resetType; - this.resetPercentage = resetPercentage; - this.broadcastReset = broadcastReset; - this.totalBlocks = this.calculateTotalBlocks(); - this.currentBlocks = this.calculateCurrentBlocks(); - this.blocksLeftHologram = blocksLeftHologram; - this.blocksMinedHologram = blocksMinedHologram; - this.timedResetHologram = timedResetHologram; - this.mineEffects = mineEffect; - this.resetTime = resetTime; - this.nextResetDate = new Date(System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(this.resetTime)); - this.updateHolograms(); - this.startTicking(); - } - - private void startTicking() { - this.mineTask = Schedulers.sync().runRepeating(this::tick, 1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS); - } - - public void updateHolograms() { - - if (this.blocksLeftHologram != null) { - this.blocksLeftHologram.updateLines(this.manager.getHologramBlocksLeftLines(this)); - this.blocksLeftHologram.spawn(); - } - - if (this.blocksMinedHologram != null) { - this.blocksMinedHologram.updateLines(this.manager.getHologramBlocksMinedLines(this)); - this.blocksMinedHologram.spawn(); - } - - if (this.timedResetHologram != null) { - this.timedResetHologram.updateLines(this.manager.getHologramTimedResetLines(this)); - this.timedResetHologram.spawn(); - } - } - - public void handleBlockBreak(List blocks) { - - //Remove blocks that are not in region just for safety - blocks.removeIf(block -> !isInMine(block.getLocation())); - - this.currentBlocks -= blocks.size(); - - double ratio = (double) this.currentBlocks / this.totalBlocks * 100.0; - - if (ratio <= this.resetPercentage && !this.resetting) { - this.manager.resetMine(this); - } - - this.updateHolograms(); - } - - public void stopTicking() { - if (this.mineTask != null) { - this.mineTask.stop(); - } - } - - public boolean isInMine(Location loc) { - return this.mineRegion.inRegion(loc); - } - - public Iterator getBlocksIterator() { - Position min = this.mineRegion.getMin(); - Position max = this.mineRegion.getMax(); - - int minX = (int) Math.min(min.getX(), max.getX()); - int minY = (int) Math.min(min.getY(), max.getY()); - int minZ = (int) Math.min(min.getZ(), max.getZ()); - - int maxX = (int) Math.max(min.getX(), max.getX()); - int maxY = (int) Math.max(min.getY(), max.getY()); - int maxZ = (int) Math.max(min.getZ(), max.getZ()); - - List blocks = new ArrayList<>(1000); - for (int x = minX; x <= maxX; x++) { - for (int y = minY; y <= maxY; y++) { - for (int z = minZ; z <= maxZ; z++) { - Block b = min.toLocation().getWorld().getBlockAt(x, y, z); - blocks.add(b); - } - } - } - return blocks.iterator(); - } - - private int calculateCurrentBlocks() { - Position min = this.mineRegion.getMin(); - Position max = this.mineRegion.getMax(); - - int minX = (int) Math.min(min.getX(), max.getX()); - int minY = (int) Math.min(min.getY(), max.getY()); - int minZ = (int) Math.min(min.getZ(), max.getZ()); - - int maxX = (int) Math.max(min.getX(), max.getX()); - int maxY = (int) Math.max(min.getY(), max.getY()); - int maxZ = (int) Math.max(min.getZ(), max.getZ()); - - int amount = 0; - for (int x = minX; x <= maxX; x++) { - for (int y = minY; y <= maxY; y++) { - for (int z = minZ; z <= maxZ; z++) { - Block b = min.toLocation().getWorld().getBlockAt(x, y, z); - if (b.getType() != Material.AIR) { - amount++; - } - } - } - } - return amount; - } - - - private int calculateTotalBlocks() { - Position min = this.mineRegion.getMin(); - Position max = this.mineRegion.getMax(); - - int minX = (int) Math.min(min.getX(), max.getX()); - int minY = (int) Math.min(min.getY(), max.getY()); - int minZ = (int) Math.min(min.getZ(), max.getZ()); - - int maxX = (int) Math.max(min.getX(), max.getX()); - int maxY = (int) Math.max(min.getY(), max.getY()); - int maxZ = (int) Math.max(min.getZ(), max.getZ()); - - int amount = 0; - for (int x = minX; x <= maxX; x++) { - for (int y = minY; y <= maxY; y++) { - for (int z = minZ; z <= maxZ; z++) { - amount++; - } - } - } - return amount; - } - - private void tick() { - this.getPlayersInMine().forEach(player -> this.manager.giveMineEffects(this, player)); - - if (!this.resetting && this.nextResetDate != null && System.currentTimeMillis() >= this.nextResetDate.getTime()) { - this.manager.resetMine(this); - } - - if (!this.resetting && this.timedResetHologram != null) { - this.timedResetHologram.updateLines(this.manager.getHologramTimedResetLines(this)); - this.timedResetHologram.spawn(); - } - } - - - @Nonnull - @Override - public JsonElement serialize() { - JsonBuilder.JsonObjectBuilder builder = JsonBuilder.object(); - builder.addIfAbsent("name", this.name); - builder.addIfAbsent("teleport-location", this.teleportLocation); - builder.addIfAbsent("region", this.mineRegion); - builder.addIfAbsent("blocks", this.blockPalette); - builder.addIfAbsent("reset-type", this.resetType.getName()); - builder.addIfAbsent("reset-percentage", this.resetPercentage); - builder.addIfAbsent("reset-time", this.resetTime); - builder.addIfAbsent("broadcast-reset", this.broadcastReset); - builder.addIfAbsent("hologram-blocks-mined", this.blocksMinedHologram); - builder.addIfAbsent("hologram-blocks-left", this.blocksLeftHologram); - builder.addIfAbsent("hologram-timed-reset", this.timedResetHologram); - - JsonBuilder.JsonObjectBuilder effectsBuilder = JsonBuilder.object(); - - for (PotionEffectType type : this.mineEffects.keySet()) { - effectsBuilder.addIfAbsent(type.getName(), this.mineEffects.get(type)); - } - - builder.addIfAbsent("effects", effectsBuilder.build()); - - return builder.build(); - } - - public File getFile() { - return new File(this.manager.getPlugin().getCore().getDataFolder().getPath() + "/mines/" + this.getName() + ".json"); - } - - public List getPlayersInMine() { - return Players.all().stream().filter(player -> this.isInMine(player.getLocation())).collect(Collectors.toList()); - } - - public void updateCurrentBlocks() { - this.currentBlocks = this.calculateCurrentBlocks(); - } - - public void increaseEffect(PotionEffectType type) { - this.mineEffects.put(type, this.mineEffects.getOrDefault(type, 0) + 1); - } - - public PotionEffect getEffect(PotionEffectType type) { - if (this.mineEffects.containsKey(type)) { - return new PotionEffect(type, 200, this.mineEffects.get(type)); - } - return null; - } - - public void decreaseEffect(PotionEffectType type) { - int newAmplifier = this.mineEffects.getOrDefault(type, 0) - 1; - if (newAmplifier < 0) { - newAmplifier = 0; - } - this.mineEffects.put(type, newAmplifier); - } - - public void disableEffect(PotionEffectType type) { - this.mineEffects.remove(type); - } - - public boolean isEffectEnabled(PotionEffectType type) { - return this.mineEffects.containsKey(type); - } - - public void enableEffect(PotionEffectType type) { - this.mineEffects.put(type, 0); - } - - public int getEffectLevel(PotionEffectType type) { - return this.mineEffects.getOrDefault(type, 0); - } - - public boolean canTeleport(Player player) { - return player.hasPermission("xprison.mines.tp." + this.name); - } - - public long getSecondsToNextReset() { - if (this.nextResetDate == null) { - return 0; - } - return (int) ((this.nextResetDate.getTime() - System.currentTimeMillis()) / 1000); - } - - public static final class Builder { - - private String name; - private Region mineRegion; - private Point teleportLocation; - private BlockPalette blockPalette; - private double resetPercentage; - private ResetType resetType; - private boolean broadcastReset; - private Hologram blocksMinedHologram; - private Hologram blocksLeftHologram; - private Hologram timedResetHologram; - private Map mineEffects; - private int timedReset; - - public Builder() { - this.name = ""; - this.mineRegion = null; - this.teleportLocation = null; - this.blockPalette = new BlockPalette(); - this.resetPercentage = 50; - this.resetType = ResetType.GRADUAL; - this.broadcastReset = true; - this.blocksMinedHologram = null; - this.blocksLeftHologram = null; - this.timedResetHologram = null; - this.mineEffects = new HashMap<>(); - this.timedReset = 10; - } - - public Builder name(String name) { - this.name = name; - return this; - } - - public Builder region(Region region) { - this.mineRegion = region; - return this; - } - - public Builder teleportLocation(Point point) { - this.teleportLocation = point; - return this; - } - - public Builder blockPalette(BlockPalette palette) { - this.blockPalette = palette; - return this; - } - - public Builder resetPercentage(double resetPercentage) { - this.resetPercentage = resetPercentage; - return this; - } - - public Builder resetType(ResetType resetType) { - this.resetType = resetType; - return this; - } - - public Builder broadcastReset(boolean broadcastReset) { - this.broadcastReset = broadcastReset; - return this; - } - - public Builder blocksLeftHologram(Hologram blocksLeftHologram) { - this.blocksLeftHologram = blocksLeftHologram; - return this; - } - - public Builder blocksMinedHologram(Hologram blocksMinedHologram) { - this.blocksMinedHologram = blocksMinedHologram; - return this; - } - - public Builder timedResetHologram(Hologram timedResetHologram) { - this.timedResetHologram = blocksMinedHologram; - return this; - } - - public Builder mineEffects(Map mineEffects) { - this.mineEffects = mineEffects; - return this; - } - - public Builder timedReset(int minutes) { - this.timedReset = minutes; - return this; - } - - public Mine build() { - return new Mine(XPrisonMines.getInstance().getManager(), this.name, this.mineRegion, this.teleportLocation, this.blockPalette, this.resetType, this.resetPercentage, this.broadcastReset, this.blocksLeftHologram, this.blocksMinedHologram, this.timedResetHologram, this.mineEffects, this.timedReset); - } - - } -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/MineSelection.java b/src/main/java/me/nvus/xprison/mines/model/mine/MineSelection.java deleted file mode 100644 index e932f26..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/MineSelection.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.nvus.xprison.mines.model.mine; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import me.lucko.helper.serialize.Position; -import me.lucko.helper.serialize.Region; - -@AllArgsConstructor -@NoArgsConstructor -@Data -public class MineSelection { - private Position pos1; - private Position pos2; - - public boolean isValid() { - return pos1 != null && pos2 != null; - } - - public Region toRegion() { - return pos1.regionWith(pos2); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/loader/MineFileLoader.java b/src/main/java/me/nvus/xprison/mines/model/mine/loader/MineFileLoader.java deleted file mode 100644 index b46a0fb..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/loader/MineFileLoader.java +++ /dev/null @@ -1,66 +0,0 @@ -package me.nvus.xprison.mines.model.mine.loader; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import me.nvus.xprison.mines.managers.MineManager; -import me.nvus.xprison.mines.model.mine.BlockPalette; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.mines.model.mine.reset.ResetType; -import me.lucko.helper.gson.GsonProvider; -import me.lucko.helper.hologram.Hologram; -import me.lucko.helper.serialize.Point; -import me.lucko.helper.serialize.Region; -import org.bukkit.potion.PotionEffectType; - -import java.io.File; -import java.io.FileReader; -import java.util.HashMap; -import java.util.Map; - -public class MineFileLoader implements MineLoader { - - private final MineManager manager; - - public MineFileLoader(MineManager manager) { - this.manager = manager; - } - - @Override - public Mine load(File file) { - try (FileReader reader = new FileReader(file)) { - JsonObject obj = GsonProvider.readObject(reader); - - String name = obj.get("name").getAsString(); - Point teleportLocation = obj.get("teleport-location").isJsonNull() ? null : Point.deserialize(obj.get("teleport-location")); - Region region = obj.get("region").isJsonNull() ? null : Region.deserialize(obj.get("region")); - BlockPalette palette = obj.get("blocks").isJsonNull() ? new BlockPalette() : BlockPalette.deserialize(obj.get("blocks")); - - ResetType resetType = obj.get("reset-type").isJsonNull() ? ResetType.INSTANT : ResetType.of(obj.get("reset-type").getAsString()); - double resetPercentage = obj.get("reset-percentage").getAsDouble(); - int resetTime = obj.has("reset-time") ? obj.get("reset-time").getAsInt() : 10; - boolean broadcastReset = obj.get("broadcast-reset").isJsonNull() || obj.get("broadcast-reset").getAsBoolean(); - - Hologram blocksLeftHologram = obj.has("hologram-blocks-left") ? obj.get("hologram-blocks-left").isJsonNull() ? null : Hologram.deserialize(obj.get("hologram-blocks-left")) : null; - Hologram blocksMinedHologram = obj.has("hologram-blocks-mined") ? obj.get("hologram-blocks-mined").isJsonNull() ? null : Hologram.deserialize(obj.get("hologram-blocks-mined")) : null; - Hologram timedResetHologram = obj.has("hologram-timed-reset") ? obj.get("hologram-timed-reset").isJsonNull() ? null : Hologram.deserialize(obj.get("hologram-timed-reset")) : null; - - Map mineEffects = new HashMap<>(); - - JsonElement mineEffectsObj = obj.get("effects"); - - if (mineEffectsObj != null) { - for (Map.Entry entry : mineEffectsObj.getAsJsonObject().entrySet()) { - PotionEffectType type = PotionEffectType.getByName(entry.getKey()); - int amplifier = entry.getValue().getAsInt(); - mineEffects.put(type, amplifier); - } - } - - return new Mine(this.manager, name, region, teleportLocation, palette, resetType, resetPercentage, broadcastReset, blocksLeftHologram, blocksMinedHologram, timedResetHologram, mineEffects, resetTime); - } catch (Exception e) { - this.manager.getPlugin().getCore().getLogger().warning("Unable to load mine " + file.getName() + "!"); - e.printStackTrace(); - } - return null; - } -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/loader/MineLoader.java b/src/main/java/me/nvus/xprison/mines/model/mine/loader/MineLoader.java deleted file mode 100644 index 8c02675..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/loader/MineLoader.java +++ /dev/null @@ -1,8 +0,0 @@ -package me.nvus.xprison.mines.model.mine.loader; - -import me.nvus.xprison.mines.model.mine.Mine; - -public interface MineLoader { - - Mine load(T type); -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/reset/GradualReset.java b/src/main/java/me/nvus/xprison/mines/model/mine/reset/GradualReset.java deleted file mode 100644 index 80ee623..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/reset/GradualReset.java +++ /dev/null @@ -1,61 +0,0 @@ -package me.nvus.xprison.mines.model.mine.reset; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.mines.model.mine.BlockPalette; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.compat.MinecraftVersion; -import me.lucko.helper.Schedulers; -import me.lucko.helper.random.RandomSelector; -import org.bukkit.block.Block; - -import java.lang.reflect.InvocationTargetException; -import java.util.Iterator; - -public class GradualReset extends ResetType { - - private final int CHANGES_PER_TICK = 350; - - GradualReset() { - super("Gradual"); - } - - @Override - public void reset(Mine paramMine, BlockPalette blockPalette) { - - if (blockPalette.isEmpty()) { - XPrison.getInstance().getLogger().warning("Reset for Mine " + paramMine.getName() + " aborted. Block palette is empty."); - return; - } - - this.schedule(paramMine, blockPalette, paramMine.getBlocksIterator()); - } - - - private void schedule(final Mine mine, BlockPalette blockPalette, Iterator blocksIterator) { - Schedulers.sync().runLater(() -> { - int changes = 0; - RandomSelector selector = RandomSelector.weighted(blockPalette.getValidMaterials(), blockPalette::getPercentage); - while (blocksIterator.hasNext() && changes <= CHANGES_PER_TICK) { - CompMaterial pick = selector.pick(); - Block b = blocksIterator.next(); - b.setType(pick.toMaterial()); - if (MinecraftVersion.olderThan(MinecraftVersion.V.v1_13)) { - try { - Block.class.getMethod("setData", byte.class).invoke(b, pick.getData()); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - e.printStackTrace(); - } - } - changes++; - } - if (blocksIterator.hasNext()) { - schedule(mine, blockPalette, blocksIterator); - } else { - mine.setResetting(false); - mine.updateCurrentBlocks(); - mine.updateHolograms(); - } - }, 1L); - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/reset/InstantReset.java b/src/main/java/me/nvus/xprison/mines/model/mine/reset/InstantReset.java deleted file mode 100644 index 1a17241..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/reset/InstantReset.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.nvus.xprison.mines.model.mine.reset; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.mines.model.mine.BlockPalette; -import me.nvus.xprison.mines.model.mine.Mine; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.compat.MinecraftVersion; -import me.lucko.helper.random.RandomSelector; -import me.lucko.helper.serialize.Position; -import org.bukkit.block.Block; - -import java.lang.reflect.InvocationTargetException; - - -public class InstantReset extends ResetType { - - InstantReset() { - super("Instant"); - } - - @Override - public void reset(Mine mine, BlockPalette blockPalette) { - - if (blockPalette.isEmpty()) { - XPrison.getInstance().getLogger().warning("Reset for Mine " + mine.getName() + " aborted. Block palette is empty."); - return; - } - - RandomSelector selector = RandomSelector.weighted(blockPalette.getValidMaterials(), blockPalette::getPercentage); - - Position min = mine.getMineRegion().getMin(); - Position max = mine.getMineRegion().getMax(); - - int minX = (int) Math.min(min.getX(), max.getX()); - int minY = (int) Math.min(min.getY(), max.getY()); - int minZ = (int) Math.min(min.getZ(), max.getZ()); - - int maxX = (int) Math.max(min.getX(), max.getX()); - int maxY = (int) Math.max(min.getY(), max.getY()); - int maxZ = (int) Math.max(min.getZ(), max.getZ()); - - for (int x = minX; x <= maxX; x++) { - for (int y = minY; y <= maxY; y++) { - for (int z = minZ; z <= maxZ; z++) { - Block b = min.toLocation().getWorld().getBlockAt(x, y, z); - CompMaterial pick = selector.pick(); - b.setType(pick.toMaterial()); - if (MinecraftVersion.olderThan(MinecraftVersion.V.v1_13)) { - try { - Block.class.getMethod("setData", byte.class).invoke(b, pick.getData()); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - e.printStackTrace(); - } - } - } - } - } - mine.setResetting(false); - mine.updateCurrentBlocks(); - mine.updateHolograms(); - } -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/reset/ResetType.java b/src/main/java/me/nvus/xprison/mines/model/mine/reset/ResetType.java deleted file mode 100644 index 1cedde3..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/reset/ResetType.java +++ /dev/null @@ -1,30 +0,0 @@ -package me.nvus.xprison.mines.model.mine.reset; - -import me.nvus.xprison.mines.model.mine.BlockPalette; -import me.nvus.xprison.mines.model.mine.Mine; -import lombok.Getter; - -public abstract class ResetType { - - public static final GradualReset GRADUAL = new GradualReset(); - public static final InstantReset INSTANT = new InstantReset(); - - @Getter - private final String name; - - ResetType(String paramString) { - this.name = paramString; - } - - public static ResetType of(String name) { - switch (name.toLowerCase()) { - case "gradual": - return GRADUAL; - case "instant": - return INSTANT; - } - return null; - } - - public abstract void reset(Mine paramMine, BlockPalette blockPalette); -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/saver/MineFileSaver.java b/src/main/java/me/nvus/xprison/mines/model/mine/saver/MineFileSaver.java deleted file mode 100644 index f9fbd88..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/saver/MineFileSaver.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.nvus.xprison.mines.model.mine.saver; - -import me.nvus.xprison.mines.managers.MineManager; -import me.nvus.xprison.mines.model.mine.Mine; -import me.lucko.helper.gson.GsonProvider; - -import java.io.FileWriter; -import java.io.IOException; - -public class MineFileSaver implements MineSaver { - - private final MineManager manager; - - public MineFileSaver(MineManager manager) { - this.manager = manager; - } - - @Override - public void save(Mine mine) { - try (FileWriter writer = new FileWriter(mine.getFile())) { - GsonProvider.writeObjectPretty(writer, mine.serialize().getAsJsonObject()); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/me/nvus/xprison/mines/model/mine/saver/MineSaver.java b/src/main/java/me/nvus/xprison/mines/model/mine/saver/MineSaver.java deleted file mode 100644 index 048fa7b..0000000 --- a/src/main/java/me/nvus/xprison/mines/model/mine/saver/MineSaver.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.nvus.xprison.mines.model.mine.saver; - -import me.nvus.xprison.mines.model.mine.Mine; - -public interface MineSaver { - void save(Mine mine); -} diff --git a/src/main/java/me/nvus/xprison/multipliers/XPrisonMultipliers.java b/src/main/java/me/nvus/xprison/multipliers/XPrisonMultipliers.java deleted file mode 100644 index aff5de1..0000000 --- a/src/main/java/me/nvus/xprison/multipliers/XPrisonMultipliers.java +++ /dev/null @@ -1,615 +0,0 @@ -package me.nvus.xprison.multipliers; - -import dev.drawethree.ultrabackpacks.api.event.BackpackSellEvent; -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.multipliers.api.XPrisonMultipliersAPI; -import me.nvus.xprison.multipliers.api.XPrisonMultipliersAPIImpl; -import me.nvus.xprison.multipliers.api.events.PlayerMultiplierReceiveEvent; -import me.nvus.xprison.multipliers.enums.MultiplierType; -import me.nvus.xprison.multipliers.multiplier.GlobalMultiplier; -import me.nvus.xprison.multipliers.multiplier.Multiplier; -import me.nvus.xprison.multipliers.multiplier.PlayerMultiplier; -import me.nvus.xprison.multipliers.repo.MultipliersRepository; -import me.nvus.xprison.multipliers.repo.impl.MultipliersRepositoryImpl; -import me.nvus.xprison.multipliers.service.MultipliersService; -import me.nvus.xprison.multipliers.service.impl.MultipliersServiceImpl; -import me.nvus.xprison.tokens.api.events.PlayerTokensReceiveEvent; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.nvus.xprison.utils.text.TextUtils; -import lombok.Getter; -import me.lucko.helper.Commands; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.event.filter.EventFilters; -import me.lucko.helper.scheduler.Task; -import me.lucko.helper.time.Time; -import me.lucko.helper.utils.Players; -import org.apache.commons.lang.StringUtils; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -public final class XPrisonMultipliers implements XPrisonModule { - - public static final String MODULE_NAME = "Multipliers"; - - @Getter - private static XPrisonMultipliers instance; - @Getter - private final XPrison core; - @Getter - private FileManager.Config config; - @Getter - private XPrisonMultipliersAPI api; - private GlobalMultiplier globalSellMultiplier; - private GlobalMultiplier globalTokenMultiplier; - - private Map rankMultipliers; - private Map sellMultipliers; - private Map tokenMultipliers; - - private Map messages; - private Map permissionToMultiplier; - - private boolean enabled; - - private Task rankUpdateTask; - private int rankMultiplierUpdateTime; - - @Getter - private double globalSellMultiMax; - @Getter - private double globalTokenMultiMax; - @Getter - private double playerSellMultiMax; - @Getter - private double playerTokenMultiMax; - - @Getter - private MultipliersRepository multipliersRepository; - - @Getter - private MultipliersService multipliersService; - - public XPrisonMultipliers(XPrison plugin) { - instance = this; - this.core = plugin; - } - - - private void loadRankMultipliers() { - this.permissionToMultiplier = new LinkedHashMap<>(); - - ConfigurationSection section = getConfig().get().getConfigurationSection("ranks"); - - if (section == null) { - return; - } - - boolean useLuckPerms = getConfig().get().getBoolean("use-luckperms-groups", false); - - String permPrefix = useLuckPerms ? "group." : "xprison.multiplier."; - - for (String rank : section.getKeys(false)) { - String perm = permPrefix + rank; - double multiplier = getConfig().get().getDouble("ranks." + rank); - this.permissionToMultiplier.put(perm, multiplier); - this.core.debug("Loaded Rank Multiplier '" + rank + "' with multiplier x" + multiplier + " (" + perm + ")", this); - } - } - - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void reload() { - this.config.reload(); - - this.loadMessages(); - this.loadRankMultipliers(); - - this.rankMultiplierUpdateTime = this.getConfig().get().getInt("rank-multiplier-update-time", 5); - this.globalSellMultiMax = this.getConfig().get().getDouble("global-multiplier.sell.max", 10.0); - this.globalTokenMultiMax = this.getConfig().get().getDouble("global-multiplier.tokens.max", 10.0); - this.playerSellMultiMax = this.getConfig().get().getDouble("sell-multiplier.max", 10.0); - this.playerTokenMultiMax = this.getConfig().get().getDouble("token-multiplier.max", 10.0); - } - - @Override - public void enable() { - - this.enabled = true; - this.config = this.core.getFileManager().getConfig("multipliers.yml").copyDefaults(true).save(); - - this.rankMultipliers = new ConcurrentHashMap<>(); - this.sellMultipliers = new ConcurrentHashMap<>(); - this.tokenMultipliers = new ConcurrentHashMap<>(); - - this.multipliersRepository = new MultipliersRepositoryImpl(this.core.getPluginDatabase()); - this.multipliersRepository.createTables(); - this.multipliersRepository.removeExpiredMultipliers(); - - this.multipliersService = new MultipliersServiceImpl(this.multipliersRepository); - - this.rankMultiplierUpdateTime = this.getConfig().get().getInt("rank-multiplier-update-time", 5); - this.globalSellMultiMax = this.getConfig().get().getDouble("global-multiplier.sell.max", 10.0); - this.globalTokenMultiMax = this.getConfig().get().getDouble("global-multiplier.tokens.max", 10.0); - this.playerSellMultiMax = this.getConfig().get().getDouble("sell-multiplier.max", 10.0); - this.playerTokenMultiMax = this.getConfig().get().getDouble("token-multiplier.max", 10.0); - - this.loadMessages(); - this.loadRankMultipliers(); - this.registerCommands(); - this.registerEvents(); - this.removeExpiredMultipliers(); - this.loadGlobalMultipliers(); - this.loadOnlineMultipliers(); - this.api = new XPrisonMultipliersAPIImpl(this); - - this.rankUpdateTask = Schedulers.async().runRepeating(() -> Players.all().forEach(p -> this.rankMultipliers.put(p.getUniqueId(), this.calculateRankMultiplier(p))), this.rankMultiplierUpdateTime, TimeUnit.MINUTES, this.rankMultiplierUpdateTime, TimeUnit.MINUTES); - } - - private void loadOnlineMultipliers() { - Players.all().forEach(p -> { - this.rankMultipliers.put(p.getUniqueId(), this.calculateRankMultiplier(p)); - this.loadSellMultiplier(p); - this.loadTokenMultiplier(p); - }); - } - - private void registerEvents() { - Events.subscribe(PlayerJoinEvent.class) - .handler(e -> { - this.rankMultipliers.put(e.getPlayer().getUniqueId(), this.calculateRankMultiplier(e.getPlayer())); - this.loadSellMultiplier(e.getPlayer()); - this.loadTokenMultiplier(e.getPlayer()); - }).bindWith(core); - Events.subscribe(PlayerQuitEvent.class) - .handler(e -> { - this.rankMultipliers.remove(e.getPlayer().getUniqueId()); - this.saveSellMultiplier(e.getPlayer(), true); - this.saveTokenMultiplier(e.getPlayer(), true); - }).bindWith(core); - - Events.subscribe(PlayerTokensReceiveEvent.class, EventPriority.HIGHEST) - .filter(EventFilters.ignoreCancelled()) - .handler(e -> { - OfflinePlayer p = e.getPlayer(); - if (p.isOnline() && e.getCause() == ReceiveCause.MINING) { - e.setAmount((long) this.getApi().getTotalToDeposit((Player) p, e.getAmount(), MultiplierType.TOKENS)); - } - }).bindWith(core); - - if (this.core.isUltraBackpacksEnabled()) { - Events.subscribe(BackpackSellEvent.class, EventPriority.NORMAL) - .handler(e -> { - double currentAmount = e.getMoneyToDeposit(); - this.core.debug("BackpacksSellEvent >> Original Amount: " + currentAmount, this); - double newAmount = this.getApi().getTotalToDeposit(e.getPlayer(), currentAmount, MultiplierType.SELL); - this.core.debug("BackpacksSellEvent >> New Amount: " + newAmount, this); - e.setMoneyToDeposit(newAmount); - }).bindWith(core); - } - - } - - private void saveSellMultiplier(Player player, boolean async) { - - PlayerMultiplier multiplier = this.sellMultipliers.remove(player.getUniqueId()); - - if (async) { - Schedulers.async().run(() -> { - this.multipliersService.setSellMultiplier(player, multiplier); - this.core.debug(String.format("Saved Sell Multiplier of player %s", player.getName()), this); - }); - } else { - this.multipliersService.setSellMultiplier(player, multiplier); - this.core.debug(String.format("Saved Sell Multiplier of player %s", player.getName()), this); - } - } - - private void saveTokenMultiplier(Player player, boolean async) { - - PlayerMultiplier multiplier = this.tokenMultipliers.remove(player.getUniqueId()); - - if (async) { - Schedulers.async().run(() -> { - this.multipliersService.setTokenMultiplier(player, multiplier); - this.core.debug(String.format("Saved Token Multiplier of player %s", player.getName()), this); - }); - } else { - this.multipliersService.setTokenMultiplier(player, multiplier); - this.core.debug(String.format("Saved Token Multiplier of player %s", player.getName()), this); - } - } - - private void loadGlobalMultipliers() { - double multiSell = this.config.get().getDouble("global-multiplier.sell.multiplier"); - long timeLeftSell = this.config.get().getLong("global-multiplier.sell.timeLeft"); - - double multiTokens = this.config.get().getDouble("global-multiplier.tokens.multiplier"); - long timeLeftTokens = this.config.get().getLong("global-multiplier.tokens.timeLeft"); - - this.globalSellMultiplier = new GlobalMultiplier(0.0, 0); - this.globalTokenMultiplier = new GlobalMultiplier(0.0, 0); - - if (timeLeftSell > Time.nowMillis()) { - this.globalSellMultiplier.setEndTime(timeLeftSell); - this.globalSellMultiplier.setMultiplier(multiSell); - } - - if (timeLeftTokens > Time.nowMillis()) { - this.globalTokenMultiplier.setEndTime(timeLeftSell); - this.globalTokenMultiplier.setMultiplier(multiTokens); - } - - this.core.getLogger().info(String.format("Loaded Global Sell Multiplier %.2fx", multiSell)); - this.core.getLogger().info(String.format("Loaded Global Token Multiplier %.2fx", multiTokens)); - - } - - private void saveGlobalMultipliers() { - this.config.set("global-multiplier.sell.multiplier", this.globalSellMultiplier.getMultiplier()); - this.config.set("global-multiplier.sell.timeLeft", this.globalSellMultiplier.getEndTime()); - this.config.set("global-multiplier.tokens.multiplier", this.globalTokenMultiplier.getMultiplier()); - this.config.set("global-multiplier.tokens.timeLeft", this.globalTokenMultiplier.getEndTime()); - this.config.save(); - this.core.getLogger().info("Saved Global Multipliers into multipliers.yml"); - } - - private void loadSellMultiplier(Player player) { - Schedulers.async().run(() -> { - - PlayerMultiplier multiplier = this.multipliersService.getSellMultiplier(player); - - if (multiplier == null) { - return; - } - - this.sellMultipliers.put(player.getUniqueId(), multiplier); - - this.core.debug(String.format("Loaded Sell Multiplier %.2fx for player %s", multiplier.getMultiplier(), player.getName()), this); - }); - } - - private void loadTokenMultiplier(Player player) { - Schedulers.async().run(() -> { - - PlayerMultiplier multiplier = this.multipliersService.getTokenMultiplier(player); - - if (multiplier == null) { - return; - } - - this.tokenMultipliers.put(player.getUniqueId(), multiplier); - - this.core.debug(String.format("Loaded Token Multiplier %.2fx for player %s", multiplier.getMultiplier(), player.getName()), this); - }); - } - - private void removeExpiredMultipliers() { - Schedulers.async().run(() -> { - this.multipliersService.removeExpiredMultipliers(); - this.core.debug("Removed expired multipliers from DB.", this); - }); - } - - - @Override - public void disable() { - this.saveAllMultipliers(); - this.rankUpdateTask.stop(); - this.enabled = false; - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return true; - } - - @Override - public void resetPlayerData() { - this.multipliersRepository.clearTableData(); - } - - private void saveAllMultipliers() { - Players.all().forEach(p -> { - saveSellMultiplier(p, false); - saveTokenMultiplier(p, false); - }); - this.saveGlobalMultipliers(); - this.core.getLogger().info("Saved online players multipliers."); - } - - - private void loadMessages() { - messages = new HashMap<>(); - for (String key : getConfig().get().getConfigurationSection("messages").getKeys(false)) { - messages.put(key.toLowerCase(), TextUtils.applyColor(getConfig().get().getString("messages." + key))); - } - } - - private void registerCommands() { - Commands.create() - .assertPermission("xprison.multipliers.admin") - .handler(c -> { - if (c.args().size() == 4) { - String type = c.rawArg(0); - double amount = c.arg(1).parseOrFail(Double.class); - int duration = c.arg(2).parseOrFail(Integer.class); - TimeUnit timeUnit; - try { - timeUnit = TimeUnit.valueOf(c.rawArg(3).toUpperCase()); - } catch (IllegalArgumentException e) { - PlayerUtils.sendMessage(c.sender(), "&cInvalid time unit! Please use one from: " + StringUtils.join(TimeUnit.values(), ",")); - return; - } - - setupGlobalMultiplier(c.sender(), type, duration, timeUnit, amount); - } else if (c.args().size() == 2 && c.rawArg(1).equalsIgnoreCase("reset")) { - String type = c.rawArg(0); - resetGlobalMultiplier(c.sender(), type); - } else { - PlayerUtils.sendMessage(c.sender(), "&cInvalid usage!"); - PlayerUtils.sendMessage(c.sender(), "&c/gmulti

- * For convienience do we return the version from the plugin.yml - * - * @return The version as a String. - */ - @Override - public String getVersion() { - return plugin.getDescription().getVersion(); - } - - /** - * This is the method called when a placeholder with our identifier - * is found and needs a value. - *
We specify the value identifier in this method. - *
Since version 2.9.1 can you use OfflinePlayers in your requests. - * - * @param player - * @param identifier A String containing the identifier/value. - * @return possibly-null String of the requested identifier. - */ - @Override - public String onPlaceholderRequest(Player player, String identifier) { - - if (player == null) { - return null; - } - - if (identifier.startsWith("mine_")) { - - String mineName = identifier.replace("mine_", "").split("_")[0]; - Mine mine = plugin.getMines().getManager().getMineByName(mineName); - - if (mine == null) { - return null; - } - - String placeholder = identifier.replace("mine_" + mineName + "_", ""); - switch (placeholder.toLowerCase()) { - case "blocks_left": { - return String.format("%,d", mine.getCurrentBlocks()); - } - case "blocks_left_percentage": { - return String.format("%,.2f", (double) mine.getCurrentBlocks() / mine.getTotalBlocks() * 100.0D); - } - case "reset_time": { - return TimeUtil.getTime(mine.getSecondsToNextReset()); - } - } - } else if (identifier.startsWith("token_has_")) { - long amount = Long.parseLong(identifier.replace("token_has_", "")); - return String.valueOf(plugin.getTokens().getTokensManager().getPlayerTokens(player) >= amount); - } - - switch (identifier.toLowerCase()) { - case "tokens": - case "tokens_2": - return String.format("%,d", plugin.getTokens().getTokensManager().getPlayerTokens(player)); - case "gems": - case "gems_2": - return String.format("%,d", plugin.getGems().getGemsManager().getPlayerGems(player)); - case "blocks": - case "blocks_2": - return String.format("%,d", plugin.getTokens().getTokensManager().getPlayerBrokenBlocks(player)); - case "multiplier_sell": { - PlayerMultiplier sellMulti = plugin.getMultipliers().getApi().getSellMultiplier(player); - if (sellMulti == null || sellMulti.isExpired()) { - return String.format("%.2f", 0.0); - } else { - return String.format("%.2f", (1.0 + sellMulti.getMultiplier())); - } - } - case "multiplier_token": { - PlayerMultiplier tokenMulti = plugin.getMultipliers().getApi().getTokenMultiplier(player); - if (tokenMulti == null || tokenMulti.isExpired()) { - return String.format("%.2f", 0.0); - } else { - return String.format("%.2f", (1.0 + tokenMulti.getMultiplier())); - } - } - case "multiplier_rank": { - Multiplier rankMulti = plugin.getMultipliers().getApi().getRankMultiplier(player); - if (rankMulti == null) { - return String.format("%.2f", 0.0); - } else { - return String.format("%.2f", rankMulti.getMultiplier()); - } - } - case "multiplier_global_sell": { - GlobalMultiplier sellMulti = plugin.getMultipliers().getApi().getGlobalSellMultiplier(); - return String.format("%.2f", sellMulti.isExpired() ? 0.0 : sellMulti.getMultiplier()); - } - case "multiplier_global_token": { - GlobalMultiplier tokenMulti = plugin.getMultipliers().getApi().getGlobalTokenMultiplier(); - return String.format("%.2f", tokenMulti.isExpired() ? 0.0 : tokenMulti.getMultiplier()); - } - case "rank": - return plugin.getRanks().getApi().getPlayerRank(player).getPrefix(); - case "next_rank": { - Optional nextRank = plugin.getRanks().getApi().getNextPlayerRank(player); - return !nextRank.isPresent() ? "" : nextRank.get().getPrefix(); - } - case "next_rank_cost_raw": - return String.valueOf(plugin.getRanks().getRanksManager().getNextRankCost(player)); - case "next_rank_cost": - return String.format("%,.2f", plugin.getRanks().getRanksManager().getNextRankCost(player)); - case "next_rank_cost_formatted": - return MathUtils.formatNumber(plugin.getRanks().getRanksManager().getNextRankCost(player)); - case "prestige": - return plugin.getPrestiges().getApi().getPlayerPrestige(player).getPrefix(); - case "prestige_id": - return String.valueOf(plugin.getPrestiges().getApi().getPlayerPrestige(player).getId()); - case "autominer_time": { - int autominerTime = plugin.getAutoMiner().getManager().getAutoMinerTime(player); - return AutoMinerUtils.getAutoMinerTimeLeftFormatted(autominerTime); - } - case "tokens_formatted": - case "tokens_3": - return MathUtils.formatNumber(plugin.getTokens().getTokensManager().getPlayerTokens(player)); - case "gems_formatted": - case "gems_3": - return MathUtils.formatNumber(plugin.getGems().getGemsManager().getPlayerGems(player)); - case "rankup_progress": - return String.format("%d%%", plugin.getRanks().getRanksManager().getRankupProgress(player)); - case "rankup_progress_bar": - return plugin.getRanks().getRanksManager().getRankupProgressBar(player); - case "tokens_1": - return String.valueOf(plugin.getTokens().getTokensManager().getPlayerTokens(player)); - case "blocks_1": - return String.valueOf(plugin.getTokens().getTokensManager().getPlayerBrokenBlocks(player)); - case "blocks_3": - return MathUtils.formatNumber(plugin.getTokens().getTokensManager().getPlayerBrokenBlocks(player)); - case "gems_1": - return String.valueOf(plugin.getGems().getGemsManager().getPlayerGems(player)); - case "pickaxe_level": { - Optional levelOptional = plugin.getPickaxeLevels().getApi().getPickaxeLevel(player); - return levelOptional.map(level -> String.valueOf(level.getLevel())).orElse("0"); - } - case "pickaxe_progress": - return this.plugin.getPickaxeLevels().getApi().getProgressBar(player); - case "gang_name": - case "gang": { - Optional optionalGang = this.plugin.getGangs().getGangsManager().getPlayerGang(player); - return optionalGang.map(gang -> this.plugin.getGangs().getConfig().getPlaceholder("gang-in-gang").replace("%gang%", gang.getName())).orElseGet(() -> this.plugin.getGangs().getConfig().getPlaceholder("gang-without")); - } - case "gang_value": { - Optional optionalGang = this.plugin.getGangs().getGangsManager().getPlayerGang(player); - if (optionalGang.isPresent()) { - return String.format("%,d", optionalGang.get().getValue()); - } else { - return ""; - } - } - case "gang_has_gang": - return this.plugin.getGangs().getGangsManager().getPlayerGang(player).isPresent() ? "Yes" : "No"; - case "gang_is_leader": { - Optional optionalGang = this.plugin.getGangs().getGangsManager().getPlayerGang(player); - return optionalGang.map(gang -> gang.isOwner(player) ? "Yes" : "No").orElse(""); - } - case "gang_leader_name": { - Optional optionalGang = this.plugin.getGangs().getGangsManager().getPlayerGang(player); - if (optionalGang.isPresent()) { - return optionalGang.get().getOwnerOffline().getName(); - } - return ""; - } - case "gang_members_amount": { - Optional optionalGang = this.plugin.getGangs().getGangsManager().getPlayerGang(player); - // +1 because of leader - return optionalGang.map(gang -> String.valueOf(gang.getMembersOffline().size() + 1)).orElse(""); - } - case "gang_members_online": { - Optional optionalGang = this.plugin.getGangs().getGangsManager().getPlayerGang(player); - return optionalGang.map(gang -> String.valueOf(gang.getOnlinePlayers().size())).orElse(""); - } - default: - return null; - } - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/prestiges/XPrisonPrestiges.java b/src/main/java/me/nvus/xprison/prestiges/XPrisonPrestiges.java deleted file mode 100644 index 81953cf..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/XPrisonPrestiges.java +++ /dev/null @@ -1,118 +0,0 @@ -package me.nvus.xprison.prestiges; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.prestiges.api.XPrisonPrestigesAPI; -import me.nvus.xprison.prestiges.api.XPrisonPrestigesAPIImpl; -import me.nvus.xprison.prestiges.commands.MaxPrestigeCommand; -import me.nvus.xprison.prestiges.commands.PrestigeAdminCommand; -import me.nvus.xprison.prestiges.commands.PrestigeCommand; -import me.nvus.xprison.prestiges.commands.PrestigeTopCommand; -import me.nvus.xprison.prestiges.config.PrestigeConfig; -import me.nvus.xprison.prestiges.listener.PrestigeListener; -import me.nvus.xprison.prestiges.manager.PrestigeManager; -import me.nvus.xprison.prestiges.repo.PrestigeRepository; -import me.nvus.xprison.prestiges.repo.impl.PrestigeRepositoryImpl; -import me.nvus.xprison.prestiges.service.PrestigeService; -import me.nvus.xprison.prestiges.service.impl.PrestigeServiceImpl; -import me.nvus.xprison.prestiges.task.SavePlayerDataTask; -import lombok.Getter; - -@Getter -public final class XPrisonPrestiges implements XPrisonModule { - - public static final String MODULE_NAME = "Prestiges"; - - @Getter - private PrestigeConfig prestigeConfig; - - private PrestigeManager prestigeManager; - - @Getter - private XPrisonPrestigesAPI api; - - private SavePlayerDataTask savePlayerDataTask; - - @Getter - private final XPrison core; - - @Getter - private PrestigeRepository prestigeRepository; - - @Getter - private PrestigeService prestigeService; - - private boolean enabled; - - public XPrisonPrestiges(XPrison core) { - this.core = core; - } - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void reload() { - this.prestigeConfig.reload(); - } - - @Override - public void enable() { - this.enabled = true; - - this.prestigeConfig = new PrestigeConfig(this); - this.prestigeConfig.load(); - - this.prestigeRepository = new PrestigeRepositoryImpl(this.core.getPluginDatabase()); - this.prestigeRepository.createTables(); - - this.prestigeService = new PrestigeServiceImpl(this.prestigeRepository); - - this.prestigeManager = new PrestigeManager(this); - this.prestigeManager.enable(); - - this.api = new XPrisonPrestigesAPIImpl(this); - - this.savePlayerDataTask = new SavePlayerDataTask(this); - this.savePlayerDataTask.start(); - - this.registerCommands(); - this.registerListeners(); - } - - - @Override - public void disable() { - this.savePlayerDataTask.stop(); - this.prestigeManager.disable(); - this.enabled = false; - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return true; - } - - @Override - public void resetPlayerData() { - this.prestigeRepository.clearTableData(); - } - - private void registerCommands() { - new PrestigeCommand(this).register(); - new MaxPrestigeCommand(this).register(); - new PrestigeTopCommand(this).register(); - new PrestigeAdminCommand(this).register(); - } - - private void registerListeners() { - new PrestigeListener(this).register(); - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/api/XPrisonPrestigesAPI.java b/src/main/java/me/nvus/xprison/prestiges/api/XPrisonPrestigesAPI.java deleted file mode 100644 index ebc9821..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/api/XPrisonPrestigesAPI.java +++ /dev/null @@ -1,33 +0,0 @@ -package me.nvus.xprison.prestiges.api; - - -import me.nvus.xprison.prestiges.model.Prestige; -import org.bukkit.entity.Player; - -public interface XPrisonPrestigesAPI { - - /** - * Method to get player Prestige - * - * @param p Player - * @return Prestige - */ - Prestige getPlayerPrestige(Player p); - - /** - * Sets a prestige to online player - * - * @param player Player - * @param prestige Prestige - */ - void setPlayerPrestige(Player player, Prestige prestige); - - /** - * Sets a prestige to online player - * - * @param player Player - * @param prestige Prestige - */ - void setPlayerPrestige(Player player, long prestige); - -} diff --git a/src/main/java/me/nvus/xprison/prestiges/api/XPrisonPrestigesAPIImpl.java b/src/main/java/me/nvus/xprison/prestiges/api/XPrisonPrestigesAPIImpl.java deleted file mode 100644 index acff2b5..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/api/XPrisonPrestigesAPIImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package me.nvus.xprison.prestiges.api; - -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.nvus.xprison.prestiges.model.Prestige; -import org.bukkit.entity.Player; - -public final class XPrisonPrestigesAPIImpl implements XPrisonPrestigesAPI { - - private final XPrisonPrestiges plugin; - - public XPrisonPrestigesAPIImpl(XPrisonPrestiges plugin) { - this.plugin = plugin; - } - - @Override - public Prestige getPlayerPrestige(Player p) { - return plugin.getPrestigeManager().getPlayerPrestige(p); - } - - @Override - public void setPlayerPrestige(Player player, Prestige prestige) { - plugin.getPrestigeManager().setPlayerPrestige(null, player, prestige.getId()); - } - - @Override - public void setPlayerPrestige(Player player, long prestige) { - plugin.getPrestigeManager().setPlayerPrestige(null, player, prestige); - - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/api/events/PlayerPrestigeEvent.java b/src/main/java/me/nvus/xprison/prestiges/api/events/PlayerPrestigeEvent.java deleted file mode 100644 index 3e184c2..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/api/events/PlayerPrestigeEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.nvus.xprison.prestiges.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import me.nvus.xprison.prestiges.model.Prestige; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class PlayerPrestigeEvent extends XPrisonPlayerEvent implements Cancellable { - - - private static final HandlerList handlers = new HandlerList(); - - @Getter - private final Prestige oldPrestige; - - @Getter - @Setter - private Prestige newPrestige; - - @Getter - @Setter - private boolean cancelled; - - /** - * Called when player receive gems - * - * @param player Player - * @param oldPrestige old prestige - * @param newPrestige new prestige - */ - public PlayerPrestigeEvent(Player player, Prestige oldPrestige, Prestige newPrestige) { - super(player); - this.oldPrestige = oldPrestige; - this.newPrestige = newPrestige; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - -} diff --git a/src/main/java/me/nvus/xprison/prestiges/commands/MaxPrestigeCommand.java b/src/main/java/me/nvus/xprison/prestiges/commands/MaxPrestigeCommand.java deleted file mode 100644 index 27933e8..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/commands/MaxPrestigeCommand.java +++ /dev/null @@ -1,30 +0,0 @@ -package me.nvus.xprison.prestiges.commands; - -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.lucko.helper.Commands; - -public class MaxPrestigeCommand { - - private final XPrisonPrestiges plugin; - - public MaxPrestigeCommand(XPrisonPrestiges plugin) { - - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPermission("xprison.prestiges.maxprestige", this.plugin.getPrestigeConfig().getMessage("no_permission")) - .assertPlayer() - .handler(c -> { - if (c.args().size() == 0) { - - if (this.plugin.getPrestigeManager().isPrestiging(c.sender())) { - return; - } - - this.plugin.getPrestigeManager().buyMaxPrestige(c.sender()); - } - }).registerAndBind(this.plugin.getCore(), "maxprestige", "maxp", "mp"); - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeAdminCommand.java b/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeAdminCommand.java deleted file mode 100644 index b3827b5..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeAdminCommand.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.nvus.xprison.prestiges.commands; - -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import org.bukkit.entity.Player; - -public class PrestigeAdminCommand { - private final XPrisonPrestiges plugin; - - public PrestigeAdminCommand(XPrisonPrestiges plugin) { - - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPermission("xprison.prestiges.admin") - .handler(c -> { - if (c.args().size() == 3) { - - Player target = c.arg(1).parseOrFail(Player.class); - int amount = c.arg(2).parseOrFail(Integer.class); - - switch (c.rawArg(0).toLowerCase()) { - case "set": - this.plugin.getPrestigeManager().setPlayerPrestige(c.sender(), target, amount); - break; - case "add": - this.plugin.getPrestigeManager().addPlayerPrestige(c.sender(), target, amount); - break; - case "remove": - this.plugin.getPrestigeManager().removePlayerPrestige(c.sender(), target, amount); - break; - default: - PlayerUtils.sendMessage(c.sender(), "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - PlayerUtils.sendMessage(c.sender(), "&e&lPRESTIGE ADMIN HELP MENU "); - PlayerUtils.sendMessage(c.sender(), "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - PlayerUtils.sendMessage(c.sender(), "&e/prestigeadmin add [player] [amount]"); - PlayerUtils.sendMessage(c.sender(), "&e/prestigeadmin remove [player] [amount]"); - PlayerUtils.sendMessage(c.sender(), "&e/prestigeadmin set [player] [amount]"); - PlayerUtils.sendMessage(c.sender(), "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - break; - } - } - }).registerAndBind(this.plugin.getCore(), "prestigeadmin", "prestigea"); - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeCommand.java b/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeCommand.java deleted file mode 100644 index 03aebca..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeCommand.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.nvus.xprison.prestiges.commands; - -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.lucko.helper.Commands; - -public class PrestigeCommand { - - private final XPrisonPrestiges plugin; - - public PrestigeCommand(XPrisonPrestiges plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPlayer() - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getPrestigeManager().buyNextPrestige(c.sender()); - } - }).registerAndBind(this.plugin.getCore(), "prestige"); - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeTopCommand.java b/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeTopCommand.java deleted file mode 100644 index 952a5c5..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/commands/PrestigeTopCommand.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.nvus.xprison.prestiges.commands; - -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.lucko.helper.Commands; - -public class PrestigeTopCommand { - - private final XPrisonPrestiges plugin; - - public PrestigeTopCommand(XPrisonPrestiges plugin) { - - this.plugin = plugin; - } - - public void register() { - Commands.create() - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getPrestigeManager().sendPrestigeTop(c.sender()); - } - }).registerAndBind(this.plugin.getCore(), "prestigetop"); - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/config/PrestigeConfig.java b/src/main/java/me/nvus/xprison/prestiges/config/PrestigeConfig.java deleted file mode 100644 index d87d9c1..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/config/PrestigeConfig.java +++ /dev/null @@ -1,203 +0,0 @@ -package me.nvus.xprison.prestiges.config; - -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.nvus.xprison.prestiges.model.Prestige; -import me.nvus.xprison.utils.text.TextUtils; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class PrestigeConfig { - - private final XPrisonPrestiges plugin; - private final FileManager.Config config; - private Prestige maxPrestige; - private String unlimitedPrestigePrefix; - private List prestigeTopFormat; - private List unlimitedPrestigesRewardPerPrestige; - private Map prestigeById; - private Map messages; - private Map> unlimitedPrestigesRewards; - private int topPlayersAmount; - private long unlimitedPrestigeMax; - private double unlimitedPrestigeCost; - private double increaseCostBy; - private boolean useTokensCurrency; - private boolean unlimitedPrestiges; - private boolean increaseCostEnabled; - private boolean resetRankAfterPrestige; - private int savePlayerDataInterval; - - public PrestigeConfig(XPrisonPrestiges plugin) { - this.plugin = plugin; - this.config = this.plugin.getCore().getFileManager().getConfig("prestiges.yml").copyDefaults(true).save(); - this.prestigeById = new HashMap<>(); - } - - - private void loadMessages(YamlConfiguration configuration) { - this.messages = new HashMap<>(); - - for (String key : configuration.getConfigurationSection("messages").getKeys(false)) { - messages.put(key.toLowerCase(), TextUtils.applyColor(getConfig().get().getString("messages." + key))); - } - } - - public void reload() { - YamlConfiguration configuration = getYamlConfig(); - this.loadVariables(configuration); - this.loadPrestiges(configuration); - this.loadUnlimitedPrestigesRewards(configuration); - this.loadMessages(configuration); - } - - private void loadPrestiges(YamlConfiguration configuration) { - this.prestigeById.clear(); - - if (this.unlimitedPrestiges) { - this.plugin.getCore().getLogger().info(String.format("Loaded %,d prestiges.", this.unlimitedPrestigeMax)); - } else { - for (String key : configuration.getConfigurationSection("Prestige").getKeys(false)) { - long id = Long.parseLong(key); - String prefix = TextUtils.applyColor(configuration.getString("Prestige." + key + ".Prefix")); - long cost = configuration.getLong("Prestige." + key + ".Cost"); - List commands = configuration.getStringList("Prestige." + key + ".CMD"); - Prestige p = new Prestige(id, cost, prefix, commands); - this.prestigeById.put(id, p); - this.maxPrestige = p; - } - this.plugin.getCore().getLogger().info(String.format("Loaded %,d prestiges!", this.prestigeById.keySet().size())); - } - } - - public void load() { - this.reload(); - } - - - public String getMessage(String messageKey) { - return this.messages.getOrDefault(messageKey.toLowerCase(), "Missing message with key: " + messageKey); - } - - private void loadVariables(YamlConfiguration configuration) { - this.prestigeTopFormat = configuration.getStringList("prestige-top-format"); - this.unlimitedPrestiges = configuration.getBoolean("unlimited_prestiges.enabled"); - this.unlimitedPrestigeCost = configuration.getDouble("unlimited_prestiges.prestige_cost"); - this.unlimitedPrestigePrefix = TextUtils.applyColor(configuration.getString("unlimited_prestiges.prefix")); - this.unlimitedPrestigeMax = configuration.getLong("unlimited_prestiges.max_prestige"); - this.increaseCostEnabled = configuration.getBoolean("unlimited_prestiges.increase_cost.enabled"); - this.increaseCostBy = configuration.getDouble("unlimited_prestiges.increase_cost.increase_cost_by"); - boolean unlimitedPrestigesRewardPerPrestigeEnabled = configuration.getBoolean("unlimited_prestiges.rewards-per-prestige.enabled"); - if (unlimitedPrestigesRewardPerPrestigeEnabled) { - this.unlimitedPrestigesRewardPerPrestige = configuration.getStringList("unlimited_prestiges.rewards-per-prestige.rewards"); - } - this.topPlayersAmount = configuration.getInt("top_players_amount"); - this.savePlayerDataInterval = configuration.getInt("player_data_save_interval"); - this.resetRankAfterPrestige = configuration.getBoolean("reset_rank_after_prestige"); - this.useTokensCurrency = configuration.getBoolean("use_tokens_currency"); - this.plugin.getCore().getLogger().info("Using " + (useTokensCurrency ? "Tokens" : "Money") + " currency for Prestiges."); - - } - - private void loadUnlimitedPrestigesRewards(YamlConfiguration configuration) { - this.unlimitedPrestigesRewards = new LinkedHashMap<>(); - - ConfigurationSection section = configuration.getConfigurationSection("unlimited_prestiges.rewards"); - - if (section == null) { - return; - } - - for (String key : section.getKeys(false)) { - try { - long id = Long.parseLong(key); - - List rewards = section.getStringList(key); - - if (!rewards.isEmpty()) { - this.unlimitedPrestigesRewards.put(id, rewards); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - } - - private FileManager.Config getConfig() { - return this.config; - } - - public YamlConfiguration getYamlConfig() { - return this.config.get(); - } - - public Prestige getMaxPrestige() { - return maxPrestige; - } - - public String getUnlimitedPrestigePrefix() { - return unlimitedPrestigePrefix; - } - - public List getPrestigeTopFormat() { - return prestigeTopFormat; - } - - public List getUnlimitedPrestigesRewardPerPrestige() { - return unlimitedPrestigesRewardPerPrestige; - } - - public Map getPrestigeById() { - return prestigeById; - } - - public Map getMessages() { - return messages; - } - - public Map> getUnlimitedPrestigesRewards() { - return unlimitedPrestigesRewards; - } - - public long getUnlimitedPrestigeMax() { - return unlimitedPrestigeMax; - } - - public double getUnlimitedPrestigeCost() { - return unlimitedPrestigeCost; - } - - public double getIncreaseCostBy() { - return increaseCostBy; - } - - public boolean isUseTokensCurrency() { - return useTokensCurrency; - } - - public boolean isUnlimitedPrestiges() { - return unlimitedPrestiges; - } - - public boolean isIncreaseCostEnabled() { - return increaseCostEnabled; - } - - public boolean isResetRankAfterPrestige() { - return resetRankAfterPrestige; - } - - public int getTopPlayersAmount() { - return topPlayersAmount; - } - - public long getSavePlayerDataInterval() { - return savePlayerDataInterval; - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/listener/PrestigeListener.java b/src/main/java/me/nvus/xprison/prestiges/listener/PrestigeListener.java deleted file mode 100644 index a60d767..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/listener/PrestigeListener.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.nvus.xprison.prestiges.listener; - -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.lucko.helper.Events; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - -public class PrestigeListener { - private final XPrisonPrestiges plugin; - - public PrestigeListener(XPrisonPrestiges plugin) { - this.plugin = plugin; - } - - public void register() { - this.subscribePlayerJoinEvent(); - this.subscribePlayerQuitEvent(); - } - - private void subscribePlayerQuitEvent() { - Events.subscribe(PlayerQuitEvent.class) - .handler(e -> this.plugin.getPrestigeManager().savePlayerData(e.getPlayer(), true, true)).bindWith(plugin.getCore()); - } - - private void subscribePlayerJoinEvent() { - Events.subscribe(PlayerJoinEvent.class) - .handler(e -> this.plugin.getPrestigeManager().loadPlayerPrestige(e.getPlayer())).bindWith(plugin.getCore()); - } - - -} diff --git a/src/main/java/me/nvus/xprison/prestiges/manager/PrestigeManager.java b/src/main/java/me/nvus/xprison/prestiges/manager/PrestigeManager.java deleted file mode 100644 index 042238f..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/manager/PrestigeManager.java +++ /dev/null @@ -1,445 +0,0 @@ -package me.nvus.xprison.prestiges.manager; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.nvus.xprison.prestiges.api.events.PlayerPrestigeEvent; -import me.nvus.xprison.prestiges.config.PrestigeConfig; -import me.nvus.xprison.prestiges.model.Prestige; -import me.nvus.xprison.ranks.XPrisonRanks; -import me.nvus.xprison.ranks.manager.RanksManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.utils.Players; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -public class PrestigeManager { - - private final XPrisonPrestiges plugin; - - private final Map onlinePlayersPrestige; - private final List prestigingPlayers; - - public PrestigeManager(XPrisonPrestiges plugin) { - this.plugin = plugin; - this.onlinePlayersPrestige = new ConcurrentHashMap<>(); - this.prestigingPlayers = new ArrayList<>(10); - } - - - private void saveAllDataSync() { - for (UUID uuid : this.onlinePlayersPrestige.keySet()) { - this.plugin.getPrestigeService().setPrestige(Players.getOfflineNullable(uuid), onlinePlayersPrestige.get(uuid)); - } - this.plugin.getCore().getLogger().info("Saved online players prestiges."); - } - - private void loadAllData() { - for (Player p : Players.all()) { - loadPlayerPrestige(p); - } - } - - public void savePlayerData(Player player, boolean removeFromCache, boolean async) { - if (async) { - Schedulers.async().run(() -> savePlayerDataLogic(player, removeFromCache)); - } else { - savePlayerDataLogic(player, removeFromCache); - } - } - - private void savePlayerDataLogic(Player player, boolean removeFromCache) { - this.plugin.getPrestigeService().setPrestige(player, this.getPlayerPrestige(player).getId()); - if (removeFromCache) { - this.onlinePlayersPrestige.remove(player.getUniqueId()); - } - this.plugin.getCore().debug("Saved " + player.getName() + "'s prestige to database.", this.plugin); - } - - - public void loadPlayerPrestige(Player player) { - Schedulers.async().run(() -> { - this.plugin.getPrestigeService().createPrestige(player); - long prestige = this.plugin.getPrestigeService().getPlayerPrestige(player); - this.onlinePlayersPrestige.put(player.getUniqueId(), prestige); - this.plugin.getCore().debug("Loaded " + player.getName() + "'s prestige.", this.plugin); - }); - } - - private double calculateNextPrestigeCost(Prestige origin) { - - if (!this.getConfig().isIncreaseCostEnabled()) { - return origin.getCost(); - } - - return origin.getId() == 0 ? (this.getConfig().getUnlimitedPrestigeCost()) : (origin.getCost() * this.getConfig().getIncreaseCostBy()); - } - - private PrestigeConfig getConfig() { - return this.plugin.getPrestigeConfig(); - } - - - public Prestige getNextPrestige(Prestige prestige) { - if (this.getConfig().isUnlimitedPrestiges()) { - return new Prestige(prestige.getId() + 1, this.calculateNextPrestigeCost(prestige), this.getConfig().getUnlimitedPrestigePrefix().replace("%prestige%", String.format("%,d", prestige.getId() + 1)), this.getConfig().getUnlimitedPrestigesRewards().getOrDefault(prestige.getId() + 1, null)); - } - return this.getConfig().getPrestigeById().getOrDefault(prestige.getId() + 1, null); - } - - public Prestige getPrestigeById(long id) { - if (this.getConfig().isUnlimitedPrestiges()) { - return new Prestige(id, id * this.getConfig().getIncreaseCostBy(), this.getConfig().getUnlimitedPrestigePrefix().replace("%prestige%", String.format("%,d", id)), this.getConfig().getUnlimitedPrestigesRewards().getOrDefault(id, null)); - } - return this.getConfig().getPrestigeById().getOrDefault(id, null); - } - - public synchronized Prestige getPlayerPrestige(Player p) { - if (this.getConfig().isUnlimitedPrestiges()) { - long prestige = this.onlinePlayersPrestige.getOrDefault(p.getUniqueId(), 0L); - return new Prestige(prestige, this.calculatePrestigeCost(prestige), this.getConfig().getUnlimitedPrestigePrefix().replace("%prestige%", String.format("%,d", prestige)), null); - } else { - return this.getConfig().getPrestigeById().getOrDefault(this.onlinePlayersPrestige.get(p.getUniqueId()), this.getConfig().getPrestigeById().get(0L)); - } - } - - private double calculatePrestigeCost(long prestige) { - - if (!this.getConfig().isIncreaseCostEnabled()) { - return this.getConfig().getUnlimitedPrestigeCost(); - } - - double origin = this.getConfig().getUnlimitedPrestigeCost(); - - for (long i = 0; i < prestige; i++) { - if (i == 0) { - continue; - } - origin = origin * this.getConfig().getIncreaseCostBy(); - } - - return origin; - } - - public boolean isMaxPrestige(Player p) { - if (this.getConfig().isUnlimitedPrestiges()) { - return this.getPlayerPrestige(p).getId() >= this.getConfig().getUnlimitedPrestigeMax(); - } - return this.getPlayerPrestige(p).getId() == this.getConfig().getMaxPrestige().getId(); - } - - private boolean completeTransaction(Player p, double cost) { - if (this.getConfig().isUseTokensCurrency()) { - this.plugin.getCore().getTokens().getApi().removeTokens(p, (long) cost, LostCause.RANKUP); - return true; - } else { - return this.plugin.getCore().getEconomy().withdrawPlayer(p, cost).transactionSuccess(); - } - } - - private boolean isTransactionAllowed(Player p, double cost) { - if (this.getConfig().isUseTokensCurrency()) { - return this.plugin.getCore().getTokens().getApi().hasEnough(p, (long) cost); - } else { - return this.plugin.getCore().getEconomy().has(p, cost); - } - - } - - public boolean buyNextPrestige(Player p) { - - if (areRanksEnabled() && !getRankManager().isMaxRank(p)) { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("not_last_rank")); - return false; - } - - if (isMaxPrestige(p)) { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("last_prestige")); - return false; - } - - Prestige currentPrestige = this.getPlayerPrestige(p); - Prestige toBuy = getNextPrestige(currentPrestige); - - if (!this.isTransactionAllowed(p, toBuy.getCost())) { - if (this.getConfig().isUseTokensCurrency()) { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("not_enough_tokens_prestige").replace("%cost%", String.format("%,.0f", toBuy.getCost()))); - } else { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("not_enough_money_prestige").replace("%cost%", String.format("%,.0f", toBuy.getCost()))); - } - return false; - } - - PlayerPrestigeEvent event = new PlayerPrestigeEvent(p, currentPrestige, toBuy); - - Events.call(event); - - if (event.isCancelled()) { - this.plugin.getCore().debug("PlayerPrestigeEvent was cancelled.", this.plugin); - return false; - } - - doPrestige(p, toBuy); - - PlayerUtils.sendMessage(p, this.getConfig().getMessage("prestige_up").replace("%Prestige%", toBuy.getPrefix())); - - return true; - } - - public void sendPrestigeTop(CommandSender sender) { - - List prestigeTopFormat = this.getConfig().getPrestigeTopFormat(); - Map topPrestige = this.plugin.getPrestigeService().getTopPrestiges(this.getConfig().getTopPlayersAmount()); - - for (String s : prestigeTopFormat) { - if (s.startsWith("{FOR_EACH_PLAYER}")) { - String rawContent = s.replace("{FOR_EACH_PLAYER} ", ""); - for (int i = 0; i < 10; i++) { - try { - UUID uuid = (UUID) topPrestige.keySet().toArray()[i]; - OfflinePlayer player = Players.getOfflineNullable(uuid); - String name; - if (player.getName() == null) { - name = "Unknown Player"; - } else { - name = player.getName(); - } - long prestige = topPrestige.get(uuid); - PlayerUtils.sendMessage(sender, rawContent.replace("%position%", String.valueOf(i + 1)).replace("%player%", name).replace("%prestige%", String.format("%,d", prestige))); - } catch (Exception e) { - break; - } - } - } else { - PlayerUtils.sendMessage(sender, s); - } - } - } - - public void buyMaxPrestige(Player p) { - - Schedulers.async().run(() -> { - if (areRanksEnabled() && !getRankManager().isMaxRank(p)) { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("not_last_rank")); - return; - } - - if (isMaxPrestige(p)) { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("last_prestige")); - return; - } - - Prestige startPrestige = this.getPlayerPrestige(p); - - Prestige currentPrestige = startPrestige; - - Prestige nextPrestige = this.getNextPrestige(startPrestige); - - if (!this.isTransactionAllowed(p, nextPrestige.getCost())) { - if (this.getConfig().isUseTokensCurrency()) { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("not_enough_tokens_prestige").replace("%cost%", String.format("%,.0f", nextPrestige.getCost()))); - } else { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("not_enough_money_prestige").replace("%cost%", String.format("%,.0f", nextPrestige.getCost()))); - } - return; - } - - PlayerUtils.sendMessage(p, this.getConfig().getMessage("max_prestige_started")); - - this.prestigingPlayers.add(p.getUniqueId()); - while (p.isOnline() && !isMaxPrestige(p) && this.isTransactionAllowed(p, nextPrestige.getCost())) { - - if (areRanksEnabled() && !getRankManager().isMaxRank(p)) { - break; - } - - doPrestige(p, nextPrestige); - currentPrestige = nextPrestige; - nextPrestige = this.getNextPrestige(nextPrestige); - } - - PlayerPrestigeEvent event = new PlayerPrestigeEvent(p, startPrestige, currentPrestige); - - Events.callSync(event); - - this.prestigingPlayers.remove(p.getUniqueId()); - - if (startPrestige.getId() < this.onlinePlayersPrestige.get(p.getUniqueId())) { - PlayerUtils.sendMessage(p, this.getConfig().getMessage("max_prestige_done").replace("%start_prestige%", String.format("%,d", startPrestige.getId())).replace("%prestige%", String.format("%,d", this.onlinePlayersPrestige.get(p.getUniqueId())))); - } - }); - } - - private void doPrestige(Player p, Prestige nextPrestige) { - - if (!this.completeTransaction(p, nextPrestige.getCost())) { - return; - } - - this.onlinePlayersPrestige.put(p.getUniqueId(), nextPrestige.getId()); - - givePrestigeRewards(nextPrestige,p); - - List rewardsPerPrestige = this.getConfig().getUnlimitedPrestigesRewardPerPrestige(); - if (rewardsPerPrestige != null) { - if (!Bukkit.isPrimaryThread()) { - Schedulers.sync().run(() -> rewardsPerPrestige.forEach(s -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s.replace("%player%", p.getName())))); - } else { - rewardsPerPrestige.forEach(s -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s.replace("%player%", p.getName()))); - } - } - - if (this.getConfig().isResetRankAfterPrestige() && areRanksEnabled()) { - getRankManager().resetPlayerRank(p); - } - } - - public void addPlayerPrestige(CommandSender sender, Player target, int amount) { - - if (0 > amount) { - return; - } - - if (isMaxPrestige(target)) { - return; - } - - Prestige startPrestige = this.getPlayerPrestige(target); - - long maxPrestige = this.getConfig().isUnlimitedPrestiges() ? this.getConfig().getUnlimitedPrestigeMax() : this.getConfig().getMaxPrestige().getId(); - if (startPrestige.getId() + amount > maxPrestige) { - this.onlinePlayersPrestige.put(target.getUniqueId(), maxPrestige); - } else { - this.onlinePlayersPrestige.put(target.getUniqueId(), this.onlinePlayersPrestige.get(target.getUniqueId()) + amount); - } - - Prestige currentPrestige = this.getPlayerPrestige(target); - - long prestigeGained = currentPrestige.getId() - startPrestige.getId(); - - for (int i = 0; i < prestigeGained; i++) { - Prestige toGive = this.getPrestigeById(currentPrestige.getId() + 1 + i); - - if (toGive == null) { - break; - } - - givePrestigeRewards(toGive,target); - - List rewardsPerPrestige = this.getConfig().getUnlimitedPrestigesRewardPerPrestige(); - if (rewardsPerPrestige != null) { - if (!Bukkit.isPrimaryThread()) { - Schedulers.sync().run(() -> rewardsPerPrestige.forEach(s -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s.replace("%player%", target.getName())))); - } else { - rewardsPerPrestige.forEach(s -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s.replace("%player%", target.getName()))); - } - } - } - - PlayerPrestigeEvent event = new PlayerPrestigeEvent(target, startPrestige, currentPrestige); - - Events.callSync(event); - - PlayerUtils.sendMessage(sender, this.getConfig().getMessage("prestige_add").replace("%player%", target.getName()).replace("%amount%", String.format("%,d", amount))); - } - - public void setPlayerPrestige(CommandSender sender, Player target, long amount) { - - if (0 > amount) { - return; - } - - long maxPretige = this.getConfig().isUnlimitedPrestiges() ? this.getConfig().getUnlimitedPrestigeMax() : this.getConfig().getMaxPrestige().getId(); - - this.onlinePlayersPrestige.put(target.getUniqueId(), Math.min(amount, maxPretige)); - - if (sender != null) { - PlayerUtils.sendMessage(sender, this.getConfig().getMessage("prestige_set").replace("%player%", target.getName()).replace("%amount%", String.format("%,d", amount))); - } - } - - public void removePlayerPrestige(CommandSender sender, Player target, long amount) { - - if (0 > amount) { - return; - } - - Prestige currentPrestige = this.getPlayerPrestige(target); - - if (currentPrestige.getId() - amount < 0) { - this.onlinePlayersPrestige.put(target.getUniqueId(), 0L); - } else { - this.onlinePlayersPrestige.put(target.getUniqueId(), this.onlinePlayersPrestige.get(target.getUniqueId()) - amount); - } - - PlayerUtils.sendMessage(sender, this.getConfig().getMessage("prestige_remove").replace("%player%", target.getName()).replace("%amount%", String.format("%,d", amount))); - } - - public int getPrestigeProgress(Player player) { - - if (this.isMaxPrestige(player)) { - return 100; - } - - Prestige current = this.getPlayerPrestige(player); - Prestige next = this.getNextPrestige(current); - - double currentBalance = this.getConfig().isUseTokensCurrency() ? this.plugin.getCore().getTokens().getApi().getPlayerTokens(player) : this.plugin.getCore().getEconomy().getBalance(player); - - int progress = (int) ((currentBalance / next.getCost()) * 100); - - if (progress > 100) { - progress = 100; - } - - return progress; - } - - private boolean areRanksEnabled() { - return this.plugin.getCore().isModuleEnabled(XPrisonRanks.MODULE_NAME); - } - - private RanksManager getRankManager() { - if (!areRanksEnabled()) { - throw new IllegalStateException("Ranks module is not enabled"); - } - return this.plugin.getCore().getRanks().getRanksManager(); - } - - public boolean isPrestiging(Player sender) { - return this.prestigingPlayers.contains(sender.getUniqueId()); - } - - public void givePrestigeRewards(Prestige prestige, Player p) { - if (prestige.getCommandsToExecute() != null) { - if (!Bukkit.isPrimaryThread()) { - Schedulers.sync().run(() -> executeCommands(prestige, p)); - } else { - executeCommands(prestige, p); - } - } - } - - private void executeCommands(Prestige prestige, Player p) { - for (String cmd : prestige.getCommandsToExecute()) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("%player%", p.getName()).replace("%Prestige%", prestige.getPrefix())); - } - } - - public void enable() { - this.loadAllData(); - } - - public void disable() { - this.saveAllDataSync(); - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/model/Prestige.java b/src/main/java/me/nvus/xprison/prestiges/model/Prestige.java deleted file mode 100644 index 9bb0343..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/model/Prestige.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.nvus.xprison.prestiges.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -@AllArgsConstructor -@Getter -public class Prestige { - - private final long id; - private final double cost; - private final String prefix; - private final List commandsToExecute; -} diff --git a/src/main/java/me/nvus/xprison/prestiges/repo/PrestigeRepository.java b/src/main/java/me/nvus/xprison/prestiges/repo/PrestigeRepository.java deleted file mode 100644 index f6386ca..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/repo/PrestigeRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.nvus.xprison.prestiges.repo; - -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public interface PrestigeRepository { - - void updatePrestige(OfflinePlayer player, long prestige); - - void addIntoPrestiges(OfflinePlayer player); - - long getPlayerPrestige(OfflinePlayer player); - - Map getTopPrestiges(int amountOfRecords); - - void createTables(); - - void clearTableData(); -} diff --git a/src/main/java/me/nvus/xprison/prestiges/repo/impl/PrestigeRepositoryImpl.java b/src/main/java/me/nvus/xprison/prestiges/repo/impl/PrestigeRepositoryImpl.java deleted file mode 100644 index 7c9d560..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/repo/impl/PrestigeRepositoryImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.nvus.xprison.prestiges.repo.impl; - -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.database.model.SQLDatabaseType; -import me.nvus.xprison.prestiges.repo.PrestigeRepository; -import org.bukkit.OfflinePlayer; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; - -public class PrestigeRepositoryImpl implements PrestigeRepository { - - private static final String TABLE_NAME = "UltraPrison_Prestiges"; - private static final String PRESTIGES_UUID_COLNAME = "UUID"; - private static final String PRESTIGES_PRESTIGE_COLNAME = "id_prestige"; - - private final SQLDatabase database; - - public PrestigeRepositoryImpl(SQLDatabase database) { - this.database = database; - } - - @Override - public void updatePrestige(OfflinePlayer player, long newPrestige) { - this.database.executeSql("UPDATE " + TABLE_NAME + " SET " + PRESTIGES_PRESTIGE_COLNAME + "=? WHERE " + PRESTIGES_UUID_COLNAME + "=?", newPrestige, player.getUniqueId().toString()); - } - - @Override - public void addIntoPrestiges(OfflinePlayer player) { - String sql = this.database.getDatabaseType() == SQLDatabaseType.SQLITE ? "INSERT OR IGNORE INTO " + TABLE_NAME + "(UUID,id_prestige) VALUES(?,?)" : "INSERT IGNORE INTO " + TABLE_NAME + "(UUID,id_prestige) VALUES(?,?)"; - this.database.executeSql(sql, player.getUniqueId().toString(), 0); - } - - @Override - public long getPlayerPrestige(OfflinePlayer player) { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT * FROM " + TABLE_NAME + " WHERE " + PRESTIGES_UUID_COLNAME + "=?")) { - statement.setString(1, player.getUniqueId().toString()); - try (ResultSet set = statement.executeQuery()) { - if (set.next()) { - return set.getLong(PRESTIGES_PRESTIGE_COLNAME); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; - } - - @Override - public Map getTopPrestiges(int amountOfRecords) { - Map top10Prestige = new LinkedHashMap<>(); - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT " + PRESTIGES_UUID_COLNAME + "," + PRESTIGES_PRESTIGE_COLNAME + " FROM " + TABLE_NAME + " ORDER BY " + PRESTIGES_PRESTIGE_COLNAME + " DESC LIMIT " + amountOfRecords); ResultSet set = statement.executeQuery()) { - while (set.next()) { - top10Prestige.put(UUID.fromString(set.getString(PRESTIGES_UUID_COLNAME)), set.getLong(PRESTIGES_PRESTIGE_COLNAME)); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return top10Prestige; - } - - @Override - public void createTables() { - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(UUID varchar(36) NOT NULL UNIQUE, id_prestige bigint, primary key (UUID))"); - } - - @Override - public void clearTableData() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME); - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/service/PrestigeService.java b/src/main/java/me/nvus/xprison/prestiges/service/PrestigeService.java deleted file mode 100644 index dcb0447..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/service/PrestigeService.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.nvus.xprison.prestiges.service; - -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public interface PrestigeService { - - void setPrestige(OfflinePlayer player, long prestige); - - void createPrestige(OfflinePlayer player); - - long getPlayerPrestige(OfflinePlayer player); - - Map getTopPrestiges(int amountOfRecords); -} diff --git a/src/main/java/me/nvus/xprison/prestiges/service/impl/PrestigeServiceImpl.java b/src/main/java/me/nvus/xprison/prestiges/service/impl/PrestigeServiceImpl.java deleted file mode 100644 index ffc7bfd..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/service/impl/PrestigeServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package me.nvus.xprison.prestiges.service.impl; - -import me.nvus.xprison.prestiges.repo.PrestigeRepository; -import me.nvus.xprison.prestiges.service.PrestigeService; -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public class PrestigeServiceImpl implements PrestigeService { - - private final PrestigeRepository repository; - - public PrestigeServiceImpl(PrestigeRepository repository) { - this.repository = repository; - } - - @Override - public void setPrestige(OfflinePlayer player, long prestige) { - repository.updatePrestige(player, prestige); - } - - @Override - public void createPrestige(OfflinePlayer player) { - repository.addIntoPrestiges(player); - } - - @Override - public long getPlayerPrestige(OfflinePlayer player) { - return repository.getPlayerPrestige(player); - } - - @Override - public Map getTopPrestiges(int amountOfRecords) { - return repository.getTopPrestiges(amountOfRecords); - } -} diff --git a/src/main/java/me/nvus/xprison/prestiges/task/SavePlayerDataTask.java b/src/main/java/me/nvus/xprison/prestiges/task/SavePlayerDataTask.java deleted file mode 100644 index 7730360..0000000 --- a/src/main/java/me/nvus/xprison/prestiges/task/SavePlayerDataTask.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.nvus.xprison.prestiges.task; - -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.lucko.helper.Schedulers; -import me.lucko.helper.scheduler.Task; -import me.lucko.helper.utils.Players; - -import java.util.concurrent.TimeUnit; - - -public final class SavePlayerDataTask implements Runnable { - - private final XPrisonPrestiges plugin; - private Task task; - - public SavePlayerDataTask(XPrisonPrestiges plugin) { - this.plugin = plugin; - } - - @Override - public void run() { - Players.all().forEach(p -> this.plugin.getPrestigeManager().savePlayerData(p, false, true)); - } - - public void start() { - this.stop(); - this.task = Schedulers.async().runRepeating(this, 30, TimeUnit.SECONDS, this.plugin.getPrestigeConfig().getSavePlayerDataInterval(), TimeUnit.MINUTES); - } - - public void stop() { - if (task != null) { - task.stop(); - } - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/XPrisonRanks.java b/src/main/java/me/nvus/xprison/ranks/XPrisonRanks.java deleted file mode 100644 index 5dfb28b..0000000 --- a/src/main/java/me/nvus/xprison/ranks/XPrisonRanks.java +++ /dev/null @@ -1,100 +0,0 @@ -package me.nvus.xprison.ranks; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.ranks.api.XPrisonRanksAPI; -import me.nvus.xprison.ranks.api.XPrisonRanksAPIImpl; -import me.nvus.xprison.ranks.commands.MaxRankupCommand; -import me.nvus.xprison.ranks.commands.RankupCommand; -import me.nvus.xprison.ranks.commands.SetRankCommand; -import me.nvus.xprison.ranks.config.RanksConfig; -import me.nvus.xprison.ranks.listener.RanksListener; -import me.nvus.xprison.ranks.manager.RanksManager; -import me.nvus.xprison.ranks.repo.RanksRepository; -import me.nvus.xprison.ranks.repo.impl.RanksRepositoryImpl; -import me.nvus.xprison.ranks.service.RanksService; -import me.nvus.xprison.ranks.service.impl.RanksServiceImpl; -import lombok.Getter; - -@Getter -public final class XPrisonRanks implements XPrisonModule { - - public static final String MODULE_NAME = "Ranks"; - - @Getter - private RanksConfig ranksConfig; - @Getter - private RanksManager ranksManager; - @Getter - private XPrisonRanksAPI api; - @Getter - private final XPrison core; - - @Getter - private RanksRepository ranksRepository; - - @Getter - private RanksService ranksService; - - private boolean enabled; - - public XPrisonRanks(XPrison core) { - this.core = core; - } - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void reload() { - this.ranksConfig.reload(); - } - - @Override - public void enable() { - this.enabled = true; - this.ranksConfig = new RanksConfig(this); - this.ranksConfig.load(); - this.ranksRepository = new RanksRepositoryImpl(this.core.getPluginDatabase()); - this.ranksRepository.createTables(); - this.ranksService = new RanksServiceImpl(this.ranksRepository); - this.ranksManager = new RanksManager(this); - this.ranksManager.enable(); - this.api = new XPrisonRanksAPIImpl(this.ranksManager); - this.registerCommands(); - this.registerListeners(); - } - - private void registerListeners() { - new RanksListener(this).register(); - } - - @Override - public void disable() { - this.ranksManager.disable(); - this.enabled = false; - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return true; - } - - @Override - public void resetPlayerData() { - this.ranksRepository.clearTableData(); - } - - private void registerCommands() { - new RankupCommand(this).register(); - new MaxRankupCommand(this).register(); - new SetRankCommand(this).register(); - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/api/XPrisonRanksAPI.java b/src/main/java/me/nvus/xprison/ranks/api/XPrisonRanksAPI.java deleted file mode 100644 index da200ca..0000000 --- a/src/main/java/me/nvus/xprison/ranks/api/XPrisonRanksAPI.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.nvus.xprison.ranks.api; - - -import me.nvus.xprison.ranks.model.Rank; -import org.bukkit.entity.Player; - -import java.util.Optional; - -public interface XPrisonRanksAPI { - - /** - * Method to get player Rank - * - * @param p Player - * @return Rank - */ - Rank getPlayerRank(Player p); - - /** - * Method to get next player rank - * - * @param player Player - * @return null if he has max rank, otherwise next Rank - */ - Optional getNextPlayerRank(Player player); - - /** - * Method to get player's rankup progress - * - * @param player Player - * @return int 0-100 percentage - */ - int getRankupProgress(Player player); - - /** - * Sets a rank to online player - * - * @param player Player - * @param rank Rank - */ - void setPlayerRank(Player player, Rank rank); - -} diff --git a/src/main/java/me/nvus/xprison/ranks/api/XPrisonRanksAPIImpl.java b/src/main/java/me/nvus/xprison/ranks/api/XPrisonRanksAPIImpl.java deleted file mode 100644 index 9ff40ec..0000000 --- a/src/main/java/me/nvus/xprison/ranks/api/XPrisonRanksAPIImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.nvus.xprison.ranks.api; - -import me.nvus.xprison.ranks.manager.RanksManager; -import me.nvus.xprison.ranks.model.Rank; -import org.bukkit.entity.Player; - -import java.util.Optional; - -public final class XPrisonRanksAPIImpl implements XPrisonRanksAPI { - - private final RanksManager manager; - - public XPrisonRanksAPIImpl(RanksManager manager) { - this.manager = manager; - } - - @Override - public Rank getPlayerRank(Player p) { - return manager.getPlayerRank(p); - } - - @Override - public Optional getNextPlayerRank(Player player) { - return manager.getNextRank(this.getPlayerRank(player).getId()); - } - - @Override - public int getRankupProgress(Player player) { - return manager.getRankupProgress(player); - } - - @Override - public void setPlayerRank(Player player, Rank rank) { - manager.setRank(player, rank, null); - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/api/events/PlayerRankUpEvent.java b/src/main/java/me/nvus/xprison/ranks/api/events/PlayerRankUpEvent.java deleted file mode 100644 index e4b7d78..0000000 --- a/src/main/java/me/nvus/xprison/ranks/api/events/PlayerRankUpEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.nvus.xprison.ranks.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import me.nvus.xprison.ranks.model.Rank; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class PlayerRankUpEvent extends XPrisonPlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - @Getter - private final Rank oldRank; - - @Getter - @Setter - private Rank newRank; - - @Getter - @Setter - private boolean cancelled; - - /** - * Called when player receive gems - * - * @param player Player - * @param oldR old rank - * @param newR new rank - */ - public PlayerRankUpEvent(Player player, Rank oldR, Rank newR) { - super(player); - this.oldRank = oldR; - this.newRank = newR; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - -} diff --git a/src/main/java/me/nvus/xprison/ranks/commands/MaxRankupCommand.java b/src/main/java/me/nvus/xprison/ranks/commands/MaxRankupCommand.java deleted file mode 100644 index 7f89764..0000000 --- a/src/main/java/me/nvus/xprison/ranks/commands/MaxRankupCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.nvus.xprison.ranks.commands; - -import me.nvus.xprison.ranks.XPrisonRanks; -import me.lucko.helper.Commands; - -public class MaxRankupCommand { - - private static final String[] COMMAND_ALIASES = {"maxrankup", "mru"}; - private static final String PERMISSION_REQUIRED = "xprison.ranks.maxrankup"; - private final XPrisonRanks plugin; - - public MaxRankupCommand(XPrisonRanks plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPermission(PERMISSION_REQUIRED, this.plugin.getRanksConfig().getMessage("no_permission")) - .assertPlayer() - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getRanksManager().buyMaxRank(c.sender()); - } - }).registerAndBind(this.plugin.getCore(), COMMAND_ALIASES); - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/commands/RankupCommand.java b/src/main/java/me/nvus/xprison/ranks/commands/RankupCommand.java deleted file mode 100644 index ce48507..0000000 --- a/src/main/java/me/nvus/xprison/ranks/commands/RankupCommand.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.nvus.xprison.ranks.commands; - -import me.nvus.xprison.ranks.XPrisonRanks; -import me.lucko.helper.Commands; - -public class RankupCommand { - - private static final String[] COMMAND_ALIASES = {"rankup"}; - private final XPrisonRanks plugin; - - public RankupCommand(XPrisonRanks plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPlayer() - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getRanksManager().buyNextRank(c.sender()); - } - }).registerAndBind(this.plugin.getCore(), COMMAND_ALIASES); - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/commands/SetRankCommand.java b/src/main/java/me/nvus/xprison/ranks/commands/SetRankCommand.java deleted file mode 100644 index f812bb9..0000000 --- a/src/main/java/me/nvus/xprison/ranks/commands/SetRankCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.nvus.xprison.ranks.commands; - -import me.nvus.xprison.ranks.XPrisonRanks; -import me.nvus.xprison.ranks.model.Rank; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Commands; -import org.bukkit.entity.Player; - -import java.util.Optional; - -public class SetRankCommand { - - private static final String PERMISSION_REQUIRED = "xprison.ranks.admin"; - private static final String[] COMMAND_ALIASES = {"setrank"}; - - private final XPrisonRanks plugin; - - public SetRankCommand(XPrisonRanks plugin) { - this.plugin = plugin; - } - - public void register() { - Commands.create() - .assertPermission(PERMISSION_REQUIRED) - .handler(c -> { - if (c.args().size() == 2) { - Player target = c.arg(0).parseOrFail(Player.class); - Optional rankOptional = this.plugin.getRanksManager().getRankById(c.arg(1).parseOrFail(Integer.class)); - - if (!rankOptional.isPresent()) { - PlayerUtils.sendMessage(c.sender(), "&cInvalid rank id provided."); - return; - } - - this.plugin.getRanksManager().setRank(target, rankOptional.get(), c.sender()); - } - }).registerAndBind(this.plugin.getCore(), COMMAND_ALIASES); - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/config/RanksConfig.java b/src/main/java/me/nvus/xprison/ranks/config/RanksConfig.java deleted file mode 100644 index ab36648..0000000 --- a/src/main/java/me/nvus/xprison/ranks/config/RanksConfig.java +++ /dev/null @@ -1,121 +0,0 @@ -package me.nvus.xprison.ranks.config; - -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.ranks.XPrisonRanks; -import me.nvus.xprison.ranks.model.Rank; -import me.nvus.xprison.utils.text.TextUtils; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class RanksConfig { - - private final XPrisonRanks plugin; - private final FileManager.Config config; - private final Map ranksById; - private Map messages; - private Rank defaultRank; - private Rank maxRank; - private boolean useTokensCurrency; - private String progressBarDelimiter; - private int progressBarLength; - - public RanksConfig(XPrisonRanks plugin) { - this.plugin = plugin; - this.config = this.plugin.getCore().getFileManager().getConfig("ranks.yml").copyDefaults(true).save(); - this.ranksById = new HashMap<>(); - } - - - private void loadMessages(YamlConfiguration configuration) { - this.messages = new HashMap<>(); - - for (String key : configuration.getConfigurationSection("messages").getKeys(false)) { - messages.put(key.toLowerCase(), TextUtils.applyColor(getConfig().get().getString("messages." + key))); - } - } - - public void reload() { - YamlConfiguration configuration = getYamlConfig(); - this.loadVariables(configuration); - this.loadRanks(configuration); - this.loadMessages(configuration); - } - - private void loadRanks(YamlConfiguration configuration) { - this.ranksById.clear(); - ConfigurationSection section = configuration.getConfigurationSection("Ranks"); - - boolean defaultSet = false; - if (section != null) { - for (String key : section.getKeys(false)) { - String rootPath = "Ranks." + key + "."; - int id = Integer.parseInt(key); - String prefix = TextUtils.applyColor(configuration.getString(rootPath + "Prefix")); - long cost = configuration.getLong(rootPath + "Cost"); - List commands = configuration.getStringList(rootPath + "CMD"); - Rank rank = new Rank(id, cost, prefix, commands); - this.ranksById.put(id, rank); - - if (!defaultSet) { - this.defaultRank = rank; - defaultSet = true; - } - - this.maxRank = rank; - } - } - this.plugin.getCore().getLogger().info(String.format("Loaded %d ranks!", ranksById.keySet().size())); - } - - public void load() { - this.reload(); - } - - - public String getMessage(String messageKey) { - return this.messages.getOrDefault(messageKey.toLowerCase(), "Missing message with key: " + messageKey); - } - - private void loadVariables(YamlConfiguration configuration) { - this.useTokensCurrency = configuration.getBoolean("use_tokens_currency"); - this.progressBarDelimiter = configuration.getString("progress-bar-delimiter"); - this.progressBarLength = configuration.getInt("progress-bar-length"); - this.plugin.getCore().getLogger().info("Using " + (useTokensCurrency ? "Tokens" : "Money") + " currency for Ranks."); - } - - private FileManager.Config getConfig() { - return this.config; - } - - public YamlConfiguration getYamlConfig() { - return this.config.get(); - } - - public Rank getMaxRank() { - return maxRank; - } - - public Rank getDefaultRank() { - return defaultRank; - } - - public String getProgressBarDelimiter() { - return progressBarDelimiter; - } - - public int getProgressBarLength() { - return progressBarLength; - } - - public Rank getRankById(int id) { - return this.ranksById.get(id); - } - - public boolean isUseTokensCurrency() { - return this.useTokensCurrency; - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/listener/RanksListener.java b/src/main/java/me/nvus/xprison/ranks/listener/RanksListener.java deleted file mode 100644 index 9576784..0000000 --- a/src/main/java/me/nvus/xprison/ranks/listener/RanksListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.nvus.xprison.ranks.listener; - -import me.nvus.xprison.ranks.XPrisonRanks; -import me.lucko.helper.Events; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - -import java.util.Collections; - -public class RanksListener { - - private final XPrisonRanks plugin; - - public RanksListener(XPrisonRanks plugin) { - this.plugin = plugin; - } - - public void register() { - this.subscribePlayerJoinEvent(); - this.subscribePlayerQuitEvent(); - } - - private void subscribePlayerQuitEvent() { - Events.subscribe(PlayerQuitEvent.class) - .handler(e -> this.plugin.getRanksManager().savePlayerRank(e.getPlayer())).bindWith(plugin.getCore()); - } - - private void subscribePlayerJoinEvent() { - Events.subscribe(PlayerJoinEvent.class) - .handler(e -> this.plugin.getRanksManager().loadPlayerRank(Collections.singleton(e.getPlayer()))).bindWith(plugin.getCore()); - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/manager/RanksManager.java b/src/main/java/me/nvus/xprison/ranks/manager/RanksManager.java deleted file mode 100644 index 717fedc..0000000 --- a/src/main/java/me/nvus/xprison/ranks/manager/RanksManager.java +++ /dev/null @@ -1,358 +0,0 @@ -package me.nvus.xprison.ranks.manager; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.prestiges.XPrisonPrestiges; -import me.nvus.xprison.prestiges.manager.PrestigeManager; -import me.nvus.xprison.prestiges.model.Prestige; -import me.nvus.xprison.ranks.XPrisonRanks; -import me.nvus.xprison.ranks.api.events.PlayerRankUpEvent; -import me.nvus.xprison.ranks.model.Rank; -import me.nvus.xprison.utils.misc.ProgressBar; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.utils.Players; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -public class RanksManager { - - private final XPrisonRanks plugin; - private final Map onlinePlayersRanks; - - public RanksManager(XPrisonRanks plugin) { - this.plugin = plugin; - this.onlinePlayersRanks = new ConcurrentHashMap<>(); - } - - private void saveAllDataSync() { - for (UUID uuid : this.onlinePlayersRanks.keySet()) { - this.plugin.getRanksService().setRank(Players.getOfflineNullable(uuid), onlinePlayersRanks.get(uuid)); - } - this.plugin.getCore().getLogger().info("Saved online players ranks."); - } - - private void loadAllData() { - loadPlayerRank(Players.all()); - } - - public void savePlayerRank(Player player) { - Schedulers.async().run(() -> { - this.plugin.getRanksService().setRank(player, this.getPlayerRank(player).getId()); - this.onlinePlayersRanks.remove(player.getUniqueId()); - this.plugin.getCore().debug("Saved " + player.getName() + "'s rank.", this.plugin); - }); - } - - public void loadPlayerRank(Collection players) { - Schedulers.async().run(() -> { - for (Player player : players) { - this.plugin.getRanksService().createRank(player); - int rank = this.plugin.getRanksService().getPlayerRank(player); - this.onlinePlayersRanks.put(player.getUniqueId(), rank); - this.plugin.getCore().debug("Loaded " + player.getName() + "'s rank.", this.plugin); - } - }); - } - - public Optional getNextRank(int id) { - return this.getRankById(id + 1); - } - - public Rank getPlayerRank(Player p) { - int rankId = this.onlinePlayersRanks.getOrDefault(p.getUniqueId(), getDefaultRank().getId()); - return this.getRankById(rankId).orElse(this.getDefaultRank()); - } - - private Rank getDefaultRank() { - return this.plugin.getRanksConfig().getDefaultRank(); - } - - public boolean isMaxRank(Player p) { - return this.getPlayerRank(p).getId() == getMaxRank().getId(); - } - - public boolean buyMaxRank(Player p) { - - if (isMaxRank(p)) { - PlayerUtils.sendMessage(p, this.plugin.getRanksConfig().getMessage("prestige_needed")); - return false; - } - - Rank maxRank = getMaxRank(); - Rank currentRank = this.getPlayerRank(p); - - int finalRankId = currentRank.getId(); - - for (int i = currentRank.getId(); i < maxRank.getId(); i++) { - Optional rank = this.getRankById(i + 1); - if (!rank.isPresent()) { - break; - } - double cost = rank.get().getCost(); - if (!this.isTransactionAllowed(p, cost)) { - break; - } - if (!this.completeTransaction(p, cost)) { - break; - } - finalRankId = i + 1; - } - - Optional nextRankOptional = this.getNextRank(currentRank.getId()); - - if (finalRankId == currentRank.getId() && nextRankOptional.isPresent()) { - PlayerUtils.sendMessage(p, this.plugin.getRanksConfig().getMessage("not_enough_money").replace("%cost%", String.format("%,.0f", nextRankOptional.get().getCost()))); - return false; - } - - Optional finalRankOptional = this.getRankById(finalRankId); - - if (!finalRankOptional.isPresent()) { - return false; - } - - Rank finalRank = finalRankOptional.get(); - - PlayerRankUpEvent event = new PlayerRankUpEvent(p, currentRank, finalRank); - - Events.call(event); - - if (event.isCancelled()) { - this.plugin.getCore().debug("PlayerRankUpEvent was cancelled.", this.plugin); - return false; - } - - for (int i = currentRank.getId() + 1; i <= finalRank.getId(); i++) { - this.getRankById(i).ifPresent(r -> runCommands(r, p)); - } - - this.onlinePlayersRanks.put(p.getUniqueId(), finalRank.getId()); - PlayerUtils.sendMessage(p, this.plugin.getRanksConfig().getMessage("rank_up").replace("%Rank-1%", currentRank.getPrefix()).replace("%Rank-2%", finalRank.getPrefix())); - return true; - } - - private Rank getMaxRank() { - return this.plugin.getRanksConfig().getMaxRank(); - } - - public boolean buyNextRank(Player p) { - - if (isMaxRank(p)) { - PlayerUtils.sendMessage(p, this.plugin.getRanksConfig().getMessage("prestige_needed")); - return false; - } - - Rank currentRank = this.getPlayerRank(p); - Optional toBuyOptional = getNextRank(currentRank.getId()); - - if (!toBuyOptional.isPresent()) { - PlayerUtils.sendMessage(p, this.plugin.getRanksConfig().getMessage("prestige_needed")); - return false; - } - - Rank toBuy = toBuyOptional.get(); - - if (!this.isTransactionAllowed(p, toBuy.getCost())) { - if (this.plugin.getRanksConfig().isUseTokensCurrency()) { - PlayerUtils.sendMessage(p, this.plugin.getRanksConfig().getMessage("not_enough_tokens").replace("%cost%", String.format("%,.0f", toBuy.getCost()))); - } else { - PlayerUtils.sendMessage(p, this.plugin.getRanksConfig().getMessage("not_enough_money").replace("%cost%", String.format("%,.0f", toBuy.getCost()))); - } - return false; - } - - PlayerRankUpEvent event = new PlayerRankUpEvent(p, currentRank, toBuy); - - Events.call(event); - - if (event.isCancelled()) { - this.plugin.getCore().debug("PlayerRankUpEvent was cancelled.", this.plugin); - return false; - } - - if (!this.completeTransaction(p, toBuy.getCost())) { - return false; - } - - runCommands(toBuy, p); - - this.onlinePlayersRanks.put(p.getUniqueId(), toBuy.getId()); - - PlayerUtils.sendMessage(p, this.plugin.getRanksConfig().getMessage("rank_up").replace("%Rank-1%", currentRank.getPrefix()).replace("%Rank-2%", toBuy.getPrefix())); - return true; - } - - private boolean completeTransaction(Player p, double cost) { - if (this.plugin.getRanksConfig().isUseTokensCurrency()) { - this.plugin.getCore().getTokens().getApi().removeTokens(p, (long) cost, LostCause.RANKUP); - return true; - } else { - return this.plugin.getCore().getEconomy().withdrawPlayer(p, cost).transactionSuccess(); - } - } - - private boolean isTransactionAllowed(Player p, double cost) { - if (this.plugin.getRanksConfig().isUseTokensCurrency()) { - return this.plugin.getCore().getTokens().getApi().hasEnough(p, (long) cost); - } else { - return this.plugin.getCore().getEconomy().has(p, cost); - } - } - - - public void setRank(Player target, Rank rank, CommandSender sender) { - - Rank currentRank = this.getPlayerRank(target); - - PlayerRankUpEvent event = new PlayerRankUpEvent(target, currentRank, rank); - - Events.call(event); - - if (event.isCancelled()) { - this.plugin.getCore().debug("PlayerRankUpEvent was cancelled.", this.plugin); - return; - } - - this.runCommands(rank, target); - - this.onlinePlayersRanks.put(target.getUniqueId(), rank.getId()); - - if (sender != null) { - PlayerUtils.sendMessage(sender, this.plugin.getRanksConfig().getMessage("rank_set").replace("%rank%", rank.getPrefix()).replace("%player%", target.getName())); - PlayerUtils.sendMessage(target, this.plugin.getRanksConfig().getMessage("rank_up").replace("%Rank-1%", currentRank.getPrefix()).replace("%Rank-2%", rank.getPrefix())); - } - - } - - public int getRankupProgress(Player player) { - - if (this.isMaxRank(player)) { - if (arePrestigesEnabled()) { - return getPrestigeManager().getPrestigeProgress(player); - } - return 100; - } - - Rank current = this.getPlayerRank(player); - Optional nextRankOptional = this.getNextRank(current.getId()); - - if (!nextRankOptional.isPresent()) { - return 100; - } - - Rank next = nextRankOptional.get(); - - double currentBalance = this.plugin.getRanksConfig().isUseTokensCurrency() ? - this.plugin.getCore().getTokens().getApi().getPlayerTokens(player) : this.plugin.getCore().getEconomy().getBalance(player); - - int progress = (int) ((currentBalance / next.getCost()) * 100); - - if (progress > 100) { - progress = 100; - } - - return progress; - } - - public double getNextRankCost(Player player) { - if (this.isMaxRank(player)) { - if (arePrestigesEnabled()) { - if (getPrestigeManager().isMaxPrestige(player)) { - return 0.0; - } else { - Prestige prestige = getPrestigeManager().getPlayerPrestige(player); - Prestige next = getPrestigeManager().getNextPrestige(prestige); - if (next != null) { - return next.getCost(); - } else { - return 0.0; - } - } - } else { - return 0.0; - } - } - - Rank current = this.getPlayerRank(player); - Optional nextRankOptional = this.getNextRank(current.getId()); - return nextRankOptional.map(Rank::getCost).orElse(0.0); - } - - public void resetPlayerRank(Player p) { - setRank(p, getDefaultRank(), null); - } - - private boolean arePrestigesEnabled() { - return this.plugin.getCore().isModuleEnabled(XPrisonPrestiges.MODULE_NAME); - } - - private PrestigeManager getPrestigeManager() { - if (!arePrestigesEnabled()) { - throw new IllegalStateException("Prestiges module is not enabled"); - } - return this.plugin.getCore().getPrestiges().getPrestigeManager(); - } - - public String getRankupProgressBar(Player player) { - - double currentProgress = 0, required = 100; - if (this.isMaxRank(player)) { - currentProgress = 100; - if (arePrestigesEnabled()) { - currentProgress = getPrestigeManager().getPrestigeProgress(player); - } - } else { - Rank current = this.getPlayerRank(player); - Optional next = this.getNextRank(current.getId()); - if (next.isPresent()) { - double currentBalance = this.plugin.getRanksConfig().isUseTokensCurrency() ? this.plugin.getCore().getTokens().getApi().getPlayerTokens(player) : this.plugin.getCore().getEconomy().getBalance(player); - currentProgress = (currentBalance / next.get().getCost()) * 100; - } - } - - if (currentProgress > 100) { - currentProgress = 100; - } - - return ProgressBar.getProgressBar(this.plugin.getRanksConfig().getProgressBarLength(), this.plugin.getRanksConfig().getProgressBarDelimiter(), currentProgress, required); - } - - public void runCommands(Rank rank, Player p) { - if (rank.getCommandsToExecute() != null) { - - if (!Bukkit.isPrimaryThread()) { - Schedulers.async().run(() -> { - executeCommands(rank, p); - }); - } else { - executeCommands(rank, p); - } - } - } - - public Optional getRankById(int id) { - return Optional.ofNullable(this.plugin.getRanksConfig().getRankById(id)); - } - - private void executeCommands(Rank rank, Player p) { - for (String cmd : rank.getCommandsToExecute()) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("%player%", p.getName()).replace("%Rank%", rank.getPrefix())); - } - } - - public void disable() { - this.saveAllDataSync(); - } - - public void enable() { - this.loadAllData(); - } -} diff --git a/src/main/java/me/nvus/xprison/ranks/model/Rank.java b/src/main/java/me/nvus/xprison/ranks/model/Rank.java deleted file mode 100644 index 7a23b29..0000000 --- a/src/main/java/me/nvus/xprison/ranks/model/Rank.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.nvus.xprison.ranks.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -@AllArgsConstructor -@Getter -public class Rank { - - private int id; - private double cost; - private String prefix; - private List commandsToExecute; - -} diff --git a/src/main/java/me/nvus/xprison/ranks/repo/RanksRepository.java b/src/main/java/me/nvus/xprison/ranks/repo/RanksRepository.java deleted file mode 100644 index b4f3676..0000000 --- a/src/main/java/me/nvus/xprison/ranks/repo/RanksRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.nvus.xprison.ranks.repo; - -import org.bukkit.OfflinePlayer; - -public interface RanksRepository { - - int getPlayerRank(OfflinePlayer player); - - void updateRank(OfflinePlayer player, int rank); - - void addIntoRanks(OfflinePlayer player); - - void createTables(); - - void clearTableData(); -} diff --git a/src/main/java/me/nvus/xprison/ranks/repo/impl/RanksRepositoryImpl.java b/src/main/java/me/nvus/xprison/ranks/repo/impl/RanksRepositoryImpl.java deleted file mode 100644 index ea12385..0000000 --- a/src/main/java/me/nvus/xprison/ranks/repo/impl/RanksRepositoryImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package me.nvus.xprison.ranks.repo.impl; - -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.database.model.SQLDatabaseType; -import me.nvus.xprison.ranks.repo.RanksRepository; -import org.bukkit.OfflinePlayer; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class RanksRepositoryImpl implements RanksRepository { - - private static final String TABLE_NAME = "UltraPrison_Ranks"; - private static final String RANKS_UUID_COLNAME = "UUID"; - private static final String RANKS_RANK_COLNAME = "id_rank"; - - private final SQLDatabase database; - - public RanksRepositoryImpl(SQLDatabase database) { - this.database = database; - } - - @Override - public int getPlayerRank(OfflinePlayer player) { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT * FROM " + TABLE_NAME + " WHERE " + RANKS_UUID_COLNAME + "=?")) { - statement.setString(1, player.getUniqueId().toString()); - try (ResultSet set = statement.executeQuery()) { - if (set.next()) { - return set.getInt(RANKS_RANK_COLNAME); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; - } - - @Override - public void updateRank(OfflinePlayer player, int newRank) { - this.database.executeSql("UPDATE " + TABLE_NAME + " SET " + RANKS_RANK_COLNAME + "=? WHERE " + RANKS_UUID_COLNAME + "=?", newRank, player.getUniqueId().toString()); - } - - @Override - public void addIntoRanks(OfflinePlayer player) { - String sql = database.getDatabaseType() == SQLDatabaseType.SQLITE ? "INSERT OR IGNORE INTO " + TABLE_NAME + "(UUID,id_rank) VALUES(?,?)" : "INSERT IGNORE INTO " + TABLE_NAME + "(UUID,id_rank) VALUES(?,?)"; - this.database.executeSql(sql, player.getUniqueId().toString(), 0); - } - - @Override - public void createTables() { - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(UUID varchar(36) NOT NULL UNIQUE, id_rank int, primary key (UUID))"); - } - - @Override - public void clearTableData() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME); - } - -} diff --git a/src/main/java/me/nvus/xprison/ranks/service/RanksService.java b/src/main/java/me/nvus/xprison/ranks/service/RanksService.java deleted file mode 100644 index 9c1f58f..0000000 --- a/src/main/java/me/nvus/xprison/ranks/service/RanksService.java +++ /dev/null @@ -1,12 +0,0 @@ -package me.nvus.xprison.ranks.service; - -import org.bukkit.OfflinePlayer; - -public interface RanksService { - - int getPlayerRank(OfflinePlayer player); - - void setRank(OfflinePlayer player, int rank); - - void createRank(OfflinePlayer player); -} diff --git a/src/main/java/me/nvus/xprison/ranks/service/impl/RanksServiceImpl.java b/src/main/java/me/nvus/xprison/ranks/service/impl/RanksServiceImpl.java deleted file mode 100644 index a6ee11e..0000000 --- a/src/main/java/me/nvus/xprison/ranks/service/impl/RanksServiceImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.nvus.xprison.ranks.service.impl; - -import me.nvus.xprison.ranks.repo.RanksRepository; -import me.nvus.xprison.ranks.service.RanksService; -import org.bukkit.OfflinePlayer; - -public class RanksServiceImpl implements RanksService { - - private final RanksRepository repository; - - public RanksServiceImpl(RanksRepository repository) { - this.repository = repository; - } - - @Override - public int getPlayerRank(OfflinePlayer player) { - return repository.getPlayerRank(player); - } - - @Override - public void setRank(OfflinePlayer player, int rank) { - repository.updateRank(player, rank); - } - - @Override - public void createRank(OfflinePlayer player) { - repository.addIntoRanks(player); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/XPrisonTokens.java b/src/main/java/me/nvus/xprison/tokens/XPrisonTokens.java deleted file mode 100644 index 73ed1a2..0000000 --- a/src/main/java/me/nvus/xprison/tokens/XPrisonTokens.java +++ /dev/null @@ -1,152 +0,0 @@ -package me.nvus.xprison.tokens; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.tokens.api.XPrisonTokensAPI; -import me.nvus.xprison.tokens.api.XPrisonTokensAPIImpl; -import me.nvus.xprison.tokens.config.BlockRewardsConfig; -import me.nvus.xprison.tokens.config.TokensConfig; -import me.nvus.xprison.tokens.listener.TokensListener; -import me.nvus.xprison.tokens.managers.CommandManager; -import me.nvus.xprison.tokens.managers.TokensManager; -import me.nvus.xprison.tokens.repo.BlocksRepository; -import me.nvus.xprison.tokens.repo.TokensRepository; -import me.nvus.xprison.tokens.repo.impl.BlocksRepositoryImpl; -import me.nvus.xprison.tokens.repo.impl.TokensRepositoryImpl; -import me.nvus.xprison.tokens.service.BlocksService; -import me.nvus.xprison.tokens.service.TokensService; -import me.nvus.xprison.tokens.service.impl.BlocksServiceImpl; -import me.nvus.xprison.tokens.service.impl.TokensServiceImpl; -import me.nvus.xprison.tokens.task.SavePlayerDataTask; -import lombok.Getter; - -public final class XPrisonTokens implements XPrisonModule { - - public static final String MODULE_NAME = "Tokens"; - - @Getter - private static XPrisonTokens instance; - - @Getter - private BlockRewardsConfig blockRewardsConfig; - - @Getter - private TokensConfig tokensConfig; - - @Getter - private XPrisonTokensAPI api; - - @Getter - private TokensManager tokensManager; - - @Getter - private CommandManager commandManager; - - @Getter - private TokensRepository tokensRepository; - - @Getter - private TokensService tokensService; - - @Getter - private BlocksRepository blocksRepository; - - @Getter - private BlocksService blocksService; - - @Getter - private final XPrison core; - - private SavePlayerDataTask savePlayerDataTask; - - private boolean enabled; - - - public XPrisonTokens(XPrison prisonCore) { - instance = this; - this.core = prisonCore; - } - - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public void reload() { - this.tokensConfig.reload(); - this.blockRewardsConfig.reload(); - this.tokensManager.reload(); - this.commandManager.reload(); - } - - - @Override - public void enable() { - - this.tokensConfig = new TokensConfig(this); - this.blockRewardsConfig = new BlockRewardsConfig(this); - - this.tokensConfig.load(); - this.blockRewardsConfig.load(); - - this.tokensRepository = new TokensRepositoryImpl(this.core.getPluginDatabase()); - this.tokensRepository.createTables(); - - this.tokensService = new TokensServiceImpl(this.tokensRepository); - - this.blocksRepository = new BlocksRepositoryImpl(this.core.getPluginDatabase()); - this.blocksRepository.createTables(); - - this.blocksService = new BlocksServiceImpl(this.blocksRepository); - - this.tokensManager = new TokensManager(this); - this.tokensManager.enable(); - - this.commandManager = new CommandManager(this); - this.commandManager.enable(); - - this.savePlayerDataTask = new SavePlayerDataTask(this); - this.savePlayerDataTask.start(); - - this.registerListeners(); - - this.commandManager.enable(); - - this.api = new XPrisonTokensAPIImpl(this.tokensManager); - - this.enabled = true; - } - - private void registerListeners() { - new TokensListener(this).subscribeToEvents(); - } - - - @Override - public void disable() { - this.tokensManager.disable(); - - this.savePlayerDataTask.stop(); - - this.enabled = false; - } - - @Override - public String getName() { - return MODULE_NAME; - } - - @Override - public boolean isHistoryEnabled() { - return true; - } - - @Override - public void resetPlayerData() { - this.tokensRepository.clearTableData(); - this.blocksRepository.clearTableData(); - } - -} diff --git a/src/main/java/me/nvus/xprison/tokens/api/XPrisonTokensAPI.java b/src/main/java/me/nvus/xprison/tokens/api/XPrisonTokensAPI.java deleted file mode 100644 index fe21dec..0000000 --- a/src/main/java/me/nvus/xprison/tokens/api/XPrisonTokensAPI.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.nvus.xprison.tokens.api; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.api.enums.ReceiveCause; -import org.bukkit.OfflinePlayer; - -public interface XPrisonTokensAPI { - - - /** - * Method to get player's tokens - * - * @param p Player - * @return amount of player's tokens - */ - long getPlayerTokens(OfflinePlayer p); - - /** - * Method to check if player has more or equal tokens than specified amount - * - * @param p Player - * @param amount amount - * @return true if player has more or equal tokens than amount - */ - boolean hasEnough(OfflinePlayer p, long amount); - - /** - * Method to remove tokens from player - * - * @param p Player - * @param amount amount - */ - void removeTokens(OfflinePlayer p, long amount, LostCause cause); - - /** - * Method to add tokens to player - * - * @param p Player - * @param amount amount - * @param cause - Represents why player get these tokens - */ - void addTokens(OfflinePlayer p, long amount, ReceiveCause cause); - - -} diff --git a/src/main/java/me/nvus/xprison/tokens/api/XPrisonTokensAPIImpl.java b/src/main/java/me/nvus/xprison/tokens/api/XPrisonTokensAPIImpl.java deleted file mode 100644 index 2a152f3..0000000 --- a/src/main/java/me/nvus/xprison/tokens/api/XPrisonTokensAPIImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.nvus.xprison.tokens.api; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.tokens.managers.TokensManager; -import org.bukkit.OfflinePlayer; - -public final class XPrisonTokensAPIImpl implements XPrisonTokensAPI { - - private final TokensManager manager; - - public XPrisonTokensAPIImpl(TokensManager manager) { - this.manager = manager; - } - - @Override - public long getPlayerTokens(OfflinePlayer p) { - return this.manager.getPlayerTokens(p); - } - - @Override - public boolean hasEnough(OfflinePlayer p, long amount) { - return this.getPlayerTokens(p) >= amount; - } - - @Override - public void removeTokens(OfflinePlayer p, long amount, LostCause cause) { - this.manager.removeTokens(p, amount, null, cause); - } - - @Override - public void addTokens(OfflinePlayer p, long amount, ReceiveCause cause) { - this.manager.giveTokens(p, amount, null, cause); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/api/events/PlayerTokensLostEvent.java b/src/main/java/me/nvus/xprison/tokens/api/events/PlayerTokensLostEvent.java deleted file mode 100644 index a635046..0000000 --- a/src/main/java/me/nvus/xprison/tokens/api/events/PlayerTokensLostEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.nvus.xprison.tokens.api.events; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.OfflinePlayer; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public final class PlayerTokensLostEvent extends XPrisonPlayerEvent { - - - private static final HandlerList handlers = new HandlerList(); - - @Getter - private final LostCause cause; - - @Getter - @Setter - private long amount; - - /** - * Called when player loses tokens - * - * @param cause LostCause - * @param player Player - * @param amount Amount of tokens lost - */ - public PlayerTokensLostEvent(LostCause cause, OfflinePlayer player, long amount) { - super(player); - this.cause = cause; - this.amount = amount; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public @NotNull HandlerList getHandlers() { - return handlers; - } - -} diff --git a/src/main/java/me/nvus/xprison/tokens/api/events/PlayerTokensReceiveEvent.java b/src/main/java/me/nvus/xprison/tokens/api/events/PlayerTokensReceiveEvent.java deleted file mode 100644 index 748e011..0000000 --- a/src/main/java/me/nvus/xprison/tokens/api/events/PlayerTokensReceiveEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.nvus.xprison.tokens.api.events; - -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.OfflinePlayer; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -public final class PlayerTokensReceiveEvent extends XPrisonPlayerEvent implements Cancellable { - - - private static final HandlerList handlers = new HandlerList(); - - @Getter - private final ReceiveCause cause; - - @Getter - @Setter - private long amount; - - @Getter - @Setter - private boolean cancelled; - - /** - * Called when player receive tokens - * - * @param cause ReceiveCause - * @param player Player - * @param amount Amount of tokens received - */ - public PlayerTokensReceiveEvent(ReceiveCause cause, OfflinePlayer player, long amount) { - super(player); - this.cause = cause; - this.amount = amount; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - -} diff --git a/src/main/java/me/nvus/xprison/tokens/api/events/XPrisonBlockBreakEvent.java b/src/main/java/me/nvus/xprison/tokens/api/events/XPrisonBlockBreakEvent.java deleted file mode 100644 index 60c5596..0000000 --- a/src/main/java/me/nvus/xprison/tokens/api/events/XPrisonBlockBreakEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.nvus.xprison.tokens.api.events; - -import me.nvus.xprison.api.events.player.XPrisonPlayerEvent; -import lombok.Getter; -import lombok.Setter; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; - -import java.util.List; - -@Getter -@Setter -public final class XPrisonBlockBreakEvent extends XPrisonPlayerEvent implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private Player player; - private List blocks; - private boolean cancelled; - - /** - * Called when player mines blocks within mine with or without custom enchants. - * - * @param player Player - * @param blocks List of blocks that were affected - */ - public XPrisonBlockBreakEvent(Player player, List blocks) { - super(player); - this.player = player; - this.blocks = blocks; - } - - public static HandlerList getHandlerList() { - return handlers; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/commands/TokensCommand.java b/src/main/java/me/nvus/xprison/tokens/commands/TokensCommand.java deleted file mode 100644 index 3dead84..0000000 --- a/src/main/java/me/nvus/xprison/tokens/commands/TokensCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.nvus.xprison.tokens.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.interfaces.Permissionable; -import me.nvus.xprison.tokens.managers.CommandManager; -import lombok.Getter; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public abstract class TokensCommand implements Permissionable { - - protected static final String PERMISSION_ROOT = "xprison.tokens.command."; - - @Getter - private final String name; - protected final CommandManager commandManager; - @Getter - private final String[] aliases; - - TokensCommand(CommandManager commandManager, String name, String... aliases) { - this.commandManager = commandManager; - this.name = name; - this.aliases = aliases; - } - - public abstract boolean execute(CommandSender sender, ImmutableList args); - - public abstract boolean canExecute(CommandSender sender); - - public abstract String getUsage(); - - @Override - public String getRequiredPermission() { - return PERMISSION_ROOT + this.name; - } - - public abstract List getTabComplete(List args); - - -} diff --git a/src/main/java/me/nvus/xprison/tokens/commands/TokensGiveCommand.java b/src/main/java/me/nvus/xprison/tokens/commands/TokensGiveCommand.java deleted file mode 100644 index b9ee4f6..0000000 --- a/src/main/java/me/nvus/xprison/tokens/commands/TokensGiveCommand.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.nvus.xprison.tokens.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.tokens.managers.CommandManager; -import me.nvus.xprison.tokens.utils.TokensConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class TokensGiveCommand extends TokensCommand { - - private static final String COMMAND_NAME = "give"; - - public TokensGiveCommand(CommandManager commandManager) { - super(commandManager, COMMAND_NAME); - } - - @Override - public boolean execute(CommandSender sender, ImmutableList args) { - if (args.size() == 2) { - try { - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - long amount = Long.parseLong(args.get(1)); - commandManager.getPlugin().getTokensManager().giveTokens(target, amount, sender, ReceiveCause.GIVE); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, commandManager.getPlugin().getTokensConfig().getMessage("not_a_number").replace("%input%", String.valueOf(args.get(1)))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(TokensConstants.TOKENS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/tokens give [player] [tokens] - Gives tokens to player."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/commands/TokensHelpCommand.java b/src/main/java/me/nvus/xprison/tokens/commands/TokensHelpCommand.java deleted file mode 100644 index 0ee2d99..0000000 --- a/src/main/java/me/nvus/xprison/tokens/commands/TokensHelpCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -package me.nvus.xprison.tokens.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.tokens.managers.CommandManager; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; - -import java.util.ArrayList; -import java.util.List; - -public final class TokensHelpCommand extends TokensCommand { - - private static final String COMMAND_NAME = "help"; - private static final String[] COMMAND_ALIASES = {"?"}; - - public TokensHelpCommand(CommandManager commandManager) { - super(commandManager, COMMAND_NAME, COMMAND_ALIASES); - } - - @Override - public boolean execute(CommandSender sender, ImmutableList args) { - if (args.isEmpty()) { - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - PlayerUtils.sendMessage(sender, "&e&lTOKEN HELP MENU "); - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - for (TokensCommand command : this.commandManager.getAll()) { - if (command.canExecute(sender)) { - PlayerUtils.sendMessage(sender, "&e" + command.getUsage()); - } - } - PlayerUtils.sendMessage(sender, "&e&m-------&f&m-------&e&m--------&f&m--------&e&m--------&f&m-------&e&m-------"); - return true; - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return true; - } - - @Override - public String getUsage() { - return "/tokens help - Displays all available commands."; - } - - @Override - public List getTabComplete(List args) { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/commands/TokensPayCommand.java b/src/main/java/me/nvus/xprison/tokens/commands/TokensPayCommand.java deleted file mode 100644 index 61b5525..0000000 --- a/src/main/java/me/nvus/xprison/tokens/commands/TokensPayCommand.java +++ /dev/null @@ -1,78 +0,0 @@ -package me.nvus.xprison.tokens.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.tokens.managers.CommandManager; -import me.nvus.xprison.tokens.utils.TokensConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class TokensPayCommand extends TokensCommand { - - private static final String COMMAND_NAME = "pay"; - private static final String[] COMMAND_ALIASES = {"send"}; - - public TokensPayCommand(CommandManager commandManager) { - super(commandManager, COMMAND_NAME, COMMAND_ALIASES); - } - - @Override - public boolean execute(CommandSender sender, ImmutableList args) { - if (args.size() == 2 && sender instanceof Player) { - Player p = (Player) sender; - try { - - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - - if (!target.isOnline()) { - PlayerUtils.sendMessage(sender, commandManager.getPlugin().getTokensConfig().getMessage("player_not_online").replace("%player%", target.getName())); - return true; - } - - long amount = Long.parseLong(args.get(1).replace(",", "")); - - if (0 >= amount) { - return false; - } - - if (target.getUniqueId().equals(p.getUniqueId())) { - PlayerUtils.sendMessage(sender, commandManager.getPlugin().getTokensConfig().getMessage("tokens_cant_send_to_yourself")); - return true; - } - - commandManager.getPlugin().getTokensManager().payTokens(p, amount, target); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, commandManager.getPlugin().getTokensConfig().getMessage("not_a_number").replace("%input%", String.valueOf(args.get(1)))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(TokensConstants.TOKENS_ADMIN_PERM) || sender.hasPermission(this.getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/tokens pay [player] [amount] - Send tokens to a player."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/commands/TokensRemoveCommand.java b/src/main/java/me/nvus/xprison/tokens/commands/TokensRemoveCommand.java deleted file mode 100644 index c96d316..0000000 --- a/src/main/java/me/nvus/xprison/tokens/commands/TokensRemoveCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.nvus.xprison.tokens.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.tokens.managers.CommandManager; -import me.nvus.xprison.tokens.utils.TokensConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class TokensRemoveCommand extends TokensCommand { - - private static final String COMMAND_NAME = "remove"; - private static final String[] COMMAND_ALIASES = {"subtract", "delete"}; - - public TokensRemoveCommand(CommandManager commandManager) { - super(commandManager, COMMAND_NAME, COMMAND_ALIASES); - } - - @Override - public boolean execute(CommandSender sender, ImmutableList args) { - - if (args.size() == 2) { - try { - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - long amount = Long.parseLong(args.get(1)); - commandManager.getPlugin().getTokensManager().removeTokens(target, amount, sender, LostCause.ADMIN); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, commandManager.getPlugin().getTokensConfig().getMessage("not_a_number").replace("%input%", String.valueOf(args.get(1)))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(TokensConstants.TOKENS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/tokens remove [player] [amount] - Remove tokens from player."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/commands/TokensSetCommand.java b/src/main/java/me/nvus/xprison/tokens/commands/TokensSetCommand.java deleted file mode 100644 index 97b603d..0000000 --- a/src/main/java/me/nvus/xprison/tokens/commands/TokensSetCommand.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.nvus.xprison.tokens.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.tokens.managers.CommandManager; -import me.nvus.xprison.tokens.utils.TokensConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public final class TokensSetCommand extends TokensCommand { - - private static final String COMMAND_NAME = "set"; - - public TokensSetCommand(CommandManager commandManager) { - super(commandManager, COMMAND_NAME); - } - - @Override - public boolean execute(CommandSender sender, ImmutableList args) { - - if (args.size() == 2) { - try { - long amount = Long.parseLong(args.get(1)); - OfflinePlayer target = Players.getOfflineNullable(args.get(0)); - commandManager.getPlugin().getTokensManager().setTokens(target, amount, sender); - return true; - } catch (Exception e) { - PlayerUtils.sendMessage(sender, commandManager.getPlugin().getTokensConfig().getMessage("not_a_number").replace("%input%", String.valueOf(args.get(0)))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(TokensConstants.TOKENS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/tokens set [player] [amount] - Sets player tokens."; - } - - @Override - public List getTabComplete(List args) { - List list = new ArrayList<>(); - - if (args.size() == 1) { - list = Players.all().stream().map(Player::getName).collect(Collectors.toList()); - } - - return list; - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/commands/TokensWithdrawCommand.java b/src/main/java/me/nvus/xprison/tokens/commands/TokensWithdrawCommand.java deleted file mode 100644 index 7819ca9..0000000 --- a/src/main/java/me/nvus/xprison/tokens/commands/TokensWithdrawCommand.java +++ /dev/null @@ -1,69 +0,0 @@ -package me.nvus.xprison.tokens.commands; - -import com.google.common.collect.ImmutableList; -import me.nvus.xprison.tokens.managers.CommandManager; -import me.nvus.xprison.tokens.utils.TokensConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public final class TokensWithdrawCommand extends TokensCommand { - - private static final String COMMAND_NAME = "withdraw"; - - public TokensWithdrawCommand(CommandManager commandManager) { - super(commandManager, COMMAND_NAME); - } - - @Override - public boolean execute(CommandSender sender, ImmutableList args) { - if (args.size() == 2 && sender instanceof Player) { - Player p = (Player) sender; - try { - long amount = Long.parseLong(args.get(0)); - int value = Integer.parseInt(args.get(1)); - - if (0 >= amount || 0 >= value) { - return false; - } - - commandManager.getPlugin().getTokensManager().withdrawTokens(p, amount, value); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, commandManager.getPlugin().getTokensConfig().getMessage("not_a_number").replace("%input%", args.get(0) + " or " + args.get(1))); - } - } else if (args.size() == 1 && sender instanceof Player) { - Player p = (Player) sender; - try { - long amount = Long.parseLong(args.get(0)); - int value = 1; - if (0 >= amount) { - return false; - } - commandManager.getPlugin().getTokensManager().withdrawTokens(p, amount, value); - return true; - } catch (NumberFormatException e) { - PlayerUtils.sendMessage(sender, commandManager.getPlugin().getTokensConfig().getMessage("not_a_number").replace("%input%", args.get(0) + " or " + args.get(1))); - } - } - return false; - } - - @Override - public boolean canExecute(CommandSender sender) { - return sender.hasPermission(TokensConstants.TOKENS_ADMIN_PERM) || sender.hasPermission(getRequiredPermission()); - } - - @Override - public String getUsage() { - return "/tokens withdraw [amount] [value] - Withdraw tokens to physical item."; - } - - @Override - public List getTabComplete(List args) { - return new ArrayList<>(); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/config/BlockRewardsConfig.java b/src/main/java/me/nvus/xprison/tokens/config/BlockRewardsConfig.java deleted file mode 100644 index 27e046b..0000000 --- a/src/main/java/me/nvus/xprison/tokens/config/BlockRewardsConfig.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.nvus.xprison.tokens.config; - -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.tokens.XPrisonTokens; -import me.nvus.xprison.tokens.model.BlockReward; -import me.nvus.xprison.utils.text.TextUtils; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class BlockRewardsConfig { - - private final XPrisonTokens plugin; - private final FileManager.Config config; - private final Map blockRewards; - - public BlockRewardsConfig(XPrisonTokens plugin) { - this.plugin = plugin; - this.config = this.plugin.getCore().getFileManager().getConfig("block-rewards.yml").copyDefaults(true).save(); - this.blockRewards = new LinkedHashMap<>(); - } - - private FileManager.Config getConfig() { - return this.config; - } - - public YamlConfiguration getYamlConfig() { - return this.config.get(); - } - - public void load() { - YamlConfiguration configuration = getYamlConfig(); - this.loadVariables(configuration); - } - - public void reload() { - this.getConfig().reload(); - this.load(); - } - - private void loadVariables(YamlConfiguration configuration) { - this.blockRewards.clear(); - ConfigurationSection section = configuration.getConfigurationSection("block-rewards"); - - if (section != null) { - for (String key : section.getKeys(false)) { - long blocksNeeded = Long.parseLong(key); - String message = TextUtils.applyColor(configuration.getString("block-rewards." + key + ".message")); - List commands = configuration.getStringList("block-rewards." + key + ".commands"); - BlockReward reward = new BlockReward(blocksNeeded, commands, message); - this.blockRewards.put(blocksNeeded, reward); - } - } - this.plugin.getCore().getLogger().info("Loaded " + this.blockRewards.keySet().size() + " Block Rewards!"); - } - - public Map getBlockRewards() { - return blockRewards; - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/config/TokensConfig.java b/src/main/java/me/nvus/xprison/tokens/config/TokensConfig.java deleted file mode 100644 index b095930..0000000 --- a/src/main/java/me/nvus/xprison/tokens/config/TokensConfig.java +++ /dev/null @@ -1,210 +0,0 @@ -package me.nvus.xprison.tokens.config; - -import me.nvus.xprison.config.FileManager; -import me.nvus.xprison.tokens.XPrisonTokens; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.text.TextUtils; -import org.bukkit.Material; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class TokensConfig { - - private final FileManager.Config config; - private final XPrisonTokens plugin; - - private double chance; - private long minAmount; - private long maxAmount; - private long commandCooldown; - private long nextResetWeekly; - private long startingTokens; - private int savePlayerDataInterval; - private boolean displayTokenMessages; - private Map messages; - private Map> luckyBlockRewards; - private List worldWhitelist; - private List tokensTopFormat; - private List blocksTopFormat; - private List blocksTopFormatWeekly; - private List tokenItemLore; - private String tokenItemDisplayName; - private ItemStack tokenItem; - private int topPlayersAmount; - - private String[] tokensCommandAliases; - private String[] tokensTopCommandAliases; - private String[] blocksTopCommandAliases; - - - public TokensConfig(XPrisonTokens plugin) { - this.plugin = plugin; - this.config = this.plugin.getCore().getFileManager().getConfig("tokens.yml").copyDefaults(true).save(); - } - - private FileManager.Config getConfig() { - return this.config; - } - - public YamlConfiguration getYamlConfig() { - return this.config.get(); - } - - - private void loadVariables(YamlConfiguration configuration) { - this.chance = configuration.getDouble("tokens.breaking.chance"); - this.minAmount = configuration.getLong("tokens.breaking.min"); - this.maxAmount = configuration.getLong("tokens.breaking.max"); - - this.commandCooldown = configuration.getLong("tokens-command-cooldown"); - - this.luckyBlockRewards = new HashMap<>(); - - for (String key : configuration.getConfigurationSection("lucky-blocks").getKeys(false)) { - CompMaterial material = CompMaterial.fromString(key); - List rewards = configuration.getStringList("lucky-blocks." + key); - if (rewards.isEmpty()) { - continue; - } - this.luckyBlockRewards.put(material.toMaterial(), rewards); - } - - this.topPlayersAmount = configuration.getInt("top_players_amount"); - this.worldWhitelist = configuration.getStringList("world-whitelist"); - this.tokensTopFormat = configuration.getStringList("tokens-top-format"); - this.blocksTopFormat = configuration.getStringList("blocks-top-format"); - this.blocksTopFormatWeekly = configuration.getStringList("blocks-top-weekly-format"); - this.nextResetWeekly = configuration.getLong("next-reset-weekly"); - this.displayTokenMessages = configuration.getBoolean("display-token-messages"); - this.savePlayerDataInterval = configuration.getInt("player_data_save_interval"); - this.tokenItemDisplayName = configuration.getString("tokens.item.name"); - this.tokenItemLore = configuration.getStringList("tokens.item.lore"); - this.tokenItem = CompMaterial.fromString(configuration.getString("tokens.item.material")).toItem(); - this.startingTokens = configuration.getLong("starting-tokens"); - this.tokensCommandAliases = configuration.getStringList("tokens-command-aliases").toArray(new String[0]); - this.tokensTopCommandAliases = configuration.getStringList("tokens-top-command-aliases").toArray(new String[0]); - this.blocksTopCommandAliases = configuration.getStringList("blocks-top-command-aliases").toArray(new String[0]); - - } - - private void loadMessages(YamlConfiguration configuration) { - this.messages = new HashMap<>(); - - for (String key : configuration.getConfigurationSection("messages").getKeys(false)) { - messages.put(key.toLowerCase(), TextUtils.applyColor(getConfig().get().getString("messages." + key))); - } - } - - public void reload() { - this.config.reload(); - YamlConfiguration configuration = getYamlConfig(); - this.loadVariables(configuration); - this.loadMessages(configuration); - } - - public void load() { - this.reload(); - } - - public String getMessage(String messageKey) { - return this.messages.getOrDefault(messageKey.toLowerCase(), "Missing message with key: " + messageKey); - } - - public boolean isDisplayTokenMessages() { - return this.displayTokenMessages; - } - - public Material getTokenItemMaterial() { - return this.tokenItem.getType(); - } - - public long getStartingTokens() { - return this.startingTokens; - } - - public List getWorldWhitelist() { - return worldWhitelist; - } - - public List getTokensTopFormat() { - return tokensTopFormat; - } - - public List getBlocksTopFormat() { - return blocksTopFormat; - } - - public List getBlocksTopFormatWeekly() { - return blocksTopFormatWeekly; - } - - public List getTokenItemLore() { - return tokenItemLore; - } - - public String getTokenItemDisplayName() { - return tokenItemDisplayName; - } - - public List getLuckyBlockReward(Material m) { - return this.luckyBlockRewards.getOrDefault(m, new ArrayList<>()); - } - - public double getChance() { - return chance; - } - - public long getMinAmount() { - return minAmount; - } - - public long getMaxAmount() { - return maxAmount; - } - - public long getCommandCooldown() { - return commandCooldown; - } - - public long getNextResetWeekly() { - return nextResetWeekly; - } - - public int getTopPlayersAmount() { - return topPlayersAmount; - } - - public ItemStack getTokenItem() { - return tokenItem; - } - - public String[] getTokensCommandAliases() { - return tokensCommandAliases; - } - - public String[] getTokensTopCommandAliases() { - return tokensTopCommandAliases; - } - - public String[] getBlocksTopCommandAliases() { - return blocksTopCommandAliases; - } - - public void save() { - this.config.save(); - } - - public void setNextResetWeekly(long time) { - this.nextResetWeekly = time; - - } - - public int getSavePlayerDataInterval() { - return savePlayerDataInterval; - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/listener/TokensListener.java b/src/main/java/me/nvus/xprison/tokens/listener/TokensListener.java deleted file mode 100644 index 2fe4fd0..0000000 --- a/src/main/java/me/nvus/xprison/tokens/listener/TokensListener.java +++ /dev/null @@ -1,90 +0,0 @@ -package me.nvus.xprison.tokens.listener; - -import me.nvus.xprison.tokens.XPrisonTokens; -import me.lucko.helper.Events; -import me.lucko.helper.reflect.MinecraftVersion; -import org.bukkit.block.Block; -import org.bukkit.event.Event; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.EquipmentSlot; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class TokensListener { - - private final XPrisonTokens plugin; - - public TokensListener(XPrisonTokens plugin) { - - this.plugin = plugin; - } - - public void subscribeToEvents() { - this.subscribeToPlayerJoinEvent(); - this.subscribeToPlayerQuitEvent(); - this.subscribeToPlayerInteractEvent(); - this.subscribeToBlockBreakEvent(); - } - - private void subscribeToBlockBreakEvent() { - Events.subscribe(BlockBreakEvent.class, EventPriority.HIGHEST) - .filter(e -> !e.isCancelled()) - .filter(e -> e.getPlayer().getItemInHand() != null && this.plugin.getCore().isPickaxeSupported(e.getPlayer().getItemInHand().getType())) - .filter(e -> { - final List whitelist = this.plugin.getTokensConfig().getWorldWhitelist(); - return whitelist.isEmpty() || whitelist.contains(e.getBlock().getWorld().getName()); - }) - .handler(e -> { - List blocks = new ArrayList<>(); - blocks.add(e.getBlock()); - this.plugin.getTokensManager().handleBlockBreak(e.getPlayer(), blocks, true); - }).bindWith(plugin.getCore()); - } - - private void subscribeToPlayerInteractEvent() { - - Events.subscribe(PlayerInteractEvent.class, EventPriority.LOWEST) - .filter(e -> e.getItem() != null && e.getItem().hasItemMeta() && e.getItem().getType() == this.plugin.getTokensConfig().getTokenItemMaterial() && (e.getAction() == Action.RIGHT_CLICK_BLOCK || e.getAction() == Action.RIGHT_CLICK_AIR)) - .handler(e -> { - - e.setCancelled(true); - e.setUseInteractedBlock(Event.Result.DENY); - - boolean offHandClick = false; - - if (MinecraftVersion.getRuntimeVersion().isAfter(MinecraftVersion.of(1, 8, 9))) { - offHandClick = e.getHand() == EquipmentSlot.OFF_HAND; - } - - this.plugin.getTokensManager().redeemTokens(e.getPlayer(), e.getItem(), e.getPlayer().isSneaking(), offHandClick); - - }).bindWith(plugin.getCore()); - } - - private void subscribeToPlayerQuitEvent() { - Events.subscribe(PlayerQuitEvent.class) - .handler(e -> { - this.plugin.getTokensManager().savePlayerData(Collections.singletonList(e.getPlayer()), true, true); - e.getPlayer().getActivePotionEffects().forEach(effect -> e.getPlayer().removePotionEffect(effect.getType())); - }).bindWith(plugin.getCore()); - } - - private void subscribeToPlayerJoinEvent() { - Events.subscribe(PlayerJoinEvent.class) - .handler(e -> { - this.plugin.getTokensManager().loadPlayerData(Collections.singleton(e.getPlayer())); - - if (this.plugin.getTokensConfig().isDisplayTokenMessages() && this.plugin.getTokensManager().hasOffTokenMessages(e.getPlayer())) { - this.plugin.getTokensManager().addPlayerIntoTokenMessageOnPlayers(e.getPlayer()); - } - - }).bindWith(plugin.getCore()); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/managers/CommandManager.java b/src/main/java/me/nvus/xprison/tokens/managers/CommandManager.java deleted file mode 100644 index 04e15fd..0000000 --- a/src/main/java/me/nvus/xprison/tokens/managers/CommandManager.java +++ /dev/null @@ -1,224 +0,0 @@ -package me.nvus.xprison.tokens.managers; - -import me.nvus.xprison.tokens.XPrisonTokens; -import me.nvus.xprison.tokens.commands.*; -import me.nvus.xprison.tokens.utils.TokensConstants; -import me.nvus.xprison.utils.player.PlayerUtils; -import lombok.Getter; -import me.lucko.helper.Commands; -import me.lucko.helper.command.context.CommandContext; -import me.lucko.helper.cooldown.Cooldown; -import me.lucko.helper.cooldown.CooldownMap; -import me.lucko.helper.utils.Players; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -public class CommandManager { - - @Getter - private final XPrisonTokens plugin; - private final Set commands; - private CooldownMap tokensCommandCooldownMap; - - public CommandManager(XPrisonTokens plugin) { - this.plugin = plugin; - this.commands = new HashSet<>(); - this.tokensCommandCooldownMap = CooldownMap.create(Cooldown.of(plugin.getTokensConfig().getCommandCooldown(), TimeUnit.SECONDS)); - } - - - private boolean checkCommandCooldown(CommandSender sender) { - if (sender.hasPermission(TokensConstants.TOKENS_ADMIN_PERM)) { - return true; - } - if (!tokensCommandCooldownMap.test(sender)) { - PlayerUtils.sendMessage(sender, this.plugin.getTokensConfig().getMessage("cooldown").replace("%time%", String.format("%,d", this.tokensCommandCooldownMap.remainingTime(sender, TimeUnit.SECONDS)))); - return false; - } - return true; - } - - private void registerCommands() { - this.commands.clear(); - - this.registerCommand(new TokensGiveCommand(this)); - this.registerCommand(new TokensGiveCommand(this)); - this.registerCommand(new TokensPayCommand(this)); - this.registerCommand(new TokensRemoveCommand(this)); - this.registerCommand(new TokensSetCommand(this)); - this.registerCommand(new TokensWithdrawCommand(this)); - this.registerCommand(new TokensHelpCommand(this)); - - // /tokens, /token - Commands.create() - .tabHandler(this::createTabHandler) - .handler(c -> { - - if (!checkCommandCooldown(c.sender())) { - return; - } - - if (c.args().size() == 0 && c.sender() instanceof Player) { - this.plugin.getTokensManager().sendInfoMessage(c.sender(), (OfflinePlayer) c.sender(), true); - return; - } - - TokensCommand subCommand = this.getCommand(c.rawArg(0)); - if (subCommand != null) { - if (subCommand.canExecute(c.sender())) { - subCommand.execute(c.sender(), c.args().subList(1, c.args().size())); - } else { - PlayerUtils.sendMessage(c.sender(), this.plugin.getTokensConfig().getMessage("no_permission")); - } - } else { - OfflinePlayer target = Players.getOfflineNullable(c.rawArg(0)); - this.plugin.getTokensManager().sendInfoMessage(c.sender(), target, true); - } - }).registerAndBind(this.plugin.getCore(), this.plugin.getTokensConfig().getTokensCommandAliases()); - - // /tokenmessage - Commands.create() - .assertPlayer() - .handler(c -> { - this.plugin.getTokensManager().toggleTokenMessage(c.sender()); - }).registerAndBind(this.plugin.getCore(), "tokenmessage"); - - // /blockstop, / blocktop - Commands.create() - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getTokensManager().sendBlocksTop(c.sender()); - } - }) - .registerAndBind(this.plugin.getCore(), this.plugin.getTokensConfig().getBlocksTopCommandAliases()); - - // /blockstopweekly, /blockstopw - Commands.create() - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getTokensManager().sendBlocksTopWeekly(c.sender()); - } - }) - .registerAndBind(this.plugin.getCore(), "blockstopweekly", "blockstopw"); - - // /blockstopweeklyreset - Commands.create() - .assertPermission(TokensConstants.TOKENS_ADMIN_PERM, this.plugin.getTokensConfig().getMessage("no_permission")) - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getTokensManager().resetBlocksTopWeekly(c.sender()); - } - }) - .registerAndBind(this.plugin.getCore(), "blockstopweeklyreset"); - - // /tokenstop, /tokentop - Commands.create() - .handler(c -> { - if (c.args().size() == 0) { - this.plugin.getTokensManager().sendTokensTop(c.sender()); - } - }) - .registerAndBind(this.plugin.getCore(), this.plugin.getTokensConfig().getTokensTopCommandAliases()); - - // /blocks - Commands.create() - .handler(c -> { - if (!checkCommandCooldown(c.sender())) { - return; - } - - if (c.args().size() == 0) { - this.plugin.getTokensManager().sendInfoMessage(c.sender(), (OfflinePlayer) c.sender(), false); - } else if (c.args().size() == 1) { - OfflinePlayer target = Players.getOfflineNullable(c.rawArg(0)); - this.plugin.getTokensManager().sendInfoMessage(c.sender(), target, false); - } - }) - .registerAndBind(this.plugin.getCore(), "blocks"); - - // /blocksadmin, /blocksa - Commands.create() - .tabHandler(c -> Arrays.asList("add", "remove", "set")) - .assertPermission(TokensConstants.TOKENS_ADMIN_PERM, this.plugin.getTokensConfig().getMessage("no_permission")) - .handler(c -> { - if (c.args().size() == 3) { - - OfflinePlayer target = c.arg(1).parseOrFail(OfflinePlayer.class); - long amount = c.arg(2).parseOrFail(Long.class); - - switch (c.rawArg(0).toLowerCase()) { - case "add": - this.plugin.getTokensManager().addBlocksBroken(c.sender(), target, amount); - break; - case "remove": - this.plugin.getTokensManager().removeBlocksBroken(c.sender(), target, amount); - break; - case "set": - this.plugin.getTokensManager().setBlocksBroken(c.sender(), target, amount); - break; - default: - PlayerUtils.sendMessage(c.sender(), "&c/blocksadmin "); - break; - } - } else { - PlayerUtils.sendMessage(c.sender(), "&c/blocksadmin "); - } - }) - .registerAndBind(this.plugin.getCore(), "blocksadmin", "blocksa"); - } - - private List createTabHandler(CommandContext context) { - List returnList = this.commands.stream().map(TokensCommand::getName).collect(Collectors.toList()); - - TokensCommand subCommand = this.getCommand(context.rawArg(0)); - - if (subCommand != null) { - return subCommand.getTabComplete(context.args().subList(1, context.args().size())); - } - - return returnList; - } - - private void registerCommand(TokensCommand command) { - this.commands.add(command); - } - - private TokensCommand getCommand(String arg) { - for (TokensCommand command : this.commands) { - - if (command.getName().equalsIgnoreCase(arg)) { - return command; - } - - if (command.getAliases() == null) { - continue; - } - - for (String alias : command.getAliases()) { - if (alias.equalsIgnoreCase(arg)) { - return command; - } - } - } - return null; - } - - public Set getAll() { - return new HashSet<>(this.commands); - } - - public void reload() { - Map cooldownMap = this.tokensCommandCooldownMap.getAll(); - this.tokensCommandCooldownMap = CooldownMap.create(Cooldown.of(plugin.getTokensConfig().getCommandCooldown(), TimeUnit.SECONDS)); - cooldownMap.forEach((commandSender, cooldown) -> this.tokensCommandCooldownMap.put(commandSender, cooldown)); - } - - public void enable() { - this.registerCommands(); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/managers/TokensManager.java b/src/main/java/me/nvus/xprison/tokens/managers/TokensManager.java deleted file mode 100644 index 712461a..0000000 --- a/src/main/java/me/nvus/xprison/tokens/managers/TokensManager.java +++ /dev/null @@ -1,642 +0,0 @@ -package me.nvus.xprison.tokens.managers; - -import me.nvus.xprison.api.enums.LostCause; -import me.nvus.xprison.api.enums.ReceiveCause; -import me.nvus.xprison.tokens.XPrisonTokens; -import me.nvus.xprison.tokens.api.events.PlayerTokensLostEvent; -import me.nvus.xprison.tokens.api.events.PlayerTokensReceiveEvent; -import me.nvus.xprison.tokens.api.events.XPrisonBlockBreakEvent; -import me.nvus.xprison.tokens.model.BlockReward; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.nvus.xprison.utils.item.PrisonItem; -import me.nvus.xprison.utils.misc.NumberUtils; -import me.nvus.xprison.utils.player.PlayerUtils; -import me.lucko.helper.Events; -import me.lucko.helper.Schedulers; -import me.lucko.helper.time.Time; -import me.lucko.helper.utils.Players; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.block.Block; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.TimeUnit; - -public class TokensManager { - - private final XPrisonTokens plugin; - private final Map tokensCache; - private final Map blocksCache; - private final Map blocksCacheWeekly; - private final List tokenMessageOnPlayers; - - public TokensManager(XPrisonTokens plugin) { - this.plugin = plugin; - this.tokenMessageOnPlayers = new ArrayList<>(); - this.tokensCache = new ConcurrentHashMap<>(); - this.blocksCache = new ConcurrentHashMap<>(); - this.blocksCacheWeekly = new ConcurrentHashMap<>(); - } - - public void savePlayerData(Collection players, boolean removeFromCache, boolean async) { - if (async) { - Schedulers.async().run(() -> savePlayerDataLogic(players, removeFromCache)); - } else { - savePlayerDataLogic(players, removeFromCache); - } - } - - private void savePlayerDataLogic(Collection players, boolean removeFromCache) { - for (Player player : players) { - this.plugin.getTokensService().setTokens(player, tokensCache.getOrDefault(player.getUniqueId(), 0L)); - this.plugin.getBlocksService().setBlocks(player, blocksCache.getOrDefault(player.getUniqueId(), 0L)); - this.plugin.getBlocksService().setBlocksWeekly(player, blocksCacheWeekly.getOrDefault(player.getUniqueId(), 0L)); - - if (removeFromCache) { - this.tokensCache.remove(player.getUniqueId()); - this.blocksCache.remove(player.getUniqueId()); - this.blocksCacheWeekly.remove(player.getUniqueId()); - } - - this.plugin.getCore().debug(String.format("Saved player %s tokens & blocks broken to database.", player.getName()), this.plugin); - } - } - - public void savePlayerDataOnDisable() { - for (UUID uuid : blocksCache.keySet()) { - this.plugin.getBlocksService().setBlocks(Players.getOfflineNullable(uuid), blocksCache.get(uuid)); - } - for (UUID uuid : tokensCache.keySet()) { - this.plugin.getTokensService().setTokens(Players.getOfflineNullable(uuid), tokensCache.get(uuid)); - } - for (UUID uuid : blocksCache.keySet()) { - this.plugin.getBlocksService().setBlocksWeekly(Players.getOfflineNullable(uuid), blocksCacheWeekly.get(uuid)); - } - tokensCache.clear(); - blocksCache.clear(); - blocksCacheWeekly.clear(); - this.plugin.getCore().getLogger().info("Saved online player tokens, blocks broken and weekly blocks broken."); - - } - - private void loadPlayerDataOnEnable() { - loadPlayerData(Players.all()); - } - - public void loadPlayerData(Collection players) { - Schedulers.async().run(() -> { - for (Player player : players) { - - this.plugin.getTokensService().createTokens(player, this.plugin.getTokensConfig().getStartingTokens()); - this.plugin.getBlocksService().createBlocks(player); - this.plugin.getBlocksService().createBlocksWeekly(player); - - long playerTokens = this.plugin.getTokensService().getTokens(player); - long playerBlocks = this.plugin.getBlocksService().getPlayerBrokenBlocks(player); - long playerBlocksWeekly = this.plugin.getBlocksService().getPlayerBrokenBlocksWeekly(player); - - this.tokensCache.put(player.getUniqueId(), playerTokens); - this.blocksCache.put(player.getUniqueId(), playerBlocks); - this.blocksCacheWeekly.put(player.getUniqueId(), playerBlocksWeekly); - - this.plugin.getCore().debug(String.format("Loaded tokens and blocks broken of player %s from database", player.getName()), this.plugin); - } - }); - } - - public void setTokens(OfflinePlayer p, long newAmount, CommandSender executor) { - Schedulers.async().run(() -> { - if (!p.isOnline()) { - this.plugin.getTokensService().setTokens(p, newAmount); - } else { - tokensCache.put(p.getUniqueId(), newAmount); - } - PlayerUtils.sendMessage(executor, plugin.getTokensConfig().getMessage("admin_set_tokens").replace("%player%", p.getName()).replace("%tokens%", String.format("%,d", newAmount))); - }); - } - - public void giveTokens(OfflinePlayer p, long amount, CommandSender executor, ReceiveCause cause) { - long currentTokens = getPlayerTokens(p); - - this.plugin.getCore().debug("XPrisonPlayerTokenReceiveEvent :: Player Tokens :: " + currentTokens, this.plugin); - - long finalAmount = this.callTokensReceiveEvent(cause, p, amount); - - this.plugin.getCore().debug("XPrisonPlayerTokenReceiveEvent :: Final amount :: " + finalAmount, this.plugin); - - long newAmount; - - if (NumberUtils.wouldAdditionBeOverMaxLong(currentTokens, finalAmount)) { - newAmount = Long.MAX_VALUE; - } else { - newAmount = currentTokens + finalAmount; - } - - if (!p.isOnline()) { - this.plugin.getTokensService().setTokens(p, newAmount); - } else { - tokensCache.put(p.getUniqueId(), newAmount); - if (executor instanceof ConsoleCommandSender && !this.hasOffTokenMessages(p.getPlayer())) { - PlayerUtils.sendMessage(p.getPlayer(), plugin.getTokensConfig().getMessage("tokens_received_console").replace("%tokens%", String.format("%,d", finalAmount)).replace("%player%", executor == null ? "Console" : executor.getName())); - } else if (cause == ReceiveCause.MINING && !this.hasOffTokenMessages(p.getPlayer())) { - PlayerUtils.sendMessage(p.getPlayer(), this.plugin.getTokensConfig().getMessage("tokens_received_mining").replace("%amount%", String.format("%,d", finalAmount))); - } else if (cause == ReceiveCause.LUCKY_BLOCK && !this.hasOffTokenMessages(p.getPlayer())) { - PlayerUtils.sendMessage(p.getPlayer(), this.plugin.getTokensConfig().getMessage("lucky_block_mined").replace("%amount%", String.format("%,d", finalAmount))); - } - } - - this.plugin.getCore().debug("XPlayerTokenReceiveEvent :: Player tokens final :: " + this.tokensCache.getOrDefault(p.getUniqueId(), 0L), this.plugin); - - if (executor != null && !(executor instanceof ConsoleCommandSender)) { - PlayerUtils.sendMessage(executor, plugin.getTokensConfig().getMessage("admin_give_tokens").replace("%player%", p.getName()).replace("%tokens%", String.format("%,d", finalAmount))); - } - } - - private long callTokensReceiveEvent(ReceiveCause cause, OfflinePlayer p, long amount) { - PlayerTokensReceiveEvent event = new PlayerTokensReceiveEvent(cause, p, amount); - - Events.callSync(event); - - if (event.isCancelled()) { - return amount; - } - - return event.getAmount(); - } - - public void redeemTokens(Player p, ItemStack item, boolean shiftClick, boolean offhand) { - final Long tokenAmount = new PrisonItem(item).getTokens(); - if (tokenAmount == null) { - PlayerUtils.sendMessage(p, plugin.getTokensConfig().getMessage("not_token_item")); - return; - } - int itemAmount = item.getAmount(); - if (shiftClick) { - if (offhand) { - p.getInventory().setItemInOffHand(null); - } else { - p.setItemInHand(null); - } - this.giveTokens(p, tokenAmount * itemAmount, null, ReceiveCause.REDEEM); - PlayerUtils.sendMessage(p, plugin.getTokensConfig().getMessage("tokens_redeem").replace("%tokens%", String.format("%,d", tokenAmount * itemAmount))); - } else { - this.giveTokens(p, tokenAmount, null, ReceiveCause.REDEEM); - if (item.getAmount() == 1) { - if (offhand) { - p.getInventory().setItemInOffHand(null); - } else { - p.setItemInHand(null); - } - } else { - item.setAmount(item.getAmount() - 1); - } - PlayerUtils.sendMessage(p, plugin.getTokensConfig().getMessage("tokens_redeem").replace("%tokens%", String.format("%,d", tokenAmount))); - } - } - - public void payTokens(Player executor, long amount, OfflinePlayer target) { - Schedulers.async().run(() -> { - if (getPlayerTokens(executor) >= amount) { - this.removeTokens(executor, amount, null, LostCause.PAY); - this.giveTokens(target, amount, null, ReceiveCause.PAY); - PlayerUtils.sendMessage(executor, plugin.getTokensConfig().getMessage("tokens_send").replace("%player%", target.getName()).replace("%tokens%", String.format("%,d", amount))); - if (target.isOnline()) { - PlayerUtils.sendMessage((CommandSender) target, plugin.getTokensConfig().getMessage("tokens_received").replace("%player%", executor.getName()).replace("%tokens%", String.format("%,d", amount))); - } - } else { - PlayerUtils.sendMessage(executor, plugin.getTokensConfig().getMessage("not_enough_tokens")); - } - }); - } - - public void withdrawTokens(Player executor, long amount, int value) { - Schedulers.async().run(() -> { - long totalAmount = amount * value; - - if (this.getPlayerTokens(executor) < totalAmount) { - PlayerUtils.sendMessage(executor, plugin.getTokensConfig().getMessage("not_enough_tokens")); - return; - } - - removeTokens(executor, totalAmount, null, LostCause.WITHDRAW); - - ItemStack item = createTokenItem(amount, value); - Collection notFit = executor.getInventory().addItem(item).values(); - - if (!notFit.isEmpty()) { - notFit.forEach(itemStack -> { - this.giveTokens(executor, amount * item.getAmount(), null, ReceiveCause.REDEEM); - }); - } - - PlayerUtils.sendMessage(executor, plugin.getTokensConfig().getMessage("withdraw_successful").replace("%amount%", String.format("%,d", amount)).replace("%value%", String.format("%,d", value))); - }); - } - - public synchronized long getPlayerTokens(OfflinePlayer p) { - if (!p.isOnline()) { - return this.plugin.getTokensManager().getPlayerTokens(p); - } else { - return tokensCache.getOrDefault(p.getUniqueId(), (long) 0); - } - } - - public synchronized long getPlayerBrokenBlocks(OfflinePlayer p) { - if (!p.isOnline()) { - return this.plugin.getBlocksService().getPlayerBrokenBlocks(p); - } else { - return blocksCache.getOrDefault(p.getUniqueId(), (long) 0); - } - } - - public synchronized long getPlayerBrokenBlocksWeekly(OfflinePlayer p) { - if (!p.isOnline()) { - return this.plugin.getBlocksService().getPlayerBrokenBlocksWeekly(p); - } else { - return blocksCacheWeekly.getOrDefault(p.getUniqueId(), (long) 0); - } - } - - public void removeTokens(OfflinePlayer p, long amount, CommandSender executor, LostCause cause) { - long currentTokens = getPlayerTokens(p); - long finalTokens = currentTokens - amount; - - if (finalTokens < 0) { - finalTokens = 0; - } - - this.callTokensLostEvent(cause, p, amount); - - if (!p.isOnline()) { - this.plugin.getTokensService().setTokens(p, amount); - } else { - tokensCache.put(p.getUniqueId(), finalTokens); - } - if (executor != null) { - PlayerUtils.sendMessage(executor, plugin.getTokensConfig().getMessage("admin_remove_tokens").replace("%player%", p.getName()).replace("%tokens%", String.format("%,d", amount))); - } - } - - private void callTokensLostEvent(LostCause cause, OfflinePlayer p, long amount) { - PlayerTokensLostEvent event = new PlayerTokensLostEvent(cause, p, amount); - Events.callSync(event); - } - - private ItemStack createTokenItem(long amount, int value) { - ItemStack item = ItemStackBuilder.of( - this.plugin.getTokensConfig().getTokenItem().clone()) - .amount(value) - .name(this.plugin.getTokensConfig().getTokenItemDisplayName().replace("%amount%", String.format("%,d", amount)).replace("%tokens%", String.format("%,d", amount))) - .lore(this.plugin.getTokensConfig().getTokenItemLore()) - .enchant(Enchantment.PROTECTION_ENVIRONMENTAL) - .flag(ItemFlag.HIDE_ENCHANTS) - .build(); - final PrisonItem prisonItem = new PrisonItem(item); - prisonItem.setTokens(amount); - prisonItem.load(); - return item; - } - - public void sendInfoMessage(CommandSender sender, OfflinePlayer target, boolean tokens) { - Schedulers.async().run(() -> { - if (sender == target) { - if (tokens) { - PlayerUtils.sendMessage(sender, plugin.getTokensConfig().getMessage("your_tokens").replace("%tokens%", String.format("%,d", this.getPlayerTokens(target)))); - } else { - PlayerUtils.sendMessage(sender, plugin.getTokensConfig().getMessage("your_blocks").replace("%blocks%", String.format("%,d", this.getPlayerBrokenBlocks(target)))); - } - } else { - if (tokens) { - PlayerUtils.sendMessage(sender, plugin.getTokensConfig().getMessage("other_tokens").replace("%tokens%", String.format("%,d", this.getPlayerTokens(target))).replace("%player%", target.getName())); - } else { - PlayerUtils.sendMessage(sender, plugin.getTokensConfig().getMessage("other_blocks").replace("%blocks%", String.format("%,d", this.getPlayerBrokenBlocks(target))).replace("%player%", target.getName())); - } - } - }); - } - - - public void addBlocksBroken(CommandSender sender, OfflinePlayer player, long amount) { - - if (amount <= 0) { - if (sender != null) { - PlayerUtils.sendMessage(sender, "&cPlease specify amount greater than 0!"); - } - return; - } - - long finalAmount = amount; - - Schedulers.async().run(() -> { - - long currentBroken = getPlayerBrokenBlocks(player); - long currentBrokenWeekly = getPlayerBrokenBlocksWeekly(player); - - BlockReward nextReward = this.getNextBlockReward(player); - - if (!player.isOnline()) { - this.plugin.getBlocksService().setBlocks(player, currentBroken + finalAmount); - this.plugin.getBlocksService().setBlocksWeekly(player, currentBrokenWeekly + finalAmount); - } else { - blocksCache.put(player.getUniqueId(), currentBroken + finalAmount); - blocksCacheWeekly.put(player.getUniqueId(), currentBrokenWeekly + finalAmount); - - while (nextReward != null && nextReward.getBlocksRequired() <= blocksCache.get(player.getUniqueId())) { - nextReward.giveTo((Player) player); - nextReward = this.getNextBlockReward(nextReward); - } - } - - if (sender != null && !(sender instanceof ConsoleCommandSender)) { - PlayerUtils.sendMessage(sender, plugin.getTokensConfig().getMessage("admin_give_blocks").replace("%player%", player.getName()).replace("%blocks%", String.format("%,d", finalAmount))); - } - }); - } - - public void addBlocksBroken(OfflinePlayer player, List blocks) { - - if (player.isOnline()) { - XPrisonBlockBreakEvent event = new XPrisonBlockBreakEvent((Player) player, blocks); - - Events.call(event); - - if (event.isCancelled()) { - return; - } - - blocks = event.getBlocks(); - } - - long finalAmount = blocks.size(); - - Schedulers.async().run(() -> { - - long currentBroken = getPlayerBrokenBlocks(player); - long currentBrokenWeekly = getPlayerBrokenBlocksWeekly(player); - - BlockReward nextReward = this.getNextBlockReward(player); - - if (!player.isOnline()) { - this.plugin.getBlocksService().setBlocks(player, currentBroken + finalAmount); - this.plugin.getBlocksService().setBlocksWeekly(player, currentBrokenWeekly + finalAmount); - } else { - blocksCache.put(player.getUniqueId(), currentBroken + finalAmount); - blocksCacheWeekly.put(player.getUniqueId(), currentBrokenWeekly + finalAmount); - - while (nextReward != null && nextReward.getBlocksRequired() <= blocksCache.get(player.getUniqueId())) { - nextReward.giveTo((Player) player); - nextReward = this.getNextBlockReward(nextReward); - } - } - }); - } - - private BlockReward getNextBlockReward(BlockReward oldReward) { - boolean next = false; - for (long l : this.plugin.getBlockRewardsConfig().getBlockRewards().keySet()) { - if (next) { - return this.plugin.getBlockRewardsConfig().getBlockRewards().get(l); - } - if (l == oldReward.getBlocksRequired()) { - next = true; - } - } - - return null; - } - - public void removeBlocksBroken(CommandSender sender, OfflinePlayer player, long amount) { - - if (amount <= 0) { - PlayerUtils.sendMessage(sender, "&cPlease specify amount greater than 0!"); - return; - } - - Schedulers.async().run(() -> { - - long currentBroken = getPlayerBrokenBlocks(player); - long currentBrokenWeekly = getPlayerBrokenBlocksWeekly(player); - - if (!player.isOnline()) { - this.plugin.getBlocksService().setBlocks(player, currentBroken - amount); - this.plugin.getBlocksService().setBlocksWeekly(player, currentBrokenWeekly - amount); - } else { - blocksCache.put(player.getUniqueId(), currentBroken - amount); - blocksCacheWeekly.put(player.getUniqueId(), currentBrokenWeekly - amount); - } - - PlayerUtils.sendMessage(sender, plugin.getTokensConfig().getMessage("admin_remove_blocks").replace("%player%", player.getName()).replace("%blocks%", String.format("%,d", amount))); - - }); - } - - public void setBlocksBroken(CommandSender sender, OfflinePlayer player, long amount) { - - if (amount < 0) { - PlayerUtils.sendMessage(sender, "&cPlease specify positive amount!"); - return; - } - - Schedulers.async().run(() -> { - BlockReward nextReward = this.getNextBlockReward(player); - - if (!player.isOnline()) { - - this.plugin.getBlocksService().setBlocks(player, amount); - this.plugin.getBlocksService().setBlocksWeekly(player, amount); - } else { - blocksCache.put(player.getUniqueId(), amount); - blocksCacheWeekly.put(player.getUniqueId(), amount); - - while (nextReward != null && nextReward.getBlocksRequired() <= blocksCache.get(player.getUniqueId())) { - nextReward.giveTo((Player) player); - nextReward = this.getNextBlockReward(nextReward); - } - } - - PlayerUtils.sendMessage(sender, plugin.getTokensConfig().getMessage("admin_set_blocks").replace("%player%", player.getName()).replace("%blocks%", String.format("%,d", amount))); - }); - } - - public void sendTokensTop(CommandSender sender) { - - List format = this.plugin.getTokensConfig().getTokensTopFormat(); - - Schedulers.async().run(() -> { - Map topTokens = this.plugin.getTokensService().getTopTokens(this.plugin.getTokensConfig().getTopPlayersAmount()); - for (String s : format) { - if (s.startsWith("{FOR_EACH_PLAYER}")) { - String rawContent = s.replace("{FOR_EACH_PLAYER} ", ""); - for (int i = 0; i < 10; i++) { - try { - UUID uuid = (UUID) topTokens.keySet().toArray()[i]; - OfflinePlayer player = Players.getOfflineNullable(uuid); - String name; - if (player.getName() == null) { - name = "Unknown Player"; - } else { - name = player.getName(); - } - long tokens = topTokens.get(uuid); - PlayerUtils.sendMessage(sender, rawContent.replace("%position%", String.valueOf(i + 1)).replace("%player%", name).replace("%tokens%", String.format("%,d", tokens))); - } catch (Exception e) { - break; - } - } - } else { - PlayerUtils.sendMessage(sender, s); - } - } - }); - } - - public void sendBlocksTop(CommandSender sender) { - List format = this.plugin.getTokensConfig().getBlocksTopFormat(); - Schedulers.async().run(() -> { - Map topBlocks = this.plugin.getBlocksService().getTopBlocks(this.plugin.getTokensConfig().getTopPlayersAmount()); - for (String s : format) { - if (s.startsWith("{FOR_EACH_PLAYER}")) { - sendBlocksTop(sender, s, topBlocks); - } else { - PlayerUtils.sendMessage(sender, s); - } - } - }); - } - - private void sendBlocksTop(CommandSender sender, String s, Map top) { - String rawContent = s.replace("{FOR_EACH_PLAYER} ", ""); - for (int i = 0; i < 10; i++) { - try { - UUID uuid = (UUID) top.keySet().toArray()[i]; - OfflinePlayer player = Players.getOfflineNullable(uuid); - String name; - if (player.getName() == null) { - name = "Unknown Player"; - } else { - name = player.getName(); - } - long blocks = top.get(uuid); - PlayerUtils.sendMessage(sender, rawContent.replace("%position%", String.valueOf(i + 1)).replace("%player%", name).replace("%blocks%", String.format("%,d", blocks))); - } catch (Exception e) { - break; - } - } - } - - public void sendBlocksTopWeekly(CommandSender sender) { - List format = this.plugin.getTokensConfig().getBlocksTopFormatWeekly(); - - Schedulers.async().run(() -> { - Map topBlocksWeekly = this.plugin.getBlocksService().getTopBlocksWeekly(this.plugin.getTokensConfig().getTopPlayersAmount()); - for (String s : format) { - if (s.startsWith("{FOR_EACH_PLAYER}")) { - sendBlocksTop(sender, s, topBlocksWeekly); - } else { - PlayerUtils.sendMessage(sender, s); - } - } - }); - } - - public BlockReward getNextBlockReward(OfflinePlayer p) { - long blocksBroken = this.getPlayerBrokenBlocks(p); - for (long l : this.plugin.getBlockRewardsConfig().getBlockRewards().keySet()) { - if (l > blocksBroken) { - return this.plugin.getBlockRewardsConfig().getBlockRewards().get(l); - } - } - return null; - } - - public void resetBlocksTopWeekly(CommandSender sender) { - PlayerUtils.sendMessage(sender, "&7&oStarting to reset BlocksTop - Weekly. This may take a while..."); - this.plugin.getTokensConfig().setNextResetWeekly(Time.nowMillis() + TimeUnit.DAYS.toMillis(7)); - this.plugin.getBlocksService().resetBlocksWeekly(); - PlayerUtils.sendMessage(sender, "&aBlocksTop - Weekly - Reset!"); - } - - private void saveWeeklyReset() { - this.plugin.getTokensConfig().getYamlConfig().set("next-reset-weekly", this.plugin.getTokensConfig().getNextResetWeekly()); - this.plugin.getTokensConfig().save(); - } - - public void toggleTokenMessage(Player p) { - if (this.tokenMessageOnPlayers.contains(p.getUniqueId())) { - PlayerUtils.sendMessage(p, plugin.getTokensConfig().getMessage("token_message_disabled")); - this.tokenMessageOnPlayers.remove(p.getUniqueId()); - } else { - PlayerUtils.sendMessage(p, plugin.getTokensConfig().getMessage("token_message_enabled")); - this.tokenMessageOnPlayers.add(p.getUniqueId()); - } - } - - public void reload() { - - } - - public void addPlayerIntoTokenMessageOnPlayers(Player player) { - this.tokenMessageOnPlayers.add(player.getUniqueId()); - } - - public boolean hasOffTokenMessages(Player p) { - return !this.tokenMessageOnPlayers.contains(p.getUniqueId()); - } - - public void disable() { - this.saveWeeklyReset(); - this.savePlayerDataOnDisable(); - } - - - public void handleBlockBreak(Player p, List blocks, boolean countBlocksBroken) { - - long startTime = System.currentTimeMillis(); - - if (countBlocksBroken) { - this.addBlocksBroken(p, blocks); - } - - //Lucky block check - blocks.forEach(block -> { - List rewards = this.plugin.getTokensConfig().getLuckyBlockReward(block.getType()); - for (String s : rewards) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s.replace("%player%", p.getName())); - } - }); - - long totalAmount = 0; - for (int i = 0; i < blocks.size(); i++) { - double random = ThreadLocalRandom.current().nextDouble(100); - - if (this.plugin.getTokensConfig().getChance() >= random) { - long randAmount = this.plugin.getTokensConfig().getMinAmount() == this.plugin.getTokensConfig().getMaxAmount() ? this.plugin.getTokensConfig().getMinAmount() : ThreadLocalRandom.current().nextLong(this.plugin.getTokensConfig().getMinAmount(), this.plugin.getTokensConfig().getMaxAmount()); - totalAmount += randAmount; - } - } - if (totalAmount > 0) { - this.giveTokens(p, totalAmount, null, ReceiveCause.MINING); - } - this.plugin.getCore().debug("XPrisonTokens::handleBlockBreak >> Took " + (System.currentTimeMillis() - startTime) + " ms.", this.plugin); - } - - public void enable() { - if (this.checkBlocksTopWeeklyReset()) { - resetBlocksTopWeekly(Bukkit.getConsoleSender()); - } - this.loadPlayerDataOnEnable(); - } - - private boolean checkBlocksTopWeeklyReset() { - long nextResetWeeklyMillis = this.plugin.getTokensConfig().getNextResetWeekly(); - return Time.nowMillis() >= nextResetWeeklyMillis; - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/model/BlockReward.java b/src/main/java/me/nvus/xprison/tokens/model/BlockReward.java deleted file mode 100644 index f7dacab..0000000 --- a/src/main/java/me/nvus/xprison/tokens/model/BlockReward.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.nvus.xprison.tokens.model; - -import me.nvus.xprison.utils.player.PlayerUtils; -import lombok.AllArgsConstructor; -import lombok.Getter; -import me.lucko.helper.Schedulers; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import java.util.List; - -@AllArgsConstructor -@Getter -public class BlockReward { - - private final long blocksRequired; - private final List commandsToRun; - private final String message; - - public void giveTo(Player p) { - - if (!Bukkit.isPrimaryThread()) { - Schedulers.sync().run(() -> executeCommands(p)); - } else { - executeCommands(p); - } - - PlayerUtils.sendMessage(p, this.message); - } - - private void executeCommands(Player p) { - for (String s : this.commandsToRun) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), s.replace("%player%", p.getName())); - } - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/tokens/repo/BlocksRepository.java b/src/main/java/me/nvus/xprison/tokens/repo/BlocksRepository.java deleted file mode 100644 index bf4b4ed..0000000 --- a/src/main/java/me/nvus/xprison/tokens/repo/BlocksRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.nvus.xprison.tokens.repo; - -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public interface BlocksRepository { - - void resetBlocksWeekly(); - - void updateBlocks(OfflinePlayer player, long newAmount); - - void updateBlocksWeekly(OfflinePlayer player, long newAmount); - - long getPlayerBrokenBlocksWeekly(OfflinePlayer player); - - void addIntoBlocks(OfflinePlayer player); - - void addIntoBlocksWeekly(OfflinePlayer player); - - long getPlayerBrokenBlocks(OfflinePlayer player); - - Map getTopBlocksWeekly(int amountOfRecords); - - Map getTopBlocks(int amountOfRecords); - - void createTables(); - - void clearTableData(); -} diff --git a/src/main/java/me/nvus/xprison/tokens/repo/TokensRepository.java b/src/main/java/me/nvus/xprison/tokens/repo/TokensRepository.java deleted file mode 100644 index 586ada3..0000000 --- a/src/main/java/me/nvus/xprison/tokens/repo/TokensRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.nvus.xprison.tokens.repo; - -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public interface TokensRepository { - - long getPlayerTokens(OfflinePlayer player); - - void updateTokens(OfflinePlayer player, long newAmount); - - Map getTopTokens(int amountOfRecords); - - void addIntoTokens(OfflinePlayer player, long startingTokens); - - void createTables(); - - void clearTableData(); -} diff --git a/src/main/java/me/nvus/xprison/tokens/repo/impl/BlocksRepositoryImpl.java b/src/main/java/me/nvus/xprison/tokens/repo/impl/BlocksRepositoryImpl.java deleted file mode 100644 index 4ed3e30..0000000 --- a/src/main/java/me/nvus/xprison/tokens/repo/impl/BlocksRepositoryImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package me.nvus.xprison.tokens.repo.impl; - -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.database.model.SQLDatabaseType; -import me.nvus.xprison.tokens.repo.BlocksRepository; -import org.bukkit.OfflinePlayer; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; - -public class BlocksRepositoryImpl implements BlocksRepository { - - private static final String BLOCKS_UUID_COLNAME = "UUID"; - private static final String BLOCKS_BLOCKS_COLNAME = "Blocks"; - private static final String TABLE_NAME_BLOCKS = "UltraPrison_BlocksBroken"; - private static final String TABLE_NAME_BLOCKS_WEEKLY = "UltraPrison_BlocksBrokenWeekly"; - - private final SQLDatabase database; - - public BlocksRepositoryImpl(SQLDatabase database) { - this.database = database; - } - - @Override - public void resetBlocksWeekly() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME_BLOCKS_WEEKLY); - } - - @Override - public long getPlayerBrokenBlocks(OfflinePlayer player) { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT * FROM " + TABLE_NAME_BLOCKS + " WHERE " + BLOCKS_UUID_COLNAME + "=?")) { - statement.setString(1, player.getUniqueId().toString()); - try (ResultSet set = statement.executeQuery()) { - if (set.next()) { - return set.getLong(BLOCKS_BLOCKS_COLNAME); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; - } - - @Override - public long getPlayerBrokenBlocksWeekly(OfflinePlayer player) { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT * FROM " + TABLE_NAME_BLOCKS_WEEKLY + " WHERE " + BLOCKS_UUID_COLNAME + "=?")) { - statement.setString(1, player.getUniqueId().toString()); - try (ResultSet set = statement.executeQuery()) { - if (set.next()) { - return set.getLong(BLOCKS_BLOCKS_COLNAME); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; - } - - @Override - public void updateBlocks(OfflinePlayer player, long newAmount) { - this.database.executeSql("UPDATE " + TABLE_NAME_BLOCKS + " SET " + BLOCKS_BLOCKS_COLNAME + "=? WHERE " + BLOCKS_UUID_COLNAME + "=?", newAmount, player.getUniqueId().toString()); - } - - @Override - public void updateBlocksWeekly(OfflinePlayer player, long newAmount) { - this.database.executeSql("UPDATE " + TABLE_NAME_BLOCKS_WEEKLY + " SET " + BLOCKS_BLOCKS_COLNAME + "=? WHERE " + BLOCKS_UUID_COLNAME + "=?", newAmount, player.getUniqueId().toString()); - } - - @Override - public void addIntoBlocks(OfflinePlayer player) { - String sql = database.getDatabaseType() == SQLDatabaseType.SQLITE ? "INSERT OR IGNORE INTO " + TABLE_NAME_BLOCKS + " VALUES(?,?)" : "INSERT IGNORE INTO " + TABLE_NAME_BLOCKS + " VALUES(?,?)"; - this.database.executeSql(sql, player.getUniqueId().toString(), 0); - } - - @Override - public void addIntoBlocksWeekly(OfflinePlayer player) { - String sql = database.getDatabaseType() == SQLDatabaseType.SQLITE ? "INSERT OR IGNORE INTO " + TABLE_NAME_BLOCKS_WEEKLY + " VALUES(?,?)" : "INSERT IGNORE INTO " + TABLE_NAME_BLOCKS_WEEKLY + " VALUES(?,?)"; - this.database.executeSql(sql, player.getUniqueId().toString(), 0); - } - - @Override - public Map getTopBlocksWeekly(int amountOfRecords) { - Map topBlocksWeekly = new LinkedHashMap<>(); - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT " + BLOCKS_UUID_COLNAME + "," + BLOCKS_BLOCKS_COLNAME + " FROM " + TABLE_NAME_BLOCKS_WEEKLY + " ORDER BY " + BLOCKS_BLOCKS_COLNAME + " DESC LIMIT " + amountOfRecords); ResultSet set = statement.executeQuery()) { - while (set.next()) { - topBlocksWeekly.put(UUID.fromString(set.getString(BLOCKS_UUID_COLNAME)), set.getLong(BLOCKS_BLOCKS_COLNAME)); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return topBlocksWeekly; - } - - @Override - public Map getTopBlocks(int amountOfRecords) { - Map topBlocks = new LinkedHashMap<>(); - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT " + BLOCKS_UUID_COLNAME + "," + BLOCKS_BLOCKS_COLNAME + " FROM " + TABLE_NAME_BLOCKS + " ORDER BY " + BLOCKS_BLOCKS_COLNAME + " DESC LIMIT " + amountOfRecords); ResultSet set = statement.executeQuery()) { - while (set.next()) { - topBlocks.put(UUID.fromString(set.getString(BLOCKS_UUID_COLNAME)), set.getLong(BLOCKS_BLOCKS_COLNAME)); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return topBlocks; - } - - @Override - public void createTables() { - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME_BLOCKS + "(UUID varchar(36) NOT NULL UNIQUE, Blocks bigint, primary key (UUID))"); - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME_BLOCKS_WEEKLY + "(UUID varchar(36) NOT NULL UNIQUE, Blocks bigint, primary key (UUID))"); - } - - @Override - public void clearTableData() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME_BLOCKS); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/repo/impl/TokensRepositoryImpl.java b/src/main/java/me/nvus/xprison/tokens/repo/impl/TokensRepositoryImpl.java deleted file mode 100644 index 34545f3..0000000 --- a/src/main/java/me/nvus/xprison/tokens/repo/impl/TokensRepositoryImpl.java +++ /dev/null @@ -1,77 +0,0 @@ -package me.nvus.xprison.tokens.repo.impl; - -import me.nvus.xprison.database.SQLDatabase; -import me.nvus.xprison.database.model.SQLDatabaseType; -import me.nvus.xprison.tokens.repo.TokensRepository; -import org.bukkit.OfflinePlayer; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; - -public class TokensRepositoryImpl implements TokensRepository { - - private static final String TABLE_NAME_TOKENS = "UltraPrison_Tokens"; - - private static final String TOKENS_UUID_COLNAME = "UUID"; - private static final String TOKENS_TOKENS_COLNAME = "Tokens"; - - private final SQLDatabase database; - - public TokensRepositoryImpl(SQLDatabase database) { - this.database = database; - } - - @Override - public long getPlayerTokens(OfflinePlayer p) { - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con,"SELECT * FROM " + TABLE_NAME_TOKENS + " WHERE " + TOKENS_UUID_COLNAME + "=?")) { - statement.setString(1, p.getUniqueId().toString()); - try (ResultSet set = statement.executeQuery()) { - if (set.next()) { - return set.getLong(TOKENS_TOKENS_COLNAME); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; - } - - @Override - public void updateTokens(OfflinePlayer p, long amount) { - this.database.executeSql("UPDATE " + TABLE_NAME_TOKENS + " SET " + TOKENS_TOKENS_COLNAME + "=? WHERE " + TOKENS_UUID_COLNAME + "=?", amount, p.getUniqueId().toString()); - } - - @Override - public Map getTopTokens(int amountOfRecords) { - Map top10Tokens = new LinkedHashMap<>(); - try (Connection con = this.database.getConnection(); PreparedStatement statement = database.prepareStatement(con, "SELECT " + TOKENS_UUID_COLNAME + "," + TOKENS_TOKENS_COLNAME + " FROM " + TABLE_NAME_TOKENS + " ORDER BY " + TOKENS_TOKENS_COLNAME + " DESC LIMIT " + amountOfRecords); ResultSet set = statement.executeQuery()) { - while (set.next()) { - top10Tokens.put(UUID.fromString(set.getString(TOKENS_UUID_COLNAME)), set.getLong(TOKENS_TOKENS_COLNAME)); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return top10Tokens; - } - - @Override - public void addIntoTokens(OfflinePlayer player, long startingTokens) { - String sql = database.getDatabaseType() == SQLDatabaseType.SQLITE ? "INSERT OR IGNORE INTO " + TABLE_NAME_TOKENS + " VALUES(?,?)" : "INSERT IGNORE INTO " + TABLE_NAME_TOKENS + " VALUES(?,?)"; - this.database.executeSql(sql, player.getUniqueId().toString(), startingTokens); - } - - @Override - public void createTables() { - this.database.executeSql("CREATE TABLE IF NOT EXISTS " + TABLE_NAME_TOKENS + "(UUID varchar(36) NOT NULL UNIQUE, Tokens bigint, primary key (UUID))"); - } - - @Override - public void clearTableData() { - this.database.executeSqlAsync("DELETE FROM " + TABLE_NAME_TOKENS); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/service/BlocksService.java b/src/main/java/me/nvus/xprison/tokens/service/BlocksService.java deleted file mode 100644 index 4ee6372..0000000 --- a/src/main/java/me/nvus/xprison/tokens/service/BlocksService.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.nvus.xprison.tokens.service; - -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public interface BlocksService { - - void resetBlocksWeekly(); - - void setBlocks(OfflinePlayer player, long newAmount); - - void setBlocksWeekly(OfflinePlayer player, long newAmount); - - long getPlayerBrokenBlocksWeekly(OfflinePlayer player); - - void createBlocks(OfflinePlayer player); - - void createBlocksWeekly(OfflinePlayer player); - - long getPlayerBrokenBlocks(OfflinePlayer player); - - Map getTopBlocksWeekly(int amountOfRecords); - - Map getTopBlocks(int amountOfRecords); -} diff --git a/src/main/java/me/nvus/xprison/tokens/service/TokensService.java b/src/main/java/me/nvus/xprison/tokens/service/TokensService.java deleted file mode 100644 index 8006ad6..0000000 --- a/src/main/java/me/nvus/xprison/tokens/service/TokensService.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.nvus.xprison.tokens.service; - -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public interface TokensService { - - long getTokens(OfflinePlayer player); - - void setTokens(OfflinePlayer player, long newAmount); - - Map getTopTokens(int amountOfRecords); - - void createTokens(OfflinePlayer player, long startingTokens); -} diff --git a/src/main/java/me/nvus/xprison/tokens/service/impl/BlocksServiceImpl.java b/src/main/java/me/nvus/xprison/tokens/service/impl/BlocksServiceImpl.java deleted file mode 100644 index ae81abd..0000000 --- a/src/main/java/me/nvus/xprison/tokens/service/impl/BlocksServiceImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.nvus.xprison.tokens.service.impl; - -import me.nvus.xprison.tokens.repo.BlocksRepository; -import me.nvus.xprison.tokens.service.BlocksService; -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public class BlocksServiceImpl implements BlocksService { - - private final BlocksRepository repository; - - public BlocksServiceImpl(BlocksRepository repository) { - this.repository = repository; - } - - @Override - public void resetBlocksWeekly() { - repository.resetBlocksWeekly(); - } - - @Override - public void setBlocks(OfflinePlayer player, long newAmount) { - repository.updateBlocks(player, newAmount); - } - - @Override - public void setBlocksWeekly(OfflinePlayer player, long newAmount) { - repository.updateBlocksWeekly(player, newAmount); - } - - @Override - public long getPlayerBrokenBlocksWeekly(OfflinePlayer player) { - return repository.getPlayerBrokenBlocksWeekly(player); - } - - @Override - public void createBlocks(OfflinePlayer player) { - repository.addIntoBlocks(player); - } - - @Override - public void createBlocksWeekly(OfflinePlayer player) { - repository.addIntoBlocksWeekly(player); - } - - @Override - public long getPlayerBrokenBlocks(OfflinePlayer player) { - return repository.getPlayerBrokenBlocks(player); - } - - @Override - public Map getTopBlocksWeekly(int amountOfRecords) { - return repository.getTopBlocksWeekly(amountOfRecords); - } - - @Override - public Map getTopBlocks(int amountOfRecords) { - return repository.getTopBlocks(amountOfRecords); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/service/impl/TokensServiceImpl.java b/src/main/java/me/nvus/xprison/tokens/service/impl/TokensServiceImpl.java deleted file mode 100644 index ce77a12..0000000 --- a/src/main/java/me/nvus/xprison/tokens/service/impl/TokensServiceImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.nvus.xprison.tokens.service.impl; - -import me.nvus.xprison.tokens.repo.TokensRepository; -import me.nvus.xprison.tokens.service.TokensService; -import org.bukkit.OfflinePlayer; - -import java.util.Map; -import java.util.UUID; - -public class TokensServiceImpl implements TokensService { - - private final TokensRepository repository; - private TokensRepository tokensRepository; - - public TokensServiceImpl(TokensRepository repository) { - - this.repository = repository; - } - - @Override - public long getTokens(OfflinePlayer player) { - return repository.getPlayerTokens(player); - } - - @Override - public void setTokens(OfflinePlayer player, long newAmount) { - repository.updateTokens(player, newAmount); - } - - @Override - public Map getTopTokens(int amountOfRecords) { - return repository.getTopTokens(amountOfRecords); - } - - @Override - public void createTokens(OfflinePlayer player, long startingTokens) { - repository.addIntoTokens(player, startingTokens); - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/task/SavePlayerDataTask.java b/src/main/java/me/nvus/xprison/tokens/task/SavePlayerDataTask.java deleted file mode 100644 index c8bba1b..0000000 --- a/src/main/java/me/nvus/xprison/tokens/task/SavePlayerDataTask.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.nvus.xprison.tokens.task; - -import me.nvus.xprison.tokens.XPrisonTokens; -import me.lucko.helper.Schedulers; -import me.lucko.helper.scheduler.Task; -import me.lucko.helper.utils.Players; - -import java.util.concurrent.TimeUnit; - - -public final class SavePlayerDataTask implements Runnable { - - private final XPrisonTokens plugin; - private Task task; - - public SavePlayerDataTask(XPrisonTokens plugin) { - this.plugin = plugin; - } - - @Override - public void run() { - this.plugin.getTokensManager().savePlayerData(Players.all(), false, true); - } - - public void start() { - stop(); - this.task = Schedulers.async().runRepeating(this, 30, TimeUnit.SECONDS, this.plugin.getTokensConfig().getSavePlayerDataInterval(), TimeUnit.MINUTES); - } - - public void stop() { - if (task != null) { - task.stop(); - } - } -} diff --git a/src/main/java/me/nvus/xprison/tokens/utils/TokensConstants.java b/src/main/java/me/nvus/xprison/tokens/utils/TokensConstants.java deleted file mode 100644 index e7ce8eb..0000000 --- a/src/main/java/me/nvus/xprison/tokens/utils/TokensConstants.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.nvus.xprison.tokens.utils; - -public final class TokensConstants { - - public static final String TOKENS_ADMIN_PERM = "xprison.tokens.admin"; - - private TokensConstants() { - throw new UnsupportedOperationException("Cannot instantiate."); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/Constants.java b/src/main/java/me/nvus/xprison/utils/Constants.java deleted file mode 100644 index 8cee6fe..0000000 --- a/src/main/java/me/nvus/xprison/utils/Constants.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.nvus.xprison.utils; - -public class Constants { - - public static final String DISCORD_LINK = "https://discord.com/invite/9bRjBxKC6y"; - public static final int METRICS_SERVICE_ID = 10520; - public static final String ENCHANTS_WG_FLAG_NAME = "upc-enchants"; - - - private Constants() { - throw new UnsupportedOperationException("Cannot instantiate."); - } - - -} diff --git a/src/main/java/me/nvus/xprison/utils/Metrics.java b/src/main/java/me/nvus/xprison/utils/Metrics.java deleted file mode 100644 index 8c9b306..0000000 --- a/src/main/java/me/nvus/xprison/utils/Metrics.java +++ /dev/null @@ -1,882 +0,0 @@ - -/* - * This Metrics class was auto-generated and can be copied into your project if you are - * not using a build tool like Gradle or Maven for dependency management. - * - * IMPORTANT: You are not allowed to modify this class, except changing the package. - * - * Disallowed modifications include but are not limited to: - * - Remove the option for users to opt-out - * - Change the frequency for data submission - * - Obfuscate the code (every obfuscator should allow you to make an exception for specific files) - * - Reformat the code (if you use a linter, add an exception) - * - * Violations will result in a ban of your plugin and account from bStats. - */ -package me.nvus.xprison.utils; - -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.reflect.Method; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Supplier; -import java.util.logging.Level; -import java.util.stream.Collectors; -import java.util.zip.GZIPOutputStream; -import javax.net.ssl.HttpsURLConnection; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.java.JavaPlugin; - -public class Metrics { - - private final Plugin plugin; - - private final MetricsBase metricsBase; - - /** - * Creates a new Metrics instance. - * - * @param plugin Your plugin instance. - * @param serviceId The id of the service. It can be found at What is my plugin id? - */ - public Metrics(JavaPlugin plugin, int serviceId) { - 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); - if (!config.isSet("serverUuid")) { - config.addDefault("enabled", true); - config.addDefault("serverUuid", UUID.randomUUID().toString()); - config.addDefault("logFailedRequests", false); - config.addDefault("logSentData", false); - config.addDefault("logResponseStatusText", false); - // Inform the server owners about bStats - config - .options() - .header( - "bStats (https://bStats.org) collects some basic information for plugin authors, like how\n" - + "many people use their plugin and their total player count. It's recommended to keep bStats\n" - + "enabled, but if you're not comfortable with this, you can turn this setting off. There is no\n" - + "performance penalty associated with having metrics enabled, and data sent to bStats is fully\n" - + "anonymous.") - .copyDefaults(true); - try { - config.save(configFile); - } catch (IOException ignored) { - } - } - // Load the data - boolean enabled = config.getBoolean("enabled", true); - String serverUUID = config.getString("serverUuid"); - boolean logErrors = config.getBoolean("logFailedRequests", false); - boolean logSentData = config.getBoolean("logSentData", false); - boolean logResponseStatusText = config.getBoolean("logResponseStatusText", false); - metricsBase = - new MetricsBase( - "bukkit", - serverUUID, - serviceId, - enabled, - this::appendPlatformData, - this::appendServiceData, - submitDataTask -> Bukkit.getScheduler().runTask(plugin, submitDataTask), - plugin::isEnabled, - (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), - (message) -> this.plugin.getLogger().log(Level.INFO, message), - logErrors, - logSentData, - logResponseStatusText); - } - - /** Shuts down the underlying scheduler service. */ - public void shutdown() { - metricsBase.shutdown(); - } - - /** - * Adds a custom chart. - * - * @param chart The chart to add. - */ - public void addCustomChart(CustomChart chart) { - metricsBase.addCustomChart(chart); - } - - private void appendPlatformData(JsonObjectBuilder builder) { - builder.appendField("playerAmount", getPlayerAmount()); - builder.appendField("onlineMode", Bukkit.getOnlineMode() ? 1 : 0); - builder.appendField("bukkitVersion", Bukkit.getVersion()); - builder.appendField("bukkitName", Bukkit.getName()); - builder.appendField("javaVersion", System.getProperty("java.version")); - builder.appendField("osName", System.getProperty("os.name")); - builder.appendField("osArch", System.getProperty("os.arch")); - builder.appendField("osVersion", System.getProperty("os.version")); - builder.appendField("coreCount", Runtime.getRuntime().availableProcessors()); - } - - private void appendServiceData(JsonObjectBuilder builder) { - builder.appendField("pluginVersion", plugin.getDescription().getVersion()); - } - - private int getPlayerAmount() { - try { - // Around MC 1.8 the return type was changed from an array to a collection, - // This fixes java.lang.NoSuchMethodError: - // org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; - Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); - return onlinePlayersMethod.getReturnType().equals(Collection.class) - ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() - : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; - } catch (Exception e) { - // Just use the new method if the reflection failed - return Bukkit.getOnlinePlayers().size(); - } - } - - public static class MetricsBase { - - /** The version of the Metrics class. */ - public static final String METRICS_VERSION = "3.0.2"; - - private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s"; - - private final ScheduledExecutorService scheduler; - - private final String platform; - - private final String serverUuid; - - private final int serviceId; - - private final Consumer appendPlatformDataConsumer; - - private final Consumer appendServiceDataConsumer; - - private final Consumer submitTaskConsumer; - - private final Supplier checkServiceEnabledSupplier; - - private final BiConsumer errorLogger; - - private final Consumer infoLogger; - - private final boolean logErrors; - - private final boolean logSentData; - - private final boolean logResponseStatusText; - - private final Set customCharts = new HashSet<>(); - - private final boolean enabled; - - /** - * Creates a new MetricsBase class instance. - * - * @param platform The platform of the service. - * @param serviceId The id of the service. - * @param serverUuid The server uuid. - * @param enabled Whether or not data sending is enabled. - * @param appendPlatformDataConsumer A consumer that receives a {@code JsonObjectBuilder} and - * appends all platform-specific data. - * @param appendServiceDataConsumer A consumer that receives a {@code JsonObjectBuilder} and - * appends all service-specific data. - * @param submitTaskConsumer A consumer that takes a runnable with the submit task. This can be - * used to delegate the data collection to a another thread to prevent errors caused by - * concurrency. Can be {@code null}. - * @param checkServiceEnabledSupplier A supplier to check if the service is still enabled. - * @param errorLogger A consumer that accepts log message and an error. - * @param infoLogger A consumer that accepts info log messages. - * @param logErrors Whether or not errors should be logged. - * @param logSentData Whether or not the sent data should be logged. - * @param logResponseStatusText Whether or not the response status text should be logged. - */ - public MetricsBase( - String platform, - String serverUuid, - int serviceId, - boolean enabled, - Consumer appendPlatformDataConsumer, - Consumer appendServiceDataConsumer, - Consumer submitTaskConsumer, - Supplier checkServiceEnabledSupplier, - BiConsumer errorLogger, - Consumer infoLogger, - boolean logErrors, - boolean logSentData, - boolean logResponseStatusText) { - ScheduledThreadPoolExecutor scheduler = - new ScheduledThreadPoolExecutor(1, task -> new Thread(task, "bStats-Metrics")); - // We want delayed tasks (non-periodic) that will execute in the future to be - // cancelled when the scheduler is shutdown. - // Otherwise, we risk preventing the server from shutting down even when - // MetricsBase#shutdown() is called - scheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); - this.scheduler = scheduler; - this.platform = platform; - this.serverUuid = serverUuid; - this.serviceId = serviceId; - this.enabled = enabled; - this.appendPlatformDataConsumer = appendPlatformDataConsumer; - this.appendServiceDataConsumer = appendServiceDataConsumer; - this.submitTaskConsumer = submitTaskConsumer; - this.checkServiceEnabledSupplier = checkServiceEnabledSupplier; - this.errorLogger = errorLogger; - this.infoLogger = infoLogger; - this.logErrors = logErrors; - this.logSentData = logSentData; - this.logResponseStatusText = logResponseStatusText; - checkRelocation(); - if (enabled) { - // WARNING: Removing the option to opt-out will get your plugin banned from - // bStats - startSubmitting(); - } - } - - public void addCustomChart(CustomChart chart) { - this.customCharts.add(chart); - } - - public void shutdown() { - scheduler.shutdown(); - } - - private void startSubmitting() { - final Runnable submitTask = - () -> { - if (!enabled || !checkServiceEnabledSupplier.get()) { - // Submitting data or service is disabled - scheduler.shutdown(); - return; - } - if (submitTaskConsumer != null) { - submitTaskConsumer.accept(this::submitData); - } else { - this.submitData(); - } - }; - // Many servers tend to restart at a fixed time at xx:00 which causes an uneven - // distribution of requests on the - // bStats backend. To circumvent this problem, we introduce some randomness into - // the initial and second delay. - // WARNING: You must not modify and part of this Metrics class, including the - // submit delay or frequency! - // WARNING: Modifying this code will get your plugin banned on bStats. Just - // don't do it! - long initialDelay = (long) (1000 * 60 * (3 + Math.random() * 3)); - long secondDelay = (long) (1000 * 60 * (Math.random() * 30)); - scheduler.schedule(submitTask, initialDelay, TimeUnit.MILLISECONDS); - scheduler.scheduleAtFixedRate( - submitTask, initialDelay + secondDelay, 1000 * 60 * 30, TimeUnit.MILLISECONDS); - } - - private void submitData() { - final JsonObjectBuilder baseJsonBuilder = new JsonObjectBuilder(); - appendPlatformDataConsumer.accept(baseJsonBuilder); - final JsonObjectBuilder serviceJsonBuilder = new JsonObjectBuilder(); - appendServiceDataConsumer.accept(serviceJsonBuilder); - JsonObjectBuilder.JsonObject[] chartData = - customCharts.stream() - .map(customChart -> customChart.getRequestJsonObject(errorLogger, logErrors)) - .filter(Objects::nonNull) - .toArray(JsonObjectBuilder.JsonObject[]::new); - serviceJsonBuilder.appendField("id", serviceId); - serviceJsonBuilder.appendField("customCharts", chartData); - baseJsonBuilder.appendField("service", serviceJsonBuilder.build()); - baseJsonBuilder.appendField("serverUUID", serverUuid); - baseJsonBuilder.appendField("metricsVersion", METRICS_VERSION); - JsonObjectBuilder.JsonObject data = baseJsonBuilder.build(); - scheduler.execute( - () -> { - try { - // Send the data - sendData(data); - } catch (Exception e) { - // Something went wrong! :( - if (logErrors) { - errorLogger.accept("Could not submit bStats metrics data", e); - } - } - }); - } - - private void sendData(JsonObjectBuilder.JsonObject data) throws Exception { - if (logSentData) { - infoLogger.accept("Sent bStats metrics data: " + data.toString()); - } - String url = String.format(REPORT_URL, platform); - HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); - // Compress the data to save bandwidth - byte[] compressedData = compress(data.toString()); - connection.setRequestMethod("POST"); - connection.addRequestProperty("Accept", "application/json"); - connection.addRequestProperty("Connection", "close"); - connection.addRequestProperty("Content-Encoding", "gzip"); - connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); - connection.setRequestProperty("Content-Type", "application/json"); - connection.setRequestProperty("User-Agent", "Metrics-Service/1"); - connection.setDoOutput(true); - try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { - outputStream.write(compressedData); - } - StringBuilder builder = new StringBuilder(); - try (BufferedReader bufferedReader = - new BufferedReader(new InputStreamReader(connection.getInputStream()))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - builder.append(line); - } - } - if (logResponseStatusText) { - infoLogger.accept("Sent data to bStats and received response: " + builder); - } - } - - /** Checks that the class was properly relocated. */ - private void checkRelocation() { - // 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'}); - final String examplePackage = - new String(new byte[] {'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); - // We want to make sure no one just copy & pastes the example and uses the wrong - // package names - if (MetricsBase.class.getPackage().getName().startsWith(defaultPackage) - || MetricsBase.class.getPackage().getName().startsWith(examplePackage)) { - throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); - } - } - } - - /** - * Gzips the given string. - * - * @param str The string to gzip. - * @return The gzipped string. - */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { - return null; - } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { - gzip.write(str.getBytes(StandardCharsets.UTF_8)); - } - return outputStream.toByteArray(); - } - } - - 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 JsonObjectBuilder.JsonObject getChartData() throws Exception { - String value = callable.call(); - if (value == null || value.isEmpty()) { - // Null = skip the chart - return null; - } - return new JsonObjectBuilder().appendField("value", value).build(); - } - } - - 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 JsonObjectBuilder.JsonObject getChartData() throws Exception { - JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); - 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) { - // Skip this invalid - continue; - } - allSkipped = false; - valuesBuilder.appendField(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); - } - } - - 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 JsonObjectBuilder.JsonObject getChartData() throws Exception { - JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); - 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) { - // Skip this invalid - continue; - } - allSkipped = false; - valuesBuilder.appendField(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); - } - } - - 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 JsonObjectBuilder.JsonObject getChartData() throws Exception { - JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - for (Map.Entry entry : map.entrySet()) { - valuesBuilder.appendField(entry.getKey(), new int[] {entry.getValue()}); - } - return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); - } - } - - 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 JsonObjectBuilder.JsonObject getChartData() throws Exception { - JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); - 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) { - // Skip this invalid - continue; - } - allSkipped = false; - valuesBuilder.appendField(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); - } - } - - 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 JsonObjectBuilder.JsonObject getChartData() throws Exception { - JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); - Map> map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean reallyAllSkipped = true; - for (Map.Entry> entryValues : map.entrySet()) { - JsonObjectBuilder valueBuilder = new JsonObjectBuilder(); - boolean allSkipped = true; - for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { - valueBuilder.appendField(valueEntry.getKey(), valueEntry.getValue()); - allSkipped = false; - } - if (!allSkipped) { - reallyAllSkipped = false; - valuesBuilder.appendField(entryValues.getKey(), valueBuilder.build()); - } - } - if (reallyAllSkipped) { - // Null = skip the chart - return null; - } - return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); - } - } - - public abstract static class CustomChart { - - private final String chartId; - - protected CustomChart(String chartId) { - if (chartId == null) { - throw new IllegalArgumentException("chartId must not be null"); - } - this.chartId = chartId; - } - - public JsonObjectBuilder.JsonObject getRequestJsonObject( - BiConsumer errorLogger, boolean logErrors) { - JsonObjectBuilder builder = new JsonObjectBuilder(); - builder.appendField("chartId", chartId); - try { - JsonObjectBuilder.JsonObject data = getChartData(); - if (data == null) { - // If the data is null we don't send the chart. - return null; - } - builder.appendField("data", data); - } catch (Throwable t) { - if (logErrors) { - errorLogger.accept("Failed to get data for custom chart with id " + chartId, t); - } - return null; - } - return builder.build(); - } - - protected abstract JsonObjectBuilder.JsonObject getChartData() throws Exception; - } - - 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 JsonObjectBuilder.JsonObject getChartData() throws Exception { - int value = callable.call(); - if (value == 0) { - // Null = skip the chart - return null; - } - return new JsonObjectBuilder().appendField("value", value).build(); - } - } - - /** - * An extremely simple JSON builder. - * - *

While this class is neither feature-rich nor the most performant one, it's sufficient enough - * for its use-case. - */ - public static class JsonObjectBuilder { - - private StringBuilder builder = new StringBuilder(); - - private boolean hasAtLeastOneField = false; - - public JsonObjectBuilder() { - builder.append("{"); - } - - /** - * Appends a null field to the JSON. - * - * @param key The key of the field. - * @return A reference to this object. - */ - public JsonObjectBuilder appendNull(String key) { - appendFieldUnescaped(key, "null"); - return this; - } - - /** - * Appends a string field to the JSON. - * - * @param key The key of the field. - * @param value The value of the field. - * @return A reference to this object. - */ - public JsonObjectBuilder appendField(String key, String value) { - if (value == null) { - throw new IllegalArgumentException("JSON value must not be null"); - } - appendFieldUnescaped(key, "\"" + escape(value) + "\""); - return this; - } - - /** - * Appends an integer field to the JSON. - * - * @param key The key of the field. - * @param value The value of the field. - * @return A reference to this object. - */ - public JsonObjectBuilder appendField(String key, int value) { - appendFieldUnescaped(key, String.valueOf(value)); - return this; - } - - /** - * Appends an object to the JSON. - * - * @param key The key of the field. - * @param object The object. - * @return A reference to this object. - */ - public JsonObjectBuilder appendField(String key, JsonObject object) { - if (object == null) { - throw new IllegalArgumentException("JSON object must not be null"); - } - appendFieldUnescaped(key, object.toString()); - return this; - } - - /** - * Appends a string array to the JSON. - * - * @param key The key of the field. - * @param values The string array. - * @return A reference to this object. - */ - public JsonObjectBuilder appendField(String key, String[] values) { - if (values == null) { - throw new IllegalArgumentException("JSON values must not be null"); - } - String escapedValues = - Arrays.stream(values) - .map(value -> "\"" + escape(value) + "\"") - .collect(Collectors.joining(",")); - appendFieldUnescaped(key, "[" + escapedValues + "]"); - return this; - } - - /** - * Appends an integer array to the JSON. - * - * @param key The key of the field. - * @param values The integer array. - * @return A reference to this object. - */ - public JsonObjectBuilder appendField(String key, int[] values) { - if (values == null) { - throw new IllegalArgumentException("JSON values must not be null"); - } - String escapedValues = - Arrays.stream(values).mapToObj(String::valueOf).collect(Collectors.joining(",")); - appendFieldUnescaped(key, "[" + escapedValues + "]"); - return this; - } - - /** - * Appends an object array to the JSON. - * - * @param key The key of the field. - * @param values The integer array. - * @return A reference to this object. - */ - public JsonObjectBuilder appendField(String key, JsonObject[] values) { - if (values == null) { - throw new IllegalArgumentException("JSON values must not be null"); - } - String escapedValues = - Arrays.stream(values).map(JsonObject::toString).collect(Collectors.joining(",")); - appendFieldUnescaped(key, "[" + escapedValues + "]"); - return this; - } - - /** - * Appends a field to the object. - * - * @param key The key of the field. - * @param escapedValue The escaped value of the field. - */ - private void appendFieldUnescaped(String key, String escapedValue) { - if (builder == null) { - throw new IllegalStateException("JSON has already been built"); - } - if (key == null) { - throw new IllegalArgumentException("JSON key must not be null"); - } - if (hasAtLeastOneField) { - builder.append(","); - } - builder.append("\"").append(escape(key)).append("\":").append(escapedValue); - hasAtLeastOneField = true; - } - - /** - * Builds the JSON string and invalidates this builder. - * - * @return The built JSON string. - */ - public JsonObject build() { - if (builder == null) { - throw new IllegalStateException("JSON has already been built"); - } - JsonObject object = new JsonObject(builder.append("}").toString()); - builder = null; - return object; - } - - /** - * Escapes the given string like stated in https://www.ietf.org/rfc/rfc4627.txt. - * - *

This method escapes only the necessary characters '"', '\'. and '\u0000' - '\u001F'. - * Compact escapes are not used (e.g., '\n' is escaped as "\u000a" and not as "\n"). - * - * @param value The value to escape. - * @return The escaped value. - */ - private static String escape(String value) { - final StringBuilder builder = new StringBuilder(); - for (int i = 0; i < value.length(); i++) { - char c = value.charAt(i); - if (c == '"') { - builder.append("\\\""); - } else if (c == '\\') { - builder.append("\\\\"); - } else if (c <= '\u000F') { - builder.append("\\u000").append(Integer.toHexString(c)); - } else if (c <= '\u001F') { - builder.append("\\u00").append(Integer.toHexString(c)); - } else { - builder.append(c); - } - } - return builder.toString(); - } - - /** - * A super simple representation of a JSON object. - * - *

This class only exists to make methods of the {@link JsonObjectBuilder} type-safe and not - * allow a raw string inputs for methods like {@link JsonObjectBuilder#appendField(String, - * JsonObject)}. - */ - public static class JsonObject { - - private final String value; - - private JsonObject(String value) { - this.value = value; - } - - @Override - public String toString() { - return value; - } - } - } -} diff --git a/src/main/java/me/nvus/xprison/utils/block/CuboidExplosionBlockProvider.java b/src/main/java/me/nvus/xprison/utils/block/CuboidExplosionBlockProvider.java deleted file mode 100644 index ec95783..0000000 --- a/src/main/java/me/nvus/xprison/utils/block/CuboidExplosionBlockProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.nvus.xprison.utils.block; - -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.block.Block; - -import java.util.ArrayList; -import java.util.List; - -public final class CuboidExplosionBlockProvider implements ExplosionBlockProvider { - - private static CuboidExplosionBlockProvider INSTANCE; - - private CuboidExplosionBlockProvider() { - } - - @Override - public List provide(Block center, int radius) { - List blocks = new ArrayList<>(); - final Location startLocation = center.getLocation(); - final World world = center.getWorld(); - for (int x = startLocation.getBlockX() - (radius == 4 ? 0 : (radius / 2)); x <= startLocation.getBlockX() + (radius == 4 ? radius - 1 : (radius / 2)); x++) { - for (int z = startLocation.getBlockZ() - (radius == 4 ? 0 : (radius / 2)); z <= startLocation.getBlockZ() + (radius == 4 ? radius - 1 : (radius / 2)); z++) { - for (int y = startLocation.getBlockY() - (radius == 4 ? 3 : (radius / 2)); y <= startLocation.getBlockY() + (radius == 4 ? 0 : (radius / 2)); y++) { - Block block = world.getBlockAt(x, y, z); - blocks.add(block); - } - } - } - return blocks; - } - - public static CuboidExplosionBlockProvider instance() { - if (INSTANCE == null) { - INSTANCE = new CuboidExplosionBlockProvider(); - } - return INSTANCE; - } -} diff --git a/src/main/java/me/nvus/xprison/utils/block/ExplosionBlockProvider.java b/src/main/java/me/nvus/xprison/utils/block/ExplosionBlockProvider.java deleted file mode 100644 index 7f4494d..0000000 --- a/src/main/java/me/nvus/xprison/utils/block/ExplosionBlockProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.nvus.xprison.utils.block; - -import org.bukkit.block.Block; - -import java.util.List; - -public interface ExplosionBlockProvider { - - List provide(Block center, int radius); -} diff --git a/src/main/java/me/nvus/xprison/utils/block/SpheroidExplosionBlockProvider.java b/src/main/java/me/nvus/xprison/utils/block/SpheroidExplosionBlockProvider.java deleted file mode 100644 index 366810f..0000000 --- a/src/main/java/me/nvus/xprison/utils/block/SpheroidExplosionBlockProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.nvus.xprison.utils.block; - -import org.bukkit.block.Block; - -import java.util.ArrayList; -import java.util.List; - -public final class SpheroidExplosionBlockProvider implements ExplosionBlockProvider { - - private static SpheroidExplosionBlockProvider INSTANCE; - - private SpheroidExplosionBlockProvider() { - } - - @Override - public List provide(Block center, int radius) { - List blocks = new ArrayList<>(); - for (int Y = -radius; Y < radius; Y++) - for (int X = -radius; X < radius; X++) - for (int Z = -radius; Z < radius; Z++) - if (Math.sqrt((X * X) + (Y * Y) + (Z * Z)) <= radius) { - final Block block = center.getWorld().getBlockAt(X + center.getX(), Y + center.getY(), Z + center.getZ()); - blocks.add(block); - } - return blocks; - } - - public static SpheroidExplosionBlockProvider instance() { - if (INSTANCE == null) { - INSTANCE = new SpheroidExplosionBlockProvider(); - } - return INSTANCE; - } -} diff --git a/src/main/java/me/nvus/xprison/utils/compat/CompMaterial.java b/src/main/java/me/nvus/xprison/utils/compat/CompMaterial.java deleted file mode 100644 index aa4d22d..0000000 --- a/src/main/java/me/nvus/xprison/utils/compat/CompMaterial.java +++ /dev/null @@ -1,2516 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2018 Hex_27 - * Copyright (c) 2021 Crypto Morin - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR - * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE - * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package me.nvus.xprison.utils.compat; - -import lombok.Getter; -import lombok.NonNull; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import javax.annotation.Nullable; -import java.util.*; - -import static me.nvus.xprison.utils.compat.MinecraftVersion.V; - -/** - * CompMaterial - Data Values/Pre-flattening
- * 1.13 and above as priority. - *

- * This class is mainly designed to support {@link ItemStack}. If you want to use it on blocks, you'll have to use - * XBlock - *

- * Pre-flattening: https://minecraft.gamepedia.com/Java_Edition_data_values/Pre-flattening - * Materials: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html - * Materials (1.12): https://helpch.at/docs/1.12.2/index.html?org/bukkit/Material.html - * Material IDs: https://minecraft-ids.grahamedgecombe.com/ - * Material Source Code: https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/browse/src/main/java/org/bukkit/Material.java - * XMaterial v1: https://www.spigotmc.org/threads/329630/ - *

- * This class will throw a "unsupported material" error if someone tries to use an item with an invalid data value which can only happen in 1.12 servers and below or when the - * utility is missing a new material in that specific version. - * To get an invalid item, (aka Missing Texture Block) you can use the command - * /give @p minecraft:dirt 1 10 where 1 is the item amount, and 10 is the data value. The material {@link #DIRT} with a data value of {@code 10} doesn't exist. - * - * @author Crypto Morin, forked by kangarko from MineAcademy.org - */ -public enum CompMaterial { - ACACIA_BOAT("BOAT_ACACIA"), - ACACIA_BUTTON("WOOD_BUTTON"), - ACACIA_CHEST_BOAT, - ACACIA_DOOR("ACACIA_DOOR", "ACACIA_DOOR_ITEM"), - ACACIA_FENCE, - ACACIA_FENCE_GATE, - ACACIA_LEAVES("LEAVES_2"), - ACACIA_LOG("LOG_2"), - ACACIA_PLANKS(4, "WOOD"), - ACACIA_PRESSURE_PLATE("WOOD_PLATE"), - ACACIA_SAPLING(4, "SAPLING"), - ACACIA_SIGN("SIGN_POST", "SIGN"), - ACACIA_SLAB(4, "WOOD_DOUBLE_STEP", "WOOD_STEP", "WOODEN_SLAB"), - ACACIA_STAIRS("SMOOTH_STAIRS"), - ACACIA_TRAPDOOR("TRAP_DOOR"), - ACACIA_WALL_SIGN("WALL_SIGN"), - ACACIA_WOOD("LOG_2"), - ACTIVATOR_RAIL, - /** - * https://minecraft.gamepedia.com/Air - * {@link Material#isAir()} - * - * @see #VOID_AIR - * @see #CAVE_AIR - */ - AIR, - ALLAY_SPAWN_EGG, - ALLIUM(2, "RED_ROSE"), - AMETHYST_BLOCK, - AMETHYST_CLUSTER, - AMETHYST_SHARD, - ANCIENT_DEBRIS, - ANDESITE(5, "STONE"), - ANDESITE_SLAB("STEP"), - ANDESITE_STAIRS("SMOOTH_STAIRS"), - ANDESITE_WALL, - ANVIL, - APPLE, - ARMOR_STAND, - ARROW, - ATTACHED_MELON_STEM(7, "MELON_STEM"), - ATTACHED_PUMPKIN_STEM(7, "PUMPKIN_STEM"), - AXOLOTL_BUCKET, - AXOLOTL_SPAWN_EGG, - AZALEA, - AZALEA_LEAVES, - AZURE_BLUET(3, "RED_ROSE"), - BAKED_POTATO, - BAMBOO, - BAMBOO_SAPLING, - BARREL, - BARRIER, - BASALT, - BAT_SPAWN_EGG(65, "MONSTER_EGG"), - BEACON, - BEDROCK, - BEEF("RAW_BEEF"), - BEEHIVE, - /** - * Beetroot is a known material in pre-1.13 - */ - BEETROOT("BEETROOT_BLOCK"), - BEETROOTS("BEETROOT"), - BEETROOT_SEEDS, - BEETROOT_SOUP, - BEE_NEST, - BEE_SPAWN_EGG, - BELL, - BIG_DRIPLEAF, - BIG_DRIPLEAF_STEM, - BIRCH_BOAT("BOAT_BIRCH"), - BIRCH_BUTTON("WOOD_BUTTON"), - BIRCH_CHEST_BOAT, - BIRCH_DOOR("BIRCH_DOOR", "BIRCH_DOOR_ITEM"), - BIRCH_FENCE, - BIRCH_FENCE_GATE, - BIRCH_LEAVES(2, "LEAVES"), - BIRCH_LOG(2, "LOG"), - BIRCH_PLANKS(2, "WOOD"), - BIRCH_PRESSURE_PLATE("WOOD_PLATE"), - BIRCH_SAPLING(2, "SAPLING"), - BIRCH_SIGN("SIGN_POST", "SIGN"), - BIRCH_SLAB(2, "WOOD_DOUBLE_STEP", "WOOD_STEP", "WOODEN_SLAB"), - BIRCH_STAIRS("BIRCH_WOOD_STAIRS"), - BIRCH_TRAPDOOR("TRAP_DOOR"), - BIRCH_WALL_SIGN("WALL_SIGN"), - BIRCH_WOOD(2, "LOG"), - BLACKSTONE, - BLACKSTONE_SLAB("STEP"), - BLACKSTONE_STAIRS("SMOOTH_STAIRS"), - BLACKSTONE_WALL, - BLACK_BANNER("STANDING_BANNER", "BANNER"), - /** - * Version 1.12+ interprets "BED" as BLACK_BED due to enum alphabetic ordering. - */ - BLACK_BED(supports(12) ? 15 : 0, "BED_BLOCK", "BED"), - BLACK_CANDLE, - BLACK_CANDLE_CAKE, - BLACK_CARPET(15, "CARPET"), - BLACK_CONCRETE(15, "CONCRETE"), - BLACK_CONCRETE_POWDER(15, "CONCRETE_POWDER"), - BLACK_DYE(0, 14, "INK_SACK", "INK_SAC"), - BLACK_GLAZED_TERRACOTTA, - BLACK_SHULKER_BOX, - BLACK_STAINED_GLASS(15, "STAINED_GLASS"), - BLACK_STAINED_GLASS_PANE(15, "STAINED_GLASS_PANE"), - BLACK_TERRACOTTA(15, "STAINED_CLAY"), - BLACK_WALL_BANNER("WALL_BANNER"), - BLACK_WOOL(15, "WOOL"), - BLAST_FURNACE, - BLAZE_POWDER, - BLAZE_ROD, - BLAZE_SPAWN_EGG(61, "MONSTER_EGG"), - BLUE_BANNER(4, "STANDING_BANNER", "BANNER"), - BLUE_BED(supports(12) ? 11 : 0, "BED_BLOCK", "BED"), - BLUE_CANDLE, - BLUE_CANDLE_CAKE, - BLUE_CARPET(11, "CARPET"), - BLUE_CONCRETE(11, "CONCRETE"), - BLUE_CONCRETE_POWDER(11, "CONCRETE_POWDER"), - BLUE_DYE(4, "INK_SACK", "LAPIS_LAZULI"), - BLUE_GLAZED_TERRACOTTA, - BLUE_ICE, - BLUE_ORCHID(1, "RED_ROSE"), - BLUE_SHULKER_BOX, - BLUE_STAINED_GLASS(11, "STAINED_GLASS"), - BLUE_STAINED_GLASS_PANE(11, "THIN_GLASS", "STAINED_GLASS_PANE"), - BLUE_TERRACOTTA(11, "STAINED_CLAY"), - BLUE_WALL_BANNER(4, "WALL_BANNER"), - BLUE_WOOL(11, "WOOL"), - BONE, - BONE_BLOCK, - BONE_MEAL(15, "INK_SACK"), - BOOK, - BOOKSHELF, - BOW, - BOWL, - BRAIN_CORAL, - BRAIN_CORAL_BLOCK, - BRAIN_CORAL_FAN, - BRAIN_CORAL_WALL_FAN, - BREAD, - BREWING_STAND("BREWING_STAND", "BREWING_STAND_ITEM"), - BRICK("CLAY_BRICK"), - BRICKS("BRICKS", "BRICK"), - BRICK_SLAB(4, "STEP"), - BRICK_STAIRS("SMOOTH_STAIRS"), - BRICK_WALL, - BROWN_BANNER(3, "STANDING_BANNER", "BANNER"), - BROWN_BED(supports(12) ? 12 : 0, "BED_BLOCK", "BED"), - BROWN_CANDLE, - BROWN_CANDLE_CAKE, - BROWN_CARPET(12, "CARPET"), - BROWN_CONCRETE(12, "CONCRETE"), - BROWN_CONCRETE_POWDER(12, "CONCRETE_POWDER"), - BROWN_DYE(3, "INK_SACK", "DYE", "COCOA_BEANS"), - BROWN_GLAZED_TERRACOTTA, - BROWN_MUSHROOM, - BROWN_MUSHROOM_BLOCK("BROWN_MUSHROOM", "HUGE_MUSHROOM_1"), - BROWN_SHULKER_BOX, - BROWN_STAINED_GLASS(12, "STAINED_GLASS"), - BROWN_STAINED_GLASS_PANE(12, "THIN_GLASS", "STAINED_GLASS_PANE"), - BROWN_TERRACOTTA(12, "STAINED_CLAY"), - BROWN_WALL_BANNER(3, "WALL_BANNER"), - BROWN_WOOL(12, "WOOL"), - BUBBLE_COLUMN, - BUBBLE_CORAL, - BUBBLE_CORAL_BLOCK, - BUBBLE_CORAL_FAN, - BUBBLE_CORAL_WALL_FAN, - BUCKET, - BUDDING_AMETHYST, - BUNDLE, - CACTUS, - CAKE("CAKE_BLOCK"), - CALCITE, - CAMPFIRE, - CANDLE, - CANDLE_CAKE, - CARROT("CARROT_ITEM"), - CARROTS("CARROT"), - CARROT_ON_A_STICK("CARROT_STICK"), - CARTOGRAPHY_TABLE, - CARVED_PUMPKIN, - CAT_SPAWN_EGG, - CAULDRON("CAULDRON", "CAULDRON_ITEM"), - /** - * 1.13 tag is not added because it's the same thing as {@link #AIR} - * - * @see #VOID_AIR - */ - CAVE_AIR("AIR"), - CAVE_SPIDER_SPAWN_EGG(59, "MONSTER_EGG"), - CAVE_VINES, - CAVE_VINES_PLANT, - CHAIN, - CHAINMAIL_BOOTS, - CHAINMAIL_CHESTPLATE, - CHAINMAIL_HELMET, - CHAINMAIL_LEGGINGS, - CHAIN_COMMAND_BLOCK("COMMAND", "COMMAND_CHAIN"), - CHARCOAL(1, "COAL"), - CHEST("LOCKED_CHEST"), - CHEST_MINECART("STORAGE_MINECART"), - CHICKEN("RAW_CHICKEN"), - CHICKEN_SPAWN_EGG(93, "MONSTER_EGG"), - CHIPPED_ANVIL(1, "ANVIL"), - CHISELED_DEEPSLATE, - CHISELED_NETHER_BRICKS(1, "NETHER_BRICKS"), - CHISELED_POLISHED_BLACKSTONE("POLISHED_BLACKSTONE"), - CHISELED_QUARTZ_BLOCK(1, "QUARTZ_BLOCK"), - CHISELED_RED_SANDSTONE(1, "RED_SANDSTONE"), - CHISELED_SANDSTONE(1, "SANDSTONE"), - CHISELED_STONE_BRICKS(3, "SMOOTH_BRICK"), - CHORUS_FLOWER, - CHORUS_FRUIT, - CHORUS_PLANT, - CLAY, - CLAY_BALL, - CLOCK("WATCH"), - COAL, - COAL_BLOCK, - COAL_ORE, - COARSE_DIRT(1, "DIRT"), - COBBLED_DEEPSLATE, - COBBLED_DEEPSLATE_SLAB("STEP"), - COBBLED_DEEPSLATE_STAIRS("SMOOTH_STAIRS"), - COBBLED_DEEPSLATE_WALL, - COBBLESTONE, - COBBLESTONE_SLAB(3, "STEP"), - COBBLESTONE_STAIRS("SMOOTH_STAIRS"), - COBBLESTONE_WALL("COBBLE_WALL"), - COBWEB("WEB"), - COCOA, - COCOA_BEANS(3, "INK_SACK"), - COD("RAW_FISH"), - COD_BUCKET, - COD_SPAWN_EGG, - COMMAND_BLOCK("COMMAND"), - COMMAND_BLOCK_MINECART("COMMAND_MINECART"), - /** - * Unlike redstone torch and redstone lamp... neither REDTONE_COMPARATOR_OFF nor REDSTONE_COMPARATOR_ON - * are items. REDSTONE_COMPARATOR is. - * - * @see #REDSTONE_TORCH - * @see #REDSTONE_LAMP - */ - COMPARATOR("REDSTONE_COMPARATOR_OFF", "REDSTONE_COMPARATOR_ON", "REDSTONE_COMPARATOR"), - COMPASS, - COMPOSTER, - CONDUIT, - COOKED_BEEF, - COOKED_CHICKEN, - COOKED_COD("COOKED_FISH"), - COOKED_MUTTON, - COOKED_PORKCHOP("GRILLED_PORK"), - COOKED_RABBIT, - COOKED_SALMON(1, "COOKED_FISH"), - COOKIE, - COPPER_BLOCK, - COPPER_INGOT, - COPPER_ORE, - CORNFLOWER, - COW_SPAWN_EGG(92, "MONSTER_EGG"), - CRACKED_DEEPSLATE_BRICKS, - CRACKED_DEEPSLATE_TILES, - CRACKED_NETHER_BRICKS(2, "NETHER_BRICKS"), - CRACKED_POLISHED_BLACKSTONE_BRICKS("POLISHED_BLACKSTONE_BRICKS"), - CRACKED_STONE_BRICKS(2, "SMOOTH_BRICK"), - CRAFTING_TABLE("WORKBENCH"), - CREEPER_BANNER_PATTERN, - CREEPER_HEAD(4, "SKULL", "SKULL_ITEM"), - CREEPER_SPAWN_EGG(50, "MONSTER_EGG"), - CREEPER_WALL_HEAD(4, "SKULL", "SKULL_ITEM"), - CRIMSON_BUTTON, - CRIMSON_DOOR, - CRIMSON_FENCE, - CRIMSON_FENCE_GATE, - CRIMSON_FUNGUS, - CRIMSON_HYPHAE, - CRIMSON_NYLIUM, - CRIMSON_PLANKS, - CRIMSON_PRESSURE_PLATE, - CRIMSON_ROOTS, - CRIMSON_SIGN("SIGN_POST"), - CRIMSON_SLAB("STEP"), - CRIMSON_STAIRS("SMOOTH_STAIRS"), - CRIMSON_STEM, - CRIMSON_TRAPDOOR, - CRIMSON_WALL_SIGN("WALL_SIGN"), - CROSSBOW, - CRYING_OBSIDIAN, - CUT_COPPER, - CUT_COPPER_SLAB("STEP"), - CUT_COPPER_STAIRS("SMOOTH_STAIRS"), - CUT_RED_SANDSTONE, - CUT_RED_SANDSTONE_SLAB("STONE_SLAB2"), - CUT_SANDSTONE, - CUT_SANDSTONE_SLAB(1, "STEP"), - CYAN_BANNER(6, "STANDING_BANNER", "BANNER"), - CYAN_BED(supports(12) ? 9 : 0, "BED_BLOCK", "BED"), - CYAN_CANDLE, - CYAN_CANDLE_CAKE, - CYAN_CARPET(9, "CARPET"), - CYAN_CONCRETE(9, "CONCRETE"), - CYAN_CONCRETE_POWDER(9, "CONCRETE_POWDER"), - CYAN_DYE(6, "INK_SACK"), - CYAN_GLAZED_TERRACOTTA, - CYAN_SHULKER_BOX, - CYAN_STAINED_GLASS(9, "STAINED_GLASS"), - CYAN_STAINED_GLASS_PANE(9, "STAINED_GLASS_PANE"), - CYAN_TERRACOTTA(9, "STAINED_CLAY"), - CYAN_WALL_BANNER(6, "WALL_BANNER"), - CYAN_WOOL(9, "WOOL"), - DAMAGED_ANVIL(2, "ANVIL"), - DANDELION("YELLOW_FLOWER"), - DARK_OAK_BOAT("BOAT_DARK_OAK"), - DARK_OAK_BUTTON("WOOD_BUTTON"), - DARK_OAK_CHEST_BOAT, - DARK_OAK_DOOR("DARK_OAK_DOOR", "DARK_OAK_DOOR_ITEM"), - DARK_OAK_FENCE, - DARK_OAK_FENCE_GATE, - DARK_OAK_LEAVES(1, "LEAVES_2"), - DARK_OAK_LOG(1, "LOG_2"), - DARK_OAK_PLANKS(5, "WOOD"), - DARK_OAK_PRESSURE_PLATE("WOOD_PLATE"), - DARK_OAK_SAPLING(5, "SAPLING"), - DARK_OAK_SIGN("SIGN_POST", "SIGN"), - DARK_OAK_SLAB(5, "WOOD_DOUBLE_STEP", "WOOD_STEP", "WOODEN_SLAB"), - DARK_OAK_STAIRS("SMOOTH_STAIRS"), - DARK_OAK_TRAPDOOR("TRAP_DOOR"), - DARK_OAK_WALL_SIGN("WALL_SIGN"), - DARK_OAK_WOOD(1, "LOG_2"), - DARK_PRISMARINE(2, "PRISMARINE"), - DARK_PRISMARINE_SLAB("STEP"), - DARK_PRISMARINE_STAIRS("SMOOTH_STAIRS"), - DAYLIGHT_DETECTOR("DAYLIGHT_DETECTOR_INVERTED"), - DEAD_BRAIN_CORAL, - DEAD_BRAIN_CORAL_BLOCK, - DEAD_BRAIN_CORAL_FAN, - DEAD_BRAIN_CORAL_WALL_FAN, - DEAD_BUBBLE_CORAL, - DEAD_BUBBLE_CORAL_BLOCK, - DEAD_BUBBLE_CORAL_FAN, - DEAD_BUBBLE_CORAL_WALL_FAN, - DEAD_BUSH("LONG_GRASS"), - DEAD_FIRE_CORAL, - DEAD_FIRE_CORAL_BLOCK, - DEAD_FIRE_CORAL_FAN, - DEAD_FIRE_CORAL_WALL_FAN, - DEAD_HORN_CORAL, - DEAD_HORN_CORAL_BLOCK, - DEAD_HORN_CORAL_FAN, - DEAD_HORN_CORAL_WALL_FAN, - DEAD_TUBE_CORAL, - DEAD_TUBE_CORAL_BLOCK, - DEAD_TUBE_CORAL_FAN, - DEAD_TUBE_CORAL_WALL_FAN, - DEBUG_STICK, - DEEPSLATE, - DEEPSLATE_BRICKS, - DEEPSLATE_BRICK_SLAB("STEP"), - DEEPSLATE_BRICK_STAIRS("SMOOTH_STAIRS"), - DEEPSLATE_BRICK_WALL, - DEEPSLATE_COAL_ORE, - DEEPSLATE_COPPER_ORE, - DEEPSLATE_DIAMOND_ORE, - DEEPSLATE_EMERALD_ORE, - DEEPSLATE_GOLD_ORE, - DEEPSLATE_IRON_ORE, - DEEPSLATE_LAPIS_ORE, - DEEPSLATE_REDSTONE_ORE, - DEEPSLATE_TILES, - DEEPSLATE_TILE_SLAB("STEP"), - DEEPSLATE_TILE_STAIRS("SMOOTH_STAIRS"), - DEEPSLATE_TILE_WALL, - DETECTOR_RAIL, - DIAMOND, - DIAMOND_AXE, - DIAMOND_BLOCK, - DIAMOND_BOOTS, - DIAMOND_CHESTPLATE, - DIAMOND_HELMET, - DIAMOND_HOE, - DIAMOND_HORSE_ARMOR("DIAMOND_BARDING"), - DIAMOND_LEGGINGS, - DIAMOND_ORE, - DIAMOND_PICKAXE, - DIAMOND_SHOVEL("DIAMOND_SPADE"), - DIAMOND_SWORD, - DIORITE(3, "STONE"), - DIORITE_SLAB("STEP"), - DIORITE_STAIRS("SMOOTH_STAIRS"), - DIORITE_WALL, - DIRT, - /** - * Changed in 1.17 - */ - DIRT_PATH("GRASS_PATH"), - DISC_FRAGMENT_5, - DISPENSER, - DOLPHIN_SPAWN_EGG, - DONKEY_SPAWN_EGG(32, "MONSTER_EGG"), - DRAGON_BREATH("DRAGONS_BREATH"), - DRAGON_EGG, - DRAGON_HEAD(5, "SKULL", "SKULL_ITEM"), - DRAGON_WALL_HEAD(5, "SKULL", "SKULL_ITEM"), - DRIED_KELP, - DRIED_KELP_BLOCK, - DRIPSTONE_BLOCK, - DROPPER, - DROWNED_SPAWN_EGG, - ECHO_SHARD, - EGG, - ELDER_GUARDIAN_SPAWN_EGG(4, "MONSTER_EGG"), - ELYTRA, - EMERALD, - EMERALD_BLOCK, - EMERALD_ORE, - ENCHANTED_BOOK, - ENCHANTED_GOLDEN_APPLE(1, "GOLDEN_APPLE"), - ENCHANTING_TABLE("ENCHANTMENT_TABLE"), - ENDERMAN_SPAWN_EGG(58, "MONSTER_EGG"), - ENDERMITE_SPAWN_EGG(67, "MONSTER_EGG"), - ENDER_CHEST, - ENDER_EYE("EYE_OF_ENDER"), - ENDER_PEARL, - END_CRYSTAL, - END_GATEWAY, - END_PORTAL("ENDER_PORTAL"), - END_PORTAL_FRAME("ENDER_PORTAL_FRAME"), - END_ROD, - END_STONE("ENDER_STONE"), - END_STONE_BRICKS("END_BRICKS"), - END_STONE_BRICK_SLAB(6, "STEP"), - END_STONE_BRICK_STAIRS("SMOOTH_STAIRS"), - END_STONE_BRICK_WALL, - EVOKER_SPAWN_EGG(34, "MONSTER_EGG"), - EXPERIENCE_BOTTLE("EXP_BOTTLE"), - EXPOSED_COPPER, - EXPOSED_CUT_COPPER, - EXPOSED_CUT_COPPER_SLAB("STEP"), - EXPOSED_CUT_COPPER_STAIRS("SMOOTH_STAIRS"), - FARMLAND("SOIL"), - FEATHER, - FERMENTED_SPIDER_EYE, - FERN(2, "LONG_GRASS"), - /** - * For some reasons filled map items are really special. - * Their data value starts from 0 and every time a player - * creates a new map that maps data value increases. - * https://github.com/CryptoMorin/XSeries/issues/91 - */ - FILLED_MAP("MAP"), - FIRE, - FIREWORK_ROCKET("FIREWORK"), - FIREWORK_STAR("FIREWORK_CHARGE"), - FIRE_CHARGE("FIREBALL"), - FIRE_CORAL, - FIRE_CORAL_BLOCK, - FIRE_CORAL_FAN, - FIRE_CORAL_WALL_FAN, - FISHING_ROD, - FLETCHING_TABLE, - FLINT, - FLINT_AND_STEEL, - FLOWERING_AZALEA, - FLOWERING_AZALEA_LEAVES, - FLOWER_BANNER_PATTERN, - FLOWER_POT("FLOWER_POT", "FLOWER_POT_ITEM"), - FOX_SPAWN_EGG, - FROGSPAWN, - FROG_SPAWN_EGG, - /** - * This special material cannot be obtained as an item. - */ - FROSTED_ICE, - FURNACE("BURNING_FURNACE"), - FURNACE_MINECART("POWERED_MINECART"), - GHAST_SPAWN_EGG(56, "MONSTER_EGG"), - GHAST_TEAR, - GILDED_BLACKSTONE, - GLASS, - GLASS_BOTTLE, - GLASS_PANE("THIN_GLASS"), - GLISTERING_MELON_SLICE("SPECKLED_MELON"), - GLOBE_BANNER_PATTERN, - GLOWSTONE, - GLOWSTONE_DUST, - GLOW_BERRIES, - GLOW_INK_SAC, - GLOW_ITEM_FRAME, - GLOW_LICHEN, - GLOW_SQUID_SPAWN_EGG, - GOAT_HORN, - GOAT_SPAWN_EGG, - GOLDEN_APPLE, - GOLDEN_AXE("GOLD_AXE"), - GOLDEN_BOOTS("GOLD_BOOTS"), - GOLDEN_CARROT, - GOLDEN_CHESTPLATE("GOLD_CHESTPLATE"), - GOLDEN_HELMET("GOLD_HELMET"), - GOLDEN_HOE("GOLD_HOE"), - GOLDEN_HORSE_ARMOR("GOLD_BARDING"), - GOLDEN_LEGGINGS("GOLD_LEGGINGS"), - GOLDEN_PICKAXE("GOLD_PICKAXE"), - GOLDEN_SHOVEL("GOLD_SPADE"), - GOLDEN_SWORD("GOLD_SWORD"), - GOLD_BLOCK, - GOLD_INGOT, - GOLD_NUGGET, - GOLD_ORE, - GRANITE(1, "STONE"), - GRANITE_SLAB("STEP"), - GRANITE_STAIRS("SMOOTH_STAIRS"), - GRANITE_WALL, - GRASS(1, "LONG_GRASS"), - GRASS_BLOCK("GRASS"), - GRAVEL, - GRAY_BANNER(8, "STANDING_BANNER", "BANNER"), - GRAY_BED(supports(12) ? 7 : 0, "BED_BLOCK", "BED"), - GRAY_CANDLE, - GRAY_CANDLE_CAKE, - GRAY_CARPET(7, "CARPET"), - GRAY_CONCRETE(7, "CONCRETE"), - GRAY_CONCRETE_POWDER(7, "CONCRETE_POWDER"), - GRAY_DYE(8, "INK_SACK"), - GRAY_GLAZED_TERRACOTTA, - GRAY_SHULKER_BOX, - GRAY_STAINED_GLASS(7, "STAINED_GLASS"), - GRAY_STAINED_GLASS_PANE(7, "THIN_GLASS", "STAINED_GLASS_PANE"), - GRAY_TERRACOTTA(7, "STAINED_CLAY"), - GRAY_WALL_BANNER(8, "WALL_BANNER"), - GRAY_WOOL(7, "WOOL"), - GREEN_BANNER(2, "STANDING_BANNER", "BANNER"), - GREEN_BED(supports(12) ? 13 : 0, "BED_BLOCK", "BED"), - GREEN_CANDLE, - GREEN_CANDLE_CAKE, - GREEN_CARPET(13, "CARPET"), - GREEN_CONCRETE(13, "CONCRETE"), - GREEN_CONCRETE_POWDER(13, "CONCRETE_POWDER"), - /** - * 1.13 renamed to CACTUS_GREEN - * 1.14 renamed to GREEN_DYE - */ - GREEN_DYE(2, "INK_SACK", "CACTUS_GREEN"), - GREEN_GLAZED_TERRACOTTA, - GREEN_SHULKER_BOX, - GREEN_STAINED_GLASS(13, "STAINED_GLASS"), - GREEN_STAINED_GLASS_PANE(13, "THIN_GLASS", "STAINED_GLASS_PANE"), - GREEN_TERRACOTTA(13, "STAINED_CLAY"), - GREEN_WALL_BANNER(2, "WALL_BANNER"), - GREEN_WOOL(13, "WOOL"), - GRINDSTONE, - GUARDIAN_SPAWN_EGG(68, "MONSTER_EGG"), - GUNPOWDER("SULPHUR"), - HANGING_ROOTS, - HAY_BLOCK, - HEART_OF_THE_SEA, - HEAVY_WEIGHTED_PRESSURE_PLATE("IRON_PLATE"), - HOGLIN_SPAWN_EGG("MONSTER_EGG"), - HONEYCOMB, - HONEYCOMB_BLOCK, - HONEY_BLOCK, - HONEY_BOTTLE, - HOPPER, - HOPPER_MINECART, - HORN_CORAL, - HORN_CORAL_BLOCK, - HORN_CORAL_FAN, - HORN_CORAL_WALL_FAN, - HORSE_SPAWN_EGG(100, "MONSTER_EGG"), - HUSK_SPAWN_EGG(23, "MONSTER_EGG"), - ICE, - INFESTED_CHISELED_STONE_BRICKS(5, "MONSTER_EGGS"), - INFESTED_COBBLESTONE(1, "MONSTER_EGGS"), - INFESTED_CRACKED_STONE_BRICKS(4, "MONSTER_EGGS"), - INFESTED_DEEPSLATE, - INFESTED_MOSSY_STONE_BRICKS(3, "MONSTER_EGGS"), - INFESTED_STONE("MONSTER_EGGS"), - INFESTED_STONE_BRICKS(2, "MONSTER_EGGS"), - /** - * We will only add "INK_SAC" for {@link #BLACK_DYE} since it's - * the only material (linked with this material) that is added - * after 1.13, which means it can use both INK_SACK and INK_SAC. - */ - INK_SAC("INK_SACK"), - IRON_AXE, - IRON_BARS("IRON_FENCE"), - IRON_BLOCK, - IRON_BOOTS, - IRON_CHESTPLATE, - IRON_DOOR("IRON_DOOR_BLOCK"), - IRON_HELMET, - IRON_HOE, - IRON_HORSE_ARMOR("IRON_BARDING"), - IRON_INGOT, - IRON_LEGGINGS, - IRON_NUGGET, - IRON_ORE, - IRON_PICKAXE, - IRON_SHOVEL("IRON_SPADE"), - IRON_SWORD, - IRON_TRAPDOOR, - ITEM_FRAME, - JACK_O_LANTERN, - JIGSAW, - JUKEBOX, - JUNGLE_BOAT("BOAT_JUNGLE"), - JUNGLE_BUTTON("WOOD_BUTTON"), - JUNGLE_CHEST_BOAT, - JUNGLE_DOOR("JUNGLE_DOOR", "JUNGLE_DOOR_ITEM"), - JUNGLE_FENCE, - JUNGLE_FENCE_GATE, - JUNGLE_LEAVES(3, "LEAVES"), - JUNGLE_LOG(3, "LOG"), - JUNGLE_PLANKS(3, "WOOD"), - JUNGLE_PRESSURE_PLATE("WOOD_PLATE"), - JUNGLE_SAPLING(3, "SAPLING"), - JUNGLE_SIGN("SIGN_POST", "SIGN"), - JUNGLE_SLAB(3, "WOOD_DOUBLE_STEP", "WOOD_STEP", "WOODEN_SLAB"), - JUNGLE_STAIRS("JUNGLE_WOOD_STAIRS"), - JUNGLE_TRAPDOOR("TRAP_DOOR"), - JUNGLE_WALL_SIGN("WALL_SIGN"), - JUNGLE_WOOD(3, "LOG"), - KELP, - KELP_PLANT, - KNOWLEDGE_BOOK("BOOK"), - LADDER, - LANTERN, - LAPIS_BLOCK, - LAPIS_LAZULI(4, "INK_SACK"), - LAPIS_ORE, - LARGE_AMETHYST_BUD, - LARGE_FERN(3, "DOUBLE_PLANT"), - LAVA("STATIONARY_LAVA"), - LAVA_BUCKET, - LAVA_CAULDRON, - LEAD("LEASH"), - LEATHER, - LEATHER_BOOTS, - LEATHER_CHESTPLATE, - LEATHER_HELMET, - LEATHER_HORSE_ARMOR("IRON_HORSE_ARMOR"), - LEATHER_LEGGINGS, - LECTERN, - LEVER, - LIGHT, - LIGHTNING_ROD, - LIGHT_BLUE_BANNER(12, "STANDING_BANNER", "BANNER"), - LIGHT_BLUE_BED(supports(12) ? 3 : 0, "BED_BLOCK", "BED"), - LIGHT_BLUE_CANDLE, - LIGHT_BLUE_CANDLE_CAKE, - LIGHT_BLUE_CARPET(3, "CARPET"), - LIGHT_BLUE_CONCRETE(3, "CONCRETE"), - LIGHT_BLUE_CONCRETE_POWDER(3, "CONCRETE_POWDER"), - LIGHT_BLUE_DYE(12, "INK_SACK"), - LIGHT_BLUE_GLAZED_TERRACOTTA, - LIGHT_BLUE_SHULKER_BOX, - LIGHT_BLUE_STAINED_GLASS(3, "STAINED_GLASS"), - LIGHT_BLUE_STAINED_GLASS_PANE(3, "THIN_GLASS", "STAINED_GLASS_PANE"), - LIGHT_BLUE_TERRACOTTA(3, "STAINED_CLAY"), - LIGHT_BLUE_WALL_BANNER(12, "WALL_BANNER", "STANDING_BANNER", "BANNER"), - LIGHT_BLUE_WOOL(3, "WOOL"), - LIGHT_GRAY_BANNER(7, "STANDING_BANNER", "BANNER"), - LIGHT_GRAY_BED(supports(12) ? 8 : 0, "BED_BLOCK", "BED"), - LIGHT_GRAY_CANDLE, - LIGHT_GRAY_CANDLE_CAKE, - LIGHT_GRAY_CARPET(8, "CARPET"), - LIGHT_GRAY_CONCRETE(8, "CONCRETE"), - LIGHT_GRAY_CONCRETE_POWDER(8, "CONCRETE_POWDER"), - LIGHT_GRAY_DYE(7, "INK_SACK"), - /** - * Renamed to SILVER_GLAZED_TERRACOTTA in 1.12 - * Renamed to LIGHT_GRAY_GLAZED_TERRACOTTA in 1.14 - */ - LIGHT_GRAY_GLAZED_TERRACOTTA(0, 12, "STAINED_CLAY", "LIGHT_GRAY_TERRACOTTA", "SILVER_GLAZED_TERRACOTTA"), - LIGHT_GRAY_SHULKER_BOX("SILVER_SHULKER_BOX"), - LIGHT_GRAY_STAINED_GLASS(8, "STAINED_GLASS"), - LIGHT_GRAY_STAINED_GLASS_PANE(8, "THIN_GLASS", "STAINED_GLASS_PANE"), - LIGHT_GRAY_TERRACOTTA(8, "STAINED_CLAY"), - LIGHT_GRAY_WALL_BANNER(7, "WALL_BANNER"), - LIGHT_GRAY_WOOL(8, "WOOL"), - LIGHT_WEIGHTED_PRESSURE_PLATE("GOLD_PLATE"), - LILAC(1, "DOUBLE_PLANT"), - LILY_OF_THE_VALLEY, - LILY_PAD("WATER_LILY"), - LIME_BANNER(10, "STANDING_BANNER", "BANNER"), - LIME_BED(supports(12) ? 5 : 0, "BED_BLOCK", "BED"), - LIME_CANDLE, - LIME_CANDLE_CAKE, - LIME_CARPET(5, "CARPET"), - LIME_CONCRETE(5, "CONCRETE"), - LIME_CONCRETE_POWDER(5, "CONCRETE_POWDER"), - LIME_DYE(10, "INK_SACK"), - LIME_GLAZED_TERRACOTTA, - LIME_SHULKER_BOX, - LIME_STAINED_GLASS(5, "STAINED_GLASS"), - LIME_STAINED_GLASS_PANE(5, "STAINED_GLASS_PANE"), - LIME_TERRACOTTA(5, "STAINED_CLAY"), - LIME_WALL_BANNER(10, "WALL_BANNER"), - LIME_WOOL(5, "WOOL"), - LINGERING_POTION, - LLAMA_SPAWN_EGG(103, "MONSTER_EGG"), - LODESTONE, - LOOM, - MAGENTA_BANNER(13, "STANDING_BANNER", "BANNER"), - MAGENTA_BED(supports(12) ? 2 : 0, "BED_BLOCK", "BED"), - MAGENTA_CANDLE, - MAGENTA_CANDLE_CAKE, - MAGENTA_CARPET(2, "CARPET"), - MAGENTA_CONCRETE(2, "CONCRETE"), - MAGENTA_CONCRETE_POWDER(2, "CONCRETE_POWDER"), - MAGENTA_DYE(13, "INK_SACK"), - MAGENTA_GLAZED_TERRACOTTA, - MAGENTA_SHULKER_BOX, - MAGENTA_STAINED_GLASS(2, "STAINED_GLASS"), - MAGENTA_STAINED_GLASS_PANE(2, "THIN_GLASS", "STAINED_GLASS_PANE"), - MAGENTA_TERRACOTTA(2, "STAINED_CLAY"), - MAGENTA_WALL_BANNER(13, "WALL_BANNER"), - MAGENTA_WOOL(2, "WOOL"), - MAGMA_BLOCK("MAGMA"), - MAGMA_CREAM, - MAGMA_CUBE_SPAWN_EGG(62, "MONSTER_EGG"), - MANGROVE_BOAT, - MANGROVE_BUTTON, - MANGROVE_CHEST_BOAT, - MANGROVE_DOOR, - MANGROVE_FENCE, - MANGROVE_FENCE_GATE, - MANGROVE_LEAVES, - MANGROVE_LOG, - MANGROVE_PLANKS, - MANGROVE_PRESSURE_PLATE, - MANGROVE_PROPAGULE, - MANGROVE_ROOTS, - MANGROVE_SIGN, - MANGROVE_SLAB("STEP"), - MANGROVE_STAIRS("SMOOTH_STAIRS"), - MANGROVE_TRAPDOOR, - MANGROVE_WALL_SIGN, - MANGROVE_WOOD, - /** - * Adding this to the duplicated list will give you a filled map - * for 1.13+ versions and removing it from duplicated list will - * still give you a filled map in -1.12 versions. - * Since higher versions are our priority I'll keep 1.13+ support - * until I can come up with something to fix it. - */ - MAP("EMPTY_MAP"), - MEDIUM_AMETHYST_BUD, - MELON("MELON_BLOCK"), - MELON_SEEDS, - MELON_SLICE("MELON"), - MELON_STEM, - MILK_BUCKET, - MINECART, - MOJANG_BANNER_PATTERN, - MOOSHROOM_SPAWN_EGG(96, "MONSTER_EGG"), - MOSSY_COBBLESTONE, - MOSSY_COBBLESTONE_SLAB(3, "STEP"), - MOSSY_COBBLESTONE_STAIRS("SMOOTH_STAIRS"), - MOSSY_COBBLESTONE_WALL(1, "COBBLE_WALL", "COBBLESTONE_WALL"), - MOSSY_STONE_BRICKS(1, "SMOOTH_BRICK"), - MOSSY_STONE_BRICK_SLAB(5, "STEP"), - MOSSY_STONE_BRICK_STAIRS("SMOOTH_STAIRS"), - MOSSY_STONE_BRICK_WALL, - MOSS_BLOCK, - MOSS_CARPET, - MOVING_PISTON("PISTON_MOVING_PIECE"), - MUD, - MUDDY_MANGROVE_ROOTS, - MUD_BRICKS, - MUD_BRICK_SLAB("STEP"), - MUD_BRICK_STAIRS("SMOOTH_STAIRS"), - MUD_BRICK_WALL, - MULE_SPAWN_EGG(32, "MONSTER_EGG"), - MUSHROOM_STEM("BROWN_MUSHROOM"), - MUSHROOM_STEW("MUSHROOM_SOUP"), - MUSIC_DISC_11("GOLD_RECORD"), - MUSIC_DISC_13("GREEN_RECORD"), - MUSIC_DISC_5, - MUSIC_DISC_BLOCKS("RECORD_3"), - MUSIC_DISC_CAT("RECORD_4"), - MUSIC_DISC_CHIRP("RECORD_5"), - MUSIC_DISC_FAR("RECORD_6"), - MUSIC_DISC_MALL("RECORD_7"), - MUSIC_DISC_MELLOHI("RECORD_8"), - MUSIC_DISC_OTHERSIDE, - MUSIC_DISC_PIGSTEP, - MUSIC_DISC_STAL("RECORD_9"), - MUSIC_DISC_STRAD("RECORD_10"), - MUSIC_DISC_WAIT("RECORD_11"), - MUSIC_DISC_WARD("RECORD_12"), - MUTTON, - MYCELIUM("MYCEL"), - NAME_TAG, - NAUTILUS_SHELL, - NETHERITE_AXE(16, "GOLDEN_AXE", "GOLD_AXE"), - NETHERITE_BLOCK, - NETHERITE_BOOTS, - NETHERITE_CHESTPLATE, - NETHERITE_HELMET, - NETHERITE_HOE, - NETHERITE_INGOT, - NETHERITE_LEGGINGS, - NETHERITE_PICKAXE, - NETHERITE_SCRAP, - NETHERITE_SHOVEL, - NETHERITE_SWORD, - NETHERRACK, - NETHER_BRICK("NETHER_BRICK_ITEM"), - NETHER_BRICKS("NETHER_BRICK"), - NETHER_BRICK_FENCE("NETHER_FENCE"), - NETHER_BRICK_SLAB(6, "STEP"), - NETHER_BRICK_STAIRS("SMOOTH_STAIRS"), - NETHER_BRICK_WALL, - NETHER_GOLD_ORE, - NETHER_PORTAL("PORTAL"), - NETHER_QUARTZ_ORE("QUARTZ_ORE"), - NETHER_SPROUTS, - NETHER_STAR, - /** - * Just like mentioned in https://minecraft.gamepedia.com/Nether_Wart - * Nether wart is also known as nether stalk in the code. - * NETHER_STALK is the planted state of nether warts. - */ - NETHER_WART("NETHER_WARTS", "NETHER_STALK"), - NETHER_WART_BLOCK, - NOTE_BLOCK, - OAK_BOAT("BOAT"), - OAK_BUTTON("WOOD_BUTTON"), - OAK_CHEST_BOAT, - OAK_DOOR("WOODEN_DOOR", "WOOD_DOOR"), - OAK_FENCE("FENCE"), - OAK_FENCE_GATE("FENCE_GATE"), - OAK_LEAVES("LEAVES"), - OAK_LOG("LOG"), - OAK_PLANKS("WOOD"), - OAK_PRESSURE_PLATE("WOOD_PLATE"), - OAK_SAPLING("SAPLING"), - OAK_SIGN("SIGN_POST", "SIGN"), - OAK_SLAB("WOOD_DOUBLE_STEP", "WOOD_STEP", "WOODEN_SLAB"), - OAK_STAIRS("WOOD_STAIRS"), - OAK_TRAPDOOR("TRAP_DOOR"), - OAK_WALL_SIGN("WALL_SIGN"), - OAK_WOOD("LOG"), - OBSERVER, - OBSIDIAN, - OCELOT_SPAWN_EGG(98, "MONSTER_EGG"), - OCHRE_FROGLIGHT, - ORANGE_BANNER(14, "STANDING_BANNER", "BANNER"), - ORANGE_BED(supports(12) ? 1 : 0, "BED_BLOCK", "BED"), - ORANGE_CANDLE, - ORANGE_CANDLE_CAKE, - ORANGE_CARPET(1, "CARPET"), - ORANGE_CONCRETE(1, "CONCRETE"), - ORANGE_CONCRETE_POWDER(1, "CONCRETE_POWDER"), - ORANGE_DYE(14, "INK_SACK"), - ORANGE_GLAZED_TERRACOTTA, - ORANGE_SHULKER_BOX, - ORANGE_STAINED_GLASS(1, "STAINED_GLASS"), - ORANGE_STAINED_GLASS_PANE(1, "STAINED_GLASS_PANE"), - ORANGE_TERRACOTTA(1, "STAINED_CLAY"), - ORANGE_TULIP(5, "RED_ROSE"), - ORANGE_WALL_BANNER(14, "WALL_BANNER"), - ORANGE_WOOL(1, "WOOL"), - OXEYE_DAISY(8, "RED_ROSE"), - OXIDIZED_COPPER, - OXIDIZED_CUT_COPPER, - OXIDIZED_CUT_COPPER_SLAB("STEP"), - OXIDIZED_CUT_COPPER_STAIRS("SMOOTH_STAIRS"), - PACKED_ICE, - PACKED_MUD, - PAINTING, - PANDA_SPAWN_EGG, - PAPER, - PARROT_SPAWN_EGG(105, "MONSTER_EGG"), - PEARLESCENT_FROGLIGHT, - PEONY(5, "DOUBLE_PLANT"), - PETRIFIED_OAK_SLAB("WOOD_STEP"), - PHANTOM_MEMBRANE, - PHANTOM_SPAWN_EGG, - PIGLIN_BANNER_PATTERN, - PIGLIN_BRUTE_SPAWN_EGG, - PIGLIN_SPAWN_EGG(57, "MONSTER_EGG"), - PIG_SPAWN_EGG(90, "MONSTER_EGG"), - PILLAGER_SPAWN_EGG, - PINK_BANNER(9, "STANDING_BANNER", "BANNER"), - PINK_BED(supports(12) ? 6 : 0, "BED_BLOCK", "BED"), - PINK_CANDLE, - PINK_CANDLE_CAKE, - PINK_CARPET(6, "CARPET"), - PINK_CONCRETE(6, "CONCRETE"), - PINK_CONCRETE_POWDER(6, "CONCRETE_POWDER"), - PINK_DYE(9, "INK_SACK"), - PINK_GLAZED_TERRACOTTA, - PINK_SHULKER_BOX, - PINK_STAINED_GLASS(6, "STAINED_GLASS"), - PINK_STAINED_GLASS_PANE(6, "THIN_GLASS", "STAINED_GLASS_PANE"), - PINK_TERRACOTTA(6, "STAINED_CLAY"), - PINK_TULIP(7, "RED_ROSE"), - PINK_WALL_BANNER(9, "WALL_BANNER"), - PINK_WOOL(6, "WOOL"), - PISTON("PISTON_BASE"), - PISTON_HEAD("PISTON_EXTENSION"), - PLAYER_HEAD(3, "SKULL", "SKULL_ITEM"), - PLAYER_WALL_HEAD(3, "SKULL", "SKULL_ITEM"), - PODZOL(2, "DIRT"), - POINTED_DRIPSTONE, - POISONOUS_POTATO, - POLAR_BEAR_SPAWN_EGG(102, "MONSTER_EGG"), - POLISHED_ANDESITE(6, "STONE"), - POLISHED_ANDESITE_SLAB("STEP"), - POLISHED_ANDESITE_STAIRS("SMOOTH_STAIRS"), - POLISHED_BASALT, - POLISHED_BLACKSTONE, - POLISHED_BLACKSTONE_BRICKS, - POLISHED_BLACKSTONE_BRICK_SLAB("STEP"), - POLISHED_BLACKSTONE_BRICK_STAIRS("SMOOTH_STAIRS"), - POLISHED_BLACKSTONE_BRICK_WALL, - POLISHED_BLACKSTONE_BUTTON, - POLISHED_BLACKSTONE_PRESSURE_PLATE, - POLISHED_BLACKSTONE_SLAB("STEP"), - POLISHED_BLACKSTONE_STAIRS("SMOOTH_STAIRS"), - POLISHED_BLACKSTONE_WALL, - POLISHED_DEEPSLATE, - POLISHED_DEEPSLATE_SLAB("STEP"), - POLISHED_DEEPSLATE_STAIRS("SMOOTH_STAIRS"), - POLISHED_DEEPSLATE_WALL, - POLISHED_DIORITE(4, "STONE"), - POLISHED_DIORITE_SLAB("STEP"), - POLISHED_DIORITE_STAIRS("SMOOTH_STAIRS"), - POLISHED_GRANITE(2, "STONE"), - POLISHED_GRANITE_SLAB("STEP"), - POLISHED_GRANITE_STAIRS("SMOOTH_STAIRS"), - POPPED_CHORUS_FRUIT("CHORUS_FRUIT_POPPED"), - POPPY("RED_ROSE"), - PORKCHOP("PORK"), - POTATO("POTATO_ITEM"), - POTATOES("POTATO"), - POTION, - POTTED_ACACIA_SAPLING(4, "FLOWER_POT"), - POTTED_ALLIUM(2, "RED_ROSE", "FLOWER_POT"), - POTTED_AZALEA_BUSH, - POTTED_AZURE_BLUET(3, "RED_ROSE", "FLOWER_POT"), - POTTED_BAMBOO, - POTTED_BIRCH_SAPLING(2, "FLOWER_POT"), - POTTED_BLUE_ORCHID(1, "RED_ROSE", "FLOWER_POT"), - POTTED_BROWN_MUSHROOM("FLOWER_POT"), - POTTED_CACTUS("FLOWER_POT"), - POTTED_CORNFLOWER, - POTTED_CRIMSON_FUNGUS, - POTTED_CRIMSON_ROOTS, - POTTED_DANDELION("YELLOW_FLOWER", "FLOWER_POT"), - POTTED_DARK_OAK_SAPLING(5, "FLOWER_POT"), - POTTED_DEAD_BUSH("FLOWER_POT"), - POTTED_FERN(2, "LONG_GRASS", "FLOWER_POT"), - POTTED_FLOWERING_AZALEA_BUSH, - POTTED_JUNGLE_SAPLING(3, "FLOWER_POT"), - POTTED_LILY_OF_THE_VALLEY, - POTTED_MANGROVE_PROPAGULE, - POTTED_OAK_SAPLING("FLOWER_POT"), - POTTED_ORANGE_TULIP(5, "RED_ROSE", "FLOWER_POT"), - POTTED_OXEYE_DAISY(8, "RED_ROSE", "FLOWER_POT"), - POTTED_PINK_TULIP(7, "RED_ROSE", "FLOWER_POT"), - POTTED_POPPY("RED_ROSE", "FLOWER_POT"), - POTTED_RED_MUSHROOM("FLOWER_POT"), - POTTED_RED_TULIP(4, "RED_ROSE", "FLOWER_POT"), - POTTED_SPRUCE_SAPLING(1, "FLOWER_POT"), - POTTED_WARPED_FUNGUS, - POTTED_WARPED_ROOTS, - POTTED_WHITE_TULIP(6, "RED_ROSE", "FLOWER_POT"), - POTTED_WITHER_ROSE, - POWDER_SNOW, - POWDER_SNOW_BUCKET, - POWDER_SNOW_CAULDRON, - POWERED_RAIL, - PRISMARINE, - PRISMARINE_BRICKS(1, "PRISMARINE"), - PRISMARINE_BRICK_SLAB("STEP"), - PRISMARINE_BRICK_STAIRS("SMOOTH_STAIRS"), - PRISMARINE_CRYSTALS, - PRISMARINE_SHARD, - PRISMARINE_SLAB("STEP"), - PRISMARINE_STAIRS("SMOOTH_STAIRS"), - PRISMARINE_WALL, - PUFFERFISH(3, "RAW_FISH"), - PUFFERFISH_BUCKET, - PUFFERFISH_SPAWN_EGG, - PUMPKIN, - PUMPKIN_PIE, - PUMPKIN_SEEDS, - PUMPKIN_STEM, - PURPLE_BANNER(5, "STANDING_BANNER", "BANNER"), - PURPLE_BED(supports(12) ? 10 : 0, "BED_BLOCK", "BED"), - PURPLE_CANDLE, - PURPLE_CANDLE_CAKE, - PURPLE_CARPET(10, "CARPET"), - PURPLE_CONCRETE(10, "CONCRETE"), - PURPLE_CONCRETE_POWDER(10, "CONCRETE_POWDER"), - PURPLE_DYE(5, "INK_SACK"), - PURPLE_GLAZED_TERRACOTTA, - PURPLE_SHULKER_BOX, - PURPLE_STAINED_GLASS(10, "STAINED_GLASS"), - PURPLE_STAINED_GLASS_PANE(10, "THIN_GLASS", "STAINED_GLASS_PANE"), - PURPLE_TERRACOTTA(10, "STAINED_CLAY"), - PURPLE_WALL_BANNER(5, "WALL_BANNER"), - PURPLE_WOOL(10, "WOOL"), - PURPUR_BLOCK, - PURPUR_PILLAR, - PURPUR_SLAB("PURPUR_DOUBLE_SLAB"), - PURPUR_STAIRS("SMOOTH_STAIRS"), - QUARTZ, - QUARTZ_BLOCK, - QUARTZ_BRICKS, - QUARTZ_PILLAR(2, "QUARTZ_BLOCK"), - QUARTZ_SLAB(7, "STEP"), - QUARTZ_STAIRS("SMOOTH_STAIRS"), - RABBIT, - RABBIT_FOOT, - RABBIT_HIDE, - RABBIT_SPAWN_EGG(101, "MONSTER_EGG"), - RABBIT_STEW, - RAIL("RAILS"), - RAVAGER_SPAWN_EGG, - RAW_COPPER, - RAW_COPPER_BLOCK, - RAW_GOLD, - RAW_GOLD_BLOCK, - RAW_IRON, - RAW_IRON_BLOCK, - RECOVERY_COMPASS, - REDSTONE, - REDSTONE_BLOCK, - /** - * Unlike redstone torch, REDSTONE_LAMP_ON isn't an item. - * The name is just here on the list for matching. - * - * @see #REDSTONE_TORCH - */ - REDSTONE_LAMP("REDSTONE_LAMP_ON", "REDSTONE_LAMP_OFF"), - REDSTONE_ORE("GLOWING_REDSTONE_ORE"), - /** - * REDSTONE_TORCH_OFF isn't an item, but a block. - * But REDSTONE_TORCH_ON is the item. - * The name is just here on the list for matching. - */ - REDSTONE_TORCH("REDSTONE_TORCH_OFF", "REDSTONE_TORCH_ON"), - REDSTONE_WALL_TORCH, - REDSTONE_WIRE, - RED_BANNER(1, "STANDING_BANNER", "BANNER"), - /** - * Data value 14 or 0 - */ - RED_BED(supports(12) ? 14 : 0, "BED_BLOCK", "BED"), - RED_CANDLE, - RED_CANDLE_CAKE, - RED_CARPET(14, "CARPET"), - RED_CONCRETE(14, "CONCRETE"), - RED_CONCRETE_POWDER(14, "CONCRETE_POWDER"), - RED_DYE(1, "INK_SACK", "ROSE_RED"), - RED_GLAZED_TERRACOTTA, - RED_MUSHROOM, - RED_MUSHROOM_BLOCK("RED_MUSHROOM", "HUGE_MUSHROOM_2"), - RED_NETHER_BRICKS("RED_NETHER_BRICK"), - RED_NETHER_BRICK_SLAB("STEP"), - RED_NETHER_BRICK_STAIRS("SMOOTH_STAIRS"), - RED_NETHER_BRICK_WALL, - RED_SAND(1, "SAND"), - RED_SANDSTONE, - RED_SANDSTONE_SLAB("DOUBLE_STONE_SLAB2", "STONE_SLAB2"), - RED_SANDSTONE_STAIRS("SMOOTH_STAIRS"), - RED_SANDSTONE_WALL, - RED_SHULKER_BOX, - RED_STAINED_GLASS(14, "STAINED_GLASS"), - RED_STAINED_GLASS_PANE(14, "THIN_GLASS", "STAINED_GLASS_PANE"), - RED_TERRACOTTA(14, "STAINED_CLAY"), - RED_TULIP(4, "RED_ROSE"), - RED_WALL_BANNER(1, "WALL_BANNER"), - RED_WOOL(14, "WOOL"), - REINFORCED_DEEPSLATE, - REPEATER("DIODE_BLOCK_ON", "DIODE_BLOCK_OFF", "DIODE"), - REPEATING_COMMAND_BLOCK("COMMAND", "COMMAND_REPEATING"), - RESPAWN_ANCHOR, - ROOTED_DIRT, - ROSE_BUSH(4, "DOUBLE_PLANT"), - ROTTEN_FLESH, - SADDLE, - SALMON(1, "RAW_FISH"), - SALMON_BUCKET, - SALMON_SPAWN_EGG, - SAND, - SANDSTONE, - SANDSTONE_SLAB(1, "DOUBLE_STEP", "STEP", "STONE_SLAB"), - SANDSTONE_STAIRS("SMOOTH_STAIRS"), - SANDSTONE_WALL, - SCAFFOLDING, - SCULK, - SCULK_CATALYST, - SCULK_SENSOR, - SCULK_SHRIEKER, - SCULK_VEIN, - SCUTE, - SEAGRASS, - SEA_LANTERN, - SEA_PICKLE, - SHEARS, - SHEEP_SPAWN_EGG(91, "MONSTER_EGG"), - SHIELD, - SHROOMLIGHT, - SHULKER_BOX("PURPLE_SHULKER_BOX"), - SHULKER_SHELL, - SHULKER_SPAWN_EGG(69, "MONSTER_EGG"), - SILVERFISH_SPAWN_EGG(60, "MONSTER_EGG"), - SKELETON_HORSE_SPAWN_EGG(28, "MONSTER_EGG"), - SKELETON_SKULL("SKULL", "SKULL_ITEM"), - SKELETON_SPAWN_EGG(51, "MONSTER_EGG"), - SKELETON_WALL_SKULL("SKULL", "SKULL_ITEM"), - SKULL_BANNER_PATTERN, - SLIME_BALL, - SLIME_BLOCK("STONE"), - SLIME_SPAWN_EGG(55, "MONSTER_EGG"), - SMALL_AMETHYST_BUD, - SMALL_DRIPLEAF, - SMITHING_TABLE, - SMOKER, - SMOOTH_BASALT, - SMOOTH_QUARTZ(0, 13), - SMOOTH_QUARTZ_SLAB(7, "STEP"), - SMOOTH_QUARTZ_STAIRS("SMOOTH_STAIRS"), - SMOOTH_RED_SANDSTONE(2, "RED_SANDSTONE"), - SMOOTH_RED_SANDSTONE_SLAB("STONE_SLAB2"), - SMOOTH_RED_SANDSTONE_STAIRS("SMOOTH_STAIRS"), - SMOOTH_SANDSTONE(2, "SANDSTONE"), - SMOOTH_SANDSTONE_SLAB("STEP"), - SMOOTH_SANDSTONE_STAIRS("SMOOTH_STAIRS"), - SMOOTH_STONE, - SMOOTH_STONE_SLAB("STEP"), - SNOW, - SNOWBALL("SNOW_BALL"), - SNOW_BLOCK, - SOUL_CAMPFIRE, - SOUL_FIRE, - SOUL_LANTERN, - SOUL_SAND, - SOUL_SOIL, - SOUL_TORCH, - SOUL_WALL_TORCH, - SPAWNER("MOB_SPAWNER"), - SPECTRAL_ARROW, - SPIDER_EYE, - SPIDER_SPAWN_EGG(52, "MONSTER_EGG"), - SPLASH_POTION, - SPONGE, - SPORE_BLOSSOM, - SPRUCE_BOAT("BOAT_SPRUCE"), - SPRUCE_BUTTON("WOOD_BUTTON"), - SPRUCE_CHEST_BOAT, - SPRUCE_DOOR("SPRUCE_DOOR", "SPRUCE_DOOR_ITEM"), - SPRUCE_FENCE, - SPRUCE_FENCE_GATE, - SPRUCE_LEAVES(1, "LEAVES"), - SPRUCE_LOG(1, "LOG"), - SPRUCE_PLANKS(1, "WOOD"), - SPRUCE_PRESSURE_PLATE("WOOD_PLATE"), - SPRUCE_SAPLING(1, "SAPLING"), - SPRUCE_SIGN("SIGN_POST", "SIGN"), - SPRUCE_SLAB(1, "WOOD_DOUBLE_STEP", "WOOD_STEP", "WOODEN_SLAB"), - SPRUCE_STAIRS("SPRUCE_WOOD_STAIRS"), - SPRUCE_TRAPDOOR("TRAP_DOOR"), - SPRUCE_WALL_SIGN("WALL_SIGN"), - SPRUCE_WOOD(1, "LOG"), - SPYGLASS, - SQUID_SPAWN_EGG(94, "MONSTER_EGG"), - STICK, - STICKY_PISTON("PISTON_BASE", "PISTON_STICKY_BASE"), - STONE, - STONECUTTER, - STONE_AXE, - STONE_BRICKS("SMOOTH_BRICK"), - STONE_BRICK_SLAB(5, "DOUBLE_STEP", "STEP", "STONE_SLAB"), - STONE_BRICK_STAIRS("SMOOTH_STAIRS"), - STONE_BRICK_WALL, - STONE_BUTTON, - STONE_HOE, - STONE_PICKAXE, - STONE_PRESSURE_PLATE("STONE_PLATE"), - STONE_SHOVEL("STONE_SPADE"), - STONE_SLAB("DOUBLE_STEP", "STEP"), - STONE_STAIRS("SMOOTH_STAIRS"), - STONE_SWORD, - STRAY_SPAWN_EGG(6, "MONSTER_EGG"), - STRIDER_SPAWN_EGG, - STRING, - STRIPPED_ACACIA_LOG("LOG_2"), - STRIPPED_ACACIA_WOOD("LOG_2"), - STRIPPED_BIRCH_LOG(2, "LOG"), - STRIPPED_BIRCH_WOOD(2, "LOG"), - STRIPPED_CRIMSON_HYPHAE, - STRIPPED_CRIMSON_STEM, - STRIPPED_DARK_OAK_LOG("LOG"), - STRIPPED_DARK_OAK_WOOD("LOG"), - STRIPPED_JUNGLE_LOG(3, "LOG"), - STRIPPED_JUNGLE_WOOD(3, "LOG"), - STRIPPED_MANGROVE_LOG, - STRIPPED_MANGROVE_WOOD, - STRIPPED_OAK_LOG("LOG"), - STRIPPED_OAK_WOOD("LOG"), - STRIPPED_SPRUCE_LOG(1, "LOG"), - STRIPPED_SPRUCE_WOOD(1, "LOG"), - STRIPPED_WARPED_HYPHAE, - STRIPPED_WARPED_STEM, - STRUCTURE_BLOCK, - /** - * Originally developers used barrier blocks for its purpose. - * So technically this isn't really considered as a suggested material. - */ - STRUCTURE_VOID(10, "BARRIER"), - SUGAR, - /** - * Sugar Cane is a known material in pre-1.13 - */ - SUGAR_CANE("SUGAR_CANE_BLOCK"), - SUNFLOWER("DOUBLE_PLANT"), - SUSPICIOUS_STEW, - SWEET_BERRIES, - SWEET_BERRY_BUSH, - TADPOLE_BUCKET, - TADPOLE_SPAWN_EGG, - TALL_GRASS(2, "DOUBLE_PLANT"), - TALL_SEAGRASS, - TARGET, - TERRACOTTA("HARD_CLAY"), - TINTED_GLASS, - TIPPED_ARROW(0, 9, "ARROW"), - TNT, - TNT_MINECART("EXPLOSIVE_MINECART"), - TORCH, - TOTEM_OF_UNDYING("TOTEM", "ARROW"), - TRADER_LLAMA_SPAWN_EGG(103, 14), - TRAPPED_CHEST, - TRIDENT, - TRIPWIRE, - TRIPWIRE_HOOK, - TROPICAL_FISH(2, "RAW_FISH"), - TROPICAL_FISH_BUCKET("BUCKET", "WATER_BUCKET"), - TROPICAL_FISH_SPAWN_EGG("MONSTER_EGG"), - TUBE_CORAL, - TUBE_CORAL_BLOCK, - TUBE_CORAL_FAN, - TUBE_CORAL_WALL_FAN, - TUFF, - TURTLE_EGG, - TURTLE_HELMET, - TURTLE_SPAWN_EGG, - TWISTING_VINES, - TWISTING_VINES_PLANT, - VERDANT_FROGLIGHT, - VEX_SPAWN_EGG(35, "MONSTER_EGG"), - VILLAGER_SPAWN_EGG(120, "MONSTER_EGG"), - VINDICATOR_SPAWN_EGG(36, "MONSTER_EGG"), - VINE, - /** - * 1.13 tag is not added because it's the same thing as {@link #AIR} - * - * @see #CAVE_AIR - */ - VOID_AIR("AIR"), - WALL_TORCH("TORCH"), - WANDERING_TRADER_SPAWN_EGG, - WARDEN_SPAWN_EGG, - WARPED_BUTTON, - WARPED_DOOR, - WARPED_FENCE, - WARPED_FENCE_GATE, - WARPED_FUNGUS, - WARPED_FUNGUS_ON_A_STICK, - WARPED_HYPHAE, - WARPED_NYLIUM, - WARPED_PLANKS, - WARPED_PRESSURE_PLATE, - WARPED_ROOTS, - WARPED_SIGN("SIGN_POST"), - WARPED_SLAB("STEP"), - WARPED_STAIRS("SMOOTH_STAIRS"), - WARPED_STEM, - WARPED_TRAPDOOR, - WARPED_WALL_SIGN("WALL_SIGN"), - WARPED_WART_BLOCK, - /** - * This is used for blocks only. - * In 1.13- WATER will turn into STATIONARY_WATER after it finished spreading. - * After 1.13+ this uses - * https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/data/Levelled.html water flowing system. - */ - WATER("STATIONARY_WATER"), - WATER_BUCKET, - WATER_CAULDRON, - WAXED_COPPER_BLOCK, - WAXED_CUT_COPPER, - WAXED_CUT_COPPER_SLAB("STEP"), - WAXED_CUT_COPPER_STAIRS("SMOOTH_STAIRS"), - WAXED_EXPOSED_COPPER, - WAXED_EXPOSED_CUT_COPPER, - WAXED_EXPOSED_CUT_COPPER_SLAB("STEP"), - WAXED_EXPOSED_CUT_COPPER_STAIRS("SMOOTH_STAIRS"), - WAXED_OXIDIZED_COPPER, - WAXED_OXIDIZED_CUT_COPPER, - WAXED_OXIDIZED_CUT_COPPER_SLAB("STEP"), - WAXED_OXIDIZED_CUT_COPPER_STAIRS("SMOOTH_STAIRS"), - WAXED_WEATHERED_COPPER, - WAXED_WEATHERED_CUT_COPPER, - WAXED_WEATHERED_CUT_COPPER_SLAB("STEP"), - WAXED_WEATHERED_CUT_COPPER_STAIRS("SMOOTH_STAIRS"), - WEATHERED_COPPER, - WEATHERED_CUT_COPPER, - WEATHERED_CUT_COPPER_SLAB("STEP"), - WEATHERED_CUT_COPPER_STAIRS("SMOOTH_STAIRS"), - WEEPING_VINES, - WEEPING_VINES_PLANT, - WET_SPONGE(1, "SPONGE"), - /** - * Wheat is a known material in pre-1.13 - */ - WHEAT("CROPS"), - WHEAT_SEEDS("SEEDS"), - WHITE_BANNER(15, "STANDING_BANNER", "BANNER"), - WHITE_BED("BED_BLOCK", "BED"), - WHITE_CANDLE, - WHITE_CANDLE_CAKE, - WHITE_CARPET("CARPET"), - WHITE_CONCRETE("CONCRETE"), - WHITE_CONCRETE_POWDER("CONCRETE_POWDER"), - WHITE_DYE(15, "INK_SACK", "BONE_MEAL"), - WHITE_GLAZED_TERRACOTTA, - WHITE_SHULKER_BOX, - WHITE_STAINED_GLASS("STAINED_GLASS"), - WHITE_STAINED_GLASS_PANE("THIN_GLASS", "STAINED_GLASS_PANE"), - WHITE_TERRACOTTA("STAINED_CLAY"), - WHITE_TULIP(6, "RED_ROSE"), - WHITE_WALL_BANNER(15, "WALL_BANNER"), - WHITE_WOOL("WOOL"), - WITCH_SPAWN_EGG(66, "MONSTER_EGG"), - WITHER_ROSE, - WITHER_SKELETON_SKULL(1, "SKULL", "SKULL_ITEM"), - WITHER_SKELETON_SPAWN_EGG(5, "MONSTER_EGG"), - WITHER_SKELETON_WALL_SKULL(1, "SKULL", "SKULL_ITEM"), - WOLF_SPAWN_EGG(95, "MONSTER_EGG"), - WOODEN_AXE("WOOD_AXE"), - WOODEN_HOE("WOOD_HOE"), - WOODEN_PICKAXE("WOOD_PICKAXE"), - WOODEN_SHOVEL("WOOD_SPADE"), - WOODEN_SWORD("WOOD_SWORD"), - WRITABLE_BOOK("BOOK_AND_QUILL"), - WRITTEN_BOOK, - YELLOW_BANNER(11, "STANDING_BANNER", "BANNER"), - YELLOW_BED(supports(12) ? 4 : 0, "BED_BLOCK", "BED"), - YELLOW_CANDLE, - YELLOW_CANDLE_CAKE, - YELLOW_CARPET(4, "CARPET"), - YELLOW_CONCRETE(4, "CONCRETE"), - YELLOW_CONCRETE_POWDER(4, "CONCRETE_POWDER"), - YELLOW_DYE(11, "INK_SACK", "DANDELION_YELLOW"), - YELLOW_GLAZED_TERRACOTTA, - YELLOW_SHULKER_BOX, - YELLOW_STAINED_GLASS(4, "STAINED_GLASS"), - YELLOW_STAINED_GLASS_PANE(4, "THIN_GLASS", "STAINED_GLASS_PANE"), - YELLOW_TERRACOTTA(4, "STAINED_CLAY"), - YELLOW_WALL_BANNER(11, "WALL_BANNER"), - YELLOW_WOOL(4, "WOOL"), - ZOGLIN_SPAWN_EGG, - ZOMBIE_HEAD(2, "SKULL", "SKULL_ITEM"), - ZOMBIE_HORSE_SPAWN_EGG(29, "MONSTER_EGG"), - ZOMBIE_SPAWN_EGG(54, "MONSTER_EGG"), - ZOMBIE_VILLAGER_SPAWN_EGG(27, "MONSTER_EGG"), - ZOMBIE_WALL_HEAD(2, "SKULL", "SKULL_ITEM"), - ZOMBIFIED_PIGLIN_SPAWN_EGG(57, "MONSTER_EGG", "ZOMBIE_PIGMAN_SPAWN_EGG"); - - /** - * Cached array of {@link CompMaterial#values()} to avoid allocating memory for - * calling the method every time. - * - * @since 2.0.0 - */ - private static final CompMaterial[] VALUES = values(); - - /** - * We don't want to use Enums#getIfPresent(Class, String) to avoid a few checks. - * - * @since 5.1.0 - */ - private static final Map NAMES = new HashMap<>(); - - /** - * The maximum data value in the pre-flattening update which belongs to {@link #VILLAGER_SPAWN_EGG}
- * https://minecraftitemids.com/types/spawn-egg - * - * @see #matchWithData(String) - * @since 8.0.0 - */ - private static final byte MAX_DATA_VALUE = 120; - - /** - * Used to tell the system that the passed object's (name or material) data value - * is not provided or is invalid. - * - * @since 8.0.0 - */ - private static final byte UNKNOWN_DATA_VALUE = -1; - - /** - * The maximum material ID before the pre-flattening update which belongs to {@link #MUSIC_DISC_WAIT} - * - * @since 8.1.0 - */ - private static final short MAX_ID = 2267; - - /** - * CompMaterial Paradox (Duplication Check) - *

- * A set of duplicated material names in 1.13 and 1.12 that will conflict with the legacy names. - * Values are the new material names. This map also contains illegal elements. Check the static initializer for more info. - *

- * Duplications are not useful at all in versions above the flattening update {@link Data#ISFLAT} - * This set is only used for matching materials, for parsing refer to {@link #isDuplicated()} - * - * @since 3.0.0 - */ - private static final Set DUPLICATED; - - static { - for (final CompMaterial material : VALUES) - NAMES.put(material.name(), material); - } - - static { - if (Data.ISFLAT) - // It's not needed at all if it's the newer version. We can save some memory. - DUPLICATED = null; - else { - // MELON_SLICE, CARROTS, POTATOES, BEETROOTS, GRASS_BLOCK, BRICKS, NETHER_BRICKS, BROWN_MUSHROOM - // Using the constructor to add elements will decide to allocate more size which we don't need. - DUPLICATED = new HashSet<>(4); - DUPLICATED.add(GRASS.name()); - DUPLICATED.add(MELON.name()); - DUPLICATED.add(BRICK.name()); - DUPLICATED.add(NETHER_BRICK.name()); - } - } - - /** - * The data value of this material pre-flattening. - * - * Can be accessed with {@link ItemStack#getData()} then {@code MaterialData#getData()} - * or {@link ItemStack#getDurability()} if not damageable. - */ - @Getter - private final byte data; - - private final byte version; - - private final String[] legacy; - - /** - * The cached Bukkit parsed material. - * - * @see #toMaterial() - * @since 9.0.0 - */ - @Getter - private final Material material; - - CompMaterial(int data, int version, String... legacy) { - this.data = (byte) data; - this.version = (byte) version; - this.legacy = legacy; - - Material mat = null; - - if (!Data.ISFLAT && this.isDuplicated() || (mat = Material.getMaterial(this.name())) == null) - for (int i = legacy.length - 1; i >= 0; i--) { - mat = Material.getMaterial(legacy[i]); - - if (mat != null) - break; - } - - this.material = mat == null ? Material.STONE : mat; - } - - CompMaterial(int data, String... legacy) { - this(data, 0, legacy); - } - - CompMaterial(int version) { - this(0, version); - } - - CompMaterial() { - this(0, 0); - } - - CompMaterial(String... legacy) { - this(0, 0, legacy); - } - - /** - * Convenience method for giving 1 piece of this material into a players inventory - * - * @param player - */ - public final void give(final Player player) { - this.give(player, 1); - } - - /** - * Convenience method for giving this material into a players inventory - * - * @param player - * @param amount - */ - public final void give(final Player player, final int amount) { - player.getInventory().addItem(this.toItem(amount)); - } - - /** - * Parses an item from this CompMaterial. - * Uses data values on older versions. - * - * @return an ItemStack with the same material (and data value if in older versions.) - * @see #setType(ItemStack) - */ - - public ItemStack toItem() { - return this.toItem(1); - } - - /** - * Parses an item from this CompMaterial. - * Uses data values on older versions. - * - * @return an ItemStack with the same material (and data value if in older versions.) - * @see #setType(ItemStack) - * - * @param amount - */ - - public ItemStack toItem(int amount) { - final Material material = this.toMaterial(); - - if (material == null) - return null; - - return Data.ISFLAT ? new ItemStack(material, amount) : new ItemStack(material, amount, this.data); - } - - /** - * Parses the material of this CompMaterial. - * - * @return the material related to this CompMaterial based on the server version. - * @since 1.0.0 - */ - - public Material toMaterial() { - return this.material; - } - - /** - * Return true if the {@link #getMaterial()} and the given Material matches. - *

- * NOT cross-version compatible. For this, use {@link #is(ItemStack)} - * - * @param mat - * @return - */ - public final boolean is(final Material mat) { - return this.material == mat; - } - - /** - * Evaluates whether a given {@link ItemStack} is equal material-wise. Takes - * data value in account if we are on Minecraft 1.13+ or older. - * - * @param comp the itemstack - * @return -see above- - */ - public final boolean is(final ItemStack comp) { - if (MinecraftVersion.atLeast(V.v1_13)) - return comp.getType() == this.material; - - return this.is(comp.getType(), comp.getData().getData()); - } - - /** - * Evaluates whether the given block equals this material - * - * @param block - * @return - */ - public final boolean is(final Block block) { - if (MinecraftVersion.atLeast(V.v1_13)) - return block.getType() == this.material; - - return block != null && this.is(block.getType(), block.getData()); - } - - /** - * Evaluates whether the given type/data equals this material - * - * @param type - * @param data - * @return - */ - public final boolean is(final Material type, final int data) { - if (MinecraftVersion.atLeast(V.v1_13)) - return type == this.material; - - if (type == this.toMaterial() && data == this.data) - return true; - - final CompMaterial compMat = fromMaterial(type); - - return isDamageable(compMat) && this.toMaterial() == type; - } - - /** - * Returns true for damageable materials. - * - * @return - */ - public final boolean isDamageable() { - return isDamageable(this); - } - - /** - * Return true if this class equals the given block, comparing data and {@link Material} type - * - * @param block - * @return - */ - public final boolean equals(Block block) { - return block.getData() == this.getData() && block.getType() == this.material; - } - - /** - * Returns true if the given material is damageable. - * - * @param type - * @return - */ - public static boolean isDamageable(final CompMaterial type) { - try { - if (MinecraftVersion.atLeast(V.v1_13)) - return type.toItem().getItemMeta() instanceof org.bukkit.inventory.meta.Damageable; - } catch (final Throwable t) { - // MC unsupported - } - - switch (type.toString()) { - case "HELMET": - case "CHESTPLATE": - case "LEGGINGS": - case "BOOTS": - case "SWORD": - case "AXE": - case "PICKAXE": - case "SHOVEL": - case "HOE": - case "ELYTRA": - case "TURTLE_HELMET": - case "TRIDENT": - case "HORSE_ARMOR": - case "SHEARS": - return true; - default: - return false; - } - } - - /** - * Return true if the given block is air - * - * @param block - * @return - */ - public static boolean isAir(final Block block) { - return block == null || isAir(block.getType()); - } - - /** - * Returns if the given item stack is air - * - * @param item - * @return - */ - public static boolean isAir(@Nullable ItemStack item) { - if (item == null) - return true; - - return isAir(item.getType()); - } - - /** - * Returns if the given material is air - * - * @param material - * @return - */ - public static boolean isAir(final Material material) { - return material == null || nameEquals(material, "AIR", "CAVE_AIR", "VOID_AIR", "LEGACY_AIR"); - } - - /** - * Returns true if the given material is a horse armor (prev. named barding). - * - * @param mat - * @return - */ - public static boolean isHorseArmor(final Material mat) { - return nameEquals(mat, "BARDING", "HORSE_ARMOR"); - } - - /** - * Returns true if the given material is a carpet (any variation). - * - * @param mat - * @return - */ - public static boolean isCarpet(final Material mat) { - return nameContains(mat, "CARPET"); - } - - /** - * Return true if the given material is leaves (any variation) - * - * @param mat - * @return - */ - public static boolean isLeaves(final Material mat) { - return mat.toString().endsWith("_LEAVES") || nameEquals(mat, "LEAVES", "LEAVES_2"); - } - - /** - * Returns true if the given material is a hard clay (any variations), later - * named terracotta. - * - * @param mat - * @return - */ - public static boolean isHardClay(final Material mat) { - return nameContains(mat, "STAINED_CLAY", "HARD_CLAY", "TERRACOTTA"); - } - - /** - * Returns true if the given material is a leash for horses. - * - * @param mat - * @return - */ - public static boolean isLeash(final Material mat) { - return nameEquals(mat, "LEASH", "LEAD"); - } - - /** - * Returns true if the given material is either gold or iron pressure plate. - * - * @param mat - * @return - */ - public static boolean isHeavyPressurePlate(final Material mat) { - return nameContains(mat, "IRON_PLATE", "GOLD_PLATE", "WEIGHTED_PRESSURE_PLATE"); - } - - /** - * Return true for all kinds of wood pressure plates - * - * @param mat - * @return - */ - public static boolean isWoodPressurePlate(final Material mat) { - return nameEquals(mat, "WOOD_PLATE", "ACACIA_PRESSURE_PLATE", "BIRCH_PRESSURE_PLATE", "DARK_OAK_PRESSURE_PLATE", - "JUNGLE_PRESSURE_PLATE", "OAK_PRESSURE_PLATE", "SPRUCE_PRESSURE_PLATE"); - } - - /** - * Returns true if the given material is a firework. - * - * @param mat - * @return - */ - public static boolean isFirework(final Material mat) { - return nameContains(mat, "FIREWORK"); - } - - /** - * Returns true if the given material is log (any variation). - * - * @param mat - * @return - */ - public static boolean isLog(final Material mat) { - return nameEquals(mat, "LOG", "LOG_2") || mat.toString().endsWith("_LOG"); - } - - /** - * Returns true if the given material is a bloat (that's right) (any variation). - * - * @param mat - * @return - */ - public static boolean isBoat(final Material mat) { - return nameContains(mat, "BOAT"); - } - - /** - * Returns true if the given material is a wood button (any variation). - * - * @param mat - * @return - */ - public static boolean isWoodButton(final Material mat) { - final String n = mat.toString(); - - return n.endsWith("_BUTTON") && !n.equals("STONE_BUTTON"); - } - - /** - * Returns true if the given material is a redstone lamp (any state). - * - * @param mat - * @return - */ - public static boolean isRedstoneLamp(final Material mat) { - return nameContains(mat, "REDSTONE_LAMP"); - } - - /** - * Returns true if the given material is a monster egg. - * - * @param mat - * @return - */ - public static boolean isMonsterEgg(final Material mat) { - return nameContains(mat, "MONSTER_EGG", "_SPAWN_EGG"); - } - - /** - * Returns true if the given material is a tree sapling (not potted). - * - * @param mat - * @return - */ - public static boolean isSapling(final Material mat) { - return nameContains(mat, "SAPLING") && !mat.toString().startsWith("POTTED"); - } - - /** - * Returns true if the given material is a wall sign (any variation). - * - * @param mat the material - * @return - */ - public static boolean isWallSign(final Material mat) { - return nameContains(mat, "WALL_SIGN"); - } - - /** - * Returns true if the given material is a dead shrub or a grass. - * - * @param mat - * @return - */ - public static boolean isLongGrass(final Material mat) { - return nameEquals(mat, "LONG_GRASS", "TALL_GRASS", "FERN", "DEAD_BUSH") && !mat.toString().startsWith("POTTED"); - } - - /** - * Returns true if the given material is normally 2 blocks tall when placed. - * - * @param mat - * @return - */ - public static boolean isDoublePlant(final Material mat) { - return nameEquals(mat, "DOUBLE_PLANT", "SUNFLOWER", "LILAC", "TALL_GRASS", "LARGE_FERN", "ROSE_BUSH", "PEONY", "TALL_SEAGRASS"); - } - - /** - * Returns true if the given material is a skull. - * - * @param mat - * @return - */ - public static boolean isSkull(final CompMaterial mat) { - return isSkull(mat.getMaterial()); - } - - /** - * Returns true if the given material is a skull. - * - * @param mat - * @return - */ - public static boolean isSkull(final Material mat) { - final String name = mat.toString(); - - return (name.endsWith("_HEAD") || name.endsWith("_SKULL")) && !name.contains("WALL"); - } - - /** - * Returns true if the given material is a trap door (any variation). - * - * @param mat - * @return - */ - public static boolean isTrapDoor(final Material mat) { - final String name = mat.toString(); - - return name.contains("TRAP_DOOR") || name.contains("TRAPDOOR"); - } - - // Utility method for evaluating matches. - private static boolean nameContains(final Material mat, final String... names) { - final String matName = mat.toString(); - - for (final String name : names) - if (matName.contains(name)) - return true; - - return false; - } - - // Utility method for evaluating matches. - private static boolean nameEquals(final Material mat, final String... names) { - final String matName = mat.toString(); - - for (final String name : names) - if (matName.equals(name)) - return true; - - return false; - } - - /* - * Gets the CompMaterial with this name similar to {@link #valueOf(String)} - * without throwing an exception. - * - * @param name the name of the material. - * - * @return an optional that can be empty. - * @since 5.1.0 - */ - - private static CompMaterial getIfPresent(String name) { - return NAMES.get(name); - } - - /* - * When using 1.13+, this helps to find the old material name - * with its data value using a cached search for optimization. - * - * @see #matchDefinedCompMaterial(String, byte) - * @since 1.0.0 - */ - - private static CompMaterial requestOldMaterial(String name, int data) { - - for (final CompMaterial material : VALUES) - // Not using material.name().equals(name) check is intended. - if ((data == UNKNOWN_DATA_VALUE || data == material.data) && material.anyMatchLegacy(name)) - return material; - - return null; - } - - /** - * Parses the given material name as an CompMaterial with a given data - * value in the string if attached. See matchWithData for more info. - * - * @param key - * @return - */ - public static CompMaterial fromString(String key) { - - // try to resolve common pitfalls and emulate the material enum writing style - key = key.replace(" ", "_").toUpperCase(); - - // Translate generic monster egg to sheep instead of the white unattributed egg on MC 1.13+ - if (MinecraftVersion.atLeast(V.v1_13) && key.equals("MONSTER_EGG")) - key = "SHEEP_SPAWN_EGG"; - - final CompMaterial oldMatch = matchWithData(key); - - return oldMatch != null ? oldMatch : fromLegacy(format(key), UNKNOWN_DATA_VALUE); - } - - /* - * Parses material name and data value from the specified string. - * The separator for the material name and its data value is {@code :} - * Spaces are allowed. Mostly used when getting materials from config for old school minecrafters. - *

- * Examples - *

-	 *     {@code INK_SACK:1 -> RED_DYE}
-	 *     {@code WOOL: 14  -> RED_WOOL}
-	 * 
- * - * @param name the material string that consists of the material name, data and separator character. - * - * @return the parsed CompMaterial. - * @see #matchCompMaterial(String) - * @since 3.0.0 - */ - private static CompMaterial matchWithData(String name) { - final int index = name.indexOf(':'); - - if (index != -1) { - final String mat = format(name.substring(0, index)); - - try { - // We don't use Byte.parseByte because we have our own range check. - final byte data = (byte) Integer.parseInt(name.substring(index + 1).replace(" ", "")); - return data >= 0 && data < MAX_DATA_VALUE ? fromLegacy(mat, data) : fromLegacy(mat, UNKNOWN_DATA_VALUE); - - } catch (final NumberFormatException ignored) { - return fromLegacy(mat, UNKNOWN_DATA_VALUE); - } - } - - return null; - } - - /** - * Return a {@link CompMaterial} from the given block, also comparing the data value - * - * @param block - * @return - */ - public static CompMaterial fromBlock(final Block block) { - return MinecraftVersion.atLeast(V.v1_13) ? fromMaterial(block.getType()) : fromLegacy(block.getType().toString(), block.getData()); - } - - /** - * Parses the given item as an CompMaterial using its material and data value (durability) - * if not a damageable item {@link ItemStack#getDurability()}. - * - * @param item the ItemStack to match. - * - * @return an CompMaterial if matched any. - * @throws IllegalArgumentException may be thrown as an unexpected exception. - * @see #fromMaterial(Material) - * @since 2.0.0 - */ - public static CompMaterial fromItem(@NonNull ItemStack item) { - final String material = item.getType().name(); - final byte data = (byte) (Data.ISFLAT || item.getType().getMaxDurability() > 0 ? 0 : item.getDurability()); - - final CompMaterial compmaterial = fromLegacy(material, data); - - // Exception for legacy eggs for non existing entities - if (material.equals("MONSTER_EGG") && compmaterial == null) - return CompMaterial.SHEEP_SPAWN_EGG; - - return compmaterial; - } - - /** - * Parses the given material as an CompMaterial. - * - * @param material - * @return - */ - public static CompMaterial fromMaterial(@NonNull Material material) { - final CompMaterial compmaterial = fromLegacy(material.name(), UNKNOWN_DATA_VALUE); - - return compmaterial; - } - - /** - * See {@link #fromString(String)}, with the addition that - * this method throws an error if the string could not be parsed - * - * @param key - * @return - */ - public static CompMaterial fromStringStrict(final String key) { - final CompMaterial material = fromString(key); - - return material; - } - - /** - * The main method that parses the given material name and data value as an CompMaterial. - * All the values passed to this method will not be null or empty and are formatted correctly. - * - * @param name - * @param data - * @return - */ - public static CompMaterial fromLegacy(String name, int data) { - - // try to resolve common pitfalls and emulate the material enum writing style - name = name.replace(" ", "_").toUpperCase(); - - // CompMaterial does not support legacy names - name = name.replace("LEGACY_", ""); - - Boolean duplicated = null; - final boolean isAMap = name.equalsIgnoreCase("MAP"); - - // Do basic number and boolean checks before accessing more complex enum stuff. - if (Data.ISFLAT || !isAMap && data <= 0 && !(duplicated = isDuplicated(name))) { - final CompMaterial compmaterial = getIfPresent(name); - - if (compmaterial != null) - return compmaterial; - } - // Usually flat versions wouldn't pass this point, but some special materials do. - - final CompMaterial oldCompmaterial = requestOldMaterial(name, data); - - if (oldCompmaterial == null) - // Special case. Refer to FILLED_MAP for more info. - return data >= 0 && isAMap ? FILLED_MAP : null; - - if (!Data.ISFLAT && oldCompmaterial.isPlural() && (duplicated == null ? isDuplicated(name) : duplicated)) - return getIfPresent(name); - - return oldCompmaterial; - } - - /* - * CompMaterial Paradox (Duplication Check) - * Checks if the material has any duplicates. - *

- * Example: - *

{@code MELON, CARROT, POTATO, BEETROOT -> true} - * - * @param name the name of the material to check. - * - * @return true if there's a duplicated material for this material, otherwise false. - * @since 2.0.0 - */ - private static boolean isDuplicated(String name) { - // Don't use matchCompMaterial() since this method is being called from matchCompMaterial() itself and will cause a StackOverflowError. - return DUPLICATED.contains(name); - } - - /** - * Gets the CompMaterial based on the material's ID (Magic Value) and data value.
- * You should avoid using this for performance issues. - * - * @param id the ID (Magic value) of the material. - * @param data the data value of the material. - * - * @return a parsed CompMaterial with the same ID and data value. - * @see #fromItem(ItemStack) - * @since 2.0.0 - */ - public static CompMaterial fromId(int id, byte data) { - if (id < 0 || id > MAX_ID || data < 0) - return null; - - for (final CompMaterial materials : VALUES) - if (materials.data == data && materials.getId() == id) - return materials; - - return null; - } - - /** - * Attempts to build the string like an enum name. - * Removes all the spaces, and extra non-English characters. Also removes some config/in-game based strings. - * While this method is hard to maintain, it's extremely efficient. It's approximately more than x5 times faster than - * the normal RegEx + String Methods approach for both formatted and unformatted material names. - * - * @param name the material name to modify. - * - * @return an enum name. - * @since 2.0.0 - */ - protected static String format(String name) { - final int len = name.length(); - final char[] chs = new char[len]; - int count = 0; - boolean appendUnderline = false; - - for (int i = 0; i < len; i++) { - final char ch = name.charAt(i); - - if (!appendUnderline && count != 0 && (ch == '-' || ch == ' ' || ch == '_') && chs[count] != '_') - appendUnderline = true; - else { - boolean number = false; - // Old materials have numbers in them. - if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z' || (number = ch >= '0' && ch <= '9')) { - if (appendUnderline) { - chs[count++] = '_'; - appendUnderline = false; - } - - if (number) - chs[count++] = ch; - else - chs[count++] = (char) (ch & 0x5f); - } - } - } - - return new String(chs, 0, count); - } - - /* - * Checks if the specified version is the same version or higher than the current server version. - * - * @param version the major version to be checked. "1." is ignored. E.g. 1.12 = 12 | 1.9 = 9 - * - * @return true of the version is equal or higher than the current version. - * @since 2.0.0 - */ - private static boolean supports(int version) { - return Data.VERSION >= version; - } - - /* - * Gets the exact major version (..., 1.9, 1.10, ..., 1.14) - * In most cases, you shouldn't be using this method. - * - * @param version Supports {@link Bukkit#getVersion()}, {@link Bukkit#getBukkitVersion()} and normal formats such as "1.14" - * - * @return the exact major version. - * @see #supports(int) - * @see #getVersion() - * @see #getMaterialVersion() - * @since 2.0.0 - */ - - private static String getMajorVersion(@NonNull String version) { - - // getVersion() - int index = version.lastIndexOf("MC:"); - if (index != -1) - version = version.substring(index + 4, version.length() - 1); - else if (version.endsWith("SNAPSHOT")) { - // getBukkitVersion() - index = version.indexOf('-'); - version = version.substring(0, index); - } - - // 1.13.2, 1.14.4, etc... - final int lastDot = version.lastIndexOf('.'); - if (version.indexOf('.') != lastDot) - version = version.substring(0, lastDot); - - return version; - } - - /* - * CompMaterial Paradox (Duplication Check) - * I've concluded that this is just an infinite loop that keeps - * going around the Singular Form and the Plural Form materials. A waste of brain cells and a waste of time. - * This solution works just fine anyway. - *

- * A solution for CompMaterial Paradox. - * Manually parses the duplicated materials to find the exact material based on the server version. - * If the name ends with "S" -> Plural Form Material. - * Plural methods are only plural if they're also {@link #DUPLICATED} - *

- * The only special exceptions are {@link #BRICKS} and {@link #NETHER_BRICKS} - * - * @return true if this material is a plural form material, otherwise false. - * @since 8.0.0 - */ - private boolean isPlural() { - // this.name().charAt(this.name().length() - 1) == 'S' - return this == CARROTS || this == POTATOES; - } - - /** - * Checks if the list of given material names matches the given base material. - * Mostly used for configs. - *

- * Supports {@link String#contains} {@code CONTAINS:NAME} formats. - *

- * Example: - *

-	 *     CompMaterial material = {@link #fromItem(ItemStack)};
-	 *     if (material.isOneOf(plugin.getConfig().getStringList("disabled-items")) return;
-	 * 
- *
- * {@code CONTAINS} Examples: - *
-	 *     {@code "CONTAINS:CHEST" -> CHEST, ENDERCHEST, TRAPPED_CHEST -> true}
-	 *     {@code "cOnTaINS:dYe" -> GREEN_DYE, YELLOW_DYE, BLUE_DYE, INK_SACK -> true}
-	 * 
- *

- * The reason that there are tags for {@code CONTAINS} is for the performance. - * - *

- * - * @param materials the material names to check base material on. - * - * @return true if one of the given material names is similar to the base material. - * @since 3.1.1 - */ - public boolean isOneOf(Collection materials) { - if (materials == null || materials.isEmpty()) - return false; - final String name = this.name(); - - for (String comp : materials) { - final String checker = comp.toUpperCase(Locale.ENGLISH); - if (checker.startsWith("CONTAINS:")) { - comp = format(checker.substring(9)); - - if (name.contains(comp)) - return true; - - continue; - } - - // Direct Object Equals - final CompMaterial xMat = fromString(comp); - - if (xMat != null && xMat == this) - return true; - } - return false; - } - - /** - * Sets the {@link Material} (and data value on older versions) of an item. - * Damageable materials will not have their durability changed. - *

- * Use {@link #toItem()} instead when creating new ItemStacks. - * - * @param item the item to change its type. - * @return - * - * @see #toItem() - * @since 3.0.0 - */ - public ItemStack setType(ItemStack item) { - Objects.requireNonNull(item, "Cannot set material for null ItemStack"); - final Material material = this.toMaterial(); - Objects.requireNonNull(material, () -> "Unsupported material: " + this.name()); - - item.setType(material); - if (!Data.ISFLAT && material.getMaxDurability() <= 0) - item.setDurability(this.data); - - return item; - } - - /* - * Checks if the given material name matches any of this CompMaterial's legacy material names. - * All the values passed to this method will not be null or empty and are formatted correctly. - * - * @param name the material name to check. - * - * @return true if it's one of the legacy names, otherwise false. - * @since 2.0.0 - */ - private boolean anyMatchLegacy(String name) { - for (int i = this.legacy.length - 1; i >= 0; i--) - if (name.equals(this.legacy[i])) - return true; - return false; - } - - /** - * Gets the ID (Magic value) of the material. - * https://www.minecraftinfo.com/idlist.htm - * - * @return the ID of the material or -1 if it's not a legacy material or the server doesn't support the material. - * @see #fromId(int, byte) - * @since 2.2.0 - */ - public int getId() { - if (this.data != 0 || this.version >= 13) - return -1; - - final Material material = this.toMaterial(); - - if (material == null) - return -1; - - try { - if (Data.ISFLAT && !material.isLegacy()) - return -1; - } catch (final Throwable t) { - } - - return material.getId(); - } - - /* - * This method is needed due to Java enum initialization limitations. - * It's really inefficient yes, but it's only used for initialization. - *

- * Yes there are many other ways like comparing the hardcoded ordinal or using a boolean in the enum constructor, - * but it's not really a big deal. - *

- * This method should not be called if the version is after the flattening update {@link Data#ISFLAT} - * and is only used for parsing materials, not matching, for matching check {@link #DUPLICATED} - */ - private boolean isDuplicated() { - switch (this.name()) { - case "MELON": - case "CARROT": - case "POTATO": - case "GRASS": - case "BRICK": - case "NETHER_BRICK": - - // Illegal Elements - // Since both 1.12 and 1.13 have _DOOR CompMaterial will use it - // for 1.12 to parse the material, but it needs _DOOR_ITEM. - // We'll trick CompMaterial into thinking this needs to be parsed - // using the old methods. - // Some of these materials have their enum name added to the legacy list as well. - case "DARK_OAK_DOOR": - case "ACACIA_DOOR": - case "BIRCH_DOOR": - case "JUNGLE_DOOR": - case "SPRUCE_DOOR": - case "MAP": - case "CAULDRON": - case "BREWING_STAND": - case "FLOWER_POT": - return true; - default: - return false; - } - } - - /** - * Used for datas that need to be accessed during enum initilization. - * - * @since 9.0.0 - */ - private static final class Data { - /** - * The current version of the server in the a form of a major version. - * If the static initialization for this fails, you know something's wrong with the server software. - * - * @since 1.0.0 - */ - private static final int VERSION = Integer.parseInt(getMajorVersion(Bukkit.getVersion()).substring(2)); - /** - * Cached result if the server version is after the v1.13 flattening update. - * - * @since 3.0.0 - */ - private static final boolean ISFLAT = supports(13); - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/utils/compat/MinecraftVersion.java b/src/main/java/me/nvus/xprison/utils/compat/MinecraftVersion.java deleted file mode 100644 index 3b7c7a6..0000000 --- a/src/main/java/me/nvus/xprison/utils/compat/MinecraftVersion.java +++ /dev/null @@ -1,199 +0,0 @@ -package me.nvus.xprison.utils.compat; - -import lombok.Getter; -import org.bukkit.Bukkit; - -/** - * Represents the current Minecraft version the plugin loaded on - */ -public final class MinecraftVersion { - - /** - * The string representation of the version, for example V1_13 - */ - private static String serverVersion; - - /** - * The wrapper representation of the version - */ - @Getter - private static V current; - - /** - * The version wrapper - */ - public enum V { - v1_20(20), - v1_19(19), - v1_18(18), - v1_17(17), - v1_16(16), - v1_15(15), - v1_14(14), - v1_13(13), - v1_12(12), - v1_11(11), - v1_10(10), - v1_9(9), - v1_8(8), - v1_7(7), - v1_6(6), - v1_5(5), - v1_4(4), - v1_3_AND_BELOW(3); - - /** - * The numeric version (the second part of the 1.x number) - */ - private final int minorVersionNumber; - - /** - * Is this library tested with this Minecraft version? - */ - @Getter - private final boolean tested; - - /** - * Creates new enum for a MC version that is tested - * - * @param version - */ - V(int version) { - this(version, true); - } - - /** - * Creates new enum for a MC version - * - * @param version - * @param tested - */ - V(int version, boolean tested) { - this.minorVersionNumber = version; - this.tested = tested; - } - - /** - * Attempts to get the version from number - * - * @param number - * @return - * @throws RuntimeException if number not found - */ - private static V parse(int number) { - for (final V v : values()) { - if (v.minorVersionNumber == number) { - return v; - } - } - return null; - } - - /** - * @see java.lang.Enum#toString() - */ - @Override - public String toString() { - return "1." + this.minorVersionNumber; - } - } - - /** - * Does the current Minecraft version equal the given version? - * - * @param version - * @return - */ - public static boolean equals(V version) { - return compareWith(version) == 0; - } - - /** - * Is the current Minecraft version older than the given version? - * - * @param version - * @return - */ - public static boolean olderThan(V version) { - return compareWith(version) < 0; - } - - /** - * Is the current Minecraft version newer than the given version? - * - * @param version - * @return - */ - public static boolean newerThan(V version) { - return compareWith(version) > 0; - } - - /** - * Is the current Minecraft version at equals or newer than the given version? - * - * @param version - * @return - */ - public static boolean atLeast(V version) { - return equals(version) || newerThan(version); - } - - // Compares two versions by the number - private static int compareWith(V version) { - try { - return getCurrent().minorVersionNumber - version.minorVersionNumber; - - } catch (final Throwable t) { - t.printStackTrace(); - - return 0; - } - } - - /** - * Return the class versioning such as v1_14_R1 - * - * @return - */ - public static String getServerVersion() { - return serverVersion.equals("craftbukkit") ? "" : serverVersion; - } - - // Initialize the version - static { - try { - - final String packageName = Bukkit.getServer() == null ? "" : Bukkit.getServer().getClass().getPackage().getName(); - final String curr = packageName.substring(packageName.lastIndexOf('.') + 1); - final boolean hasGatekeeper = !"craftbukkit".equals(curr) && !"".equals(packageName); - - serverVersion = curr; - - if (hasGatekeeper) { - int pos = 0; - - for (final char ch : curr.toCharArray()) { - pos++; - - if (pos > 2 && ch == 'R') - break; - } - - final String numericVersion = curr.substring(1, pos - 2).replace("_", "."); - - int found = 0; - - for (final char ch : numericVersion.toCharArray()) - if (ch == '.') - found++; - - current = V.parse(Integer.parseInt(numericVersion.split("\\.")[1])); - - } else - current = V.v1_3_AND_BELOW; - - } catch (final Throwable t) { - t.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/utils/economy/EconomyUtils.java b/src/main/java/me/nvus/xprison/utils/economy/EconomyUtils.java deleted file mode 100644 index 09351ec..0000000 --- a/src/main/java/me/nvus/xprison/utils/economy/EconomyUtils.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.nvus.xprison.utils.economy; - -import me.nvus.xprison.XPrison; -import net.milkbowl.vault.economy.Economy; -import net.milkbowl.vault.economy.EconomyResponse; -import org.bukkit.entity.Player; - -public class EconomyUtils { - - private static final Economy ECONOMY = XPrison.getInstance().getEconomy(); - - public static EconomyResponse deposit(Player player, double amount) { - return ECONOMY.depositPlayer(player, amount); - } - - public static EconomyResponse withdraw(Player player, double amount) { - return ECONOMY.withdrawPlayer(player, amount); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/gui/ClearDBGui.java b/src/main/java/me/nvus/xprison/utils/gui/ClearDBGui.java deleted file mode 100644 index 1098e48..0000000 --- a/src/main/java/me/nvus/xprison/utils/gui/ClearDBGui.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.nvus.xprison.utils.gui; - -import me.nvus.xprison.XPrison; -import me.nvus.xprison.XPrisonModule; -import me.nvus.xprison.utils.player.PlayerUtils; -import org.bukkit.entity.Player; - -import java.util.Collection; - -public class ClearDBGui extends ConfirmationGui { - - private final XPrisonModule module; - - public ClearDBGui(Player player, XPrisonModule module) { - super(player, module == null ? "Clear all player data?" : "Clear data for " + module.getName() + "?"); - this.module = module; - } - - @Override - public void confirm(boolean confirm) { - if (confirm) { - if (this.module == null) { - this.getAllModules().forEach(XPrisonModule::resetPlayerData); - PlayerUtils.sendMessage(this.getPlayer(), "&aX-Prison - All Modules Data have been reset."); - } else { - this.module.resetPlayerData(); - PlayerUtils.sendMessage(this.getPlayer(), "&aX-Prison - DB Player data for module " + module.getName() + " has been reset."); - } - } - this.close(); - } - - private Collection getAllModules() { - return XPrison.getInstance().getModules(); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/gui/ConfirmationGui.java b/src/main/java/me/nvus/xprison/utils/gui/ConfirmationGui.java deleted file mode 100644 index f26dad2..0000000 --- a/src/main/java/me/nvus/xprison/utils/gui/ConfirmationGui.java +++ /dev/null @@ -1,51 +0,0 @@ -package me.nvus.xprison.utils.gui; - -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import me.lucko.helper.menu.Gui; -import me.lucko.helper.menu.Item; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -public abstract class ConfirmationGui extends Gui { - - private static final ItemStack YES_ITEM = ItemStackBuilder.of(CompMaterial.GREEN_STAINED_GLASS_PANE.toItem()).name("&aYES").build(); - private static final ItemStack NO_ITEM = ItemStackBuilder.of(CompMaterial.RED_STAINED_GLASS_PANE.toItem()).name("&cNO").build(); - - public ConfirmationGui(Player player, String title) { - super(player, 6, title); - } - - @Override - public void redraw() { - if (isFirstDraw()) { - - this.setItem(13, this.getInfoItem()); - for (int i = 19; i < 22; i++) { - this.setItem(i, getItem(true)); - this.setItem(i + 9, getItem(true)); - this.setItem(i + 18, getItem(true)); - } - for (int i = 23; i < 26; i++) { - this.setItem(i, getItem(false)); - this.setItem(i + 9, getItem(false)); - this.setItem(i + 18, getItem(false)); - } - } - } - - - public abstract void confirm(boolean confirm); - - - private Item getItem(boolean action) { - return ItemStackBuilder.of(action ? YES_ITEM : NO_ITEM).build(() -> { - confirm(action); - }); - } - - - private Item getInfoItem() { - return ItemStackBuilder.of(CompMaterial.BOOK.toItem()).name(this.getInitialTitle()).lore("&c&lWARNING!", "&7This action cannot be undone.").buildItem().build(); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/inventory/InventoryUtils.java b/src/main/java/me/nvus/xprison/utils/inventory/InventoryUtils.java deleted file mode 100644 index c94f8d3..0000000 --- a/src/main/java/me/nvus/xprison/utils/inventory/InventoryUtils.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.nvus.xprison.utils.inventory; - -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -public final class InventoryUtils { - - private InventoryUtils() { - throw new UnsupportedOperationException("Cannot instantiate."); - } - - public static boolean hasSpace(Inventory inventory) { - return inventory.firstEmpty() != -1; - } - - public static int getInventorySlot(Player player, ItemStack item) { - if (item == null) { - return -1; - } - for (int i = 0; i < player.getInventory().getSize(); i++) { - ItemStack item1 = player.getInventory().getItem(i); - - if (item1 == null) { - continue; - } - - if (item1.equals(item)) { - return i; - } - } - return -1; - } -} diff --git a/src/main/java/me/nvus/xprison/utils/item/ItemStackBuilder.java b/src/main/java/me/nvus/xprison/utils/item/ItemStackBuilder.java deleted file mode 100644 index d2af155..0000000 --- a/src/main/java/me/nvus/xprison/utils/item/ItemStackBuilder.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * This file is part of helper, licensed under the MIT License. - * - * Copyright (c) lucko (Luck) - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package me.nvus.xprison.utils.item; - -import me.nvus.xprison.utils.text.TextUtils; -import me.lucko.helper.menu.Item; -import me.lucko.helper.utils.annotation.NonnullByDefault; -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.LeatherArmorMeta; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Consumer; - -/** - * Easily construct {@link ItemStack} instances - */ -@NonnullByDefault -public final class ItemStackBuilder { - private static final ItemFlag[] ALL_FLAGS = new ItemFlag[]{ - ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES, - ItemFlag.HIDE_UNBREAKABLE, ItemFlag.HIDE_POTION_EFFECTS, - ItemFlag.HIDE_DESTROYS, ItemFlag.HIDE_PLACED_ON - }; - - private final ItemStack itemStack; - - public static ItemStackBuilder of(Material material) { - return new ItemStackBuilder(new ItemStack(material)).hideAttributes(); - } - - public static ItemStackBuilder of(ItemStack itemStack) { - return new ItemStackBuilder(itemStack).hideAttributes(); - } - - private ItemStackBuilder(ItemStack itemStack) { - this.itemStack = Objects.requireNonNull(itemStack, "itemStack"); - } - - public ItemStackBuilder transform(Consumer is) { - is.accept(this.itemStack); - return this; - } - - public ItemStackBuilder transformMeta(Consumer meta) { - ItemMeta m = this.itemStack.getItemMeta(); - if (m != null) { - meta.accept(m); - this.itemStack.setItemMeta(m); - } - return this; - } - - public ItemStackBuilder name(String name) { - return transformMeta(meta -> meta.setDisplayName(TextUtils.applyColor(name))); - } - - public ItemStackBuilder type(Material material) { - return transform(itemStack -> itemStack.setType(material)); - } - - public ItemStackBuilder lore(String line) { - return transformMeta(meta -> { - List lore = meta.getLore() == null ? new ArrayList<>() : meta.getLore(); - lore.add(TextUtils.applyColor(line)); - meta.setLore(lore); - }); - } - - public ItemStackBuilder lore(String... lines) { - return transformMeta(meta -> { - List lore = meta.getLore() == null ? new ArrayList<>() : meta.getLore(); - for (String line : lines) { - lore.add(TextUtils.applyColor(line)); - } - meta.setLore(lore); - }); - } - - public ItemStackBuilder lore(Iterable lines) { - return transformMeta(meta -> { - List lore = meta.getLore() == null ? new ArrayList<>() : meta.getLore(); - for (String line : lines) { - lore.add(TextUtils.applyColor(line)); - } - meta.setLore(lore); - }); - } - - public ItemStackBuilder clearLore() { - return transformMeta(meta -> meta.setLore(new ArrayList<>())); - } - - public ItemStackBuilder durability(int durability) { - return transform(itemStack -> itemStack.setDurability((short) durability)); - } - - public ItemStackBuilder data(int data) { - return durability(data); - } - - public ItemStackBuilder amount(int amount) { - return transform(itemStack -> itemStack.setAmount(amount)); - } - - public ItemStackBuilder enchant(Enchantment enchantment, int level) { - return transform(itemStack -> itemStack.addUnsafeEnchantment(enchantment, level)); - } - - public ItemStackBuilder enchant(Enchantment enchantment) { - return transform(itemStack -> itemStack.addUnsafeEnchantment(enchantment, 1)); - } - - public ItemStackBuilder clearEnchantments() { - return transform(itemStack -> itemStack.getEnchantments().keySet().forEach(itemStack::removeEnchantment)); - } - - public ItemStackBuilder flag(ItemFlag... flags) { - return transformMeta(meta -> meta.addItemFlags(flags)); - } - - public ItemStackBuilder unflag(ItemFlag... flags) { - return transformMeta(meta -> meta.removeItemFlags(flags)); - } - - public ItemStackBuilder hideAttributes() { - return flag(ALL_FLAGS); - } - - public ItemStackBuilder showAttributes() { - return unflag(ALL_FLAGS); - } - - public ItemStackBuilder color(Color color) { - return transform(itemStack -> { - Material type = itemStack.getType(); - if (type == Material.LEATHER_BOOTS || type == Material.LEATHER_CHESTPLATE || type == Material.LEATHER_HELMET || type == Material.LEATHER_LEGGINGS) { - LeatherArmorMeta meta = (LeatherArmorMeta) itemStack.getItemMeta(); - meta.setColor(color); - itemStack.setItemMeta(meta); - } - }); - } - - public ItemStackBuilder breakable(boolean flag) { - return transformMeta(meta -> meta.setUnbreakable(!flag)); - } - - public ItemStackBuilder apply(Consumer consumer) { - consumer.accept(this); - return this; - } - - public ItemStack build() { - return this.itemStack; - } - - public Item.Builder buildItem() { - return Item.builder(build()); - } - - public Item build(@Nullable Runnable handler) { - return buildItem().bind(handler, ClickType.RIGHT, ClickType.LEFT).build(); - } - - public Item build(ClickType type, @Nullable Runnable handler) { - return buildItem().bind(type, handler).build(); - } - - public Item build(@Nullable Runnable rightClick, @Nullable Runnable leftClick) { - return buildItem().bind(ClickType.RIGHT, rightClick).bind(ClickType.LEFT, leftClick).build(); - } - - public Item buildFromMap(Map handlers) { - return buildItem().bindAllRunnables(handlers.entrySet()).build(); - } - - public Item buildConsumer(@Nullable Consumer handler) { - return buildItem().bind(handler, ClickType.RIGHT, ClickType.LEFT).build(); - } - - public Item buildConsumer(ClickType type, @Nullable Consumer handler) { - return buildItem().bind(type, handler).build(); - } - - public Item buildConsumer(@Nullable Consumer rightClick, @Nullable Consumer leftClick) { - return buildItem().bind(ClickType.RIGHT, rightClick).bind(ClickType.LEFT, leftClick).build(); - } - - public Item buildFromConsumerMap(Map> handlers) { - return buildItem().bindAllConsumers(handlers.entrySet()).build(); - } - -} \ No newline at end of file diff --git a/src/main/java/me/nvus/xprison/utils/item/PrisonItem.java b/src/main/java/me/nvus/xprison/utils/item/PrisonItem.java deleted file mode 100644 index 1884b74..0000000 --- a/src/main/java/me/nvus/xprison/utils/item/PrisonItem.java +++ /dev/null @@ -1,71 +0,0 @@ -package me.nvus.xprison.utils.item; - -import com.saicone.rtag.RtagItem; -import me.nvus.xprison.enchants.model.XPrisonEnchantment; -import me.nvus.xprison.enchants.repo.EnchantsRepository; -import org.bukkit.inventory.ItemStack; - -import java.util.HashMap; -import java.util.Map; - -public class PrisonItem extends RtagItem { - - private static final String MAIN = "upc"; - - public PrisonItem(ItemStack item) { - super(item); - } - - public Map getEnchants(EnchantsRepository repository) { - final Map enchants = new HashMap<>(); - final Map map = get(MAIN, "enchants"); - if (map != null) { - map.forEach((id, level) -> enchants.put(repository.getEnchantBy(id), (int) level)); - } - return enchants; - } - - public int getEnchantLevel(XPrisonEnchantment enchant) { - return getOptional(MAIN, "enchants", String.valueOf(enchant.getId())).or(0); - } - - public long getBrokenBlocks() { - return getOptional(MAIN, "blocks").or(0L); - } - - public Long getGems() { - return get(MAIN, "gems"); - } - - public Integer getLevel() { - return get(MAIN, "level"); - } - - public Long getTokens() { - return get(MAIN, "tokens"); - } - - public void setEnchant(XPrisonEnchantment enchant, int level) { - if (level > 0) { - set(level, MAIN, "enchants", String.valueOf(enchant.getId())); - } else { - remove(MAIN, "enchants", String.valueOf(enchant.getId())); - } - } - - public void setGems(long amount) { - set(amount, MAIN, "gems"); - } - - public void setLevel(int level) { - set(level, MAIN, "level"); - } - - public void setTokens(long amount) { - set(amount, MAIN, "tokens"); - } - - public void addBrokenBlocks(int amount) { - set(getBrokenBlocks() + amount, MAIN, "blocks"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/location/LocationUtils.java b/src/main/java/me/nvus/xprison/utils/location/LocationUtils.java deleted file mode 100644 index 22c3db2..0000000 --- a/src/main/java/me/nvus/xprison/utils/location/LocationUtils.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.nvus.xprison.utils.location; - -import org.bukkit.Location; - -public class LocationUtils { - - public static final String INVALID_LOCATION = "Invalid Location"; - - public static String toXYZW(Location location) { - if (location == null) { - return INVALID_LOCATION; - } - return "X: " + - location.getBlockX() + - ", " + - "Y: " + - location.getBlockY() + - ", " + - "Z: " + - location.getBlockZ() + - ", " + - "World: " + - location.getWorld().getName(); - } - - private LocationUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/misc/MapUtil.java b/src/main/java/me/nvus/xprison/utils/misc/MapUtil.java deleted file mode 100644 index c2f2247..0000000 --- a/src/main/java/me/nvus/xprison/utils/misc/MapUtil.java +++ /dev/null @@ -1,25 +0,0 @@ -package me.nvus.xprison.utils.misc; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.stream.Collectors; - -public class MapUtil { - public static > Map sortByValue - (Map map) { - - return map.entrySet() - .stream() - .sorted(Map.Entry.comparingByValue().reversed()) - .collect(Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue, - (e1, e2) -> e1, - LinkedHashMap::new - )); - } - - private MapUtil() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/misc/MaterialUtils.java b/src/main/java/me/nvus/xprison/utils/misc/MaterialUtils.java deleted file mode 100644 index f2e8592..0000000 --- a/src/main/java/me/nvus/xprison/utils/misc/MaterialUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.nvus.xprison.utils.misc; - -import me.nvus.xprison.utils.compat.CompMaterial; -import org.bukkit.block.Block; -import org.bukkit.inventory.ItemStack; - -public class MaterialUtils { - - public static ItemStack getSmeltedFormAsItemStack(Block block) { - CompMaterial material = CompMaterial.fromBlock(block); - switch (material) { - case STONE: - return CompMaterial.COBBLESTONE.toItem(); - case COAL_ORE: - return CompMaterial.COAL.toItem(); - case DIAMOND_ORE: - return CompMaterial.DIAMOND.toItem(); - case EMERALD_ORE: - return CompMaterial.EMERALD.toItem(); - case REDSTONE_ORE: - return CompMaterial.REDSTONE.toItem(); - case GOLD_ORE: - return CompMaterial.GOLD_INGOT.toItem(); - case IRON_ORE: - return CompMaterial.IRON_INGOT.toItem(); - case NETHER_QUARTZ_ORE: - return CompMaterial.QUARTZ.toItem(); - case LAPIS_ORE: - return CompMaterial.LAPIS_LAZULI.toItem(); - default: - return material.toItem(); - } - } - - private MaterialUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/misc/MathUtils.java b/src/main/java/me/nvus/xprison/utils/misc/MathUtils.java deleted file mode 100644 index 8249d52..0000000 --- a/src/main/java/me/nvus/xprison/utils/misc/MathUtils.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.nvus.xprison.utils.misc; - -import java.util.ArrayList; -import java.util.Arrays; - -public class MathUtils { - - /** - * Formats number to format ('k','M','B','T','q','Q','QT','S','SP','O','N','D' - * If number is or equal to 1000.0 will return the original number. - * Supports also negative amounts - * - * @param amount number to format - * @return Formatted number as string - */ - public static String formatNumber(double amount) { - - boolean negative = amount < 0; - String prefix = ""; - - if (negative) { - amount = Math.abs(amount); - prefix = "-"; - } - - if (amount <= 1000.0D) - return prefix + amount; - ArrayList suffixes = new ArrayList<>(Arrays.asList("", "k", "M", "B", "T", "q", "Q", "QT", "S", "SP", "O", - "N", "D")); - double chunks = Math.floor(Math.floor(Math.log10(amount) / 3.0D)); - amount /= Math.pow(10.0D, chunks * 3.0D - 1.0D); - amount /= 10.0D; - String suffix = suffixes.get((int) chunks); - String format = String.valueOf(amount); - if (format.replace(".", "").length() > 5) - format = format.substring(0, 5); - return prefix + format + suffix; - } - - private MathUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } - -} diff --git a/src/main/java/me/nvus/xprison/utils/misc/NumberUtils.java b/src/main/java/me/nvus/xprison/utils/misc/NumberUtils.java deleted file mode 100644 index 4031267..0000000 --- a/src/main/java/me/nvus/xprison/utils/misc/NumberUtils.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.nvus.xprison.utils.misc; - -import java.math.BigInteger; - -public final class NumberUtils { - - private NumberUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } - - public static boolean isLongGreaterThanMaxLong(String input) { - BigInteger bigIntegerInput = new BigInteger(input); - return bigIntegerInput.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0; - } - - public static boolean wouldAdditionBeOverMaxLong(long number1, long number2) { - BigInteger bigInteger1 = new BigInteger(String.valueOf(number1)); - BigInteger bigInteger2 = new BigInteger(String.valueOf(number2)); - BigInteger result = bigInteger1.add(bigInteger2); - - return result.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0; - } -} diff --git a/src/main/java/me/nvus/xprison/utils/misc/ProgressBar.java b/src/main/java/me/nvus/xprison/utils/misc/ProgressBar.java deleted file mode 100644 index 959023e..0000000 --- a/src/main/java/me/nvus/xprison/utils/misc/ProgressBar.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.nvus.xprison.utils.misc; - -import me.nvus.xprison.utils.text.TextUtils; -import org.bukkit.ChatColor; - -public class ProgressBar { - - static final ChatColor AVAILABLE_COLOR = ChatColor.GREEN; - static final ChatColor NOT_AVAILABLE_COLOR = ChatColor.RED; - static final String DEFAULT_DELIMITER = ":"; - - public static String getProgressBar(int amountOfDelimeters, String delimeter, double current, double required) { - - if (delimeter == null || delimeter.isEmpty()) { - delimeter = DEFAULT_DELIMITER; - } - - if (current > required) { - current = required; - } - - double treshold = required / amountOfDelimeters; - int numberOfGreens = (int) (current / treshold); - - StringBuilder result = new StringBuilder(); - - result.append(AVAILABLE_COLOR); - for (int i = 0; i < numberOfGreens; i++) { - result.append(delimeter); - } - result.append(NOT_AVAILABLE_COLOR); - for (int i = 0; i < amountOfDelimeters - numberOfGreens; i++) { - result.append(delimeter); - } - return TextUtils.applyColor(result.toString()); - } - - private ProgressBar() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/misc/RegionUtils.java b/src/main/java/me/nvus/xprison/utils/misc/RegionUtils.java deleted file mode 100644 index ba53b18..0000000 --- a/src/main/java/me/nvus/xprison/utils/misc/RegionUtils.java +++ /dev/null @@ -1,50 +0,0 @@ -package me.nvus.xprison.utils.misc; - -import org.bukkit.Location; -import org.codemc.worldguardwrapper.WorldGuardWrapper; -import org.codemc.worldguardwrapper.flag.IWrappedFlag; -import org.codemc.worldguardwrapper.region.IWrappedRegion; - -import java.util.Map; -import java.util.Set; - -public class RegionUtils { - - - public static IWrappedRegion getRegionWithHighestPriority(Location loc) { - Set regions = WorldGuardWrapper.getInstance().getRegions(loc); - IWrappedRegion highestPrioRegion = null; - for (IWrappedRegion region : regions) { - if (highestPrioRegion == null || region.getPriority() > highestPrioRegion.getPriority()) { - highestPrioRegion = region; - } - } - return highestPrioRegion; - } - - public static IWrappedRegion getRegionWithHighestPriorityAndFlag(Location loc, String flagName, Object flagValue) { - Set regions = WorldGuardWrapper.getInstance().getRegions(loc); - - IWrappedRegion highestPrioRegion = null; - - for (IWrappedRegion region : regions) { - for (Map.Entry, Object> flag : region.getFlags().entrySet()) { - if (flag.getKey().getName().equalsIgnoreCase(flagName) && flag.getValue().equals(flagValue)) { - if (highestPrioRegion == null || region.getPriority() > highestPrioRegion.getPriority()) { - highestPrioRegion = region; - } - } - } - } - return highestPrioRegion; - } - - public static IWrappedRegion getFirstRegionAtLocation(Location loc) { - Set regions = WorldGuardWrapper.getInstance().getRegions(loc); - return regions.size() == 0 ? null : regions.iterator().next(); - } - - private RegionUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/misc/SkullUtils.java b/src/main/java/me/nvus/xprison/utils/misc/SkullUtils.java deleted file mode 100644 index 3494efe..0000000 --- a/src/main/java/me/nvus/xprison/utils/misc/SkullUtils.java +++ /dev/null @@ -1,78 +0,0 @@ -package me.nvus.xprison.utils.misc; - -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.properties.Property; -import me.nvus.xprison.utils.compat.CompMaterial; -import me.nvus.xprison.utils.compat.MinecraftVersion; -import me.nvus.xprison.utils.item.ItemStackBuilder; -import org.bukkit.OfflinePlayer; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.SkullMeta; - -import java.lang.reflect.Field; -import java.util.List; -import java.util.UUID; - -public class SkullUtils { - - public static final ItemStack HELP_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2YzY2E0ZjdjOTJkZGUzYTc3ZWM1MTBhNzRiYThjMmU4ZDBlYzdiODBmMGUzNDhjYzZkZGRkNmI0NThiZCJ9fX0="); - public static final ItemStack DIAMOND_R_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzkzZWQ4MDdkYmYxNDdjNWVmOWI4ZWM0NmQzZmE2ZTJkN2IyZGJkMzQzMWEyMzQxN2MxMzU0YmI4NjNjNCJ9fX0="); - public static final ItemStack DIAMOND_P_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWIxZTQyNzY3MDkwODI4OTcwYTliNDMyNzYyMDYyZmY2ZGY0Y2JjMjMxMWRlMjNhMWJiNDI1M2VjYjE2OTJjIn19fQ=="); - public static final ItemStack MONEY_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTM2ZTk0ZjZjMzRhMzU0NjVmY2U0YTkwZjJlMjU5NzYzODllYjk3MDlhMTIyNzM1NzRmZjcwZmQ0ZGFhNjg1MiJ9fX0="); - public static final ItemStack COIN_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBhN2I5NGM0ZTU4MWI2OTkxNTlkNDg4NDZlYzA5MTM5MjUwNjIzN2M4OWE5N2M5MzI0OGEwZDhhYmM5MTZkNSJ9fX0="); - public static final ItemStack GANG_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTM3ZjlkYjZlZWNlNDliMmMxZDZkOWVmOTRmNmMxMTQ4OTA0MTIwMjkxMzY1YTE3ZDI3MGY5OGY2MmFlZGUifX19"); - public static final ItemStack INFO_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTY0MzlkMmUzMDZiMjI1NTE2YWE5YTZkMDA3YTdlNzVlZGQyZDUwMTVkMTEzYjQyZjQ0YmU2MmE1MTdlNTc0ZiJ9fX0"); - public static final ItemStack COMMAND_BLOCK_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWNiYTcyNzdmYzg5NWJmM2I2NzM2OTQxNTk4NjRiODMzNTFhNGQxNDcxN2U0NzZlYmRhMWMzYmYzOGZjZjM3In19fQ=="); - public static final ItemStack CHECK_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2UyYTUzMGY0MjcyNmZhN2EzMWVmYWI4ZTQzZGFkZWUxODg5MzdjZjgyNGFmODhlYThlNGM5M2E0OWM1NzI5NCJ9fX0="); - public static final ItemStack CROSS_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTljZGI5YWYzOGNmNDFkYWE1M2JjOGNkYTc2NjVjNTA5NjMyZDE0ZTY3OGYwZjE5ZjI2M2Y0NmU1NDFkOGEzMCJ9fX0="); - public static final ItemStack DANGER_SKULL = getCustomTextureHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTRlMWRhODgyZTQzNDgyOWI5NmVjOGVmMjQyYTM4NGE1M2Q4OTAxOGZhNjVmZWU1YjM3ZGViMDRlY2NiZjEwZSJ9fX0"); - - - public static void init() { - //nothing here, just to make sure the class gets loaded on start. - } - - public static ItemStack getCustomTextureHead(String value) { - ItemStack head = CompMaterial.PLAYER_HEAD.toItem(); - - SkullMeta meta = (SkullMeta) head.getItemMeta(); - - GameProfile profile; - try { - profile = new GameProfile(UUID.randomUUID(), null); - } - catch (Throwable t) { - profile = new GameProfile(UUID.randomUUID(), "X-Prison"); - } - - profile.getProperties().put("textures", new Property("textures", value)); - Field profileField; - try { - profileField = meta.getClass().getDeclaredField("profile"); - profileField.setAccessible(true); - profileField.set(meta, profile); - } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { - e.printStackTrace(); - } - head.setItemMeta(meta); - return head; - } - - - public static ItemStack createPlayerHead(OfflinePlayer player, String displayName, List lore) { - ItemStack baseItem = CompMaterial.PLAYER_HEAD.toItem(); - SkullMeta meta = (SkullMeta) baseItem.getItemMeta(); - - if (MinecraftVersion.atLeast(MinecraftVersion.V.v1_13)) { - meta.setOwningPlayer(player); - } else { - meta.setOwner(player.getName()); - } - baseItem.setItemMeta(meta); - return ItemStackBuilder.of(baseItem).name(displayName).lore(lore).build(); - } - - private SkullUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/misc/TimeUtil.java b/src/main/java/me/nvus/xprison/utils/misc/TimeUtil.java deleted file mode 100644 index 9d082a8..0000000 --- a/src/main/java/me/nvus/xprison/utils/misc/TimeUtil.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.nvus.xprison.utils.misc; - -import java.util.StringJoiner; - -public class TimeUtil { - - public static String getTime(long seconds) { - final StringJoiner joiner = new StringJoiner(" "); - - long minutes = seconds / 60; - long hours = minutes / 60; - final long days = hours / 24; - - seconds %= 60; - minutes %= 60; - hours %= 24; - - if (days > 0) { - joiner.add(days + "d"); - } - - if (hours > 0) { - joiner.add(hours + "h"); - } - - if (minutes > 0) { - joiner.add(minutes + "m"); - } - - if (seconds > 0) { - joiner.add(seconds + "s"); - } - - return joiner.toString(); - } - - private TimeUtil() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/player/PlayerUtils.java b/src/main/java/me/nvus/xprison/utils/player/PlayerUtils.java deleted file mode 100644 index 8bf2750..0000000 --- a/src/main/java/me/nvus/xprison/utils/player/PlayerUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.nvus.xprison.utils.player; - -import me.nvus.xprison.utils.text.TextUtils; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -public final class PlayerUtils { - - /** - * Sends a message to a player and replaces colors and also hex colors - * - * @param commandSender to who should be message send - * @param message message - */ - public static void sendMessage(CommandSender commandSender, String message) { - if (commandSender instanceof Player && !((Player) commandSender).isOnline()) { - return; - } - if (StringUtils.isBlank(message)) { - return; - } - commandSender.sendMessage(TextUtils.applyColor(message)); - } - - /** - * Sends multiple message to a player and replaces colors and also hex colors - * - * @param commandSender to who should be message send - * @param message message - */ - public static void sendMessage(CommandSender commandSender, List message) { - if (commandSender instanceof Player && !((Player) commandSender).isOnline()) { - return; - } - for (String s : message) { - if (StringUtils.isBlank(s)) { - return; - } - commandSender.sendMessage(TextUtils.applyColor(s)); - } - } - - /** - * Sends a title with subtitle to a player and replaces colors and also hex colors - * - * @param player to who should be message send - * @param title title - * @param subTitle sub title - */ - public static void sendTitle(Player player, String title, String subTitle) { - if (!player.isOnline()) { - return; - } - - if (StringUtils.isBlank(title) || StringUtils.isBlank(subTitle)) { - return; - } - - player.sendTitle(TextUtils.applyColor(title),TextUtils.applyColor(subTitle)); - } - - private PlayerUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/java/me/nvus/xprison/utils/text/TextUtils.java b/src/main/java/me/nvus/xprison/utils/text/TextUtils.java deleted file mode 100644 index a2bf079..0000000 --- a/src/main/java/me/nvus/xprison/utils/text/TextUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.nvus.xprison.utils.text; - -import me.nvus.xprison.utils.compat.MinecraftVersion; -import net.md_5.bungee.api.ChatColor; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class TextUtils { - - private static final Pattern HEX_PATTERN = Pattern.compile("&#([A-Fa-f0-9]{6})"); - - public static String applyColor(String message) { - if (MinecraftVersion.atLeast(MinecraftVersion.V.v1_16)) { - Matcher matcher = HEX_PATTERN.matcher(message); - while (matcher.find()) { - final ChatColor hexColor = ChatColor.of(matcher.group().substring(1)); - final String before = message.substring(0, matcher.start()); - final String after = message.substring(matcher.end()); - message = before + hexColor + after; - matcher = HEX_PATTERN.matcher(message); - } - } - return ChatColor.translateAlternateColorCodes('&', message); - } - - public static List applyColor(List list) { - List returnVal = new ArrayList<>(list.size()); - list.forEach(s -> returnVal.add(applyColor(s))); - return returnVal; - } - - private TextUtils() { - throw new UnsupportedOperationException("Cannot instantiate"); - } -} diff --git a/src/main/libs/plugins/MVdWPlaceholderAPI.jar b/src/main/libs/plugins/MVdWPlaceholderAPI.jar deleted file mode 100644 index f14271ccf9b14d354dd411da0398ea62f5b4154b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245197 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

UnH+PS~xXJv-ar=i~cTE3sp#f|2 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

|T$-BDi*ehop_h-TKMLI|Zgnq^yN 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

cK1Z27pdT(4;G`6_1;=a8dSAuA<{$LVlS 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 diff --git a/src/main/libs/plugins/helper.jar b/src/main/libs/plugins/helper.jar deleted file mode 100644 index ddbbbff194f09a1d48021ea61d32d91c288e2280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1837193 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%0D4x`uWA3$; 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

{J06=~;ap)nmBqmcr^ujT|ss9It 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%0Dnbl*=u4E33j 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⪙#`W1=D>`?Db{%OHCGN*VrCQ8bwiO9ssC0$Fj;k>TY$g2A z$3^bQKdI7g5tkfeRW8%C3#=1}JG37d8f#!o+2t)Bml7y6U$*WT!}QNz zZy=YE=-y_q?cN;!2goXYW_;xuaEpV;;aS$BDah2IBJK zW4~4D-0$2qgkM-j1A|0prtnVGh9%qbB*3nq`BEC_0f90>n&wJ=(RJR~*t&!IwOROUe_|w2vURn{oQV5}ma)sC3jAGm#ND1YI=HO%(6vTVB}f&x zPhsVUpxa8kI;WJneV-)Avyc!?UJNLquqmgI{It9mCdlF|KCETXJeRv(k$&?Ou`pe* zzi-M_&UI?VzS-$)8+ICb1OZc?ZvQgGdn@qma@?>Z|2$&Vu+GU&dilgUSppkF=?-6- zH!l80P^o@K zF|mu()a!vVI)>haiwu-awO&yrn;U1GBmuKRnKG_B8Y(?i>x4MCLkAoE@|sI%q`R4! z%H)C5{AqJj@`Z$2|5N3nN1;u?5^zg2Kl)I(Cp;Q2?BnYVO4#v2LYm&+4Rxk7bUo=B z@8BiUr)*XEB<>p213JhzQAWeM z1`_I3+?lXgJmh5e?I}~if+IayOCL?!!rLj7EI)CE_eXP9VrZ_CUM)N+YzLqqOTzVzNfzJE3TFmRsYT#UK z?-{2Hv`&R76zU=vpO>8taSOd^qjCCsFC1F#)JR$c;g`0tp+t>q>ors`JeMb5K9VZn zSSt-uGsL0#;%mm^5clv1uYv=fB>pz+NrRp5+3IG|07We6+-{lNs8~{ZXF_mDL_=WM za~s-GZ&$_}0EwF0a`Qz)9N9(c^|bY4H22#r@V9YrN95MD_=ohxQL&?6cKFAQlX~NX zl08@5<|Mz~&mMZaUxsrC9ke@kW zLce5`^K&amb87{(;Mojw;qJ!VN#!B`x)H24=){E<6M@F;4$R!Ka5W?$N~F}C!!J4~ z{1t>oZ-sDVd?N!DFZ`ac&>Pi#mtDJ1mrtY-&6FgIcm+V4MW)k39d_#&W;_JWa=z!{ zw|QY_6|Y_6Vs(dc%}(H$u5BvKN1vw;x^)jTL)nZ$P&<--{%K-u@kni=bLnkL!B3zq zG_wo``HC6W1cpaQXXau-@|=NInShbnUu>y|QQrT6+L%`2Ti!@glW415x2=D-lWG-| z34P)49B;@SQmr$%q+PRdFKywCwuMd}QJeqFJZM;I1K)fNwmRg*VZDkMH#m0BLG|NB z#F^TCYBZ@z>>13JhbivNR@;Ax2gMDp>UYtO3)c(Pc436+&MBj6GR*U)@H01E-(D6) zPy}$y^p}n0L+^ucO#+O@PhOFODF!oqlV@)EI2~b7gI4k;%MwUH`z@)}i6XzXbJ zi>M6`ZVxsV=i>e(0aXGT+LCE1tqG;vTh!4h2WP)FZ^eN@1NycAGG%0UkBKKixUnrw}(`{kU{&$)FpNi@K zKNRi%D5eGU9E@0*|3&Wqcd-$rAgze+?EcgBCufjhNUzP(A z3sXEgM+*bcHg_=~^y%ddz$oNC-XJJ^^yZUOEc8fOIeB`0I6Hay+#6T@apy`VXC9xc zahPjy4)`|9UXRun*2#{j0e;g=bVFGd@_o)J8K6P#LWx~Q-D+13|zXwQq?7TwD?7<4TZIL zaUHB+DBgIgUP;E$`&uh5>UY73Z4C+A=$7o8Ui%SY&9y2k*W`mUIP-~zw`9wMfQJGc zQDuU4Wu%DJMT|i4n!o4EElQcMmyH=ER){V^65jZnbp?Gt@UdtW;)(YpFe{$m;{jq< zk6p%%wq~yt^9UMzhPS$-4%t-QN3Z^sJvRMV|mX&lgDwIYX_7?N-WNk4gZE!Wq@uEK8IC8qsy4SUnnM)4>F@?0Z^B@l{+iV8I$LyA4(C zKGCZjdAo@R&ouhgbIyDPVuE?}K4;eH9z1q(xWES9GtCsjAai^W-<;AiQHxZdV~+V2 z2CINw^o${3;7HNO*pb9h-lsmF;gnrDB}5jU@ke*jEV>YL(r!I85^fs^Uu5Xz5XFEH zSwHpEg!}bbRMjE5ZA=#^0;#L-?B^ABL`bztOr*=6S)j4^e|Z7QT8~2fzw7ACZy)Rb zEWZBp&Sv<>2K3)`^#5b^sZ4S6L_NS8%1-W)VWd{&t5BoY7=X*MSXQRsxA+MfUnBz7 zKMQPKSFfj6kHgju#NR-pZy|3Mu?mvVRAME3UPzJxY`#{qj9%U3dfyX)9@DfsxAy3^ z)oDzImGZjseq+43;VzroQydo= ztUucr+`VEdO&Wja@L^aCPDpQWR6?~M6SQmfS(KEBo0lu3YuVj5^Ds^1vL-1qq? zXCBloX_T(aPNVg$>1ZTHwqnRfq+qgZ^!=4v1v>Sl%=-D|U)G5kyu&$0FThtpF-Yzg zW_>$Huc2$39;ZPfw_9HEuuBrT$N>IJ^KUL|oOKu$whYotn?P;DEGiQFsH*0QDM7!K z%pinQWWVbaCUgi`(z8_lVR8Jdt7hZL6zRz$I;Cs&cPi$foGE)|T{Z1s2%|o_hn=y= z5Q!fljeSiI=$7454-5h2ff4{rqP@-)l&n=#$4^g>xSM7_z`+wlBpromHOiH;oj_~C z%@F)G0dQI?M3!kS-j=3)wc8W5s2OVvXBi_+oKd_+k z`^2e-JWZ>r9$EAKgeiAgTPVzSd1a;L<1Ue>5bfyTx}bE@7Rbn(#Z;HBS3awE5j=vy;r&a+X*RSbg@FT=@a1NO z0(MRDsq*qfg%x+ZAgNmDNqeu;Q^vD;F|y8Ong>&c5>XaU0r~3Wh2#^p@B_yU;PqG6 zF;jrCR5`&}Ih(_@cfm;WsVTo&ysCo`^nO0=sOZIh{vaXU5smVGYBdH!sxI0p>C@{g z>{FmrYd_7C8bix4vm@mtT)c;dD6}?kKa4F7$_*==1*pgy_QcGAm#}ALba|}|vZ`z~ z9b!x?34T3F3|dG_Mza)B@~C?)zp+}-8R>0sFzhXk;Z(L=7`JWTQ!~syP?sfdu>p!q z65JmteJcv<(Tzi~PffnfCg_57N}lwtpXkm+m?6I{aK|1eB8cGD- zNyF%lX7c>)!e9{w^5#0y8cKijvl3r;j*>JPxGBYAUK67Q=knom#aY)#OIvSG3xO$; zMbH{>lxx^U3J(_xhl!qBkREKMHSUcmDG;}`d`Nj&(z%Gi=sH4qF z-B`>tu$Fd#K!yY5wkVamg@$z*)V3@7nun=&Gf$$Ug&2(j(_M!U3iBdcix!V#G19If zGrDwz8|w2|&`%9=qu@>8<%4W%BN!}>7yxa1xP~s z(@s8sqbl`-n#j*sf|nKMU`OPP+qOcp62RR02k(O}rh?HhLuo8Wkvj9=J!|oRvCvO( zL+}&0AUhf%MEd76Y1#1cOQSkcfN2l$B`eASglC|Ilxq^z7XQpB)aSH_%XQ$Wu7Hgm zp)1S~4VgJ3COEFzmwVVs^UpN4ZupP8$~j<-o-OMLj-FAxXh?KL$1kaq_~32H?YL}Lbr{OZ z+_Db0F^L<)dC$|jfvlZTxDk_X@r~l(lK6~^-^xhhZ6;rdk3MlJ8HwDIHL=OxP9}K5 zklGaOOQVl&$xkQjcszUij6QLy6p1sI-}ATc(^%RR?yr%*I7@8q{&Z`eAKEl1T?o15 zp?C>_cS?`zNW5T`=n9CxD%ihB=vX9jqkAm9e!H>#irUyyYbP76*dtgWz0&o-Al;H4 zeUiI{hZyCZ8d{G{)B*tBQwoy^nip}yh69lVHw?Kn*uFLQw2y(ea$YW5(Py+3Je*+Mady(hGF67{m#_j@d zfpa^=$mx*A2qDOQ>?pIl)p7T((1)KzyME=qkN5I2%E2=gCPN*d3AiQ7=@2I@K^@e9 zjdkA;B+hs|+kD+}9F7S}$+0>|@H>->LLI;fxB=ugi4vNj4vv4wfsdkyvWCFaa~Tcn zTQd}>nns95)LHLrWM^v}*>2<2c`Pw6LNZ9fsv3+fV&dD7OFt!q%~JNn{+r_O1x7R@ z^ljB##{b_X+JAaj$o{cJQ!q05|HvSfs&781i)de)8-d!aAOk_)eieVn^o>9kR1`}- zC{UJ`Fv8s4pH``s!5f5t%oYSl)Eed4)mL*Ga<#Xr$2jy{WdDXducfZ7nC{#!{w`;={$_AED~<8a)U6pm{PA_E4uBz{)*S%sASp5;0w&V*^2sS@ki7QjYe|p;)96T=z_kX$g-WuxKvuYY z6+qO;>kfZq4eH;Rs`*P3dj4>Mem)NXRxza2cTi^vp`4ouo+Ny>P3G&dwS`&dEZ3yA zUYoofTd|*r>dB-E_HPN%lq$@RWus{(sHtm$p`O5wL7k|WH8639P9m*o<+iILs#e;p z5fl9799#qP1YRrsbA)l(!lY8qk2G!whsE@`j~43@qUua}YUz9WL=tzRVzkow*Kma= zbQ96NCjCL-b<;>)M54LqX>96-q`A8++1oFefsLiroyTG!J@r-ZZkwNYJm^7`WLXQ5 zAn$<2cxYmaN3hpn?_yAp@Vqyt2jr_;U*4S{sj=qI12oH*7^LzuxeIsyORT<&`3wUI zakAm7#C6+)C+Cl*rc*JKVy(s>rHJrE7mx_%?E9fn?6Bar3wkw^O^QYHRFe*?d{&qM zclvZ| z96N%5;d6)^_B*Q1M6`RTjQAUG1zmL#Jrl*7+`f^})R)Qh^@Q93M{3)Ne?VOQ-ZIsXXGP)QvIncMJ;CY54#Z!ux8IZaKxkX*UMNR3`P%1pi(nH)kZ|J<|V0o2|>i)UC7 z_c!rpR^ktBeMR?>TMaG=l=LoPnR=yc^gS*+Y^G6F)8HR){sOJu!(mB@v9Ujc6)y_5 z*<&3|ow;`FprqPwuj_KLc=l)N>={`D-obf8c3OUE=;#J@Gc0mh?hjsV)W#;WQ#ViD zjo<95y3Aad9n><6(&~-ppI(b@24+(Q&v8|C=L)o_!)r;dhrANg3~)_0zprH=?!RX7 z!0%upFSz6Fiz%GSRuYr>hOChKkdgYx>`6a#_#lmZn@1Qz|Cl}dSzaz( z4SFV04INR(6SRfT#tb9R;U%XJU}Xe9oC(vJFIi|nXd1M^-2KcSNuB9+8v5%jO5=DW zqx4*~Duy&vhLIQKPh&DVE0}+z=L1@dpy6<>We57s$YuxBsn@xsW9J!z{#p;lE6FO} zq5ggbH}ZN$*(yie_5j(kGZj(^iQ2c?tvr@duzF_d7Qxdr9Y&AFPHPFeB#VcX-w<5* zU6m1HRq!q}dKMIM3wq#*dleeYRb;!hsrKy6foMrIWPB?K%oVSR%2g7N7#bRtH22z?RF(~6j2CKR`bO%W z5njm5t0in2RVp4`e4NlKzDba*D7G`ub7i%^urWl^0s&(wS~TBAKSPpZpQC_wCuO`2 zH%a)fU9u4ub$SH=gK{oTcf0LG6yY%+gVlMD;eLntHL?34`j;yzf$C?Ld=`wbmEs8^ zw+X%j&$MEGq^uKyl5%_LZV0J4 z(flx7;*XQV?wLIS*m7wHUmr=%9oU;o*Bncx2lU*>U23)#xdjddZ{bdXvNWwMaN744 z`w;n9U5PiBEPZ^XG8PlRa*dJtenHm`h3DAfYm6{Ajb&BT-_BhE?0XdNq_R7EiGAv_ zJ9Hk<*%he2&nYJUPAMz6$~hx^XTn`;xMoJKqIr(T*w#n-5mj$<0T-IG^Bl5s4MH`o z0@P#*%h~Bt)i2Us%3*fP$4I`QwL0h&026;Ssb8_n%E|Pv`dr`_Kf{)}uAS%l?EY#(f66aAWY8B7hWb0&kmH)!7h94{hU+qZumF`_V zlHMBra6_;KTBYp?UVWrd)>Qr5RGbezlL#^oh?p|WBchy^J6BhjMjE+`?1wQL!qM9E z7CEEQDl9dBJh}qJ54q8{5528hid5~cZX0!=eD08VpDuq1KPSU`$z-NU#$lwhkGLXl%QJQmL%OWzh1K~s=5LlY{;dv5%{RC_xSwRaOsXKZ_N06 zYzp;{p)AICoIy06{E)(tvt@E;NH`K_u~2F*NZ_dXF*3V~WjjioC3qRw zhA3*Qil`+G;z}{dpe9s}*ZoCRa;sNZuNI01A!jkkT)NjAwws5u)Xc<+v2e?|&z#Iu zE{Chu>QN?W6ZS2wNT?DD?pHbP4%V2 ziVRGN=@C5a9xAecQ?zBpaZc45`&uOLA}y>^bwz|8Iz)TJ4Vpp7^XhSzjBH}z{)yw4 z4f`rzEr}oeep3(6|0-GPg4KVvn4-b1)z|~K1EOG6ig$t28AY;?ag%u9)Q}Gh_E)$y zGqTyv3le20hN24+vm+?XE2Iv4FT_tm?`oB3O;+F;Saq1CPiQV#P42@z{rck!S2aQ> z)&FLcR%>`JEMVMc;9Xgp!h6a1wf}8q_pJmL{DMh1LLzYs}<}q$V8$i#*udwtXq1j3zl&V+U}+G^Q}U~Xvxpj=5L_a&Ma4MfSd2s z2>S8Jn0)(cAiNu+$&rc;3_(1)Dv4R0C$-{6%qA+lggZAAWeSOO4?0UZvtY9i`v&B< z|24}qk9{d3mF5$ZZ`RqcB~}D3{p5)F1T|nIB1ekAbz_$r0s-o2a{Jex?@JUzHB%en z1}arM8}(Wwq4$IEnLcL+J&ca&8c55LY5QRd93f6>g4kGCM%q|xddnvj!5qR9(4N$FDp5j24BQoryOxl9 zDHzwq(p1G3YJ3U`#~bKtX+>L=9Vixlm%;pHoY>X#CTIAtzEPL1dy-ZaiqhqF2XJ+Q zm>k3%kSl{SMcCvI!G?%REl{rOwINjWK3-7)JG{jew;TtUn_!( z-O)CIGm$pt&y-oouU_d2Ske3|sAOksGOEq#LY_!;ECwh#Nffg5Ulr@K*V^24qg%w> znu=qF(q|>}fHt>w5nHK8e^r+E9~gyG)n=H3cH(cf39r~*Hc){}_9#0mGu4-$zHa|J{3xwzVgf|s96H?SDcFA~$)S!;$`rGpY&LvZA z7sMqN>QP2_FrPz*5AYK;Z$&WzCevnVbcd$e99bN&08*!#`1Hs$S+_Y-*!@`s{ojs>+=6W=RM#uc5+08k@k7JQ*>Nvg!-;1%%f&j>z7H4bu|aSwiHq}s=3P(VPr{n6$Qqk4LuZMHR3-XRM~sZjWP1&w;EzoaL#z$m+* zciC4=uEfB*cNrD?a{U%6T5aGdVlLme4=q!=l5hT;fo)7G17)(HOWmLFN$3HU6!^4D zFr|uH27LnM{y~V_S4!z6LODdeTgx(3v3;XqfM0nQ=D>c%$SV-*3jkAcw0UCnfs&=9 z>6W89Z6Kx`TONfa7d345R{O#oEw{leviI`%A1L0oQ1~iZJEzjXY%QUlCr;1JLJ4@&YcPKT zeU~3u{eAMZ=g)+)2hbg$tmSgGr)~Gj@ADzqyCzD-Ann%(ur{wpqC%68u@8J=J*wtD;*8mwj!opcYGT?e>9p`9t&f81RaJlc6Zruk`{`F`r z+W>1Zq9r>cW2|n3ZuLIppl)Pu%}Kh^muz;roy^rh*D6Y6q@Wenk=U<6xR+Bn@|_Kh zLoX+5J||3`=VHaTs0IX!I3e&0wRC5Cv*lmt8 zE8?p!>^Ev8NuyzDKkb)12DT4RzN}>OX5*g-<>R+69Ik(tZ~AcC3aig&_TH23_uk}_ z<4mZo{5pA7&Z|ho=pJVWfyUhv1sfC0+IBpLnlL^8uZscnAVyUG{Z)6q-~Y21`_HKh z`9EHa{~H=osqW_aFEf~RygH|wSyGXDT9deB@@T<{W4@+oTcM-G)*C}j;aolvfYxBe7lP(Z>#eg8e+&OUiALFH`)Hw z<UcoZtxjh)2xl)e1c@tj1Tqf@7LMpV$i~c2p1>_ z59!yD*`@v4<~xP(E^Dz)@ktbK1T`g%dgCu1yxY=s@o3;pBd8OEB`}9wODeLsu8hR2 z)4Mtn45;SA2kzI^s~uZSxhqvqWx1;b!P&I2;5ZCHM)-gozA#_(<4d+bKj*burTf_vTIIrT zfWM!8E9WEv5!LCaNE-z3jg)ED5M=g~?-y;|25tp3WVK**>uZ$hEK0iZFb65rv1>)5 z$p}BwkE^82@^3mt`cb74-K89eM0M9^6!A(5PA|Hw+ctSzg9^lzQ+E6z7G?H1-|O-tHc=U#?Ao_Vs=4H3?3|ro1aD; zfxJR2v0GYPEL5O~diX0BQAlg3o9Zjbwt$vGU%>+WSksEX7orJwiBhOUjSZQ$mIl+E zHcK!|7YRo68f+^DUfg(=>S>l2ZSADhRyi`UazgJYKv&hapk7W zpN5V02-YCtP2-2}&z*xXJ27F4%~;mA9*HZ#T^@oH`)D?0R~6agV4ucZF53Y%&~0bv zshrh^eFiHkG#Q~tdEZGA8oCi_ZLqR8QzV;b);@ww1C}{Q#RLG4`sKi6vdey2CiC70 z0HRkcNjzK4Ah2?G1cdgr$TC)eUK?Yp``ZORi^}t)N7-v7bI4iZLE59V=6w245tPR5 zBZ50y$Z${L*ap%Q$OcJ+1l5)g7dPIYhS^DRGHVWqVo(d8&3~< zl3nRb^SQjI7)KPz-cc>yjkK=%oLcw~b9%REg1U%6cFMIxeduxZn_8eSM&qg-0+YlA z%h&sZ{58Tr5sYw{%i&h2U9^olgKc&-?P+Y#QnJY6LAKD<4y&rGc^f;JG5HeVU3Asd1k0 zZubN*Ud>;JT-QiFmpznB+?PEF`bjkA&W#WLx@n2*B$#j0CKF5(70w~khA8k-8CK4* z$lRz+G95UIF?Su3yHPI+3f&w^O$V8E_G`R!LPS0ht%7`6T7TZTF=nzGwtLEyJjoCjcjhr`er zP6y7{c#FzPL;r1rY^}AYus+q7i--U(laWmn65|O|=B2)_y=EmafQ^H_x+Z`A&@QPs~Z^WJUl-8HP- z^@&Fuq?PxVblV(ai|}|tF2)ok|D&3WuYXuBquvJ#q?R9cqYumgW^=L!F|@oLhGxG@ zqQRE0kDxBASlMYQUHHgEsYEll>A0$Rf|{5{o|jFbFnG#&nJ@B3c3nEHg!P>X0HII* zcNCX#ps@SP`6H?0!6cLexG<_#j(Mh(4WbQ1NXObr>crbX&mISua0BvPTEt8B=XjrP zeaxGNxdH4Uv#{4^^g|bIef469fV-j5%+f|B%ETgSwD9}uDWBZ1<&Z4;vDLEN&vISg zE3LaslP>kI+f2eUBS?lAD=wpI6s6 ziD5PZ+_#CCNNPY|N)*mm4@$F9EvRrg)Tp9ZH54pETN0;)LPeK!3%iNItujwJf3`ISGN};PpkyF#HU!2P#%yfC9FDu|GPr;-2{C7s{3n*igOny<}qXB#QAK6w- zzr_Tde8+3VbcLcVBPvyf{(Yt{iQnzJYo@m^qhv4Pd!FD+cAiqYz6P*;OybM2d}@|R z=$e6p=z0uL>C%0ZWIG%Mfch~WFip}wiTvXaJlQcZvKEU!c4tTSuSCK#C!O<&=oo+2 zfVC0PsU|@QH|!;Zt^&f+D4J3)Xatd2(uIHkrXZxCTWDGS@BqSrUlYX{cEH0 z1dns?lG8p(@rHk7jpet@De7~DgJdZT%j0&;_hpsn=K~^I0p>x+N%St(7!qz$3B-BN zhj!hP2h~F+i4l}aVwm6uX)={^gnAPIDpEXWTJ#imH)&$4toGWkP+@D;fLhReOR}(7 zpGa{+Poui)tb{%qiXa3Mm@7$&iMv^3^rY)vuJ}MYaf){iEd%H!d(!>pJ`{G7@&?T^ zx<>Y3Ix++8EMH|)ed)f&mXQH-6W9@(#f0v62C3T&zTyGyPsb-2vV`AUhE|5kxM{(!ms_KMOuI#oV~!E zcw0>TPHn=$4o=Fwc$AxA+KUmJAKp;Yf9)1Id;WHoInfUewV~f4V1BGMuZB;WgjQSL$?jJ2ZQXaUrkE>+zWYVtgKl=Lc7 z%bz&TGXVm(8=2vz z-|(nEL86z00m!`2_9r-Efo3fJyg6U=4&3#Eu zEvG<+>pwIPcgg@GYSZ&CA6TBRpv{+-vek%8&n5UUGI6~+!KYD1bP=5uIy)Ws(G`Lt zW89Ihz>Bd5wp}qsuw_O9SoG?d^|CXOzgpvEYr{RU6){;HFd4?Lsj+Vy1=39GGS)~$ zppwf%EEeqZqFN;xdVFJcL=x&tkPjJI>^t59%G3HGmNIpj@*~JNf34F?r~ikac!)zbGSCmt4WS zqMcj=66eyPNUv4qW2KlQfEj{=mutjP>k|0`!S_RJ-&F<}Ig)8`X3>dbXkNCih|aX& z#!_Vm?n=6OQP3~XHsq%{G)Dl7>GGawqzi) zl#AMEUrh7?@4!sD62;n`hVP$dOALiEynz`v^RIzyHYZ(F8gI#&zZTyxC)>^YK0T8A zu1L?*6&NHJhv!by3khzM_GlQ^*4aMLgsM~0D^AvX(FT0!rx7DiE2%~5b5}&e2JKO! zzd-)gDDv>2A`X4K);xax@80M?MT4yW*c*vkI~!Sl+i%?dTQ{ipKX}DPH47J%CA19# zaeT=nae7SpurMg+8Y8G*3k*Z7GBv$T{+1xDs0KO)X7qIrwgpHr%zRR&b4AjtMOPSB zCjmvWuZ(gkxgV=Ovo_!0wyMQM1iPnBrg)KCUqbbu!Sz&!KW`ackFBcjANjmnATxf# zVAH=I9))N*ldXC4e;qzZd8kYeGzz`5bn;|ymKR4l9`>~u%|*I$77EB;?^ighSjd`| zrasnwQ;5w=Y$;sF+=f^g)Ou0eDbu1)^aN$2aWoud_!T8dGE>d6rzR%{qaIzo?LG9w zWY3hkzlSiBWK)K7M-3-|Re6+KNV3f#!;e`pr*~xB+5W+vqF-QwTbZM#7(@0$o>Q1? zjBQCuJF0RkII@FLzrm`K{`PxU^r8G-*cJz~Vin^c&War$k)5BPOEgDYXcoF%TX}Pz zFj{)80e6Bfn>N}Fwx-R^nMyN=$ieN##~FBbk7k<#yM|t;i3}u=-7)j4 z^uK!0LjXquRncuT4BF9Og<4fOD03SOp?_pZHH|nBu5T)IYBhhy>@C6MA;XUXhINu- zSgh9XC~#cn<}T==s#Cfw|JkAtzj`B|dXqpS%tj+SJGbM61OeO7UgS`0C@;8lxMQj^^%loJgd zG>czLsZbp(T~$j!*#Cs2V2p+>;aiPxGbqZpN0K(5f^^v}fiW&*(6+qQw%Z1+6c;il zh>xMiYtK$KcYzBdm+{pHoP~l!Re3Io9_;(%e&acT;4$)&;={D}<(rr7qj&?3mogh= zhmOZvwQb3QeqCe+GmhLE)KCfgQ12=^;hBCKhQa^4qywEEecWR69`c~^I2WZj*;XC& zVnd&hdiR8+Fs6zEXKb+vspwVNGpH+kbAZ{e;N4Iot-> zI04FVSx=^N|HYOQX>WHYW+#GRYsjVShQ_mbzsOid^~Osfds1<00a-_0Md=>lTCn#c zhFqE0nncYF91r=^K<@*&i+bd}6v5i=YgI#QPmXfjLxR)bxRwDw^On(!YLC~%EtMT* znpI>_{4eIBLTSS+dnMbDqPpN7X%JG3@(za4QYAN|+syk|2*R}mI&A<9#WKFz`dLlO zcNL+aMV!x)Hz^zXhQbjup!jM^%TZ}UEonu9w}>3VB6HMibRSjhkXrH^Q})=^&(2ox zy>zEBA{mnW87~Jn00v(JVO@A~pQa*ueK2jbNmGpt8J1e#V2y}13LK+0m2NuNdTa@& zdnuk)BG3ze1B8Od{<*zAR6^Zpg zSKK5*n4V!142W}*XY0Nz!hM~-)59q)sI~}Sck%TqV6(>a7v^aCV;zlOb_wP1;&VlY zGf#V%LzOuMEK1d4&bH-mfFx3jQ4aAgIVIkZ$GzYYFnH{U=FHY|l+)me* za`$sZb-)DRI?CY^))56Nj-vH}`N?PkXVyb4@Igb3Dr4WlYnkAJ za?1BPdH=RiM_=-(2TgNEJ$~ty%c+ua$>egp;`|$Yx}Ib{T-`Q$*Dbhl+2MJ%5mUWI z3tO|%KXVRvy%;3?4e^Y6p%;ACQt)C_WZJ!`QvWA;%Q(Gw12Kc8#{h*Y#=$f6L9*cf zi^75lD%!S(#EVlxT~@wfSZo`W>U-|)7N3<#^olaTExr|v_(VZgMmBmvtPHp83*#E) zzcpe`W@>L&>F0kRqdv!L1@LbB`9b}AkNP9x;KX)S{Fb@}NBh>Fd2TvfjsAg=EU`O1+QTe8;X*!G4nR?hVW+@5VA2r_ zta$Am2(Gw17P4##c=NAc#~9o1+Wz?zWZycC{1-Qu%=MJ4Hqp|`WKCH7vacL8gRsR- zAf0$$y>I+Fm1d;VuO4)sR-OLVeu=tudUZc*@aQIb{|M$e52X8wW8}jVs{7@oLqX&H zGXzUTd~MCGH3qU3g5qg*?KxOLVybzg_i6o@^~|GlO~0*cQ~L-ib+NT`dj7|4ug-_B=nfL+aiDHJlv8pzaj!P_Y3D zoQaBqU|3ikTu5{BGvap5@{Z#=X}eBc$*1g5LuU)74%t$N$j90vX3#59nYAkMZ$KI8 z&|l?aigMf~OXXe_j;chA;3bYjqRx&1hfl^)uK)`B)DycP?{4uw)pOZYa}gZTog-J0 z?`9OHxQ9BE8KiTA{Y`?%l$W4@I{KEDIzkvhu%ncqT!B~%H1L~80|~7-ifa_AAZNQs z%mXyiybD%ul`O%lk;$dhfC_BF&51(FfiE~s$p>Wrl-lrA$35ELDHR_FH1CJrdOX=$ zd)flt(@DwY*P5X`Xz$|D_y5i{DJu$U)Fnkv?k1{Ks0_)N3fP={ zWX%;cn3=4mHf{CLuqw*FfxN1|R&H?u%-%BU<7+HAN>gQ6(s-`2p6s*kIh+ZIlzW81cqj?IqKv2EKGwmUX&`oGUTcjLVK?6*dJs4=R> z?@P^Rt@+Hg)?Dw@KMfue_Ms6+%8c1wx=CRVF1J1zDH$fH4NegVqDFrxcUs2#lo`J>!pb^X^vuN#p>-WQLy4e+bs4;Cq2`SaKoz zJYB$#HX5md5`6Hx3-4yF?H1HI2rsgzd#c5%VW-K>7v4a_z=}=b25ytecbDvts$a8f zKh{7gr^J2;^FDN6Lg2Y%<5t?0XsVMR+m z1wheAf=aGoR0-dzv{=r-YAh@y@2oe?fh~U}<>Z?FyB!X=TkM&WjKI#D-WCeZS?~12XDLi%IM9XuufDXiy-G zc8ESw)pc%kpnSEZ9+c=D%mt-^^rA=*ReZO;_s|5bq6F|uny|^qs=+*#Yq7{w%Gi;- z^hv)|dXcam;l-m7bX5?Ir$ATwyxb_FCJI6bge7z3i}cW=8Z;c8s2wEqn#`GHa+)BD!`8T)?u*9~h|3CZk&$nv zY73%xTn|wS?}(h{7hF6usiSHY^$A5c)pA6|#ZpeHG*zM=zs4cj3C}Sz%khxvhxN-wQHU6OBbJfsQ8_mw~=dXjnry!r)!gOn(} zBbJF~-j2zd4+J()3!VD5$;FxDdqoV2qfiS)8nY*ic}8XTMb2+#622t8dpF&}yGnuE zTi-3LwT|iN>l4LHk`D|b2MU7lZ78O|7G3cqBxNx^RwtQU@|YD-kW&Y$9h>wL&!*hl zH*i_iA>OoeF3+niS3-xyz(@^DAq62aoQz9U7w zaaf1zH+gvF`>wl?INu~89}}3Uc!oyH6K?%Xbqs_@oSCI?UV4gGa*9`QPPUImWU#(t z$BUZV$YEf+hOW~ach$k=%DLeK&U4j=%k9w`SteZ%L5P{eiU>=eVS#x)j;iTpxBkztUT6(rl0)S0=XEZ_#+Z3-c_{AsG;qdYaq5ARbu=(L@C~#{i zedY`OPnlbbEohe62{v|)lwvn>EG;gRCshG&Tn8qX?aFQqVIzkj1u%om->i?OZ_t$+ z{YevVaMKD_>sDn=((|9jq;is)QPe_=_jjvn-A=C%7d2sPeN|W3k%Truy02-oR%Gf@ zcid?2gi@N1g4 z-lKRQ9yD95ni+m}nJL&~udR<@SyVl2PPAGkKYYSs1>l7&lq#y`PHjOyFCQt9-Y123 zZp|*N%BAAa6&(syjhGUfWd-mbTkfSaj9fB00ln~(R)e&B8COKwr4B2;3sJVQG#du= zm93$o_Y$A_NA2OPS&a3lW19qCqAS>@ezSI2R!=u9x8cd3H_l3rP~n7-F)}>j!C{Db zl&gp+$(WO7%JJ(kmh~&5+dNJmpfDkOnw~@C2~FS;+W*&%5KqGg_#Xj<;}x!F@zc2k z3gO?S&Hrgd^8cGB7BaIpaI)01|NGYdf=|Cu6cbGEk8!eAH8MyV6~P?Xp>NBuTF@wF z&EnZVwB$ECtxGPnkbl)^-zsSSm z@%r!~OIsgDG9{gyc)b~S+3Yo#%;1IA%`8TniZdpO3Alvfywa)AWfBxhZuaR+KtixkjWTbuFNylMDBQTds9}1riv@!D<#Q{G`qbdzAdIz zn7=hLBM(VzzEpKo7=;0blaacFn^dz2t&NkCAX-&zN=!>`ymJ7?f6B%;dD6Nw&2nDJ z0`nfQ?#^u+-{Q40mg^Hj>Ep@9{qVY^>K~{16-$Y1)kxqyfiK?^hZc6dM6 z1^w<9t&8Ts@=HeUGD;rRl(V*Mbf5u4t#XD$sSX!RY&F@_7UH(J*mfN!c?0hnw^{v56LGIM7xJI)FGaSCPQa>NO>b>r*C4xvM8 z7D>m0SSt-f5^Bq&hhpqx@1xU*UFPKm4sBhw6uGc7qu5Hi^EZV+ZAWvmLC@+PZh-)> z@Wdhu^Th6_BE9ghEs07=zkjKM=Ah3IzbcP#K##Q$C}}jvb$WB{g11)kS=i)6{jO)8 zqs+<-Xm8!zuqqr^B{4JfAZ|qw?CVa$HsH<;9`AAM7^hksayf%J%x=-mG?At5w917 z%ThaHgKXx8c)bOUl`3M4;_N4kFtp-t3)>nUbANF_Q^tSTtL-b&P9!;)`1a+j*CN=F zP65QcL@$ji%lHI+&IBj-$9Z%tSp&N9oawN1p>%Cfq%n$lBFhgicZU~C=@3ZIMnX|$ zQjcg{weab6bH)C3vk`M0MK}#+KXXzTbUMN(65%%T+!6U^k{+-aeSeDIBxMm&^eHcw z#<1XqKDS%6_EZ&iCnvT*Y}*w$8l-bh%KoSlUWpJl&g&M8d5n45T_27gxz`HqFDC13&lE{M9;cFuy)KRca z-K0Wx?~=^hz;EknT~=etpzx-N=&^d1T*v-xu??x~y+B7JhlpZt@G(Ra+q-lieV5qR zjKG-jb5p8@bgZ%|A=97D>sI4cy7t2h zb3YrASpHp3{yoHLdgaWLYi^%jb5X*TzA!E_4ffX^*gmtA<+qtq$mXt=iE_l>8YZ``lgJV=_xJEb z3(o3S@iF7WmgXz*l13Hz&HW>)p3Q9xipg;+sfr^~Wtz-S7)SLE$HmPf63NLDpzXSI zviq(l6lo=kisql)&fk1vhsN(djQ~?#rDD>oW28!~430=x zgL=rTN%OP17NU9Kw7kfx-+cY{k>kNNf^l;f^sX%n@|Pv#>tZ*8Rd$plD zFJH|y4@b`O?&O(xaLy8)XXbfwz-s~)4$27^}IluJp z*kf^b4ym?h`@sp75P*_vb&IRmQsC4lY$*)cX{qEs?Ag7!eLp45O_IN@C7RChJ3^3m ztw8ens(lz5S!_}pGXt0@5&5D*&6?`JRg37#LyJvvj}qLtp(4^&Lv)2rg=9ldzM&rT z$nX2v#mD^Ff(b`88PC*I87yGs+l_4(Y#j%a8Ia|}zlgau*I(QEbSd6ek!OCj_bvB9 znkLKB6i8Hg9HZ+u8}+@4tDASHMCeyL44hbKi8{DIvW3h&rtl|P={*;C#2 zmo<8?VVOR%`(!hzMz?Aa9ziEsyWB+unMF&6L{VH6cZ+CuEOeu~$J#eIw4}~uqe7PS29`4WWZ2lyMm}|4M_{!Z z=g*nEuMb=oz^YN5&}-k!Kbe_lUq}Ir#hBP2qsYn}?M*S_sy@e6j5o0vX9K=q_I9+l zYLr?_M)*3P=TNZ8TXAVNL5khk5*#lW_mAglqenR*P*SW#2_xWBDv66d1IdYcBoX(5 zd@TpO!Kk17vk`l*5KwE(KUA~L=juUIJ*>AL=*SI>L+Z37j&^}rM903fk`lCl9^}I? zrHsU;Fbt5?(dnV=fi?tr>`a)_9J7m$QV^{gW99)etU7b7*aYj__BhR7RVlJlQgXw- zV_9z$Z7b72?V!=1sj3ml*vDf5?!pmQ6Igd5Gi2e6UrkYpql&^G#Y{L;;#xpUdtXw) zS!jB%2@-R~b+u=PoV5)s)tZ`f)6O59VH>xdLkx_7?tsHgHckf31!aygeL=S~^@W)ov0OVMmYg%eHidU|H{|nT>!U3 zKS#Ud00+f`om6*Tz&6p)##*T+guv$|+G5kx0ZG(eR7&jFE$F;*A2vy=Ztk}QdZ>j~ z%CuLTy*>bwv<~Z9tG}|HkizzgTu-W_@r5nGyhBkMxvKwxb>7=R(4g-Dlm-f19@Q?r zA^|Z5&nB~&orBF~gvRSUF6GeqJS|BcBGou@I$cM0dgXlvl?&erYEA8Z(Lh67qM?#z zy6T$VD=!@vqBHI>y(&-!7L&qD{|M@`nKu%amzuNjIPMFFmV4R ze?njIcl=*@G~6U*`kh$h=5HYcrB~u`pkVg`{pSnW2C4%L6W`H%?@yNF@o{`vw$H7b z%kYK?;E492;LX_gLL-`B0QPf6wq!PiQZ5AnlO63V3}gvBG_aEu1?ZTtH<}O}e+_-Y zehz&`nL;$rqzJG z6%sgb+-y-478Y+%hLbC1)zELdCyW?)clT4Nqoq$*tbXEG+yaBSIqIl2)5lH@$An~V z7bUhKv z&aY_!n}`rU@O9_54Hd5GP_}Z?R!&Hg5874%Nso3aJ}wum#spS|_K7e~3wB;8O$DDV zh*qaT0-7;Qxwnz%2TB$SKo@dJysXAc;cKa(MfWi3#}D9-F^aFdjKgJlk1er$39)>6 zSBYdBTM&EbFyanC_~uPC@IR>^e|24BT7T=8>}A_y83@|6qZ^XFqM9>U5z(=BToSv8 z;Ybj0-f3YeW}4LW7<=|D$HPCKA8fnJeNWF|5seUFGKig4E0&GKs#tA^xK);%G=!n^ z|0+#~%hr&V=&QU^3D(XJ8-zNDWphr*F*29tFV!xz@nU>ut*bXS2rTjDTSiX>+XWEA zlO(J0tKxFc%~5izw?&1mXqJec-p|PFZa^q0LL0vN+h8zz#TtGdAR#BAy({w z#C0zsq;)M^%_H}IeZ&{`Ji5e$g4Gt_b)f~Yp+IU6h>~Y{0E`D=6cawb=_$<20h|+EI2P`1dzW(STF^j3!oFP1JGMprt zL64zb_GoH)u(i9`?%B8!+p`LHpw?0AKti{hGf<-&B|1$WwAV}&S_o+znVIhGx|@mO zJsYHBUy2xmgy!vJP-j9#GNO$!Zl%c5)u}Dv$Qr zUwxyq9F8Coz;W%AL+GXnB z!g2G%#^;oNE(J1K+U6A3<$H!cBT=Gtazk)0ecK0XPZA4#;}ZP_Pc@&~+O0slS0g9j z+NSv^E4*EWc;mR8hiug2{Q3EF_*0oKy^_MSGWRmXe!CYnkYlA;5(>Tq2zZqI%G@*| zdU9El&3K8oi@f{A2_@Xm16OG zV-4nOD)UnET>LH4)vp{WTANrrikc4Q_u>O|7jHKlKEaSb(|DmX7LhXiH&w zreQ?J-kevc!}D>h-jp&$5$h|E4e|u=yGo~6CJxw>AU`hrRw&>;Vm=KEdqn{e)bzS* zz8}=(n;crgA;mp+2|C1{@W6Hf(k?aku2T3yeCa;c#G#8KEwme*$H2=x7KF|~LXM;> z+pRYqpWW{d?pw*E4uWHyn2BAseJA%)5@fwaVjd&`VY)S`Nacy5S52` zSuB`^T|x?qRhI%@t(MppiJ-=f9R$hON|UQQxscYvEC#L0IS_9vnrv^H)vHlFHOOo> zQ812ojn&NGQV@GZ=Y{R=bdjkpEI+uvNvHF3>XR$4`61Keyq)Q0(#Pi+^QWk-q^`z> zn0mr(c-$DKayJE;q{#FqZ^@0}jxSqc+7(%FJVOZJe^GmD%dB_gO5^7BS`bST`gC0! zO2pxMLg7QsB=uTh6f`aH1q*{0HvoR?SP^}4%hgxM%xh8_spPUD4XEaSXulN}SpnwheF*j#qf9Z{!HLFtF6Tc5Wm1@c3`W@xmy5nG4VP0uW=F!7=6W(*u&Yg! z19x0vyas6DH5ExFVQ`*l_DDhC0;j5#ii-TK$yC6?>q93}4RZq4z`mtCFw;|~#~iN7 zjd4B;4=qCxEaKPTG|4vsgf55H(@r6A%{vJ8f?0-VL#Kf(7)D%A9j04_-#r43-}$oj zm>R@zbYSv+=)SEt0;)5n9NfjTiCHzPDnjh1>+8NU=3}@ME%~})STrTbf;c}}X~nw0 zdbx_FibI{L8ZQVfkzU?@Bu}bCnl<6Wi%vy}f&foo`l9QPE@<5k>?bAx)|Ze4fIL72 z0oY+(08$}T)os_~3w5feGr0TuWH)hTtGd#FbzyK&KdfRJ!%U$lY)yg{N%@}6h zP{cYq$&x(A1234wczWx(c$H3VnxC|`;vS6%9|^tdp{TD6 zYPo39S=vHq?e}S6H@nzKCv8TFFlR4mU7qnMT|jbOoLQ~d_tQPG1KhCp;W#jbdS9%& z-_v~}BZ@@e;_h#amdyNJoVnCFxOM(#Gzd zv`t)UMw)#5Hzj&IEoR!hL}*Jm=vhAa58Ky0rxAv-#KdJV@GTw_xG}4?>4DSE?b{b^ zW-o?bcz#l)iOcu1^;DZ-=Ow(>%Xx|%D8`=UJDmnha66pSHvEXcyB!PGzC1V`pmts! z!zLe#9S+P<53J?;6>o*zFO;ZFg_$lwmM-zl3g;W`*Vdy}&~U%aV(u@Gu@NJcD#RYz z5ppb*#sX_m;7uMebr11m)oj}R&!5)cOPuM!)@4N9YD6m@8e1b1!rYv>iTTVctBt{f zyt&puY>(@~2%YV(_X0vlxJ$#oygNR7a3175M|^fG>A54nL}IzX>*L4t1>5n(fHpaR z!pTA*kzN?W?}yDn+pb|o;c52841d3+G?$` zY}O;yGao%Bk6p-a05yuXrz29Z7ohJYRMU`y6XoN__;Dz^72O)(i-mLtAW`;FX9-KNtIW5UQ+J{chW=74WuNfYQwaC0WWF0ub3g{N$e;T)+@cn4 zqYClF6^N}79;V^!)Es}PA2nMiy@Mykf&Au2dE572lJVMP(JDi|Wv~-$9uxkCr%9y{ z8g7r8SE12K5r>|dY0dJI||s_>$&}{=OiIcO9oj01+ZxbU4SnSQl6VjL1d+rSc*=@ z@|}Q?P>pwnm81}T{LEQ1(b^>~Wf|)|L1iG>wC!FLbFu-VK6tBt>@58z(_|u@=jLW{ z@d8NOAR%WC5rDq(yNew~TSZI=_geW<4zr^mVm-n=gKM=zJ1G{Qyc?r1(lrVj?*Z3f zk`t*xnrI@LuK=beLfuDPKV0uB6q&UNNt^`J7!aiqBCW5=D!Qz^WZjCgBA14zQaVvU z>=>w5KG-hHAO+`uF1HAY8mHDV&sR+hNd4BTU~ z&Q+QuS7Hfj7J>be>sobCi;-p*R9<*bYH_5ca9T6HhrxW_HtA%OqYznaQ%#B!S+3&^ z7%2oZ&1e|uFygLUWHia<=(*D9O-{dPUJ8ar0qAYTHhCU`e zh_o5)icde!yE_5j#~Z@~KpOx0198%H0`4}sS4*9Efk$4r{Eb@m%Ap*cxE#Em7r%Dw zK}inm0T~9qhCef*BO((kLh5Uci>uUocn?t~1kLtwiJqG-#ni-+ko?;g3}|7VZs3{C zA8wqqy}hpdc>o|l|Nb2PGdKPpOTK@H|G!~Y!O`B#+T?GDjZo0CK@vdW5u#iLmIza= zP`9c;WtfIN@rM-8vzj5dghfD_1-Exev2LVkH8ern?YthwK#rJvr`Xj(s}U^Y9g{j3 z`&{r6HTHm?)d}nxS;}uj@Poeg#n+9hJqPB8lSKPg2BVi`T9C(YRt{R+mJS1ci1PI5 zV5un2LGId#{0dl_Pro&mSlv1nUKkoE%MT%+sCZ^wi1JJ}52P1}cwa4SXR2qtDly*0T-|+OJi5S zVcfnI5>9kid`EZO%5r1+po<_-&Rf*DA`Q~)Ov90<<@jvITsoa&{{2-3v}m1#(dRJ- zB4~$Y=&A<`Z{~_23LQTgFTP=R#W*2RrfICEMe5!#o?BqSA#)gz2yW(w&UiU$ z;}AHE%@j`;GM&>{d{LYXBGey*8=t~0R^i>bR|I?S_Vt*n4VTD9yI=<`2E8_bD>4$!bKu~wa*k1w)HGVd z(Leb>!dk-udQRTOx=9u1xU+==ZoI1-_$u=USb9D0>~CLyfF{2FJ7E2f4$l7qEI~I% zqko8on=-SqD1)6Y)baQV2;`xmM8%c_%nJBY#zmI#=?N5+>ZRw6lQJ6 zTf=Sz#=tCj;?TUL+YM3>+1d3b zeB-1QYQS6q#}1dau3gl&0G&_e8lu}be+$**ZthBj9Oo@bRFMWOQw(SOgDkKI8I|(1 z;Y4)$75^=^YK&eRM$;da#a<=uA=~qmtnz=tA&$VS3i1XSBz@3GXkdSaB$LV@vDsE^ z0+ZoUOAwvP=>9HKrp?H4I*$4UvDxe$+a#IMKGARNjpL@zSZK_2q=hKKcKPuwKy=O8 zPIL}Ta3t*n4J)uH!k$o?o>`lDWU{!gJsT6g@c4O$z+8i<+0LrT7!d*X>3xa$x*D>PqXa$Ud^Qm*@%clfuxfNA|FR|3->0o@CPxR^xR- zr7=#dUJ3Y`2BdNiLpD+FQNyfT>ZY=9YlBe24bLgJQPWHsq9-iMl)Th6fFR(gOZH>c zqIqY0#&wy@g1!`XHKH5nKX5(HrLmR$jDw*6HV*!e8o|H7^)q+>R}hr{D{b>M(rQtP z)~`P#o=)EK}H9NTQuoYuIre{tGSX%@GfKA%)B0ItMkU<{4n)l-)qX^g#WI}z3Xt# zQdHxElUX8G>(q0NlAU@BUU0)8wA2RXnN@MUr8T)jkrhC7!yu`e9P6%pNq7d5gcMX%w14lI8r;+U*lUD0b@Ob4w^XVR*qq18H0S zV<@$HdcD2pGU|SV+j`p>8h4G5<_$@$Qr_v zBQSCe?=}tPPS)^3*PdEFTpW?AS4t6GN^x8tnf$t>!tN4jPpf!wjxT3wlW(G@!ZP}b zDoQ8ibmpG;>j-Ef*RKH+X6^Y!I$NJh#HfzkdjSa+%aDqdhH6^p4yY!wV%qN+DqxC~*Z6^cdT!2qwdWLDIwh z?nqp?H$p#dUC#m7rJhDv24b9qmc>F(-hawhXPJmg_R*sOGp zCjlHcz+Em!S}%+9eNBQ0o=E6NI?I&uFTf*rHh-Ze+}v&(jh z2sAFZ$Nc3ozi+{P;oUP@RqSb4?5Bcr+6Kg1;gC)@Nn5V_tB-AjJ@ChbLOAN9P*@87 zpZI{K%!gJJo`zGj%c)o`w^9Z*g4t!2v2M~TmgGsCPX>m`qqC)RR-<{A)>Nlel{ z>ES%-7V|pU>GKK-q~kBX<(5HNST%3CAD?nKCby=b{>#T1wQPq{V_84uq|Etk?Y_bs z7{Yg&$z1?7PQ9g8i^Cu_>8CZYK@uHeW$`xQmv)fMwmiYa7Md@Rz%G@EX)siXuF44Q z)ZP`w1nMp-KTcYNPmab$5suok3nw99bnXbJia5gET}>Dh=+-l2Qpz6UOP zGz^_V7Ns?S5pLi{+aEcB7np^)04pr?s&?zLT=z)5;}qdJt*SZ8SLgjc7Zyv?yV^T= zF0;*=J&9Y>p4d^8>+6N5&BUNCJ=YcUG#Jl z7pe@=L)|{Q8(T*Z?SjgS11%?~|%t1dmK7r#Jf7lSikBc1$i7Q$F7kZr86 z7~`*2d=hgCt5-WL=GmCve{5VQPo%pl@s?wi`y#355<8t~*y33xq_)b6`D+K=1IJm+=0KO% z+LjFpcz_>Xe+pl1zYJGCx_?ipdWX`9O)by=sA-n@YC!h8bruTtp+M}da;)FTcvoL) z=@M)^EqzU{=Ug}iojWyM%}hkGAroy)EY1P{pqZK-Upo!{6cXH_lJq zk=?!hquv3PI#*b}3a{%yqCXws7yMtu8DUpT~TQVph2P-XSh6*4x6NzlaZ2+v$<0y+?;(Qz^$Vj_DRbj+-k=H%kLrV^9UQ?rK_#Xz5i_=rXgrC9OoSa1^BgYa0TUrdIHHH!2{0Mx z({7Q*Tfbn&gG~W>(A5+|=-(ZE^CYWjgp$5HhU8I4C*+h7wTw)&JSqbs!%QRdPA^3O zm0?HjT&YPp*hDSe(?6d4*n}P9@<3gwg`kPlw~o*(N2hQR*SC-8&W5M75ZCvMp@cC@ zLyJeIz1X93UWi&Ir-dG+0eGQDgrZSfssOx@BScZj%XS#r5Yv!6zOE?7dYW9L$afG$ zfb#eH9=RWQK0m&*L@N6ZPaz{(X}gA-{JN}QN9Yj;0sp!bnDg;hvik)&o$dX(Xr&DP z@2UDf$2QvkNViZhwXy$K_G3D&FN}bK_(TP1r{ig%4@|;sMPP@Gv^#s|Y?&nOGBifh z=d&M2NP?C1CO6R9`rTrFYqZ^iZz6@s_w=AF8}Jc?Co8` z-R#g4c~E;MMu3o2IyezcdYI%kbqw6=?2+ccS_M*~w|u-RA5Cl!X3qicZBUN{Jf7Z5 zWPh9`j`*%#q>|K-dkXcA2FNT{t|hYs21kRagz74?F@aVRg9D`^8RR%5k{}POJiGOU zOHcb2AFW=)uTGse)jsJocsx9YJN{!aiXIV@3;2Z23YWtxgfQ6ptKg|;qq~ZaQIIMG zpXbc#3s7;YQMQv1F}ot%Bh_Liz1X%6D^|gb6jeNOx0-7*NiD`ilaL>-?$L!S zkV)0&oH>42rNstlu?LxhkMKTm6xGs> zYNeH4+O8*LH<&icO$HHb&1my*ou~KY&ih~GvbmaF@A}VFhx>0+-G2rL5lb7r|Axa4 zn_2$P#ZvipX(;l7W|Xqe>xJ@x^lL>hjwv(h;r_RV&&&HU^v|Rtg!_S!c{O&%^T3%4#hpTQZiWj5Hn?&R`?-so zsaZh9S0WnCYt+`%-5d`r%~IJGrJfm?P^8oQ&^=v1wG;RoV$q1N&{DI(6$v&tl^p{) z6`5iC5b7}Ps~M~SE0(YyPSIfMZ2jc0>@uC+L8wz9#9wfbLeVh8cWm?e;G;!snD5kC z-AEyld^@fBQpsZ);v*y+Fi9J z{x#}K@iHewAp~dFy82tCUWL|XDjvJkIge-P7>f&(RqyZDcrn)yu z*>%J-j_Gl|7jiA{F3HI0s&Sr4Es3IbJUVq%-I9ob6Iwxx6#VXzYD3IXB{EfUPAI4G zbhJ(aLl7DoiH*1ug;#8wr+g>}5}*^mY1$0X!#co>#?d4M|I}Me1|)CmW)~O!zEE3x&{#Vi z%^qN2+fk;#L?d^@nCXe*&JNb*q`>~*1-GmGXx{Xq173W|-iE4qpk3TU>s2n{o<05U zP8-CXSgYEnbaI`<3pl-Hpl>F^xg_2!cft5RePr8 zLo0N)l)A`vRtx&x0l=2CV8e`M^_lE~!(bdarW6%kQIhzeTtBfa`3Wu|Tg;BUqB3(L zZ`jazW3@Q0eFVLt|DeB_mb8y|y)7G~%ltL!dqQTF<{`bxF)aGmjildpMB9vc=0(r> zv&ABp=7+*XSMh|u4xPn=+j4N+P*w_W)z|8W6c{wSD_9>C4YRlwv2u_pG#V1BhH6gP zt(kc%A_!L-Dn6z7vR)dr-r_wOv+M_$m>MAr>(K~n%{ih z+J$xuU|hvaQh^ADh&dguTo6x}faGBsYs51L_dFs=8jiezGF$i3_(XP4&xM7()&{?Z zSj89O8r4$S5z>;W5$KWuzYM*D{9)iz8O-QZpEq>8e^?3j&smD{f6r2XHs1Z${akTX z{!>WODnb#2hVqLK3x*(~1+K}CWNI^&OP^3Ysn6gY5;|n&sShd?Crcvo+0T340)Lc? zycaMW2?vAC#<!C2rDoad>qDy7ZQ=uyrVZ6fQcSAlE?xE~q zq{6ndLK8Slo>rxYp8zBz#sH;kb9F#3L()V#%Cq`NC2a(mFB;gww;A_iw!oe z`6znp>T4RcsvHJyc}%Dw9?h`A^_~MBnzrpHzui|L>zy*k!qgomce~{+u$hH_D-Rc| z8BY)+9%n!vZA2{4S7q6?rM7G&&G=o6n?$X2==-;F()wpPsh=Na*O{QHu)@BkS%b04 z&a8*-_03+%+JY~;QVMa?&MT}HMzVjVz@C1Hnqy6nH_U9UP|#{qffK@tXNtiRZJZDG ze6w3?Kb8LuoRHr_e7HVaW-m(?)}(2u=WRM zyq@%{L-#LQ-^5Nyb>yz>{kd@nFC;S>X(~o)<}iBWInH9F46~ey57tmDp%Om(oj`b! zo$QD_`a2k#Ei#PoH7n)F(1hoJ6mQIP=v?cb`fucOZ_yp%eq@Si&Z%;Ph=n!&D7Q6Y z?3(j9Dt+8=UD6;`k?_0fN&HBfXs?y3ErC!yM9>vC5pQ22NyDV!EK9%k0VrWIRJ`q) zF68pq#%aE!<5P0+q=7T>%|Ay8dHs*TPCJr{%vU>KPGlhQ( z(_S$$GCd3!1Diw)@5R|f(`js^WULDCWSX)_GOy6Yn%p$&#d($%Nx#xI$NllU;Em1* zx(&gkf8Ts=U_73^e>uE?2ExmU*ka9R7t_?)B84TwGH51&z9RhQf`S){x}AyQDX1@Q z@D;)DAT%EYyd`pQBD7`X=U0&572|-x1@~{+0oe(4&7(L7n()`*agV$Tt|%kk{Q2oI zOL?VX+3~RiIS^PJ#OooouznlkTl9$q`UCCOCe;__c}dIRu3m^DMBC6_L;aoXiA15z zE%VC>j%RJ;Go+z(4Qf@+<8b0AMl}c+lo6!Jo|DK@!KcVk6KwveCHaL`8>6XKuV3iwI2dvQlNvrhDSWs%8Y+vQ`zx#g$ z@P94<{%1<(pE}KdWmfqgGOK^cen1n3gy~~p0qs6D1f))raA`mcyBYxtqWt{q$}(77 zMB{a3$)gI7Qn5VZ;d^mtjTR!W`t<17L|aPZq|MvuLliZThbba!(2Rl_^VCL(qK@H7 zio*1)PDE0`0@rn`*7O5?xg&qTF_Rq~H)(8#3r^Q65&_@P55w>{m^#^=O~O9Ydte7Ay8dXeIo-n5zW#UeNwGOP0UE(ciU8-qe)ruM&g$G z!q3S=8hQrGTcwM$0aPchU`ammJ?vPY&C&z&ybmEaJ){R|2`e&lyvj-RSEV<&HdS&@ z1G1o}IHNUAmbU3MD%GJbpdD&`kd}6tx-^4X*i!3%NdfmcCD4D!{y)l`|BQzJtPCRj ze-+M%*hxuXfzNtf-TRWfLS1b+_jh4;Gx~Kjzj$t1FiI`X@k;;7%GMeti(4J1P>9fp zH@RsIQ0Q;wx(A~kHyelJ9%F-tqu4*06fq+QdoGDgP%yr3uZK)Uf8BsSFW6okF=cDf z+UUIX;KUHJ8zNu3Y}#b2Jj=0-j|35NgG)BT$|yM!`-b!W#m1J>@d)P0tzfnZqBrDM z@UOh-p@Q-nOLxr?I`|jC6qpjo2cqt3PEm&Z3|U*@3HJ)?w=w}>r6jhQok*x2a9q%x z`}VE_yxwk^^IBV`Ag6dn3Vr{aEszdHy}e>Jm|nN>XS{=Y{F?=JoT?`cSU;N_oZd#v z*zs)93^bZW^xvkIVb!BnQQRrg2!WBN%{6k(k)HdJ{Snk!E$x?Y{C4{@turuKvGud6 zIWhwNeOTA|sI}%|1ls*3mWlO!)Uh&4ZbA3#5o-lZKcH~r-tkIAmS6JKu8mDiNbUcM z!q^|3Y$l)opY^{z&Hq_B|GSNozU9B1XAHp=eyIE@c?n8gxGhPW7^*LbEX&`qOr)6m0=P@);Bvuft3ry`XAO;a1ueaf{ZG#B3sE6Whcm|LB6G}7(No%bmox#sJ5HsoTj|GnfZych z;t$q6e24EvI%Xmy=`u?i&*?k-S+0& zLn;K?cBpy)YWr)VCUp_Ed`BzNX3q{QExibH^wI=u(&sM{S(|p#`|A@B#Q#>z`40}X zw3C(oe<$RrQHfrD6tFEHb*s}i?-Cc#X*y;_EePv+F@Y-)>h&gyI7cai*_7B6MNbxV z-kwo#Z?R4o)H~ z+f~Dg1FX{*qa#)-2(9E^P>Nc zpZEWay=5$&|3j)vu(zL6Kpo0~iG)x6Rx;HyzjH{bTxP?gaU6BRV z!N4n4cNRs@l7{aU!dh4rg-vdt@w- zBxj^0&rrIgb?BBTOWSRs>)Q`P3v$gNYx>|anBC9(_q6$D8w z!tu=taIzQ0i;2>!#d&artMM=jsEVDrq3&5XfdYMwglL8?E>Gv*e+2dbZ#u8+q`k0E zhTY6^d~^7wxsLdb&O4s>uJrvNW&-W8ny1YB+nip)v9iba(V2rC{Mu3R!^jhcY@8g4 zNc@>xh8b{{BORtjrU4MQ2hZJ4JrQ27-dNb`)}*bN>DjC2M=@BLfh6Bx*R8lr9K@7I zg}__SG(HL zQ4E?sDi&BI&BkRJ8Yr%Tqd9Ub=MItvHd+%S6C7cARb#a|0YI)`L9NLv3~1K691J>w z+}2FF%@0{%tNaaA0bwWOX)a+l?uIQ0Jar-cVT57Quzdd1(p@SehvwdaP1Y`ywbisZ z&zgM9iNarq2sV!M4-cX|rBt;U3b4~so<0iLP!wm(E!lqD!UUBJ3nmW2ebSug1u`)+OVZAoRt}$^ko=~9;?kifj&In`bt~pRK|TzGB;6)$xS3+JFGeLm*5Z0 zNjt|{W`Q(r;{Kp%C7H21rYp+pA})2J6q~6aHDoel*G%VCbPGol!jk=G&_2n`WI%oO zIiTlUmhyIs3x)}$YY{fbZ38kaSU8!?xJ4<=VqT`D!iY39Htj)XqHR<=T0F2tG znER5uwz-A|&jJU!1e)o2^QOZ@<`$28rynbHc9im_ui6> z17U8K#7R>*{6b2*7v0>fjfpM7pEK44)8ai*;Zbnx>}x9~1y;rlQRz{1?9EPvB7iAl z{5S$$gQv_(yzM2IH^^*w0>O*@EjlgllbkW3Wc?W{2%^th)!IGtbKmeR1dG9IGF`r1 z&D8U6kZTWo`xy=VlSp0x7&-knf&&%JpW)Tvrop}|3`PLQ-Uo-?hwZZ5jt1{4uU4sx zI`{4E5@g*ruW$`L{U4>)oU`ozwwZT5Y~mR5U+^Nb8}-Hc^j{g+&eWd%R9N%{%mA(%wRM)LMujVaSZY64{J)wtSB#B zhqvOwBCSRdaT6%d67|#A+dl=D!#wb?`sQd;^>hesgjG^DEIiR&z!CJy^G<_Hb%9ob zUg8!_Yp7DG?`+vVF7~e5-%3cnv4&$8k%~H?8RPcL7)d#xmC|xPUTgxAn8doFUd#l{ zQS;t{YZ3hb%(Oh-O*Kh$Ki@#Ayi!-$v~L4(BL8&pmr7Sa8(C_LYR*ISDar(1UuVfn z6M{;Q!6oz|iR$cSS-8Pv1zZo(QKf;3d>b|9vhpP~`8{eExU!d2xq-O+D4NNAqLfPZ z&sO5EaU77HXdA@2k9Y9?Jpmn{QecnwWal0M)5$aM4hNGLB`lzv5)={~&GUrr^RFlc zd2(|S<_@474ycc%BwO=>@1c6UVgw%pj&H$?5!;}yv+1Z5-AKpJe{-Qq!?$OT_(Kkt zf2_R!OOg0jg24Ol!Ts+NM3RcG^1L7_9}J!4{IzQB3iU{cfh83ZXj3zx(m`1+%LU`! zUbBf5A!`=t;tt1?xu7|skAsKv5W#^*!>AzDmgk7wW!qzBgS-3f<5tbq7xZg?LkoH3 zC^Oe(l@_*wJWZ>v-BO$iQ>e&1`;Z?y<$Y&t_r|8*E4Y!lv4laV+aX2N1GSsYm`uVi zcpuoen0wX&>^C=v;MXgEAfIr7vvK*>K!fSV_8$wT8a`FdR47OrY3!*EH$ISwj;K#E z(rg%DS}(RyXQg(`l86W~h`it@lismVHUsgxPMMT^>pgze1@zhSxM%U6z#Ggg`U<+) z<`Aw+Z8!0{I~Q0msI^roN>g0Mk`qnUx~v{Vm0xs+T#wwprwWx@%6azWF-7Xv<#gMn zEpOmbzfy6kVpfCq0dffZSFMSehztRVUgmy^eRm*uj9dWyXwqI!8xg zX5CCruxTa?AygRHiS8A$oHRKjy_&NrW)X8IFXcXK6I0OZA=~k0IkB6wHQ}Z_pT+Bn zZ(z<58}2E%dYigOQOq@%cbnP^XKUilHTjx;q*|;M8!P+CmwvB(D}#it>k#|#tBvJr z>2?;W1#Do)4C0E9TY?R_slk-Lle?jVI^=hG_60CG#r0Xef>x;hxKRu8=N^B}!_&xf zr_g}CvX~Q5CKO|}9EcT4g?|;vxyCW9-Y%3*lE5>3LJc!|0X2p_WBKmUEF?G-Ljb9k z!b}~0c*4*SD%2^8t62$+Bm^KWwmc_KBMN64JE6G2azZbWPWG4L1shXnq7O2Sqqa(4c5;#?z) zT3Q3ix#LG3#=7qvG`0Qd1_Tc<0~tIg2^-${_CS6R!14dI2Gkmlk#J9|`L#&U9zZ z&(==Wb^|Z3JnJoXCBzq0^&MXCjha!1VR zCvLd%R+{Q9GGMMCXz4ooVQi66w(Vsd>tM;rAU1>n;H&_}7;=9cvw{?fXp6GUzE*`9 znW}OYGjgyc_6e}HH1tV^UAbivba5Cv6pc9rkZ`RHdWWt&Gk}tnuA{+%qpYrExH%K1 z;o&bVaV+*l+Flr}TR3M?tGYJGcEXt5Y+bVi?n-jqaeU=oi_)om2+(YL7sG57I-z%G zx^tXyt7Z0+jLaXldmF3li;T$a6-eb6hTfR#wSfv3CN4#6>IOhG1^lTrNi2;zQThxv zmzZT;i->x&W|$2xH2+)!j=h<`=oxXr3U?q@kn$)CwW)y%8MD*umsu{&=-xwBQtlwmH}FFzt>ONr_MjWhMo~r( zT_=ZB+{h_;zKSPa4;ph^Pt)`_�?t|j)E@RNpe{v++!D8?v%854kC@{<% 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

O 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

YqHWRa`zcWO?b4>piOD$r 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

FZld?E?;gB#5sGjAC&wD7BF*iq{ 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

q zr07r0>h~Lj13pCt*uIj3c)!zIvT=s1pbkOhY2lPfRv{hRv#Yyjorss$&VZ|L0PoJ8 zeu9=OJE8rRYJt9L&4G4ikABk$bnA{5R|_KfVhp)`BoySMC#NIwfVjXLp$u;@DIjh@ zeW>d$4r=9xrx{7f`%>9kqL7DiiyKbF5nCID-|~}ztQs2YHcH=68=aObLfYLOUVmPm zUYILF5FHKR5D~ReZ<62vdAz$2zBZw+rNRmJD+ioQV zyS&>w!ed6?%ZsSprual-=ql5az`Hv54La@+EWANhYv4L8!Z6QEhl#AY>o z!4RNC)@FC+Q-Ceh=JlQ(9P18vW52{Aixtqntcai1eqPewu%@Z>tXAxNx_;1k@z6!b zWsmsdUmzd_Hz-1TM?l>-OkUd*`3FCfJkU^~<%I`f}k@B#4PCh)32)KdQ!k zWLl{k?OQY2G|IbzR6FfvZ$i4R1kgD~E??87UyC3~Xr`omn`Ofq!zLbIDvBvv%mn%> zG8oBz%6C|*ff-#SK@;X2;Zm}VtpG>c!zx5tVxaLxLJm30OVKm+q=mE;9kY@eB3;f+`19DzcadbgmQ1a>)w$cH0EE}efF`%Ur^S~c_~5s z4ONP<+6Z;suuL#N<_$b^jzzA^_qu?tCl0YS z?7UPE42NKo98p38(X>3!X!^z@K)8pRLw6+W7WBLv)XPIl?G9n7={>|g$v-Wg9QW-@ zL{J-9GL)oZjdmLNfNbk+2p@GvQtxw7Z*@glHN{7IVsj-{yHe^dSv<<9e{$*8bCmkB zI(|{HcFVF}k)^}OOumgC0UO=%(^<(}CQfq4+LpVuE~t#34=*1&hnCKHXv3ZHoQEim zMpcGA+DS+<3I8n4Dne|T6wz~_2Ff%L$-Xt!Yf$`zt-a+FddU_Fy5W{gIS%Q)W1n{G zCHOL;`7&atPk)bZe6Rl%OY_y4uwB>`8iA^co+0R<8A&SXq>n%cd4#El~=pX*Lgr`WzR5PZ~A&0TD;EWqNKdB&00iszwKI~;Q7kzMZ5 z^R-|xF*+imNft@&cF))% zgyNv~Y~6S1qcU6sdeLv#PnE~6ioQ=Fchj*rRPcJQn6oQX3_+gvVA@~ZrO>vsAKgOX z-st<0Pcdhh0jE}`m{<8J8cH@^zbW^Hs13g~nv&&|S=&KqT`^kv4h6a1_dQajI<4gzHV#r*6=UgNr7X625J2r^H5(#?2ht2T0ey^}@Vm zC?EQkQe^BOK5CRX5jdr1*<0h^bZLaEdtPegMmK3ra?uB1{}-jp(&fQQ^qPc%yoGFA-DJpgb(( zVCnV48GJaWeS0wX3~^l3*kMBOXhY_I#wm{*cE0=fkc!^DsXw@J#2nLXU5&FbsFw5b zlfy;Sg&Xv{6Rgt^Q9+MgbO0}pG7_!ltoWWA{xxT?g{E6uQwGXm?iNw<*z2;9XdKBA zy26tzVr z)Zh%d#FbC=s@uR%Ik1>EhcTzuV_8q#8nAOw+903AH%pxc<#lLdj;|LUTrk=!kls3D z4Ao3JFLJq!pY>{H9bH)7%!Sl4My@Q=MA}*7@MG2{D=vp6J}xXff>F50D4{~<*$cfz zbLCT&5w1HUH(r|rKOUN0jMp~G@``VtEOcR4dUG^As^>RZUc9yKU8b|TQu8at#S2tH zS(}*QN9b=NKBw)GOk-BMkIr-$sdbc8JN}|D&(|_Gt72qU#bD6dENppAnp}iE2ulyI z08|WtZP-7zDc+EDat&K{)iLX;r&Uv<@@f4QAA)cG(@#CApL9e|71VD_1($9OC)+ED z>z6lDg=P|VHNqN`Kyg_cUa84A*eN>Tjig~v<^cT8ZBnirccR5lmj$eML z8}U(n)^<`|19Ou(RIqueUd;KzjY;q${x1Y3DH9q>7;MHAIDPnmM<@jdlSIGn$Y8VB!|?+*D4m~lr^a1C)V?8ZI!|CYelhZMGy9x@MO+}3Zx--3$>IrrEC*EHfqN} zQlo*$VD54?$>wdSWbl*TKYP^vI!U%KB% z;$^GZ>}y(-nnxrBN2lnFziAcvvym%siO^k7P+YW8Me)r$ zYF=yF^v1suKeuSt)6~fNYeS2S?w{uG!2@k8kZHL_b5edzcz>fV)%pB+*Zi&7GpEow z-_x)AfE6-WR&|sNeYi#?fsqdu;Oi73`UUJzZby``iP@CNCnP3OOEpH5uw%#~BUis5 zeSzrweNc@V(9P(mLFf+%=V+l4&pim|>7IZzsoYy~CEh^F9JxRg%4k99H?_c5-3?pl z2j@2g{FzDz9t@7YaK`h%7}M2jVMTFAT;&9Yk&I}VdXWA}P`EQVvm>B3ALZZPKb zpW59;0}IvPce>pn-D^uc@n;feOOVn%=czx3+1yOR$ru=Se8jYd-`Rtc=;rs6?|^Jx ze-|>e>PLKEu-O6e?06hT&?;AM^*_~ery**%v3dyr>|?}G77yA*I$~MnEmr#r+5v6-P%Hp_^v$M zka4JJytMSWJ@ZHe)IrnyE`VZ(qn?mXsLsOL`dw=>QoFm)JiL#REyyFzs~xrHoDpSN z9inQj!>T|^vAE;aUJ+}P685a&bgI-EfN?ZOBgWRuHB|$CW(;2LwCWzjvr?-z5anxu z*MKgkb+2j~t{ z6j8Hem3rY#y#&A-vW-tAYX=a?-5L~Jr>~G-T|1VL^wI9nHv}{>U^Cvry~cddYp3pQ zD%? zJ)#+5?hcc;8m^gSv6a5AIHbAB_K_*sDxKRnzyqv6CbmXrY|21)|9SJ~YHbIOpWs5~ z{x&`+Kc+IL&y6h)3_0S?l|hs~~ZQ`1b}< zV{V#$+zZBWVp}iwh21f0J8$-#Cv9T;+XXU|YNEIyQCjbTdOs(e+GtG{M8MLqypB;a zJ%4|D{+}UxcC)(X+ePP#jDNJ&?%IAKQsmTK+mIJ2ln-~`(tssGcQR8YUAy)G(|E=K z!<1c2<_@>Nf|fER*-oL6MZt5aQp}#%haYy^9Z}2fVl40pE`wm`5gIL?w}LFj8ORmg zt6D4parQ*-P}@P6}SR#ry&spKF5dqwmbOW?WF3V~)|ut=R>=?+jXOlm7_X zp#&%&8i#h{itM#`;h&Qy>JMZ|Tj@YnPh*T(FgLm!yybSEeK`AQ5o=-@%o56raNZMs zqvzP+0ENFx?EM)XafwTnJWU?b`jZPmjPisz$N?>N9)!CVFFZcqc63-d>LE^y%-OVDI|*?y9Q%{b0~yUVVVz^_kLNT)9VvTFGDdtG?EOx! zy8Bj7j#4)_o855Cud|3rscyY4DR0lf(e?5PRh|5)kMPDptQCt-EbF86mL)If<#gM9 zl{*}6v#xNwR8zY?FTCQ(`sebOpE?fhH=OHila6k(pO}*uNJZ;3V71bwTyvQPPOhLt zrdUCMeltHEnBn#@w0L@?FZsm~(M%O#pJe3L%vjmSQ=;y*;%Kil3R%3wt#L<5%PlJ& z+omkn_N=FdEZ5>J)#R97NLS zQe&`GDN*)l$Ekj=MUA!uN?-gqq2c3blUVmTiA@YK7gK^o9+3Xc{+NB-D8VO)376;r z?xye+odeuL9$m`1L-^vvud;;8V>(KaoQBg`I+Fp*C=P`c;p~Yh&kH_g5;-|SFAi@a0|yz z1E_A8+lIO7%NB(b-0uJheD5A(Oxb$@+`}4?yd;Rj+ltpBm7@?jmV z>i`)52_?vr3x~xb4pGw-4!g}$fKU?DFkhq{MMF!LhQTVIf7HE?XUaTH-b2qcH-(y7 zNNvh?D)KGx%~SNe>`V{rV6Mt!jPE?o;yLD+=J331eZP64>jnZ0@<5W&Y|7XiIj)H) z_{!0T1vPdRqQ)^rWz0^*Rq@9m;7x0#Y%g3|iYwMH#fMv_dn|Ra%a_N^s8=c?#2}RQ zV4JWaajGbcGo5nHQ?bz&SJM>{i#gs>9n1QAWv9kjc9MTO1r6?1u&j@0O1jUF@Ddl@ z!8&m2iEmA|#?8c-VQIdG8LuG8gxHa+)5ouNB+{UUw;7YoNBw+ZiNqq75@ScIE@Vw1 z_`_an*jLF3=2+ePH0Dc>{0p#Ic}+k_pl1tMM_LfsI{X`r+zvTr*b~mMs$CWz=$eES zq|UK5u)E<)j&;X12;|Pd-36abnR=wKRb$o3eurO<4nPIz9$f^w{FR0}E!EqqL4o1y{pvol4vdHwXdqY-#PQ+`fx|XXU<{FAW;&HZ2u3uR zQ|HV%Ys*Bu%c0^`vn3q45#UAcGg8Nih6Cep$Az&5VYrwAvk2hGm24Nv>z>H%O)=Y= zX<{q7<;WD$f;RxdtEnI}=RbLpNNfF|LpD+_;4-#YH$tisOQxa&V~E5EV!;|fm0~!> zl%D3!22T4(qd1xRnJDdN!qsiXr0r}Rm_$vu*hWRtKXEDy8eXYpV47bJ^hCwmLdUWX zW?Y5})s`4<$EgFYjWsDy1TwFtzmrNi?GTCS;nT-$t8g0hT1E$9@Ic``k=u29PBusb zIlSi>NpM9!GTmzWQieaxa>TK?!ZghNfR7eqfRxzkO=)Yro~CSbl4NYSId`rQd+^&V zMd&W5uvkLV(u1M0GWGqNk!NAbM}=*2P1sBv3l6*ue>Bz{-_o9en(A`q(4{naQ14%` z50Xic`uaI?;^%K7MsId31TA>ZKIapEwQepO9Cv`g73Wn5EKXGqnICR-Id=({CI+;& z@C#jo_!J}R^Oq){lttqdc4NC!)OF5qMh+P0!xcDA z8M4#wB}HztZ2C&bG2*1$X`yEw+|L%|Pfw_63xGVb_v{Zz4otVursI?D7Z}^Gp%Rdo zVpG5zl^`7XHAT#~HnT+hG9&+Vz0w22o?VpHlw%d;vZz)SVzOm`FDPCzoa2}G5@ND* zf&T;K)GJQ#gQCGEvD%ZUu}Xc3R$H~y*hd+E_xdgf3*}e08RCZBEbZ~3ru>tt}VH?IAJ1)rhjRQ5q-)D ztP{i~@;+wsd^Ui`TFibK2R_WMp!h22A3b(z&b~FUoag(e0&M_APQm%RqbL{dKkems z|JyQZbDM9~QyYD&|0|zus{i@t1RNcW9i09R4v`6GHuGZN;*LV|MGWRPop$PGz|hR* zesedB^`x0+*R8tYK&Lx3j#M3u7 z9ADcUrre)bU)^6n?LemiQxb>^E}dxGrJ+3A@=;c6{S6I}CWop92XNZSjTM!kZ-><6Ri z7l@@bckhzZiVo2)x@ClvUhls85OVSCx+>*w(D9m#kZv`|wUB7wS#=Ope~i-!k2-O2 zPcH*pfN|$Erh#}m*T7F^uRrnHYtJ6p2!#){BnNHX$Q{I3 z2sB)2?G~BUS&wNkAYvzrw~CCW;uK0`JHSP`pSzqVf4q!C!RnD|oy+>tWT^u>eRPSY z8r2n@fy}J*HtBdN`oz>PaP?m8ml`ym#C<|hR~fXd*revDCD70Di{xaRT>T#LXFpL} zy9CwzRv<4U-Y9#3a+^j25Qao;jfe^>OkR8cQ1&2*u$doE*lcYv+UMZ;kHDiJg(i6M z;n{WtP7$=(c6HIW$ANqlw60lS83sKY^N3iCkN<_YNrCW>bz)V9w*PAKt z>*pJI85WO9(i~Hw*UV$`rlxVeexLtXJTkz8&gR233&;w|C4=M<29+9~;h^5@5IDB$ z&Dq{3v_Sl=7&JwVm_y%lc(nJ@ZC4+y*&ky7(PD_dR%RF~ zF|tFOM6{u@ARAkhj;B{BZrHg!{6}AdK!i)YLH&a!tWk-0&@N4wn^@BJMUkm7UhoqV7I=V1c; zxo$r*la0xC>-i}gulvV@UaY6|F^@`iG=*058CAe-a=nZ>`JYOp zV+pDa1O}nfH3lM8`4i7e1p~?j3&jCrFiC~ALvpxQgArv}O)bSVbYZQ`r^0G909fYu zbReeC5XFMk%1M)6PH^t^^n>(013-pk@JVw-zh{WWsQ#oc1{QkxVVNGZl*Tt%zv*>5 zpA1Z$g13+t?3gsE4F*`Z$et_*Z*0*@t~5FcE0>844NTVT zPS|xfWEK$V=D(7$Hn(jqStGRmw9^u0yi;+SwmqfbM7lsF#NPO8ju$*rv4KtF>0{8okLxpA= z12p(AbIKviHv2N|K?QJ(Mwx~YOOk_E00y7F64MhZ-`}31O`S)9EV>&BmLrYsaGh-_|V+T4zTN@K|Q#zr4P5&(^$yByf#8L+M$RLea zuj@gVCL6@+!1&c!=PC!}iS_0YRKkiBZztJ_HLac(dFCD#-=jaTVuULW+rOWa`9|+6 zW!Gbg)r>~i10K&kr|vqEkG-dlo|gH(p!5*8A;0UgZ9p4~^4SU&ld5za&%Nubs)HpL zYk*P%5CEPA*nl?U73YuMOJw!C_z=ftaMo%BpnTZjwfL%@$hjZOsP&6YMguTf{cJex z=jWrweuHuQOAi`COKEePu8~PzM=g{4u$yqy<4IY?e6TQ*bn!#5b0Vrz>-ValXi)t_ z8KqDI&`ip(=0;3n{PXl-Mwkp4sAA8s^T;iXBbKrcQbg*>pHuppadIgbzaV>|gayL_ zX3zj+``b{+_MYSdW*F@%C#zgH-12VowPhX$_?)thz`mXO8lFHtcqcRdaN7@VintC5 zQFkkAy6X=G7ox9D3hm3)VY@~2NPvlef`yX1T(mX=A(TCj@G`27O35E-8Jal~Ot>~sD0o&gYE^I>uux=ZxI zXX+CMpDW{~cf>aIKK<8Yx2@H?XjR7c$j}w5aBMb)g4P>|DR@6#byFlY+rK|JttT?2I)c|E=t8wvV~ST)K7-s$Ig6 zEL%T>Z4sBU1Wt!~4Ge-`WHW-)Ec0qZ3`xb_pX6=(tmeSHTE_Pq74^GFr%`9&iH}sq zOJ-Sjd5@XsKt9u_ZH+S@cbHjAyo|#9@mPPb08?(!QdGy4{;jiN%kG&Fr;7!a`^Rap zVm(M!9&}2H+|qH~%ys8wo)^&W7*opbrx~AKM1riC(Ffvdujc>S=HSgw1!}Lu<3}w! zKY||>+`t+dWj~4H+n2g`E_vXSgWA9Bl|=&9BK3~SSha^(=@l>p*aGTnwuxZ=g)1Ke z^(DF@Q=&Ar>(vrvn3q1;a$D#^w`2W!zI)vM?kYIY?pFP0gb4SB)BZLOT6WkjR`ORW zcGfK~tur~tKwCnV6>Si^j?f{Cua{0?Z<-64_Rc1;5hx^HMZGaqsaS6}B|^a#%GCp59S_shq&Z^|NTdV4f@k-1zsmu*}HXerWRC z3F=hM;;Y4(?vo7bJL#Qux!Bl$t2*r2Ta1rXl$m{U&3!L`n0wxIBP8MA9ZlvwmO-! z%zx+flfCqQ(h3wwl$ch_hdQ=$(o68c}826Xl=we>@N_dvK&Z5v?`)2 z4xG`3O2JC`9v6?6YTgr42p#R?sgswxVI6HVTlm9}|4;QY(?f}ozAE|@J0 zaO**H_1v63j0IRI2D&i#+RAElwdW}Sv2{H+@$Tl@yd=E*62&gYFSTN&6ISGofB?ZsT(qyD;thM=tne7KWZhC4(-4sTT53BowRU0 zjik?C&Ua3vP8}et>Ev_dzXoJetxmKF3;m%l=B;jA9m&GL{daFOdZp`zcbXt0zbhXe;#R8=4 z0?EgS~p zC!b)&4hAK9wD=Y8=zI3O;Nmuzxd({QH?{3}oL3PuDu@-wqVt(ZG6o`qFi zBD;MhTRF@jx%gMPtUsb39&X%_?n-F7lP4HyYIS}m3^PY!)iSn&cBle^;;Tlxjs`Cl z-Q$3j*^XI6VSlt;w@DWJrmBmYI@OyeYjq@i>C#4TjKb(#CszAgb?)2+y^<(d`%Ghv z#|&sN;lorxZsmnpk#k&B4O1Bk>_5^AX@ZN_+kuBnGt7-kLb^)wNKc`m-%0&gN=MKG)pfVzNs5LNEH#=?C_6J!+B{5?junEXAIMwY zm?2uwQg^aI2IfzGxuD2|9;{kRbJT+$_}}!b8!sY^2+w$#6B4a@;y=rYg%$CHEOr*Q zar%WvoE2GxC#Z7|l(`N+t!haYp*;aOeY^s;45(01=`rC;ARjWeIW}<@7TNX&%S1IuiR zjbz_V;y!vGtE;w_6q{ZR@zSpV z$qhXfV+3M0WE${m7gkx`)vTao=^-`l?Ngr>L^FA>W>S-h}x5>kjxD*zfQ5kUcou;Gl6jJNiRYRm&>u7&Iq0 z={J47A+|C8eKK>p(i_@p3dHGv!6xI=tWu(oP9U_2qe z{apG?0vxmC&EJX25#7POJ%Je1B!cd96FW zQs>_Y^wHl^XKZ_V8o$AB>l7y>YO_RIXT)f-QP6*r#iXstn2t|2-_U`4TuQC+y-CP( zNa9mGGOlXxw!z)0ui8{-QXMY0)VGCPTvpQK=L>A7aLY@>g}K#ICFBS34@*Q@Fo%hz zYtZ!^DK%9y80y%w6Jgn~MgOi9gS@^>-So98rV#Q5o41U(n>?wuwKdtmnq}$j%69mr zD=~h`JZxrbU6lrIbg>z$i~TN5)HFvE=oi;!K|K>n(&j)-`#TG$rsb4)@ss;jN=oi^ zIdxvHOt5(tm-&+yR>v%w(WeqOw<|Qyy8lm0%YnI88;c=7fTY?fdXR;%agy7B1unPi zXe{1rB9ds_9ZUFPfrPnnD~>>uP6Kb!TrbFzuQ)`c<>Wdz*j6aF4c*5mQo48S>X_}w zei7IPw7)S-V9TFu7+8?eX-#FZ>a(cO68JG&J*eKkB*DKR)9NW+-MKJ*!0MC60XWroBSES&p()kM$Lap&s)JEj!#=8&XaVc^V8O5*eiTM@w=yVZhP`}kho}5@SI3h^_~^ktwFV<*tR}za$OEn=9`iI53|9Z(em{@nHO8lU{`u;{etA$D3?4HlwhGEVHns z1m8N%HQvbvk3a7EsDJd^Rk{$;f@$*E%1$=#KCIfKE=g>1_z8+@M(c!O@T8q;?(xu$ zhI}=K^F`(ztxU4&m*>%&XtFX>v)l;?-e72`~t-lN7yngWrd@PqFAn-#P9YZ$wjga z`XS4YxI*-N)ebVr>l8{NmxZ#1hcT7CGn%S0rF-6b<^ok~rK60(iB^serutFnm`Bo6 z2|Q`ED!^ZPm<>-ab0;MBM_z?Wxo)O?b0H`B36aqEm+>~$pdcViLbNrrif3WqPN2m5 zjUDqT6S8O?$ev-rn7)#U2%d{nV460jQ{FDjXl*aPn63{LeMdNW*&k`w_WEMG(M0VSKx=Rt>_6>R*)7Bo)IWV_4h1EPNSM2c z?>MM6pw^9A-8{5;13UJ?a$2RN`h{vWtHcsB9YZQL2FMWh2b8UVMcE|gQQW2%d0oSr z7x$De`9gPMm*uuk*;{ik;*YAMo}3?bV9C}&t^g{Hg8uqmL?G=TCY1KsvRwX|sq?ZI z#SCwRFV=agJLxzYJhQ*;7#e)W$pgO3$e4?zjIQ1S^@Vhu5JJVLH`V0q^nxcgFV67o z=}`%zrbTT_b`Gp&;x8|zrt+p$xRsY4GCShVZx@#C{FJ*6dCELKQo;RdEdsm{`lFF$ zo-+K2+YuN>m1#Y9>#?#D85KB3Y1f=>N2aCTdt9bb*Z<5DyyR}YMXt<85_bQ3hYHdp z7;@D-^keojn2lUKQXRU>XLQCDrZT!OWDbC(nphbyY*9r0W5?Q-a3`NuOi5SiG6>kN zUwn>+e1a@H(#am{4h{B3N7Wt)Vc#F^+b}gcEawW>(PCvCx}1o@f%tQ`*>OX9z+|4I z1z^mhu?5Q<;5VBvUyagsl+Lnb^lBy?+Eo8g3&2&qmL7hDt|lNd>5^l6H2XI(7W_(Q zLR7Ep)FVAv`IA=UHGDlcb|Eh%R_(;Ox(~vgiju(epyH2+(qN&GJbSuko9#yug?Ea$R1uZ9ieQ`lAqGDPvGk!(`bb0%SViT_r0}dJ zGeIdF)~e>(;~7U?3|NBY`x-tDI`%|UX)EVz%ZD7iNrnOSHy--WEWfziu-c^a z)x=)LpMLNz|1;BSWw71lQNR515CBf_m%c;kH_>Q8dEArz9UNOX>CBDOo%Nfa^R5bM z3i$H@37q}@F&6mR{|!qb&SJXT1-|Hoba1H?*Qj@10QWW<#jiMSD1quudp||;B*VA zhI_79MPIPwr9)-ClQk8LLoOoeb2-m+q*{_HXo!`gR8Ah{AVl{sAflnbA#kdRm;tw} z#MQ1Qgm~`RH9Y2|Hq%zDooPGL8lQwiIVlLBlMG<|L);uYZ|Z7y1~1&Xae3T-hg5ZW zz((9oT6fw81)F_DLCa(33eZma)qE^nMwqE`i8QZ<3DP?1 zBt948K||x}71XLajiI*I5VS6gN&Oflr>=d^*^6bsM13B&M~DCy``YYlJ@UNhbgQ>mg#f=n79fd1-;p6Bup zd%NMsdoaKyFq!br3}Fj?vUN4OQFYl(^nt$aj3(u6^u6<%h{B58T`{?{IEA*-j3{MP z`tb=qdd8E0HD`3zUvTc$cCM|eovL!9CMzyxtoc@y-!x^@unvYJY!-wKFRlbh*9HvFoze77PV)yRuvdhCpG!Zew_ut>c5qCe_ z`Ai+7NGqjuI-+#fQi4Q($udXR8a(1`k{J}3GWN;~m`qu?IBeBSZ_AKc$2jl<@J{9_ z8T6`RX)4mC1pd%FGw5jxvv%MRGG;??bg2eP!X)?&hU5hwh<;Lu4ZJ9YHh^ypeF47f=8NK5B`2W@O#~k1p+J! z7h2cb=<~!a|EyXxTJGUqG%DjC96%W=YSr>iZ8Qn(!-tt%%S}>{FoIK9Ih|?}Uc$zj zr@o;hzKBZ=2mYQLR>^b zo{H`=ZK$x@Xe#~4gR-@hoX5QNq+$6 zAF1S!ovh{pj&|GS5!{M!Q#qNBo|Fo}8x|Sza)A825is(h=`|gD@^5+y+W%u# z8Qd+Ot&Njjm9df@e)eOneCRd8*9*C#3+$B}pHmq=@4)V*BN%yBDu#9_zI{FU+E7;| zBI_E}kzNRW3Ou<&hiGv4sXb1`s|=?rv>=AOb;(7Fp8=$PIVrF)q(~S;?e!3k(c)C% zodAtC`or^a>MxfIH2%9xh0P`kRizS7X`^5vdf&*X_7$?cHRTihoEaDTNrU3k-qu2NQ*HHfxxIH9cK~1S0I|atxl>Q(C2HM~A zVN^C2wzgiN*26DE^Oq|%eF7>^v>yoLdh2=M+9RuVyJxzyocO%+uG4L|%ztkktkTvp zt3SoESNHmp5TYP_ob2B?wx0;BwAV5nKQ@2nddI6JV`-*Om zQhPY(D+nH@+GMOJ<~hpvQh;Py{o{Ov!sY=nt5{DzmEK#1lD6yI_bEqk93-XC>Xbb` z**)Lgp}G@hO#v@Q*q)Iz(#?3aSoPaVQ>8|0c}%k8s3p$N(8X_0{2!7BPl2j^3wx(u zX-HI`z;9mYu$veg1;8w<-HcIL@`xt=s7^Ihm557X0G|8MUfK`(0;H0?b!r?P)+Pu~ z)d*YVMAD?Sr27U+sf70eGe!2{`-EG-haja&W8ud+c~F62b40_$t;C%wOJ(i65siGl z;sba*kgwZtwmfyaulLFv_q7KT+?QE~^G2&d%_!CGh{5`VP|ERB*ciEs`*CJ-&J=l* z^`s@hb*3cP=7qM0<|Jmlk;NT5DyV>(4zXFTfV$NiZn78ZAFAZ}H*dr(oa$_0iQfg@ za5=s0k<``gL9QOxoGuBOxZCDu`i89}x816!aW0;r);o&Ky-m z>FVT4>N%lk@fwL~_>Is7V~D7pk39Y5LqqR$je9*Vftl_-0CpFS3SA=`Z3PVV_bd5U zq8rVH0&ou)s_$xms*r|ggL)#`yCC%xgkhV@($?pawlGVmous%{I^4QCYU${)+nR#-OUzU`s7Um$( z@>>>IjbIbN)TEwmmKe<{*(PQ9n|Ap8A$s+KTZp42p{^g2L6Vbuc9oZMPEA<#JD!c7 zIZ4+l_1PM@q&aI3T~bv&g$5iy9;>G_-ZC*KH(OB6>wG#~a9pTm3R9)_z!)N#x8O-T z^>C}fP^-c0P#594?v;(J5zrcS!UuxE(fHD}thxhk$MRrmE?tM7ZC*?;uT3edZBpyd zF&Xl1kmXT`<&s4CgNgYu0eoVz^sNYo+o;4rS3>-Tm5*JOH(>#SkhjA@+8k`v^yQOe}palN8N>AHh}-j+q4sJVdNoC6LIu3j!BNT2wC z5lv5@=4YBsQ{MW>xI>8EJ>GdP8KAOjj-ws~Gu8ziA~)|o?)xDeKc8e`5I|5R(NJ;n2b)O*TBggC5=b*WQ9#iia4J;OTMR6gt5U-->u~s)XBcfvomPvT2PWTFJ?d7IKwOI-%?6cXggl7d?3hP- z%MYyuey@~8v4kpOTmEOKLBB=KOLCVLW6a!uPm+JqX&A&v7x;(*h}a=0@8KuIG?J-^ z)KxS+V-M?A((mm23Y2#V?ML%SLj(Dx8dQ#1z~U67#$j@BY-eJ;*{_iV@Jy8q$cdz3mipnSdbV+?|S&ld90e=Bov zJz@jP^9;q_WrNo948uP0@mnWpH9fScJNfqbiu~rgmUJ+({0`l+*$<1Z{c* zVQL@odPt288tyt`(qRLDk`q|w&}}e2=BWQc>wv2^zSMRtD;v_3<@%~zXTNcB* zY}F4=?cfvaznC1M)}6!)h>GKFN73V^fxQDUQ;jdQh%%EN;M%OOOJ@PvXG3 zg`u&7I{J5HK12PE^e0UB^RN44?_RWI1SB490VRU>d~!n|?3PJW+lZiFwl*Fj<5fH(q1K-0LRv&qvkb>FmQyp1Uh z`rBBg@ifudMwjK^6Op^vwWfKS&Ms-oZ6K;1Y;P^ycJ;qiex*le?ONlEn^iYZF${Fh zcUxXn7|Y_n9i z4A%d}u4lJBTZJ!1hGg7FY(aea1v*gMNgy9<| z_PUE`E!a;c=Q_wdr;+v2|1}U$=q6{+hR|?`W6lS{ff^3}W5ZQzo^elC$CQqeI$5c| z?33n{dx5`tiDQ>0G1*{>U2bB{JK+&}+q&D@1}bw>PYR@~JKWe2(l;u^4Y?-OC7n4# zU_eayHXT;jWTmJ1DLgWwhY;%)rL;p6F_IMCf}`u#POuEFPUScqUq=e5v4BYhS@?iN zF1=u<$Rc*3H`Z28Kc9=%l!YK~3AU#u86XX@HN2^V*5OuYlkVNs)-riP@6#dQBD~tS zui?C&-@MJey7??tWGYFR3mbNcQ)G5(H!m*Y8Pn0RG-bQF^vHEd#a2~SI(nh3=Y}6U zxnH{2SmnJ+EU1DfH_!gSb%EjBX_1*qOM0+#ffc~qqr2;L#h2O&^;T?k>@N>o(jsDv<@u$x2 zeKhCPqjZyb2t%b@A3RsPT;x|`-xXGWuF7wcCrShKanbK(;PRx@^S#RYi6!1)%72kn z#$mUPm{JVTb8hf#~crzWP9yhSSe!mCI# zXpTW@je$vfpp;^ChWJq9^?YZ^<@e{jie34aaD!48u^o~uWv?5Cfz}gCyu(gn5d94F zp7ME$WHSE6`)#Y_P69fC04<~Yi6h~jMBfh8VU)R@NxtZn5)nhBw}ejCa#ttTI?DJa0NcM%0h?T(C$yDPo(ZmWLf zLf1e^$SFojjYbWn^AnktzYUIT82y7gt}m=GT4eAs=iAeN2fB}2JeiAreN@Y+|EX*J zzv5#5`&s=DE|#MFKM~nk6b|^xnfk5Cyp6;XlIdYL!YF*ILc-GUi8XxcYdk7$Q5~`8 zh3J2z}(=Riw?5pOq>VRL}om z8RkkADf26}u~;7dg!yhCxC~-_7JG?U`15)F6iv#CK-)UIy>U!hn4xF=0$CFZAIghEVMcRSGWmj!}df7%jex4-ECQkh^ME=vAO=BQsv?5Z8eCg z6W{XDD!%QVm1b#fg7xglf5MXIos88(-X?my3t3yGId6oIGIWzT#~igw1GWhg*P>T| zVY^*T*ZeJ92_5{*eL@SuT6eXFLLHMv$K8k*ueEoV;(V}6O~bvT7T8gHC9k);+1}^n z67qPRFZ}cyr8yYj;1Sl1C+qg)vd&QJaPB}iNV`IB^!ne~)v>;(t6g7>toT1RGP?hJ zBa^jsa{fQ~sWqCg?y8G`k6&gUqbB|+Qb2_I(L~ckFs+4e!kX2+WH7xJ<&pjSO;#^?uUoRACV}Gb zPw8IUUm7~E)K5CjX}`NCm2YMsLEO?N+`o!m`Q&@n9KyEZ3s~X7ctLW1D-G!Wiprh6 z6}XCol^WilG)l~_vPI(nTWz}hihcz-6?qS^C997H*6|Y}z()P_VzUYc3Hb5N;UYZI zEc_m`U~9!?I<#D2!hdJD*4z?ym9O|5Zj_aF34h_1V zXP=#0eVWaROT3*TJ>e*iylfeJsTsHo*fdwCDmVV$jg+&&faR| z;Kx>bIm6VRSImOXnHgOkd!ni<VwDM^!nEA{+iW3sV@nEZR_=)tRv>tRtDJH~(XjYTBF$F+LrwlH4Uwz7#7)j@;*3-qGG;4os|4t4b#(dcLVY>(fWB81mBD)+B+2Fa?9 zHI28)9#uS5B*Ii3s`a)CWr-E;trR9Bs94shfB;-Nv2_datcn%{O$(-1)C5N;tdk#_ zF%Ay85keQ!gC48pBK(6ePOCADM!9s^|Augk7FcxCM-WdV7bj;&C}t&w#r9FPT5`LU z943>6DuD6q0Hs1vY1k*p}SjcG}sV#`U+<@^lvAwMm*(0>U7w4a5&eJ zn*CCi4qJZBODF>&GpEAveXB4=ZEw}iKkz_g|EOEkN)-~LP_SB>Zl(7sNH-K|OS3rc zQY1j$=nRdqzVLegB5uzxKNLgj4 zxkD9-<_?FrnSV1(q$rlQw-PbmC(6noB-XOu2)s3bzKquZHkG=NItLL=%~K|kXD_x) zL3JF$z4|-$8?bZ7-BB30rO*HJYI| zsfV>S*@VzwVO@Pw6F)=rB-|qv32JzwEoPZ2Mrqt;VWq-I?88bB0~TSwe(HC_D#OXE ztT~0XE7+&in%dVlJ8Yh%_Uqt<21>}eN;Q6B0wnh827NeBrsnD<`oF6&gcXtSvsEu` z)4JKkdE*FVvmlsY1i`F(^WqYQ{sv`FwXl>y1_6?&`FJ`&L(g=Nik1LC&nm&HD?CkC zGlqzAO_aO>)?Ivn)~=Jd_YS?Ya?L?dc%b1Og9G!j9Wp1VpelrePcqw+0cGcmeEc|v#1Bn)e)3_P?Gk$1shHrxkXH|9sT z0|@a=Sk))XBOf^WC+W>sR{EDoD=IuajR|a4n6>Ew&Oa zG$!+5$wl0`DL9QSJ;7g4^(YSNU|oBnf@5zoA++IL`FA?=@iA&s^#%Rn2S*gy=dsg- z%hFIpm1b~Ijkq2YW}_=j->#%CwXk^Ynxq$-K{hG^j(4ufl_kuTxJQA*8*MjBe1vYS zH@D*l=ahPXFAmV#VN^f*D+)&G{*}4imvQKPaE1TsT)k}T;Gg8m6K~305;Nxfm7DKD zmbn8s+&6Y(je(Aj-nJleQTp8QYu&{0F)l0oi#P*m^TawdD7;U3KcZe}lU5%xnrY@Gv_-skRGu9^ZyUcDX zla%_>M!hH0`!KSwC_=OhEGZi-HKpazD>hhaSCfadaHK(&W9R2(a-;0XEeG{ZFM|~{ z6?K=W*D~!6si9rv6}vVmp^hEHTQTgo&BmP*3^PC!(}P&$xFUFKIdYzt*kn&H-tn9* z{kYq2j5r}y3s-@-)yhQ#pQ`PvF9Ui!EY5Tbf3)A1!2TIa6N%N6bLO91(N@V)2>8#J zi*vV46}jF%cYOQRbD}vlq12zsVVL3Jyu@>QNxUfg-GItF+gOV>>rTGb@+mC@J*hH4 z^-%xE;}%GtqLFzA(Wp@+e%Oau8(kvdU@Wl=wUZ!&{1v5whCAG#DSdK1hGX8Qxy{wr zCjS7RFwC?~jHT#cEQj!j73g}`B{DvIb58Md?0$}~L*n0%I38cS|6q|uBvMhdr)I;DcuX0{LYvkEFtrrQ7AqPd=7Se+O~zN z5%^T0LzTst)#WnKjoj*_7XAq@A6na@l}XEX2mJyryDZw9f_q^u9h@nL(%jLU8d0K% zjKqUHvvtVGALdA7b^`r)td7cDb||D3_gBdiELOVeFL`D5#8ZBNskVSDk!Her@rDE9 zU$ge0#Pt*}3Cwxu5WSVtri;OQ2;(Pk@<-7m7HW{BrNrWgE z6O(@fwuBNwoOY9n4mOPGRYxbIT@Hj2gaNH`wwNfnUclEy9wGN)2A8+ zYZ@f25azK!j%srrOOkmMz5x%CH6~~!9y0Mx2?taL3Kq`WGc$w75;>hzZ!eKB#X9M=rP1s$DmF`e>8=d8+_ln@p*jV8U z5m^=jpet#Zg348AY^CnBs58XbyWE5}XA+41YFFKHLtK7cg+|w9&U;Zknag62g0H&% z0l}0;XHNA{n$#s)SlsV>30XY-m}1U~Esj;zVjKnnRbb<~0A>TOy?uq&*bPRR_a2#G zg&kp|K*S;&fL6nyD~tVrkZ?<=GKV@xN~j+9pjh?CY@e>B?1NZb@j{_>3jNB37D@LY z+%w{9g3|P*v7d|dPJ_X68m}sITA;0(Q${TdZM<4C#mEHBk!OVj<4K=Ngy%=9mtB_aX z2Ns~JtjB~|ZMA=DWx7X6rAZtNFq%aqX4~GNIA^HFNL7j}-~YH=Gno=-U)|T4vf>!8 zF=H*;*4lgu5U+`?#oDBfF^?s0lKIFqBY7mQAi!6kuB|(zR=2Bp(3Zb=)>4mWd#3c4ESbUPxA@EdTySnx70jR|XfCs#mM%x{LR$`OVXZ$$v`{f>=(!4l@r>oZ40KdQD;b zs(#7XakcK7tM^3E?Zoh}k5}&r)MIxj33ppTahokRaGpo!JVo5(-lHYE{%-oEv7j!? zNwpY`F2F~9-;Rs|ef}53{Dem@$BFpu+c?30TGszdr~ZEt3w|Z8{2%*Rlg7KB$|BBZ zZs#3^Wsh=!;;$ct%~I0okxu@S^h}YqV&j#jr=4<)wicNK`=vbtlP%0bIS{6&9F$J| zc1gB9Y>KNGgC~cjUQUdcKCkC_GjXv#(`}TN%F34SzljpP{&639Ox=3t9X$&ibzW~{ z>3;`ue~<%be*gw3VUv$@(HtL17HA`}b^ zAUZPs+fzy%;G!K!C`vGu%JhruH_&qqiUAb{rTL7-F&r#XE><_B5p(Bo5(auEIQ*vx zZXlGlrqMhqy$ZW~*9^RP&WKdJ&5vRZAr=MSA3(Jt5H z=Q3k&nY_7R1Q84Ii`_#Lh%_v_#T^xG5=*OUU~~}ht{)ZigFSGW)>3Gv%{BpA0I4C8 zK1akgtJ%mD!1p0)h$`x=-}Ip*IRK0Dc-v)=>TjrvrYEv5dyPCk`}`mm4vWL~YWn6I zLlG3c)>_OQg9LYFe55@nZ($^7bUP!jnkM#eg;5fSyC>* z@yhR%;R>Kb?I#C#HB_7cL;^MJF6ja>0l2QIiqdS*7Aj=`rpA;;)xRY1;w@I11FpUC zlzK;b05H?5cs|;(N6Nyopl8gAw(QItB}j7Q*d{STRM)4}HcR%w7pxbE{Nv!rh6iR` z%dMkl!dHgD5>J-wHKTeWrxccO)MUChHHL&yk#klSA}gv(Gp3ekqLg!-h2?jXCZ1Ix ze?}wJgo(8)vEYRJmo~WtqX@fI#DLokZg89*j=P2jgHxrznWl|>!8|0~W<(y#d=5{9 zW0hA_iRd!h-?b%2t{5tnC*|e&Tk|dh6feUjhDCLzz5S)7yPp-hp4#c z?Ze}SDnPGu*3;d3sn-bUK$=1nh-w1t#C!=?K2Gz-nQ73|=Ns}^r)Rj7qH~vzvGp%` zfIWR!FHIh#GA&TsvSROEWIMiqzKV;{ssu@(2jFfs z)l7ZpAh6_S=2p#eZCNtx+BtOQLH?79W6(IUnu2ilMSdG9DXA}Mg*NIvYyVT!ZV@;{ zQROGY;z#?JerDd;>M)CA;zsn8kb^bx6z1sM${+8^j{Yy@dJ1Q5qb#A`<9O=Ymp{4l zCy|ZOm`**EW75?PRHBJCrOn)g!)gXVs|*VEDDF!4o6Z$q$5U%UEE-`f(rr0kQ>vt} zfd8Lwu{)41V;ovy0vyM^9E+$c1?xdiu=>eaT?5p-7r?cF{#dj2y@C>(^Gt8yEm#D6 z>dFf zz-GZ22>OR1DNZ9&Pb%g;@x!oy(Zgyr|Jd7q7-~6TjC&%3PLWP?I78LIja$|8S$RUw zAaj4R{#t^^51Iv7;`GN%95dgI1(bqwMDMC|+TrtGyYBnfzt+KhUxrS%?y=9m<$rmL z1s@y#l-cb!g}E)98^Rm6(k-w-oK0k+e@BpoyvDU{iUT_n5v=*h3SHB3!PDS&a+rG8 ztHEd>7iJm3qSrHnX0PhU<~bZ+d={fWeLKSD*`x@jRrp76WBopIz$t<9!&NI$i5!)ZLyf~x_td8&kx3uv+;B&4W&^>sCO&hrotes$}Cu4B6ZRj zwGkGWADx7@KaSms2-c~)@Rp5`H3SB;;t{4DDb%5zJ_ya4)7I3>e|k`%_xNn|_HVm- z2Yl9JKBQWGoyb>fgD6GLCAV}Evy~FFg`{xA1w|pUxlX}PRWkod0#zjwc2!D8AZM4E zWx(-q`qOk-u#n5^%Hbm4_DNg%W)PKrsdsN~xbUN%QkM`mrP%!a#+y8OQxo^W8Iuk0uMd4vikjygw^o)szgJ{6CiRYGS+j&fCr-{!>s!^`geAm>Kv>TFc?NwWi?bVsG^x~h=W6rfI7M{r)sBiXQSrFil1)XRFSFaCT^2~fQmkgM*Z zli`0N&?{n0UbQYe)$!KMstcb=zxL8iL+yh|J?SGv@em7V)og2b5wh^PJHy5N@yqg?Kj4qd8B?^ zrR<)ArdOB3amA=+8nU*YnMIZj-6@;Y@FEUWJIwEE(XKS5m89z zX;A1D(Z9@$RV3YfDy~jv5%pt~UxV_bs~-LSYpT5hrN8^Yef#zY=RZxg|KZFa?_y)~ ze~h&?YPMfC7#O~nhy0?jFxMqZMg{CY#|uNOWJH-Dqe?BydbwQRcItH#LniGu(s-gl zf;S?wIA_PvtiJc#Ptf?&T^%+_7e=G9tmyS#mmaxCotypJpC2ET{s2CM)-_P&$(cm+ z+JRXfZ>60Mw77)rOQ}{`obBYD2U7Iz4bEQ?U+T~bZ1)pIuWIIfx6GQ&Ni(0Qf;FzZ zbKC-i@q0FzBLw)x=i5E$5mF8RKvI!rGtJPJsrbsN796{5>Ma&epCo9uzeOIQw(J)^ ze>t`p3W7DFB#pC4E?f}PNS1fEE*(P z!>147sgl8o=PF)P<0{!NE>y>Q`u&SPBdn<7uqi7#)vG0PIO>`8eDhl8=3y_#T%6vk zt@1sxF0C$YHXpm`K)rRo_b^hLnE>s0vq*7nKX!R8Gd<#Tet#RO!3O-)6Wkj{p#5>6 zV8DXn?%~{ZV>!eNo#n;Q(wWb1hfthoSiwPSjKleCSH!=Ckg=wPRLf)XQSd*w5I_%$kQ-)1Id^zkb74;1~BHa>_zNwaGtj`&+P$!oo z=ZX$AR}IE_p@pe10ep{sJkCNj-@9dC2;0Zo&yYsAX*S7&mH*)i*^sEmr&oAGty~tU zisCM|1OPn9HWCxVgw*AVxPuPhSv$k5sJxT5l0|nf0z3s6>Gp>T_>%C-PpcQw%Mv6J z<0kFh1#9Odv9n6=wD7S5xhv!}*i7E2qBF7Whj56H26AHe_k(|x*Q?~4LImYvQ zC>P8(spjtm$9R|;PIC>gbbm!r4^*F2(2PF^5q_Egj1uiyR|U5os-&rz+|rTTFWG`K zP6(wN%O&DMCYFg0$JXQZG$NP#?gw$*PWup*%InpJt}Y&y-csVj@hJi}b@Ag?gyL$D z+9H~|=-;YZ4b7n=p-p|elu(oEb5>ke9fA#i`Q1G#ZhnFql3{Fn8_;d1Hl%<55O}~L z5+tx5o}1vu8IA`~ewLTWT7M|2xzDPQRcm+f$9`JV?1z6< zzQGz;UhinKHW#^aQb%qs@=F-PM(kV*M+S@vtZ*#y*LIsbEUwdE*ALZLbrOQhl+@2u z3*oenP*A5qYp)-z>&a;dT*`9*<}!E25(o4w8EY8&s%qsTqu$Ab{h=f`wEsNoBOtvk zQF~WWWUReS+>-^hgIPGNR%=Og7tpWMl(Xn`Y~HcyqWWMNFwR41e6SH(W;UK`{O>@%%+lKJzE9A!ny# z(N+{;B`<>eHOasU=v>+yESDA?t&N##US3O0DuS?3Bjd#dTu^ayIx`YoS>8LTo#gE) zy+Pj+G-pmCLro0Vu0QXptb=T=q^a6OwPdm2ynw3u2xf^^^8rsR)0k>v#+*Ym?d9bp zVVK;9!}+v2_3Ok$@WA!tl7yT4;Ua7ZpXi17kNXY#C;aH#){P;2cU~*MDJn}oc$}>h zb>a%$>6UDq1AWjG6Uk=GY~tL)Gjhw9obx*22+_R$Y`QD%{PwHx;n~a4*ZL1*cAkYDb44K)^FbJCtf2>lefTDo&N&1)vMhaDDp-My_Yr$~!3~ z8+PjNzf@w}gTcH8x4QHs4>$WcA2V@^9skOe&~mQsYx3?X-3L zY!_O8I1V!+-8O!CM5uTOmsPRv+MjY?Osf3xq$mCp*$TG~5j%((w1UW=S4?C>#G+cIoj4MdNQ$q^x~DBbMAjVj`Fm)d#02fk8!=Ljb4}$9DC#Qd)z6K z`a_~7y;8EQX|SZjg?oBV5n}!uBZs{rEx24izBq|;fY}eP-6*By6A4wQL}uj6g6-4h z(`oJ=E86`GNK)0=iki-1&&GYren=AHM(Kl&dTXTQC0DJ2;2R*2sm=@kld0~5N(JLe z@YWkX*R?rgn*Zf%C@&zMhiZNMULlk-{H_eE!@5StN&G}D_2!{ z(Ld}s5A9%YGSxnQkWPt~Q36|@^%De1>?tx3h#;UxH)e(SclkJ@t$@5L95>r?+$+mR zYqs90fk5_(UV0?4zPIsvF%$xXr52<6S;r@i%Zq)2P{5y_EVpbPx(ieLfV&ypXjq(^ zs-|n+UYm9Mi*-&Eo!dVqx6+|)20fkHG?K2^u`KEi*&n^oII>mt?c~4&okj?VsxYHg z|4%534KzqIh5uhk7hJr$a=mdey*P3~QDu7x+T_xV-{;{|MLh8`OCPd~9-=-rGhaTu zIqSZbFzw|j#^O@owNfS4R5 z{O+-%NO3fAJUKgc?JWONU3r--_j_-1Mn93^-S}K91b0Tw=5=KD3JzO8JyQtyiB3V! ziJhA!s`@E!_8yd+Lgg^k-~SWGez2N3QSdXSMe_p+`}YXJ{~sz~{GTd7WqNv>7x^yx;YbLHm56AWm7gR0>_W?lig=FYFQi3e6 zH=gl4NWaCN==sw60=Yq>1A&8za8Ax%a})Ovrk$>0S9b4`8)|b9GQBpiUc-V+g@Dwr0@QT+p)^aaC5K8vRC`rVW^;cybg+qk6 z_z)fT(N@><<-Yw#47!zwFZ3Pa=!urvQZBWeZzlz0v$vAUaPTkUiH}CNflejkt4uYUDa1&emMW~}bGO}+Hym8vE(odv)**oXZQST*She9hLry!0@nZA zBKZA3Mer{uY9uvBnVPMd7Q!HRR^-^smF@OhS=tdBn|@7 zj|NPA;0>0A!=MAInmBDub|$+%U!D#oQ~_q{$?TNk7NuSEk20LZWlWZ`)QNCtn2%eechQ|npUnqYIE;uhX3l`*e30=9 z5!Ah>9*5d4xKgn0NI8Vb5loiHC@VvgB>I}kUVx^nUwDp{sA$w+CB7OstR)qz9GblQ zUc6N_624(TJe)OG42ybI-kM;&hIovOmwC|AXIo`-`Em>*th}8NAgyM&`C@YdJJ|~o z+!TQ1SgSd68O!$t#P^b`gveyMDS~NhW7D+2H(zPie8o{G*g{lLo(VBuiN^nma|Dvw>m%0awVr z0k_fDw;a1a%z1U|@tzQ@88u6!E4|BeKzsg*5a9 z7EtN7ini5XxcuY;^e;X5`U-tj{pf+?|F#~O{&zk6lm_H+R+I=KICH8c)Wa0=R0t9h zMZ$k7Lss#*wxu<({Q;dlpBT;yVAd;ln0hL(fPjV7<#gul=k<8c!^Vveu<0K&1Pkz9z(v*Y$V+KVGQov|VVx(mma!^>`26rZ)z zOrN}t`RNtT#nbGdg>P3FvTHTYnMwa2IS~BF;rt^@i)e;f)x|JV!kaYv?lpJ+hDO=a z^Hzo!`;$R8sY`^v6HCorNRo<%~ zRm(gp>#Lz#koYR{RLWYG*O#wcKCP>Jnm>CCmWVzauR8CKjTw@oW!Q5um|@X7uBB zfQ7~N{HmjoTSA6#R?hBmkKD#v=nav}0aJj&fD77Z!k#o)g)lV^Rax_b)mp2~DD~%j zS9WB+G3v310V_l_Q?XT6W!qdTytlSx6H3j&+t*k2wzc)8u4@;yg%B|`o_G)B#`O>i z^a@JHq@CBJ4k%F}LJ?zl90}l7j`r_vNX}O?Dg_IMC=7uyqsQwb6kSkc4$4{9W5R$I z9nS#HCYcO}_@Y)Zmy6Q-TO4HB7Asl+kqn#e$F`HE6G-1fh;v$DalO3JdKNz|mZ!Rd z7h@IOQwH_;{1EhD)^v9F#V4zb9PXzx%cx3#20dE@2eKKYw^4ySWr&^dm~N7jy#)3! zD3Iqo-OVQiKNOaDN-j}I(6n6t)2NfRqQFkatmcX=*&yDdw`OYfQhCxuRX5Yge-?gt z;*+{A8sHN_W#PkfUKwFCZ!lU@o&_N!LHDw?KeJBrJZn-)M%s-FSIGkEBTC?fjs z^YtNWn=|$oD5a5YGmQ}S$)Veuuadwo_B*gr2XeqC^*!M98x@0>@KNkkKlMtH|Lyb$ z!Ze341fh;7>(fvO&?Co!4q6v?_dZP~F#okT4%k=v-08$<*X;jwH%yfo;t|>h=O|-t}TGsGZmaRcmgAz%A8+_ ztm&BiF&?h2k#})=RF(Pp`SB6tQOv@;2FHFX0VO~NmMm2+rdA-02}laIhBzo(4PFag z^{~HmcOl4QS&bkmN{mK8TVh_NJX31PdmtfY@r(!P0tKSAscyeDZoiej)gYdad>u39 z;S3RNuV#@ta$sRsW!!cYz{AC3cW19b>xFuA*nAUnH!j4MRCCpwK0-R(jt*P8^Mlyv zFl?R36vHdW<1IW%G?CT;u$N*rjA^DJ>JCT)`voFg0?c;5m0c%sk~lWb7*YuCfVOP| z7SvAmttbc`26Fb9@DS9Hqn-CpP3Eqgf{gk#g0IrdKvuKoF5nB2XAzxZFE&q2pJ3LW znBHC(Xhcz?&L1*z_yJW1eSmJPP(~xIK+!P7Eq}Ab?m(Oo!`XD`*!}|)K!Lj<GUcOV+x06~8v|VJNma??Sg~SnG$jn`D>@Ks&-;u2Q;8hTx z4Er;4yZm34x5h<>tiDMNA8{3zAvh_jwBLulvBtu$@^e{PuHPZXH<~qmJk+0*h=(XT zP*1#Lt@3E|RiXj@IlHJHB;(4O>t{c)^(fJ`37sT*il;;^YuzV-vYeY%Jx#&!8%zP}^xVEr#?8ic4Z61o;2K?*kc-)&#;SwC>U z_)lf#^T0+R1?V+wTTGx7i&2!uzLB?`2RLu=o|%B;$A!O!jMq5rfcCQBg`2_1jJ1tp zOm$97w3bTdoyKM8(Pi@a?65qEslV-jwDt{MovuO`fr4tjHD?UVakL1%J1d5>`^ew1 z;g9VC_JmmbF$$4&cGiko&*#ht8WsZau7sd)jzZqq-45fQh8#@`J1{hPCR07=@ki(< z>&+h`0~8QO5XGpY@Wn@OQ?A6^I;CpkXYd2&hWT>A|9}M`BbJozF-bR)zNuXdBMrMW zfof(5qQLQ|=pfc8)+P1%MlI_RZrQJ$nO)BTBf`tDmgVweVb6IEY(#bR1s+-90-4UC z^&yC}EF0Z5lY{nUh8a8EfK4Y;6*m9(4Mr?TgNBkn$a;*%v{6rzsYY)d27z>eHPy*ibno;Y73 z*6#2MtBDBm6t&1R+2WAqkbxZOXg_v3^=es~{4CDr;I9=UOVPKcmFhhboE|b08$fMu zOQ>WgD__>ghB0DZF%x#nnLAT>s}J!^wr)!iQOn-EM9hwm8SV>|Zio&4tGK_tVoP0i zUA2XiOeRzxyZb=+zD-#(0vl!92tLzS9JK`sk@NHgfv+hJ1G|FQv*a4*k)T-Ep=7Yd zxL6itID`V~$LlCxZ%QKts?y8?6Re}|GbcK$S%R^G9_E}#B>^Zs5L-&y#hMM6yRvI? zY{MBaJ66%uZAXt{=&fbE)oUe?1^DZ+9Kb%016b`~!H>u_4oWj9ORtF;BmB|P>TwXe zN2Ej{h3ERWDaG7fHMrpF1SO`)F}!5L0;K|n0fu=gmqar71f*S)%&EIF0ooO8i|W$& z1lXU%3KEHUF$=_~W4S6K;b+r&xdCgN&1vgh4a;8;iLQujbA{Q7VMb8{Gj$7|<@8n&zv$g&b`;H8!L)e5KOc{PI2Lf4Aggf692|} zvL8L-T#mmF{b>Q`wQZZ?BoA^vp>&SO9k%&8nFd&RPo&$;j=HqD!jK3ZeO0&C&BZ&L z<%B_JA2ujIwCo@U9_bvLEn>J?Gm&@yjDss<2>08Gd~UzR>)NRscb*qSOPP__BMvkHT#MW4^R7PdRs3)ERh~q)2X(KQXV08f zBO~|Q55ovy#L=b>AnqxKaV@03iEc?2FDX}gO^YvO#YtBJdurtkFFD!8w=?D@spIAk zwggI)16t&>ide>W#Tx;8c;Pcv=suj~Vqw0ez1dV=W6>iwoJQ3gzDmfCyAvYEpWOSN zcL^_l*DCTY<+@4>Ha7Awcy%QmmnshZT{=nmi`vweuqkE4WI4yb-bseWbQ z7*kLgW-0s6$LIy2jj&@}QC}`ePH4YKNRl`?nx`Cqg&z)&*wj7oFRSwng`>3z$t)i>vOq8GA6gegh9g!6ozPQ)O#d7l^z1wo{FS@d|+=RB_))?NNCpV+{Qrs)n1?`bzHVQ zCqJ=vJb3rU#5_zIOOA?fSTB8)l@h*hG@Ms9nP!7{umWmuJ^wFjDCP1u5& z{yXJvMZB1HPZ1aXipo<6^f~LYK%qs2qo|0hAcFUd9MLp>L1}SJOZv3(Hy^nTv1TUw zU1(%@4O2Juw95cvJ)aLa1_4IR6<<@Q3~5Kpo%*BsTl6Ddz1rf9#5feGVhwWS?Dl|A zvt?!XJx;2cgdP=)#;G}`fW7-xn7s~l=_=LP%RQIO{h$Q=w((}Qh+4+fifwttjqzGD zm_o5^*%h1&Y3b<1a4=7gxo~U8J?h5$9BF&+PbJ0b9;say>LZs zyMFZ_-qd-k006YTKzZ_h#vjEMT`7GJgoVFPWNuQM2DWMcUTcN&Yk;uthC(rxn|Ndh zbl&l<1E#qGpj{MeqR>2?Cjp~}LAxn6Rj?*I)%HgJ?q#TZ-Hq#=CVg;Mz9K}h4(tAu zn*s<1-8HF?_u(F95~nCyBZ3dA|5+O%+u~~AC`nEX{$6MFk+OPA-NE(BZe%O6yPN{5 z)zAIi0k8B*e&6NN9pX_t-~>2->I;c5+`U_S=AS@j+9F*)X+^j}xgD+XpIx*?wH|tz zCYT3s3fK})bK&Q4T6iFk3Ze;;p%W(*qIxIc<^cw7^D6?llaUbLt~UzmGPJNxXt~v+ zO3(yo_i{&s#1dUIW1i)pH@8-9(g9|9%Pm+^y(P&SAz>8%sEY`H`u*pju8$QW6=6;` z4JZu;>r(_mF9`%8kYN^HXI1376&a9|gs>RQ4VqA){%}i#RHz^qxNJ5R;x9z_g-Cf= zYQHhmnvRD-f8>W~zF*xbM$pw(+`&D(z>EklRfzU@uSf?8A`T5}PfE>7A6uIak&=-g zJtAd*-{QA)3EFL@j)!CX=GTEeGbFi{fW%y_auv3&J<4$UYMb|01pmp78UskS05k{d z{39vS2MyX+6zd$O?8heU90naCG7A}8KUdNr7bb>XBMbA6}+p& zr4ypLs(2CVj0+`7jS5$%NIv~ofI#<*FTxjWUqC3gf2b=Po^GD^RnsoR*q|X25DghOAVikA% zADVLRAsW*GD&nUt7`T}p5D?BfB-uYK2B0s#I zVS|VXDsX*jiKk;MN>|)bHc@r{5?t)C*_|x`rX7+2qUWCV{vi3dn@$bCYU;g#{%g7lJSl{e1MRD#F+FS(Wkfw=5PaA?q$`(h3Ow6@dLog z>%Ea4+qe(QDsFnp9ONdezUf~WGzOpgy}eef8s*rnYQHVRe?<9{ZZzr-huHu--B<); z=8Di1xs6KTo?NkVllTe&epdTL*tE~8P0iTQkOVSU2p zC8pq1Us!QXE+Zo84}!9}c_v3zi($}2D@{{!`acInrG0`i$%2Z>{BWZVi|H@3cbj9C zd+uZ-T+(0zqvKb&zA_dG5Fa~;yO%dXqF1t_eO}@>#)M-Wsv*N)v#F(n3}i{aQi-Yf29^A9lg2Q( z+%j40XPuctL1MtN1}{Q+FPIxLc#+Ar4SHOo3Wf=~q`PlEw|3=Q@h_AU|G4yA6Rcas z?TX^9%JA`k#vs#c2P(=)Vo803>dtSS2c6l5W$h@i-*HMT`NBi*!vCP62-lc*dMAul zEE2UVl?R?@^*t5xb3(u5iDhud~?RV-Z)O29^BC}XN)9jRl} z@_@{sTBIchSR92pwox;>CYo=qXx86tot|CCiN5*0JTn`P4p0oY2_M~3$v;zrUC*Vr zt6AM!b;>hs;8(Pz7o`Kc##glma?=jO#0&WlxR!gzN`NU~`8LXlfXI zO=$P>q=GZ3#nSrP&5z>^aYg1i*i{nIV)5>n%%tK+A118xeh(a{d6`$aVxMN&2*eW4?PLS2k7y<$V@>oV&Mu0>HR!mPL{_9OqLoPhF&i}A0F)aNm2_|h zsIgkGY5c|dsSVt8F(7X+; zx31=bW7a^kGH1o*5Q5vnW#B`syDtGMSXVQuH= z(G?@8CfszQ9OaPkn$AX%xS>ouXjwl#^8D|vZOV!mK=k=h13P_K$V(jZzG9NPBYNcX z(FT=XBrQI059NEp$n0)$|r2CM^2R%CnU^!Tm4 zLv5%5tI(`^5H`aQo8j_p;D$qSO0MdilG?FjPESf^U0bsou=dIGZ3$x5#v3 zX@cJi#%qHmSfv#>bOW)-%mK$P8JDGyde{Qe@k}_->Z#&^?I4{>$~Sot-@n7D)m0rr z$d$Xx6fC@&vnhqdS9{BO)jhBZ`Mm(x6(sSz@k!Om+oQ=}aij(}^eKJtN)B*Ie<7p( z%3_~pqDU7{vWicVQcWW9z~w@VdgiF}6bi>IvJRHXm?@$mgMcwaQTLs|o4rWdU&mt@ z+6Rd5oSdH>;!gQGClAIofPea-ZEAte{LGKZ2;JmDm7XTjP6 z1E#|dnMI*ihH$0`l0XqqYrwwy6sC71)ThT+XA>2KIAN&4Cz3D=hLf9Sl;QDE7eOlm;M9(jE$r6%E4J^ zB}c>i<@#dHIELOAOV@|Z%&(_hyHx!gj zH|LP(nb0qQQnNRN(#1M=X+S%KbZ@c={hdivJ)(#Qz;}&g`m{L>P6_Cg?j7U~KETh2 z$2MhyGSk-5*A`LSc z0Dd9KySLDct3;+}!jfFsjtgMr=J%Lldwog2!;oSR3%-nxtCLWRN#*zdLE+jrlp`Of zc0>f=hexG9uo*a$c=OY|?KFlwxROm?nS}zrHH5rMX#}oi_QIdi#}h*LSM5z8(8nCXSJJSLykG4?w(Rz2#ueD@b5|4; zdMKq<#pRE~ulzpI(F5&z4OTh1A!Lm8T-f1hfyx+`UA_B&<=f|jxCh@DEk?^L#qAPi zXeM4Z2ma74TW93n6I?Hfy&uqsI9W)`jm>B;e{QJ~_i3F9AEep=;rs9}hpLk4G#UV!SZ}}+3d;NX=fArj-~~vXeR~>6Q}!s- z$~>W}5RW+k=>kNJA&xeos!-Yl!7#5c+PjyP`R&$7$z7Xz%q#TEo3azXT4-FjFj_W} zjy>UeP#r|gJ?A;-9(2N&#FN0Du!*Vp1NqS*);8LbU5{vLTB}(o)v^5m!zaxWjV|M| z;4V-8;foatXnK{KY%RoEHF0w@B+FN)1xDV|^*co`YgmQN=v!jkTAzp6l!pl~{?p45pL76n_8hU50P%-8TG9JZP z(?7n$tjZ^_Wdr)rnT0RBA&wGidt@~HBNoB7dm9NF*jWy8gzNF_Qx)fY6``_WGXpGM@a@k%~Nf8^pWHzDh`}cKXn}E#wGHQe_ z0~+<<8AIrM2KMMyh^_-m`*>~qo6xP{@4Gtoyz-v_T*TcVbm8E8(hLB;sJaaBB!ByS z7*z2DYl1zEo%cyHU-Q#MF%zQ;PUIPMl`BW2huCZ?p6nwH>HsmQa+4yQHkIxUB!t-{ z(_joR?G)^i{HOJIL-Q+87c-?0F5-~G@8Oz>-NJ`vTR6{ZfbUmn zCk20TwGzZYUYV-ijKU5a`_YO3abI&uw>kF8Yt+Lp18Jy}g1x9bO-)894@1h6zot;1 z57IR4Qv(#iZ9JTW&k9vXX1tl?eviTAJ9j_a4B$;(~tGY?Q5>I{??OYKOsm&0__ z%-L{2PBht+6eTxuE?Z;XUla)cx5RY{8XL3p^q2hdM2~p|If}e>@Qx!}pg!$Wsr7YY zIm`_%Oc8{L2mk>fKueZvwH;Ob)AsL+CFS z^52D_neTp7s$37 zQLfv8`fmW?ONe`mEbqe<;^ITACH$h&Sqk*a9ISsP8w+K9lI5X788HrYS%mkqgi>|JZ^Rrc%i`6u<1a|397Lu}U-E(n&gY&lo zEH#v?KC1aGEx5vXZh3`=Lr%%)st6bl?!0E?P^pK)l?`DC*4R*3WK1NJ^zP{TF>|RA+@dPkMEmM1?s1iR#>7GK{<_X?Z-$Y*;JU!^3B!(9)DV|7MTcr1 zi2X&E8$6feNVV&8w^7;`_n|6-xKu8Cix{!V9f7czo4lp)Ig^_s@41A9bJGYhl3z!p zdmy@UC0=&*2`F)t^l5-*U>M{Kmxb>wm17$07g{D3QA9TgwvJkei28|_?5aYcm1dBaVk!JEvUSiOwk zCMk_s^I=tqaoxx;y8ififk8{#R0h*LkK08Sxm# z+%=YG8$Y-q)r*9DLyJB29<~Rp69Ip^r|9t#MZnuSW?fW^!Tv9&!_K+nSa$=YtXmM- z7LeH!a*B0Pb6a%KVYMl~d9(e>I+3^VrY`a`E6-f!#IRjdJub{nM*;pb{R3ygGx~EP z@=qSu7892(e#1iESb1WId<64eaXuJ73$8BSTRGPauDzEm53k)L@%;_*#^8(O`>l{xvg--Owkcw2KwHm^w7xH>c=peJ3#zil*0hta;=N~X}buIDt7dE#vYo#Q@ zt3ptFNhQPa@?oV@3#n?QLbhJyLZhS?{3Y@mn8Qk$rGI9Xg)!a1j(=F{i z=09oo|01oEVRmBVRz#r`~fHKVKB4V)$tzUL%}vYGPP zPiF<;st5wQ@tnhc9!%+~X>fE@GTVnyLN)V>M%T8fNw@i^5#2t{KN4{-9Mb)#)Jcfq zIn+V?iV?KM+xSBUN{A#67+h9@NL@-0UXWAeB|!=vd*Yn9L*+a%l?v$xY$1(@Ft6NP@b}pb@IvEPnSiE zK@2PQ3Q1t`#9EaWgX2a9zFHsd^yb;^(L9`R3N=3`tb6mjSth)(oSx<@Gvg`D1=!6Ix>{s?bQZRB1$MsW-o{ zm{j2w@qS^x#dS<4I;mq~>Eygo&d!F4cW!lrXi^R{)NXEGy{!1}{Ac4r-{|bf|wlVszUsJJ)wdxO9-iMTqBnVVMqMXiJ+(I`27NIg2Ed`wd zOju9@n=gOeF@;{b#meQtBz1Y_3+e;#Eg0U-ivRNVva)ALclXw<>o+75-wjiSV?sOU z{ibK`-|6hNkFV!gUf?!=a2QoeE<=wYX->sslVr~H0&8w2iFDLLleU(`R#vy=bqIe3 zA^cNKkKx5?h2!ZrVjU;Jo8MXN5jcnhV7#p?7>k<}bAJza**h#(Q*IV90z|CkYZ>d9 zLt?}S7&pyB;twZ6)g-Is_Khrr`9UN=0G+5#_{xxZ9w;FS71g|909&mVF>12W-pYsy zmgV#Lnsw}+!?yMpDx zgoS1>nN{;pH>>D23k)~6SwiUh=wFD|0?h9cY|w=2Ga@*~?5;q|b~#AST1?Zhvj$~E z=>u)nV~;%64m3MXZ`Nzq=MLfv8*bTnk_7~N|4W3P&Ced!QdGhnkmwolru56oz{7~4`- zkHEfZeRoEU@k`Q`I~0v}^PYO8%#Oc$kI_=SrINKSKH!pFn8!8^$G$@w_@VorkW>fU zXlQW4Zk5H%z^4@p*$2vOewnH9`BxTp);w8L5uz z0OkYmJd$}@lMoR;4{7Iu=t3UkZN6kK0Fh;g2q0{QEaDdTk@pO2S758#Wy9w|FTK?P9+lRcJ2 zLLysIVs9l$##>w%%)FMiOx#?P9x@r9_Bb18QUx$CVci+}DfG_4`ZR<5N~RDl3QZIV z1LQcpuN+37mHIE{4LRlc1bm-}RhGATCXrB|-ZcE3ydMPMCVY#enKib)fMw?lL-QNX z@5*;KG8a$ydm&?e_{jIR_eg4gav@eAUqZwHx;rwp)I(Qgmmv)0L(_($3*NbU00BrqYA?qiIjqhGsJC%gu!O<{N#fiVU+Q!12q8 zRGa_!afkxA69#Oo(C3UdkdRA7UEIRa09i=vGZr)2`qaU_rfCokO9*&>Qv~7-(y821 zFPT!Qt_WMnetsMhtk$e&F+S+3j>Xf-?}gLP+374e)0y(+AJv)&IJ$ zQ)lzA&0>0gv4XTAZxHpIQCx~olXy3qJ{i%wu6Th3!&9sfC&lj174sBX6Uzb z(pU)B${#m|w_mNysl>n~SVn`gj6(DqJEHg6r%@hqL@^SMUX35VbZ}ND^wl5SR zkasLK*bB8!yjYvklZt%D7aP#`em>PO;qs+!t0cDnQ>yqdPO4x^npjX^TE1O z8)_K))EiCJ6;twZOpO$nc#CJ49;WhFLwN??mX07!9cAExiX7rcX5@H%2g6c(=FFL! zj*VgHCM}VrEQ=_H&B~v;m!qJFj$D=D?O1I`7=+G%G3bM%SEi0t77@chdy=V>1|aH$;mZ1_fj6>g6{@PAPDP0^V}>$2%|(s9zU?c|SbJAZ6;Y&+@L zwr$(CZQHiGgPXnY*>{Zlu=hDWHJ*w1N zQLIP~T+rktE1>5R)ZiXDTfN_tDe);aUts@gyC5WQbj>Y5y$T^3jkd? z7%I4lFNaR3mJAch`8ow-C27KhUtW3NR@%ZfP65YKIKLL~5GB84-t$`Bx}cHda?LS{ zp+#oO@BBSYFBy5&7c0U-gr`@w6tgQ)UeD2YY9A!%XAWHpNaSw;+3$|1pP;cB^@h15R>RUghF&cFNh#ay}cP?O8f8S3qaJBlseB&3`*0(rvzK43EfZ%DF= z&X=QNHyz)DK0IckAsjdROlJmGzNEHV`nOppFFfp#7Px_ElN*3G_&z;1*}hlG0L|yL z+J{RV!Pf}JE+iCa-{%ZgR&~T)1lS2%Bml&Yd{3{*6_gRrc(A^iHPlBejshI37L-T8 z6_oe^`$;#9k@ex{?AR~5m6m`pEx{Erbt9x&d>sgVzH-nllWz!W&>IPZ0*3i0UfUDB zyJGBny*F*}>nG48q2I+2tbRNjsgF<^!Rv+lw;+$Xj&S-Um;UHrjqFn(jxL<-g~NPy z9gp}@;5aw;m8oa!MdnTz%FtvtE4s-pb%wE%Hh(b2a)=%z%>K~EAI1p!`~bi}M}n*oHLx8j!T?TegBW{{B!?*iH8bQVKTl+sCPCsIiX>=5^S9 zjEMDLPL893VbadSFp^Y5g~JaVa=tn%IFZA&sH*DIoZq)>u`k23+mdPR&uonw+jC7` zn_L1ZY=Cc3YAGKlGsK46%FwXve;T1w?H8%FXo%1A3RNl(dqg$j>cQ@sJPRhIY$BF_ zaKt#GYoB7J=X*qExM7zPvzf5KB;e=@%mRZoBhTd=a>Y?;cRks@VlL;pJ$ofT9jd6j z7b?aS6(Yi4Rw6HoFNxCoGM{LI+AlR>!>guPwaZ+%l*_W6T9o*%O-spatNUq8rdXoW z)nOlwJUE7*|C#)tIM84J4+-TR|33k>#Qz9Z|F5s}zXjJpb(r7js!pHy>P-O6CL?ku z9jiTVbDY(vIcBT5qf>Sn19L93j1@bW!t6u3CUbTBNAYwtR*J$NAGo&2*qbd1Tw((- z4KC{@)<7D1m8RM%O|cdK&Ni`M2zc0XCsVE4$FkW4vSEjk-LKE}j!xI_Q?J>dJjWXj z*UydFJnyhRl?8}x#SgzoP}3s7$sa}<@DPIZXOVYrbCRTo`twT*c+qfRWr1Q3wB`Al zlj4JohU{p#U%m5qKXa+0bL1?|C8LWD9j8B?e<}*BI5}~H$0{LdR71PYcdkh^d4~Q5 zR~)q^S*ZrvoP?6?7ju`8Ef~SN$_bSyN)L};xYd$i+BZ-RlvrdDRLB4)cw;cz)Hy3b{1}sQXKM!Dc3^CNhA7OL+Mc0`MtMlmfU&eG%RRvQRYya8DpW<$<39vf*DV8 z9VX_SqaKSaGN*eo_|{^&a5~XmeQgh}HY9n`7O_0D*5RotZ_3U8fT zY1$(dTu_k}VlcpmEQ}eU46KG1O8hN?-lINjj+Y|E43#FX!r+Xo$X0FM4yfmaJT$Ec z=7Go36^Ttzxy0Fi@JRpPVrB+2B3N7wxWit_m4+DR<7JqVgXih%Xv*#hlAenNUgmPg zET$O<1mFSfDNz!_0a2w9eo?{PA$EyBWzGOpXvcY^`>Q(j+29+&t~5oxZ!CvV9x;2` z4uVp!CkQ0Uct7>rB@R@O)6)E9qLD&fjiU2!~WSOd~hO;G*|uWHOkVi zDJ+4=R281C!j21jxOKIKaoVwv{p0F7Q5`OO+Kktmmc0259{x5PN4V-AMuV9`s2aV~ zuQ%aA$?r(xxYG}H6C(7I^H!^#Ftjq74vIPyL+Vrsuun3;!nit)a_t*c$mWAT&wW`( zjVFB&7B}TDETiMnWyz78mT0g%ujj*o*%oSpn7`EuyaVdJD5@MJ0PpIL8K^6yWycR8 zv_56GPzKcu7BKi;+LBu6Uj7C?^#d^^!uamCIcUl+4G8!>26KOa_+&qmLc2vUXn&Z> zPjE-o_f6PH^-#z>0eU|AlGvnAZ|$^K6WM=8+r4ZjyI8oa6i5wt8v!_S9qdb&4tLlo zeD4clqqFvU4j)^zkJYjgxpxNLve>LE2j@kP!SRFW0n|4h0cw=e6y`=#yXxwx;W&sI zoT?Wi5ls6t9Xl~yL#Jj}2!IXtCrjh8kZi8?D=J+OTslct`30Rm)xb4A5`f)IFWv;2 zvupsdK}O)8zR&^^R}ZwrE?j*t=i{lTIE?Oe2Hxmum?1vGh4q=6Jc&aUg2Hss1o#oQ zn-mbY-kd@Uca7+%Qv=3}{%}#9cbFfgrQZm9G2BNn{!q&R6n2rX=-RsI7QcNkc9F`z zEi1rYCoXMcVXi*JUVsjWFK7g0zp;Mk9DRPbscfMw5 z^~Ur;T27GdvQ5bMG0BdZHs;x)p8?xFFBf|Khats|g8sVlPebV}L#3{)IeEj+WZq)# z7dpX9r8fVY4sC7Ua)#iEnCssB;-bevI4mj{zIFze2F-BcAFZ^8N8Q2K%RAk-{y|i4 zG53vVar-~@0M*E-hsaNdys=?HhWz&0e$zS%t{-$>3t&6Ln1RO~x~@0S#|Jl|{dPRL z8^wi{Iqaq2-a)DsH;SMp(=#2*aOe){N=jbsf~Yti2gZAjtx^&Px1zkd@)Kgp2eGGH zSRIKS9YS%cn+m28wQ1DLq1K5Ptvy$d@;odfTHO7>S-{_rRWd`cnn%|_ z%cDyvJGA+IJPj40aXaMP%QC4)Iif+pMOjhe9yrzTPfm0t`t&vDmlKV)DAYM~e3pHm z9-Cc^3sZ*b-|8=%RfSv{b1oeljf7H>{jGGW!159|+}*XNt3G75u>qgo4JGBt3PwYD z8wZR@4oA7bxC&*9dPB#>HKOzb)q+N4s#rSlbK_DpKHADl-rp0Zn^cXB?)v1(Q81-T zFa$(6>IYf6a;7Z}g_;7|E`TaI-Ij^K<4`|FE;LsL8yS2m@IV>jd*6-qto*|}SSbX} z5u2+63-NR&1`T%YISZgw+Wd2pFQ8j%5Vv}7T$QAX_OyapBFzhO>2MYy6cqE_-%7Md zZ-cVDwk6c;NKk=6#Sgi*L=*Yi_U#p^*UMGoIPv<-1|6kzXmdnD8r%Rs;Hg)>Jx|4` zW_bbLv73{>1P$|OMw((8Q?^0vkxw-n*5dvqB28?JW?NdX8Wr9gLO|k%XRR7zY=p&p zkRRC6onFsmpgyX1`vDvndLHmj14>w|^-_?@eRq%%a4dO*@jQZjcWkBMgl92r(0}|2 zG5gb7rIujl2Ue0Dr}b0C&J$#Fxqy^!;vGeJJ6@vX1{xZCpWjY7=mY^VYvt`RIZQ>4Cf;NQ@&pwsnVH740{^KbGOZi zM)hb!>sGYAXCyLWX!{ZU8Zjem9lAj4FTX!>MlA)4`HjHB9wD}r6IvAKcQJvaDC$IH z$aJ%F(s{+`+BOQkD4;Ok{T;zB^OF7kF(mr!lJAryQnu@(rk_2$4f#!dG}4#fn#TC} z28Nc{vjw%<$+jCb8-jfK6Qhb{EKOyKw`aZP2ZF=j%asV19Z~MFrH=SeSM=g#7YFw4 zVg28cVbP>ve+`l*hbIc&M91X|i&rJ*pV15rO7-`7GHk_b?b0#ffI((s6w!a7TBxTq zXceH6y{ma@ySLFufn@Z39=E&>%Fn6g8a9mgUdi-nxEA;gG-jPfI-XN;)?@VrUjSCr zMN@>hn0L+1n^1X5jHwxnxcEc8I|F$$T5SO~MM3o|3+E4Wk{WEL^Ot-0hfsEdnU)^I zfQbqdR3YN@UOxKnnCKfO#DG~r`oQ=Bz*2JE#@f(pbtH{<74KK|TSC9_69@LbSGZmG z8m?*920VCT^afcg!oA~d&(qVfoD)|0I$d5FUyt1#m;hrtGavEfG(3bW#CwKWWTN)c zYTbBzhIW>Iy)nDT^c^p^$!lA*$s0Uxbxxz^%o>N@g>%?7(9DEhVT|K<@4#P1DP-+5 z-)B=+o$psT#uF>}C(H(XGiF0w&nhmz0zIN;L)RtGU6d_;OvCcsp26rJIus>}RxI~F zDmJ*u4eovrgC+KsuPW`Re{_rt@eKd)4xRkN2yuR0|EW{g)RB3Cue-;~Hhor4F#~{R z{*CDU3&zFZBY85DOE<+^o-|GBB}`(BmWikn^uq!k{<&k4r6b9n&Z8ec^^L7aS-yy| z-ymyv8EABh>x|}|R(S#*jJp&v$Tt-_XrqQ`jsAMPO4OaIdXRk>@_Uv__mc1>89w6o zIw4rK%5*R=CUHs$@K9}g!zHV^#kZez{Ag)=VDB?ZO)8A_YRIeVRB?K!Y z!5RDP9IB0w<4U8)_6bHpT>=-X_-eIA-%XR!Ip5xF_P>DE3=6*osyK3S+8m%WpV3jv z760F2`BUEU(tf8OiKr$bPLbwzSay#v>eBPQm}NYXMuJH(tYW;${Y7%YlCq7@s10>! z4i0kaF}WTg(Z3?}NpERot+CxUlW;ecXj-Goec+UeN0@q5sc#+^eqAXN#uq>Os+(_| z>eibReIYhT286DC#nIZPO)wcTl-m2gMhjl z&b~>}6LVpt4dy{hHBXIijR8yJ2!TG{S~hPhyh2tV%@cBeBQ~SY1`W-Hd02LhX@%xx zIwnDOwxh=v%>MKn&reZt$R7ms1aT9_EU&-axYVk8u^+3^3-t>2;YNc4&Pc`N*#M#o z;Q%VG>&cl&7{o+2w%Qe`m$L7Pj`M=0fST_VjMKNy#{}N%c}Zhksg$SD`xWsInmXmg z5if(2yhC%^t#d8_VfPOOf&O44;?+vsM62thdJxo#iKV>RiZCx)$5#58pWf}Xrsk0>B_|(6K3;i zXMO9A{F$Q4n<1kQJ7k*^iLRwG?Q1fepdXXQ9;eyEG?ZGpNAkwxi)YTq&v>Kn(~_rO z>E&v=IEO>;Lvdb!J=9kx9uz{G zj>P`pywfPeSDgzsok{TWe|_plHoZ>iWeObdu-vPDn(ISw;IOgNnF7B=0pH$xIqci9 z9!cE*{|ekJzq^}Vnci*p+aj6U&GnE@{p@G`;QILf`Re_T3mOtt&;Y2PARtpb|4Dx! z{P+5UfsK`wk@f%foQR^_a#d3V#&1>*?2!7X8j@Pd#v*V&18FoP_|?J=tkWD_B5U4wS@ zSL-BNMjKhIm#rEHvo)XA{sic|2kF@l%V)WlMdV?ozP zH|El+Xlb%$H8e8GfFI#{wayjDPnlbqrF(Rmn@MgnhYT2<8N_~^D-*f~$m~a~{7p7( zO}Bu~W-M?r89j<(&YZ|@%N{&_A@ZN*&)f%0L0yhJMzsMmn=TF6>;!Xc=}Mb~F_3d@ z&O{@5$J>OM;$!KVVgLe2lVo`7FC3>s)}eDXhc$MKgQJ zc?)6A*`BHpUm!-Xa&K7ATs_4rgIYdPMzS)m$`Y{aq*0}{lZcajGb@Q_eo?cdjEfUk z(P4TYXZ97FxRFXWo>YXTytowjJ0~GrCQha%rs@Pv(TOL0Xdh<7N`u9G&M~cJgRI6A zRdsQxVCm6gWmx1_;v;EB^$Ac^%zJu=}R3Ca0onG_+#w+shHG|3v?sazpeeSJ( z@GT+^Dbb19p6RbWIsPgcQwjHIr22Q5!P8|55_(((oWycy4*R5vjQFLZ-;q6O7*KNy z-cYR}W`eM%(UN}vIiI-?G{J@g%{VaH(&Po<4U7W=M!pHZl}XbGH44W;CS77Xf5!39 z)&Gt?cyr|?cn#pE>lh-3?bdrjk3b2lW=QVY^pjmnl&wRm>lV^VD#cMD`I~{@OFe*M z?}(=xmumVg5HF^m5U#Kw(I~yYBaNdbj~$wCYXRewSfNopdVmIP^|~ERgRn-3-?sYrhpC?#YU}8|7c5e)N8qxV_3@Y z-s`8&z3-%+JU;@mHeyOx1Nim^=R%85*`B;K0N-WU{tQ@4Qd6i#?_}~T94u)=CTYK? z34jmU6}Sk(j?}sKl($?TVI*GdKfKH49J1Y-N#X@Q$^J&ZK71{IIwwfU8ZFxG)N%rbakkMb{UZ* z0Rb^S#2kolGc#)>>@pN)nSm*sy^eZ-NUOm((TD>6oCJP!$>apu2GRyIA?zg9z?xOx z2Ihvqri81%I&IhM*Iw`LSLwCPaiWq3E3aLq1#Z`w9$THqTQ1qUFWd9eAT1c5voo2@ zM4?)a3lR|*p$&Q>dB)}xyc1%KW(9SkfH`#8B4p9&fonXLtojGb4QVSTgCP90AQseL zWN68irSmgxlJkoZtfp#iROS{>Cmv2y@nR&o#X-ck3px%9A(kw4#KsqrJg8C_si>Vr z9BER2XA5>S&J^DvO-&n)EpE7^St_oS&+S)T1)UKm)zP-a9x75J#E3V~YUeQ+Us%l@ z=gu1^uFq&<&c-!v7i^E+^%pdYB<9oCRUfnLV4>Kyjf~=Bn<7f4QgK>ZmK#D?^o7OX zEJo(yhv14>IB$vK#z>JUiQ_}HvgeUwtp@gCXkko8EYIRD+jBTl=l zFl-d;Qp&jQEdC&v>Q&HdkZw>P*Epl9G!YZ$tJIWSPhLRr{+NS67BvBR)aTanpL%cM z7t(H@^il@7gal_mrkUIjgK#qv+jF#-PAKWD3;~g`D)Y*m?wFV5u{yQ=T4wOi0K~EC zk@`iV>aOJN7#du?cDr0Yz`R=T09FEK>U5!=6Tr9#TwV6Po|0*e@a(;%OiLwug%uEb;O8s14scvZZyP;?09wjjsVi4b0TllSOg)o@EtO zTb(8R4z1nVU*?Hhkb;x~DU48ZeZX+%Eo|qi$^zm@yUeQD>3G!*%7p_Drq@pwn0^Ec zQ#-rWvim>G?ITpWu@W5*+N!TjMPX|^>=X;U=Iy0inXC#7#AN*fICaxG(eX`HKL#k9 z0Gu-S_Im**^jF9QvUR?Rv@$|fM@e?(R}^Bl-6Z$l?|OgK(Gm|o6*B;apG>H5Ouu6> zD{90|kKy6T16yQJSt3tTWAP5*SuZsGTw$ZfBgmSyk<#7v)nK=pZ< zow+Hd?KuF2XETEsB4!ePHo^{Oz=~$3`7@h|{ll6Oke!k|B8>c6BuiT!+~8pw{g$-$ z`H(7E8V`F z84tKr7T8zxkWp=PT0BVGJ!8x1da;$9J^~m!b!KkVyYEvPXwq_+s;RE4w(#%T2w|aJ zO%&GM7R=&L4{)qyN~WrBzTOYV?J=B!g%7Q}PnKkzELXOGaGg{-uaBJjPh~CFu-h2p zU-Rd4LuF9jhc6>8VM1C<6t1w6JV+1iwDD)B*5?hO+6A`HGS{b86c$^3$IOsoS*|ZM zJNRUMrT(7XZ9;d_4+xlzP??#F*!E%~vuBWwOLJ%w#X z@!9tYoH+t@cmejHj)ql))+o#EZwe-P1p6xjd z6CTkS;t@sh<-lo|LrnKab;VR2W6M=5hNR)olv9@wO?$sV4VkRiH@C&T16$?z_>;_8)8Endr=i+uO>~S4yAlPYX)5%wM89F$B<8ZXZw5w%g5F4y z;$~&QuZfZ+#F)hfKnJ&k3q)sNInP>;&Rg3ZT>RvbMLbMBZZTVdTE4rfH|>D9?<1dm zK?!orcEw@?HE>m=;EvMFq&e7ZnmKGDnWqd4>^MNXpqpOTjY_H0rEz8u2@|UmI+M|d zyn{|(@Z&D6#4UJy;;!Vv)p$g1K%>^MqRM}cTY`ffiByY7ze{Dt{?>tftwN%DAW_wG z>54%4)(;iNbFM98txP4*d~cWjfC7Ixj-$&8)BNlq?AbjoH0icK2|EUXgD^>(G8Y!P z>bno@XF#(g}$ELfPqrFCOLDZC0EQ%Gh5Ll}up6vQimbhE)c$bD|- z=4M}%&zHzQiZ#i;>*;Pb&ssGVyE8?6JUXVe)m^xxK#luX%E0%_OvVKr6zyG5}qyCIxSHG?zkPV zT`7eg9YCgr+g)XGJBxJ9BcjJU*}oS+J&DGyf=y9S%uZ#$yEw$~(*d;W2rO$??=7&& zWcUUr(lao+se05!wI$1<(+HL>Y8N}OWHs@KWc;(9J)JFk@lEIFDAv03Ia$)3rWVpY zW$3N=AC=O9BoA>*qEAim6UeU1lXA!s>2e)@pb1_89;&`!|!G+SASKapXNQt zXMY<7DwX7dA(b_9hHm=jeaqB@Aw57`+*86C4xxB!DpKYu)#V7^D{&9Yq@|=^ zhu@o2?w?zmm1FND2T}Sl>ah1qEAbEfe`q(=?XwZ*UwwNRUk;mpKaz>}@A;A z{r_sf^FOfl|5{Bz-@(yd&%p8j{>JVMuU1r{qG(8e`YE;8AIrlmbd~GR?#opL2p|S}#vtB8( zT;f1lakg@$ro!y5VTi@DY?{F|UYWRwg^ejcMbchtCtt{Lg`Li^)lbGoW%0O5;E`9c z5oa+xek>wmzG4&8D@{E})4a9uU>`7`s&pqN1OOKk14pbYLDWCW!8D zGyO6$F!Hh>4zdZ^q|dShHZ!%&?aCsw&CM^-5_-Vl94k^Qe%)aSy<;r=rWU>hqLLF& zd_t_NSx*IptzEKUgwf?CPxJ%DDoC%ODfS*|8RwMLHDN-1aIMN5BZQqtuZ?K`gF1*)OJqh_ z-^fQC-FgFXg0Jd>dLWU{&!ihFvC*y~0!jwzbjP*>I6<29QN6$EbMzw0`qu|f5R|y8 zL)0(0ym8fga@58GaAnN`plYHTz?)xWr)FWt0i`2J`gH4^<{lsXE~+d|tPw-j^f9+W z!@D4TP1tqcHp13jO^+zR%S!Vzl8ft|r*VEd>Q%% z^!u0+o@V*=N*{TqZ`%>Ut%)|drtZ`>@ycvVa5>GvJvUK;5@R+-rlkDHQx^#l%rOo0 zS!)~oz)Yx$l{>Nleim=}z|b+Y#Wbq4ZnC+Nc-Zfeu4hrv3RDPhSO+b}y&?xb^2-5M z!c|@aIw?#MlVbUs+j9?B{St!NR3h8kwnS8|gaNM9OoPM3&By`C7wAVxj`-OUhssLE zQk6`p?x5=C-E!ABJ(1JH3a+?u5;xn2KR3Xjzi1nPv^p$&=s}$_#;3I6)^5zJwk!|G z(JgzPzYzHwL8KztQ8-c*pt%9}31*8HB>~~g4hLpj57JY4h;p&>Zg+=oaJ{ECNL@lS z(<2m|dNZiIB+DS@wy0)~MbkSTUcb?&j|7x%#9zLRk_@*!FaccP25CW|-VnVmh7oR& zV|^CY&LV{O(mt5@s&b|rGV6m<|>6~L&FDz+H8PTsLmxQmcntBse-&~T(rh+o~pC4DlK;n z26DIc{5w20Q;n=RV4^oy`0ktt(#21|C*dx!Bk%CsCvgq5S%Qod?06>l@NTtoN_R=Z zq@H_pzZhOnu9KcgJ>Zlvs!V+_*xx+d4RZ{%=*x)8FIx5WH)e`F(fP9+MKGz+T}+3+ zf|MgvF@GS#O*hvLA*H=whhoqq!s@(7a@uw~OiJ=Rt(+4}x#BQJC zL70xn9sXT*)*ksoyqj*rFfi;hpG1nEIOswY5M*mN%`sIyu2?0+6vKZ&G-d zS@uC%z&c#bZIpCek#Kx}qz0{?<7;aN_gB0uI16{SYsP|Zugb*k*$p;( znCB4slNcq)%2ePB*O?52>8%5*W{7A1@pm#~gAq2p3=r-NR3TZS>1_=_AMyQg(C)?g@m@ z#$11JEg3j;`XD>d=p=R)Ex!w(Q*7qXk*!b{juCjyk+<0{Xy&)H?@JQvDs3?@Fye1S zv6dtvYi*!bl(Ux7*Hr@z6(N))^k2tAvU04VbTiF@A4Rsf(t467+(pkzgD7YzTfxs< zt*i$J8V(O;6A2=Gn%9!eM`4Z@v>aIoEpt|>a(BIDk`?x({`YcsYJqVGyZuov__p?( z!W{4Nv0~+JzGZud9yKA6Z5=pNt{egJc{ON{!IBT&1=g@xC?UK-(a0vPt2~Fs(YlGN zhol$Ct{G1by9kGhbZuvL4GJv0kxBJ072}3vSePQZTu+jgo-jU z%Oj(TFIt%yZzLa7FCRxKkEPHfQ5G^#55+fb9<2y-jMuu5*v5sL5M*RaRCj-Mk{}U*P z*i(YDu%}q+FK;(C-p{g`=CeExu*?g2^tLL{HrlxxC5g-vss$(+F2xe$;%d-ib>XrB zdv7-YAM2;u6XS1eS@fe=hr)%N>`#s{d7g`hy(#LJhOd$Qi|DN3=jr|81!TINR+yJV zOu{_K;z{sgMMu<~YoZzq+L#k4Y0kW5F1?fRupfT~Q%TOsL?n1;Ike+Wp7Hk{+=%|n zoWacu)Q7lh7aJ%ce^6%8yd*nd+2l0ZL4UkYt*_U7e*S|?b}UTzgnpT{l)mWVzvq&C z|1FpN5A5&1SfA=w!tWsJ2l?s&Svof1H{x2q+{LtFY849!A|(A7@w#5ih`h=NV~2Ra z>IIz3HFQJQph9C< z#QfOYB|Fp>Ao|z%zNxblZC@UD#2|UYve1V(V9?Pme3g| zSkmmVB^&DOdh5m$P|Vn~C9}vZrTVv;)25EW#45kk^QxyCCbwi1uXMoACs@a?5CR}3 zZgR|?SBGL+x9T9`{rCZhkwX)%+%>d%!ryy^$BO9iLgDZNPs1-l_EWP+WdrI}F>1F; z%!a{1lVzZ~9#9wTh9Wk|Pbha7KYciTo%>XB+@bTS6&zacQgrI4#f3AY^q`3UXt7lq z-WMqfco~qO*(E`eP!-p3!R@e4-1L;SfwOkNIb)Y6<3yTOlBepoCMs`oQrX7gyRob1 z)NDHn;_aZTr~tpY;TGr2A@G$sPV{aF9^?eA6~gB!h-GrQmqqPw%+9Bz<7mgCJ!)vA zI&U~-L_L2cyPmLryDuDjKBE}Et$XJ6MWW(!!J!9@#~y)(!+kW3Va0L+^n@xf$?rM* zAX0MPnjN;p;gTJ^w#f}GPwwVfK{WNk?xCZ%x!7RZC9_>ixXt7z1Fi1peBHK!tRfG`|mIOh_r)7phm0L zJaG6ZB^lON7AJ@lYKyB#=BF3dv$NFme6WlmbSsDjIoqhPH&iK5TYFebcbp7tuJoz~ zpvfvS&YIH+Hsp8>Q4~RM7{Y*jaR)IL*n9i1v|29{{#%D~cx*eqC12~s36MrC+GDtO z-aXis;t^;X%>@(jDD0Zq=*O3s3T#NKVM|ObXV$TY89Q*57l~w5=#x8o4Fdp!{tv=A z#!g4YQI6GCDOa6HivnK@@Vh>FYMJ=u@$&JWqS099UcaE|8!Se551~-KR6@IWLngX+ zQw5Il2rm@2KZpZBMlS1w)mw%lcXlWgU1@ED567UChPY8tk=G{lOt<*U3?~{Iob{wY z7c7N4X|kNRgE59=GCoCh0jy+2&rMiClH^PRv!LeRoTC-VBBWdgDO{}&$qU2ovx4zx9ZF&dQ5n>;fW*-OcE4{rt7src~0cS zXra^vWf^V4!^gKV6Q#jU4Zm6&?n|OpDPou34M=7w@nEr>k^SvnNo~zJozoy-xeTkM zQfg~bW8W&Zj+BAX2G#f;HL^Piplv*ZuB26#A9oYou~q~m!jzF4HDAU5X*s0_ta zpp9~ps*H-!!wx~#%|1w$;X4a5>--H$^k%IBbLvK08+n?x0g{*U>L4flZYmLXqzPuN zB@^@SPyij_FLtzkjU;*hCU^U@SLiIdzT{g_d_Ux2mW~l01dLk(GwtE!8#zSLTc^|t z$s3>>OXQv=Y;IqE)b)tRHQsMkG0HH~A6>HW@u3Vq=IWz^`sa4uzQ4)!U5L$1k*OaD z>r1!4eM9JZ9Yc2h0&KwQkQ__$I!x(r8dF%YPIT$0!SI8LiVfbycGcnP8;j7vZ9^Rq z?ENT?f?ZUk!UrZpcLu&;Y^a;BDD#7*lPYe7V4#pMbX3F0l8>17YWBPlg`1iy!9I5yLIFwBk0lz?37Jw z&hIMMR6@EoG9HJcbuMK6jOBLbZ)XiS$!B?5ED#oL}|BYR`bF}0)LWih~i z%biddf69Us*1s$eFx7bb2}7*6-Zl2e@|E8j+@d#u|8($SWO3J8JL#~?FT86N+*CL# zR;uv~j=LAwAKhH7N|23#nj?B~MW;Eq)_rwit30TytlElpQC*J6amP0|!d?j$spE0L zpDL@`3?97Ozwl%?VKX`2vw73*c?U%_*BIwPn7gKU$H=?FDEqa0jZhV{na9D=)(Y4Yikut*G`R}U6FfR+&ErM;+cgm|82Zl zYg>Z{p9+4QpT8RM4Qzz7S4Ja*=eqpG6A>4Ew~D(Xh)T_s+e8(%fIc>~#fn!85bsvG z_pEIVQA<_zy4({FtDP<3uQT{6UE+HtMcMOW;$Kl)hs|8)#$T!)m-T9`sNjv$zYYmc z#V@@!>_ejHenD*xpBcpT)~qJg40M8)cQnNtsFv6?Un$ucScG3htvuggKtO`9{uA5g|L@thqm7lBfvB0Kkpqdq z|9e-pH*@@#$eO8WrZ_K$!cz@XNGfjj%}xx=Y8**qgMzkErI;y@G2t5~A3dSx41b#A zoa#(ADe-qsf4(04Ls#87A|p&pK9bh!4TtU4*753XJ}=M|(Ima1G3EMPn|1TRbe6BO zbt@~3^fEIGBTl0LZI*}UpwV+;?@QF-pBqrV3=dXjTxsSjRJ#F<++IN^p(_%j`r<$l1B0&e%R<#-7zy_GA7LhaTfv*8yW5{dCI1IUmtd6N{HH}Bfh?!4kaOusg> zWe$Hn!up8jw^#kE`YDUPn#!Nn6fHsLjP07Rwe@^BeYj<*no7Z%etHD4+|{(uSNbh5 zLM_AeYgfwwwh@m(JND47MNZIq4T%d3jjNjwu$^uFEWO*9@XLXh7#UOzuGY!CsI;WX zT?CgT3Wy~1L-Z?G(`$`%gT{$u7(r{Dq`B%wla$$prLfwmg?n1O?X0R=Qw*@^AE?4m z+3B+u&+P>t{1mu{VbsGg zk;d1Ikj^PF(6VimmRsu!D$@f7pqr{v$I}c(9FQZX?Br|5nF%!#=TGFziH33FetMiOJN1yrQ3Lc+mJZQ4$`q>An1(Sbmm95$AwXjk*E z9(G;rBPlkSKTcqw*x$quSZ~5&63~OcX@P4=ZB1)QQT@?6hyJlUY*E+#E)3GjPY@!0 zJ}aH)2hV0p<>a$oYIE`#g}7Elyuml{0{zVn>PIwv>)Cd{qZvz0ut}j%fvQY#tH`z0 zLw~`Q>LxSl^^tL!%?Z>``}jOY!|?!5$lUmf<}2-9zJHubhbl88+rCmKivMFS65api zJNefs^sfubBJSq~iD8@`sh)t&qiNa@G3a$+}!9Dkn!STf{{x| zys%NBvgs+eX>G2|Gr3FIJRUr(nD6;v`ZU_p^J>DnZuCm@ftkbPYU265Yy17Lca=Bf zj{NVh3aS{W@#&+?fr^H(IiMk~$6AJjT2$=*vd=Nf#0BAe94VY&&ff~VEpfFVo_LIO zPU`xsAQeH2ktYgh-}h#K%kte{iRFia@?6irk)KqypLN#ryw?Xt`oiw@GFKsb#|aq; z`v>oNK{CGWOJs{RIypQA$K&7TSv&nfD{Hfm5iR+XqgWkb8rC|6_W~B??0(;`9sL|bNF~@v{PYtPWZ&NtwhGqW~dm!@qipxu*xHrI&Je+@-Yrk z>D8b}O*UUn<3yz6-~EyioKFr`YV20SY9dnNWT7l=4>`6SjRIAE*$j53`JGq$ z7Vs=Ln3TyZB8k|NU(MM;T%oPtSn$t8dVpOuM)WC7tt>Jdwc{bN-;D}t;rByc_0!_g zv~-u_B0ye*u#jGgMl3C&+ELLb7g|aOKbeKVRL}vwgMG+j*RlL55Wq=iFg^;uizgIH zw77p-Fi_?w!h{T}KxlV*&_@tT`UPbi8oHymfp-Yv5zuOtfF0E2<{nZ3d>-q8u`Dwt z;b8quNFAPax`M?^e6v%RID8qW3*f9GcQC+#2+AuZ+#>&3*(~{8+2$t0w=~Y+H46tJ z%}lEChl=~pUK2Z89{3#xeVS1!ChA}EqrB&WB2E<-hNN>rU zeuut0&CQa;ya4|MkY}>YN+cs}LoKyF!Tkm_%t-3$D`(Hm*-P>#LwYV!q-B^49&Z5`P##^>9<2a8i^7X!Wv27*uYU&6l_$q%EifHJZd7Pmncd2J^LgqcxArZI zszG#wjCNwpAQ+Q_cQ>y_?Nee2?-atERScVvIq1jNkb8ED{Ia%~dgRDvl6Mccphgiq zRO>L3!ASWGk69ktL@i=7wa5$Y7hSgW*_KqqJQ(b1_g0VJM}0;uT9=zmP_5uB(Me1Q zE*fdVEtu2L4?FfSXe^4&p&r6uIhpC_Qw_tfCXSPOL|A9j{DF7t=a0Hm1qLfA8geOy zlRvc0uVc0w%58xH8?}zZzblU11!y=~v~)b%cZd9e6*WvYJ+6$V0uZTFQ&777Y|gC# zb}-zN_MwBL#al6s?73v>KjHhlrOsdpG~rT6PsDJElrC|-)dm`_D8U!6{SyJN!FR+& z?zkIDNf$E;IfKsoVCO-&W%#(LY!oLlulyd*J@DF^N7noWTLUOA&$oTOeQ&t#TKuQy zopNB#YG^b>RFKE4(a$f{U8L2_9X`N6C+@Hv2#ag{gUhZTl1pz^u6uYD@~544vt*E2 z`;zN~2g%9mPSGVR=MRs+QgVEE?>;q9o#p6c4hDL7_I@1WIy%ly_xX{Ey>-VqGg-SHzcp^h06-$YJJuk zU@N~xcx388;turhN3Xj2(O$a=%DV!pkK?<=goN}xM24HI3bR2e&X8C77%fBR>M(-Q zH6!dncc8%UA))v1>obGv-Hu-&4FN~}bpx7zgH10CH5iUoCB|f}Eku1u;w3_tU$x@8 zplX!FQdh3>=_4B|`9bL;3pas1wQhgbi2B6NVHMTK+W~5AI092YumuS1XT?rHem*PS zdPgdoc-1$uh1K)c!iC$psxJpFMsUKD=|$J<`V-TGUfo{Vi>{qQ|wak zGO-8l2;^>O2}wm)Q$|bLBR<0z(By_~b9l!~Rv>SPuC7NS^Xcf^8LM7-B`n$OHC;gH zCTaJEnzSnRTfw^Th!}lM^vdBgbo>A|WM2sTHviP4-ITm-@TT5$Bf4t0dQ_6q>6fco zmxc5>1%U57h2X!~LtjkK|DF;kca!)5%gQ&ggEU!If)6lOV7;iA)%9v^2rC(Z2#D9x zvOSX$u&w~B!m30GZ|Qn4j~YQs$-Uw8UnzX8@auJH)HwS2TilBdPk7?vpWIHMvgAE5 zkYB#gd>(@Q_3)SR|C(n1eXt>JU~6psUj=BqqKq5}14#=zg$(5n>)8UAnvh@?8-Ll!cShP6|p7K zSR(%r4iA|qgXOlHuG6UEFH=ed`w6r!&uRD7Iu_8XfT8t@UFrz+!Ch`_Xi^Wl%NQ;epYYySsngTdhe8)!KXy zhx?arBxr1GPDw+rj6>WR4O~CLpTQI=C+j%1qO02NDdJcLxKWpfdm9$fz*8-0WU`x_ zV?CeeP1*Kv`*0y?!VGt2S`F57PM3Ua`5VB=3ti!e#=chSb1Gc8gZFFp>Y1EQs zpxWBXr20ykrNbXsFk_G!OwpRd3EJ!JkL zE&Q|T`uDPnu!*&Wt%X@5mYvT3{A=kkOV|Ea60A- zk_;3HGx_ZN&^a+CBNwu%nS`K%SCxnron;n@a#?--Vgd}522}lhd0CyC*M;vSUuMVc zeFjskiG=G7GcWH8H30_(!z(+6Y7_fD>pwbCDGMk;{LS9LW6K@TkfsJ zo_+CE$6Ml#=5*!Z$~N5Q^jZL0o9Br9veR8a!(65G$|MgFrnChD2n*z`kmu_3S+x7d z`pV3WF=#WrnZ(Jf^AUtIDT1( zVH2O{Z~kC5%Y1N8&ka&ahAB!T#j!K`T}3|@0mgjfi($Yw?DFWWU z&yuZK1XM>#v(kb9kZQ5J%z@1FwnB;wRGhbG5^(+1IRC(TF3!zhN!$-`Tbxts57>zq zgWh)SueK&ikH8;2RP`<}y2$+rv;u}9&d6S{v`y)hGg!;UtcWy}@WZ@hn+th?p$0`m zz}`$%ie}D=hkGf3+|htDgc#Cr5(Vv``JvwExS2>(QG`1D0K=|~5rz4ky|o6ihZL@R zP5|pRuI7WKuo}Td*a(MRag6X@3Ve{~EOzzzxskA?rCEaz`MppujpX}9-wWaH4%(2| zg0#pKO}cHr>en%8yPK--RYlFXZo|pAtKuV-Vyy}+Q^7G|K& z;DY0o{8B#pK8aM)-Q??$Ye<`4{Z2w`NE$4}^ZR5~nDtDJDWq!&^tvw>p-_H+C7^$g zkaonsA0g%&EH^l^kh>2adfy^^9(@yfteox8%Op&X&KrW3$jHd>*WwHaP&V7lF2d6e>4KeErzXcNN9jAo$){tjDh z6slELfuF}1c1Y@K>~G8)(QRVc(0?dAAFrDV@7o0@;`N6#?)?_?T?O!zBTT>77&2fT zYKY&#Lw4w+7F0GkeWs2EE!?f$m&IMxslNpd?xku#B(khkv?r#nW*!a{8*HidSPa^p zX>37?+-5ij_b@nIZNo0Nq-p{dQyRuu1_pLmfGb>eq?=^p3`{h0Z5c zq1k9=x$15e+dk5_P*0n7Hcw;Kc?-zCHsMC?lHk_S0h%@LP?Lm8MAWz1n7Q!60h#Kz zWxc)V^}kGPH)*c3ba1*2QtyTW50-qDIH}(26GX~rM4Rk3l}Xwo(8b5VCBK&7dXT-M zNt|-DnWp3|st5IQm|*dQUkG2?v<~J+U-p4mX`yK;{ajH<>*K&&k#b^#sdElJIaXqX zheIb!ivDe_E=PL6a@Z7OAk+~gRb6Nbiz;b`Lih6eLHqR4rU@17j(KKNMV&#@=LtXd z{)I2j)K~bSyz6y2VOsDwl!e9s2FE>=ZIZ;X#wo{FLx*7IgCq5FSM%vGE>dgPD4qWx z#-{qog-ZetX|6i*Vl)>BaEs(ME-Gn?oh%brW7%{2UV0_vm`F?Khi7w%^tlEZT*do? zTRwP~Hae{ogI>&fZKN?xy^hPs%XAonc_zPhuzKBaC87Yb`A&^%*IA!o*=Pm0GIqm5 zgY9A5In)Sk)KUa;?1&?$de(@qk@C=nP;rwB-rYKNBRkPt8qel=r(3>`)R{(%Mic{vj9LmMLcRg2m!Sx+~z!wR(aB66T4O=cgl!_7@_n z%L^HO`RTY7Pu=zE10v2cIYWu#iqLXz5BN^83(m$>G@%)thSZ_$X7WP| zi&EM?9eBpmfd%1_~%fHilF$x z3D-cI+&0$qzTWkF^)ux&v1<21*0T=Yd|gM&xg(r?#JG3Z6X9F~jd+k2SQc;IapH{4 zLkZ^VOS^uC(w;>34K6>Kr2QYK6t~+Jrw7n+y-v9YH|&F?+`&q-J_O$mcQ`U5cXYd{ zW)Ja1#t~fj#>=jUG!U~v*hzw)=-tYNRfhODaQ9!tU#NL|+OMcJ*g^-EBU-i2V7Q0xIUXZ|0ZtLs;9j{kq3XTU3TADs!eARd-(1!dZD3NyDdg9?q{ z4oW+$cQoM_)MMTu5O%~c-LBw|f0mItR|Sx*P+z_rBL7|4^f&Bue^EyMSJ@=*Xku#N z{+}h2>e@f3Uq9AJ&+;uK1v3M`>lt?WAfQ!c*Z-Velw_!ln^%>OmT`==ZCQeA!8TXu zvg^A*#~%)BzYp)iq`}3x>Wf5F5F41f>LYV`#rEc(Sd&?aBX&8ytkgS5^BTWM+u(RO zuftX=2QeSu0#s2a)_FUwMu{~g?Bu60-`1u?vj|B{sf`YrHre9K-^TUJlvwz7SIdxC z;In#YrjrMe&;uuv93`V!L?#B`f*CSuN!&5&=?2;YEP-=ufvW_sjKYb5O8${qS=8#l zGFWkyw>XCJJ)u=R7R7SEITW_AD{omr+@AhC8IoD1*~WXoodkLSb_4;Ao;r_tYH`L9 z@d;0H`SJ^tj#E*yNmAF$DkBa*M#)%k1~D~#6rLQ4kc0lTjz0l67+?AM^$ z)JBU6UvjY=)p*nQN#$@Il+$U-3GGT!R{zwf2&pkUPS%xzdr8i$iOH&tH65N^WQaQs zsCSD}#%XlU;jxW|rQz%iIoRgQkc`M-??0yT&)=lvJB`H1?W4+^Gu`qcMeWG@n<=kh zDV$Al2xgl|>M{fxeYNhw^_k5ME~Fk4>t+R7W{fSx0>Z~ktWfxwG+!H$%K%ok@N4mE zb#dm;XFkGH{IbJB(chUKg;}FzlcH+@o;xSCV`Z~W zH#vlf8`v+99)!6C)>V_QfKV6_hHiNi`TDWGsnztdSAH;ilmW1%NTn*4-^F$D&7qQU zsxl+4m?i^-u}C0vLb-;7wf(FxJ#F-5@W7-ji-1sjYJXK?Qw-XU%v1FQH$?;g5|Q#+ zI-3&hLPG_pSrh}AAyP%j8E-)uE;~p0Xtm;+5C%S*;2i;IO(-LPmSp`=ldW_?0SPKeiRvOWgA%)4(ORkoKk(b zLcU@PO=d~Q+NT5@bQ%ZF)!i@yV`kb=r}4?X07Hi+vWga5v`&gN_!&EJo7xr0@K{@H z)VkO@scy`v+5BuRi=I)&TQ&3J4}fmg38*{7#Pb#NIAbksK>;?E3}TMxLw^{GjEy|N zPLDTrb3ZC(vXT8VJU1JTDxb0)wmV8{(?BFmn^h%Ac3nVAA_8C05ghsBbx3S@S%4*n z%5|N%4@l&(rds2zUZ=bjouc1Sj$N-k>dDy>8<6_)QiIhZQ3p2PXG z8PJ1vU5ehbyJz_%5F2gA0lk& zE1!#COlLQD9xtNx%bo}go!%1{<0(w;>#wgR=G|=0)OrOohgyIwE}Ve}@f}FxDCMAyZN&akC!zo^pTSKI2r(i0#kgQ7b3XwY~P9^6g@L; z?IyiCtB_+34#xt!5(AnteQNSX7y=HWqvE zbwzo0&{rP$Lt^f!ggiXriJ9}#e`XNRPzVt8Q$gyiEh0u!;F8FFL_(~4B~bXrm`hUo z_~W0X=CjG<+~}WNsjhH;myMYIUz_-UjWp8Lj@+=-P(OHR@H7&P#B_sd_+vQBXjT+( zW4=`F^oJs)4m)6xxW>zms$-2HN1EbT#N~b-kNee^no!6m2&#kFASo79fpXmLGU+{z zcYMVe=8%7EBh!dR#zeTkTJ?BXcY82-{r%wkK>PEpk!CWHC0muC?ob#VU^O%-q7=bn zXPTXmQ{aK+QmxVBI^e=(gW1#yL9p37afE(bn75K_K1yp0xx+Gqfq_+c)cvzF{|<)b z5zNynIx9;y^Nv^OUa|;eDy8(|bU~huUUMaHtEn}0M(I2_jloWr5_|6Zq-s2|{pp7i zy{US>&0%>oE!7h7WEFu%CmU}Xh8c>bbT+@a_3^DZH*0DT)mJ!}@rd36QGE15Uq?pX zRQC9=0Wd7Ne&7Ib;3+A5AObcBnr;%{$G=<|1}H;Z)UuK=PoL?znyCut%rUcKZ9Dh3 zMGb51Y%f38wEJBNw{o)8^_$rm{jz|1ARn|$XARYcfyHfHylHnW{I~yNpe$CYv+P)n zYcnM~vh8>+6X+Vt%Vy0T^&MUz3ajPO(6aYSwGB;t6#bb z9=l}AOj|^Y!ImqDrXvA75*CBGxe*-~|D&8+_Y+lnCPbE|DPJf(?DMDt9Rk1BK1fh= zURYYXk2Vj`S1QoYtyXR2yET0=rF)5 z3#Rm};9dF^3lDj*Iy%`}dVwPFIpbsaSYe=Ay@uH|oe9<4@8}r4m{U_{5Q5=qq$=*4 z0a(s-U=B#MW_g31@nybZ{|N1$HTqw5V}33)D(5Mcwi@Fi@MDMf&G3#AB#u-n;S~6eLpt=NEgP2e2Nb4y~oCPLO zNi5X2Wn)RA6uE3*Ymh6t2UN!h@OwSzzwj>I#xzhCD0_ZIH~A!Np&d#ATomMe#xTtF zj0R~+o1&qE7M5}%{Wv;+%LFh;?F&yQPRA!#aR9Tb zW}_mLQ}T;K$|m>=t5XRdO6Q1idHw3F`nw|nfwxHe8Jr`vFHOK0)X3Mj@GqKR+*9UX zHej;yf?j36lp$e4Z+ZnFBIy+%;rWu=+xFDHqf3YX@gy1X#SunchsvrmUzP(kH#&rL zySoFwbP_G9h$MI$jNBC$Zk-$8}CI zS+7KtBp#lfphjscPAA#l&2HzmD|7xPwO$!4`UcI>>JMEIC50&_Gr~SCSMd63J(G!h z6g312r6pNe2ev}ot6IAQy4yDF_N^Xaz-F|fz3loVxbe$z6(~OO0854|^6;NcM%Qxv z37ymCuGmf&-V+oXwkQ04qBs|sw}WkkMg2wOrtplG%T;+#$|v6*v%H^iu5xOl}|QpYCz5-5!Z3xqlyX9;@2l zyMPfrioBOy&}J! zi2cy@Hx{n%90`(6AeyEX7BN5Op%ikMLm?fHFTTbEim9&CdY-O|8dMj!fy>=o)Yx@i zv<)X7m=SunyQ}P-Cp6Q(`?-b_eKZee)ZS0@z6Z8FsbzeK@~tbapHYYOXCK2psZy7I z>3IP6jxN6Nkgs-#-mFx-CIOZ#*4tIr?M}eDZAt+3uGa;~F?~!>^>q3c?6y?`-}2=Q zI@*9gWDGh^I)3FFKfY|?2lx`JULlJ#mx}Y1DCOz}R0R0ykhbN$WiVeb>dFxR7;&eG zzNOo7B-CgKYd~VFx;eXUByWC$GNAK)aR5LjPp>(;Umjmvb%|Yd;crGdzOvc` zLTu+c=P$k49&jD3$oPCbJ;8Qz?_-*Nt`YsX>0~MHE{C;9Dp#tf1fE^H{tkSXX%zILku=0}a81#mXf0v}w<8glrdAi!f4KUb=75Fd=%{QJjHQu$&Wx z(m-nw_X?5Zm-+?`wJC^S(IW%dQ4!EQ6n0M&(pI zI+a72-!$e-f@a-SLh~Oei#eassMC)%NJX61h~(#fh9s=gD4;2_=j*G7Wt3Q(x%j_P zk+wD@R=^*5_(&w7*fQqIP&AUQtBd)Uhah{zd?b(U6-0H}gcUfzx?$)#djyZKPsOeH zG~7b)<>n+uK%%Wyy~4+H)aEeR!W)&TK18Tc{|er}^OEL~#)C2y-@X2ma_>56?LFeg zT|(+w3aqn&OjE@fxN}dPu|#e)=P>N4ID^sHjvJs?c9yZdu(zOS*~2+=MpCDme7LwH z8eO+3*|wiZM8WW;Yb|bh@GJTDi;Ot%rCvub#ksit(4dzO`tBsp4z;aLKZ!VW9`SlA z;yM}_L9tw+#F|srA#+-hw;_u9W?;NaS9i#hf|^mOGmap+~I31_Ai3kQD4gCYZqc z?eULO-@kkd?y=Z2j_MU`iUh$#W^NPiz0FAbqf0V>OPiKlo?-$`laC-cN+2gEV%x-G zB=do0=eQ~hfBh$fRePVeGW-eW9e%pZUqe{5|5tYr zH~GiWx6G$f+`q9rC98jmF4p`wb=ApKE^SrrrL^&&E_}>`^NYfg9wwq@CGf$j7t&Zg zPca!W^NooU4ioJ$^NqV2k0Td0)Q?F{W%^XrF*`qheZ9Mb{F&(9CvOeAa?yAp^uqs$ zFKpamPFS-2TiksDwvEs)%7S_%>3|uH4ocnuu||@aU~%NlzT&$O7ws3&TVA zg9kxWhHkSx5YnC8N;+ogu``DhTV+A58NxZXnax7rH^GZKb5vE-k)H)pd6RB^u(~7`rajrUO~F(F`?dftMeLkUiX45+ROBI>vlE>l_e#h=%H! zEM?=@y%RgUM-wFr1w}ec1@RsFr#LCQR%(wE7ImJ~0Hd^R*c1xjR%DE1o3LOojl8t{ z?8wZHnY-gPJ_#A=Kb++~zrjVSj>;TWL4jg1w3_uOrB2G!Cb6w|1wc_xGDOvY+Vg{guZsGnkq@ z7OsIa=&+lpfOXw@Qz0#whvFweTa-er zndeHMm{LGjlzc7baiUCY1;SZ?kd2wUS`g!V{C3}OIgWKP5H+o9{71?#1JSa;BYRKn z5A$FjeJQyf8cSWdQzm6vK*<)o5P_ju_tmP55&Q!=xn&g~G%5O_%gQD zgL0?)G^%S6q>#+{2^Q5PhCH@*kjGH{b7gAi$m`Wf5q z23m}M$;zL^2+1W2-XQx$JBvmvxJV)$W0nWr7 z3vF1CJ0Lgy4rT~3n0@q8`t6_LU-U2@$@SBJTt5dOf9*da|5N|@Yg7MMR`_r6&;U}6 zX~F1eNrggwY>=~*5P1o#;gV^fd}^HJ+;O#Zcgz^AwJZ4XRmn$}9>E>B{CL$}Nyk7W zUZk5V5nR+Q*dWJJa+8x@#tWm{eub~^2WTh4JZ680_B?K#{xFrc-cCYkim2?!$o@2? z+F5pWeLkj#N5}z+Si^zNHV$GFOHN_Eg$;NohNfz~9g2op(2Nmurr(yVPI1YxweexG z%}oOR0KJdsVO!M~e?ZrgGbvX_Mw%&xOgfrlT2|2^5-F-nAd|LSk*UIXs;TZlZk{?b zoCd0vh!hiDW;78qBvx zRf@0%9z!vrRs5F~xT}0s=Mc;@j=)Af#|~TAi)<7vzWTn~VSiPYkTY z090VpU}{&8Gg88G)HhU7j314(-#4I$!fps2Cnq)=)M}Ab-jj7Q)%Tlttm3Tu3}SxI$iZw z8l*}$0A_H)dwg-j@HUNjwyI;F%kl%^3uz39jM8`4EVGOZO(XqkuqvvU{Tjhgs}{-8 z(`Up>&s`DU;OV)k;pEZ7a=Ms8Ypgs_-Dof}ldA0^+)R1RirNdsahbBAqz1ET1cXJ? zb7Kxo41E)?AEs52XRH?qf_h}gr#E%b>n3x*1gdH;ae*Y|kjg@a*k)0RmZT&N^pNIW zQ3##(M#Fv=3Qs+ip_C0Sess*87Iy7pWQ!xwsjVGQkD?DJ1E>+IXta)h(#m7VVJ4Yh z7jfPQ6ot;~eFyw-nd9LwP1Uub^-tgGPs8`*E)s#S12H~{D$S(^* zi0kFxA|`&l1k3xykEk|+)1WrG_dDcpmbD?snb(NQ(yue|siy`g5Q*tP$YCReIa8&~ zn{$M-FbK_e*u`)3`*6#dt06=x#GE7L#oq5e$z5QQO)k#NJQs5kcTL2~`J0-neH~mn zS7UwTBq5@g8^ROn6ngnB%nvSc(5u*VDE~vUa0O2UKxXJX)>#104`Iw)hJe&Yk(h4P zf)>z6UqNfFR&4Db2ilhSsz=yhR-ndi7p%PBtp#l}c7F(}IqQFObF-I&VpE3t)&yMP z$*(qG!0rM&Lx<;w9%dhN{_5Yq?`2B$;N%Xg<8Gh^o#59R1Wa*la#?La4YczLlg@QGiHd)J%GgtXGtoKnfHkUn{D1Qg%Zh0nm$@aN1 z?zs{Z2W7PMAZy_ZEfuBuhPeUW@JCh+@#IBBVsYH%& zNz_AHZ;BP^4d}|8<%ZRw=YyYfPr{6? zSFyoHIJcS)y3hmkP^Uk_qIS_nA&)&CXZ^(_MU~ourI5mXb=mC6TwQTzJX=I<6f*h! zkQQ?>n5^fpJ|_aZnv=_jt@+wzUV7)fsO8>}s{3NX#;}kd6DW>FA$)#j9+i)ApOS7P zseQ?9bB(9XYJF`rXwwDuA5NB87o}oL4>A3nG7BUVV97HuaBtyEtlau{hAJ8Qj46dc>R3?&E#FYATp|s-neUEiAb{X(Tec z&d*o(?=I7}?zP3xjnrj)kzIgs(~HtzL44!4&AzUB<3qVS>(214qJ>AN(JOtDR_5wyJX?O%8g@|6raTITRXT_D?Q}ecR<#5UA3=LyYRdtC&C83yH!$1PObZrPQx}OT({BX+_kp z5jVcu+f1WxqEcvjebgN7=ol`^)}cv(;iYa@{ju+LQjYp`yRz_E*M~KZ!pKAumE77`xGL*&^U~vQ4`7;iqA@;Z-IFL zpFy4?lRv$jq=OBEO6T@`AXO$;CnBO!+)l}OY7*WwWQ0?CRPF>R6BrjacC4nAAnCO=;5kTR7?fk zc@t*`OKUm(DSw{*2n6iQI>7AaOC{YO%j%RD+Z;{oN%cumOAag@YUL63r~|MdkN`wx zB+PYv8;-!=HY$BTyP^PAvP4WWs1b=18v1dnj^kJ9mA#kjE2OHnG~p{Vriihy8Fs zvL#=S{u5PZ<{VO>LnwhOGDg2q7n8Ixm6(g2i4=4Oefsmd+$Ls{_zn_nD)Ws7)@b!| z6yOKyK;lHodNV-vsaY!FJp^f0XU8w+;YHL+1ISW$Ty#dnYpqEbbLuVFP)SmR zIXoT$2H_tMLVDTDl+L%eR>h}oxz#8C)$<~Yx=E#%=*Y=$@-#L{!Ph2;8SiVMtIZZR z(TBO_nxy}_0hmFz5X<@OFQET+y!1Ev&i~m;|CLw#cXy$LtoEtz3<8lrE{?cSq9hEK7TT;M`TN@b#lwZW}ej}jQwpH^U zIdmI8wbpZaEb^nH7~&luf0A<28f!lWg*};VEvEgjIe<*QXqVH|J@-JzD1+a~QmBNF zjhJ0qXgC(OJ|yeWSOjg&Eul;Ys*xM6V>D*e~OJsiHikx}3&b`)D1I z#@inmrc_Lyc}893xK5Q;a$EuqOSY`ZIX6tSnC4Q!JyS0?ckGjBud@< z9V){50=XE30`9mnyKCz`7Dv^-$4TK`em!_XX-|9M8On)lM=NF5#U$xCcbBli=uB2= zBbG4ooYPr(hq;hU@M~X=nI1y1kvz&Con6u@ui+~gYY#oG#h_o}t8N+VO6fI$i_{L2 z_WYur8d$ScqNM&sJ_cCEJe3=fl4AjlJtZ^FV?vqpXy;At&dH9|G(b6?YM5urp8(=g zme-%EfS#msAT|ozFD4oPx{^BSw%z%z76!(&OQu`7ARYtXG2 zIF&-$-e1PLDlDLHzmhDq#d<(}7LF;9Jl4UdWRcyt+f>q@R%SYh>z!kOROSeqP7!_y+TA>rI}T>Own=P##V9 z6zj2IQO;bZWGRfhTNm4?2@sR2pa4hAbE`IrdmhGiGug4bngoKwHs!JMg78e44tHT> z%cvvOtKChTO(`4HD>`6IC-?=-!tNftxrWZc7oS)MBv0rMP!GF}c|+DryWB0>N4PmV%^+I> zENgrUd2b4?m~wC4`a{aQDPqcOl~|}m68SN^Tkr%Js0!GkoWOTThu=dn3!{p(ijRYJ zpd8PUUXBn>>?V{KUvFkYX>sCkJy2Vgje);+^SMJ}a;xsxvHrj(C%uHInaG!`*je9b zyo6nzJ%*!g^$C1&lk4bwsDO?YM8CfpX6yR4Cb=qWaINQj-9Z?hNWmuA#PIBhI>0a< zAPW@0D>$;n>HkLGZ4b%TjhmZes?r$3q(-!Q1<{@Ud$$AT0Z=3;~&#qCfiPt8@^5v+h!W%^`H6)b-Pcl zgrAqsiGSOR{0%49e}-fUTUP^X3u9#udlM0NBNO|7z-9jm$LUI+Q%wbgclf-Yb=sxc zDwT!&blvTb*(BUSDf%!ewX6(Rd(K?7kggL;X&Fd&=ugM6#3`Q#TX6k<4Aa*31pIpY z6VsC~M$b}{-`-C~*uF$=LUY3p!9u)OU3sDi8}n=&3eDX~zXW-s50fi4pPU^bV;0KZ z2nkPYyr6KH+_DGo+Z0}^1=s!2^d%mIqSlG`JQ2?j_e&UEK|Aoh4i+$-x+ipt$WgZV%nfnrH$Qb1}C;WUJGO{OS^%JEBGOR zY)}p*pqgbz0flAMRd}RJQsmEK}c1zHh^VC)+Zc0&i;V<~y{hb}~tczG(U{-Wen4u)HEh)q@!8p@krxu7LAkl zwuo(PNc8XjiPiQbeZ9f^tPZgMc6$Fmo<9EX9Wk+>or|rpgsqdafvwTMF{v^YDsV?MZ7dpHOH}3nK}{_i@Z5TBYF2(`M6auQ33!8*N^Calg2$nbExOB+^eReA zTt1JYKPC4$zC8}J2WbJ~FwznOL>ndKotvZWpg_cWz%~4P-V?o2Au``%Y{+=C7s@Q>T!)WL#%N+<*C#z1&g0P1QtUWHEcl^%D>U#mk3#0EnGsM9 z*UnkWrNLyK)5iG|`Q5Z+{e03Z&sXA^%Ygeh8!Pk(Sq7=y{Lp)`D-8k(=BrWEz zX+R;t3272MV9vnrOwNDnD}GO!xLMk(SgOm~0U=|;Rm)s0u>O<<0H-C!@Afs*AfgIO zHZ~!mB89Lg_x}Q4GoQPS>`onmfX6l!%A4n*_&xU+J?Vn`1*JwhvH=$tn{&Yv+p|i^){n&^iXZB#(TvjVKpWVXXz|%Ivs41Z25>dI<-Y1P6f5Uv!=IWf1Zbh zRiQ*ZjzxCBVSM1U2gkl9uPpcvGlRb}3WR8IjB@OsSl$am#})z+W}F^(0O_<%1CSDw z?9l2ZCcGtsKYPqAi^A+@EIVq?jl17Yhmzf9?awOHxrALfy@>@>WI6*vAk%jsfmkSH zOiNmDa3Vw5={Qnx^)1~n9P&XNdB_dO&>LQ&pGHFGmyoSuDc!X_&eM-enbDm&jD35* zOZwvwl_DwR3Kp1_Pdv~2cG zf*f@pG~4#o4q`+cEvM=}YdO@+IngIWixJwz73jH%4KSZz@>;fvMioY)w^EWhx~*~p z%9Y4bMN?ksp2kUx(shq_pa-;Yw8h+tQEP2UP(uh(L++5)>~6Ws}2PSGM(bIF4qp12F= zHop7YNo)W`&WnJs8*-p2idljA%F|z9a*@5+N+VdyJg4L|ax%pfcDax`I|m#n`5(;a zdzY0}9uW4w4HobYY^t%>L)%u#w31hfdrEF1r;%QTbUp;ph68PhoH^L*gE9S9Nzp)( zprS{}UA_t7aNsATGt)G&IMlKIJztCMA>aciN$D69k(0A+i6hX4YxPoA1-qN+?G_R9{?nNLofAg1p+|X3E4Rtmz<*XZx`qRo4SP zVE@tZdm_B|Nqz>d#!s&Fzi#;dMw0G7^XPvBFHs8S-^{RXeAz|S)w9tC_(ggn%O_8ZJg5-K3GA5SfOZx@LV;GqBtFPyjB_(T+ zUam_uwb=)ckAWFGe|EP{mnPa`WtCzqJ&);k)BF5JSHQq=I#? zH^!qkn(1TW@^^~)*s_@<4|%G`GToH_SRB0_TX2$Djog}t>JB<76wA$+B6emrjL+qC zX68?vHT6@$WRmNITk%{z9cfy!y1WuP)}(&dy`$I#Xz2g4?N`>F(~w&ztI1!VkOd(4uYt9qDvwjpjbL>vvBA zWx06%Ff^$>?O6N1xjm1rDjsDCzSkO|yO8i@288FNKLYB!s|}>Zm-Lf*ULE~bQ@^&D zVZLtE9ivb7G$a%K2drs?-Zl^T$oSyU4_~miAlO4Te(q+Goo{+Z zHH+wcwl|0tHwyQ^4xWE=;>9k%Ts3yO#0$!YzX*d_T@e?ISAU$xPXUn!t3-+-h|N7n z%|y;~+?IPhjFE$*Z1FDy-;-_={Qjhb8cQqxadHj959FV?{@iIDI91fXh5Z=p- z_#RD8e|#P?sfL>yfqt1?x|OKDL4ulARPCSW(sbmGNoEZFNBfmQ)%!IW(~?{f)wWU% zojdexdfGk(d3g9@Sk`mExi!KWtYQo9qx>Y@OQ}2+TN`|$TIs#dcyV+@%f01m!6iIZ z`KxwMizVLaPOP7$b1Pk4$M0{2JbKx0Ss^(tm|4?RPLJ}O_hRkj2VCW?8@z@)C@k>B zWnqL=aP+|i2Vasu@!*0R;{OYS)zqqtnv%-FAm1r7_(i+Sg z;~imj_+PZWV{mT^yXCuL+qP{dE4FRhcCupIwr$(Ctrcsg?*<-M1>A z|M@Uy{pJ`C#)Cxmo$}pcF-yE-S(tu^1p}B9535hI;?)%g>uAfe9D7Hnb$QSpyfZB1 zDf-5oue+PVWY$({#CuSa8QaU0==;428~(D{ijna{Slm)TUcnb!Q5eheR#oAFfN@li zyrC|C%{1bQmCR%|*{mnvWOj}7`?BHB(V&{0wJySy`HyN$$k>p6MKLrlk z92VQ0mXokdr8pPVm#7MDMgv1ant`H)98Gl@n6{ac&2|8FN18yoW_LR%dP0vy>Y#hj zH!gkns_&56<_*&F$v5cpgUKz|To3cjZ5SCg!2if!>H@QeVGqM6h< z)0G;_3AE@y!z#Hkg_Y~Fh-FP~wwcsGR=-3O9*iszUyz%rb=g=yU;;BzRaW1eEiI!z zkksPDs>t=1%r#r?6{QC=`YRA-ziM4vPo9U3)kfj`W|;wBUpo7k<|WGgE;CE#G{yrc z=?!U3M~fZ$^)C9f+%?$ZJ1)o02p@WM;J%O9q2=z&0`LVf!3&O0O>PH#uOmRqof5eP z)j5TbC0;#rwrMe3Eo96cGxm?89G;PedW-g~oGQp-s~-#I^2mPIS)-SZLM_SlPl5~eL%&#vvDis{Y zCY}=^}qD7t61|ZR}=>#|8X%RgntupFY3; zFz5N-e}4b<(QQ(P@cK?!`0AOmF>z%gsKu`TRZHG)l2988o+|VcT$ETyLO@CYC1gvS z(S!-f#dJX5(z>DvWpQ~K^0Br_*<%$of*N1hs%qWh`mOtVVp*rTdG~2s%4FtQGyn52 zW$k7Asr&7%=Q>I@$LCr8hooBKUOxd#y4VP4)XA@Obd`j;)VwG24|&6pCW}dIh2RjD zE*{z{^;d#RjMAjBzbF>?!(V>c-Qv?tjw9 zt%p#XWW~uQwFXuwIuW15z~!wUD@>XZG6oJp18AznhuztCV%kziYP~uYh$l;2NDHXT zBk4_4^Z_g|ij$_X1B8|qDAK#xv{Y7NYH}Z=mF0|qMq48yL-PDW{A7Ue+%4_ttzgiw zm|;m?;H9f64O=CKBUeI#f;cJ7fC$V{H7jW-Akdhk#LBrAG!&XDvh;n#Wh2BGll9y1 zB<&&mAeG}_C=&*ngi8qvAf|lW?8+iBQcpvms7~)!^G@wCQuG$;%bSktt^w zQaUgSnK&W3p>PgNOrXHXxW(kts0%7CVazL(6v5(blhu5=V91qkqrv;qcbIF<9jho> zU-Thq4mo4d+L)jx!}{e?K!k&}T9^(b!hO8yPJ{CRA|G$Z5|Gnw(twDi^a>$c^7|o5 zx|m)YXej1#mA^o1QtT#H?H~Znp71CN3Xz;BLCh>dVn9(LN;8?h5)us#aYKTbRuUts zo5XJt{nzjmKDs$O7V;IMJYpEu{*T;+o8+c8=>@Q*XHXIr{7Sq>Loz3fW4-p6_{{k4 zHT8GZ_3$NBW3&`HLp0F@m5XEsgame=sW4@Ya%HwtIaPzfTTZKk-`&~z`Zk{e48m|2 z9tN_ZcyD>y=^XI+g(LChWx>z%lKS32Gs5OxQ{Iw&QYzsuMe9^t3*)JgEq~CvE=d3e*6{W5locgd=pu&9KIcM(Xi%??bauiw z-dAHb+9oNu*RNyeCJxT~xx_tM^}=cV=o$B06YhF4^wkl3+q&>Z0B8^JF(l@$#T0oB zwfrKVZah|_pAhHEyc{G^3hnNxPm*qZHV4jcfS4m=AQ^kqG5A;K~(rW{FxSft-4-ki!SQ6`h^5u}?pE*iJnq(Y9|O^LG%unY*bjT84$m@HFzuZn-{i^EWdx;to>OnnE)pBwqJWR!z{DJoCfYQ-B{{ z5j$US3%-6sWPueP7K0?nmAasC6?lg19@qS1X+(0IpF8m!e00Eu!6`A;Vv#Fk zox-Q*wGl(<71H6<@xark#LUwqUsUUj_oS4E$CoQ;&2Eh<#m73D$iejm&i6atN1(f? zlCiL$yc4!@B6)V0r!p1j1*zeZuBYQhPOXgmdNA7VhvUdlN|vN9D!N<|=srj)Ze-4miS9Nf)B(205#Rg*u^{fm;dcptv~pZb zKF@eVgszPFFD;@;jIOx3x~5x{u1ZgqW30L08}@2)l6pdJ*ylat1PJu!rj7+ORab^e zj2Y3={I}cSTQQ2G&Pcx980Lez)8#!1c5CPiop@%J=Y} z>FyDzGzMlEvKkf#^%aVE~y}aX7%G)0>u&t>b)H zmhJ1=xa)bOTqq2sVC&%9h}seg2iL6j8oY6yMl{b^{-kM0Rao05LB3E$=SXqyYnHqK zZr#%Ek4mnoPSPZ%R(%c?GJ*kOFt$*>A#pOpi_RJXLt2=dJU=$UZzOThxnj1pO7mRX z2RN<)USn)9lmM6Clw5duy7UtK%8T$gVGf`fEm%Y#p{6ztgip>^?}x-gXVZseSe#!F>_b}gU`|}_ zDOK~e%=WLGQ&j>4#9|9&RW%gC7a%FzfcYW_{` zB6bpz5Ja??1ED0%23r^%=3?Q@RJwRewKL943YIy zI@Ighx~C+3cubTSbO@t!iNjz_Wd8)2^8<=Aq$eb+YdA)a7u6Rzi#8w@INf$cUJ=Ia zcgE22g9(%&@AV;CE5rnF-3`;&*+q39Q6#&D^b+=bFpnCdG2zw z)ZR$S*=X~66kJXZa)KpJH`9L8yd`S9BM?ofSz8FL!MHylw&}#JmpT!(hkdv`FiO4J zCWPw54kWZ8nOd-b?PO|qEZ_!=is{*)pe38HC$nz_%bQGo z390fhawp$#&J}vcnwYk{^?C`Ui|j@a?P?hK72`gqSC-1|C<@o*WO9mIPX%P!|Bcy# zn0s{9oLPdMaxXM+BuDh%4%q>BzKHv(G7hpb46-sU{9J*#4n=K1MZvymSY;V7sw${& zS)WcbCL`1pZ-ZQ+HptGBf%AsxJ@aR7808n*Gs#@D!rWK5#0Xdv^)rl*Bs*J#&lhYD znsLjH__`07`5Q$&(nX;#d4F=GZUS^f&&D1c=lfHN*v?2qg795dl1TYbz)LuhIs3s!FF&g&)Ucb1CEW~nLj2F43@0?ZyGwlX*#SMsqf!q zolqCy8=3Yj$WnK!f5UP^j7i&xuJUN0Uh2Kd z_HQ5&Je440w^*?sOWkpCJRwCM;kEdX^>|eoJ1rU@S)1V#iW@3IJW(%I_1oLUk}btS zLnY7pXmjAAh{Wk7A!M>@Zb@%z$lu>M7RmKZaX@klLvl9*N?uGNhF}>sfLCb?hl@a> zTyjAPH;{R(VWZYp;HMKUb5o<&FUS$AQfE-jEB0ablIfr|)kVy(0o%~-$6XRu=s^uN z{1N`EfC^r8y{rA*gzO{!CkMy-zd988|1O~Z$FS6YjD;vn*ev`+=1KU?j~hFiEQee4 zlV2iY5WEaZNi|7MSjFbo@|pkEU>3X0Fq6KO;<##^fIkRcuP8zFmYfijf`ZkW>s6NH zZ(O{cYrbwDpjtms=oz9h<+B)QJPDTMFj7mTpWlT<7SGKRwi1rtiZA=sP=%AY0#hyB04c>dt zG&7FPbPETGqq~!%g%?L)y3q-b z`PUp7aPg{Ja6mNii}Nis*F~HVMDFmz`nqG0cLJ6Pp%BeYR0(+;UNrTm;)O*D_9NJc z4X42xkMpH;Rb-*#^w*fWr9k=v)H%o-zNk#nC0I?~2^zXCf+Q1>7gU5Dkiy9?;%hkL z;rQ5BCeB)Yj60b7n}BG#feTPS%nARUC~@$^LrnWFWVWl_rbMXlzZrlY^E zZ<5Kk97VUg(Mo8)H=Jdg52w%l#MlRFZeRfJIMa2Pwc|R?bN8{5QuE_+PR}eV=yY(o z%``gjAfmUC`>BeDxvMX&HlN|idjluEX7S3c-Se>z(Z|Ts1~pRuGP38mctG6wR5)GV z(0*R9%ycw_u(oXhiC-+FCMKJ)7VY(9qa&tCmd}UL2zR3z2Zz4!JW2-^v>IzR)^IjI z4u_H3{7ZC?CfK0sqvS>gdG=hTU?dhNg8opDfaY%AAxZzimO{`GV0T{J71<5VYZqL2 zi3T?$Ts?78^RP#5qE@E|kT79_(LF%_TDR-X`&0+Mdehlp2d{m0oUVJ(p}ru}&* zmYrmhY81lIywR|9@F-;=EQ`uS$trD> zh6que3rM&(b)jaH&>|xdK$6@oIDVK4hrslkBB1vqd$^Yht)N*3m~1@P3u8nY7*!sQ z{zo$s_0qBdDstt)j4tHk(!#BNC?G|9aRPv_W=ZQ(j;`NgN+8IgJX|il9ML}#vQ@kg zEMC$zRWAbK5#0P0VD0zSHt_k~Cg#zO@@7?;)$kOl7DiHOK%#@11VxC#zJiX@`}eUR zYf7Kv@O=^wmCiv6hjxfZ7?LwY!6DV~b>Jpd5=QSKQcJ!j$>H-`9YDY?A*&jPCzj=u$Lxa{7K#|Aoe&xW8g_ z;e&Vn>_O)H=ZAp>c;Kg_d*1#Y0~QmzA^N4moy55-;M$?yPW;XS_xZy&(S8|y&In1C z>28|Imh19uOYQ)YO60q^xCrGZmS2YKXK1DX%WU(f09V&;DcwZ_OsqV`~{KwGocce z?<8E5?+5eWL*yS$2>j0v#nITo{CkSV!}$Nx2BO^m>ZkGFKmR`>(xl8CodnIk&n7GW zkN^B1=aZ*Y%~i2SP`X&4Xkdu^W|Qr$0-Mdye-dp7$p6R#hemw_UjrnXm|nhTp3N`8 z^6+R}70(oozN{SICzjc#c0e?BG%yAr%AwA=aCG>?(nHvT&oT0S(tHMbBXj}Xdo(1i zyxQYoyW&k}%j4n6)%F9VSAG-GtyItCGM?emq(sVd_`W{)TuLoL-Ss`+{29dCWY~eU zL3p9TX~ScDG8>cbHQVNyqvGUAR^7#?kn!j{Ue;yCO!X??M|@_T6D?cWqTN#!?r7QE z?fxvX&8))Isj;I)GuOUI2Zq5932VOUJJ!ZHDhfAQ1O%3Ly*X3zsxghn@Kw>~v+?TC zy1@CsKTAn9hpi$XP=wR8HRz)7TxOjV1r4$~;b9UYBOT?jKxnYdTI9Z>`0(_5P;tO! z`@%*$O9t>*Q2li5zIp_H58(thNP2fPZP#))Tz^`O1#_DWNc0ZyRHw9!*I1KG+P9Y#s`wy= zlFwmpe-2ZEGR)*c9N!<+&q+;>5sS}ucC(#TU#D%)BBF*!64KVbx>=F#(eGFKCVKg0sVP^F4RrMD3;sTa7q=ENY)rji0!VJM!+2cV6KV>%f+r}i^z!cc`J zCxl`z4IUoVR}fgso+joo3`Os;F{s2>S-%n*)c*01KeD_duWVU4k(wigC+*0+eM&l{ zD^*P~5HkKJ={spEn32!5MeoN$IUcr?UpI`3{`heMRv{*5YoXd`2sNqzS|W?h1B2g) zAXt#TPR<$mleC0Z)i(GuHHtLQ0KNUz6H{ zu?^|9C?lERW zHXW-EpH=#>8^Tr8hbTtuy}PJ4(6LWMonEf)mMTa%4(a(`t-I6`lVl7AY21T3%*45( zysOVA$X=yttI;j>n}-Qnh4qkpHRpP3cIsWjtMssDCJi^FUGkrCzRnkSdEBzT#(w^g zUhRAQT_1O8)iTx|qpL*rDU3AV>s4$G>lw0vW+$cxi-Y6X+C!Bb-WBzmEw25Bl#_1q zKyBfcjr<>QYea?s@GC!}pd$bAT6H8Z?nWNJY6P+qM-X)#fIWRTXz zTgE(CkCi!pjK_V%-wtv{*R*bw)OT)t;gPO5f=7UpUSK*35dT_rRlbK!w!H;;68v)0k}n4jedCmeU;nADDUA8 zEI^A0JrLi>pK(_FijhAM2l3JZ$k`LiHS|;-u~H5Z#OWJf!<^+U%H4`OL6jpIj1#tM z5khH}1$&-XVtSm-NJ{s~4LtC_O&0LlUV?wsC(+-`;Qi zSz8AQ!HOCN!p?4ef)7J4l1@+%SGVP~Ghgh9qtS8oJuctW@vAPQ{gRHSq{LS~X5-$I zDc}b{RiLk4_V4Zv->2=TVBh!S&l~{kksV;2QS)0X0v_XGvZjkhlc9xThHBZtsk#Y` z_35&Og?0vn8O!8qlZSJS&JB7g&8DWwUjwlk>$S+>099Z09>P(k%HyrjI3FmO=$))p zG?tfI6}1(Dx!sB7`1m)QhG`0NB(=5!&#>YNfFMY+WBvm3^Kb1>tPFzxc z@vU=XivTr;zz@Ru{o*M*2ANg~UkV<}zg&-0F+vs-eOoZ0<<(C|QjfB5N{hBIXeC8*a)O_fEX9b;KqAn@a5*^#A6TCxgqn}|uq z7T8~P(aP`q)@LC-w1lkbKG7sf(?TYLp{k5TV3XXaAvk$vM3<^`%`HAV?k8LRkw_js zVXl-}vzI=CsIEGevf~Q}gdtyc`A~veI*Uk^O&`QXC~FPP0R47IKs*O!ZPujC$9g+w z@)Bqkb*F}jeWm=CRwfp1{J)LoswQk zV`qMW=Tf7!#tJYe+oQpO`>yyx(SaLjpdmYfokN2La;B5LQyE~&IFJ#N&%&OI)8hWe zN#Pj7)+ltkxU~p=T^e;IZq?#ekRm~#y+*FbdM2$AM+R_ve$3LPekMO*AUtnxFqLaJ zI5s&|5FpJF*NA(cz0XJc&*FFfmbPMh!`1jluUSU%X=1<8`sP4xwfN#KDgrfz%~z0Y z%7I`0g&R?5ix{quR=O?8uev*u_ck&*GyK^Qp&iY-$6k^43QB8 z(0j&ywUy>f1u^I8Nv_Rr{jGtjhmT+&>B%g#FD-*ryUOh)#~mYonuloj2BROvkMM#q z`^kraT~bUQrTAw|3e8A?rEx1l;!Og%JyfFGM;&O19G*porK$2gi!x$T58^EB0#(NP zSs4NAPCRC<^%BD7?bXw>DC4MMpT0=a65>HKhFQ0!=!@;;5OtAO+p>wK9|-XJb?8|j z1?|rddcW*FAeN|7ZX=&tw4Jb%&OsyC;KygtY;{QT8S%H28e9ETmv|GwI> z!4Y(;*h0UJdZJxZ!Rl)8C6&F(cMP9M*4!&c!k}X3^@Z3IKk`(Qg`ooAr9Zjf@+Y)= z03iL2mVu1Yb+qckFhgwq46b(HRRE{U*``Cs9vE@@!_%_I#%xT$MydhS7)0DWp^B$c z9-P}guQ$V425b4QoowH`psn-an8kB`va@u2 zzBx;>K%N^|Kg~4ODxfbsyH|&||Onxh>Y1Y%b(KT)~IdcvdN-KBZ!YG}Qt#sqYWK z*{;~^{@!kWo6?)7L{l+ug;x%TB&u|6n_W6rJoqd>$93MvAj%=G?W#g-(NdliWZ0n& zdsHpFkinKDMST3^V&}qq9jXYeo1JmX9)B9@;S#mf3RmN`hulkdZa=zSc>d}lg3FDf z*6Y-Fz*T3=xT{5#b6a(RTe;dR7~{CGg{wY%V}D5vrhdT;fO=jWKrh;E4O*2brt^@3 z(cKrs{3xd)U}+&WbVc73&lCYXK0OwEO%qz`fr#?Y^EO4v^i2T(L3u`oCV!5+!v@?Y z*`H8yW3GcO0h)nWymgOt4^?nxx?2>eU|8ponh2Q{bT*XwGR8iNbBEsPZD{R-AkORj zW%1|bmIbU5ciboIjsFkcquHc2!pR!pYyu zC(P}oM^D*|h`b5kf>AnGNrw04g~g6N-MPh<*5_o;j_KEh zqVV2CRgL%%)VxB0ebHH~{NRUC013bdL!beIguQjhu=|abpypE+DH>JSTp?QVeDPXd zqeEJu2NG=#lFFZ=pMo-^JO#qdaZ+LX@XD8u7nAqrJ|7+;zC9kdh`rd|#;vLc=}YvF z*j3|I-d7gEhS%vRQ)}*{Fg3;3*BLIt6^<*5G6_tsU|k4-@cMF{<>Kd- z$HWViFbv=0K-HdJ0lp)#GF3+~CB@3vB?k6@RZG~KjxW{1r5d+mymXwNo6|BjDd>z_ z);dzh>2D3%N1YTs%Ne>9;(q9 z@2@$p!fljP)9cVp6gG-nm%8@SlAE=ThH>fWxLmsA4{Tfhasbj#iH2E2;3V0t;G=o2faPqtW(58I*O z3E6?*F-m3m6@;HNLd6jY5-!Q8Gk*Xp$a@8fBf5p)TIAw=?g%K1-o)6 zpDi0%L~-T=83xCir@R;juVUF42j98^qfAM-ZcyXscU@Wb)6bP<;tX{Jy?|>s=Fkty zdXzp#&aax=Y$00X*W@cet5ZV`@tLAq#Rz6-eQyvthl-jeUPZV_b6V8w9e@L>nW&xp zJdO;Z4<;4?*`yp0XhGBRTtt7h=kJ|$E}-TzrW_0EG{1`yu@31F_7*MWN_BFcANnX3MGc|zoQ@BR^KLS`GY6hd+l%(q8as{PaXm&MDU*#${^77T&@0Q~R0g3iN1r zDI(+O5(?}$-6CRA$DDQ@Z&PQ`)9fJxyQG5ope$}EJVcTN z55vLgCkemQfurev#fJYNLZw7i%B#nB61tU{1S63jtJk&o^D7lu%rD=FeFb`bKWR`} zx1`VrJ+=VDi@#gnzyZsZeAv>&UtTvh6JLGm$L+?T#h9scM041@$b#X5@4mxtcvso; zrqUcyE}zVs)3h+CcjE6^agKU_C1M`on}v{8S4^)$qE7h0+z}EdzV7=x+t*pjBA?Kj z>@5F^ZYbAKyO0BcR)6T3Lw%)FbXG1xF-mZ(&%bS!iFpQ?@poU~>>qbfB>pe(&E3iP zKjAi`ilvPFspA791qj3EpEs+~)Fh6N1BINVXC=sA08k$0)K@%k7$=oBX-Ar%q18I) zE5xSVN`Y00D;vW#bNhAUYp2|KO(N|FEW=Jc$&v8(yW6$Lv&Zwggv5uW!*&@2C&1-{Dtg5kPLUJ0mg=uUGTd=)l zAfn9b&a1fO*UHg`#hvv_S)VJH$ z7LRROWuyQLwj?|;Op&}TjaLQ-h-&C5R!Tkva_3Yo_godI?v4q%_+fm|0U0AgXMn4+ z)_^Cp;;~-IZty)_zF{Z{=UBK-PnZz;HIaDHR(^=a@!J<$(BkkS=F}F45J6k(1zDbzD;Ng zw~iZV63MJP#&QIsJK>g39)Ix^M{yGREPty(@Gb-fTrjw(@p|Od%ZC>UV(6D+&w&Fq zJsnbPn1|N-iKW2%j&3vq`?Z#`OY(~M>l)=1Ma%d?S1T?KZUOZsG=J8-k|+PxPz;q~ zK87HYLJEn?VflALFYp>;Tl!#?p;sX3R?y7RiWjMvlmz;jwM63X9hA6yiQ6j(uLii3 zY$VvH|GsZ<_iZo0Rq~^8y6}6$4UPdgKM1b~H8M516NI<_EWry`-jig0{84VDcu=ZR z8DQ}@=A71lql{dtWbMc2$yS@##aIar5{HodxeZR!W8Nhr5>sLNc~4u{zGL7V5*@Y} ztcdiDIg8gHRHhFattg^oKHnpyX?7WtHGjYg;i;Kv8vUvEusGaL5I>>>!WF+_a z-DdndHvCk`uKAIMN$p0{l?t+ z|KFGsG}CwZPt0w7FAINP4Dx~(1C$2J6C)R~W`QV_j5Dx?*90WT%*6~hSWF{nBi3Z? zNSgvJI~ZYq-E_r!D5^OkDRs8+e)z`RO_|4)GwVBfM)*7Iv&8)U!Z0_Cm zf>Zj8(OBZ?vKbOQ%GDbIF(VUdV z?9aI+6N>mOmUi#0_y$Hu+v!DNe&1AV&cKwe&|Q?^I>p1&K4Xlq&;$ZxYiZ5ePZl9>HxveoKcqZD`L>@s28idf z!T`Z{?%SOK7y=7zrN0sD@}-BJK3IrmTru87C;#lnD-5j&vmO2vd%5K-7Fw%e&|(K3 zUqx+8t+4RWNqmN(tB#0cVDJT|Cd|O3P^NM*N)TNXYe+*_iWYl{v)P2-qDX0rLqp^7 z-V|nBc38ZTh)nI%>}Qy&jystj3ug=3rwO*%sDv`7715LyV+(T6>#&QY2HP7&c!@^i z@0@_Qs-lSk$5gFyGLz&2LDFH5HA%G;oK&3t!54hv|4Y-jb?(&5`r%9zZyF*M?i4AO z@lGhv(R^x`YH6OdWqDDWzfx~~vh1~8qO166cyG5Mq+eWn*P1b-n~VpeO0U#qiI86} zZ9|yJH^WVSUkDoU$;67KMVc*N|6G?5+NQ{ zPd~~9vMN%=)eEniXPw2FWUL_X$8gXGU-Pmqt?7z6tRqk_TJ7GoVhb@9gXCM znD%y~a~>W6g{%G#w9ySwX}Eo(SQ*}A&vGnQBW?gM0n3;GDSpa*(J9No8zhR*$b3Vp zu#pAY<3_GS*fyVGJHo^4^eap_=MR6$9>S|$IGe}aot`IRx8zUHJ-2XNI1!9DFf`*s zenbG}aDxz1vn0~3>PbSGMCw^lhEz3ED*p=5tG_A%_TylMGIb$-r^GAg3|e4Imc5P?I!%( zCFSql0e{yZveV_}{sb-v!%UXVPpH}JLgD-Qd@ltG{0Xmu`K;IoN$Y-K2+XH5aG9{% zWxXdn1>qqi@U#~IdcOqP7$Q(ZaCZZ&HFIb82H}d2?{QP+G;`>EH!EGiwiPyWxc=~W zu%Iz8d_(>>83m#K$>2);p9?@CTW15Se@j6Ae@Q^bv7d-$xxfCBfK>#s(Q@I*dRCIX z`2ZFHR%$Q_qKw9j18Gtg=lxNi2wP5j#a6W*+&ov@BVV(^Xv+rzTkVwFPbOlL5Seyr zsg9)AQ{LA;Pd-l_*HgB1J|2L2h&fD?E3GChk3geKCc=)(*A4>}r<$6@ z+H+@{EY1_}@s?~_s=jjTp3Zd0nZxZv=alGzd2WogX-xvWBe8rK-xfFTn&sfAG;Rr)a~4Aom;rRCBE8Y)JW%TqQqYSNCgmJgcVCy@XdX&jM z7sk9T6pF0^)Aqu*65Q51kwp^;uely0xk25I-s9fZN9O?*L_sr#B^31Yj;%d;c8!ZZ zKok+%cJ?Us?tb;15c}|)G$Qgltj8EjK^R*2mNHthEyf-tBX%Ay%Tdp8}gUguo1H!t82 z=c!!crRn;B`P3>op-m#o##%-Kv@_^$?dZBZf9`x+7Mhe9Y%8RsLGB2nL zL+>TQ6eS{JNPGvhzrhTVC-x<8?iDWlD*KFOb`k%#!PUu2qK_J%ojD`I9H@EbP3S)U zcqp#%UpPrQhkU&O71p#6flmggr=H+gf@v}4755S`G!50_*Bp!)gi?4;26UQD#nm3? zO;hMsjQbSp`GYfU^hR{Bl5bdcVyN|ukOto!RvXgMV=H;Xb-xod3*}VKKC;@wPQ`Rx zM6%0ad<&+nKXY3CqF6r~>;1z%(janGzLqqHIe0W>Y>l4w`hbXf4b^M<;ua%cU#(xx z774EJ*mIrINx~TKAmBSdz)bE1#o|fO37V2?bZ0Hu81+S$-wcf>v=p4dAkRPpg%V1j z1JJ04hx($McS|9mCvuMn?sj4J5%XGx+FdVB+fmr%F7fddX3`LN`-%T-PN zcDd3&#?A-NOnT2Kt&xhNOoNAg`r0mFAw?fFxJM80ed536pBUsj@^8R*aZHdhHIu~M z5to}=`J1}r8v%HK+~nDOX$f?=ZPf9mX*+M0|Wb_{QcXR^WYd z!luAtO44N3U#y8R75abTBc)8(6T+5g+s(hkI_&47tV%C$-P$c>W3YI%8@HbLoJhK^ zjUy!h$*@tUIGFy;xT7aDK0W~Y06KJszpd`VUsiYj+v>WkRhmr?dcw0_1QfXv$ z6x*cf+Fz!hpFKs;@ohD@Pt0}wRmCf?W3GI8@M0Z^<-z=`if0yc`;PNbJq>STBAMX+ zef64Jke;Isb%5bs2wotN|F)d8YKNN;rH6X3c*L&l>el#^M3AygjXpD7#Xd892%=ua z(Q4|*ID)=u=}psXY3BSeZMJIq>wN7Kyl1nbT?K2_s`vg#SRCvoE6BOa=SU>=$L>1tf|sL#eBCMW5>U zV)@v+kp4`v6twL@7Wnk8cJP?sjiSAb3H~2LbeZM_l*>=vc=^r{2t?NaT#M|QuN^{# z7CZ@$U_V4#oNmHA^~JKVLqcakuwiI|1=?Fr=(?3n3Fw12V3a5c*L9M4@fu0t(mF1b zh5)-12CTe_2cY2R?GH-cLKBLJC`$n!_m4xvQ9T{A@4ON{Pw4eShj6}G)QD-4Erd%A zr$w!Spzj)GDths=Ev9hnZ-K%k6{m;$g{Z22~mJRjd*3GaetgJA#n|#JnD;VMN zBPXO1x*%5$k%ck*F?L{$zO%hSNOl6_CDZ+bQJ}B&jX1?T;2b6*qXx#&QM^=@fQt z$LxwR8i%O-BD!TD#^~`)7oJnS1_lo)tK}nACxHvL@j3YG(?R!D!X85U!IwmAr;~liTh+PcYpKW#6|y&xRhD%=fRNf z6TynaS6E(ew;$E*cvtrQIN?xx;f&k~A@W6rs~4g8S;P#%UqF8`&hih0@?VTw{YS?A z!%f`(ZlIL^zjP|ZZT?NToxdFJr;QJd)qfW9B=IX7|0?8VC}_jT!3;pjPW+CyTDxG( zkhb=|5&nWTy?~0IChwd*W5?Oa{Hv6AQ|5Lho!$(eO3$5|cG2cJ&9lR?!*RU*@%C~( z^JCH=DNpX8eWA9QyK6kl`szIS*k&DNYom3hD%ZrucEd)v#&L%g=gqQu=a2WD{OM4I z@0wjeJK(Tgi5qKSkTX$^;b;zwFn^%_bF9N__e-x)Xs8y30aUXkn0s(7YhChBI1go^ zym+3{bt7GFA_R3rgL%uBP3ULFuW*6_4B?52Qes%0nybqCgJMw$L6ihZjlL^-tm)eWXA5JG?-Li6%B z+f@HzThHlBM6t5A)v!TpaTV6cQYXS{v`*=_LQR3n*8G-lIT_zTY!D6gV7>osU*P1@cAFz`i!{$L#F8nflTcN`F*r$`04~eOaJN z$Q(k-QiZ_`gR{ygWZg1}$N0B=i^M}xf~MRuT^XIL#4_NlaiKIEDW2L74nI#d6vKU# zy8#f4xdgS$fB198fS4*O5uH-YQn$`=oT(Hj-x(F z{3v;VmQnhh%OV$M3&0O{GCkfR%a+}wGUDU#=7|)nCYY<5bgcY}0O1+NES7|Jk?+dg z=(z+!p}E|Kp|Go)?O1iI$?VNotkypN64efqcf&ByRYF@0a_TZ_l;H%Mek<)0RJ3}H zBVz?g&7S6a^`)JKY-l&^ci}FF7xf!#DxBgXjOp(F&$u)K&zac_W$(Dc9;E45VvpiK z@*_i?bVwvqjf^hfoKuXRQFcb=pA;6hAEWfZDa>Q^&~4=!i(G*7FbJmVwG_8%3Gc-B zamTjd+x(kD@mOk-`r#V+>E}sP8fJbI?zNdwriXJ6zgSUn@}Ol%3}x^Cu^kP((N4U? zes3V_>&Z366PTH+*d;Xl+V`LIik0exHNGX%*5+~=dM8#l665n{C#85w1z-MMpdaa# zrWHl>hKZM#cGi3R4#jIoJWK*T#flKDu;kkW-fDHO9Z=S8tDgpYEsIMg6&s2!x!OQS4gbt=R*ieHC7t>0bf`j~U-oeGam? z7w+ICc=M=Tvp@i622$jke2~d49fc!QIwHKV*yys)U#ON^J-e>+jcT+1h-%{h_smVw z#@ginBX0i%YqcYBxYO5jvZj^d--9~~@v~I?k)#Qlx|R9GpE~!r zGs!&9@`LE=oT{0Buua~1-*G)DvOMC80)a`OV2zERHo2d&t}?DXk2c>wZci8i6rR&| zqysIKCzhS-8Je7%%h97cjFOm4?r2!s!#e8>R*5S|wG^7hZCaeioF0A#s$^fPZvK%_ zLXL>JHStf|7&c;r`kvjD$fAKpp;fOhT%AAxrcw#mF4jxYj%~{jE#)8clSKgZLWQZY zn0f6)NS+Ge)8O|Vv<@Y|utJsg>u=gpsE^o*qmcHC5Byj+bv6y7}RwyFB z6^govx>8FopQ8M4JJ6E+hs9@Sj|MV6VFgORo6-EM|~iUsneaoicyR`#qJ3+?K!x_e`C zhD`8{PV3Z)aRN)WBs@_Riu}!#XBK-38o0S7d?AGr*L1#)Vh!fb+JWipVdA@B7sEW) zpI1S4;8*k!*?yT}V+@_cQF?SU;>!20KSc$vdE$sJNVw-Ywm!Ou3$%F?uc11GHo4qD z`0Gk!_CkeD16d+Yrqi8cw@gAhca#m$xJgP(6ut0|X=$@Gka(VTREh2w?3$NmXQNnqMVod_&FjfzX*Lr9?05Y*X`!P(2@nQ4Klhm1fdM2d<@`09c1_64FBBWvceJ{nYtr-5kmzFbR zqjeV0?-Qy_qudbQV35Cy0=Ak;M$i^#OHqEFbnEKMzJMRi`2$`E+v<}&0~>S^9Q45g zK3;EUYk_|vceL$zgvNx0M|^}sGTiZ~13i+5Zylem7E>O&j1UMt;tSG6f$NL(qo??ilp*4@6KXeuEqEuwI+aGV(~Ri1{rky_+;ddkj?ZDPMZ~Zu9Ci zISu;jz9m9-oJ~y1dOvm8On+6F6K0D#}|uKx{iDpDSZ zN=V)|JRD3?_z8`wWg*l2v#`BQtMlq$LS?xLMT#KrDbm(+x$&uNslS_T4`gf)dIK?8 zXmk}4L82*9c|PHM{2+1fI~eDfmg_;==%(V=8ISh3kFvfS_u_T3x!oYPv3L-h(R}UdOgLJo)W^~VA>N58OyMOg?m2!cb>b(Q?rB_M4Wz~_?EfqAKCRCj| zkHj_P`t4OLlw&-CVQs1@3Gn9-PLtA`troEo!%3MW#T^fB0`D%9!rduLy>_&Y6<8_$ zb~~+Ttu@4GB?XBpVB}*s%Q7=kIc?lYjmpg2n$CI6^pQ)YLX#%eaL%YDMprE4&!tqM zav!7NDH#>IT({O@RBGtFR~9=|hWG&DPSRGRIT46-4VDHkn7eo;6hxra!}A4$xj5_A z{a!i|X;LiM_R!V3N8Y%`dh!kG1JX*A3hK6*fWMTz*Nj)6aZrm|cMhVM{33zUytGVT zp_n*JQesk@B8u8>0M;ImGd@T$r&YU)Lld@voqDx%4&D(ja+lsj9WFFklW-0{z2#~& z;bv!Ofc{lgnFKpu4I;ysjaggvs?bLUn@D_7+cfGYE}>j-L0$|rv>GBVpo}M%wCU%~ zTf-4!J!!EyYr$-M$23V~3t<8RV-3MN{mxjj!}X));6ttL@T8HiWbcIfTeGM{7u|Jg zkL?C&|JG6&3Vg*7>bMXu4pZ;SEBzqOwd~f>H&iph5lCZXnnHBja`&Ud-piO44au*T z8{CCjTgKzMm)e9 z+3onzvg z{iEl9zoansS4^}S58RJ?%=*Y|BR`Ql5^EV_a2w%GTX9{HC%K4gJ|atMOfFE4&1%gj zD@D3PMCEEoa41Y3#jL0?jWu2_Xw801QI@0t6$<9-J?qCo&}6x7EVx;SCs$m4FS}V- zR>|_RTdd7K9Ay-+$vK`@;a8`KC$;XgX-_yjnEzJT`#{=BkA8K$9Ye(jtB4u3N7mdU zR^+n=9Tx!sjB3I>dQ!-Pk{ zJP~6l9@dOu4wVDOG**@*QwO!MeFCFYr4#GhWqu*i&{3$Ykfkt?bbNAE@H58r$WDZk z=Iha9y9$sItgHJvFBehr$emXpc+65;1Jh4#W#r3Mu|4!j4xZSoF6M<*({IY}NH;H9 zqU7&pRDsV&&1Kr65fKPkk#{}P*P%(*6jlM9=K{qydSG500gGs_9M-(6fGTS+E*Z_F zq3N<$gF7u{_DU`1xN1YBfipTaE{@oPtke3i@ZsKDrX-6;GWX_e%+zV8PJYayZ&hzU zkP?=!`8J5iXO5G8GYV0Fu3hzq_{_fOgo-qTbNtYI65M&V_-O!X89dAxl6*7z_eL%& zK|zhz_x5-K%s+`P{}1Mo3Z^#p|NFKs^_>BW=55WxA(b{OYf6p;;ycS^h3+e#*bkB5 zw;&tS^D5U>bYjKe$S}v4iq~vQ2+3-F-7Krps<#8mg3OH*_3gd!dB)ZBo$3J3t@n+` zK{?DA>A3Uex_WEB^7u}%-hO%mAkl>!S1dSL45RE+OS&wB8qd3;<|LleX{QL+8_?Er zYL8P(^fhRkM4jcr27ZJ-o3XGRrg-C1WyS-ZM9G4s?9!Dw04~ac9rz`wdjz@@TmHx# zcTr+8CbfB!VJnW8hMp>uix^6@D+jW zPiZ{zBvD0VS-9(AjF+snn>M;1)UN=pcn+y(zvWMZ-aVj!?+Y~ z&+Otbu7{sfh|d` zCX1!4VcKruq?W2`xX^5?e361-IC31)vq7lXlP?ozt|6U!s=q$*(`Gzr#kxd`Ief#&XGlxK80Cr}Dr z-_CL4*3&4qFas@D^r4kdAs);5lJ<~{0> zGoVr@YY8BaYy`zfa$ex-xtXfTvJ)(8rBNpWj1dGzi5=(+aeatlH$cmKI=YE*R(AB1 z9VjKGy`u%i^9%VdO=d(HHI_^e22z)$3LBj5OoO{(<#q8e0MvJ{sW^z_GM)wnF6>g^VFqu8gKj*`_4jqC76PMf++ zPaCkeY@{+gC!tz)n|Bfts^a|>J?b0+FTNlnpOZN3Wn}cx->24;_2HBmb3r!di+c~e z7pn_p1srBC4LM{}>{b2VBJZ2~UwRgc5JIaYG~dx@P#EmL4W@=+FBk)N%8zW45FFC`WL_S%Q4zf@K7c z%K#Rl3Fkz2NHNef8S@?Xo=6R5MqG8;X&)IMBc29iB%LE3oYwndx9H$|CYqZ+uCv=P z-Vr}t2yX$vf1u-k5)&r6(JFOQC!J~-yFvCnOVaX!dReXk)ep+yabk~Mfu)%usJZWurzZ%qDCBBIbKFp?o__CwT@GK z?S*jlJNH8i0;{31SzI5BAms)}H1Xjq2r`dZwUTbdkH9Vm;xhMzx=)i-1MXvZVN632 zx+foH2%Rj21JTe88W@Mkxg>+bjE%){jsWhYLU`)2c@}Z z*8CRI##@Q;R0>0TkF0xry+le7Hg&&x^S7X#3&hQ^_f4rYp#BM41^=%n2LCc@S0?<` z<&HEo#V?VY6#m`i4hbO&NUVJ=Y=I2PM#qP(;kFe-3{BLQ>39~BEw1A@_>=cH?&wXI zSP!|3p1w)zSDlBnH|f#2^BVJPtihIA-9QS~YV@p;RzW%{t_g{@mU&2g_~)^FMUwuGXSC?3^jA{${^@~x^X%cZ`H zERu^ftCJ~+h1b4dQ}dznLlq9F(kalaiY!LYTThuhXC~#MSNW5` zQJv-(+guOF*3%!Kfx5&;0QLKk-TP2|V_LoE5hBj>E=s!X6YaeKwc*Ij0`<3kPBY*; zIguHf;maZA!-m=(42U!2fg37{D>}DhbKY3))e)+%Dlmw+phNEgPH>a=HXo+~mpT~I zV+gdBQJ9ju&DOl=*J>jj19FegdAawK*(sn+5L-GHl|5dwIZZT4x3)c zN_+up`4yfJYKyx=4_+&=Wp;2zzU~;19`U1<&479i@ma;g^NzH0=sHo?B$bt zx6WVFv{KZ3^|J543Aul)m=pfb&&GdkFZ}O)hJT%o2Bp7G$7dr5kXZr{(57rZWT7Sj z#AcY%FS`u#V=x61SICn_=z^6rl1=Z#PFD|G&qopVEGhodMm9Y(+_*ZA$Ba9#qw|%G z?5<9)pEbWpp?jmjZf{m84AC*EYzB{PC3Dmg*Mr(h|z zZAi0qOis26L$%#P@K|TB?=APe*6OPZsKXcMVqM5hgGyATlURBG6MH#GF{5zAjGRLh zi`&KQrUj}*M@A_{5oE3YC`N-6pfNK+!TQv!;T(zKL%81I6?pmFcyTQ(;B$c4*vZ!~ z%16Xt7cWaUnxou|N(^WD(HO+YmfmZYVSr{TA>V`Mj{xVXTx30J=~5OD6pp512bdfp zy}rw+8My!hwetMdKfN?-%VpfxVB#1sNyebK=dx~>8#k{36)s|qoQBTXNHzH)P(w5n zLu#(Pu&7tG-fTm4Fi-Dm$%(j{IZMd zQQVP!<}Ka5JDUajQ4_OfUqKk~B}2;B9cV<{+;nt(zeXOWabg78D`Zk1>-#EZO^)!e;wKJ>NJ=hGD3}Gfw{OY-hDXv*e_m9^n z;L$o)Q6FliZtx7E5yM5M_{lXUi8w`*&RwoPR7uYqwOZm{RX9Da`Y?jw8FEeVMJ1>` z3OyQDyZu!ojLPZe@O?PtAId*m1sNjy!N6aIRq?J>i{kM}Wy!>%(|%(ScWBw4#rc|; zbZ)<@P!V0<8pP+Uv+Dwp`^6L0ESQ>KbU3l65Lk5w}tIrI4Gg=dv zN5*VKOCIbU@zUq{XU#19^K~Wo44I~C0nsAR${Xfi$2{aWo1nuF005DHoGJ5+*0pkmTQ+|Q$<|8a$(nby3tGFQ8iCG-Fn$xbFDmmXGvNV{a9?vvFI(D)d^PS zE^u^VI`XeReB%hMk+np;@su|Xm_1R_*Bj84HDr$By$RF9lwTflppdZ=UMD@M7NSGo z8HyeH5>V8R7O%^8AT`*r=S^K0PeR=-Icv5F|N6H!y zOg$v=y==c2J;q5@X=toEh@Fe%6{Inb= za!ws~jx)N=Z_ilD?dXQ>sqVIu&GZNWq+TPNIy`Rp2I_kk{oTcfWS z`dDIboJTL%o@g`(SRxSkB6Mk)o+10_{}NzWT)|}E7V++;zn>l9$>@d87!=FkOS>9W zxW{f*uq~Qq{G2Ob!QeoG&|pW1&*8xZuKc!3Lcq03SN$;yuSgf+SQW8hiS_V zUUf?CNQ}Y4C94QJy$I}k1laXDE&sHQi3Gz;NPMQp0g%qZR!9N+PB1f|0R_M4owdY%M@YD@AOux z$}nHf3d}x57RAtMFubc@B0>UWQxaoQ5|i(p9h-4V&fQoR;}Hs>B7h7-&^h2!D16=m zrFA14lqwpQMJ|35!;*l6x=g{6nVPFdBGd?ar&PM4M*5KXlkP}n!UgNlg+_%|i9zXMX%ZNX`xun*)) z-v!U8fU*~Sf0 ziADtp_7ue`H&vm^ANPxs6ee&&rZY!ckkmOI8|~dq5!}Z#%pxX?sw&|9bxv}nmftYl zGFj0udWneBOEn|Z`bL-PxwrJNi>9@)yTYl1Z5uG7onEKZE*)va9 zI>T~ap67-tEom4y)d6SK0jUeQKT_(N8++%IreN8x;kZg7Od;;l0I6yU(|3z>G zjxE-!>{M6->&%rL|Flm^Rh!S7Cn?OFtv5iexlcZ@Gheg?nSh({Ra_5LlC#1LUYFHd zbFnzC<&(^t#0Chr0!hSKr#z(~rL+^J8H{^?97XS0EXgYPh>T zk@S_uk(ap(g@jFrm8c^}UEV6CC(QRs==*a9xYI`H^k29jQ4QUOL8&{}X9#0xiPan6 z{&BNV&dfz(M)x>R+n1+oKN-Cyz%)PFabd#POx$rId*H8n?gF^YjcSxjyo=nNC?=^M zA>L&pau7@~#8QveYb9C_v#zpp@NX-xk~@$IX#2yQ!`W%Y*{;2W`w~=1D?6pyNIa-m zz?N4G2r(A4VTLsnGK17$0=2gSMw&1P0IG021Xmh3fh<5H4ue2_@O-P2Y!J{&&e;9} z`+yetD}U7BxWb{@a+xPnl)mlGIVz!>ad;FsilHKaYkj)9=c+Mg5bS#t)yL-laz&er zZE1GD{d<1yWEr9ed%chlKVXk-3J$RxDp>>8ZIb2GDGtIvs|eMNBNVbZMHpxV*iN(P z8~Z7uc3!I5(GTY*rnPFZI=5AlTiS?x?xDDe^)Q@Qa#oAI>6YK_a^}q>iPD!~I>3HB zc@5Q-wOcM!c3Uml1(*QerMg{Kh9;`rQ)S=OqY zObJ1eJH`~Eh6vxz&yFzEUbMg-Zz|G&yk5%s`=`iFjsl{ela3j(l#u%4%E}O8;(i6_ z1vSmjtM`g1KHK&YgC$q?g^4u2+WG;9OTn|dWT-EdYzQ~9=J14^8G7Vm14j*m+9p6L zfY#lM^^+mh=MWXVLV-~tt&zg=drPcDj)VXa}T3*Z*E5Ir}mjU!3K#QX~T41G#jrerMzaK|J_ za1H7|nM;n{62l$N)^=KH6wvtND5{OwTv zL#nEAD>W1;PFJAqmCnK1Ywx=qI%1F0H{8f=Z+?0be6ZzP>ehn z*IbjP$tLyidFgi%qpCTifZW%WUP9xqM(Uuvh)JRHm525UvN{ZRqyBX=%+fsqH6?}D{+#Tw70kc?0$M+k@bfHk7 z^M~ZVAC*|(ly0gbw8D*^$}=rNbKjC@2@JFeup@%!TzePVVTlW5A7i6hBL z1myXKIv&O*{PI#x&W@Hkb2(&>y>=x?lu24dqaS;4MO0l10@`|!AkbE=z;?!26(}%sgjML65?Y#rJ!nlPi3$81*MyH=5jp9lf1J({XB-Du~!zidZlA!8Gf(6+Hdc7jvaWk$sh`KLA0hTld|b0}z~l4}tDAv{ zIMS>(+*dL5R&p1bq8fXvYI?QrvjtjnHf%6ohm>4PDdu1m9q*5tZ)QlgO6&{}m?0`S z6^JLRWmhWfLSnu?Ny4tWNQqPREfmj?duVL8YfZ0i>y3(kh3#UfY?j`Y@GK+*Rl)o6 z+1$azedBSY99U`SJXs;j zUkd$v9aI|UY4_-%U@yXT`vMC#9{Iiz3{$WBr5y|scM=OW-d9B9 zNn%h0X3Y;A#B}B=^2p+5nqLiB(ajjj@gUN|FZ0mk6NOuJFCoj|>qj26`m}Ty93-Ih$-D-8Ao0h`fL$aT(?~~>1l=6VrW+!k9#aD)3&fK*W|nN znLQ@Yej#UES9@wiKH;}BD@R-&aIgI~Ag}@~I(#t8-YfH_nXjt#I2(w}mS*RKNDzsR%!21!e9(FcZ9sp-RXHe)|FBq3%Pl#O80 zY6w-JQG&pUBAS7x0#~U!S8T#W$DpgEXWt*(8y*<9l58F%w*FovwDT-iv~znT+b0mv zb3tT*EQDMgErC8lNjwL2H>DY;g^jPZ(8lgI@JSP&CZMe$;6Z_F`Y5|7j2?>;9(RzM zMc{Xa@K`MhVaNU(D>mm(kiUT4VeeMU;9D6z|Hp3W|H0_uue{p-lf4ZnYdFjaqj6hs zk|kl=@{9V`58wlyYue`Kf@B1QW3I{~k`?&^bXe|3QWHp2Q8{=VS078fP2MAG_sSZ( zyItU(_#8W~dbi0VaiR`pok%hpm^HjzyiB@0o{x5YeauY(6wT;O(z47-6&d#&URt>N7QSc#gV6duA33B)E1*1#CD-l`(ehHyV&+|br>@`+Op73LS+Dj!gyUS`H3WS? zVT>HeuxE_CF4nLem`6^M+5re~fZm|s+eEkYXlWzjRQ4*!B_T3l>8CW0;1+VbTNJcV z&Nl89Votbk*m28AS94ge+ETG+iksf+r|kSHBK8?^C>?IMiF0wh-_ufGb3QW{WjtTY zP^fXu&)p#t@R3y-j;LTx8`)ed>?W25RsUm{Yrs}yfHZ`TP-V)tD6muRfM1u+mWfUp z3RNrLYZnxS-EUhVpfU)pVk<)xCIV%`2#L+nsU_`~dS+R6b$M|Fc3~s2j9e{#8oJ2c z?8EpNcXmtqdD6NFY)u)kzXm-jIrjR7X}5Hed9KdkKuqoBfEeS-WqO}xsCLOt(9!wI(W;yI^;h^NOdqD@?* z8PbahNeQI3liGv*R}y4L$Qih1A9PSiO~~sb*~`K5h+64|^~d9v7H?2#m8IyAyjp-x z6+*6BJ#*At(wg}tc7egLHKZcSCVk^j{n#$OKrOLes%Q7uf!1Qs`wd8ELey&*Oi84o zmH9<;j!R7ip&xS47-zS0i&Q*Y@Et;wBm33{`J(ks{ID1rN3cFfv83r+*u9me<)ZTO z4{{lIGwz}7#laC=$Hzo2>xvompH~7Gd<><$Il;m?v=Z%x%9fYRS{R~Qh~GgAP2R5e zadVE)b_4amv;Ad1Z%+$xKRy8aewZH|j~uTsej>a=nhVwlKXI2iprLHUdjlZM$En~x z5)_f}@+a*2-uH9Bd@4khf8go>!x6TH9YAjwjYgko+L=>b*p>zD_Q z`bBE&&sK&2{i3Uv#{^0zG;$FWaGqL_ln*enR6;rWb{$zDx?2`n4*^VzPBW)K64o_% ze|s(A`K%ecOm!15n(^r0J8qZJtHz8oWVQ=uwu9$EQaUvCo;8XUJqPi#}(N+B(eh+w15bjh$tL2P-AUF1a}vMHb|>Mp ziex-bzVkx6eLr|i$U-IK(QvcgkqH&f=r#@a1iOvv4x!(XcIK|U#dos>*t@e~unMAO z;NJH+l(&GZufS*viH_AkyyA%Nb7erLG30cDU*4gcSFM|i!JZr;a<%1}Pg{=umY3?J z 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